Hallo
Ik ben bezig met het schrijven van een raytracer voor school.
Nu ben ik beland bij het inlezen van textures. Dus ik heb net een bitmap reader gemaakt die een bmp inleest en die opslaat in een image buffer in het geheugen.
Een bitmap bestaat uit een file header daarna een info header optioneel een palet en daarna de data. Dus ik heb een structure gemaakt van de file/info header:
Vervolgens wordt deze structure gebruikt om de headers uit te lezen:
Maar... om het de code hierboven te laten werken moet de bmp_file_header_t structure dus packed zijn. Normaal aligned de compiler alle variabelen op een 4 byte align, maar dat moet hier niet omdat dat ook niet gebeurt in een bitmap file.
Dus ik dacht het volgende te kunnen gebruiken:
__attribute__((packed)) werkt perfect met gcc. Dat heb ik al vaker gebruikt.
Dit keer gebruik ik echter Visual C, en onder vc werkt __attribute__((packed)) niet, en ook __declspec(packed) werkt niet
Ik heb gezocht op MSDN, maar die zegt dus dat je #pragma pack(..) moet gebruiken. Maar #pragma pack(..) geld dus voor het hele project. En dat wil ik niet, want de rest van de structures moeten niet ge-packed worden.
Mijn vraag: Bestaat er niet zoiets als __attribute__((packed)) in VC ?
Ik ben bezig met het schrijven van een raytracer voor school.
Nu ben ik beland bij het inlezen van textures. Dus ik heb net een bitmap reader gemaakt die een bmp inleest en die opslaat in een image buffer in het geheugen.
Een bitmap bestaat uit een file header daarna een info header optioneel een palet en daarna de data. Dus ik heb een structure gemaakt van de file/info header:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| typedef struct bmp_file_header_s {
u16 id; /* identifier */
u32 size; /* size of bitmap in bytes */
u32 reserved; /* reserved bytes */
u32 offset; /* offset to beginning of bitmap data */
} bmp_file_header_t __packed__;
typedef struct bmp_info_header_s {
u32 size; /* size of info header in bytes */
u32 width; /* width of bitmap */
u32 height; /* height of bitmap */
u16 planes; /* must be zero */
u16 bpp; /* bits per pixel */
u32 compression; /* compression type */
u32 img_size; /* size of image data */
u32 xppm; /* x pixels per meter */
u32 yppm; /* y pixels per meter */
u32 colors; /* if zero, bpp is used */
u32 important; /* number of "important" colors */
u32 reserved[6]; /* reserved */
} bmp_info_header_t __packed__; |
Vervolgens wordt deze structure gebruikt om de headers uit te lezen:
code:
1
2
3
| // Read file header if(fread(&bmp->file_header, 1, sizeof(bmp_file_header_t), image->file) < 1) return 0; |
Maar... om het de code hierboven te laten werken moet de bmp_file_header_t structure dus packed zijn. Normaal aligned de compiler alle variabelen op een 4 byte align, maar dat moet hier niet omdat dat ook niet gebeurt in een bitmap file.
Dus ik dacht het volgende te kunnen gebruiken:
code:
1
2
3
4
5
6
7
8
| #ifndef __packed__
#ifdef WIN32
#define __packed__ __declspec(packed)
#endif
#ifdef LINUX
#error __packed__ __attribute__((packed))
#endif
#endif |
__attribute__((packed)) werkt perfect met gcc. Dat heb ik al vaker gebruikt.
Dit keer gebruik ik echter Visual C, en onder vc werkt __attribute__((packed)) niet, en ook __declspec(packed) werkt niet
Ik heb gezocht op MSDN, maar die zegt dus dat je #pragma pack(..) moet gebruiken. Maar #pragma pack(..) geld dus voor het hele project. En dat wil ik niet, want de rest van de structures moeten niet ge-packed worden.
Mijn vraag: Bestaat er niet zoiets als __attribute__((packed)) in VC ?