mirror of
https://github.com/python-pillow/Pillow.git
synced 2026-02-05 14:59:32 +03:00
121 lines
3.2 KiB
C
121 lines
3.2 KiB
C
/*
|
|
* The Python Imaging Library
|
|
* $Id$
|
|
*
|
|
* imaging access objects
|
|
*
|
|
* Copyright (c) Fredrik Lundh 2009.
|
|
*
|
|
* See the README file for information on usage and redistribution.
|
|
*/
|
|
|
|
#include "Imaging.h"
|
|
|
|
/* fetch individual pixel */
|
|
|
|
static void
|
|
get_pixel_32_2bands(Imaging im, int x, int y, void *color) {
|
|
char *out = color;
|
|
UINT8 *p = (UINT8 *)&im->image32[y][x];
|
|
out[0] = p[0];
|
|
out[1] = p[3];
|
|
}
|
|
|
|
static void
|
|
get_pixel_8(Imaging im, int x, int y, void *color) {
|
|
char *out = color;
|
|
out[0] = im->image8[y][x];
|
|
}
|
|
|
|
static void
|
|
get_pixel_16L(Imaging im, int x, int y, void *color) {
|
|
UINT8 *in = (UINT8 *)&im->image[y][x + x];
|
|
#ifdef WORDS_BIGENDIAN
|
|
UINT16 out = in[0] + ((UINT16)in[1] << 8);
|
|
memcpy(color, &out, sizeof(out));
|
|
#else
|
|
memcpy(color, in, sizeof(UINT16));
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
get_pixel_16B(Imaging im, int x, int y, void *color) {
|
|
UINT8 *in = (UINT8 *)&im->image[y][x + x];
|
|
#ifdef WORDS_BIGENDIAN
|
|
memcpy(color, in, sizeof(UINT16));
|
|
#else
|
|
UINT16 out = in[1] + ((UINT16)in[0] << 8);
|
|
memcpy(color, &out, sizeof(out));
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
get_pixel_32(Imaging im, int x, int y, void *color) {
|
|
memcpy(color, &im->image32[y][x], sizeof(INT32));
|
|
}
|
|
|
|
/* store individual pixel */
|
|
|
|
static void
|
|
put_pixel_8(Imaging im, int x, int y, const void *color) {
|
|
im->image8[y][x] = *((UINT8 *)color);
|
|
}
|
|
|
|
static void
|
|
put_pixel_16L(Imaging im, int x, int y, const void *color) {
|
|
memcpy(&im->image8[y][x + x], color, 2);
|
|
}
|
|
|
|
static void
|
|
put_pixel_16B(Imaging im, int x, int y, const void *color) {
|
|
const char *in = color;
|
|
UINT8 *out = (UINT8 *)&im->image8[y][x + x];
|
|
out[0] = in[1];
|
|
out[1] = in[0];
|
|
}
|
|
|
|
static void
|
|
put_pixel_32(Imaging im, int x, int y, const void *color) {
|
|
memcpy(&im->image32[y][x], color, sizeof(INT32));
|
|
}
|
|
|
|
static struct ImagingAccessInstance accessors[] = {
|
|
{IMAGING_MODE_1, get_pixel_8, put_pixel_8},
|
|
{IMAGING_MODE_L, get_pixel_8, put_pixel_8},
|
|
{IMAGING_MODE_LA, get_pixel_32_2bands, put_pixel_32},
|
|
{IMAGING_MODE_La, get_pixel_32_2bands, put_pixel_32},
|
|
{IMAGING_MODE_I, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_I_16, get_pixel_16L, put_pixel_16L},
|
|
{IMAGING_MODE_I_16L, get_pixel_16L, put_pixel_16L},
|
|
{IMAGING_MODE_I_16B, get_pixel_16B, put_pixel_16B},
|
|
#ifdef WORDS_BIGENDIAN
|
|
{IMAGING_MODE_I_16N, get_pixel_16B, put_pixel_16B},
|
|
#else
|
|
{IMAGING_MODE_I_16N, get_pixel_16L, put_pixel_16L},
|
|
#endif
|
|
{IMAGING_MODE_F, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_P, get_pixel_8, put_pixel_8},
|
|
{IMAGING_MODE_PA, get_pixel_32_2bands, put_pixel_32},
|
|
{IMAGING_MODE_RGB, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_RGBA, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_RGBa, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_RGBX, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_CMYK, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_YCbCr, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_LAB, get_pixel_32, put_pixel_32},
|
|
{IMAGING_MODE_HSV, get_pixel_32, put_pixel_32},
|
|
};
|
|
|
|
ImagingAccess
|
|
ImagingAccessNew(const Imaging im) {
|
|
for (size_t i = 0; i < sizeof(accessors) / sizeof(*accessors); i++) {
|
|
if (im->mode == accessors[i].mode) {
|
|
return &accessors[i];
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
_ImagingAccessDelete(Imaging im, ImagingAccess access) {}
|