18
13
#include "Imaging.h"
22
access_destroy(ImagingAccess access)
28
access_getline(ImagingAccess access, char* buffer, int y)
30
memcpy(buffer, access->im->image[y], access->im->linesize);
15
/* use Tests/make_hash.py to calculate these values */
16
#define ACCESS_TABLE_SIZE 21
17
#define ACCESS_TABLE_HASH 30197
19
static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE];
22
hash(const char* mode)
24
UINT32 i = ACCESS_TABLE_HASH;
26
i = ((i<<5) + i) ^ (UINT8) *mode++;
27
return i % ACCESS_TABLE_SIZE;
31
add_item(const char* mode)
33
UINT32 i = hash(mode);
34
/* printf("hash %s => %d\n", mode, i); */
35
if (access_table[i].mode) {
36
fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n",
37
i, mode, access_table[i].mode);
40
access_table[i].mode = mode;
41
return &access_table[i];
44
/* fetch pointer to pixel line */
47
line_8(Imaging im, int x, int y)
49
return &im->image8[y][x];
53
line_16(Imaging im, int x, int y)
55
return &im->image8[y][x+x];
59
line_32(Imaging im, int x, int y)
61
return &im->image32[y][x];
64
/* fetch individual pixel */
67
get_pixel(Imaging im, int x, int y, void* color)
71
/* generic pixel access*/
74
out[0] = im->image8[y][x];
76
UINT8* p = (UINT8*) &im->image32[y][x];
77
if (im->type == IMAGING_TYPE_UINT8 && im->bands == 2) {
82
memcpy(out, p, im->pixelsize);
87
get_pixel_8(Imaging im, int x, int y, void* color)
90
out[0] = im->image8[y][x];
94
get_pixel_16L(Imaging im, int x, int y, void* color)
96
UINT8* in = (UINT8*) &im->image[y][x+x];
98
#ifdef WORDS_BIGENDIAN
99
out[0] = in[0] + (in[1]<<8);
101
out[0] = *(INT16*) in;
106
get_pixel_16B(Imaging im, int x, int y, void* color)
108
UINT8* in = (UINT8*) &im->image[y][x+x];
110
#ifdef WORDS_BIGENDIAN
111
out[0] = *(INT16*) in;
113
out[0] = in[1] + (in[0]<<8);
118
get_pixel_32(Imaging im, int x, int y, void* color)
121
out[0] = im->image32[y][x];
125
get_pixel_32L(Imaging im, int x, int y, void* color)
127
UINT8* in = (UINT8*) &im->image[y][x*4];
129
#ifdef WORDS_BIGENDIAN
130
out[0] = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24);
132
out[0] = *(INT32*) in;
137
get_pixel_32B(Imaging im, int x, int y, void* color)
139
UINT8* in = (UINT8*) &im->image[y][x*4];
141
#ifdef WORDS_BIGENDIAN
142
out[0] = *(INT32*) in;
144
out[0] = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24);
148
/* store individual pixel */
151
put_pixel(Imaging im, int x, int y, const void* color)
154
im->image8[y][x] = *((UINT8*) color);
156
im->image32[y][x] = *((INT32*) color);
160
put_pixel_8(Imaging im, int x, int y, const void* color)
162
im->image8[y][x] = *((UINT8*) color);
166
put_pixel_16L(Imaging im, int x, int y, const void* color)
168
const char* in = color;
169
UINT8* out = (UINT8*) &im->image8[y][x+x];
175
put_pixel_16B(Imaging im, int x, int y, const void* color)
177
const char* in = color;
178
UINT8* out = (UINT8*) &im->image8[y][x+x];
184
put_pixel_32L(Imaging im, int x, int y, const void* color)
186
const char* in = color;
187
UINT8* out = (UINT8*) &im->image8[y][x*4];
195
put_pixel_32B(Imaging im, int x, int y, const void* color)
197
const char* in = color;
198
UINT8* out = (UINT8*) &im->image8[y][x*4];
206
put_pixel_32(Imaging im, int x, int y, const void* color)
208
im->image32[y][x] = *((INT32*) color);
214
#define ADD(mode_, line_, get_pixel_, put_pixel_) \
215
{ ImagingAccess access = add_item(mode_); \
216
access->line = line_; \
217
access->get_pixel = get_pixel_; \
218
access->put_pixel = put_pixel_; \
221
/* populate access table */
222
ADD("1", line_8, get_pixel_8, put_pixel_8);
223
ADD("L", line_8, get_pixel_8, put_pixel_8);
224
ADD("LA", line_32, get_pixel, put_pixel);
225
ADD("I", line_32, get_pixel_32, put_pixel_32);
226
ADD("I;16", line_16, get_pixel_16L, put_pixel_16L);
227
ADD("I;16L", line_16, get_pixel_16L, put_pixel_16L);
228
ADD("I;16B", line_16, get_pixel_16B, put_pixel_16B);
229
ADD("I;32L", line_32, get_pixel_32L, put_pixel_32L);
230
ADD("I;32B", line_32, get_pixel_32B, put_pixel_32B);
231
ADD("F", line_32, get_pixel_32, put_pixel_32);
232
ADD("P", line_8, get_pixel_8, put_pixel_8);
233
ADD("PA", line_32, get_pixel, put_pixel);
234
ADD("RGB", line_32, get_pixel_32, put_pixel_32);
235
ADD("RGBA", line_32, get_pixel_32, put_pixel_32);
236
ADD("RGBa", line_32, get_pixel_32, put_pixel_32);
237
ADD("RGBX", line_32, get_pixel_32, put_pixel_32);
238
ADD("CMYK", line_32, get_pixel_32, put_pixel_32);
239
ADD("YCbCr", line_32, get_pixel_32, put_pixel_32);
35
243
ImagingAccessNew(Imaging im)
37
/* Create a standard access object */
41
access = calloc(1, sizeof(struct ImagingAccessInstance));
43
return (ImagingAccess) ImagingError_MemoryError();
47
access->getline = access_getline;
48
access->destroy = access_destroy;
245
ImagingAccess access = &access_table[hash(im->mode)];
246
if (im->mode[0] != access->mode[0] || strcmp(im->mode, access->mode) != 0)
54
ImagingAccessDelete(ImagingAccess access)
252
_ImagingAccessDelete(Imaging im, ImagingAccess access)
60
access->destroy(access);