Skip to content

Commit 4a71709

Browse files
committed
Move bands and pixel size into the mode data struct
* Just copy these in because they're ints * Calculate the line size, because it's just pixelsize * xsize
1 parent 8df33d1 commit 4a71709

3 files changed

Lines changed: 161 additions & 67 deletions

File tree

src/libImaging/Mode.c

Lines changed: 154 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,161 @@
99
const ModeData MODES[] = {
1010
[IMAGING_MODE_UNKNOWN] = {""},
1111

12-
// Name, Arrow Format, Band Names
13-
[IMAGING_MODE_1] = {"1", "C", {"1"}},
14-
[IMAGING_MODE_CMYK] = {"CMYK", "C", {"C", "M", "Y", "K"}},
15-
[IMAGING_MODE_F] = {"F", "f", {"F"}},
16-
[IMAGING_MODE_HSV] = {"HSV", "C", {"H", "S", "V", "X"}},
17-
[IMAGING_MODE_I] = {"I", "i", {"I"}},
18-
[IMAGING_MODE_L] = {"L", "C", {"L"}},
19-
[IMAGING_MODE_LA] = {"LA", "C", {"L", "X", "X", "A"}},
20-
[IMAGING_MODE_LAB] = {"LAB", "C", {"L", "a", "b", "X"}},
21-
[IMAGING_MODE_La] = {"La", "C", {"L", "X", "X", "a"}},
22-
[IMAGING_MODE_P] = {"P", "C", {"P"}},
23-
[IMAGING_MODE_PA] = {"PA", "C", {"P", "X", "X", "A"}},
24-
[IMAGING_MODE_RGB] = {"RGB", "C", {"R", "G", "B", "X"}},
25-
[IMAGING_MODE_RGBA] = {"RGBA", "C", {"R", "G", "B", "A"}},
26-
[IMAGING_MODE_RGBX] = {"RGBX", "C", {"R", "G", "B", "X"}},
27-
[IMAGING_MODE_RGBa] = {"RGBa", "C", {"R", "G", "B", "a"}},
28-
[IMAGING_MODE_YCbCr] = {"YCbCr", "C", {"Y", "Cb", "Cr", "X"}},
12+
[IMAGING_MODE_1] = {
13+
.name = "1",
14+
.arrow_band_format = "C",
15+
.bands = 1,
16+
.pixelsize = 1,
17+
.band_names = {"1"},
18+
},
19+
[IMAGING_MODE_CMYK] = {
20+
.name = "CMYK",
21+
.bands = 4,
22+
.pixelsize = 4,
23+
.arrow_band_format = "C",
24+
.band_names = {"C", "M", "Y", "K"},
25+
},
26+
[IMAGING_MODE_F] = {
27+
.name = "F",
28+
.bands = 1,
29+
.pixelsize = 4,
30+
.arrow_band_format = "f",
31+
.band_names = {"F"},
32+
},
33+
[IMAGING_MODE_HSV] = {
34+
.name = "HSV",
35+
.bands = 3,
36+
.pixelsize = 4,
37+
.arrow_band_format = "C",
38+
.band_names = {"H", "S", "V", "X"},
39+
},
40+
[IMAGING_MODE_I] = {
41+
.name = "I",
42+
.bands = 1,
43+
.pixelsize = 4,
44+
.arrow_band_format = "i",
45+
.band_names = {"I"},
46+
},
47+
[IMAGING_MODE_L] = {
48+
.name = "L",
49+
.bands = 1,
50+
.pixelsize = 1,
51+
.arrow_band_format = "C",
52+
.band_names = {"L"},
53+
},
54+
[IMAGING_MODE_LA] = {
55+
.name = "LA",
56+
.bands = 2,
57+
.pixelsize = 4,
58+
.arrow_band_format = "C",
59+
.band_names = {"L", "X", "X", "A"},
60+
},
61+
[IMAGING_MODE_LAB] = {
62+
.name = "LAB",
63+
.bands = 3,
64+
.pixelsize = 4,
65+
.arrow_band_format = "C",
66+
.band_names = {"L", "a", "b", "X"},
67+
},
68+
[IMAGING_MODE_La] = {
69+
.name = "La",
70+
.bands = 2,
71+
.pixelsize = 4,
72+
.arrow_band_format = "C",
73+
.band_names = {"L", "X", "X", "a"},
74+
},
75+
[IMAGING_MODE_P] = {
76+
.name = "P",
77+
.bands = 1,
78+
.pixelsize = 1,
79+
.arrow_band_format = "C",
80+
.band_names = {"P"},
81+
},
82+
[IMAGING_MODE_PA] = {
83+
.name = "PA",
84+
.bands = 2,
85+
.pixelsize = 4,
86+
.arrow_band_format = "C",
87+
.band_names = {"P", "X", "X", "A"},
88+
},
89+
[IMAGING_MODE_RGB] = {
90+
.name = "RGB",
91+
.bands = 3,
92+
.pixelsize = 4,
93+
.arrow_band_format = "C",
94+
.band_names = {"R", "G", "B", "X"},
95+
},
96+
[IMAGING_MODE_RGBA] = {
97+
.name = "RGBA",
98+
.bands = 4,
99+
.pixelsize = 4,
100+
.arrow_band_format = "C",
101+
.band_names = {"R", "G", "B", "A"},
102+
},
103+
[IMAGING_MODE_RGBX] = {
104+
.name = "RGBX",
105+
.bands = 4,
106+
.pixelsize = 4,
107+
.arrow_band_format = "C",
108+
.band_names = {"R", "G", "B", "X"},
109+
},
110+
[IMAGING_MODE_RGBa] = {
111+
.name = "RGBa",
112+
.bands = 4,
113+
.pixelsize = 4,
114+
.arrow_band_format = "C",
115+
.band_names = {"R", "G", "B", "a"},
116+
},
117+
[IMAGING_MODE_YCbCr] = {
118+
.name = "YCbCr",
119+
.bands = 3,
120+
.pixelsize = 4,
121+
.arrow_band_format = "C",
122+
.band_names = {"Y", "Cb", "Cr", "X"},
123+
},
29124

30-
[IMAGING_MODE_I_16] = {"I;16", "s", {"I"}},
31-
[IMAGING_MODE_I_16L] = {"I;16L", "s", {"I"}},
32-
[IMAGING_MODE_I_16B] = {"I;16B", "s", {"I"}},
33-
[IMAGING_MODE_I_16N] = {"I;16N", "s", {"I"}},
34-
[IMAGING_MODE_I_32L] = {"I;32L", "i", {"I"}},
35-
[IMAGING_MODE_I_32B] = {"I;32B", "i", {"I"}},
125+
[IMAGING_MODE_I_16] = {
126+
.name = "I;16",
127+
.bands = 1,
128+
.pixelsize = 2,
129+
.arrow_band_format = "s",
130+
.band_names = {"I"},
131+
},
132+
[IMAGING_MODE_I_16L] = {
133+
.name = "I;16L",
134+
.bands = 1,
135+
.pixelsize = 2,
136+
.arrow_band_format = "s",
137+
.band_names = {"I"},
138+
},
139+
[IMAGING_MODE_I_16B] = {
140+
.name = "I;16B",
141+
.bands = 1,
142+
.pixelsize = 2,
143+
.arrow_band_format = "s",
144+
.band_names = {"I"},
145+
},
146+
[IMAGING_MODE_I_16N] = {
147+
.name = "I;16N",
148+
.bands = 1,
149+
.pixelsize = 2,
150+
.arrow_band_format = "s",
151+
.band_names = {"I"},
152+
},
153+
[IMAGING_MODE_I_32L] = {
154+
.name = "I;32L",
155+
.bands = 1,
156+
.pixelsize = 4,
157+
.arrow_band_format = "i",
158+
.band_names = {"I"},
159+
},
160+
[IMAGING_MODE_I_32B] = {
161+
.name = "I;32B",
162+
.bands = 1,
163+
.pixelsize = 4,
164+
.arrow_band_format = "i",
165+
.band_names = {"I"},
166+
},
36167
};
37168

38169
const ModeID

src/libImaging/Mode.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ typedef enum {
3232
typedef struct {
3333
const char *const name;
3434
const char *const arrow_band_format;
35+
const int bands;
36+
const int pixelsize;
3537
const char *band_names[4]; /* names of bands */
3638
} ModeData;
3739

src/libImaging/Storage.c

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -62,114 +62,75 @@ ImagingNewPrologueSubtype(const ModeID mode, int xsize, int ysize, int size) {
6262
im->type = IMAGING_TYPE_UINT8;
6363
im->modedata = getModeData(mode);
6464

65+
im->bands = im->modedata->bands;
66+
im->pixelsize = im->modedata->pixelsize;
67+
im->linesize = xsize * im->pixelsize;
68+
6569
if (mode == IMAGING_MODE_1) {
6670
/* 1-bit images */
67-
im->bands = im->pixelsize = 1;
68-
im->linesize = xsize;
6971

7072
} else if (mode == IMAGING_MODE_P) {
7173
/* 8-bit palette mapped images */
72-
im->bands = im->pixelsize = 1;
73-
im->linesize = xsize;
7474
im->palette = ImagingPaletteNew(IMAGING_MODE_RGB);
7575

7676
} else if (mode == IMAGING_MODE_PA) {
7777
/* 8-bit palette with alpha */
78-
im->bands = 2;
79-
im->pixelsize = 4; /* store in image32 memory */
80-
im->linesize = xsize * 4;
8178
im->palette = ImagingPaletteNew(IMAGING_MODE_RGB);
8279

8380
} else if (mode == IMAGING_MODE_L) {
8481
/* 8-bit grayscale (luminance) images */
85-
im->bands = im->pixelsize = 1;
86-
im->linesize = xsize;
8782

8883
} else if (mode == IMAGING_MODE_LA) {
8984
/* 8-bit grayscale (luminance) with alpha */
90-
im->bands = 2;
91-
im->pixelsize = 4; /* store in image32 memory */
92-
im->linesize = xsize * 4;
9385

9486
} else if (mode == IMAGING_MODE_La) {
9587
/* 8-bit grayscale (luminance) with premultiplied alpha */
96-
im->bands = 2;
97-
im->pixelsize = 4; /* store in image32 memory */
98-
im->linesize = xsize * 4;
9988

10089
} else if (mode == IMAGING_MODE_F) {
10190
/* 32-bit floating point images */
102-
im->bands = 1;
103-
im->pixelsize = 4;
104-
im->linesize = xsize * 4;
10591
im->type = IMAGING_TYPE_FLOAT32;
10692

10793
} else if (mode == IMAGING_MODE_I) {
10894
/* 32-bit integer images */
109-
im->bands = 1;
110-
im->pixelsize = 4;
111-
im->linesize = xsize * 4;
11295
im->type = IMAGING_TYPE_INT32;
11396

11497
} else if (isModeI16(mode)) {
11598
/* EXPERIMENTAL */
11699
/* 16-bit raw integer images */
117-
im->bands = 1;
118-
im->pixelsize = 2;
119-
im->linesize = xsize * 2;
120100
im->type = IMAGING_TYPE_SPECIAL;
121101

122102
} else if (mode == IMAGING_MODE_RGB) {
123103
/* 24-bit true colour images */
124-
im->bands = 3;
125-
im->pixelsize = 4;
126-
im->linesize = xsize * 4;
127104

128105
} else if (mode == IMAGING_MODE_RGBX) {
129106
/* 32-bit true colour images with padding */
130-
im->bands = im->pixelsize = 4;
131-
im->linesize = xsize * 4;
132107

133108
} else if (mode == IMAGING_MODE_RGBA) {
134109
/* 32-bit true colour images with alpha */
135-
im->bands = im->pixelsize = 4;
136-
im->linesize = xsize * 4;
137110

138111
} else if (mode == IMAGING_MODE_RGBa) {
139112
/* 32-bit true colour images with premultiplied alpha */
140-
im->bands = im->pixelsize = 4;
141-
im->linesize = xsize * 4;
142113

143114
} else if (mode == IMAGING_MODE_CMYK) {
144115
/* 32-bit colour separation */
145-
im->bands = im->pixelsize = 4;
146-
im->linesize = xsize * 4;
147116

148117
} else if (mode == IMAGING_MODE_YCbCr) {
149118
/* 24-bit video format */
150-
im->bands = 3;
151-
im->pixelsize = 4;
152-
im->linesize = xsize * 4;
153119

154120
} else if (mode == IMAGING_MODE_LAB) {
155121
/* 24-bit color, luminance, + 2 color channels */
156122
/* L is uint8, a,b are int8 */
157-
im->bands = 3;
158-
im->pixelsize = 4;
159-
im->linesize = xsize * 4;
160123

161124
} else if (mode == IMAGING_MODE_HSV) {
162125
/* 24-bit color, luminance, + 2 color channels */
163126
/* L is uint8, a,b are int8 */
164-
im->bands = 3;
165-
im->pixelsize = 4;
166-
im->linesize = xsize * 4;
167127

168128
} else {
169129
free(im);
170130
return (Imaging)ImagingError_ValueError("unrecognized image mode");
171131
}
172132

133+
173134
/* Setup image descriptor */
174135
im->mode = mode;
175136

0 commit comments

Comments
 (0)