mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-15 10:42:19 +03:00
Merge 8dca9c76cc
into b1f7ba0a41
This commit is contained in:
commit
d5c607e648
|
@ -9,4 +9,4 @@ sphinx
|
||||||
types-atheris
|
types-atheris
|
||||||
types-defusedxml
|
types-defusedxml
|
||||||
types-olefile
|
types-olefile
|
||||||
types-setuptools
|
types-setuptools>=75.2.0
|
||||||
|
|
18
setup.py
18
setup.py
|
@ -16,11 +16,14 @@ import subprocess
|
||||||
import sys
|
import sys
|
||||||
import warnings
|
import warnings
|
||||||
from collections.abc import Iterator
|
from collections.abc import Iterator
|
||||||
from typing import Any
|
from typing import TYPE_CHECKING, Any
|
||||||
|
|
||||||
from setuptools import Extension, setup
|
from setuptools import Extension, setup
|
||||||
from setuptools.command.build_ext import build_ext
|
from setuptools.command.build_ext import build_ext
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from setuptools import _BuildInfo
|
||||||
|
|
||||||
|
|
||||||
def get_version() -> str:
|
def get_version() -> str:
|
||||||
version_file = "src/PIL/_version.py"
|
version_file = "src/PIL/_version.py"
|
||||||
|
@ -1008,16 +1011,20 @@ def debug_build() -> bool:
|
||||||
return hasattr(sys, "gettotalrefcount") or FUZZING_BUILD
|
return hasattr(sys, "gettotalrefcount") or FUZZING_BUILD
|
||||||
|
|
||||||
|
|
||||||
|
libraries: list[tuple[str, _BuildInfo]] = [
|
||||||
|
("pil_imaging_mode", {"sources": ["src/libImaging/Mode.c"]}),
|
||||||
|
]
|
||||||
|
|
||||||
files: list[str | os.PathLike[str]] = ["src/_imaging.c"]
|
files: list[str | os.PathLike[str]] = ["src/_imaging.c"]
|
||||||
for src_file in _IMAGING:
|
for src_file in _IMAGING:
|
||||||
files.append("src/" + src_file + ".c")
|
files.append("src/" + src_file + ".c")
|
||||||
for src_file in _LIB_IMAGING:
|
for src_file in _LIB_IMAGING:
|
||||||
files.append(os.path.join("src/libImaging", src_file + ".c"))
|
files.append(os.path.join("src/libImaging", src_file + ".c"))
|
||||||
ext_modules = [
|
ext_modules = [
|
||||||
Extension("PIL._imaging", files),
|
Extension("PIL._imaging", files, libraries=["pil_imaging_mode"]),
|
||||||
Extension("PIL._imagingft", ["src/_imagingft.c"]),
|
Extension("PIL._imagingft", ["src/_imagingft.c"], libraries=["pil_imaging_mode"]),
|
||||||
Extension("PIL._imagingcms", ["src/_imagingcms.c"]),
|
Extension("PIL._imagingcms", ["src/_imagingcms.c"], libraries=["pil_imaging_mode"]),
|
||||||
Extension("PIL._webp", ["src/_webp.c"]),
|
Extension("PIL._webp", ["src/_webp.c"], libraries=["pil_imaging_mode"]),
|
||||||
Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]),
|
Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]),
|
||||||
Extension("PIL._imagingmath", ["src/_imagingmath.c"]),
|
Extension("PIL._imagingmath", ["src/_imagingmath.c"]),
|
||||||
Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]),
|
Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]),
|
||||||
|
@ -1033,6 +1040,7 @@ try:
|
||||||
setup(
|
setup(
|
||||||
cmdclass={"build_ext": pil_build_ext},
|
cmdclass={"build_ext": pil_build_ext},
|
||||||
ext_modules=ext_modules,
|
ext_modules=ext_modules,
|
||||||
|
libraries=libraries,
|
||||||
zip_safe=not (debug_build() or PLATFORM_MINGW),
|
zip_safe=not (debug_build() or PLATFORM_MINGW),
|
||||||
)
|
)
|
||||||
except RequiredDependencyException as err:
|
except RequiredDependencyException as err:
|
||||||
|
|
|
@ -121,15 +121,16 @@ PyImagingPhotoPut(
|
||||||
|
|
||||||
/* Mode */
|
/* Mode */
|
||||||
|
|
||||||
if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) {
|
if (im->mode == IMAGING_MODE_1 || im->mode == IMAGING_MODE_L) {
|
||||||
block.pixelSize = 1;
|
block.pixelSize = 1;
|
||||||
block.offset[0] = block.offset[1] = block.offset[2] = block.offset[3] = 0;
|
block.offset[0] = block.offset[1] = block.offset[2] = block.offset[3] = 0;
|
||||||
} else if (strncmp(im->mode, "RGB", 3) == 0) {
|
} else if (im->mode == IMAGING_MODE_RGB || im->mode == IMAGING_MODE_RGBA ||
|
||||||
|
im->mode == IMAGING_MODE_RGBX || im->mode == IMAGING_MODE_RGBa) {
|
||||||
block.pixelSize = 4;
|
block.pixelSize = 4;
|
||||||
block.offset[0] = 0;
|
block.offset[0] = 0;
|
||||||
block.offset[1] = 1;
|
block.offset[1] = 1;
|
||||||
block.offset[2] = 2;
|
block.offset[2] = 2;
|
||||||
if (strcmp(im->mode, "RGBA") == 0) {
|
if (im->mode == IMAGING_MODE_RGBA) {
|
||||||
block.offset[3] = 3; /* alpha (or reserved, under Tk 8.2) */
|
block.offset[3] = 3; /* alpha (or reserved, under Tk 8.2) */
|
||||||
} else {
|
} else {
|
||||||
block.offset[3] = 0; /* no alpha */
|
block.offset[3] = 0; /* no alpha */
|
||||||
|
|
166
src/_imaging.c
166
src/_imaging.c
|
@ -292,7 +292,7 @@ ImagingError_Clear(void) {
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
getbands(const char *mode) {
|
getbands(const ModeID mode) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
int bands;
|
int bands;
|
||||||
|
|
||||||
|
@ -586,7 +586,7 @@ getink(PyObject *color, Imaging im, char *ink) {
|
||||||
memcpy(ink, &ftmp, sizeof(ftmp));
|
memcpy(ink, &ftmp, sizeof(ftmp));
|
||||||
return ink;
|
return ink;
|
||||||
case IMAGING_TYPE_SPECIAL:
|
case IMAGING_TYPE_SPECIAL:
|
||||||
if (strncmp(im->mode, "I;16", 4) == 0) {
|
if (isModeI16(im->mode)) {
|
||||||
ink[0] = (UINT8)r;
|
ink[0] = (UINT8)r;
|
||||||
ink[1] = (UINT8)(r >> 8);
|
ink[1] = (UINT8)(r >> 8);
|
||||||
ink[2] = ink[3] = 0;
|
ink[2] = ink[3] = 0;
|
||||||
|
@ -605,7 +605,7 @@ getink(PyObject *color, Imaging im, char *ink) {
|
||||||
} else if (!PyArg_ParseTuple(color, "iiL", &b, &g, &r)) {
|
} else if (!PyArg_ParseTuple(color, "iiL", &b, &g, &r)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!strcmp(im->mode, "BGR;15")) {
|
if (im->mode == IMAGING_MODE_BGR_15) {
|
||||||
UINT16 v = ((((UINT16)r) << 7) & 0x7c00) +
|
UINT16 v = ((((UINT16)r) << 7) & 0x7c00) +
|
||||||
((((UINT16)g) << 2) & 0x03e0) +
|
((((UINT16)g) << 2) & 0x03e0) +
|
||||||
((((UINT16)b) >> 3) & 0x001f);
|
((((UINT16)b) >> 3) & 0x001f);
|
||||||
|
@ -614,7 +614,7 @@ getink(PyObject *color, Imaging im, char *ink) {
|
||||||
ink[1] = (UINT8)(v >> 8);
|
ink[1] = (UINT8)(v >> 8);
|
||||||
ink[2] = ink[3] = 0;
|
ink[2] = ink[3] = 0;
|
||||||
return ink;
|
return ink;
|
||||||
} else if (!strcmp(im->mode, "BGR;16")) {
|
} else if (im->mode == IMAGING_MODE_BGR_16) {
|
||||||
UINT16 v = ((((UINT16)r) << 8) & 0xf800) +
|
UINT16 v = ((((UINT16)r) << 8) & 0xf800) +
|
||||||
((((UINT16)g) << 3) & 0x07e0) +
|
((((UINT16)g) << 3) & 0x07e0) +
|
||||||
((((UINT16)b) >> 3) & 0x001f);
|
((((UINT16)b) >> 3) & 0x001f);
|
||||||
|
@ -622,7 +622,7 @@ getink(PyObject *color, Imaging im, char *ink) {
|
||||||
ink[1] = (UINT8)(v >> 8);
|
ink[1] = (UINT8)(v >> 8);
|
||||||
ink[2] = ink[3] = 0;
|
ink[2] = ink[3] = 0;
|
||||||
return ink;
|
return ink;
|
||||||
} else if (!strcmp(im->mode, "BGR;24")) {
|
} else if (im->mode == IMAGING_MODE_BGR_24) {
|
||||||
ink[0] = (UINT8)b;
|
ink[0] = (UINT8)b;
|
||||||
ink[1] = (UINT8)g;
|
ink[1] = (UINT8)g;
|
||||||
ink[2] = (UINT8)r;
|
ink[2] = (UINT8)r;
|
||||||
|
@ -642,7 +642,7 @@ getink(PyObject *color, Imaging im, char *ink) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_fill(PyObject *self, PyObject *args) {
|
_fill(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
PyObject *color;
|
PyObject *color;
|
||||||
char buffer[4];
|
char buffer[4];
|
||||||
|
@ -651,10 +651,12 @@ _fill(PyObject *self, PyObject *args) {
|
||||||
xsize = ysize = 256;
|
xsize = ysize = 256;
|
||||||
color = NULL;
|
color = NULL;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s|(ii)O", &mode, &xsize, &ysize, &color)) {
|
if (!PyArg_ParseTuple(args, "s|(ii)O", &mode_name, &xsize, &ysize, &color)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
im = ImagingNewDirty(mode, xsize, ysize);
|
im = ImagingNewDirty(mode, xsize, ysize);
|
||||||
if (!im) {
|
if (!im) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -675,47 +677,55 @@ _fill(PyObject *self, PyObject *args) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_new(PyObject *self, PyObject *args) {
|
_new(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) {
|
if (!PyArg_ParseTuple(args, "s(ii)", &mode_name, &xsize, &ysize)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingNew(mode, xsize, ysize));
|
return PyImagingNew(ImagingNew(mode, xsize, ysize));
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_new_block(PyObject *self, PyObject *args) {
|
_new_block(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) {
|
if (!PyArg_ParseTuple(args, "s(ii)", &mode_name, &xsize, &ysize)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingNewBlock(mode, xsize, ysize));
|
return PyImagingNew(ImagingNewBlock(mode, xsize, ysize));
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_linear_gradient(PyObject *self, PyObject *args) {
|
_linear_gradient(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s", &mode)) {
|
if (!PyArg_ParseTuple(args, "s", &mode_name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingFillLinearGradient(mode));
|
return PyImagingNew(ImagingFillLinearGradient(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_radial_gradient(PyObject *self, PyObject *args) {
|
_radial_gradient(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s", &mode)) {
|
if (!PyArg_ParseTuple(args, "s", &mode_name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingFillRadialGradient(mode));
|
return PyImagingNew(ImagingFillRadialGradient(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -855,7 +865,7 @@ _prepare_lut_table(PyObject *table, Py_ssize_t table_size) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_color_lut_3d(ImagingObject *self, PyObject *args) {
|
_color_lut_3d(ImagingObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int filter;
|
int filter;
|
||||||
int table_channels;
|
int table_channels;
|
||||||
int size1D, size2D, size3D;
|
int size1D, size2D, size3D;
|
||||||
|
@ -867,7 +877,7 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"sii(iii)O:color_lut_3d",
|
"sii(iii)O:color_lut_3d",
|
||||||
&mode,
|
&mode_name,
|
||||||
&filter,
|
&filter,
|
||||||
&table_channels,
|
&table_channels,
|
||||||
&size1D,
|
&size1D,
|
||||||
|
@ -878,6 +888,8 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
/* actually, it is trilinear */
|
/* actually, it is trilinear */
|
||||||
if (filter != IMAGING_TRANSFORM_BILINEAR) {
|
if (filter != IMAGING_TRANSFORM_BILINEAR) {
|
||||||
PyErr_SetString(PyExc_ValueError, "Only LINEAR filter is supported.");
|
PyErr_SetString(PyExc_ValueError, "Only LINEAR filter is supported.");
|
||||||
|
@ -924,11 +936,11 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_convert(ImagingObject *self, PyObject *args) {
|
_convert(ImagingObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int dither = 0;
|
int dither = 0;
|
||||||
ImagingObject *paletteimage = NULL;
|
ImagingObject *paletteimage = NULL;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s|iO", &mode, &dither, &paletteimage)) {
|
if (!PyArg_ParseTuple(args, "s|iO", &mode_name, &dither, &paletteimage)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (paletteimage != NULL) {
|
if (paletteimage != NULL) {
|
||||||
|
@ -945,6 +957,8 @@ _convert(ImagingObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingConvert(
|
return PyImagingNew(ImagingConvert(
|
||||||
self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither
|
self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither
|
||||||
));
|
));
|
||||||
|
@ -969,14 +983,14 @@ _convert2(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_convert_matrix(ImagingObject *self, PyObject *args) {
|
_convert_matrix(ImagingObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
float m[12];
|
float m[12];
|
||||||
if (!PyArg_ParseTuple(args, "s(ffff)", &mode, m + 0, m + 1, m + 2, m + 3)) {
|
if (!PyArg_ParseTuple(args, "s(ffff)", &mode_name, m + 0, m + 1, m + 2, m + 3)) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"s(ffffffffffff)",
|
"s(ffffffffffff)",
|
||||||
&mode,
|
&mode_name,
|
||||||
m + 0,
|
m + 0,
|
||||||
m + 1,
|
m + 1,
|
||||||
m + 2,
|
m + 2,
|
||||||
|
@ -994,18 +1008,22 @@ _convert_matrix(ImagingObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
return PyImagingNew(ImagingConvertMatrix(self->image, mode, m));
|
return PyImagingNew(ImagingConvertMatrix(self->image, mode, m));
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_convert_transparent(ImagingObject *self, PyObject *args) {
|
_convert_transparent(ImagingObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
if (PyArg_ParseTuple(args, "s(iii)", &mode, &r, &g, &b)) {
|
if (PyArg_ParseTuple(args, "s(iii)", &mode_name, &r, &g, &b)) {
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, g, b));
|
return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, g, b));
|
||||||
}
|
}
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
if (PyArg_ParseTuple(args, "si", &mode, &r)) {
|
if (PyArg_ParseTuple(args, "si", &mode_name, &r)) {
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, 0, 0));
|
return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, 0, 0));
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1104,9 +1122,9 @@ _getpalette(ImagingObject *self, PyObject *args) {
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler pack;
|
ImagingShuffler pack;
|
||||||
|
|
||||||
char *mode = "RGB";
|
char *mode_name = "RGB";
|
||||||
char *rawmode = "RGB";
|
char *rawmode_name = "RGB";
|
||||||
if (!PyArg_ParseTuple(args, "|ss", &mode, &rawmode)) {
|
if (!PyArg_ParseTuple(args, "|ss", &mode_name, &rawmode_name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1115,6 +1133,9 @@ _getpalette(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
pack = ImagingFindPacker(mode, rawmode, &bits);
|
pack = ImagingFindPacker(mode, rawmode, &bits);
|
||||||
if (!pack) {
|
if (!pack) {
|
||||||
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);
|
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);
|
||||||
|
@ -1141,7 +1162,7 @@ _getpalettemode(ImagingObject *self) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PyUnicode_FromString(self->image->palette->mode);
|
return PyUnicode_FromString(getModeData(self->image->palette->mode)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
@ -1422,12 +1443,14 @@ _point(ImagingObject *self, PyObject *args) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
|
|
||||||
PyObject *list;
|
PyObject *list;
|
||||||
char *mode;
|
char *mode_name;
|
||||||
if (!PyArg_ParseTuple(args, "Oz", &list, &mode)) {
|
if (!PyArg_ParseTuple(args, "Oz", &list, &mode_name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode && !strcmp(mode, "F")) {
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
|
if (mode == IMAGING_MODE_F) {
|
||||||
FLOAT32 *data;
|
FLOAT32 *data;
|
||||||
|
|
||||||
/* map from 8-bit data to floating point */
|
/* map from 8-bit data to floating point */
|
||||||
|
@ -1438,8 +1461,7 @@ _point(ImagingObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
im = ImagingPoint(self->image, mode, (void *)data);
|
im = ImagingPoint(self->image, mode, (void *)data);
|
||||||
free(data);
|
free(data);
|
||||||
|
} else if (self->image->mode == IMAGING_MODE_I && mode == IMAGING_MODE_L) {
|
||||||
} else if (!strcmp(self->image->mode, "I") && mode && !strcmp(mode, "L")) {
|
|
||||||
UINT8 *data;
|
UINT8 *data;
|
||||||
|
|
||||||
/* map from 16-bit subset of 32-bit data to 8-bit */
|
/* map from 16-bit subset of 32-bit data to 8-bit */
|
||||||
|
@ -1451,7 +1473,6 @@ _point(ImagingObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
im = ImagingPoint(self->image, mode, (void *)data);
|
im = ImagingPoint(self->image, mode, (void *)data);
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
INT32 *data;
|
INT32 *data;
|
||||||
UINT8 lut[1024];
|
UINT8 lut[1024];
|
||||||
|
@ -1472,7 +1493,7 @@ _point(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode && !strcmp(mode, "I")) {
|
if (mode == IMAGING_MODE_I) {
|
||||||
im = ImagingPoint(self->image, mode, (void *)data);
|
im = ImagingPoint(self->image, mode, (void *)data);
|
||||||
} else if (mode && bands > 1) {
|
} else if (mode && bands > 1) {
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
|
@ -1578,9 +1599,9 @@ _putdata(ImagingObject *self, PyObject *args) {
|
||||||
int bigendian = 0;
|
int bigendian = 0;
|
||||||
if (image->type == IMAGING_TYPE_SPECIAL) {
|
if (image->type == IMAGING_TYPE_SPECIAL) {
|
||||||
// I;16*
|
// I;16*
|
||||||
if (strcmp(image->mode, "I;16B") == 0
|
if (image->mode == IMAGING_MODE_I_16B
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|| strcmp(image->mode, "I;16N") == 0
|
|| image->mode == IMAGING_MODE_I_16N
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
bigendian = 1;
|
bigendian = 1;
|
||||||
|
@ -1697,7 +1718,9 @@ _quantize(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
if (!self->image->xsize || !self->image->ysize) {
|
if (!self->image->xsize || !self->image->ysize) {
|
||||||
/* no content; return an empty image */
|
/* no content; return an empty image */
|
||||||
return PyImagingNew(ImagingNew("P", self->image->xsize, self->image->ysize));
|
return PyImagingNew(
|
||||||
|
ImagingNew(IMAGING_MODE_P, self->image->xsize, self->image->ysize)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return PyImagingNew(ImagingQuantize(self->image, colours, method, kmeans));
|
return PyImagingNew(ImagingQuantize(self->image, colours, method, kmeans));
|
||||||
|
@ -1708,21 +1731,33 @@ _putpalette(ImagingObject *self, PyObject *args) {
|
||||||
ImagingShuffler unpack;
|
ImagingShuffler unpack;
|
||||||
int bits;
|
int bits;
|
||||||
|
|
||||||
char *palette_mode, *rawmode;
|
char *palette_mode_name, *rawmode_name;
|
||||||
UINT8 *palette;
|
UINT8 *palette;
|
||||||
Py_ssize_t palettesize;
|
Py_ssize_t palettesize;
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args, "ssy#", &palette_mode, &rawmode, &palette, &palettesize
|
args, "ssy#", &palette_mode_name, &rawmode_name, &palette, &palettesize
|
||||||
)) {
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(self->image->mode, "L") && strcmp(self->image->mode, "LA") &&
|
if (self->image->mode != IMAGING_MODE_L && self->image->mode != IMAGING_MODE_LA &&
|
||||||
strcmp(self->image->mode, "P") && strcmp(self->image->mode, "PA")) {
|
self->image->mode != IMAGING_MODE_P && self->image->mode != IMAGING_MODE_PA) {
|
||||||
PyErr_SetString(PyExc_ValueError, wrong_mode);
|
PyErr_SetString(PyExc_ValueError, wrong_mode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID palette_mode = findModeID(palette_mode_name);
|
||||||
|
if (palette_mode == IMAGING_MODE_UNKNOWN) {
|
||||||
|
PyErr_SetString(PyExc_ValueError, wrong_mode);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
if (rawmode == IMAGING_RAWMODE_UNKNOWN) {
|
||||||
|
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
unpack = ImagingFindUnpacker(palette_mode, rawmode, &bits);
|
unpack = ImagingFindUnpacker(palette_mode, rawmode, &bits);
|
||||||
if (!unpack) {
|
if (!unpack) {
|
||||||
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);
|
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);
|
||||||
|
@ -1736,7 +1771,13 @@ _putpalette(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
ImagingPaletteDelete(self->image->palette);
|
ImagingPaletteDelete(self->image->palette);
|
||||||
|
|
||||||
strcpy(self->image->mode, strlen(self->image->mode) == 2 ? "PA" : "P");
|
if (self->image->mode == IMAGING_MODE_LA) {
|
||||||
|
self->image->mode = IMAGING_MODE_PA;
|
||||||
|
} else if (self->image->mode == IMAGING_MODE_L) {
|
||||||
|
self->image->mode = IMAGING_MODE_P;
|
||||||
|
} else {
|
||||||
|
// The image already has a palette mode so we don't need to change it.
|
||||||
|
}
|
||||||
|
|
||||||
self->image->palette = ImagingPaletteNew(palette_mode);
|
self->image->palette = ImagingPaletteNew(palette_mode);
|
||||||
|
|
||||||
|
@ -1764,7 +1805,7 @@ _putpalettealpha(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(self->image->palette->mode, "RGBA");
|
self->image->palette->mode = IMAGING_MODE_RGBA;
|
||||||
self->image->palette->palette[index * 4 + 3] = (UINT8)alpha;
|
self->image->palette->palette[index * 4 + 3] = (UINT8)alpha;
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
@ -1789,7 +1830,7 @@ _putpalettealphas(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(self->image->palette->mode, "RGBA");
|
self->image->palette->mode = IMAGING_MODE_RGBA;
|
||||||
for (i = 0; i < length; i++) {
|
for (i = 0; i < length; i++) {
|
||||||
self->image->palette->palette[i * 4 + 3] = (UINT8)values[i];
|
self->image->palette->palette[i * 4 + 3] = (UINT8)values[i];
|
||||||
}
|
}
|
||||||
|
@ -1957,8 +1998,11 @@ _reduce(ImagingObject *self, PyObject *args) {
|
||||||
return PyImagingNew(imOut);
|
return PyImagingNew(imOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IS_RGB(mode) \
|
static int
|
||||||
(!strcmp(mode, "RGB") || !strcmp(mode, "RGBA") || !strcmp(mode, "RGBX"))
|
isRGB(const ModeID mode) {
|
||||||
|
return mode == IMAGING_MODE_RGB || mode == IMAGING_MODE_RGBA ||
|
||||||
|
mode == IMAGING_MODE_RGBX;
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
im_setmode(ImagingObject *self, PyObject *args) {
|
im_setmode(ImagingObject *self, PyObject *args) {
|
||||||
|
@ -1966,23 +2010,25 @@ im_setmode(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
Imaging im;
|
Imaging im;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
Py_ssize_t modelen;
|
Py_ssize_t modelen;
|
||||||
if (!PyArg_ParseTuple(args, "s#:setmode", &mode, &modelen)) {
|
if (!PyArg_ParseTuple(args, "s#:setmode", &mode_name, &modelen)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
im = self->image;
|
im = self->image;
|
||||||
|
|
||||||
/* move all logic in here to the libImaging primitive */
|
/* move all logic in here to the libImaging primitive */
|
||||||
|
|
||||||
if (!strcmp(im->mode, mode)) {
|
if (im->mode == mode) {
|
||||||
; /* same mode; always succeeds */
|
; /* same mode; always succeeds */
|
||||||
} else if (IS_RGB(im->mode) && IS_RGB(mode)) {
|
} else if (isRGB(im->mode) && isRGB(mode)) {
|
||||||
/* color to color */
|
/* color to color */
|
||||||
strcpy(im->mode, mode);
|
im->mode = mode;
|
||||||
im->bands = modelen;
|
im->bands = modelen;
|
||||||
if (!strcmp(mode, "RGBA")) {
|
if (mode == IMAGING_MODE_RGBA) {
|
||||||
(void)ImagingFillBand(im, 3, 255);
|
(void)ImagingFillBand(im, 3, 255);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2261,7 +2307,7 @@ _getextrema(ImagingObject *self) {
|
||||||
case IMAGING_TYPE_FLOAT32:
|
case IMAGING_TYPE_FLOAT32:
|
||||||
return Py_BuildValue("dd", extrema.f[0], extrema.f[1]);
|
return Py_BuildValue("dd", extrema.f[0], extrema.f[1]);
|
||||||
case IMAGING_TYPE_SPECIAL:
|
case IMAGING_TYPE_SPECIAL:
|
||||||
if (strcmp(self->image->mode, "I;16") == 0) {
|
if (self->image->mode == IMAGING_MODE_I_16) {
|
||||||
return Py_BuildValue("HH", extrema.s[0], extrema.s[1]);
|
return Py_BuildValue("HH", extrema.s[0], extrema.s[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2350,7 +2396,7 @@ _putband(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_merge(PyObject *self, PyObject *args) {
|
_merge(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
char *mode_name;
|
||||||
ImagingObject *band0 = NULL;
|
ImagingObject *band0 = NULL;
|
||||||
ImagingObject *band1 = NULL;
|
ImagingObject *band1 = NULL;
|
||||||
ImagingObject *band2 = NULL;
|
ImagingObject *band2 = NULL;
|
||||||
|
@ -2360,7 +2406,7 @@ _merge(PyObject *self, PyObject *args) {
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"sO!|O!O!O!",
|
"sO!|O!O!O!",
|
||||||
&mode,
|
&mode_name,
|
||||||
&Imaging_Type,
|
&Imaging_Type,
|
||||||
&band0,
|
&band0,
|
||||||
&Imaging_Type,
|
&Imaging_Type,
|
||||||
|
@ -2373,6 +2419,8 @@ _merge(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
if (band0) {
|
if (band0) {
|
||||||
bands[0] = band0->image;
|
bands[0] = band0->image;
|
||||||
}
|
}
|
||||||
|
@ -3662,7 +3710,7 @@ static struct PyMethodDef methods[] = {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_getattr_mode(ImagingObject *self, void *closure) {
|
_getattr_mode(ImagingObject *self, void *closure) {
|
||||||
return PyUnicode_FromString(self->image->mode);
|
return PyUnicode_FromString(getModeData(self->image->mode)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -4217,8 +4265,6 @@ setup_module(PyObject *m) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagingAccessInit();
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBJPEG
|
#ifdef HAVE_LIBJPEG
|
||||||
{
|
{
|
||||||
extern const char *ImagingJpegVersion(void);
|
extern const char *ImagingJpegVersion(void);
|
||||||
|
|
|
@ -212,32 +212,44 @@ cms_transform_dealloc(CmsTransformObject *self) {
|
||||||
/* internal functions */
|
/* internal functions */
|
||||||
|
|
||||||
static cmsUInt32Number
|
static cmsUInt32Number
|
||||||
findLCMStype(char *PILmode) {
|
findLCMStype(const char *const mode_name) {
|
||||||
if (strcmp(PILmode, "RGB") == 0 || strcmp(PILmode, "RGBA") == 0 ||
|
const ModeID mode = findModeID(mode_name);
|
||||||
strcmp(PILmode, "RGBX") == 0) {
|
switch (mode) {
|
||||||
return TYPE_RGBA_8;
|
case IMAGING_MODE_RGB:
|
||||||
|
case IMAGING_MODE_RGBA:
|
||||||
|
case IMAGING_MODE_RGBX:
|
||||||
|
return TYPE_RGBA_8;
|
||||||
|
case IMAGING_MODE_CMYK:
|
||||||
|
return TYPE_CMYK_8;
|
||||||
|
case IMAGING_MODE_I_16:
|
||||||
|
case IMAGING_MODE_I_16L:
|
||||||
|
return TYPE_GRAY_16;
|
||||||
|
case IMAGING_MODE_I_16B:
|
||||||
|
return TYPE_GRAY_16_SE;
|
||||||
|
case IMAGING_MODE_YCbCr:
|
||||||
|
return TYPE_YCbCr_8;
|
||||||
|
case IMAGING_MODE_LAB:
|
||||||
|
// LabX equivalent like ALab, but not reversed -- no #define in lcms2
|
||||||
|
return (
|
||||||
|
COLORSPACE_SH(PT_LabV2) | CHANNELS_SH(3) | BYTES_SH(1) | EXTRA_SH(1)
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
// This function only accepts a subset of the imaging modes Pillow has.
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (strcmp(PILmode, "RGBA;16B") == 0) {
|
// The following modes are not valid PIL Image modes.
|
||||||
|
if (strcmp(mode_name, "RGBA;16B") == 0) {
|
||||||
return TYPE_RGBA_16;
|
return TYPE_RGBA_16;
|
||||||
}
|
}
|
||||||
if (strcmp(PILmode, "CMYK") == 0) {
|
if (strcmp(mode_name, "L;16") == 0) {
|
||||||
return TYPE_CMYK_8;
|
|
||||||
}
|
|
||||||
if (strcmp(PILmode, "I;16") == 0 || strcmp(PILmode, "I;16L") == 0 ||
|
|
||||||
strcmp(PILmode, "L;16") == 0) {
|
|
||||||
return TYPE_GRAY_16;
|
return TYPE_GRAY_16;
|
||||||
}
|
}
|
||||||
if (strcmp(PILmode, "I;16B") == 0 || strcmp(PILmode, "L;16B") == 0) {
|
if (strcmp(mode_name, "L;16B") == 0) {
|
||||||
return TYPE_GRAY_16_SE;
|
return TYPE_GRAY_16_SE;
|
||||||
}
|
}
|
||||||
if (strcmp(PILmode, "YCbCr") == 0 || strcmp(PILmode, "YCCA") == 0 ||
|
if (strcmp(mode_name, "YCCA") == 0 || strcmp(mode_name, "YCC") == 0) {
|
||||||
strcmp(PILmode, "YCC") == 0) {
|
|
||||||
return TYPE_YCbCr_8;
|
return TYPE_YCbCr_8;
|
||||||
}
|
}
|
||||||
if (strcmp(PILmode, "LAB") == 0) {
|
|
||||||
// LabX equivalent like ALab, but not reversed -- no #define in lcms2
|
|
||||||
return (COLORSPACE_SH(PT_LabV2) | CHANNELS_SH(3) | BYTES_SH(1) | EXTRA_SH(1));
|
|
||||||
}
|
|
||||||
/* presume "1" or "L" by default */
|
/* presume "1" or "L" by default */
|
||||||
return TYPE_GRAY_8;
|
return TYPE_GRAY_8;
|
||||||
}
|
}
|
||||||
|
|
|
@ -523,7 +523,7 @@ font_getlength(FontObject *self, PyObject *args) {
|
||||||
int horizontal_dir; /* is primary axis horizontal? */
|
int horizontal_dir; /* is primary axis horizontal? */
|
||||||
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
||||||
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
||||||
const char *mode = NULL;
|
const char *mode_name = NULL;
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char *lang = NULL;
|
const char *lang = NULL;
|
||||||
PyObject *features = Py_None;
|
PyObject *features = Py_None;
|
||||||
|
@ -532,15 +532,16 @@ font_getlength(FontObject *self, PyObject *args) {
|
||||||
/* calculate size and bearing for a given string */
|
/* calculate size and bearing for a given string */
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang
|
args, "O|zzOz:getlength", &string, &mode_name, &dir, &features, &lang
|
||||||
)) {
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1;
|
horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1;
|
||||||
|
|
||||||
mask = mode && strcmp(mode, "1") == 0;
|
const ModeID mode = findModeID(mode_name);
|
||||||
color = mode && strcmp(mode, "RGBA") == 0;
|
mask = mode == IMAGING_MODE_1;
|
||||||
|
color = mode == IMAGING_MODE_RGBA;
|
||||||
|
|
||||||
count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color);
|
count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color);
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
|
@ -752,7 +753,7 @@ font_getsize(FontObject *self, PyObject *args) {
|
||||||
int horizontal_dir; /* is primary axis horizontal? */
|
int horizontal_dir; /* is primary axis horizontal? */
|
||||||
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
||||||
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
||||||
const char *mode = NULL;
|
const char *mode_name = NULL;
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char *lang = NULL;
|
const char *lang = NULL;
|
||||||
const char *anchor = NULL;
|
const char *anchor = NULL;
|
||||||
|
@ -762,15 +763,23 @@ font_getsize(FontObject *self, PyObject *args) {
|
||||||
/* calculate size and bearing for a given string */
|
/* calculate size and bearing for a given string */
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor
|
args,
|
||||||
|
"O|zzOzz:getsize",
|
||||||
|
&string,
|
||||||
|
&mode_name,
|
||||||
|
&dir,
|
||||||
|
&features,
|
||||||
|
&lang,
|
||||||
|
&anchor
|
||||||
)) {
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1;
|
horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1;
|
||||||
|
|
||||||
mask = mode && strcmp(mode, "1") == 0;
|
const ModeID mode = findModeID(mode_name);
|
||||||
color = mode && strcmp(mode, "RGBA") == 0;
|
mask = mode == IMAGING_MODE_1;
|
||||||
|
color = mode == IMAGING_MODE_RGBA;
|
||||||
|
|
||||||
count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color);
|
count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color);
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
|
@ -837,7 +846,7 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
int stroke_filled = 0;
|
int stroke_filled = 0;
|
||||||
PY_LONG_LONG foreground_ink_long = 0;
|
PY_LONG_LONG foreground_ink_long = 0;
|
||||||
unsigned int foreground_ink;
|
unsigned int foreground_ink;
|
||||||
const char *mode = NULL;
|
const char *mode_name = NULL;
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char *lang = NULL;
|
const char *lang = NULL;
|
||||||
const char *anchor = NULL;
|
const char *anchor = NULL;
|
||||||
|
@ -857,7 +866,7 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
"OO|zzOzfpzL(ff):render",
|
"OO|zzOzfpzL(ff):render",
|
||||||
&string,
|
&string,
|
||||||
&fill,
|
&fill,
|
||||||
&mode,
|
&mode_name,
|
||||||
&dir,
|
&dir,
|
||||||
&features,
|
&features,
|
||||||
&lang,
|
&lang,
|
||||||
|
@ -871,8 +880,9 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = mode && strcmp(mode, "1") == 0;
|
const ModeID mode = findModeID(mode_name);
|
||||||
color = mode && strcmp(mode, "RGBA") == 0;
|
mask = mode == IMAGING_MODE_1;
|
||||||
|
color = mode == IMAGING_MODE_RGBA;
|
||||||
|
|
||||||
foreground_ink = foreground_ink_long;
|
foreground_ink = foreground_ink_long;
|
||||||
|
|
||||||
|
|
16
src/_webp.c
16
src/_webp.c
|
@ -89,8 +89,8 @@ HandleMuxError(WebPMuxError err, char *chunk) {
|
||||||
|
|
||||||
static int
|
static int
|
||||||
import_frame_libwebp(WebPPicture *frame, Imaging im) {
|
import_frame_libwebp(WebPPicture *frame, Imaging im) {
|
||||||
if (strcmp(im->mode, "RGBA") && strcmp(im->mode, "RGB") &&
|
if (im->mode != IMAGING_MODE_RGBA && im->mode != IMAGING_MODE_RGB &&
|
||||||
strcmp(im->mode, "RGBX")) {
|
im->mode != IMAGING_MODE_RGBX) {
|
||||||
PyErr_SetString(PyExc_ValueError, "unsupported image mode");
|
PyErr_SetString(PyExc_ValueError, "unsupported image mode");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ import_frame_libwebp(WebPPicture *frame, Imaging im) {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ignore_fourth_channel = strcmp(im->mode, "RGBA");
|
int ignore_fourth_channel = im->mode != IMAGING_MODE_RGBA;
|
||||||
for (int y = 0; y < im->ysize; ++y) {
|
for (int y = 0; y < im->ysize; ++y) {
|
||||||
UINT8 *src = (UINT8 *)im->image32[y];
|
UINT8 *src = (UINT8 *)im->image32[y];
|
||||||
UINT32 *dst = frame->argb + frame->argb_stride * y;
|
UINT32 *dst = frame->argb + frame->argb_stride * y;
|
||||||
|
@ -143,7 +143,7 @@ typedef struct {
|
||||||
PyObject_HEAD WebPAnimDecoder *dec;
|
PyObject_HEAD WebPAnimDecoder *dec;
|
||||||
WebPAnimInfo info;
|
WebPAnimInfo info;
|
||||||
WebPData data;
|
WebPData data;
|
||||||
char *mode;
|
ModeID mode;
|
||||||
} WebPAnimDecoderObject;
|
} WebPAnimDecoderObject;
|
||||||
|
|
||||||
static PyTypeObject WebPAnimDecoder_Type;
|
static PyTypeObject WebPAnimDecoder_Type;
|
||||||
|
@ -396,7 +396,7 @@ _anim_decoder_new(PyObject *self, PyObject *args) {
|
||||||
const uint8_t *webp;
|
const uint8_t *webp;
|
||||||
Py_ssize_t size;
|
Py_ssize_t size;
|
||||||
WebPData webp_src;
|
WebPData webp_src;
|
||||||
char *mode;
|
ModeID mode;
|
||||||
WebPDecoderConfig config;
|
WebPDecoderConfig config;
|
||||||
WebPAnimDecoderObject *decp = NULL;
|
WebPAnimDecoderObject *decp = NULL;
|
||||||
WebPAnimDecoder *dec = NULL;
|
WebPAnimDecoder *dec = NULL;
|
||||||
|
@ -409,10 +409,10 @@ _anim_decoder_new(PyObject *self, PyObject *args) {
|
||||||
webp_src.size = size;
|
webp_src.size = size;
|
||||||
|
|
||||||
// Sniff the mode, since the decoder API doesn't tell us
|
// Sniff the mode, since the decoder API doesn't tell us
|
||||||
mode = "RGBA";
|
mode = IMAGING_MODE_RGBA;
|
||||||
if (WebPGetFeatures(webp, size, &config.input) == VP8_STATUS_OK) {
|
if (WebPGetFeatures(webp, size, &config.input) == VP8_STATUS_OK) {
|
||||||
if (!config.input.has_alpha) {
|
if (!config.input.has_alpha) {
|
||||||
mode = "RGBX";
|
mode = IMAGING_MODE_RGBX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,7 +455,7 @@ _anim_decoder_get_info(PyObject *self) {
|
||||||
info->loop_count,
|
info->loop_count,
|
||||||
info->bgcolor,
|
info->bgcolor,
|
||||||
info->frame_count,
|
info->frame_count,
|
||||||
decp->mode
|
getModeData(decp->mode)->name
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
148
src/decode.c
148
src/decode.c
|
@ -266,7 +266,9 @@ static PyTypeObject ImagingDecoderType = {
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
int
|
int
|
||||||
get_unpacker(ImagingDecoderObject *decoder, const char *mode, const char *rawmode) {
|
get_unpacker(
|
||||||
|
ImagingDecoderObject *decoder, const ModeID mode, const RawModeID rawmode
|
||||||
|
) {
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler unpack;
|
ImagingShuffler unpack;
|
||||||
|
|
||||||
|
@ -291,17 +293,20 @@ PyObject *
|
||||||
PyImaging_BitDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_BitDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
const char *mode_name;
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
int pad = 8;
|
int pad = 8;
|
||||||
int fill = 0;
|
int fill = 0;
|
||||||
int sign = 0;
|
int sign = 0;
|
||||||
int ystep = 1;
|
int ystep = 1;
|
||||||
if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, &sign, &ystep)) {
|
if (!PyArg_ParseTuple(
|
||||||
|
args, "s|iiiii", &mode_name, &bits, &pad, &fill, &sign, &ystep
|
||||||
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, "F") != 0) {
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
if (mode != IMAGING_MODE_F) {
|
||||||
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -331,34 +336,36 @@ PyObject *
|
||||||
PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *actual;
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
char *pixel_format = "";
|
char *pixel_format = "";
|
||||||
if (!PyArg_ParseTuple(args, "si|s", &mode, &n, &pixel_format)) {
|
if (!PyArg_ParseTuple(args, "si|s", &mode_name, &n, &pixel_format)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
ModeID actual;
|
||||||
|
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case 1: /* BC1: 565 color, 1-bit alpha */
|
case 1: /* BC1: 565 color, 1-bit alpha */
|
||||||
case 2: /* BC2: 565 color, 4-bit alpha */
|
case 2: /* BC2: 565 color, 4-bit alpha */
|
||||||
case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */
|
case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */
|
||||||
case 7: /* BC7: 4-channel 8-bit via everything */
|
case 7: /* BC7: 4-channel 8-bit via everything */
|
||||||
actual = "RGBA";
|
actual = IMAGING_MODE_RGBA;
|
||||||
break;
|
break;
|
||||||
case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */
|
case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */
|
||||||
actual = "L";
|
actual = IMAGING_MODE_L;
|
||||||
break;
|
break;
|
||||||
case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */
|
case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */
|
||||||
case 6: /* BC6: 3-channel 16-bit float */
|
case 6: /* BC6: 3-channel 16-bit float */
|
||||||
actual = "RGB";
|
actual = IMAGING_MODE_RGB;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
PyErr_SetString(PyExc_ValueError, "block compression type unknown");
|
PyErr_SetString(PyExc_ValueError, "block compression type unknown");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, actual) != 0) {
|
if (mode != actual) {
|
||||||
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -401,15 +408,18 @@ PyObject *
|
||||||
PyImaging_GifDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_GifDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
const char *mode_name;
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
int interlace = 0;
|
int interlace = 0;
|
||||||
int transparency = -1;
|
int transparency = -1;
|
||||||
if (!PyArg_ParseTuple(args, "s|iii", &mode, &bits, &interlace, &transparency)) {
|
if (!PyArg_ParseTuple(
|
||||||
|
args, "s|iii", &mode_name, &bits, &interlace, &transparency
|
||||||
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, "L") != 0 && strcmp(mode, "P") != 0) {
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
if (mode != IMAGING_MODE_L && mode != IMAGING_MODE_P) {
|
||||||
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
PyErr_SetString(PyExc_ValueError, "bad image mode");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -436,12 +446,14 @@ PyObject *
|
||||||
PyImaging_HexDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_HexDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
if (!PyArg_ParseTuple(args, "ss", &mode_name, &rawmode_name)) {
|
||||||
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(0);
|
decoder = PyImaging_DecoderNew(0);
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -469,16 +481,21 @@ PyImaging_HexDecoderNew(PyObject *self, PyObject *args) {
|
||||||
PyObject *
|
PyObject *
|
||||||
PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
char *compname;
|
char *compname;
|
||||||
int fp;
|
int fp;
|
||||||
uint32_t ifdoffset;
|
uint32_t ifdoffset;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) {
|
if (!PyArg_ParseTuple(
|
||||||
|
args, "sssiI", &mode_name, &rawmode_name, &compname, &fp, &ifdoffset
|
||||||
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
TRACE(("new tiff decoder %s\n", compname));
|
TRACE(("new tiff decoder %s\n", compname));
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE));
|
decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE));
|
||||||
|
@ -511,12 +528,15 @@ PyObject *
|
||||||
PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
|
if (!PyArg_ParseTuple(args, "ss", &mode_name, &rawmode_name)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(0);
|
decoder = PyImaging_DecoderNew(0);
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -545,7 +565,7 @@ PyImaging_PcdDecoderNew(PyObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unpack from PhotoYCC to RGB */
|
/* Unpack from PhotoYCC to RGB */
|
||||||
if (get_unpacker(decoder, "RGB", "YCC;P") < 0) {
|
if (get_unpacker(decoder, IMAGING_MODE_RGB, IMAGING_RAWMODE_YCC_P) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,13 +582,15 @@ PyObject *
|
||||||
PyImaging_PcxDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_PcxDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
|
||||||
int stride;
|
int stride;
|
||||||
if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) {
|
if (!PyArg_ParseTuple(args, "ssi", &mode_name, &rawmode_name, &stride)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(0);
|
decoder = PyImaging_DecoderNew(0);
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -593,14 +615,16 @@ PyObject *
|
||||||
PyImaging_RawDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_RawDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
|
||||||
int stride = 0;
|
int stride = 0;
|
||||||
int ystep = 1;
|
int ystep = 1;
|
||||||
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) {
|
if (!PyArg_ParseTuple(args, "ss|ii", &mode_name, &rawmode_name, &stride, &ystep)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(sizeof(RAWSTATE));
|
decoder = PyImaging_DecoderNew(sizeof(RAWSTATE));
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -627,14 +651,16 @@ PyObject *
|
||||||
PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
|
||||||
int ystep = 1;
|
int ystep = 1;
|
||||||
int bpc = 1;
|
int bpc = 1;
|
||||||
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &bpc)) {
|
if (!PyArg_ParseTuple(args, "ss|ii", &mode_name, &rawmode_name, &ystep, &bpc)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(sizeof(SGISTATE));
|
decoder = PyImaging_DecoderNew(sizeof(SGISTATE));
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -661,12 +687,14 @@ PyObject *
|
||||||
PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
if (!PyArg_ParseTuple(args, "ss", &mode_name, &rawmode_name)) {
|
||||||
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(0);
|
decoder = PyImaging_DecoderNew(0);
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -689,14 +717,16 @@ PyObject *
|
||||||
PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
|
||||||
int ystep = 1;
|
int ystep = 1;
|
||||||
int depth = 8;
|
int depth = 8;
|
||||||
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) {
|
if (!PyArg_ParseTuple(args, "ss|ii", &mode_name, &rawmode_name, &ystep, &depth)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(0);
|
decoder = PyImaging_DecoderNew(0);
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -727,7 +757,7 @@ PyImaging_XbmDecoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_unpacker(decoder, "1", "1;R") < 0) {
|
if (get_unpacker(decoder, IMAGING_MODE_1, IMAGING_RAWMODE_1_R) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -748,13 +778,15 @@ PyObject *
|
||||||
PyImaging_ZipDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_ZipDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name, *rawmode_name;
|
||||||
char *rawmode;
|
|
||||||
int interlaced = 0;
|
int interlaced = 0;
|
||||||
if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) {
|
if (!PyArg_ParseTuple(args, "ss|i", &mode_name, &rawmode_name, &interlaced)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE));
|
decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE));
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -798,19 +830,21 @@ PyObject *
|
||||||
PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
|
PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingDecoderObject *decoder;
|
ImagingDecoderObject *decoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode; /* what we want from the decoder */
|
char *rawmode_name; /* what we want from the decoder */
|
||||||
char *jpegmode; /* what's in the file */
|
char *jpegmode_name; /* what's in the file */
|
||||||
int scale = 1;
|
int scale = 1;
|
||||||
int draft = 0;
|
int draft = 0;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, &scale, &draft)) {
|
if (!PyArg_ParseTuple(
|
||||||
|
args, "ssz|ii", &mode_name, &rawmode_name, &jpegmode_name, &scale, &draft
|
||||||
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!jpegmode) {
|
const ModeID mode = findModeID(mode_name);
|
||||||
jpegmode = "";
|
RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
}
|
const RawModeID jpegmode = findRawModeID(jpegmode_name);
|
||||||
|
|
||||||
decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE));
|
decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE));
|
||||||
if (decoder == NULL) {
|
if (decoder == NULL) {
|
||||||
|
@ -820,8 +854,8 @@ PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
|
||||||
// libjpeg-turbo supports different output formats.
|
// libjpeg-turbo supports different output formats.
|
||||||
// We are choosing Pillow's native format (3 color bytes + 1 padding)
|
// We are choosing Pillow's native format (3 color bytes + 1 padding)
|
||||||
// to avoid extra conversion in Unpack.c.
|
// to avoid extra conversion in Unpack.c.
|
||||||
if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) {
|
if (ImagingJpegUseJCSExtensions() && rawmode == IMAGING_RAWMODE_RGB) {
|
||||||
rawmode = "RGBX";
|
rawmode = IMAGING_RAWMODE_RGBX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_unpacker(decoder, mode, rawmode) < 0) {
|
if (get_unpacker(decoder, mode, rawmode) < 0) {
|
||||||
|
@ -831,11 +865,13 @@ PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
|
||||||
decoder->decode = ImagingJpegDecode;
|
decoder->decode = ImagingJpegDecode;
|
||||||
decoder->cleanup = ImagingJpegDecodeCleanup;
|
decoder->cleanup = ImagingJpegDecodeCleanup;
|
||||||
|
|
||||||
strncpy(((JPEGSTATE *)decoder->state.context)->rawmode, rawmode, 8);
|
JPEGSTATE *jpeg_decoder_state_context = (JPEGSTATE *)decoder->state.context;
|
||||||
strncpy(((JPEGSTATE *)decoder->state.context)->jpegmode, jpegmode, 8);
|
|
||||||
|
|
||||||
((JPEGSTATE *)decoder->state.context)->scale = scale;
|
jpeg_decoder_state_context->rawmode = rawmode;
|
||||||
((JPEGSTATE *)decoder->state.context)->draft = draft;
|
jpeg_decoder_state_context->jpegmode = jpegmode;
|
||||||
|
|
||||||
|
jpeg_decoder_state_context->scale = scale;
|
||||||
|
jpeg_decoder_state_context->draft = draft;
|
||||||
|
|
||||||
return (PyObject *)decoder;
|
return (PyObject *)decoder;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ typedef struct {
|
||||||
static PyTypeObject ImagingDisplayType;
|
static PyTypeObject ImagingDisplayType;
|
||||||
|
|
||||||
static ImagingDisplayObject *
|
static ImagingDisplayObject *
|
||||||
_new(const char *mode, int xsize, int ysize) {
|
_new(const ModeID mode, int xsize, int ysize) {
|
||||||
ImagingDisplayObject *display;
|
ImagingDisplayObject *display;
|
||||||
|
|
||||||
if (PyType_Ready(&ImagingDisplayType) < 0) {
|
if (PyType_Ready(&ImagingDisplayType) < 0) {
|
||||||
|
@ -235,7 +235,7 @@ static struct PyMethodDef methods[] = {
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_getattr_mode(ImagingDisplayObject *self, void *closure) {
|
_getattr_mode(ImagingDisplayObject *self, void *closure) {
|
||||||
return Py_BuildValue("s", self->dib->mode);
|
return Py_BuildValue("s", getModeData(self->dib->mode)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -258,13 +258,14 @@ static PyTypeObject ImagingDisplayType = {
|
||||||
PyObject *
|
PyObject *
|
||||||
PyImaging_DisplayWin32(PyObject *self, PyObject *args) {
|
PyImaging_DisplayWin32(PyObject *self, PyObject *args) {
|
||||||
ImagingDisplayObject *display;
|
ImagingDisplayObject *display;
|
||||||
char *mode;
|
char *mode_name;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) {
|
if (!PyArg_ParseTuple(args, "s(ii)", &mode_name, &xsize, &ysize)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
display = _new(mode, xsize, ysize);
|
display = _new(mode, xsize, ysize);
|
||||||
if (display == NULL) {
|
if (display == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -275,12 +276,9 @@ PyImaging_DisplayWin32(PyObject *self, PyObject *args) {
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
PyImaging_DisplayModeWin32(PyObject *self, PyObject *args) {
|
PyImaging_DisplayModeWin32(PyObject *self, PyObject *args) {
|
||||||
char *mode;
|
|
||||||
int size[2];
|
int size[2];
|
||||||
|
const ModeID mode = ImagingGetModeDIB(size);
|
||||||
mode = ImagingGetModeDIB(size);
|
return Py_BuildValue("s(ii)", getModeData(mode)->name, size[0], size[1]);
|
||||||
|
|
||||||
return Py_BuildValue("s(ii)", mode, size[0], size[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
96
src/encode.c
96
src/encode.c
|
@ -334,14 +334,19 @@ static PyTypeObject ImagingEncoderType = {
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
int
|
int
|
||||||
get_packer(ImagingEncoderObject *encoder, const char *mode, const char *rawmode) {
|
get_packer(ImagingEncoderObject *encoder, const ModeID mode, const RawModeID rawmode) {
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler pack;
|
ImagingShuffler pack;
|
||||||
|
|
||||||
pack = ImagingFindPacker(mode, rawmode, &bits);
|
pack = ImagingFindPacker(mode, rawmode, &bits);
|
||||||
if (!pack) {
|
if (!pack) {
|
||||||
Py_DECREF(encoder);
|
Py_DECREF(encoder);
|
||||||
PyErr_Format(PyExc_ValueError, "No packer found from %s to %s", mode, rawmode);
|
PyErr_Format(
|
||||||
|
PyExc_ValueError,
|
||||||
|
"No packer found from %s to %s",
|
||||||
|
getModeData(mode)->name,
|
||||||
|
getRawModeData(rawmode)->name
|
||||||
|
);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,11 +407,13 @@ PyObject *
|
||||||
PyImaging_GifEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_GifEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t bits = 8;
|
Py_ssize_t bits = 8;
|
||||||
Py_ssize_t interlace = 0;
|
Py_ssize_t interlace = 0;
|
||||||
if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &bits, &interlace)) {
|
if (!PyArg_ParseTuple(
|
||||||
|
args, "ss|nn", &mode_name, &rawmode_name, &bits, &interlace
|
||||||
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,6 +422,9 @@ PyImaging_GifEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -435,11 +445,11 @@ PyObject *
|
||||||
PyImaging_PcxEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_PcxEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t bits = 8;
|
Py_ssize_t bits = 8;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &bits)) {
|
if (!PyArg_ParseTuple(args, "ss|n", &mode_name, &rawmode_name, &bits)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,6 +458,9 @@ PyImaging_PcxEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -465,12 +478,12 @@ PyObject *
|
||||||
PyImaging_RawEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_RawEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t stride = 0;
|
Py_ssize_t stride = 0;
|
||||||
Py_ssize_t ystep = 1;
|
Py_ssize_t ystep = 1;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &stride, &ystep)) {
|
if (!PyArg_ParseTuple(args, "ss|nn", &mode_name, &rawmode_name, &stride, &ystep)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,6 +492,9 @@ PyImaging_RawEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -499,11 +515,11 @@ PyObject *
|
||||||
PyImaging_TgaRleEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_TgaRleEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t ystep = 1;
|
Py_ssize_t ystep = 1;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &ystep)) {
|
if (!PyArg_ParseTuple(args, "ss|n", &mode_name, &rawmode_name, &ystep)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -512,6 +528,9 @@ PyImaging_TgaRleEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -536,7 +555,7 @@ PyImaging_XbmEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_packer(encoder, "1", "1;R") < 0) {
|
if (get_packer(encoder, IMAGING_MODE_1, IMAGING_RAWMODE_1_R) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,8 +576,8 @@ PyObject *
|
||||||
PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t optimize = 0;
|
Py_ssize_t optimize = 0;
|
||||||
Py_ssize_t compress_level = -1;
|
Py_ssize_t compress_level = -1;
|
||||||
Py_ssize_t compress_type = -1;
|
Py_ssize_t compress_type = -1;
|
||||||
|
@ -567,8 +586,8 @@ PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"ss|nnny#",
|
"ss|nnny#",
|
||||||
&mode,
|
&mode_name,
|
||||||
&rawmode,
|
&rawmode_name,
|
||||||
&optimize,
|
&optimize,
|
||||||
&compress_level,
|
&compress_level,
|
||||||
&compress_type,
|
&compress_type,
|
||||||
|
@ -597,6 +616,9 @@ PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
free(dictionary);
|
free(dictionary);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -605,7 +627,7 @@ PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
||||||
encoder->encode = ImagingZipEncode;
|
encoder->encode = ImagingZipEncode;
|
||||||
encoder->cleanup = ImagingZipEncodeCleanup;
|
encoder->cleanup = ImagingZipEncodeCleanup;
|
||||||
|
|
||||||
if (rawmode[0] == 'P') {
|
if (rawmode == IMAGING_RAWMODE_P || rawmode == IMAGING_RAWMODE_PA) {
|
||||||
/* disable filtering */
|
/* disable filtering */
|
||||||
((ZIPSTATE *)encoder->state.context)->mode = ZIP_PNG_PALETTE;
|
((ZIPSTATE *)encoder->state.context)->mode = ZIP_PNG_PALETTE;
|
||||||
}
|
}
|
||||||
|
@ -634,8 +656,8 @@ PyObject *
|
||||||
PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
char *compname;
|
char *compname;
|
||||||
char *filename;
|
char *filename;
|
||||||
Py_ssize_t fp;
|
Py_ssize_t fp;
|
||||||
|
@ -655,7 +677,15 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
|
||||||
PyObject *item;
|
PyObject *item;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types
|
args,
|
||||||
|
"sssnsOO",
|
||||||
|
&mode_name,
|
||||||
|
&rawmode_name,
|
||||||
|
&compname,
|
||||||
|
&fp,
|
||||||
|
&filename,
|
||||||
|
&tags,
|
||||||
|
&types
|
||||||
)) {
|
)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -693,6 +723,9 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
const RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1074,8 +1107,8 @@ PyObject *
|
||||||
PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
||||||
ImagingEncoderObject *encoder;
|
ImagingEncoderObject *encoder;
|
||||||
|
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *rawmode;
|
char *rawmode_name;
|
||||||
Py_ssize_t quality = 0;
|
Py_ssize_t quality = 0;
|
||||||
Py_ssize_t progressive = 0;
|
Py_ssize_t progressive = 0;
|
||||||
Py_ssize_t smooth = 0;
|
Py_ssize_t smooth = 0;
|
||||||
|
@ -1099,8 +1132,8 @@ PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"ss|nnnnpn(nn)nnnOz#y#y#",
|
"ss|nnnnpn(nn)nnnOz#y#y#",
|
||||||
&mode,
|
&mode_name,
|
||||||
&rawmode,
|
&rawmode_name,
|
||||||
&quality,
|
&quality,
|
||||||
&progressive,
|
&progressive,
|
||||||
&smooth,
|
&smooth,
|
||||||
|
@ -1128,11 +1161,14 @@ PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
RawModeID rawmode = findRawModeID(rawmode_name);
|
||||||
|
|
||||||
// libjpeg-turbo supports different output formats.
|
// libjpeg-turbo supports different output formats.
|
||||||
// We are choosing Pillow's native format (3 color bytes + 1 padding)
|
// We are choosing Pillow's native format (3 color bytes + 1 padding)
|
||||||
// to avoid extra conversion in Pack.c.
|
// to avoid extra conversion in Pack.c.
|
||||||
if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) {
|
if (ImagingJpegUseJCSExtensions() && rawmode == IMAGING_RAWMODE_RGB) {
|
||||||
rawmode = "RGBX";
|
rawmode = IMAGING_RAWMODE_RGBX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_packer(encoder, mode, rawmode) < 0) {
|
if (get_packer(encoder, mode, rawmode) < 0) {
|
||||||
|
@ -1190,7 +1226,7 @@ PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
||||||
encoder->encode = ImagingJpegEncode;
|
encoder->encode = ImagingJpegEncode;
|
||||||
|
|
||||||
JPEGENCODERSTATE *jpeg_encoder_state = (JPEGENCODERSTATE *)encoder->state.context;
|
JPEGENCODERSTATE *jpeg_encoder_state = (JPEGENCODERSTATE *)encoder->state.context;
|
||||||
strncpy(jpeg_encoder_state->rawmode, rawmode, 8);
|
jpeg_encoder_state->rawmode = rawmode;
|
||||||
jpeg_encoder_state->keep_rgb = keep_rgb;
|
jpeg_encoder_state->keep_rgb = keep_rgb;
|
||||||
jpeg_encoder_state->quality = quality;
|
jpeg_encoder_state->quality = quality;
|
||||||
jpeg_encoder_state->qtables = qarrays;
|
jpeg_encoder_state->qtables = qarrays;
|
||||||
|
|
|
@ -11,39 +11,6 @@
|
||||||
|
|
||||||
#include "Imaging.h"
|
#include "Imaging.h"
|
||||||
|
|
||||||
/* use make_hash.py from the pillow-scripts repository to calculate these values */
|
|
||||||
#define ACCESS_TABLE_SIZE 35
|
|
||||||
#define ACCESS_TABLE_HASH 8940
|
|
||||||
|
|
||||||
static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE];
|
|
||||||
|
|
||||||
static inline UINT32
|
|
||||||
hash(const char *mode) {
|
|
||||||
UINT32 i = ACCESS_TABLE_HASH;
|
|
||||||
while (*mode) {
|
|
||||||
i = ((i << 5) + i) ^ (UINT8)*mode++;
|
|
||||||
}
|
|
||||||
return i % ACCESS_TABLE_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ImagingAccess
|
|
||||||
add_item(const char *mode) {
|
|
||||||
UINT32 i = hash(mode);
|
|
||||||
/* printf("hash %s => %d\n", mode, i); */
|
|
||||||
if (access_table[i].mode && strcmp(access_table[i].mode, mode) != 0) {
|
|
||||||
fprintf(
|
|
||||||
stderr,
|
|
||||||
"AccessInit: hash collision: %d for both %s and %s\n",
|
|
||||||
i,
|
|
||||||
mode,
|
|
||||||
access_table[i].mode
|
|
||||||
);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
access_table[i].mode = mode;
|
|
||||||
return &access_table[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fetch individual pixel */
|
/* fetch individual pixel */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -184,54 +151,46 @@ put_pixel_32(Imaging im, int x, int y, const void *color) {
|
||||||
memcpy(&im->image32[y][x], color, sizeof(INT32));
|
memcpy(&im->image32[y][x], color, sizeof(INT32));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static struct ImagingAccessInstance accessors[] = {
|
||||||
ImagingAccessInit(void) {
|
{IMAGING_MODE_1, get_pixel_8, put_pixel_8},
|
||||||
#define ADD(mode_, get_pixel_, put_pixel_) \
|
{IMAGING_MODE_L, get_pixel_8, put_pixel_8},
|
||||||
{ \
|
{IMAGING_MODE_LA, get_pixel_32_2bands, put_pixel_32},
|
||||||
ImagingAccess access = add_item(mode_); \
|
{IMAGING_MODE_La, get_pixel_32_2bands, put_pixel_32},
|
||||||
access->get_pixel = get_pixel_; \
|
{IMAGING_MODE_I, get_pixel_32, put_pixel_32},
|
||||||
access->put_pixel = put_pixel_; \
|
{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},
|
||||||
/* populate access table */
|
|
||||||
ADD("1", get_pixel_8, put_pixel_8);
|
|
||||||
ADD("L", get_pixel_8, put_pixel_8);
|
|
||||||
ADD("LA", get_pixel_32_2bands, put_pixel_32);
|
|
||||||
ADD("La", get_pixel_32_2bands, put_pixel_32);
|
|
||||||
ADD("I", get_pixel_32, put_pixel_32);
|
|
||||||
ADD("I;16", get_pixel_16L, put_pixel_16L);
|
|
||||||
ADD("I;16L", get_pixel_16L, put_pixel_16L);
|
|
||||||
ADD("I;16B", get_pixel_16B, put_pixel_16B);
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
ADD("I;16N", get_pixel_16B, put_pixel_16B);
|
{IMAGING_MODE_I_16N, get_pixel_16B, put_pixel_16B},
|
||||||
#else
|
#else
|
||||||
ADD("I;16N", get_pixel_16L, put_pixel_16L);
|
{IMAGING_MODE_I_16N, get_pixel_16L, put_pixel_16L},
|
||||||
#endif
|
#endif
|
||||||
ADD("I;32L", get_pixel_32L, put_pixel_32L);
|
{IMAGING_MODE_I_32L, get_pixel_32L, put_pixel_32L},
|
||||||
ADD("I;32B", get_pixel_32B, put_pixel_32B);
|
{IMAGING_MODE_I_32B, get_pixel_32B, put_pixel_32B},
|
||||||
ADD("F", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_F, get_pixel_32, put_pixel_32},
|
||||||
ADD("P", get_pixel_8, put_pixel_8);
|
{IMAGING_MODE_P, get_pixel_8, put_pixel_8},
|
||||||
ADD("PA", get_pixel_32_2bands, put_pixel_32);
|
{IMAGING_MODE_PA, get_pixel_32_2bands, put_pixel_32},
|
||||||
ADD("BGR;15", get_pixel_BGR15, put_pixel_BGR1516);
|
{IMAGING_MODE_BGR_15, get_pixel_BGR15, put_pixel_BGR1516},
|
||||||
ADD("BGR;16", get_pixel_BGR16, put_pixel_BGR1516);
|
{IMAGING_MODE_BGR_16, get_pixel_BGR16, put_pixel_BGR1516},
|
||||||
ADD("BGR;24", get_pixel_BGR24, put_pixel_BGR24);
|
{IMAGING_MODE_BGR_24, get_pixel_BGR24, put_pixel_BGR24},
|
||||||
ADD("RGB", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_RGB, get_pixel_32, put_pixel_32},
|
||||||
ADD("RGBA", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_RGBA, get_pixel_32, put_pixel_32},
|
||||||
ADD("RGBa", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_RGBa, get_pixel_32, put_pixel_32},
|
||||||
ADD("RGBX", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_RGBX, get_pixel_32, put_pixel_32},
|
||||||
ADD("CMYK", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_CMYK, get_pixel_32, put_pixel_32},
|
||||||
ADD("YCbCr", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_YCbCr, get_pixel_32, put_pixel_32},
|
||||||
ADD("LAB", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_LAB, get_pixel_32, put_pixel_32},
|
||||||
ADD("HSV", get_pixel_32, put_pixel_32);
|
{IMAGING_MODE_HSV, get_pixel_32, put_pixel_32}
|
||||||
}
|
};
|
||||||
|
|
||||||
ImagingAccess
|
ImagingAccess
|
||||||
ImagingAccessNew(Imaging im) {
|
ImagingAccessNew(const Imaging im) {
|
||||||
ImagingAccess access = &access_table[hash(im->mode)];
|
for (size_t i = 0; i < sizeof(accessors) / sizeof(*accessors); i++) {
|
||||||
if (im->mode[0] != access->mode[0] || strcmp(im->mode, access->mode) != 0) {
|
if (im->mode == accessors[i].mode) {
|
||||||
return NULL;
|
return &accessors[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return access;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -25,12 +25,12 @@ ImagingAlphaComposite(Imaging imDst, Imaging imSrc) {
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
/* Check arguments */
|
/* Check arguments */
|
||||||
if (!imDst || !imSrc || strcmp(imDst->mode, "RGBA") ||
|
if (!imDst || !imSrc || imDst->mode != IMAGING_MODE_RGBA ||
|
||||||
imDst->type != IMAGING_TYPE_UINT8 || imDst->bands != 4) {
|
imDst->type != IMAGING_TYPE_UINT8 || imDst->bands != 4) {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(imDst->mode, imSrc->mode) || imDst->type != imSrc->type ||
|
if (imDst->mode != imSrc->mode || imDst->type != imSrc->type ||
|
||||||
imDst->bands != imSrc->bands || imDst->xsize != imSrc->xsize ||
|
imDst->bands != imSrc->bands || imDst->xsize != imSrc->xsize ||
|
||||||
imDst->ysize != imSrc->ysize) {
|
imDst->ysize != imSrc->ysize) {
|
||||||
return ImagingError_Mismatch();
|
return ImagingError_Mismatch();
|
||||||
|
|
|
@ -41,7 +41,7 @@ ImagingGetBand(Imaging imIn, int band) {
|
||||||
band = 3;
|
band = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
imOut = ImagingNewDirty("L", imIn->xsize, imIn->ysize);
|
imOut = ImagingNewDirty(IMAGING_MODE_L, imIn->xsize, imIn->ysize);
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < imIn->bands; i++) {
|
for (i = 0; i < imIn->bands; i++) {
|
||||||
bands[i] = ImagingNewDirty("L", imIn->xsize, imIn->ysize);
|
bands[i] = ImagingNewDirty(IMAGING_MODE_L, imIn->xsize, imIn->ysize);
|
||||||
if (!bands[i]) {
|
if (!bands[i]) {
|
||||||
for (j = 0; j < i; ++j) {
|
for (j = 0; j < i; ++j) {
|
||||||
ImagingDelete(bands[j]);
|
ImagingDelete(bands[j]);
|
||||||
|
@ -240,7 +240,7 @@ ImagingFillBand(Imaging imOut, int band, int color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingMerge(const char *mode, Imaging bands[4]) {
|
ImagingMerge(const ModeID mode, Imaging bands[4]) {
|
||||||
int i, x, y;
|
int i, x, y;
|
||||||
int bandsCount = 0;
|
int bandsCount = 0;
|
||||||
Imaging imOut;
|
Imaging imOut;
|
||||||
|
|
|
@ -24,8 +24,8 @@ ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) {
|
||||||
|
|
||||||
/* Check arguments */
|
/* Check arguments */
|
||||||
if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 || imIn1->palette ||
|
if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 || imIn1->palette ||
|
||||||
strcmp(imIn1->mode, "1") == 0 || imIn2->palette ||
|
imIn1->mode == IMAGING_MODE_1 || imIn2->palette ||
|
||||||
strcmp(imIn2->mode, "1") == 0) {
|
imIn2->mode == IMAGING_MODE_1) {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -248,7 +248,7 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float xradius, float yradius, int n)
|
||||||
return ImagingError_ValueError("radius must be >= 0");
|
return ImagingError_ValueError("radius must be >= 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(imIn->mode, imOut->mode) || imIn->type != imOut->type ||
|
if (imIn->mode != imOut->mode || imIn->type != imOut->type ||
|
||||||
imIn->bands != imOut->bands || imIn->xsize != imOut->xsize ||
|
imIn->bands != imOut->bands || imIn->xsize != imOut->xsize ||
|
||||||
imIn->ysize != imOut->ysize) {
|
imIn->ysize != imOut->ysize) {
|
||||||
return ImagingError_Mismatch();
|
return ImagingError_Mismatch();
|
||||||
|
@ -258,10 +258,10 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float xradius, float yradius, int n)
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(strcmp(imIn->mode, "RGB") == 0 || strcmp(imIn->mode, "RGBA") == 0 ||
|
if (imIn->mode != IMAGING_MODE_RGB && imIn->mode != IMAGING_MODE_RGBA &&
|
||||||
strcmp(imIn->mode, "RGBa") == 0 || strcmp(imIn->mode, "RGBX") == 0 ||
|
imIn->mode != IMAGING_MODE_RGBa && imIn->mode != IMAGING_MODE_RGBX &&
|
||||||
strcmp(imIn->mode, "CMYK") == 0 || strcmp(imIn->mode, "L") == 0 ||
|
imIn->mode != IMAGING_MODE_CMYK && imIn->mode != IMAGING_MODE_L &&
|
||||||
strcmp(imIn->mode, "LA") == 0 || strcmp(imIn->mode, "La") == 0)) {
|
imIn->mode != IMAGING_MODE_LA && imIn->mode != IMAGING_MODE_La) {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,28 +18,28 @@
|
||||||
|
|
||||||
#include "Imaging.h"
|
#include "Imaging.h"
|
||||||
|
|
||||||
#define CHOP(operation) \
|
#define CHOP(operation) \
|
||||||
int x, y; \
|
int x, y; \
|
||||||
Imaging imOut; \
|
Imaging imOut; \
|
||||||
imOut = create(imIn1, imIn2, NULL); \
|
imOut = create(imIn1, imIn2, IMAGING_MODE_UNKNOWN); \
|
||||||
if (!imOut) { \
|
if (!imOut) { \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
} \
|
} \
|
||||||
for (y = 0; y < imOut->ysize; y++) { \
|
for (y = 0; y < imOut->ysize; y++) { \
|
||||||
UINT8 *out = (UINT8 *)imOut->image[y]; \
|
UINT8 *out = (UINT8 *)imOut->image[y]; \
|
||||||
UINT8 *in1 = (UINT8 *)imIn1->image[y]; \
|
UINT8 *in1 = (UINT8 *)imIn1->image[y]; \
|
||||||
UINT8 *in2 = (UINT8 *)imIn2->image[y]; \
|
UINT8 *in2 = (UINT8 *)imIn2->image[y]; \
|
||||||
for (x = 0; x < imOut->linesize; x++) { \
|
for (x = 0; x < imOut->linesize; x++) { \
|
||||||
int temp = operation; \
|
int temp = operation; \
|
||||||
if (temp <= 0) { \
|
if (temp <= 0) { \
|
||||||
out[x] = 0; \
|
out[x] = 0; \
|
||||||
} else if (temp >= 255) { \
|
} else if (temp >= 255) { \
|
||||||
out[x] = 255; \
|
out[x] = 255; \
|
||||||
} else { \
|
} else { \
|
||||||
out[x] = temp; \
|
out[x] = temp; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
return imOut;
|
return imOut;
|
||||||
|
|
||||||
#define CHOP2(operation, mode) \
|
#define CHOP2(operation, mode) \
|
||||||
|
@ -60,11 +60,11 @@
|
||||||
return imOut;
|
return imOut;
|
||||||
|
|
||||||
static Imaging
|
static Imaging
|
||||||
create(Imaging im1, Imaging im2, char *mode) {
|
create(Imaging im1, Imaging im2, const ModeID mode) {
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
|
|
||||||
if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 ||
|
if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 ||
|
||||||
(mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1")))) {
|
(mode != IMAGING_MODE_UNKNOWN && (im1->mode != mode || im2->mode != mode))) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (im1->type != im2->type || im1->bands != im2->bands) {
|
if (im1->type != im2->type || im1->bands != im2->bands) {
|
||||||
|
@ -114,27 +114,27 @@ ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) {
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingChopAnd(Imaging imIn1, Imaging imIn2) {
|
ImagingChopAnd(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2((in1[x] && in2[x]) ? 255 : 0, "1");
|
CHOP2((in1[x] && in2[x]) ? 255 : 0, IMAGING_MODE_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingChopOr(Imaging imIn1, Imaging imIn2) {
|
ImagingChopOr(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2((in1[x] || in2[x]) ? 255 : 0, "1");
|
CHOP2((in1[x] || in2[x]) ? 255 : 0, IMAGING_MODE_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingChopXor(Imaging imIn1, Imaging imIn2) {
|
ImagingChopXor(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1");
|
CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, IMAGING_MODE_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) {
|
ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(in1[x] + in2[x], NULL);
|
CHOP2(in1[x] + in2[x], IMAGING_MODE_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) {
|
ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(in1[x] - in2[x], NULL);
|
CHOP2(in1[x] - in2[x], IMAGING_MODE_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
|
@ -142,7 +142,7 @@ ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(
|
CHOP2(
|
||||||
(((255 - in1[x]) * (in1[x] * in2[x])) / 65536) +
|
(((255 - in1[x]) * (in1[x] * in2[x])) / 65536) +
|
||||||
(in1[x] * (255 - ((255 - in1[x]) * (255 - in2[x]) / 255))) / 255,
|
(in1[x] * (255 - ((255 - in1[x]) * (255 - in2[x]) / 255))) / 255,
|
||||||
NULL
|
IMAGING_MODE_UNKNOWN
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ ImagingChopHardLight(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(
|
CHOP2(
|
||||||
(in2[x] < 128) ? ((in1[x] * in2[x]) / 127)
|
(in2[x] < 128) ? ((in1[x] * in2[x]) / 127)
|
||||||
: 255 - (((255 - in2[x]) * (255 - in1[x])) / 127),
|
: 255 - (((255 - in2[x]) * (255 - in1[x])) / 127),
|
||||||
NULL
|
IMAGING_MODE_UNKNOWN
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,6 +160,6 @@ ImagingOverlay(Imaging imIn1, Imaging imIn2) {
|
||||||
CHOP2(
|
CHOP2(
|
||||||
(in1[x] < 128) ? ((in1[x] * in2[x]) / 127)
|
(in1[x] < 128) ? ((in1[x] * in2[x]) / 127)
|
||||||
: 255 - (((255 - in1[x]) * (255 - in2[x])) / 127),
|
: 255 - (((255 - in1[x]) * (255 - in2[x])) / 127),
|
||||||
NULL
|
IMAGING_MODE_UNKNOWN
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -909,150 +909,12 @@ I16_RGB(UINT8 *out, const UINT8 *in, int xsize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct {
|
|
||||||
const char *from;
|
|
||||||
const char *to;
|
|
||||||
ImagingShuffler convert;
|
|
||||||
} converters[] = {
|
|
||||||
|
|
||||||
{"1", "L", bit2l},
|
|
||||||
{"1", "I", bit2i},
|
|
||||||
{"1", "F", bit2f},
|
|
||||||
{"1", "RGB", bit2rgb},
|
|
||||||
{"1", "RGBA", bit2rgb},
|
|
||||||
{"1", "RGBX", bit2rgb},
|
|
||||||
{"1", "CMYK", bit2cmyk},
|
|
||||||
{"1", "YCbCr", bit2ycbcr},
|
|
||||||
{"1", "HSV", bit2hsv},
|
|
||||||
|
|
||||||
{"L", "1", l2bit},
|
|
||||||
{"L", "LA", l2la},
|
|
||||||
{"L", "I", l2i},
|
|
||||||
{"L", "F", l2f},
|
|
||||||
{"L", "RGB", l2rgb},
|
|
||||||
{"L", "RGBA", l2rgb},
|
|
||||||
{"L", "RGBX", l2rgb},
|
|
||||||
{"L", "CMYK", l2cmyk},
|
|
||||||
{"L", "YCbCr", l2ycbcr},
|
|
||||||
{"L", "HSV", l2hsv},
|
|
||||||
|
|
||||||
{"LA", "L", la2l},
|
|
||||||
{"LA", "La", lA2la},
|
|
||||||
{"LA", "RGB", la2rgb},
|
|
||||||
{"LA", "RGBA", la2rgb},
|
|
||||||
{"LA", "RGBX", la2rgb},
|
|
||||||
{"LA", "CMYK", la2cmyk},
|
|
||||||
{"LA", "YCbCr", la2ycbcr},
|
|
||||||
{"LA", "HSV", la2hsv},
|
|
||||||
|
|
||||||
{"La", "LA", la2lA},
|
|
||||||
|
|
||||||
{"I", "L", i2l},
|
|
||||||
{"I", "F", i2f},
|
|
||||||
{"I", "RGB", i2rgb},
|
|
||||||
{"I", "RGBA", i2rgb},
|
|
||||||
{"I", "RGBX", i2rgb},
|
|
||||||
{"I", "HSV", i2hsv},
|
|
||||||
|
|
||||||
{"F", "L", f2l},
|
|
||||||
{"F", "I", f2i},
|
|
||||||
|
|
||||||
{"RGB", "1", rgb2bit},
|
|
||||||
{"RGB", "L", rgb2l},
|
|
||||||
{"RGB", "LA", rgb2la},
|
|
||||||
{"RGB", "La", rgb2la},
|
|
||||||
{"RGB", "I", rgb2i},
|
|
||||||
{"RGB", "I;16", rgb2i16l},
|
|
||||||
{"RGB", "I;16L", rgb2i16l},
|
|
||||||
{"RGB", "I;16B", rgb2i16b},
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
{"RGB", "I;16N", rgb2i16b},
|
|
||||||
#else
|
|
||||||
{"RGB", "I;16N", rgb2i16l},
|
|
||||||
#endif
|
|
||||||
{"RGB", "F", rgb2f},
|
|
||||||
{"RGB", "BGR;15", rgb2bgr15},
|
|
||||||
{"RGB", "BGR;16", rgb2bgr16},
|
|
||||||
{"RGB", "BGR;24", rgb2bgr24},
|
|
||||||
{"RGB", "RGBA", rgb2rgba},
|
|
||||||
{"RGB", "RGBa", rgb2rgba},
|
|
||||||
{"RGB", "RGBX", rgb2rgba},
|
|
||||||
{"RGB", "CMYK", rgb2cmyk},
|
|
||||||
{"RGB", "YCbCr", ImagingConvertRGB2YCbCr},
|
|
||||||
{"RGB", "HSV", rgb2hsv},
|
|
||||||
|
|
||||||
{"RGBA", "1", rgb2bit},
|
|
||||||
{"RGBA", "L", rgb2l},
|
|
||||||
{"RGBA", "LA", rgba2la},
|
|
||||||
{"RGBA", "I", rgb2i},
|
|
||||||
{"RGBA", "F", rgb2f},
|
|
||||||
{"RGBA", "RGB", rgba2rgb},
|
|
||||||
{"RGBA", "RGBa", rgbA2rgba},
|
|
||||||
{"RGBA", "RGBX", rgb2rgba},
|
|
||||||
{"RGBA", "CMYK", rgb2cmyk},
|
|
||||||
{"RGBA", "YCbCr", ImagingConvertRGB2YCbCr},
|
|
||||||
{"RGBA", "HSV", rgb2hsv},
|
|
||||||
|
|
||||||
{"RGBa", "RGBA", rgba2rgbA},
|
|
||||||
{"RGBa", "RGB", rgba2rgb_},
|
|
||||||
|
|
||||||
{"RGBX", "1", rgb2bit},
|
|
||||||
{"RGBX", "L", rgb2l},
|
|
||||||
{"RGBX", "LA", rgb2la},
|
|
||||||
{"RGBX", "I", rgb2i},
|
|
||||||
{"RGBX", "F", rgb2f},
|
|
||||||
{"RGBX", "RGB", rgba2rgb},
|
|
||||||
{"RGBX", "CMYK", rgb2cmyk},
|
|
||||||
{"RGBX", "YCbCr", ImagingConvertRGB2YCbCr},
|
|
||||||
{"RGBX", "HSV", rgb2hsv},
|
|
||||||
|
|
||||||
{"CMYK", "RGB", cmyk2rgb},
|
|
||||||
{"CMYK", "RGBA", cmyk2rgb},
|
|
||||||
{"CMYK", "RGBX", cmyk2rgb},
|
|
||||||
{"CMYK", "HSV", cmyk2hsv},
|
|
||||||
|
|
||||||
{"YCbCr", "L", ycbcr2l},
|
|
||||||
{"YCbCr", "LA", ycbcr2la},
|
|
||||||
{"YCbCr", "RGB", ImagingConvertYCbCr2RGB},
|
|
||||||
|
|
||||||
{"HSV", "RGB", hsv2rgb},
|
|
||||||
|
|
||||||
{"I", "I;16", I_I16L},
|
|
||||||
{"I;16", "I", I16L_I},
|
|
||||||
{"I;16", "RGB", I16_RGB},
|
|
||||||
{"L", "I;16", L_I16L},
|
|
||||||
{"I;16", "L", I16L_L},
|
|
||||||
|
|
||||||
{"I", "I;16L", I_I16L},
|
|
||||||
{"I;16L", "I", I16L_I},
|
|
||||||
{"I", "I;16B", I_I16B},
|
|
||||||
{"I;16B", "I", I16B_I},
|
|
||||||
|
|
||||||
{"L", "I;16L", L_I16L},
|
|
||||||
{"I;16L", "L", I16L_L},
|
|
||||||
{"L", "I;16B", L_I16B},
|
|
||||||
{"I;16B", "L", I16B_L},
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
{"L", "I;16N", L_I16B},
|
|
||||||
{"I;16N", "L", I16B_L},
|
|
||||||
#else
|
|
||||||
{"L", "I;16N", L_I16L},
|
|
||||||
{"I;16N", "L", I16L_L},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{"I;16", "F", I16L_F},
|
|
||||||
{"I;16L", "F", I16L_F},
|
|
||||||
{"I;16B", "F", I16B_F},
|
|
||||||
|
|
||||||
{NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* FIXME: translate indexed versions to pointer versions below this line */
|
|
||||||
|
|
||||||
/* ------------------- */
|
/* ------------------- */
|
||||||
/* Palette conversions */
|
/* Palette conversions */
|
||||||
/* ------------------- */
|
/* ------------------- */
|
||||||
|
|
||||||
|
/* FIXME: translate indexed versions to pointer versions below this line */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
p2bit(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
p2bit(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
||||||
int x;
|
int x;
|
||||||
|
@ -1100,13 +962,13 @@ pa2p(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
||||||
static void
|
static void
|
||||||
p2pa(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
p2pa(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
||||||
int x;
|
int x;
|
||||||
int rgb = strcmp(palette->mode, "RGB");
|
const int rgb = palette->mode == IMAGING_MODE_RGB;
|
||||||
for (x = 0; x < xsize; x++, in++) {
|
for (x = 0; x < xsize; x++, in++) {
|
||||||
const UINT8 *rgba = &palette->palette[in[0] * 4];
|
const UINT8 *rgba = &palette->palette[in[0] * 4];
|
||||||
*out++ = in[0];
|
*out++ = in[0];
|
||||||
*out++ = in[0];
|
*out++ = in[0];
|
||||||
*out++ = in[0];
|
*out++ = in[0];
|
||||||
*out++ = rgb == 0 ? 255 : rgba[3];
|
*out++ = rgb ? 255 : rgba[3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1260,7 +1122,7 @@ pa2ycbcr(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static Imaging
|
static Imaging
|
||||||
frompalette(Imaging imOut, Imaging imIn, const char *mode) {
|
frompalette(Imaging imOut, Imaging imIn, const ModeID mode) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int alpha;
|
int alpha;
|
||||||
int y;
|
int y;
|
||||||
|
@ -1272,31 +1134,31 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) {
|
||||||
return (Imaging)ImagingError_ValueError("no palette");
|
return (Imaging)ImagingError_ValueError("no palette");
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha = !strcmp(imIn->mode, "PA");
|
alpha = imIn->mode == IMAGING_MODE_PA;
|
||||||
|
|
||||||
if (strcmp(mode, "1") == 0) {
|
if (mode == IMAGING_MODE_1) {
|
||||||
convert = alpha ? pa2bit : p2bit;
|
convert = alpha ? pa2bit : p2bit;
|
||||||
} else if (strcmp(mode, "L") == 0) {
|
} else if (mode == IMAGING_MODE_L) {
|
||||||
convert = alpha ? pa2l : p2l;
|
convert = alpha ? pa2l : p2l;
|
||||||
} else if (strcmp(mode, "LA") == 0) {
|
} else if (mode == IMAGING_MODE_LA) {
|
||||||
convert = alpha ? pa2la : p2la;
|
convert = alpha ? pa2la : p2la;
|
||||||
} else if (strcmp(mode, "P") == 0) {
|
} else if (mode == IMAGING_MODE_P) {
|
||||||
convert = pa2p;
|
convert = pa2p;
|
||||||
} else if (strcmp(mode, "PA") == 0) {
|
} else if (mode == IMAGING_MODE_PA) {
|
||||||
convert = p2pa;
|
convert = p2pa;
|
||||||
} else if (strcmp(mode, "I") == 0) {
|
} else if (mode == IMAGING_MODE_I) {
|
||||||
convert = alpha ? pa2i : p2i;
|
convert = alpha ? pa2i : p2i;
|
||||||
} else if (strcmp(mode, "F") == 0) {
|
} else if (mode == IMAGING_MODE_F) {
|
||||||
convert = alpha ? pa2f : p2f;
|
convert = alpha ? pa2f : p2f;
|
||||||
} else if (strcmp(mode, "RGB") == 0) {
|
} else if (mode == IMAGING_MODE_RGB) {
|
||||||
convert = alpha ? pa2rgb : p2rgb;
|
convert = alpha ? pa2rgb : p2rgb;
|
||||||
} else if (strcmp(mode, "RGBA") == 0 || strcmp(mode, "RGBX") == 0) {
|
} else if (mode == IMAGING_MODE_RGBA || mode == IMAGING_MODE_RGBX) {
|
||||||
convert = alpha ? pa2rgba : p2rgba;
|
convert = alpha ? pa2rgba : p2rgba;
|
||||||
} else if (strcmp(mode, "CMYK") == 0) {
|
} else if (mode == IMAGING_MODE_CMYK) {
|
||||||
convert = alpha ? pa2cmyk : p2cmyk;
|
convert = alpha ? pa2cmyk : p2cmyk;
|
||||||
} else if (strcmp(mode, "YCbCr") == 0) {
|
} else if (mode == IMAGING_MODE_YCbCr) {
|
||||||
convert = alpha ? pa2ycbcr : p2ycbcr;
|
convert = alpha ? pa2ycbcr : p2ycbcr;
|
||||||
} else if (strcmp(mode, "HSV") == 0) {
|
} else if (mode == IMAGING_MODE_HSV) {
|
||||||
convert = alpha ? pa2hsv : p2hsv;
|
convert = alpha ? pa2hsv : p2hsv;
|
||||||
} else {
|
} else {
|
||||||
return (Imaging)ImagingError_ValueError("conversion not supported");
|
return (Imaging)ImagingError_ValueError("conversion not supported");
|
||||||
|
@ -1306,7 +1168,7 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) {
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (strcmp(mode, "P") == 0 || strcmp(mode, "PA") == 0) {
|
if (mode == IMAGING_MODE_P || mode == IMAGING_MODE_PA) {
|
||||||
ImagingPaletteDelete(imOut->palette);
|
ImagingPaletteDelete(imOut->palette);
|
||||||
imOut->palette = ImagingPaletteDuplicate(imIn->palette);
|
imOut->palette = ImagingPaletteDuplicate(imIn->palette);
|
||||||
}
|
}
|
||||||
|
@ -1330,24 +1192,26 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) {
|
||||||
#endif
|
#endif
|
||||||
static Imaging
|
static Imaging
|
||||||
topalette(
|
topalette(
|
||||||
Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalette, int dither
|
Imaging imOut, Imaging imIn, const ModeID mode, ImagingPalette inpalette, int dither
|
||||||
) {
|
) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int alpha;
|
int alpha;
|
||||||
int x, y;
|
int x, y;
|
||||||
ImagingPalette palette = inpalette;
|
ImagingPalette palette = inpalette;
|
||||||
|
|
||||||
/* Map L or RGB/RGBX/RGBA to palette image */
|
/* Map L or RGB/RGBX/RGBA/RGBa to palette image */
|
||||||
if (strcmp(imIn->mode, "L") != 0 && strncmp(imIn->mode, "RGB", 3) != 0) {
|
if (imIn->mode != IMAGING_MODE_L && imIn->mode != IMAGING_MODE_RGB &&
|
||||||
|
imIn->mode != IMAGING_MODE_RGBX && imIn->mode != IMAGING_MODE_RGBA &&
|
||||||
|
imIn->mode != IMAGING_MODE_RGBa) {
|
||||||
return (Imaging)ImagingError_ValueError("conversion not supported");
|
return (Imaging)ImagingError_ValueError("conversion not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha = !strcmp(mode, "PA");
|
alpha = mode == IMAGING_MODE_PA;
|
||||||
|
|
||||||
if (palette == NULL) {
|
if (palette == NULL) {
|
||||||
/* FIXME: make user configurable */
|
/* FIXME: make user configurable */
|
||||||
if (imIn->bands == 1) {
|
if (imIn->bands == 1) {
|
||||||
palette = ImagingPaletteNew("RGB");
|
palette = ImagingPaletteNew(IMAGING_MODE_RGB);
|
||||||
|
|
||||||
palette->size = 256;
|
palette->size = 256;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1534,11 +1398,11 @@ tobilevel(Imaging imOut, Imaging imIn) {
|
||||||
int *errors;
|
int *errors;
|
||||||
|
|
||||||
/* Map L or RGB to dithered 1 image */
|
/* Map L or RGB to dithered 1 image */
|
||||||
if (strcmp(imIn->mode, "L") != 0 && strcmp(imIn->mode, "RGB") != 0) {
|
if (imIn->mode != IMAGING_MODE_L && imIn->mode != IMAGING_MODE_RGB) {
|
||||||
return (Imaging)ImagingError_ValueError("conversion not supported");
|
return (Imaging)ImagingError_ValueError("conversion not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
imOut = ImagingNew2Dirty("1", imOut, imIn);
|
imOut = ImagingNew2Dirty(IMAGING_MODE_1, imOut, imIn);
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1620,19 +1484,155 @@ tobilevel(Imaging imOut, Imaging imIn) {
|
||||||
#pragma optimize("", on)
|
#pragma optimize("", on)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* ------------------- */
|
||||||
|
/* Conversion handlers */
|
||||||
|
/* ------------------- */
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const ModeID from;
|
||||||
|
const ModeID to;
|
||||||
|
ImagingShuffler convert;
|
||||||
|
} converters[] = {
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_L, bit2l},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_I, bit2i},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_F, bit2f},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_RGB, bit2rgb},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_RGBA, bit2rgb},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_RGBX, bit2rgb},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_CMYK, bit2cmyk},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_YCbCr, bit2ycbcr},
|
||||||
|
{IMAGING_MODE_1, IMAGING_MODE_HSV, bit2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_1, l2bit},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_LA, l2la},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I, l2i},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_F, l2f},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_RGB, l2rgb},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_RGBA, l2rgb},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_RGBX, l2rgb},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_CMYK, l2cmyk},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_YCbCr, l2ycbcr},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_HSV, l2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_L, la2l},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_La, lA2la},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_RGB, la2rgb},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_RGBA, la2rgb},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_RGBX, la2rgb},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_CMYK, la2cmyk},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_YCbCr, la2ycbcr},
|
||||||
|
{IMAGING_MODE_LA, IMAGING_MODE_HSV, la2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_La, IMAGING_MODE_LA, la2lA},
|
||||||
|
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_L, i2l},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_F, i2f},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_RGB, i2rgb},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_RGBA, i2rgb},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_RGBX, i2rgb},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_HSV, i2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_F, IMAGING_MODE_L, f2l},
|
||||||
|
{IMAGING_MODE_F, IMAGING_MODE_I, f2i},
|
||||||
|
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_1, rgb2bit},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_L, rgb2l},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_LA, rgb2la},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_La, rgb2la},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I, rgb2i},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I_16, rgb2i16l},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I_16L, rgb2i16l},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I_16B, rgb2i16b},
|
||||||
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I_16N, rgb2i16b},
|
||||||
|
#else
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_I_16N, rgb2i16l},
|
||||||
|
#endif
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_F, rgb2f},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_BGR_15, rgb2bgr15},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_BGR_16, rgb2bgr16},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_BGR_24, rgb2bgr24},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_RGBA, rgb2rgba},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_RGBa, rgb2rgba},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_RGBX, rgb2rgba},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_CMYK, rgb2cmyk},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_YCbCr, ImagingConvertRGB2YCbCr},
|
||||||
|
{IMAGING_MODE_RGB, IMAGING_MODE_HSV, rgb2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_1, rgb2bit},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_L, rgb2l},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_LA, rgba2la},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_I, rgb2i},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_F, rgb2f},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_RGB, rgba2rgb},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_RGBa, rgbA2rgba},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_RGBX, rgb2rgba},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_CMYK, rgb2cmyk},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_YCbCr, ImagingConvertRGB2YCbCr},
|
||||||
|
{IMAGING_MODE_RGBA, IMAGING_MODE_HSV, rgb2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_RGBa, IMAGING_MODE_RGBA, rgba2rgbA},
|
||||||
|
{IMAGING_MODE_RGBa, IMAGING_MODE_RGB, rgba2rgb_},
|
||||||
|
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_1, rgb2bit},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_L, rgb2l},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_LA, rgb2la},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_I, rgb2i},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_F, rgb2f},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_RGB, rgba2rgb},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_CMYK, rgb2cmyk},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_YCbCr, ImagingConvertRGB2YCbCr},
|
||||||
|
{IMAGING_MODE_RGBX, IMAGING_MODE_HSV, rgb2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_CMYK, IMAGING_MODE_RGB, cmyk2rgb},
|
||||||
|
{IMAGING_MODE_CMYK, IMAGING_MODE_RGBA, cmyk2rgb},
|
||||||
|
{IMAGING_MODE_CMYK, IMAGING_MODE_RGBX, cmyk2rgb},
|
||||||
|
{IMAGING_MODE_CMYK, IMAGING_MODE_HSV, cmyk2hsv},
|
||||||
|
|
||||||
|
{IMAGING_MODE_YCbCr, IMAGING_MODE_L, ycbcr2l},
|
||||||
|
{IMAGING_MODE_YCbCr, IMAGING_MODE_LA, ycbcr2la},
|
||||||
|
{IMAGING_MODE_YCbCr, IMAGING_MODE_RGB, ImagingConvertYCbCr2RGB},
|
||||||
|
|
||||||
|
{IMAGING_MODE_HSV, IMAGING_MODE_RGB, hsv2rgb},
|
||||||
|
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_I_16, I_I16L},
|
||||||
|
{IMAGING_MODE_I_16, IMAGING_MODE_I, I16L_I},
|
||||||
|
{IMAGING_MODE_I_16, IMAGING_MODE_RGB, I16_RGB},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I_16, L_I16L},
|
||||||
|
{IMAGING_MODE_I_16, IMAGING_MODE_L, I16L_L},
|
||||||
|
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_I_16L, I_I16L},
|
||||||
|
{IMAGING_MODE_I_16L, IMAGING_MODE_I, I16L_I},
|
||||||
|
{IMAGING_MODE_I, IMAGING_MODE_I_16B, I_I16B},
|
||||||
|
{IMAGING_MODE_I_16B, IMAGING_MODE_I, I16B_I},
|
||||||
|
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I_16L, L_I16L},
|
||||||
|
{IMAGING_MODE_I_16L, IMAGING_MODE_L, I16L_L},
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I_16B, L_I16B},
|
||||||
|
{IMAGING_MODE_I_16B, IMAGING_MODE_L, I16B_L},
|
||||||
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I_16N, L_I16B},
|
||||||
|
{IMAGING_MODE_I_16N, IMAGING_MODE_L, I16B_L},
|
||||||
|
#else
|
||||||
|
{IMAGING_MODE_L, IMAGING_MODE_I_16N, L_I16L},
|
||||||
|
{IMAGING_MODE_I_16N, IMAGING_MODE_L, I16L_L},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{IMAGING_MODE_I_16, IMAGING_MODE_F, I16L_F},
|
||||||
|
{IMAGING_MODE_I_16L, IMAGING_MODE_F, I16L_F},
|
||||||
|
{IMAGING_MODE_I_16B, IMAGING_MODE_F, I16B_F}
|
||||||
|
};
|
||||||
|
|
||||||
static Imaging
|
static Imaging
|
||||||
convert(
|
convert(Imaging imOut, Imaging imIn, ModeID mode, ImagingPalette palette, int dither) {
|
||||||
Imaging imOut, Imaging imIn, const char *mode, ImagingPalette palette, int dither
|
|
||||||
) {
|
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
ImagingShuffler convert;
|
ImagingShuffler convert;
|
||||||
int y;
|
|
||||||
|
|
||||||
if (!imIn) {
|
if (!imIn) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mode) {
|
if (mode == IMAGING_MODE_UNKNOWN) {
|
||||||
/* Map palette image to full depth */
|
/* Map palette image to full depth */
|
||||||
if (!imIn->palette) {
|
if (!imIn->palette) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
|
@ -1640,33 +1640,31 @@ convert(
|
||||||
mode = imIn->palette->mode;
|
mode = imIn->palette->mode;
|
||||||
} else {
|
} else {
|
||||||
/* Same mode? */
|
/* Same mode? */
|
||||||
if (!strcmp(imIn->mode, mode)) {
|
if (imIn->mode == mode) {
|
||||||
return ImagingCopy2(imOut, imIn);
|
return ImagingCopy2(imOut, imIn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test for special conversions */
|
/* test for special conversions */
|
||||||
|
|
||||||
if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "PA") == 0) {
|
if (imIn->mode == IMAGING_MODE_P || imIn->mode == IMAGING_MODE_PA) {
|
||||||
return frompalette(imOut, imIn, mode);
|
return frompalette(imOut, imIn, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, "P") == 0 || strcmp(mode, "PA") == 0) {
|
if (mode == IMAGING_MODE_P || mode == IMAGING_MODE_PA) {
|
||||||
return topalette(imOut, imIn, mode, palette, dither);
|
return topalette(imOut, imIn, mode, palette, dither);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dither && strcmp(mode, "1") == 0) {
|
if (dither && mode == IMAGING_MODE_1) {
|
||||||
return tobilevel(imOut, imIn);
|
return tobilevel(imOut, imIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* standard conversion machinery */
|
/* standard conversion machinery */
|
||||||
|
|
||||||
convert = NULL;
|
convert = NULL;
|
||||||
|
for (size_t i = 0; i < sizeof(converters) / sizeof(*converters); i++) {
|
||||||
for (y = 0; converters[y].from; y++) {
|
if (imIn->mode == converters[i].from && mode == converters[i].to) {
|
||||||
if (!strcmp(imIn->mode, converters[y].from) &&
|
convert = converters[i].convert;
|
||||||
!strcmp(mode, converters[y].to)) {
|
|
||||||
convert = converters[y].convert;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1677,7 +1675,11 @@ convert(
|
||||||
#else
|
#else
|
||||||
static char buf[100];
|
static char buf[100];
|
||||||
snprintf(
|
snprintf(
|
||||||
buf, 100, "conversion from %.10s to %.10s not supported", imIn->mode, mode
|
buf,
|
||||||
|
100,
|
||||||
|
"conversion from %.10s to %.10s not supported",
|
||||||
|
getModeData(imIn->mode)->name,
|
||||||
|
getModeData(mode)->name
|
||||||
);
|
);
|
||||||
return (Imaging)ImagingError_ValueError(buf);
|
return (Imaging)ImagingError_ValueError(buf);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1689,7 +1691,7 @@ convert(
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
for (y = 0; y < imIn->ysize; y++) {
|
for (int y = 0; y < imIn->ysize; y++) {
|
||||||
(*convert)((UINT8 *)imOut->image[y], (UINT8 *)imIn->image[y], imIn->xsize);
|
(*convert)((UINT8 *)imOut->image[y], (UINT8 *)imIn->image[y], imIn->xsize);
|
||||||
}
|
}
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
@ -1698,7 +1700,7 @@ convert(
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingConvert(Imaging imIn, const char *mode, ImagingPalette palette, int dither) {
|
ImagingConvert(Imaging imIn, const ModeID mode, ImagingPalette palette, int dither) {
|
||||||
return convert(NULL, imIn, mode, palette, dither);
|
return convert(NULL, imIn, mode, palette, dither);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1708,7 +1710,7 @@ ImagingConvert2(Imaging imOut, Imaging imIn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
|
ImagingConvertTransparent(Imaging imIn, const ModeID mode, int r, int g, int b) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
ImagingShuffler convert;
|
ImagingShuffler convert;
|
||||||
Imaging imOut = NULL;
|
Imaging imOut = NULL;
|
||||||
|
@ -1722,27 +1724,27 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(imIn->mode, "RGB") == 0 &&
|
if (imIn->mode == IMAGING_MODE_RGB &&
|
||||||
(strcmp(mode, "RGBA") == 0 || strcmp(mode, "RGBa") == 0)) {
|
(mode == IMAGING_MODE_RGBA || mode == IMAGING_MODE_RGBa)) {
|
||||||
convert = rgb2rgba;
|
convert = rgb2rgba;
|
||||||
if (strcmp(mode, "RGBa") == 0) {
|
if (mode == IMAGING_MODE_RGBa) {
|
||||||
premultiplied = 1;
|
premultiplied = 1;
|
||||||
}
|
}
|
||||||
} else if (strcmp(imIn->mode, "RGB") == 0 &&
|
} else if (imIn->mode == IMAGING_MODE_RGB &&
|
||||||
(strcmp(mode, "LA") == 0 || strcmp(mode, "La") == 0)) {
|
(mode == IMAGING_MODE_LA || mode == IMAGING_MODE_La)) {
|
||||||
convert = rgb2la;
|
convert = rgb2la;
|
||||||
source_transparency = 1;
|
source_transparency = 1;
|
||||||
if (strcmp(mode, "La") == 0) {
|
if (mode == IMAGING_MODE_La) {
|
||||||
premultiplied = 1;
|
premultiplied = 1;
|
||||||
}
|
}
|
||||||
} else if ((strcmp(imIn->mode, "1") == 0 || strcmp(imIn->mode, "I") == 0 ||
|
} else if ((imIn->mode == IMAGING_MODE_1 || imIn->mode == IMAGING_MODE_I ||
|
||||||
strcmp(imIn->mode, "I;16") == 0 || strcmp(imIn->mode, "L") == 0) &&
|
imIn->mode == IMAGING_MODE_I_16 || imIn->mode == IMAGING_MODE_L) &&
|
||||||
(strcmp(mode, "RGBA") == 0 || strcmp(mode, "LA") == 0)) {
|
(mode == IMAGING_MODE_RGBA || mode == IMAGING_MODE_LA)) {
|
||||||
if (strcmp(imIn->mode, "1") == 0) {
|
if (imIn->mode == IMAGING_MODE_1) {
|
||||||
convert = bit2rgb;
|
convert = bit2rgb;
|
||||||
} else if (strcmp(imIn->mode, "I") == 0) {
|
} else if (imIn->mode == IMAGING_MODE_I) {
|
||||||
convert = i2rgb;
|
convert = i2rgb;
|
||||||
} else if (strcmp(imIn->mode, "I;16") == 0) {
|
} else if (imIn->mode == IMAGING_MODE_I_16) {
|
||||||
convert = I16_RGB;
|
convert = I16_RGB;
|
||||||
} else {
|
} else {
|
||||||
convert = l2rgb;
|
convert = l2rgb;
|
||||||
|
@ -1754,8 +1756,8 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
|
||||||
buf,
|
buf,
|
||||||
100,
|
100,
|
||||||
"conversion from %.10s to %.10s not supported in convert_transparent",
|
"conversion from %.10s to %.10s not supported in convert_transparent",
|
||||||
imIn->mode,
|
getModeData(imIn->mode)->name,
|
||||||
mode
|
getModeData(mode)->name
|
||||||
);
|
);
|
||||||
return (Imaging)ImagingError_ValueError(buf);
|
return (Imaging)ImagingError_ValueError(buf);
|
||||||
}
|
}
|
||||||
|
@ -1778,15 +1780,15 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingConvertInPlace(Imaging imIn, const char *mode) {
|
ImagingConvertInPlace(Imaging imIn, const ModeID mode) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
ImagingShuffler convert;
|
ImagingShuffler convert;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
/* limited support for inplace conversion */
|
/* limited support for inplace conversion */
|
||||||
if (strcmp(imIn->mode, "L") == 0 && strcmp(mode, "1") == 0) {
|
if (imIn->mode == IMAGING_MODE_L && mode == IMAGING_MODE_1) {
|
||||||
convert = l2bit;
|
convert = l2bit;
|
||||||
} else if (strcmp(imIn->mode, "1") == 0 && strcmp(mode, "L") == 0) {
|
} else if (imIn->mode == IMAGING_MODE_1 && mode == IMAGING_MODE_L) {
|
||||||
convert = bit2l;
|
convert = bit2l;
|
||||||
} else {
|
} else {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
|
|
|
@ -25,20 +25,17 @@
|
||||||
|
|
||||||
#include "ImDib.h"
|
#include "ImDib.h"
|
||||||
|
|
||||||
char *
|
ModeID
|
||||||
ImagingGetModeDIB(int size_out[2]) {
|
ImagingGetModeDIB(int size_out[2]) {
|
||||||
/* Get device characteristics */
|
/* Get device characteristics */
|
||||||
|
|
||||||
HDC dc;
|
const HDC dc = CreateCompatibleDC(NULL);
|
||||||
char *mode;
|
|
||||||
|
|
||||||
dc = CreateCompatibleDC(NULL);
|
ModeID mode = IMAGING_MODE_P;
|
||||||
|
|
||||||
mode = "P";
|
|
||||||
if (!(GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE)) {
|
if (!(GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE)) {
|
||||||
mode = "RGB";
|
mode = IMAGING_MODE_RGB;
|
||||||
if (GetDeviceCaps(dc, BITSPIXEL) == 1) {
|
if (GetDeviceCaps(dc, BITSPIXEL) == 1) {
|
||||||
mode = "1";
|
mode = IMAGING_MODE_1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +50,7 @@ ImagingGetModeDIB(int size_out[2]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagingDIB
|
ImagingDIB
|
||||||
ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
ImagingNewDIB(const ModeID mode, int xsize, int ysize) {
|
||||||
/* Create a Windows bitmap */
|
/* Create a Windows bitmap */
|
||||||
|
|
||||||
ImagingDIB dib;
|
ImagingDIB dib;
|
||||||
|
@ -61,10 +58,12 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Check mode */
|
/* Check mode */
|
||||||
if (strcmp(mode, "1") != 0 && strcmp(mode, "L") != 0 && strcmp(mode, "RGB") != 0) {
|
if (mode != IMAGING_MODE_1 && mode != IMAGING_MODE_L && mode != IMAGING_MODE_RGB) {
|
||||||
return (ImagingDIB)ImagingError_ModeError();
|
return (ImagingDIB)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int pixelsize = mode == IMAGING_MODE_RGB ? 3 : 1;
|
||||||
|
|
||||||
/* Create DIB context and info header */
|
/* Create DIB context and info header */
|
||||||
/* malloc check ok, small constant allocation */
|
/* malloc check ok, small constant allocation */
|
||||||
dib = (ImagingDIB)malloc(sizeof(*dib));
|
dib = (ImagingDIB)malloc(sizeof(*dib));
|
||||||
|
@ -83,7 +82,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
dib->info->bmiHeader.biWidth = xsize;
|
dib->info->bmiHeader.biWidth = xsize;
|
||||||
dib->info->bmiHeader.biHeight = ysize;
|
dib->info->bmiHeader.biHeight = ysize;
|
||||||
dib->info->bmiHeader.biPlanes = 1;
|
dib->info->bmiHeader.biPlanes = 1;
|
||||||
dib->info->bmiHeader.biBitCount = strlen(mode) * 8;
|
dib->info->bmiHeader.biBitCount = pixelsize * 8;
|
||||||
dib->info->bmiHeader.biCompression = BI_RGB;
|
dib->info->bmiHeader.biCompression = BI_RGB;
|
||||||
|
|
||||||
/* Create DIB */
|
/* Create DIB */
|
||||||
|
@ -103,12 +102,12 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
return (ImagingDIB)ImagingError_MemoryError();
|
return (ImagingDIB)ImagingError_MemoryError();
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(dib->mode, mode);
|
dib->mode = mode;
|
||||||
dib->xsize = xsize;
|
dib->xsize = xsize;
|
||||||
dib->ysize = ysize;
|
dib->ysize = ysize;
|
||||||
|
|
||||||
dib->pixelsize = strlen(mode);
|
dib->pixelsize = pixelsize;
|
||||||
dib->linesize = (xsize * dib->pixelsize + 3) & -4;
|
dib->linesize = (xsize * pixelsize + 3) & -4;
|
||||||
|
|
||||||
if (dib->pixelsize == 1) {
|
if (dib->pixelsize == 1) {
|
||||||
dib->pack = dib->unpack = (ImagingShuffler)memcpy;
|
dib->pack = dib->unpack = (ImagingShuffler)memcpy;
|
||||||
|
@ -132,7 +131,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create an associated palette (for 8-bit displays only) */
|
/* Create an associated palette (for 8-bit displays only) */
|
||||||
if (strcmp(ImagingGetModeDIB(NULL), "P") == 0) {
|
if (ImagingGetModeDIB(NULL) == IMAGING_MODE_P) {
|
||||||
char palbuf[sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)];
|
char palbuf[sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)];
|
||||||
LPLOGPALETTE pal = (LPLOGPALETTE)palbuf;
|
LPLOGPALETTE pal = (LPLOGPALETTE)palbuf;
|
||||||
int i, r, g, b;
|
int i, r, g, b;
|
||||||
|
@ -142,7 +141,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
pal->palNumEntries = 256;
|
pal->palNumEntries = 256;
|
||||||
GetSystemPaletteEntries(dib->dc, 0, 256, pal->palPalEntry);
|
GetSystemPaletteEntries(dib->dc, 0, 256, pal->palPalEntry);
|
||||||
|
|
||||||
if (strcmp(mode, "L") == 0) {
|
if (mode == IMAGING_MODE_L) {
|
||||||
/* Grayscale DIB. Fill all 236 slots with a grayscale ramp
|
/* Grayscale DIB. Fill all 236 slots with a grayscale ramp
|
||||||
* (this is usually overkill on Windows since VGA only offers
|
* (this is usually overkill on Windows since VGA only offers
|
||||||
* 6 bits grayscale resolution). Ignore the slots already
|
* 6 bits grayscale resolution). Ignore the slots already
|
||||||
|
@ -156,8 +155,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
dib->palette = CreatePalette(pal);
|
dib->palette = CreatePalette(pal);
|
||||||
|
} else if (mode == IMAGING_MODE_RGB) {
|
||||||
} else if (strcmp(mode, "RGB") == 0) {
|
|
||||||
#ifdef CUBE216
|
#ifdef CUBE216
|
||||||
|
|
||||||
/* Colour DIB. Create a 6x6x6 colour cube (216 entries) and
|
/* Colour DIB. Create a 6x6x6 colour cube (216 entries) and
|
||||||
|
|
|
@ -68,7 +68,7 @@ typedef void (*hline_handler)(Imaging, int, int, int, int);
|
||||||
static inline void
|
static inline void
|
||||||
point8(Imaging im, int x, int y, int ink) {
|
point8(Imaging im, int x, int y, int ink) {
|
||||||
if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) {
|
if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) {
|
||||||
if (strncmp(im->mode, "I;16", 4) == 0) {
|
if (isModeI16(im->mode)) {
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
im->image8[y][x * 2] = (UINT8)(ink >> 8);
|
im->image8[y][x * 2] = (UINT8)(ink >> 8);
|
||||||
im->image8[y][x * 2 + 1] = (UINT8)ink;
|
im->image8[y][x * 2 + 1] = (UINT8)ink;
|
||||||
|
@ -118,7 +118,7 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) {
|
||||||
x1 = im->xsize - 1;
|
x1 = im->xsize - 1;
|
||||||
}
|
}
|
||||||
if (x0 <= x1) {
|
if (x0 <= x1) {
|
||||||
pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1;
|
pixelwidth = isModeI16(im->mode) ? 2 : 1;
|
||||||
memset(
|
memset(
|
||||||
im->image8[y0] + x0 * pixelwidth, (UINT8)ink, (x1 - x0 + 1) * pixelwidth
|
im->image8[y0] + x0 * pixelwidth, (UINT8)ink, (x1 - x0 + 1) * pixelwidth
|
||||||
);
|
);
|
||||||
|
@ -652,17 +652,17 @@ DRAW draw32rgba = {point32rgba, hline32rgba, line32rgba, polygon32rgba};
|
||||||
/* Interface */
|
/* Interface */
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define DRAWINIT() \
|
#define DRAWINIT() \
|
||||||
if (im->image8) { \
|
if (im->image8) { \
|
||||||
draw = &draw8; \
|
draw = &draw8; \
|
||||||
if (strncmp(im->mode, "I;16", 4) == 0) { \
|
if (isModeI16(im->mode)) { \
|
||||||
ink = INK16(ink_); \
|
ink = INK16(ink_); \
|
||||||
} else { \
|
} else { \
|
||||||
ink = INK8(ink_); \
|
ink = INK8(ink_); \
|
||||||
} \
|
} \
|
||||||
} else { \
|
} else { \
|
||||||
draw = (op) ? &draw32rgba : &draw32; \
|
draw = (op) ? &draw32rgba : &draw32; \
|
||||||
memcpy(&ink, ink_, sizeof(ink)); \
|
memcpy(&ink, ink_, sizeof(ink)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -36,7 +36,7 @@ ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) {
|
||||||
return (Imaging)ImagingError_ValueError(NULL);
|
return (Imaging)ImagingError_ValueError(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
im = ImagingNewDirty("L", xsize, ysize);
|
im = ImagingNewDirty(IMAGING_MODE_L, xsize, ysize);
|
||||||
if (!im) {
|
if (!im) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) {
|
||||||
int nextok;
|
int nextok;
|
||||||
double this, next;
|
double this, next;
|
||||||
|
|
||||||
imOut = ImagingNewDirty("L", xsize, ysize);
|
imOut = ImagingNewDirty(IMAGING_MODE_L, xsize, ysize);
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,14 +23,13 @@ int
|
||||||
ImagingSaveRaw(Imaging im, FILE *fp) {
|
ImagingSaveRaw(Imaging im, FILE *fp) {
|
||||||
int x, y, i;
|
int x, y, i;
|
||||||
|
|
||||||
if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) {
|
if (im->mode == IMAGING_MODE_1 || im->mode == IMAGING_MODE_L) {
|
||||||
/* @PIL227: FIXME: for mode "1", map != 0 to 255 */
|
/* @PIL227: FIXME: for mode "1", map != 0 to 255 */
|
||||||
|
|
||||||
/* PGM "L" */
|
/* PGM "L" */
|
||||||
for (y = 0; y < im->ysize; y++) {
|
for (y = 0; y < im->ysize; y++) {
|
||||||
fwrite(im->image[y], 1, im->xsize, fp);
|
fwrite(im->image[y], 1, im->xsize, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* PPM "RGB" or other internal format */
|
/* PPM "RGB" or other internal format */
|
||||||
for (y = 0; y < im->ysize; y++) {
|
for (y = 0; y < im->ysize; y++) {
|
||||||
|
@ -58,10 +57,10 @@ ImagingSavePPM(Imaging im, const char *outfile) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) {
|
if (im->mode == IMAGING_MODE_1 || im->mode == IMAGING_MODE_L) {
|
||||||
/* Write "PGM" */
|
/* Write "PGM" */
|
||||||
fprintf(fp, "P5\n%d %d\n255\n", im->xsize, im->ysize);
|
fprintf(fp, "P5\n%d %d\n255\n", im->xsize, im->ysize);
|
||||||
} else if (strcmp(im->mode, "RGB") == 0) {
|
} else if (im->mode == IMAGING_MODE_RGB) {
|
||||||
/* Write "PPM" */
|
/* Write "PPM" */
|
||||||
fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize);
|
fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -68,11 +68,12 @@ ImagingFill(Imaging im, const void *colour) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingFillLinearGradient(const char *mode) {
|
ImagingFillLinearGradient(const ModeID mode) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
if (strlen(mode) != 1) {
|
if (mode != IMAGING_MODE_1 && mode != IMAGING_MODE_F && mode != IMAGING_MODE_I &&
|
||||||
|
mode != IMAGING_MODE_L && mode != IMAGING_MODE_P) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,12 +103,13 @@ ImagingFillLinearGradient(const char *mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingFillRadialGradient(const char *mode) {
|
ImagingFillRadialGradient(const ModeID mode) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
int x, y;
|
int x, y;
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
if (strlen(mode) != 1) {
|
if (mode != IMAGING_MODE_1 && mode != IMAGING_MODE_F && mode != IMAGING_MODE_I &&
|
||||||
|
mode != IMAGING_MODE_L && mode != IMAGING_MODE_P) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,9 +155,9 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float *kernel, float offset) {
|
||||||
} else {
|
} else {
|
||||||
int bigendian = 0;
|
int bigendian = 0;
|
||||||
if (im->type == IMAGING_TYPE_SPECIAL) {
|
if (im->type == IMAGING_TYPE_SPECIAL) {
|
||||||
if (strcmp(im->mode, "I;16B") == 0
|
if (im->mode == IMAGING_MODE_I_16B
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|| strcmp(im->mode, "I;16N") == 0
|
|| im->mode == IMAGING_MODE_I_16N
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
bigendian = 1;
|
bigendian = 1;
|
||||||
|
@ -308,9 +308,9 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float *kernel, float offset) {
|
||||||
} else {
|
} else {
|
||||||
int bigendian = 0;
|
int bigendian = 0;
|
||||||
if (im->type == IMAGING_TYPE_SPECIAL) {
|
if (im->type == IMAGING_TYPE_SPECIAL) {
|
||||||
if (strcmp(im->mode, "I;16B") == 0
|
if (im->mode == IMAGING_MODE_I_16B
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|| strcmp(im->mode, "I;16N") == 0
|
|| im->mode == IMAGING_MODE_I_16N
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
bigendian = 1;
|
bigendian = 1;
|
||||||
|
|
|
@ -19,7 +19,7 @@ ImagingFlipLeftRight(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int x, y, xr;
|
int x, y, xr;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
||||||
|
@ -41,7 +41,7 @@ ImagingFlipLeftRight(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
FLIP_LEFT_RIGHT(UINT16, image8)
|
FLIP_LEFT_RIGHT(UINT16, image8)
|
||||||
} else {
|
} else {
|
||||||
FLIP_LEFT_RIGHT(UINT8, image8)
|
FLIP_LEFT_RIGHT(UINT8, image8)
|
||||||
|
@ -62,7 +62,7 @@ ImagingFlipTopBottom(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int y, yr;
|
int y, yr;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
||||||
|
@ -89,7 +89,7 @@ ImagingRotate90(Imaging imOut, Imaging imIn) {
|
||||||
int x, y, xx, yy, xr, xxsize, yysize;
|
int x, y, xx, yy, xr, xxsize, yysize;
|
||||||
int xxx, yyy, xxxsize, yyysize;
|
int xxx, yyy, xxxsize, yyysize;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
||||||
|
@ -127,7 +127,7 @@ ImagingRotate90(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
ROTATE_90(UINT16, image8);
|
ROTATE_90(UINT16, image8);
|
||||||
} else {
|
} else {
|
||||||
ROTATE_90(UINT8, image8);
|
ROTATE_90(UINT8, image8);
|
||||||
|
@ -149,7 +149,7 @@ ImagingTranspose(Imaging imOut, Imaging imIn) {
|
||||||
int x, y, xx, yy, xxsize, yysize;
|
int x, y, xx, yy, xxsize, yysize;
|
||||||
int xxx, yyy, xxxsize, yyysize;
|
int xxx, yyy, xxxsize, yyysize;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
||||||
|
@ -186,7 +186,7 @@ ImagingTranspose(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
TRANSPOSE(UINT16, image8);
|
TRANSPOSE(UINT16, image8);
|
||||||
} else {
|
} else {
|
||||||
TRANSPOSE(UINT8, image8);
|
TRANSPOSE(UINT8, image8);
|
||||||
|
@ -208,7 +208,7 @@ ImagingTransverse(Imaging imOut, Imaging imIn) {
|
||||||
int x, y, xr, yr, xx, yy, xxsize, yysize;
|
int x, y, xr, yr, xx, yy, xxsize, yysize;
|
||||||
int xxx, yyy, xxxsize, yyysize;
|
int xxx, yyy, xxxsize, yyysize;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
||||||
|
@ -247,7 +247,7 @@ ImagingTransverse(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
TRANSVERSE(UINT16, image8);
|
TRANSVERSE(UINT16, image8);
|
||||||
} else {
|
} else {
|
||||||
TRANSVERSE(UINT8, image8);
|
TRANSVERSE(UINT8, image8);
|
||||||
|
@ -268,7 +268,7 @@ ImagingRotate180(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int x, y, xr, yr;
|
int x, y, xr, yr;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) {
|
||||||
|
@ -291,7 +291,7 @@ ImagingRotate180(Imaging imOut, Imaging imIn) {
|
||||||
|
|
||||||
yr = imIn->ysize - 1;
|
yr = imIn->ysize - 1;
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
ROTATE_180(UINT16, image8)
|
ROTATE_180(UINT16, image8)
|
||||||
} else {
|
} else {
|
||||||
ROTATE_180(UINT8, image8)
|
ROTATE_180(UINT8, image8)
|
||||||
|
@ -313,7 +313,7 @@ ImagingRotate270(Imaging imOut, Imaging imIn) {
|
||||||
int x, y, xx, yy, yr, xxsize, yysize;
|
int x, y, xx, yy, yr, xxsize, yysize;
|
||||||
int xxx, yyy, xxxsize, yyysize;
|
int xxx, yyy, xxxsize, yyysize;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) {
|
||||||
|
@ -351,7 +351,7 @@ ImagingRotate270(Imaging imOut, Imaging imIn) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
if (imIn->image8) {
|
if (imIn->image8) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
ROTATE_270(UINT16, image8);
|
ROTATE_270(UINT16, image8);
|
||||||
} else {
|
} else {
|
||||||
ROTATE_270(UINT8, image8);
|
ROTATE_270(UINT8, image8);
|
||||||
|
@ -791,7 +791,7 @@ ImagingGenericTransform(
|
||||||
char *out;
|
char *out;
|
||||||
double xx, yy;
|
double xx, yy;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,7 +848,7 @@ ImagingScaleAffine(
|
||||||
int xmin, xmax;
|
int xmin, xmax;
|
||||||
int *xintab;
|
int *xintab;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,7 +1035,7 @@ ImagingTransformAffine(
|
||||||
double xx, yy;
|
double xx, yy;
|
||||||
double xo, yo;
|
double xo, yo;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || imIn->mode != imOut->mode) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,9 +90,9 @@ ImagingGetBBox(Imaging im, int bbox[4], int alpha_only) {
|
||||||
if (im->bands == 3) {
|
if (im->bands == 3) {
|
||||||
((UINT8 *)&mask)[3] = 0;
|
((UINT8 *)&mask)[3] = 0;
|
||||||
} else if (alpha_only &&
|
} else if (alpha_only &&
|
||||||
(strcmp(im->mode, "RGBa") == 0 || strcmp(im->mode, "RGBA") == 0 ||
|
(im->mode == IMAGING_MODE_RGBa || im->mode == IMAGING_MODE_RGBA ||
|
||||||
strcmp(im->mode, "La") == 0 || strcmp(im->mode, "LA") == 0 ||
|
im->mode == IMAGING_MODE_La || im->mode == IMAGING_MODE_LA ||
|
||||||
strcmp(im->mode, "PA") == 0)) {
|
im->mode == IMAGING_MODE_PA)) {
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
mask = 0x000000ff;
|
mask = 0x000000ff;
|
||||||
#else
|
#else
|
||||||
|
@ -208,7 +208,7 @@ ImagingGetExtrema(Imaging im, void *extrema) {
|
||||||
memcpy(((char *)extrema) + sizeof(fmin), &fmax, sizeof(fmax));
|
memcpy(((char *)extrema) + sizeof(fmin), &fmax, sizeof(fmax));
|
||||||
break;
|
break;
|
||||||
case IMAGING_TYPE_SPECIAL:
|
case IMAGING_TYPE_SPECIAL:
|
||||||
if (strcmp(im->mode, "I;16") == 0) {
|
if (im->mode == IMAGING_MODE_I_16) {
|
||||||
UINT16 v;
|
UINT16 v;
|
||||||
UINT8 *pixel = *im->image8;
|
UINT8 *pixel = *im->image8;
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
|
|
@ -43,10 +43,10 @@ ImagingHistogramNew(Imaging im) {
|
||||||
if (!h) {
|
if (!h) {
|
||||||
return (ImagingHistogram)ImagingError_MemoryError();
|
return (ImagingHistogram)ImagingError_MemoryError();
|
||||||
}
|
}
|
||||||
strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH - 1);
|
|
||||||
h->mode[IMAGING_MODE_LENGTH - 1] = 0;
|
|
||||||
|
|
||||||
|
h->mode = im->mode;
|
||||||
h->bands = im->bands;
|
h->bands = im->bands;
|
||||||
|
|
||||||
h->histogram = calloc(im->pixelsize, 256 * sizeof(long));
|
h->histogram = calloc(im->pixelsize, 256 * sizeof(long));
|
||||||
if (!h->histogram) {
|
if (!h->histogram) {
|
||||||
free(h);
|
free(h);
|
||||||
|
@ -73,7 +73,7 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void *minmax) {
|
||||||
if (im->xsize != imMask->xsize || im->ysize != imMask->ysize) {
|
if (im->xsize != imMask->xsize || im->ysize != imMask->ysize) {
|
||||||
return ImagingError_Mismatch();
|
return ImagingError_Mismatch();
|
||||||
}
|
}
|
||||||
if (strcmp(imMask->mode, "1") != 0 && strcmp(imMask->mode, "L") != 0) {
|
if (imMask->mode != IMAGING_MODE_1 && imMask->mode != IMAGING_MODE_L) {
|
||||||
return ImagingError_ValueError("bad transparency mask");
|
return ImagingError_ValueError("bad transparency mask");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ struct ImagingDIBInstance {
|
||||||
UINT8 *bits;
|
UINT8 *bits;
|
||||||
HPALETTE palette;
|
HPALETTE palette;
|
||||||
/* Used by cut and paste */
|
/* Used by cut and paste */
|
||||||
char mode[4];
|
ModeID mode;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
int pixelsize;
|
int pixelsize;
|
||||||
int linesize;
|
int linesize;
|
||||||
|
@ -37,11 +37,11 @@ struct ImagingDIBInstance {
|
||||||
|
|
||||||
typedef struct ImagingDIBInstance *ImagingDIB;
|
typedef struct ImagingDIBInstance *ImagingDIB;
|
||||||
|
|
||||||
extern char *
|
extern ModeID
|
||||||
ImagingGetModeDIB(int size_out[2]);
|
ImagingGetModeDIB(int size_out[2]);
|
||||||
|
|
||||||
extern ImagingDIB
|
extern ImagingDIB
|
||||||
ImagingNewDIB(const char *mode, int xsize, int ysize);
|
ImagingNewDIB(ModeID mode, int xsize, int ysize);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
ImagingDeleteDIB(ImagingDIB im);
|
ImagingDeleteDIB(ImagingDIB im);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ImPlatform.h"
|
#include "ImPlatform.h"
|
||||||
|
#include "Mode.h"
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -69,9 +70,6 @@ typedef struct ImagingPaletteInstance *ImagingPalette;
|
||||||
#define IMAGING_TYPE_FLOAT32 2
|
#define IMAGING_TYPE_FLOAT32 2
|
||||||
#define IMAGING_TYPE_SPECIAL 3 /* check mode for details */
|
#define IMAGING_TYPE_SPECIAL 3 /* check mode for details */
|
||||||
|
|
||||||
#define IMAGING_MODE_LENGTH \
|
|
||||||
6 + 1 /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
int size;
|
int size;
|
||||||
|
@ -79,12 +77,11 @@ typedef struct {
|
||||||
|
|
||||||
struct ImagingMemoryInstance {
|
struct ImagingMemoryInstance {
|
||||||
/* Format */
|
/* Format */
|
||||||
char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK",
|
ModeID mode; /* Image mode (IMAGING_MODE_*) */
|
||||||
"YCbCr", "BGR;xy") */
|
int type; /* Data type (IMAGING_TYPE_*) */
|
||||||
int type; /* Data type (IMAGING_TYPE_*) */
|
int depth; /* Depth (ignored in this version) */
|
||||||
int depth; /* Depth (ignored in this version) */
|
int bands; /* Number of bands (1, 2, 3, or 4) */
|
||||||
int bands; /* Number of bands (1, 2, 3, or 4) */
|
int xsize; /* Image dimension. */
|
||||||
int xsize; /* Image dimension. */
|
|
||||||
int ysize;
|
int ysize;
|
||||||
|
|
||||||
/* Colour palette (for "P" images only) */
|
/* Colour palette (for "P" images only) */
|
||||||
|
@ -123,15 +120,15 @@ struct ImagingMemoryInstance {
|
||||||
#define IMAGING_PIXEL_FLOAT32(im, x, y) (((FLOAT32 *)(im)->image32[y])[x])
|
#define IMAGING_PIXEL_FLOAT32(im, x, y) (((FLOAT32 *)(im)->image32[y])[x])
|
||||||
|
|
||||||
struct ImagingAccessInstance {
|
struct ImagingAccessInstance {
|
||||||
const char *mode;
|
ModeID mode;
|
||||||
void (*get_pixel)(Imaging im, int x, int y, void *pixel);
|
void (*get_pixel)(Imaging im, int x, int y, void *pixel);
|
||||||
void (*put_pixel)(Imaging im, int x, int y, const void *pixel);
|
void (*put_pixel)(Imaging im, int x, int y, const void *pixel);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImagingHistogramInstance {
|
struct ImagingHistogramInstance {
|
||||||
/* Format */
|
/* Format */
|
||||||
char mode[IMAGING_MODE_LENGTH]; /* Band names (of corresponding source image) */
|
ModeID mode; /* Mode ID of corresponding source image */
|
||||||
int bands; /* Number of bands (1, 3, or 4) */
|
int bands; /* Number of bands (1, 3, or 4) */
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
long *histogram; /* Histogram (bands*256 longs) */
|
long *histogram; /* Histogram (bands*256 longs) */
|
||||||
|
@ -139,7 +136,7 @@ struct ImagingHistogramInstance {
|
||||||
|
|
||||||
struct ImagingPaletteInstance {
|
struct ImagingPaletteInstance {
|
||||||
/* Format */
|
/* Format */
|
||||||
char mode[IMAGING_MODE_LENGTH]; /* Band names */
|
ModeID mode;
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
int size;
|
int size;
|
||||||
|
@ -176,21 +173,21 @@ extern void
|
||||||
ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size);
|
ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size);
|
||||||
|
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNew(const char *mode, int xsize, int ysize);
|
ImagingNew(ModeID mode, int xsize, int ysize);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNewDirty(const char *mode, int xsize, int ysize);
|
ImagingNewDirty(ModeID mode, int xsize, int ysize);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn);
|
ImagingNew2Dirty(ModeID mode, Imaging imOut, Imaging imIn);
|
||||||
extern void
|
extern void
|
||||||
ImagingDelete(Imaging im);
|
ImagingDelete(Imaging im);
|
||||||
|
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNewBlock(const char *mode, int xsize, int ysize);
|
ImagingNewBlock(ModeID mode, int xsize, int ysize);
|
||||||
|
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNewPrologue(const char *mode, int xsize, int ysize);
|
ImagingNewPrologue(ModeID mode, int xsize, int ysize);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int structure_size);
|
ImagingNewPrologueSubtype(ModeID mode, int xsize, int ysize, int structure_size);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
ImagingCopyPalette(Imaging destination, Imaging source);
|
ImagingCopyPalette(Imaging destination, Imaging source);
|
||||||
|
@ -198,8 +195,6 @@ ImagingCopyPalette(Imaging destination, Imaging source);
|
||||||
extern void
|
extern void
|
||||||
ImagingHistogramDelete(ImagingHistogram histogram);
|
ImagingHistogramDelete(ImagingHistogram histogram);
|
||||||
|
|
||||||
extern void
|
|
||||||
ImagingAccessInit(void);
|
|
||||||
extern ImagingAccess
|
extern ImagingAccess
|
||||||
ImagingAccessNew(Imaging im);
|
ImagingAccessNew(Imaging im);
|
||||||
extern void
|
extern void
|
||||||
|
@ -207,7 +202,7 @@ _ImagingAccessDelete(Imaging im, ImagingAccess access);
|
||||||
#define ImagingAccessDelete(im, access) /* nop, for now */
|
#define ImagingAccessDelete(im, access) /* nop, for now */
|
||||||
|
|
||||||
extern ImagingPalette
|
extern ImagingPalette
|
||||||
ImagingPaletteNew(const char *mode);
|
ImagingPaletteNew(ModeID mode);
|
||||||
extern ImagingPalette
|
extern ImagingPalette
|
||||||
ImagingPaletteNewBrowser(void);
|
ImagingPaletteNewBrowser(void);
|
||||||
extern ImagingPalette
|
extern ImagingPalette
|
||||||
|
@ -283,13 +278,13 @@ ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingCopy(Imaging im);
|
ImagingCopy(Imaging im);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingConvert(Imaging im, const char *mode, ImagingPalette palette, int dither);
|
ImagingConvert(Imaging im, ModeID mode, ImagingPalette palette, int dither);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingConvertInPlace(Imaging im, const char *mode);
|
ImagingConvertInPlace(Imaging im, ModeID mode);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingConvertMatrix(Imaging im, const char *mode, float m[]);
|
ImagingConvertMatrix(Imaging im, ModeID mode, float m[]);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingConvertTransparent(Imaging im, const char *mode, int r, int g, int b);
|
ImagingConvertTransparent(Imaging im, ModeID mode, int r, int g, int b);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingCrop(Imaging im, int x0, int y0, int x1, int y1);
|
ImagingCrop(Imaging im, int x0, int y0, int x1, int y1);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
|
@ -303,9 +298,9 @@ ImagingFill2(
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingFillBand(Imaging im, int band, int color);
|
ImagingFillBand(Imaging im, int band, int color);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingFillLinearGradient(const char *mode);
|
ImagingFillLinearGradient(ModeID mode);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingFillRadialGradient(const char *mode);
|
ImagingFillRadialGradient(ModeID mode);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32 *kernel, FLOAT32 offset);
|
ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32 *kernel, FLOAT32 offset);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
|
@ -319,7 +314,7 @@ ImagingGaussianBlur(
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingGetBand(Imaging im, int band);
|
ImagingGetBand(Imaging im, int band);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingMerge(const char *mode, Imaging bands[4]);
|
ImagingMerge(ModeID mode, Imaging bands[4]);
|
||||||
extern int
|
extern int
|
||||||
ImagingSplit(Imaging im, Imaging bands[4]);
|
ImagingSplit(Imaging im, Imaging bands[4]);
|
||||||
extern int
|
extern int
|
||||||
|
@ -346,7 +341,7 @@ ImagingOffset(Imaging im, int xoffset, int yoffset);
|
||||||
extern int
|
extern int
|
||||||
ImagingPaste(Imaging into, Imaging im, Imaging mask, int x0, int y0, int x1, int y1);
|
ImagingPaste(Imaging into, Imaging im, Imaging mask, int x0, int y0, int x1, int y1);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingPoint(Imaging im, const char *tablemode, const void *table);
|
ImagingPoint(Imaging im, ModeID tablemode, const void *table);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
ImagingPointTransform(Imaging imIn, double scale, double offset);
|
ImagingPointTransform(Imaging imIn, double scale, double offset);
|
||||||
extern Imaging
|
extern Imaging
|
||||||
|
@ -672,9 +667,9 @@ extern void
|
||||||
ImagingConvertYCbCr2RGB(UINT8 *out, const UINT8 *in, int pixels);
|
ImagingConvertYCbCr2RGB(UINT8 *out, const UINT8 *in, int pixels);
|
||||||
|
|
||||||
extern ImagingShuffler
|
extern ImagingShuffler
|
||||||
ImagingFindUnpacker(const char *mode, const char *rawmode, int *bits_out);
|
ImagingFindUnpacker(ModeID mode, RawModeID rawmode, int *bits_out);
|
||||||
extern ImagingShuffler
|
extern ImagingShuffler
|
||||||
ImagingFindPacker(const char *mode, const char *rawmode, int *bits_out);
|
ImagingFindPacker(ModeID mode, RawModeID rawmode, int *bits_out);
|
||||||
|
|
||||||
struct ImagingCodecStateInstance {
|
struct ImagingCodecStateInstance {
|
||||||
int count;
|
int count;
|
||||||
|
|
|
@ -28,12 +28,12 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* CONFIGURATION */
|
/* CONFIGURATION */
|
||||||
|
|
||||||
/* Jpeg file mode (empty if not known) */
|
/* Jpeg file mode */
|
||||||
char jpegmode[8 + 1];
|
RawModeID jpegmode;
|
||||||
|
|
||||||
/* Converter output mode (input to the shuffler). If empty,
|
/* Converter output mode (input to the shuffler) */
|
||||||
convert conversions are disabled */
|
/* If not a valid mode, convert conversions are disabled */
|
||||||
char rawmode[8 + 1];
|
RawModeID rawmode;
|
||||||
|
|
||||||
/* If set, trade quality for speed */
|
/* If set, trade quality for speed */
|
||||||
int draft;
|
int draft;
|
||||||
|
@ -91,7 +91,7 @@ typedef struct {
|
||||||
unsigned int restart_marker_rows;
|
unsigned int restart_marker_rows;
|
||||||
|
|
||||||
/* Converter input mode (input to the shuffler) */
|
/* Converter input mode (input to the shuffler) */
|
||||||
char rawmode[8 + 1];
|
RawModeID rawmode;
|
||||||
|
|
||||||
/* Custom quantization tables () */
|
/* Custom quantization tables () */
|
||||||
unsigned int *qtables;
|
unsigned int *qtables;
|
||||||
|
|
|
@ -71,7 +71,7 @@ typedef void (*j2k_unpacker_t)(
|
||||||
);
|
);
|
||||||
|
|
||||||
struct j2k_decode_unpacker {
|
struct j2k_decode_unpacker {
|
||||||
const char *mode;
|
const ModeID mode;
|
||||||
OPJ_COLOR_SPACE color_space;
|
OPJ_COLOR_SPACE color_space;
|
||||||
unsigned components;
|
unsigned components;
|
||||||
/* bool indicating if unpacker supports subsampling */
|
/* bool indicating if unpacker supports subsampling */
|
||||||
|
@ -599,26 +599,26 @@ j2ku_sycca_rgba(
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct j2k_decode_unpacker j2k_unpackers[] = {
|
static const struct j2k_decode_unpacker j2k_unpackers[] = {
|
||||||
{"L", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_l},
|
{IMAGING_MODE_L, OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_l},
|
||||||
{"P", OPJ_CLRSPC_SRGB, 1, 0, j2ku_gray_l},
|
{IMAGING_MODE_P, OPJ_CLRSPC_SRGB, 1, 0, j2ku_gray_l},
|
||||||
{"PA", OPJ_CLRSPC_SRGB, 2, 0, j2ku_graya_la},
|
{IMAGING_MODE_PA, OPJ_CLRSPC_SRGB, 2, 0, j2ku_graya_la},
|
||||||
{"I;16", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i},
|
{IMAGING_MODE_I_16, OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i},
|
||||||
{"I;16B", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i},
|
{IMAGING_MODE_I_16B, OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i},
|
||||||
{"LA", OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la},
|
{IMAGING_MODE_LA, OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la},
|
||||||
{"RGB", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb},
|
||||||
{"RGB", OPJ_CLRSPC_GRAY, 2, 0, j2ku_gray_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_GRAY, 2, 0, j2ku_gray_rgb},
|
||||||
{"RGB", OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb},
|
||||||
{"RGB", OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb},
|
||||||
{"RGB", OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgb_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgb_rgb},
|
||||||
{"RGB", OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycc_rgb},
|
{IMAGING_MODE_RGB, OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycc_rgb},
|
||||||
{"RGBA", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb},
|
||||||
{"RGBA", OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la},
|
||||||
{"RGBA", OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb},
|
||||||
{"RGBA", OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb},
|
||||||
{"RGBA", OPJ_CLRSPC_GRAY, 4, 1, j2ku_srgba_rgba},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_GRAY, 4, 1, j2ku_srgba_rgba},
|
||||||
{"RGBA", OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgba_rgba},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgba_rgba},
|
||||||
{"RGBA", OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycca_rgba},
|
{IMAGING_MODE_RGBA, OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycca_rgba},
|
||||||
{"CMYK", OPJ_CLRSPC_CMYK, 4, 1, j2ku_srgba_rgba},
|
{IMAGING_MODE_CMYK, OPJ_CLRSPC_CMYK, 4, 1, j2ku_srgba_rgba},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
@ -771,7 +771,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) {
|
||||||
if (color_space == j2k_unpackers[n].color_space &&
|
if (color_space == j2k_unpackers[n].color_space &&
|
||||||
image->numcomps == j2k_unpackers[n].components &&
|
image->numcomps == j2k_unpackers[n].components &&
|
||||||
(j2k_unpackers[n].subsampling || (subsampling == -1)) &&
|
(j2k_unpackers[n].subsampling || (subsampling == -1)) &&
|
||||||
strcmp(im->mode, j2k_unpackers[n].mode) == 0) {
|
im->mode == j2k_unpackers[n].mode) {
|
||||||
unpack = j2k_unpackers[n].unpacker;
|
unpack = j2k_unpackers[n].unpacker;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -305,34 +305,34 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Setup an opj_image */
|
/* Setup an opj_image */
|
||||||
if (strcmp(im->mode, "L") == 0) {
|
if (im->mode == IMAGING_MODE_L) {
|
||||||
components = 1;
|
components = 1;
|
||||||
color_space = OPJ_CLRSPC_GRAY;
|
color_space = OPJ_CLRSPC_GRAY;
|
||||||
pack = j2k_pack_l;
|
pack = j2k_pack_l;
|
||||||
} else if (strcmp(im->mode, "I;16") == 0 || strcmp(im->mode, "I;16B") == 0) {
|
} else if (im->mode == IMAGING_MODE_I_16 || im->mode == IMAGING_MODE_I_16B) {
|
||||||
components = 1;
|
components = 1;
|
||||||
color_space = OPJ_CLRSPC_GRAY;
|
color_space = OPJ_CLRSPC_GRAY;
|
||||||
pack = j2k_pack_i16;
|
pack = j2k_pack_i16;
|
||||||
prec = 16;
|
prec = 16;
|
||||||
} else if (strcmp(im->mode, "LA") == 0) {
|
} else if (im->mode == IMAGING_MODE_LA) {
|
||||||
components = 2;
|
components = 2;
|
||||||
color_space = OPJ_CLRSPC_GRAY;
|
color_space = OPJ_CLRSPC_GRAY;
|
||||||
pack = j2k_pack_la;
|
pack = j2k_pack_la;
|
||||||
} else if (strcmp(im->mode, "RGB") == 0) {
|
} else if (im->mode == IMAGING_MODE_RGB) {
|
||||||
components = 3;
|
components = 3;
|
||||||
color_space = OPJ_CLRSPC_SRGB;
|
color_space = OPJ_CLRSPC_SRGB;
|
||||||
pack = j2k_pack_rgb;
|
pack = j2k_pack_rgb;
|
||||||
} else if (strcmp(im->mode, "YCbCr") == 0) {
|
} else if (im->mode == IMAGING_MODE_YCbCr) {
|
||||||
components = 3;
|
components = 3;
|
||||||
color_space = OPJ_CLRSPC_SYCC;
|
color_space = OPJ_CLRSPC_SYCC;
|
||||||
pack = j2k_pack_rgb;
|
pack = j2k_pack_rgb;
|
||||||
} else if (strcmp(im->mode, "RGBA") == 0) {
|
} else if (im->mode == IMAGING_MODE_RGBA) {
|
||||||
components = 4;
|
components = 4;
|
||||||
color_space = OPJ_CLRSPC_SRGB;
|
color_space = OPJ_CLRSPC_SRGB;
|
||||||
pack = j2k_pack_rgba;
|
pack = j2k_pack_rgba;
|
||||||
#if ((OPJ_VERSION_MAJOR == 2 && OPJ_VERSION_MINOR == 5 && OPJ_VERSION_BUILD >= 3) || \
|
#if ((OPJ_VERSION_MAJOR == 2 && OPJ_VERSION_MINOR == 5 && OPJ_VERSION_BUILD >= 3) || \
|
||||||
(OPJ_VERSION_MAJOR == 2 && OPJ_VERSION_MINOR > 5) || OPJ_VERSION_MAJOR > 2)
|
(OPJ_VERSION_MAJOR == 2 && OPJ_VERSION_MINOR > 5) || OPJ_VERSION_MAJOR > 2)
|
||||||
} else if (strcmp(im->mode, "CMYK") == 0) {
|
} else if (im->mode == IMAGING_MODE_CMYK) {
|
||||||
components = 4;
|
components = 4;
|
||||||
color_space = OPJ_CLRSPC_CMYK;
|
color_space = OPJ_CLRSPC_CMYK;
|
||||||
pack = j2k_pack_rgba;
|
pack = j2k_pack_rgba;
|
||||||
|
@ -497,9 +497,9 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) {
|
||||||
goto quick_exit;
|
goto quick_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(im->mode, "RGBA") == 0) {
|
if (im->mode == IMAGING_MODE_RGBA) {
|
||||||
image->comps[3].alpha = 1;
|
image->comps[3].alpha = 1;
|
||||||
} else if (strcmp(im->mode, "LA") == 0) {
|
} else if (im->mode == IMAGING_MODE_LA) {
|
||||||
image->comps[1].alpha = 1;
|
image->comps[1].alpha = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,41 +180,41 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t by
|
||||||
|
|
||||||
/* Decoder settings */
|
/* Decoder settings */
|
||||||
|
|
||||||
/* jpegmode indicates what's in the file; if not set, we'll
|
/* jpegmode indicates what's in the file. */
|
||||||
trust the decoder */
|
/* If not valid, we'll trust the decoder. */
|
||||||
if (strcmp(context->jpegmode, "L") == 0) {
|
if (context->jpegmode == IMAGING_RAWMODE_L) {
|
||||||
context->cinfo.jpeg_color_space = JCS_GRAYSCALE;
|
context->cinfo.jpeg_color_space = JCS_GRAYSCALE;
|
||||||
} else if (strcmp(context->jpegmode, "RGB") == 0) {
|
} else if (context->jpegmode == IMAGING_RAWMODE_RGB) {
|
||||||
context->cinfo.jpeg_color_space = JCS_RGB;
|
context->cinfo.jpeg_color_space = JCS_RGB;
|
||||||
} else if (strcmp(context->jpegmode, "CMYK") == 0) {
|
} else if (context->jpegmode == IMAGING_RAWMODE_CMYK) {
|
||||||
context->cinfo.jpeg_color_space = JCS_CMYK;
|
context->cinfo.jpeg_color_space = JCS_CMYK;
|
||||||
} else if (strcmp(context->jpegmode, "YCbCr") == 0) {
|
} else if (context->jpegmode == IMAGING_RAWMODE_YCbCr) {
|
||||||
context->cinfo.jpeg_color_space = JCS_YCbCr;
|
context->cinfo.jpeg_color_space = JCS_YCbCr;
|
||||||
} else if (strcmp(context->jpegmode, "YCbCrK") == 0) {
|
} else if (context->jpegmode == IMAGING_RAWMODE_YCbCrK) {
|
||||||
context->cinfo.jpeg_color_space = JCS_YCCK;
|
context->cinfo.jpeg_color_space = JCS_YCCK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rawmode indicates what we want from the decoder. if not
|
/* rawmode indicates what we want from the decoder. */
|
||||||
set, conversions are disabled */
|
/* If not valid, conversions are disabled. */
|
||||||
if (strcmp(context->rawmode, "L") == 0) {
|
if (context->rawmode == IMAGING_RAWMODE_L) {
|
||||||
context->cinfo.out_color_space = JCS_GRAYSCALE;
|
context->cinfo.out_color_space = JCS_GRAYSCALE;
|
||||||
} else if (strcmp(context->rawmode, "RGB") == 0) {
|
} else if (context->rawmode == IMAGING_RAWMODE_RGB) {
|
||||||
context->cinfo.out_color_space = JCS_RGB;
|
context->cinfo.out_color_space = JCS_RGB;
|
||||||
}
|
}
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
else if (strcmp(context->rawmode, "RGBX") == 0) {
|
else if (context->rawmode == IMAGING_RAWMODE_RGBX) {
|
||||||
context->cinfo.out_color_space = JCS_EXT_RGBX;
|
context->cinfo.out_color_space = JCS_EXT_RGBX;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (strcmp(context->rawmode, "CMYK") == 0 ||
|
else if (context->rawmode == IMAGING_RAWMODE_CMYK ||
|
||||||
strcmp(context->rawmode, "CMYK;I") == 0) {
|
context->rawmode == IMAGING_RAWMODE_CMYK_I) {
|
||||||
context->cinfo.out_color_space = JCS_CMYK;
|
context->cinfo.out_color_space = JCS_CMYK;
|
||||||
} else if (strcmp(context->rawmode, "YCbCr") == 0) {
|
} else if (context->rawmode == IMAGING_RAWMODE_YCbCr) {
|
||||||
context->cinfo.out_color_space = JCS_YCbCr;
|
context->cinfo.out_color_space = JCS_YCbCr;
|
||||||
} else if (strcmp(context->rawmode, "YCbCrK") == 0) {
|
} else if (context->rawmode == IMAGING_RAWMODE_YCbCrK) {
|
||||||
context->cinfo.out_color_space = JCS_YCCK;
|
context->cinfo.out_color_space = JCS_YCCK;
|
||||||
} else {
|
} else {
|
||||||
/* Disable decoder conversions */
|
/* Disable decoder conversions. */
|
||||||
context->cinfo.jpeg_color_space = JCS_UNKNOWN;
|
context->cinfo.jpeg_color_space = JCS_UNKNOWN;
|
||||||
context->cinfo.out_color_space = JCS_UNKNOWN;
|
context->cinfo.out_color_space = JCS_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
context->cinfo.input_components = 3;
|
context->cinfo.input_components = 3;
|
||||||
if (strcmp(im->mode, "YCbCr") == 0) {
|
if (im->mode == IMAGING_MODE_YCbCr) {
|
||||||
context->cinfo.in_color_space = JCS_YCbCr;
|
context->cinfo.in_color_space = JCS_YCbCr;
|
||||||
} else {
|
} else {
|
||||||
context->cinfo.in_color_space = JCS_RGB;
|
context->cinfo.in_color_space = JCS_RGB;
|
||||||
|
@ -124,7 +124,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
|
||||||
context->cinfo.input_components = 4;
|
context->cinfo.input_components = 4;
|
||||||
context->cinfo.in_color_space = JCS_CMYK;
|
context->cinfo.in_color_space = JCS_CMYK;
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
if (strcmp(context->rawmode, "RGBX") == 0) {
|
if (context->rawmode == IMAGING_RAWMODE_RGBX) {
|
||||||
context->cinfo.in_color_space = JCS_EXT_RGBX;
|
context->cinfo.in_color_space = JCS_EXT_RGBX;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8)v)
|
#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8)v)
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingConvertMatrix(Imaging im, const char *mode, float m[]) {
|
ImagingConvertMatrix(Imaging im, const ModeID mode, float m[]) {
|
||||||
Imaging imOut;
|
Imaging imOut;
|
||||||
int x, y;
|
int x, y;
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
|
@ -28,8 +28,8 @@ ImagingConvertMatrix(Imaging im, const char *mode, float m[]) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, "L") == 0) {
|
if (mode == IMAGING_MODE_L) {
|
||||||
imOut = ImagingNewDirty("L", im->xsize, im->ysize);
|
imOut = ImagingNewDirty(IMAGING_MODE_L, im->xsize, im->ysize);
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ ImagingConvertMatrix(Imaging im, const char *mode, float m[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (mode == IMAGING_MODE_HSV || mode == IMAGING_MODE_LAB ||
|
||||||
} else if (strlen(mode) == 3) {
|
mode == IMAGING_MODE_RGB) {
|
||||||
imOut = ImagingNewDirty(mode, im->xsize, im->ysize);
|
imOut = ImagingNewDirty(mode, im->xsize, im->ysize);
|
||||||
if (!imOut) {
|
if (!imOut) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
264
src/libImaging/Mode.c
Normal file
264
src/libImaging/Mode.c
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
#include "Mode.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef NDEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const ModeData MODES[] = {
|
||||||
|
[IMAGING_MODE_UNKNOWN] = {""},
|
||||||
|
|
||||||
|
[IMAGING_MODE_1] = {"1"}, [IMAGING_MODE_CMYK] = {"CMYK"},
|
||||||
|
[IMAGING_MODE_F] = {"F"}, [IMAGING_MODE_HSV] = {"HSV"},
|
||||||
|
[IMAGING_MODE_I] = {"I"}, [IMAGING_MODE_L] = {"L"},
|
||||||
|
[IMAGING_MODE_LA] = {"LA"}, [IMAGING_MODE_LAB] = {"LAB"},
|
||||||
|
[IMAGING_MODE_La] = {"La"}, [IMAGING_MODE_P] = {"P"},
|
||||||
|
[IMAGING_MODE_PA] = {"PA"}, [IMAGING_MODE_RGB] = {"RGB"},
|
||||||
|
[IMAGING_MODE_RGBA] = {"RGBA"}, [IMAGING_MODE_RGBX] = {"RGBX"},
|
||||||
|
[IMAGING_MODE_RGBa] = {"RGBa"}, [IMAGING_MODE_YCbCr] = {"YCbCr"},
|
||||||
|
|
||||||
|
[IMAGING_MODE_BGR_15] = {"BGR;15"}, [IMAGING_MODE_BGR_16] = {"BGR;16"},
|
||||||
|
[IMAGING_MODE_BGR_24] = {"BGR;24"},
|
||||||
|
|
||||||
|
[IMAGING_MODE_I_16] = {"I;16"}, [IMAGING_MODE_I_16L] = {"I;16L"},
|
||||||
|
[IMAGING_MODE_I_16B] = {"I;16B"}, [IMAGING_MODE_I_16N] = {"I;16N"},
|
||||||
|
[IMAGING_MODE_I_32L] = {"I;32L"}, [IMAGING_MODE_I_32B] = {"I;32B"},
|
||||||
|
};
|
||||||
|
|
||||||
|
const ModeID
|
||||||
|
findModeID(const char *const name) {
|
||||||
|
if (name == NULL) {
|
||||||
|
return IMAGING_MODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < sizeof(MODES) / sizeof(*MODES); i++) {
|
||||||
|
#ifdef NDEBUG
|
||||||
|
if (MODES[i].name == NULL) {
|
||||||
|
fprintf(stderr, "Mode ID %zu is not defined.\n", (size_t)i);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
if (strcmp(MODES[i].name, name) == 0) {
|
||||||
|
return (ModeID)i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return IMAGING_MODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ModeData *const
|
||||||
|
getModeData(const ModeID id) {
|
||||||
|
if (id < 0 || id > sizeof(MODES) / sizeof(*MODES)) {
|
||||||
|
return &MODES[IMAGING_MODE_UNKNOWN];
|
||||||
|
}
|
||||||
|
return &MODES[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
const RawModeData RAWMODES[] = {
|
||||||
|
[IMAGING_RAWMODE_UNKNOWN] = {""},
|
||||||
|
|
||||||
|
[IMAGING_RAWMODE_1] = {"1"},
|
||||||
|
[IMAGING_RAWMODE_CMYK] = {"CMYK"},
|
||||||
|
[IMAGING_RAWMODE_F] = {"F"},
|
||||||
|
[IMAGING_RAWMODE_HSV] = {"HSV"},
|
||||||
|
[IMAGING_RAWMODE_I] = {"I"},
|
||||||
|
[IMAGING_RAWMODE_L] = {"L"},
|
||||||
|
[IMAGING_RAWMODE_LA] = {"LA"},
|
||||||
|
[IMAGING_RAWMODE_LAB] = {"LAB"},
|
||||||
|
[IMAGING_RAWMODE_La] = {"La"},
|
||||||
|
[IMAGING_RAWMODE_P] = {"P"},
|
||||||
|
[IMAGING_RAWMODE_PA] = {"PA"},
|
||||||
|
[IMAGING_RAWMODE_RGB] = {"RGB"},
|
||||||
|
[IMAGING_RAWMODE_RGBA] = {"RGBA"},
|
||||||
|
[IMAGING_RAWMODE_RGBX] = {"RGBX"},
|
||||||
|
[IMAGING_RAWMODE_RGBa] = {"RGBa"},
|
||||||
|
[IMAGING_RAWMODE_YCbCr] = {"YCbCr"},
|
||||||
|
|
||||||
|
[IMAGING_RAWMODE_BGR_15] = {"BGR;15"},
|
||||||
|
[IMAGING_RAWMODE_BGR_16] = {"BGR;16"},
|
||||||
|
[IMAGING_RAWMODE_BGR_24] = {"BGR;24"},
|
||||||
|
[IMAGING_RAWMODE_BGR_32] = {"BGR;32"},
|
||||||
|
|
||||||
|
[IMAGING_RAWMODE_I_16] = {"I;16"},
|
||||||
|
[IMAGING_RAWMODE_I_16L] = {"I;16L"},
|
||||||
|
[IMAGING_RAWMODE_I_16B] = {"I;16B"},
|
||||||
|
[IMAGING_RAWMODE_I_16N] = {"I;16N"},
|
||||||
|
[IMAGING_RAWMODE_I_32L] = {"I;32L"},
|
||||||
|
[IMAGING_RAWMODE_I_32B] = {"I;32B"},
|
||||||
|
|
||||||
|
[IMAGING_RAWMODE_1_8] = {"1;8"},
|
||||||
|
[IMAGING_RAWMODE_1_I] = {"1;I"},
|
||||||
|
[IMAGING_RAWMODE_1_IR] = {"1;IR"},
|
||||||
|
[IMAGING_RAWMODE_1_R] = {"1;R"},
|
||||||
|
[IMAGING_RAWMODE_A] = {"A"},
|
||||||
|
[IMAGING_RAWMODE_ABGR] = {"ABGR"},
|
||||||
|
[IMAGING_RAWMODE_ARGB] = {"ARGB"},
|
||||||
|
[IMAGING_RAWMODE_A_16B] = {"A;16B"},
|
||||||
|
[IMAGING_RAWMODE_A_16L] = {"A;16L"},
|
||||||
|
[IMAGING_RAWMODE_A_16N] = {"A;16N"},
|
||||||
|
[IMAGING_RAWMODE_B] = {"B"},
|
||||||
|
[IMAGING_RAWMODE_BGAR] = {"BGAR"},
|
||||||
|
[IMAGING_RAWMODE_BGR] = {"BGR"},
|
||||||
|
[IMAGING_RAWMODE_BGRA] = {"BGRA"},
|
||||||
|
[IMAGING_RAWMODE_BGRA_15] = {"BGRA;15"},
|
||||||
|
[IMAGING_RAWMODE_BGRA_15Z] = {"BGRA;15Z"},
|
||||||
|
[IMAGING_RAWMODE_BGRA_16B] = {"BGRA;16B"},
|
||||||
|
[IMAGING_RAWMODE_BGRA_16L] = {"BGRA;16L"},
|
||||||
|
[IMAGING_RAWMODE_BGRX] = {"BGRX"},
|
||||||
|
[IMAGING_RAWMODE_BGR_5] = {"BGR;5"},
|
||||||
|
[IMAGING_RAWMODE_BGRa] = {"BGRa"},
|
||||||
|
[IMAGING_RAWMODE_BGXR] = {"BGXR"},
|
||||||
|
[IMAGING_RAWMODE_B_16B] = {"B;16B"},
|
||||||
|
[IMAGING_RAWMODE_B_16L] = {"B;16L"},
|
||||||
|
[IMAGING_RAWMODE_B_16N] = {"B;16N"},
|
||||||
|
[IMAGING_RAWMODE_C] = {"C"},
|
||||||
|
[IMAGING_RAWMODE_CMYKX] = {"CMYKX"},
|
||||||
|
[IMAGING_RAWMODE_CMYKXX] = {"CMYKXX"},
|
||||||
|
[IMAGING_RAWMODE_CMYK_16B] = {"CMYK;16B"},
|
||||||
|
[IMAGING_RAWMODE_CMYK_16L] = {"CMYK;16L"},
|
||||||
|
[IMAGING_RAWMODE_CMYK_16N] = {"CMYK;16N"},
|
||||||
|
[IMAGING_RAWMODE_CMYK_I] = {"CMYK;I"},
|
||||||
|
[IMAGING_RAWMODE_CMYK_L] = {"CMYK;L"},
|
||||||
|
[IMAGING_RAWMODE_C_I] = {"C;I"},
|
||||||
|
[IMAGING_RAWMODE_Cb] = {"Cb"},
|
||||||
|
[IMAGING_RAWMODE_Cr] = {"Cr"},
|
||||||
|
[IMAGING_RAWMODE_F_16] = {"F;16"},
|
||||||
|
[IMAGING_RAWMODE_F_16B] = {"F;16B"},
|
||||||
|
[IMAGING_RAWMODE_F_16BS] = {"F;16BS"},
|
||||||
|
[IMAGING_RAWMODE_F_16N] = {"F;16N"},
|
||||||
|
[IMAGING_RAWMODE_F_16NS] = {"F;16NS"},
|
||||||
|
[IMAGING_RAWMODE_F_16S] = {"F;16S"},
|
||||||
|
[IMAGING_RAWMODE_F_32] = {"F;32"},
|
||||||
|
[IMAGING_RAWMODE_F_32B] = {"F;32B"},
|
||||||
|
[IMAGING_RAWMODE_F_32BF] = {"F;32BF"},
|
||||||
|
[IMAGING_RAWMODE_F_32BS] = {"F;32BS"},
|
||||||
|
[IMAGING_RAWMODE_F_32F] = {"F;32F"},
|
||||||
|
[IMAGING_RAWMODE_F_32N] = {"F;32N"},
|
||||||
|
[IMAGING_RAWMODE_F_32NF] = {"F;32NF"},
|
||||||
|
[IMAGING_RAWMODE_F_32NS] = {"F;32NS"},
|
||||||
|
[IMAGING_RAWMODE_F_32S] = {"F;32S"},
|
||||||
|
[IMAGING_RAWMODE_F_64BF] = {"F;64BF"},
|
||||||
|
[IMAGING_RAWMODE_F_64F] = {"F;64F"},
|
||||||
|
[IMAGING_RAWMODE_F_64NF] = {"F;64NF"},
|
||||||
|
[IMAGING_RAWMODE_F_8] = {"F;8"},
|
||||||
|
[IMAGING_RAWMODE_F_8S] = {"F;8S"},
|
||||||
|
[IMAGING_RAWMODE_G] = {"G"},
|
||||||
|
[IMAGING_RAWMODE_G_16B] = {"G;16B"},
|
||||||
|
[IMAGING_RAWMODE_G_16L] = {"G;16L"},
|
||||||
|
[IMAGING_RAWMODE_G_16N] = {"G;16N"},
|
||||||
|
[IMAGING_RAWMODE_H] = {"H"},
|
||||||
|
[IMAGING_RAWMODE_I_12] = {"I;12"},
|
||||||
|
[IMAGING_RAWMODE_I_16BS] = {"I;16BS"},
|
||||||
|
[IMAGING_RAWMODE_I_16NS] = {"I;16NS"},
|
||||||
|
[IMAGING_RAWMODE_I_16R] = {"I;16R"},
|
||||||
|
[IMAGING_RAWMODE_I_16S] = {"I;16S"},
|
||||||
|
[IMAGING_RAWMODE_I_32] = {"I;32"},
|
||||||
|
[IMAGING_RAWMODE_I_32BS] = {"I;32BS"},
|
||||||
|
[IMAGING_RAWMODE_I_32N] = {"I;32N"},
|
||||||
|
[IMAGING_RAWMODE_I_32NS] = {"I;32NS"},
|
||||||
|
[IMAGING_RAWMODE_I_32S] = {"I;32S"},
|
||||||
|
[IMAGING_RAWMODE_I_8] = {"I;8"},
|
||||||
|
[IMAGING_RAWMODE_I_8S] = {"I;8S"},
|
||||||
|
[IMAGING_RAWMODE_K] = {"K"},
|
||||||
|
[IMAGING_RAWMODE_K_I] = {"K;I"},
|
||||||
|
[IMAGING_RAWMODE_LA_16B] = {"LA;16B"},
|
||||||
|
[IMAGING_RAWMODE_LA_L] = {"LA;L"},
|
||||||
|
[IMAGING_RAWMODE_L_16] = {"L;16"},
|
||||||
|
[IMAGING_RAWMODE_L_16B] = {"L;16B"},
|
||||||
|
[IMAGING_RAWMODE_L_2] = {"L;2"},
|
||||||
|
[IMAGING_RAWMODE_L_2I] = {"L;2I"},
|
||||||
|
[IMAGING_RAWMODE_L_2IR] = {"L;2IR"},
|
||||||
|
[IMAGING_RAWMODE_L_2R] = {"L;2R"},
|
||||||
|
[IMAGING_RAWMODE_L_4] = {"L;4"},
|
||||||
|
[IMAGING_RAWMODE_L_4I] = {"L;4I"},
|
||||||
|
[IMAGING_RAWMODE_L_4IR] = {"L;4IR"},
|
||||||
|
[IMAGING_RAWMODE_L_4R] = {"L;4R"},
|
||||||
|
[IMAGING_RAWMODE_L_I] = {"L;I"},
|
||||||
|
[IMAGING_RAWMODE_L_R] = {"L;R"},
|
||||||
|
[IMAGING_RAWMODE_M] = {"M"},
|
||||||
|
[IMAGING_RAWMODE_M_I] = {"M;I"},
|
||||||
|
[IMAGING_RAWMODE_PA_L] = {"PA;L"},
|
||||||
|
[IMAGING_RAWMODE_PX] = {"PX"},
|
||||||
|
[IMAGING_RAWMODE_P_1] = {"P;1"},
|
||||||
|
[IMAGING_RAWMODE_P_2] = {"P;2"},
|
||||||
|
[IMAGING_RAWMODE_P_2L] = {"P;2L"},
|
||||||
|
[IMAGING_RAWMODE_P_4] = {"P;4"},
|
||||||
|
[IMAGING_RAWMODE_P_4L] = {"P;4L"},
|
||||||
|
[IMAGING_RAWMODE_P_R] = {"P;R"},
|
||||||
|
[IMAGING_RAWMODE_R] = {"R"},
|
||||||
|
[IMAGING_RAWMODE_RGBAX] = {"RGBAX"},
|
||||||
|
[IMAGING_RAWMODE_RGBAXX] = {"RGBAXX"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_15] = {"RGBA;15"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_16B] = {"RGBA;16B"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_16L] = {"RGBA;16L"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_16N] = {"RGBA;16N"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_4B] = {"RGBA;4B"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_I] = {"RGBA;I"},
|
||||||
|
[IMAGING_RAWMODE_RGBA_L] = {"RGBA;L"},
|
||||||
|
[IMAGING_RAWMODE_RGBXX] = {"RGBXX"},
|
||||||
|
[IMAGING_RAWMODE_RGBXXX] = {"RGBXXX"},
|
||||||
|
[IMAGING_RAWMODE_RGBX_16B] = {"RGBX;16B"},
|
||||||
|
[IMAGING_RAWMODE_RGBX_16L] = {"RGBX;16L"},
|
||||||
|
[IMAGING_RAWMODE_RGBX_16N] = {"RGBX;16N"},
|
||||||
|
[IMAGING_RAWMODE_RGBX_L] = {"RGBX;L"},
|
||||||
|
[IMAGING_RAWMODE_RGB_15] = {"RGB;15"},
|
||||||
|
[IMAGING_RAWMODE_RGB_16] = {"RGB;16"},
|
||||||
|
[IMAGING_RAWMODE_RGB_16B] = {"RGB;16B"},
|
||||||
|
[IMAGING_RAWMODE_RGB_16L] = {"RGB;16L"},
|
||||||
|
[IMAGING_RAWMODE_RGB_16N] = {"RGB;16N"},
|
||||||
|
[IMAGING_RAWMODE_RGB_4B] = {"RGB;4B"},
|
||||||
|
[IMAGING_RAWMODE_RGB_L] = {"RGB;L"},
|
||||||
|
[IMAGING_RAWMODE_RGB_R] = {"RGB;R"},
|
||||||
|
[IMAGING_RAWMODE_RGBaX] = {"RGBaX"},
|
||||||
|
[IMAGING_RAWMODE_RGBaXX] = {"RGBaXX"},
|
||||||
|
[IMAGING_RAWMODE_RGBa_16B] = {"RGBa;16B"},
|
||||||
|
[IMAGING_RAWMODE_RGBa_16L] = {"RGBa;16L"},
|
||||||
|
[IMAGING_RAWMODE_RGBa_16N] = {"RGBa;16N"},
|
||||||
|
[IMAGING_RAWMODE_R_16B] = {"R;16B"},
|
||||||
|
[IMAGING_RAWMODE_R_16L] = {"R;16L"},
|
||||||
|
[IMAGING_RAWMODE_R_16N] = {"R;16N"},
|
||||||
|
[IMAGING_RAWMODE_S] = {"S"},
|
||||||
|
[IMAGING_RAWMODE_V] = {"V"},
|
||||||
|
[IMAGING_RAWMODE_X] = {"X"},
|
||||||
|
[IMAGING_RAWMODE_XBGR] = {"XBGR"},
|
||||||
|
[IMAGING_RAWMODE_XRGB] = {"XRGB"},
|
||||||
|
[IMAGING_RAWMODE_Y] = {"Y"},
|
||||||
|
[IMAGING_RAWMODE_YCCA_P] = {"YCCA;P"},
|
||||||
|
[IMAGING_RAWMODE_YCC_P] = {"YCC;P"},
|
||||||
|
[IMAGING_RAWMODE_YCbCrK] = {"YCbCrK"},
|
||||||
|
[IMAGING_RAWMODE_YCbCrX] = {"YCbCrX"},
|
||||||
|
[IMAGING_RAWMODE_YCbCr_L] = {"YCbCr;L"},
|
||||||
|
[IMAGING_RAWMODE_Y_I] = {"Y;I"},
|
||||||
|
[IMAGING_RAWMODE_aBGR] = {"aBGR"},
|
||||||
|
[IMAGING_RAWMODE_aRGB] = {"aRGB"},
|
||||||
|
};
|
||||||
|
|
||||||
|
const RawModeID
|
||||||
|
findRawModeID(const char *const name) {
|
||||||
|
if (name == NULL) {
|
||||||
|
return IMAGING_RAWMODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < sizeof(RAWMODES) / sizeof(*RAWMODES); i++) {
|
||||||
|
#ifdef NDEBUG
|
||||||
|
if (RAWMODES[i].name == NULL) {
|
||||||
|
fprintf(stderr, "Rawmode ID %zu is not defined.\n", (size_t)i);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
if (strcmp(RAWMODES[i].name, name) == 0) {
|
||||||
|
return (RawModeID)i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return IMAGING_RAWMODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const RawModeData *const
|
||||||
|
getRawModeData(const RawModeID id) {
|
||||||
|
if (id < 0 || id > sizeof(RAWMODES) / sizeof(*RAWMODES)) {
|
||||||
|
return &RAWMODES[IMAGING_RAWMODE_UNKNOWN];
|
||||||
|
}
|
||||||
|
return &RAWMODES[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
isModeI16(const ModeID mode) {
|
||||||
|
return mode == IMAGING_MODE_I_16 || mode == IMAGING_MODE_I_16L ||
|
||||||
|
mode == IMAGING_MODE_I_16B || mode == IMAGING_MODE_I_16N;
|
||||||
|
}
|
240
src/libImaging/Mode.h
Normal file
240
src/libImaging/Mode.h
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
#ifndef __MODE_H__
|
||||||
|
#define __MODE_H__
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IMAGING_MODE_UNKNOWN,
|
||||||
|
|
||||||
|
IMAGING_MODE_1,
|
||||||
|
IMAGING_MODE_CMYK,
|
||||||
|
IMAGING_MODE_F,
|
||||||
|
IMAGING_MODE_HSV,
|
||||||
|
IMAGING_MODE_I,
|
||||||
|
IMAGING_MODE_L,
|
||||||
|
IMAGING_MODE_LA,
|
||||||
|
IMAGING_MODE_LAB,
|
||||||
|
IMAGING_MODE_La,
|
||||||
|
IMAGING_MODE_P,
|
||||||
|
IMAGING_MODE_PA,
|
||||||
|
IMAGING_MODE_RGB,
|
||||||
|
IMAGING_MODE_RGBA,
|
||||||
|
IMAGING_MODE_RGBX,
|
||||||
|
IMAGING_MODE_RGBa,
|
||||||
|
IMAGING_MODE_YCbCr,
|
||||||
|
|
||||||
|
IMAGING_MODE_BGR_15,
|
||||||
|
IMAGING_MODE_BGR_16,
|
||||||
|
IMAGING_MODE_BGR_24,
|
||||||
|
|
||||||
|
IMAGING_MODE_I_16,
|
||||||
|
IMAGING_MODE_I_16L,
|
||||||
|
IMAGING_MODE_I_16B,
|
||||||
|
IMAGING_MODE_I_16N,
|
||||||
|
IMAGING_MODE_I_32L,
|
||||||
|
IMAGING_MODE_I_32B,
|
||||||
|
} ModeID;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *const name;
|
||||||
|
} ModeData;
|
||||||
|
|
||||||
|
const ModeID
|
||||||
|
findModeID(const char *const name);
|
||||||
|
const ModeData *const
|
||||||
|
getModeData(const ModeID id);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IMAGING_RAWMODE_UNKNOWN,
|
||||||
|
|
||||||
|
// Non-rawmode aliases.
|
||||||
|
IMAGING_RAWMODE_1,
|
||||||
|
IMAGING_RAWMODE_CMYK,
|
||||||
|
IMAGING_RAWMODE_F,
|
||||||
|
IMAGING_RAWMODE_HSV,
|
||||||
|
IMAGING_RAWMODE_I,
|
||||||
|
IMAGING_RAWMODE_L,
|
||||||
|
IMAGING_RAWMODE_LA,
|
||||||
|
IMAGING_RAWMODE_LAB,
|
||||||
|
IMAGING_RAWMODE_La,
|
||||||
|
IMAGING_RAWMODE_P,
|
||||||
|
IMAGING_RAWMODE_PA,
|
||||||
|
IMAGING_RAWMODE_RGB,
|
||||||
|
IMAGING_RAWMODE_RGBA,
|
||||||
|
IMAGING_RAWMODE_RGBX,
|
||||||
|
IMAGING_RAWMODE_RGBa,
|
||||||
|
IMAGING_RAWMODE_YCbCr,
|
||||||
|
|
||||||
|
// BGR modes.
|
||||||
|
IMAGING_RAWMODE_BGR_15,
|
||||||
|
IMAGING_RAWMODE_BGR_16,
|
||||||
|
IMAGING_RAWMODE_BGR_24,
|
||||||
|
IMAGING_RAWMODE_BGR_32,
|
||||||
|
|
||||||
|
// I;* modes.
|
||||||
|
IMAGING_RAWMODE_I_16,
|
||||||
|
IMAGING_RAWMODE_I_16L,
|
||||||
|
IMAGING_RAWMODE_I_16B,
|
||||||
|
IMAGING_RAWMODE_I_16N,
|
||||||
|
IMAGING_RAWMODE_I_32L,
|
||||||
|
IMAGING_RAWMODE_I_32B,
|
||||||
|
|
||||||
|
// Rawmodes
|
||||||
|
IMAGING_RAWMODE_1_8,
|
||||||
|
IMAGING_RAWMODE_1_I,
|
||||||
|
IMAGING_RAWMODE_1_IR,
|
||||||
|
IMAGING_RAWMODE_1_R,
|
||||||
|
IMAGING_RAWMODE_A,
|
||||||
|
IMAGING_RAWMODE_ABGR,
|
||||||
|
IMAGING_RAWMODE_ARGB,
|
||||||
|
IMAGING_RAWMODE_A_16B,
|
||||||
|
IMAGING_RAWMODE_A_16L,
|
||||||
|
IMAGING_RAWMODE_A_16N,
|
||||||
|
IMAGING_RAWMODE_B,
|
||||||
|
IMAGING_RAWMODE_BGAR,
|
||||||
|
IMAGING_RAWMODE_BGR,
|
||||||
|
IMAGING_RAWMODE_BGRA,
|
||||||
|
IMAGING_RAWMODE_BGRA_15,
|
||||||
|
IMAGING_RAWMODE_BGRA_15Z,
|
||||||
|
IMAGING_RAWMODE_BGRA_16B,
|
||||||
|
IMAGING_RAWMODE_BGRA_16L,
|
||||||
|
IMAGING_RAWMODE_BGRX,
|
||||||
|
IMAGING_RAWMODE_BGR_5,
|
||||||
|
IMAGING_RAWMODE_BGRa,
|
||||||
|
IMAGING_RAWMODE_BGXR,
|
||||||
|
IMAGING_RAWMODE_B_16B,
|
||||||
|
IMAGING_RAWMODE_B_16L,
|
||||||
|
IMAGING_RAWMODE_B_16N,
|
||||||
|
IMAGING_RAWMODE_C,
|
||||||
|
IMAGING_RAWMODE_CMYKX,
|
||||||
|
IMAGING_RAWMODE_CMYKXX,
|
||||||
|
IMAGING_RAWMODE_CMYK_16B,
|
||||||
|
IMAGING_RAWMODE_CMYK_16L,
|
||||||
|
IMAGING_RAWMODE_CMYK_16N,
|
||||||
|
IMAGING_RAWMODE_CMYK_I,
|
||||||
|
IMAGING_RAWMODE_CMYK_L,
|
||||||
|
IMAGING_RAWMODE_C_I,
|
||||||
|
IMAGING_RAWMODE_Cb,
|
||||||
|
IMAGING_RAWMODE_Cr,
|
||||||
|
IMAGING_RAWMODE_F_16,
|
||||||
|
IMAGING_RAWMODE_F_16B,
|
||||||
|
IMAGING_RAWMODE_F_16BS,
|
||||||
|
IMAGING_RAWMODE_F_16N,
|
||||||
|
IMAGING_RAWMODE_F_16NS,
|
||||||
|
IMAGING_RAWMODE_F_16S,
|
||||||
|
IMAGING_RAWMODE_F_32,
|
||||||
|
IMAGING_RAWMODE_F_32B,
|
||||||
|
IMAGING_RAWMODE_F_32BF,
|
||||||
|
IMAGING_RAWMODE_F_32BS,
|
||||||
|
IMAGING_RAWMODE_F_32F,
|
||||||
|
IMAGING_RAWMODE_F_32N,
|
||||||
|
IMAGING_RAWMODE_F_32NF,
|
||||||
|
IMAGING_RAWMODE_F_32NS,
|
||||||
|
IMAGING_RAWMODE_F_32S,
|
||||||
|
IMAGING_RAWMODE_F_64BF,
|
||||||
|
IMAGING_RAWMODE_F_64F,
|
||||||
|
IMAGING_RAWMODE_F_64NF,
|
||||||
|
IMAGING_RAWMODE_F_8,
|
||||||
|
IMAGING_RAWMODE_F_8S,
|
||||||
|
IMAGING_RAWMODE_G,
|
||||||
|
IMAGING_RAWMODE_G_16B,
|
||||||
|
IMAGING_RAWMODE_G_16L,
|
||||||
|
IMAGING_RAWMODE_G_16N,
|
||||||
|
IMAGING_RAWMODE_H,
|
||||||
|
IMAGING_RAWMODE_I_12,
|
||||||
|
IMAGING_RAWMODE_I_16BS,
|
||||||
|
IMAGING_RAWMODE_I_16NS,
|
||||||
|
IMAGING_RAWMODE_I_16R,
|
||||||
|
IMAGING_RAWMODE_I_16S,
|
||||||
|
IMAGING_RAWMODE_I_32,
|
||||||
|
IMAGING_RAWMODE_I_32BS,
|
||||||
|
IMAGING_RAWMODE_I_32N,
|
||||||
|
IMAGING_RAWMODE_I_32NS,
|
||||||
|
IMAGING_RAWMODE_I_32S,
|
||||||
|
IMAGING_RAWMODE_I_8,
|
||||||
|
IMAGING_RAWMODE_I_8S,
|
||||||
|
IMAGING_RAWMODE_K,
|
||||||
|
IMAGING_RAWMODE_K_I,
|
||||||
|
IMAGING_RAWMODE_LA_16B,
|
||||||
|
IMAGING_RAWMODE_LA_L,
|
||||||
|
IMAGING_RAWMODE_L_16,
|
||||||
|
IMAGING_RAWMODE_L_16B,
|
||||||
|
IMAGING_RAWMODE_L_2,
|
||||||
|
IMAGING_RAWMODE_L_2I,
|
||||||
|
IMAGING_RAWMODE_L_2IR,
|
||||||
|
IMAGING_RAWMODE_L_2R,
|
||||||
|
IMAGING_RAWMODE_L_4,
|
||||||
|
IMAGING_RAWMODE_L_4I,
|
||||||
|
IMAGING_RAWMODE_L_4IR,
|
||||||
|
IMAGING_RAWMODE_L_4R,
|
||||||
|
IMAGING_RAWMODE_L_I,
|
||||||
|
IMAGING_RAWMODE_L_R,
|
||||||
|
IMAGING_RAWMODE_M,
|
||||||
|
IMAGING_RAWMODE_M_I,
|
||||||
|
IMAGING_RAWMODE_PA_L,
|
||||||
|
IMAGING_RAWMODE_PX,
|
||||||
|
IMAGING_RAWMODE_P_1,
|
||||||
|
IMAGING_RAWMODE_P_2,
|
||||||
|
IMAGING_RAWMODE_P_2L,
|
||||||
|
IMAGING_RAWMODE_P_4,
|
||||||
|
IMAGING_RAWMODE_P_4L,
|
||||||
|
IMAGING_RAWMODE_P_R,
|
||||||
|
IMAGING_RAWMODE_R,
|
||||||
|
IMAGING_RAWMODE_RGBAX,
|
||||||
|
IMAGING_RAWMODE_RGBAXX,
|
||||||
|
IMAGING_RAWMODE_RGBA_15,
|
||||||
|
IMAGING_RAWMODE_RGBA_16B,
|
||||||
|
IMAGING_RAWMODE_RGBA_16L,
|
||||||
|
IMAGING_RAWMODE_RGBA_16N,
|
||||||
|
IMAGING_RAWMODE_RGBA_4B,
|
||||||
|
IMAGING_RAWMODE_RGBA_I,
|
||||||
|
IMAGING_RAWMODE_RGBA_L,
|
||||||
|
IMAGING_RAWMODE_RGBXX,
|
||||||
|
IMAGING_RAWMODE_RGBXXX,
|
||||||
|
IMAGING_RAWMODE_RGBX_16B,
|
||||||
|
IMAGING_RAWMODE_RGBX_16L,
|
||||||
|
IMAGING_RAWMODE_RGBX_16N,
|
||||||
|
IMAGING_RAWMODE_RGBX_L,
|
||||||
|
IMAGING_RAWMODE_RGB_15,
|
||||||
|
IMAGING_RAWMODE_RGB_16,
|
||||||
|
IMAGING_RAWMODE_RGB_16B,
|
||||||
|
IMAGING_RAWMODE_RGB_16L,
|
||||||
|
IMAGING_RAWMODE_RGB_16N,
|
||||||
|
IMAGING_RAWMODE_RGB_4B,
|
||||||
|
IMAGING_RAWMODE_RGB_L,
|
||||||
|
IMAGING_RAWMODE_RGB_R,
|
||||||
|
IMAGING_RAWMODE_RGBaX,
|
||||||
|
IMAGING_RAWMODE_RGBaXX,
|
||||||
|
IMAGING_RAWMODE_RGBa_16B,
|
||||||
|
IMAGING_RAWMODE_RGBa_16L,
|
||||||
|
IMAGING_RAWMODE_RGBa_16N,
|
||||||
|
IMAGING_RAWMODE_R_16B,
|
||||||
|
IMAGING_RAWMODE_R_16L,
|
||||||
|
IMAGING_RAWMODE_R_16N,
|
||||||
|
IMAGING_RAWMODE_S,
|
||||||
|
IMAGING_RAWMODE_V,
|
||||||
|
IMAGING_RAWMODE_X,
|
||||||
|
IMAGING_RAWMODE_XBGR,
|
||||||
|
IMAGING_RAWMODE_XRGB,
|
||||||
|
IMAGING_RAWMODE_Y,
|
||||||
|
IMAGING_RAWMODE_YCCA_P,
|
||||||
|
IMAGING_RAWMODE_YCC_P,
|
||||||
|
IMAGING_RAWMODE_YCbCrK,
|
||||||
|
IMAGING_RAWMODE_YCbCrX,
|
||||||
|
IMAGING_RAWMODE_YCbCr_L,
|
||||||
|
IMAGING_RAWMODE_Y_I,
|
||||||
|
IMAGING_RAWMODE_aBGR,
|
||||||
|
IMAGING_RAWMODE_aRGB,
|
||||||
|
} RawModeID;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *const name;
|
||||||
|
} RawModeData;
|
||||||
|
|
||||||
|
const RawModeID
|
||||||
|
findRawModeID(const char *const name);
|
||||||
|
const RawModeData *const
|
||||||
|
getRawModeData(const RawModeID id);
|
||||||
|
|
||||||
|
int
|
||||||
|
isModeI16(const ModeID mode);
|
||||||
|
|
||||||
|
#endif // __MODE_H__
|
|
@ -525,153 +525,147 @@ band3(UINT8 *out, const UINT8 *in, int pixels) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *mode;
|
const ModeID mode;
|
||||||
const char *rawmode;
|
const RawModeID rawmode;
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler pack;
|
ImagingShuffler pack;
|
||||||
} packers[] = {
|
} packers[] = {
|
||||||
|
|
||||||
/* bilevel */
|
/* bilevel */
|
||||||
{"1", "1", 1, pack1},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1, 1, pack1},
|
||||||
{"1", "1;I", 1, pack1I},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_I, 1, pack1I},
|
||||||
{"1", "1;R", 1, pack1R},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_R, 1, pack1R},
|
||||||
{"1", "1;IR", 1, pack1IR},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_IR, 1, pack1IR},
|
||||||
{"1", "L", 8, pack1L},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_L, 8, pack1L},
|
||||||
|
|
||||||
/* grayscale */
|
/* grayscale */
|
||||||
{"L", "L", 8, copy1},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L, 8, copy1},
|
||||||
{"L", "L;16", 16, packL16},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_16, 16, packL16},
|
||||||
{"L", "L;16B", 16, packL16B},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_16B, 16, packL16B},
|
||||||
|
|
||||||
/* grayscale w. alpha */
|
/* grayscale w. alpha */
|
||||||
{"LA", "LA", 16, packLA},
|
{IMAGING_MODE_LA, IMAGING_RAWMODE_LA, 16, packLA},
|
||||||
{"LA", "LA;L", 16, packLAL},
|
{IMAGING_MODE_LA, IMAGING_RAWMODE_LA_L, 16, packLAL},
|
||||||
|
|
||||||
/* grayscale w. alpha premultiplied */
|
/* grayscale w. alpha premultiplied */
|
||||||
{"La", "La", 16, packLA},
|
{IMAGING_MODE_La, IMAGING_RAWMODE_La, 16, packLA},
|
||||||
|
|
||||||
/* palette */
|
/* palette */
|
||||||
{"P", "P;1", 1, pack1},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_1, 1, pack1},
|
||||||
{"P", "P;2", 2, packP2},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_2, 2, packP2},
|
||||||
{"P", "P;4", 4, packP4},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_4, 4, packP4},
|
||||||
{"P", "P", 8, copy1},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P, 8, copy1},
|
||||||
|
|
||||||
/* palette w. alpha */
|
/* palette w. alpha */
|
||||||
{"PA", "PA", 16, packLA},
|
{IMAGING_MODE_PA, IMAGING_RAWMODE_PA, 16, packLA},
|
||||||
{"PA", "PA;L", 16, packLAL},
|
{IMAGING_MODE_PA, IMAGING_RAWMODE_PA_L, 16, packLAL},
|
||||||
|
|
||||||
/* true colour */
|
/* true colour */
|
||||||
{"RGB", "RGB", 24, ImagingPackRGB},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB, 24, ImagingPackRGB},
|
||||||
{"RGB", "RGBX", 32, copy4},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX, 32, copy4},
|
||||||
{"RGB", "RGBA", 32, copy4},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBA, 32, copy4},
|
||||||
{"RGB", "XRGB", 32, ImagingPackXRGB},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_XRGB, 32, ImagingPackXRGB},
|
||||||
{"RGB", "BGR", 24, ImagingPackBGR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGR, 24, ImagingPackBGR},
|
||||||
{"RGB", "BGRX", 32, ImagingPackBGRX},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGRX, 32, ImagingPackBGRX},
|
||||||
{"RGB", "XBGR", 32, ImagingPackXBGR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_XBGR, 32, ImagingPackXBGR},
|
||||||
{"RGB", "RGB;L", 24, packRGBL},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_L, 24, packRGBL},
|
||||||
{"RGB", "R", 8, band0},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGB", "G", 8, band1},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGB", "B", 8, band2},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B, 8, band2},
|
||||||
|
|
||||||
/* true colour w. alpha */
|
/* true colour w. alpha */
|
||||||
{"RGBA", "RGBA", 32, copy4},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA, 32, copy4},
|
||||||
{"RGBA", "RGBA;L", 32, packRGBXL},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_L, 32, packRGBXL},
|
||||||
{"RGBA", "RGB", 24, ImagingPackRGB},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGB, 24, ImagingPackRGB},
|
||||||
{"RGBA", "BGR", 24, ImagingPackBGR},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGR, 24, ImagingPackBGR},
|
||||||
{"RGBA", "BGRA", 32, ImagingPackBGRA},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA, 32, ImagingPackBGRA},
|
||||||
{"RGBA", "ABGR", 32, ImagingPackABGR},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_ABGR, 32, ImagingPackABGR},
|
||||||
{"RGBA", "BGRa", 32, ImagingPackBGRa},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRa, 32, ImagingPackBGRa},
|
||||||
{"RGBA", "R", 8, band0},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGBA", "G", 8, band1},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGBA", "B", 8, band2},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B, 8, band2},
|
||||||
{"RGBA", "A", 8, band3},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A, 8, band3},
|
||||||
|
|
||||||
/* true colour w. alpha premultiplied */
|
/* true colour w. alpha premultiplied */
|
||||||
{"RGBa", "RGBa", 32, copy4},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_RGBa, 32, copy4},
|
||||||
{"RGBa", "BGRa", 32, ImagingPackBGRA},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_BGRa, 32, ImagingPackBGRA},
|
||||||
{"RGBa", "aBGR", 32, ImagingPackABGR},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_aBGR, 32, ImagingPackABGR},
|
||||||
|
|
||||||
/* true colour w. padding */
|
/* true colour w. padding */
|
||||||
{"RGBX", "RGBX", 32, copy4},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX, 32, copy4},
|
||||||
{"RGBX", "RGBX;L", 32, packRGBXL},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_L, 32, packRGBXL},
|
||||||
{"RGBX", "RGB", 24, ImagingPackRGB},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB, 24, ImagingPackRGB},
|
||||||
{"RGBX", "BGR", 24, ImagingPackBGR},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGR, 24, ImagingPackBGR},
|
||||||
{"RGBX", "BGRX", 32, ImagingPackBGRX},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGRX, 32, ImagingPackBGRX},
|
||||||
{"RGBX", "XBGR", 32, ImagingPackXBGR},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_XBGR, 32, ImagingPackXBGR},
|
||||||
{"RGBX", "R", 8, band0},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGBX", "G", 8, band1},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGBX", "B", 8, band2},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_B, 8, band2},
|
||||||
{"RGBX", "X", 8, band3},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_X, 8, band3},
|
||||||
|
|
||||||
/* colour separation */
|
/* colour separation */
|
||||||
{"CMYK", "CMYK", 32, copy4},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK, 32, copy4},
|
||||||
{"CMYK", "CMYK;I", 32, copy4I},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_I, 32, copy4I},
|
||||||
{"CMYK", "CMYK;L", 32, packRGBXL},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_L, 32, packRGBXL},
|
||||||
{"CMYK", "C", 8, band0},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_C, 8, band0},
|
||||||
{"CMYK", "M", 8, band1},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_M, 8, band1},
|
||||||
{"CMYK", "Y", 8, band2},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_Y, 8, band2},
|
||||||
{"CMYK", "K", 8, band3},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_K, 8, band3},
|
||||||
|
|
||||||
/* video (YCbCr) */
|
/* video (YCbCr) */
|
||||||
{"YCbCr", "YCbCr", 24, ImagingPackRGB},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCr, 24, ImagingPackRGB},
|
||||||
{"YCbCr", "YCbCr;L", 24, packRGBL},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCr_L, 24, packRGBL},
|
||||||
{"YCbCr", "YCbCrX", 32, copy4},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCrX, 32, copy4},
|
||||||
{"YCbCr", "YCbCrK", 32, copy4},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCrK, 32, copy4},
|
||||||
{"YCbCr", "Y", 8, band0},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_Y, 8, band0},
|
||||||
{"YCbCr", "Cb", 8, band1},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_Cb, 8, band1},
|
||||||
{"YCbCr", "Cr", 8, band2},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_Cr, 8, band2},
|
||||||
|
|
||||||
/* LAB Color */
|
/* LAB Color */
|
||||||
{"LAB", "LAB", 24, ImagingPackLAB},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_LAB, 24, ImagingPackLAB},
|
||||||
{"LAB", "L", 8, band0},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_L, 8, band0},
|
||||||
{"LAB", "A", 8, band1},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_A, 8, band1},
|
||||||
{"LAB", "B", 8, band2},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_B, 8, band2},
|
||||||
|
|
||||||
/* HSV */
|
/* HSV */
|
||||||
{"HSV", "HSV", 24, ImagingPackRGB},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_HSV, 24, ImagingPackRGB},
|
||||||
{"HSV", "H", 8, band0},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_H, 8, band0},
|
||||||
{"HSV", "S", 8, band1},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_S, 8, band1},
|
||||||
{"HSV", "V", 8, band2},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_V, 8, band2},
|
||||||
|
|
||||||
/* integer */
|
/* integer */
|
||||||
{"I", "I", 32, copy4},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I, 32, copy4},
|
||||||
{"I", "I;16B", 16, packI16B},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16B, 16, packI16B},
|
||||||
{"I", "I;32S", 32, packI32S},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32S, 32, packI32S},
|
||||||
{"I", "I;32NS", 32, copy4},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32NS, 32, copy4},
|
||||||
|
|
||||||
/* floating point */
|
/* floating point */
|
||||||
{"F", "F", 32, copy4},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F, 32, copy4},
|
||||||
{"F", "F;32F", 32, packI32S},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32F, 32, packI32S},
|
||||||
{"F", "F;32NF", 32, copy4},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32NF, 32, copy4},
|
||||||
|
|
||||||
/* storage modes */
|
/* storage modes */
|
||||||
{"I;16", "I;16", 16, copy2},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16, 16, copy2},
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
{"I;16", "I;16B", 16, packI16N_I16},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16B, 16, packI16N_I16},
|
||||||
#else
|
#else
|
||||||
{"I;16", "I;16B", 16, packI16N_I16B},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16B, 16, packI16N_I16B},
|
||||||
#endif
|
#endif
|
||||||
{"I;16B", "I;16B", 16, copy2},
|
{IMAGING_MODE_I_16B, IMAGING_RAWMODE_I_16B, 16, copy2},
|
||||||
{"I;16L", "I;16L", 16, copy2},
|
{IMAGING_MODE_I_16L, IMAGING_RAWMODE_I_16L, 16, copy2},
|
||||||
{"I;16N", "I;16N", 16, copy2},
|
{IMAGING_MODE_I_16N, IMAGING_RAWMODE_I_16N, 16, copy2},
|
||||||
{"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian.
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16N, 16, packI16N_I16
|
||||||
{"I;16L", "I;16N", 16, packI16N_I16},
|
}, // LibTiff native->image endian.
|
||||||
{"I;16B", "I;16N", 16, packI16N_I16B},
|
{IMAGING_MODE_I_16L, IMAGING_RAWMODE_I_16N, 16, packI16N_I16},
|
||||||
{"BGR;15", "BGR;15", 16, copy2},
|
{IMAGING_MODE_I_16B, IMAGING_RAWMODE_I_16N, 16, packI16N_I16B},
|
||||||
{"BGR;16", "BGR;16", 16, copy2},
|
{IMAGING_MODE_BGR_15, IMAGING_RAWMODE_BGR_15, 16, copy2},
|
||||||
{"BGR;24", "BGR;24", 24, copy3},
|
{IMAGING_MODE_BGR_16, IMAGING_RAWMODE_BGR_16, 16, copy2},
|
||||||
|
{IMAGING_MODE_BGR_24, IMAGING_RAWMODE_BGR_24, 24, copy3}
|
||||||
{NULL} /* sentinel */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ImagingShuffler
|
ImagingShuffler
|
||||||
ImagingFindPacker(const char *mode, const char *rawmode, int *bits_out) {
|
ImagingFindPacker(const ModeID mode, const RawModeID rawmode, int *bits_out) {
|
||||||
int i;
|
for (size_t i = 0; i < sizeof(packers) / sizeof(*packers); i++) {
|
||||||
|
if (packers[i].mode == mode && packers[i].rawmode == rawmode) {
|
||||||
/* find a suitable pixel packer */
|
|
||||||
for (i = 0; packers[i].rawmode; i++) {
|
|
||||||
if (strcmp(packers[i].mode, mode) == 0 &&
|
|
||||||
strcmp(packers[i].rawmode, rawmode) == 0) {
|
|
||||||
if (bits_out) {
|
if (bits_out) {
|
||||||
*bits_out = packers[i].bits;
|
*bits_out = packers[i].bits;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,13 +21,13 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
ImagingPalette
|
ImagingPalette
|
||||||
ImagingPaletteNew(const char *mode) {
|
ImagingPaletteNew(const ModeID mode) {
|
||||||
/* Create a palette object */
|
/* Create a palette object */
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
ImagingPalette palette;
|
ImagingPalette palette;
|
||||||
|
|
||||||
if (strcmp(mode, "RGB") && strcmp(mode, "RGBA")) {
|
if (mode != IMAGING_MODE_RGB && mode != IMAGING_MODE_RGBA) {
|
||||||
return (ImagingPalette)ImagingError_ModeError();
|
return (ImagingPalette)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,8 +36,7 @@ ImagingPaletteNew(const char *mode) {
|
||||||
return (ImagingPalette)ImagingError_MemoryError();
|
return (ImagingPalette)ImagingError_MemoryError();
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(palette->mode, mode, IMAGING_MODE_LENGTH - 1);
|
palette->mode = mode;
|
||||||
palette->mode[IMAGING_MODE_LENGTH - 1] = 0;
|
|
||||||
|
|
||||||
palette->size = 0;
|
palette->size = 0;
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
|
@ -54,7 +53,7 @@ ImagingPaletteNewBrowser(void) {
|
||||||
int i, r, g, b;
|
int i, r, g, b;
|
||||||
ImagingPalette palette;
|
ImagingPalette palette;
|
||||||
|
|
||||||
palette = ImagingPaletteNew("RGB");
|
palette = ImagingPaletteNew(IMAGING_MODE_RGB);
|
||||||
if (!palette) {
|
if (!palette) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,8 +67,8 @@ paste_mask_1(
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
if (imOut->image8) {
|
if (imOut->image8) {
|
||||||
int in_i16 = strncmp(imIn->mode, "I;16", 4) == 0;
|
int in_i16 = isModeI16(imIn->mode);
|
||||||
int out_i16 = strncmp(imOut->mode, "I;16", 4) == 0;
|
int out_i16 = isModeI16(imOut->mode);
|
||||||
for (y = 0; y < ysize; y++) {
|
for (y = 0; y < ysize; y++) {
|
||||||
UINT8 *out = imOut->image8[y + dy] + dx;
|
UINT8 *out = imOut->image8[y + dy] + dx;
|
||||||
if (out_i16) {
|
if (out_i16) {
|
||||||
|
@ -307,31 +307,26 @@ ImagingPaste(
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
paste(imOut, imIn, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
paste(imOut, imIn, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_1) {
|
||||||
} else if (strcmp(imMask->mode, "1") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_L) {
|
||||||
} else if (strcmp(imMask->mode, "L") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_LA || imMask->mode == IMAGING_MODE_RGBA) {
|
||||||
} else if (strcmp(imMask->mode, "LA") == 0 || strcmp(imMask->mode, "RGBA") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
paste_mask_RGBA(
|
paste_mask_RGBA(
|
||||||
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
|
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
|
||||||
);
|
);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_RGBa) {
|
||||||
} else if (strcmp(imMask->mode, "RGBa") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
paste_mask_RGBa(
|
paste_mask_RGBa(
|
||||||
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
|
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
|
||||||
);
|
);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
(void)ImagingError_ValueError("bad transparency mask");
|
(void)ImagingError_ValueError("bad transparency mask");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -437,7 +432,7 @@ fill_mask_L(
|
||||||
unsigned int tmp1;
|
unsigned int tmp1;
|
||||||
|
|
||||||
if (imOut->image8) {
|
if (imOut->image8) {
|
||||||
int i16 = strncmp(imOut->mode, "I;16", 4) == 0;
|
int i16 = isModeI16(imOut->mode);
|
||||||
for (y = 0; y < ysize; y++) {
|
for (y = 0; y < ysize; y++) {
|
||||||
UINT8 *out = imOut->image8[y + dy] + dx;
|
UINT8 *out = imOut->image8[y + dy] + dx;
|
||||||
if (i16) {
|
if (i16) {
|
||||||
|
@ -456,9 +451,9 @@ fill_mask_L(
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
int alpha_channel =
|
int alpha_channel =
|
||||||
strcmp(imOut->mode, "RGBa") == 0 || strcmp(imOut->mode, "RGBA") == 0 ||
|
imOut->mode == IMAGING_MODE_RGBa || imOut->mode == IMAGING_MODE_RGBA ||
|
||||||
strcmp(imOut->mode, "La") == 0 || strcmp(imOut->mode, "LA") == 0 ||
|
imOut->mode == IMAGING_MODE_La || imOut->mode == IMAGING_MODE_LA ||
|
||||||
strcmp(imOut->mode, "PA") == 0;
|
imOut->mode == IMAGING_MODE_PA;
|
||||||
for (y = 0; y < ysize; y++) {
|
for (y = 0; y < ysize; y++) {
|
||||||
UINT8 *out = (UINT8 *)imOut->image[y + dy] + dx * pixelsize;
|
UINT8 *out = (UINT8 *)imOut->image[y + dy] + dx * pixelsize;
|
||||||
UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx;
|
UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx;
|
||||||
|
@ -617,27 +612,22 @@ ImagingFill2(
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
fill(imOut, ink, dx0, dy0, xsize, ysize, pixelsize);
|
fill(imOut, ink, dx0, dy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_1) {
|
||||||
} else if (strcmp(imMask->mode, "1") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_L) {
|
||||||
} else if (strcmp(imMask->mode, "L") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_RGBA) {
|
||||||
} else if (strcmp(imMask->mode, "RGBA") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
} else if (imMask->mode == IMAGING_MODE_RGBa) {
|
||||||
} else if (strcmp(imMask->mode, "RGBa") == 0) {
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
(void)ImagingError_ValueError("bad transparency mask");
|
(void)ImagingError_ValueError("bad transparency mask");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -128,7 +128,7 @@ im_point_32_8(Imaging imOut, Imaging imIn, im_point_context *context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingPoint(Imaging imIn, const char *mode, const void *table) {
|
ImagingPoint(Imaging imIn, ModeID mode, const void *table) {
|
||||||
/* lookup table transform */
|
/* lookup table transform */
|
||||||
|
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
|
@ -140,15 +140,15 @@ ImagingPoint(Imaging imIn, const char *mode, const void *table) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mode) {
|
if (mode == IMAGING_MODE_UNKNOWN) {
|
||||||
mode = imIn->mode;
|
mode = imIn->mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (imIn->type != IMAGING_TYPE_UINT8) {
|
if (imIn->type != IMAGING_TYPE_UINT8) {
|
||||||
if (imIn->type != IMAGING_TYPE_INT32 || strcmp(mode, "L") != 0) {
|
if (imIn->type != IMAGING_TYPE_INT32 || mode != IMAGING_MODE_L) {
|
||||||
goto mode_mismatch;
|
goto mode_mismatch;
|
||||||
}
|
}
|
||||||
} else if (!imIn->image8 && strcmp(imIn->mode, mode) != 0) {
|
} else if (!imIn->image8 && imIn->mode != mode) {
|
||||||
goto mode_mismatch;
|
goto mode_mismatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,8 +209,8 @@ ImagingPointTransform(Imaging imIn, double scale, double offset) {
|
||||||
Imaging imOut;
|
Imaging imOut;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
if (!imIn || (strcmp(imIn->mode, "I") != 0 && strcmp(imIn->mode, "I;16") != 0 &&
|
if (!imIn || (imIn->mode != IMAGING_MODE_I && imIn->mode != IMAGING_MODE_I_16 &&
|
||||||
strcmp(imIn->mode, "F") != 0)) {
|
imIn->mode != IMAGING_MODE_F)) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,7 +244,7 @@ ImagingPointTransform(Imaging imIn, double scale, double offset) {
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
break;
|
break;
|
||||||
case IMAGING_TYPE_SPECIAL:
|
case IMAGING_TYPE_SPECIAL:
|
||||||
if (strcmp(imIn->mode, "I;16") == 0) {
|
if (imIn->mode == IMAGING_MODE_I_16) {
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
for (y = 0; y < imIn->ysize; y++) {
|
for (y = 0; y < imIn->ysize; y++) {
|
||||||
char *in = (char *)imIn->image[y];
|
char *in = (char *)imIn->image[y];
|
||||||
|
|
|
@ -1684,13 +1684,13 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
return (Imaging)ImagingError_ValueError("bad number of colors");
|
return (Imaging)ImagingError_ValueError("bad number of colors");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(im->mode, "L") != 0 && strcmp(im->mode, "P") != 0 &&
|
if (im->mode != IMAGING_MODE_L && im->mode != IMAGING_MODE_P &&
|
||||||
strcmp(im->mode, "RGB") != 0 && strcmp(im->mode, "RGBA") != 0) {
|
im->mode != IMAGING_MODE_RGB && im->mode != IMAGING_MODE_RGBA) {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* only octree and imagequant supports RGBA */
|
/* only octree and imagequant supports RGBA */
|
||||||
if (!strcmp(im->mode, "RGBA") && mode != 2 && mode != 3) {
|
if (im->mode == IMAGING_MODE_RGBA && mode != 2 && mode != 3) {
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1708,7 +1708,7 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
/* FIXME: maybe we could load the hash tables directly from the
|
/* FIXME: maybe we could load the hash tables directly from the
|
||||||
image data? */
|
image data? */
|
||||||
|
|
||||||
if (!strcmp(im->mode, "L")) {
|
if (im->mode == IMAGING_MODE_L) {
|
||||||
/* grayscale */
|
/* grayscale */
|
||||||
|
|
||||||
/* FIXME: converting a "L" image to "P" with 256 colors
|
/* FIXME: converting a "L" image to "P" with 256 colors
|
||||||
|
@ -1721,7 +1721,7 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (!strcmp(im->mode, "P")) {
|
} else if (im->mode == IMAGING_MODE_P) {
|
||||||
/* palette */
|
/* palette */
|
||||||
|
|
||||||
pp = im->palette->palette;
|
pp = im->palette->palette;
|
||||||
|
@ -1736,10 +1736,10 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) {
|
} else if (im->mode == IMAGING_MODE_RGB || im->mode == IMAGING_MODE_RGBA) {
|
||||||
/* true colour */
|
/* true colour */
|
||||||
|
|
||||||
withAlpha = !strcmp(im->mode, "RGBA");
|
withAlpha = im->mode == IMAGING_MODE_RGBA;
|
||||||
int transparency = 0;
|
int transparency = 0;
|
||||||
unsigned char r = 0, g = 0, b = 0;
|
unsigned char r = 0, g = 0, b = 0;
|
||||||
for (i = y = 0; y < im->ysize; y++) {
|
for (i = y = 0; y < im->ysize; y++) {
|
||||||
|
@ -1830,7 +1830,7 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
imOut = ImagingNewDirty("P", im->xsize, im->ysize);
|
imOut = ImagingNewDirty(IMAGING_MODE_P, im->xsize, im->ysize);
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
|
||||||
for (i = y = 0; y < im->ysize; y++) {
|
for (i = y = 0; y < im->ysize; y++) {
|
||||||
|
@ -1855,7 +1855,7 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (withAlpha) {
|
if (withAlpha) {
|
||||||
strcpy(imOut->palette->mode, "RGBA");
|
imOut->palette->mode = IMAGING_MODE_RGBA;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(palette);
|
free(palette);
|
||||||
|
|
|
@ -1452,7 +1452,7 @@ ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) {
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
Imaging imOut = NULL;
|
Imaging imOut = NULL;
|
||||||
|
|
||||||
if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) {
|
if (imIn->mode == IMAGING_MODE_P || imIn->mode == IMAGING_MODE_1) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -470,9 +470,9 @@ ImagingResampleHorizontal_16bpc(
|
||||||
double *k;
|
double *k;
|
||||||
|
|
||||||
int bigendian = 0;
|
int bigendian = 0;
|
||||||
if (strcmp(imIn->mode, "I;16N") == 0
|
if (imIn->mode == IMAGING_MODE_I_16N
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|| strcmp(imIn->mode, "I;16B") == 0
|
|| imIn->mode == IMAGING_MODE_I_16B
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
bigendian = 1;
|
bigendian = 1;
|
||||||
|
@ -509,9 +509,9 @@ ImagingResampleVertical_16bpc(
|
||||||
double *k;
|
double *k;
|
||||||
|
|
||||||
int bigendian = 0;
|
int bigendian = 0;
|
||||||
if (strcmp(imIn->mode, "I;16N") == 0
|
if (imIn->mode == IMAGING_MODE_I_16N
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
|| strcmp(imIn->mode, "I;16B") == 0
|
|| imIn->mode == IMAGING_MODE_I_16B
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
bigendian = 1;
|
bigendian = 1;
|
||||||
|
@ -646,12 +646,12 @@ ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) {
|
||||||
ResampleFunction ResampleHorizontal;
|
ResampleFunction ResampleHorizontal;
|
||||||
ResampleFunction ResampleVertical;
|
ResampleFunction ResampleVertical;
|
||||||
|
|
||||||
if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) {
|
if (imIn->mode == IMAGING_MODE_P || imIn->mode == IMAGING_MODE_1) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (imIn->type == IMAGING_TYPE_SPECIAL) {
|
if (imIn->type == IMAGING_TYPE_SPECIAL) {
|
||||||
if (strncmp(imIn->mode, "I;16", 4) == 0) {
|
if (isModeI16(imIn->mode)) {
|
||||||
ResampleHorizontal = ImagingResampleHorizontal_16bpc;
|
ResampleHorizontal = ImagingResampleHorizontal_16bpc;
|
||||||
ResampleVertical = ImagingResampleVertical_16bpc;
|
ResampleVertical = ImagingResampleVertical_16bpc;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
ImagingNewPrologueSubtype(const ModeID mode, int xsize, int ysize, int size) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
|
|
||||||
/* linesize overflow check, roughly the current largest space req'd */
|
/* linesize overflow check, roughly the current largest space req'd */
|
||||||
|
@ -61,57 +61,56 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
|
|
||||||
im->type = IMAGING_TYPE_UINT8;
|
im->type = IMAGING_TYPE_UINT8;
|
||||||
|
|
||||||
if (strcmp(mode, "1") == 0) {
|
if (mode == IMAGING_MODE_1) {
|
||||||
/* 1-bit images */
|
/* 1-bit images */
|
||||||
im->bands = im->pixelsize = 1;
|
im->bands = im->pixelsize = 1;
|
||||||
im->linesize = xsize;
|
im->linesize = xsize;
|
||||||
|
|
||||||
} else if (strcmp(mode, "P") == 0) {
|
} else if (mode == IMAGING_MODE_P) {
|
||||||
/* 8-bit palette mapped images */
|
/* 8-bit palette mapped images */
|
||||||
im->bands = im->pixelsize = 1;
|
im->bands = im->pixelsize = 1;
|
||||||
im->linesize = xsize;
|
im->linesize = xsize;
|
||||||
im->palette = ImagingPaletteNew("RGB");
|
im->palette = ImagingPaletteNew(IMAGING_MODE_RGB);
|
||||||
|
|
||||||
} else if (strcmp(mode, "PA") == 0) {
|
} else if (mode == IMAGING_MODE_PA) {
|
||||||
/* 8-bit palette with alpha */
|
/* 8-bit palette with alpha */
|
||||||
im->bands = 2;
|
im->bands = 2;
|
||||||
im->pixelsize = 4; /* store in image32 memory */
|
im->pixelsize = 4; /* store in image32 memory */
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
im->palette = ImagingPaletteNew("RGB");
|
im->palette = ImagingPaletteNew(IMAGING_MODE_RGB);
|
||||||
|
|
||||||
} else if (strcmp(mode, "L") == 0) {
|
} else if (mode == IMAGING_MODE_L) {
|
||||||
/* 8-bit grayscale (luminance) images */
|
/* 8-bit grayscale (luminance) images */
|
||||||
im->bands = im->pixelsize = 1;
|
im->bands = im->pixelsize = 1;
|
||||||
im->linesize = xsize;
|
im->linesize = xsize;
|
||||||
|
|
||||||
} else if (strcmp(mode, "LA") == 0) {
|
} else if (mode == IMAGING_MODE_LA) {
|
||||||
/* 8-bit grayscale (luminance) with alpha */
|
/* 8-bit grayscale (luminance) with alpha */
|
||||||
im->bands = 2;
|
im->bands = 2;
|
||||||
im->pixelsize = 4; /* store in image32 memory */
|
im->pixelsize = 4; /* store in image32 memory */
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "La") == 0) {
|
} else if (mode == IMAGING_MODE_La) {
|
||||||
/* 8-bit grayscale (luminance) with premultiplied alpha */
|
/* 8-bit grayscale (luminance) with premultiplied alpha */
|
||||||
im->bands = 2;
|
im->bands = 2;
|
||||||
im->pixelsize = 4; /* store in image32 memory */
|
im->pixelsize = 4; /* store in image32 memory */
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "F") == 0) {
|
} else if (mode == IMAGING_MODE_F) {
|
||||||
/* 32-bit floating point images */
|
/* 32-bit floating point images */
|
||||||
im->bands = 1;
|
im->bands = 1;
|
||||||
im->pixelsize = 4;
|
im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
im->type = IMAGING_TYPE_FLOAT32;
|
im->type = IMAGING_TYPE_FLOAT32;
|
||||||
|
|
||||||
} else if (strcmp(mode, "I") == 0) {
|
} else if (mode == IMAGING_MODE_I) {
|
||||||
/* 32-bit integer images */
|
/* 32-bit integer images */
|
||||||
im->bands = 1;
|
im->bands = 1;
|
||||||
im->pixelsize = 4;
|
im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
im->type = IMAGING_TYPE_INT32;
|
im->type = IMAGING_TYPE_INT32;
|
||||||
|
|
||||||
} else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 ||
|
} else if (isModeI16(mode)) {
|
||||||
strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) {
|
|
||||||
/* EXPERIMENTAL */
|
/* EXPERIMENTAL */
|
||||||
/* 16-bit raw integer images */
|
/* 16-bit raw integer images */
|
||||||
im->bands = 1;
|
im->bands = 1;
|
||||||
|
@ -119,13 +118,13 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
im->linesize = xsize * 2;
|
im->linesize = xsize * 2;
|
||||||
im->type = IMAGING_TYPE_SPECIAL;
|
im->type = IMAGING_TYPE_SPECIAL;
|
||||||
|
|
||||||
} else if (strcmp(mode, "RGB") == 0) {
|
} else if (mode == IMAGING_MODE_RGB) {
|
||||||
/* 24-bit true colour images */
|
/* 24-bit true colour images */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
im->pixelsize = 4;
|
im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "BGR;15") == 0) {
|
} else if (mode == IMAGING_MODE_BGR_15) {
|
||||||
/* EXPERIMENTAL */
|
/* EXPERIMENTAL */
|
||||||
/* 15-bit reversed true colour */
|
/* 15-bit reversed true colour */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
|
@ -133,7 +132,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
im->linesize = (xsize * 2 + 3) & -4;
|
im->linesize = (xsize * 2 + 3) & -4;
|
||||||
im->type = IMAGING_TYPE_SPECIAL;
|
im->type = IMAGING_TYPE_SPECIAL;
|
||||||
|
|
||||||
} else if (strcmp(mode, "BGR;16") == 0) {
|
} else if (mode == IMAGING_MODE_BGR_16) {
|
||||||
/* EXPERIMENTAL */
|
/* EXPERIMENTAL */
|
||||||
/* 16-bit reversed true colour */
|
/* 16-bit reversed true colour */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
|
@ -141,7 +140,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
im->linesize = (xsize * 2 + 3) & -4;
|
im->linesize = (xsize * 2 + 3) & -4;
|
||||||
im->type = IMAGING_TYPE_SPECIAL;
|
im->type = IMAGING_TYPE_SPECIAL;
|
||||||
|
|
||||||
} else if (strcmp(mode, "BGR;24") == 0) {
|
} else if (mode == IMAGING_MODE_BGR_24) {
|
||||||
/* EXPERIMENTAL */
|
/* EXPERIMENTAL */
|
||||||
/* 24-bit reversed true colour */
|
/* 24-bit reversed true colour */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
|
@ -149,40 +148,40 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
im->linesize = (xsize * 3 + 3) & -4;
|
im->linesize = (xsize * 3 + 3) & -4;
|
||||||
im->type = IMAGING_TYPE_SPECIAL;
|
im->type = IMAGING_TYPE_SPECIAL;
|
||||||
|
|
||||||
} else if (strcmp(mode, "RGBX") == 0) {
|
} else if (mode == IMAGING_MODE_RGBX) {
|
||||||
/* 32-bit true colour images with padding */
|
/* 32-bit true colour images with padding */
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "RGBA") == 0) {
|
} else if (mode == IMAGING_MODE_RGBA) {
|
||||||
/* 32-bit true colour images with alpha */
|
/* 32-bit true colour images with alpha */
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "RGBa") == 0) {
|
} else if (mode == IMAGING_MODE_RGBa) {
|
||||||
/* 32-bit true colour images with premultiplied alpha */
|
/* 32-bit true colour images with premultiplied alpha */
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "CMYK") == 0) {
|
} else if (mode == IMAGING_MODE_CMYK) {
|
||||||
/* 32-bit colour separation */
|
/* 32-bit colour separation */
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "YCbCr") == 0) {
|
} else if (mode == IMAGING_MODE_YCbCr) {
|
||||||
/* 24-bit video format */
|
/* 24-bit video format */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
im->pixelsize = 4;
|
im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "LAB") == 0) {
|
} else if (mode == IMAGING_MODE_LAB) {
|
||||||
/* 24-bit color, luminance, + 2 color channels */
|
/* 24-bit color, luminance, + 2 color channels */
|
||||||
/* L is uint8, a,b are int8 */
|
/* L is uint8, a,b are int8 */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
im->pixelsize = 4;
|
im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "HSV") == 0) {
|
} else if (mode == IMAGING_MODE_HSV) {
|
||||||
/* 24-bit color, luminance, + 2 color channels */
|
/* 24-bit color, luminance, + 2 color channels */
|
||||||
/* L is uint8, a,b are int8 */
|
/* L is uint8, a,b are int8 */
|
||||||
im->bands = 3;
|
im->bands = 3;
|
||||||
|
@ -195,7 +194,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup image descriptor */
|
/* Setup image descriptor */
|
||||||
strcpy(im->mode, mode);
|
im->mode = mode;
|
||||||
|
|
||||||
/* Pointer array (allocate at least one line, to avoid MemoryError
|
/* Pointer array (allocate at least one line, to avoid MemoryError
|
||||||
exceptions on platforms where calloc(0, x) returns NULL) */
|
exceptions on platforms where calloc(0, x) returns NULL) */
|
||||||
|
@ -226,7 +225,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNewPrologue(const char *mode, int xsize, int ysize) {
|
ImagingNewPrologue(const ModeID mode, int xsize, int ysize) {
|
||||||
return ImagingNewPrologueSubtype(
|
return ImagingNewPrologueSubtype(
|
||||||
mode, xsize, ysize, sizeof(struct ImagingMemoryInstance)
|
mode, xsize, ysize, sizeof(struct ImagingMemoryInstance)
|
||||||
);
|
);
|
||||||
|
@ -492,7 +491,7 @@ ImagingAllocateBlock(Imaging im) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNewInternal(const char *mode, int xsize, int ysize, int dirty) {
|
ImagingNewInternal(const ModeID mode, int xsize, int ysize, int dirty) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
|
|
||||||
if (xsize < 0 || ysize < 0) {
|
if (xsize < 0 || ysize < 0) {
|
||||||
|
@ -528,17 +527,17 @@ ImagingNewInternal(const char *mode, int xsize, int ysize, int dirty) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNew(const char *mode, int xsize, int ysize) {
|
ImagingNew(const ModeID mode, int xsize, int ysize) {
|
||||||
return ImagingNewInternal(mode, xsize, ysize, 0);
|
return ImagingNewInternal(mode, xsize, ysize, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNewDirty(const char *mode, int xsize, int ysize) {
|
ImagingNewDirty(const ModeID mode, int xsize, int ysize) {
|
||||||
return ImagingNewInternal(mode, xsize, ysize, 1);
|
return ImagingNewInternal(mode, xsize, ysize, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNewBlock(const char *mode, int xsize, int ysize) {
|
ImagingNewBlock(const ModeID mode, int xsize, int ysize) {
|
||||||
Imaging im;
|
Imaging im;
|
||||||
|
|
||||||
if (xsize < 0 || ysize < 0) {
|
if (xsize < 0 || ysize < 0) {
|
||||||
|
@ -559,12 +558,12 @@ ImagingNewBlock(const char *mode, int xsize, int ysize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn) {
|
ImagingNew2Dirty(const ModeID mode, Imaging imOut, Imaging imIn) {
|
||||||
/* allocate or validate output image */
|
/* allocate or validate output image */
|
||||||
|
|
||||||
if (imOut) {
|
if (imOut) {
|
||||||
/* make sure images match */
|
/* make sure images match */
|
||||||
if (strcmp(imOut->mode, mode) != 0 || imOut->xsize != imIn->xsize ||
|
if (imOut->mode != mode || imOut->xsize != imIn->xsize ||
|
||||||
imOut->ysize != imIn->ysize) {
|
imOut->ysize != imIn->ysize) {
|
||||||
return ImagingError_Mismatch();
|
return ImagingError_Mismatch();
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,14 +246,26 @@ _pickUnpackers(
|
||||||
// We'll pick appropriate set of unpackers depending on planar_configuration
|
// We'll pick appropriate set of unpackers depending on planar_configuration
|
||||||
// It does not matter if data is RGB(A), CMYK or LUV really,
|
// It does not matter if data is RGB(A), CMYK or LUV really,
|
||||||
// we just copy it plane by plane
|
// we just copy it plane by plane
|
||||||
unpackers[0] =
|
unpackers[0] = ImagingFindUnpacker(
|
||||||
ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL);
|
IMAGING_MODE_RGBA,
|
||||||
unpackers[1] =
|
bits_per_sample == 16 ? IMAGING_RAWMODE_R_16N : IMAGING_RAWMODE_R,
|
||||||
ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL);
|
NULL
|
||||||
unpackers[2] =
|
);
|
||||||
ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL);
|
unpackers[1] = ImagingFindUnpacker(
|
||||||
unpackers[3] =
|
IMAGING_MODE_RGBA,
|
||||||
ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL);
|
bits_per_sample == 16 ? IMAGING_RAWMODE_G_16N : IMAGING_RAWMODE_G,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
unpackers[2] = ImagingFindUnpacker(
|
||||||
|
IMAGING_MODE_RGBA,
|
||||||
|
bits_per_sample == 16 ? IMAGING_RAWMODE_B_16N : IMAGING_RAWMODE_B,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
unpackers[3] = ImagingFindUnpacker(
|
||||||
|
IMAGING_MODE_RGBA,
|
||||||
|
bits_per_sample == 16 ? IMAGING_RAWMODE_A_16N : IMAGING_RAWMODE_A,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
return im->bands;
|
return im->bands;
|
||||||
} else {
|
} else {
|
||||||
|
@ -643,7 +655,7 @@ ImagingLibTiffDecode(
|
||||||
);
|
);
|
||||||
TRACE(
|
TRACE(
|
||||||
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
|
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
|
||||||
im->mode,
|
getModeData(im->mode)->name,
|
||||||
im->type,
|
im->type,
|
||||||
im->bands,
|
im->bands,
|
||||||
im->xsize,
|
im->xsize,
|
||||||
|
@ -754,7 +766,7 @@ ImagingLibTiffDecode(
|
||||||
if (!state->errcode) {
|
if (!state->errcode) {
|
||||||
// Check if raw mode was RGBa and it was stored on separate planes
|
// Check if raw mode was RGBa and it was stored on separate planes
|
||||||
// so we have to convert it to RGBA
|
// so we have to convert it to RGBA
|
||||||
if (planes > 3 && strcmp(im->mode, "RGBA") == 0) {
|
if (planes > 3 && im->mode == IMAGING_MODE_RGBA) {
|
||||||
uint16_t extrasamples;
|
uint16_t extrasamples;
|
||||||
uint16_t *sampleinfo;
|
uint16_t *sampleinfo;
|
||||||
ImagingShuffler shuffle;
|
ImagingShuffler shuffle;
|
||||||
|
@ -766,7 +778,9 @@ ImagingLibTiffDecode(
|
||||||
|
|
||||||
if (extrasamples >= 1 && (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED ||
|
if (extrasamples >= 1 && (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED ||
|
||||||
sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA)) {
|
sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA)) {
|
||||||
shuffle = ImagingFindUnpacker("RGBA", "RGBa", NULL);
|
shuffle = ImagingFindUnpacker(
|
||||||
|
IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa, NULL
|
||||||
|
);
|
||||||
|
|
||||||
for (y = state->yoff; y < state->ysize; y++) {
|
for (y = state->yoff; y < state->ysize; y++) {
|
||||||
UINT8 *ptr = (UINT8 *)im->image[y + state->yoff] +
|
UINT8 *ptr = (UINT8 *)im->image[y + state->yoff] +
|
||||||
|
@ -977,7 +991,7 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt
|
||||||
);
|
);
|
||||||
TRACE(
|
TRACE(
|
||||||
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
|
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
|
||||||
im->mode,
|
getModeData(im->mode)->name,
|
||||||
im->type,
|
im->type,
|
||||||
im->bands,
|
im->bands,
|
||||||
im->xsize,
|
im->xsize,
|
||||||
|
|
|
@ -1548,12 +1548,11 @@ band316L(UINT8 *out, const UINT8 *in, int pixels) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *mode;
|
const ModeID mode;
|
||||||
const char *rawmode;
|
const RawModeID rawmode;
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler unpack;
|
ImagingShuffler unpack;
|
||||||
} unpackers[] = {
|
} unpackers[] = {
|
||||||
|
|
||||||
/* raw mode syntax is "<mode>;<bits><flags>" where "bits" defaults
|
/* raw mode syntax is "<mode>;<bits><flags>" where "bits" defaults
|
||||||
depending on mode (1 for "1", 8 for "P" and "L", etc), and
|
depending on mode (1 for "1", 8 for "P" and "L", etc), and
|
||||||
"flags" should be given in alphabetical order. if both bits
|
"flags" should be given in alphabetical order. if both bits
|
||||||
|
@ -1566,303 +1565,300 @@ static struct {
|
||||||
/* exception: rawmodes "I" and "F" are always native endian byte order */
|
/* exception: rawmodes "I" and "F" are always native endian byte order */
|
||||||
|
|
||||||
/* bilevel */
|
/* bilevel */
|
||||||
{"1", "1", 1, unpack1},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1, 1, unpack1},
|
||||||
{"1", "1;I", 1, unpack1I},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_I, 1, unpack1I},
|
||||||
{"1", "1;R", 1, unpack1R},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_R, 1, unpack1R},
|
||||||
{"1", "1;IR", 1, unpack1IR},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_IR, 1, unpack1IR},
|
||||||
{"1", "1;8", 8, unpack18},
|
{IMAGING_MODE_1, IMAGING_RAWMODE_1_8, 8, unpack18},
|
||||||
|
|
||||||
/* grayscale */
|
/* grayscale */
|
||||||
{"L", "L;2", 2, unpackL2},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_2, 2, unpackL2},
|
||||||
{"L", "L;2I", 2, unpackL2I},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_2I, 2, unpackL2I},
|
||||||
{"L", "L;2R", 2, unpackL2R},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_2R, 2, unpackL2R},
|
||||||
{"L", "L;2IR", 2, unpackL2IR},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_2IR, 2, unpackL2IR},
|
||||||
|
|
||||||
{"L", "L;4", 4, unpackL4},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_4, 4, unpackL4},
|
||||||
{"L", "L;4I", 4, unpackL4I},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_4I, 4, unpackL4I},
|
||||||
{"L", "L;4R", 4, unpackL4R},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_4R, 4, unpackL4R},
|
||||||
{"L", "L;4IR", 4, unpackL4IR},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_4IR, 4, unpackL4IR},
|
||||||
|
|
||||||
{"L", "L", 8, copy1},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L, 8, copy1},
|
||||||
{"L", "L;I", 8, unpackLI},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_I, 8, unpackLI},
|
||||||
{"L", "L;R", 8, unpackLR},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_R, 8, unpackLR},
|
||||||
{"L", "L;16", 16, unpackL16},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_16, 16, unpackL16},
|
||||||
{"L", "L;16B", 16, unpackL16B},
|
{IMAGING_MODE_L, IMAGING_RAWMODE_L_16B, 16, unpackL16B},
|
||||||
|
|
||||||
/* grayscale w. alpha */
|
/* grayscale w. alpha */
|
||||||
{"LA", "LA", 16, unpackLA},
|
{IMAGING_MODE_LA, IMAGING_RAWMODE_LA, 16, unpackLA},
|
||||||
{"LA", "LA;L", 16, unpackLAL},
|
{IMAGING_MODE_LA, IMAGING_RAWMODE_LA_L, 16, unpackLAL},
|
||||||
|
|
||||||
/* grayscale w. alpha premultiplied */
|
/* grayscale w. alpha premultiplied */
|
||||||
{"La", "La", 16, unpackLA},
|
{IMAGING_MODE_La, IMAGING_RAWMODE_La, 16, unpackLA},
|
||||||
|
|
||||||
/* palette */
|
/* palette */
|
||||||
{"P", "P;1", 1, unpackP1},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_1, 1, unpackP1},
|
||||||
{"P", "P;2", 2, unpackP2},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_2, 2, unpackP2},
|
||||||
{"P", "P;2L", 2, unpackP2L},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_2L, 2, unpackP2L},
|
||||||
{"P", "P;4", 4, unpackP4},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_4, 4, unpackP4},
|
||||||
{"P", "P;4L", 4, unpackP4L},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_4L, 4, unpackP4L},
|
||||||
{"P", "P", 8, copy1},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P, 8, copy1},
|
||||||
{"P", "P;R", 8, unpackLR},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_P_R, 8, unpackLR},
|
||||||
{"P", "L", 8, copy1},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_L, 8, copy1},
|
||||||
{"P", "PX", 16, unpackL16B},
|
{IMAGING_MODE_P, IMAGING_RAWMODE_PX, 16, unpackL16B},
|
||||||
|
|
||||||
/* palette w. alpha */
|
/* palette w. alpha */
|
||||||
{"PA", "PA", 16, unpackLA},
|
{IMAGING_MODE_PA, IMAGING_RAWMODE_PA, 16, unpackLA},
|
||||||
{"PA", "PA;L", 16, unpackLAL},
|
{IMAGING_MODE_PA, IMAGING_RAWMODE_PA_L, 16, unpackLAL},
|
||||||
{"PA", "LA", 16, unpackLA},
|
{IMAGING_MODE_PA, IMAGING_RAWMODE_LA, 16, unpackLA},
|
||||||
|
|
||||||
/* true colour */
|
/* true colour */
|
||||||
{"RGB", "RGB", 24, ImagingUnpackRGB},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB, 24, ImagingUnpackRGB},
|
||||||
{"RGB", "RGB;L", 24, unpackRGBL},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_L, 24, unpackRGBL},
|
||||||
{"RGB", "RGB;R", 24, unpackRGBR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_R, 24, unpackRGBR},
|
||||||
{"RGB", "RGB;16L", 48, unpackRGB16L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_16L, 48, unpackRGB16L},
|
||||||
{"RGB", "RGB;16B", 48, unpackRGB16B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_16B, 48, unpackRGB16B},
|
||||||
{"RGB", "BGR", 24, ImagingUnpackBGR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGR, 24, ImagingUnpackBGR},
|
||||||
{"RGB", "RGB;15", 16, ImagingUnpackRGB15},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_15, 16, ImagingUnpackRGB15},
|
||||||
{"RGB", "BGR;15", 16, ImagingUnpackBGR15},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGR_15, 16, ImagingUnpackBGR15},
|
||||||
{"RGB", "RGB;16", 16, ImagingUnpackRGB16},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_16, 16, ImagingUnpackRGB16},
|
||||||
{"RGB", "BGR;16", 16, ImagingUnpackBGR16},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGR_16, 16, ImagingUnpackBGR16},
|
||||||
{"RGB", "RGBX;16L", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX_16L, 64, unpackRGBA16L},
|
||||||
{"RGB", "RGBX;16B", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX_16B, 64, unpackRGBA16B},
|
||||||
{"RGB", "RGB;4B", 16, ImagingUnpackRGB4B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_4B, 16, ImagingUnpackRGB4B},
|
||||||
{"RGB", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGR_5, 16, ImagingUnpackBGR15}, /* compat */
|
||||||
{"RGB", "RGBX", 32, copy4},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX, 32, copy4},
|
||||||
{"RGB", "RGBX;L", 32, unpackRGBAL},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX_L, 32, unpackRGBAL},
|
||||||
{"RGB", "RGBXX", 40, copy4skip1},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBXX, 40, copy4skip1},
|
||||||
{"RGB", "RGBXXX", 48, copy4skip2},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBXXX, 48, copy4skip2},
|
||||||
{"RGB", "RGBA;L", 32, unpackRGBAL},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBA_L, 32, unpackRGBAL},
|
||||||
{"RGB", "RGBA;15", 16, ImagingUnpackRGBA15},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBA_15, 16, ImagingUnpackRGBA15},
|
||||||
{"RGB", "BGRX", 32, ImagingUnpackBGRX},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGRX, 32, ImagingUnpackBGRX},
|
||||||
{"RGB", "BGXR", 32, ImagingUnpackBGXR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_BGXR, 32, ImagingUnpackBGXR},
|
||||||
{"RGB", "XRGB", 32, ImagingUnpackXRGB},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_XRGB, 32, ImagingUnpackXRGB},
|
||||||
{"RGB", "XBGR", 32, ImagingUnpackXBGR},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_XBGR, 32, ImagingUnpackXBGR},
|
||||||
{"RGB", "YCC;P", 24, ImagingUnpackYCC},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_YCC_P, 24, ImagingUnpackYCC},
|
||||||
{"RGB", "R", 8, band0},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGB", "G", 8, band1},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGB", "B", 8, band2},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B, 8, band2},
|
||||||
{"RGB", "R;16L", 16, band016L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R_16L, 16, band016L},
|
||||||
{"RGB", "G;16L", 16, band116L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G_16L, 16, band116L},
|
||||||
{"RGB", "B;16L", 16, band216L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B_16L, 16, band216L},
|
||||||
{"RGB", "R;16B", 16, band016B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R_16B, 16, band016B},
|
||||||
{"RGB", "G;16B", 16, band116B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G_16B, 16, band116B},
|
||||||
{"RGB", "B;16B", 16, band216B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B_16B, 16, band216B},
|
||||||
{"RGB", "CMYK", 32, cmyk2rgb},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_CMYK, 32, cmyk2rgb},
|
||||||
|
|
||||||
{"BGR;15", "BGR;15", 16, copy2},
|
{IMAGING_MODE_BGR_15, IMAGING_RAWMODE_BGR_15, 16, copy2},
|
||||||
{"BGR;16", "BGR;16", 16, copy2},
|
{IMAGING_MODE_BGR_16, IMAGING_RAWMODE_BGR_16, 16, copy2},
|
||||||
{"BGR;24", "BGR;24", 24, copy3},
|
{IMAGING_MODE_BGR_24, IMAGING_RAWMODE_BGR_24, 24, copy3},
|
||||||
|
|
||||||
/* true colour w. alpha */
|
/* true colour w. alpha */
|
||||||
{"RGBA", "LA", 16, unpackRGBALA},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_LA, 16, unpackRGBALA},
|
||||||
{"RGBA", "LA;16B", 32, unpackRGBALA16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_LA_16B, 32, unpackRGBALA16B},
|
||||||
{"RGBA", "RGBA", 32, copy4},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA, 32, copy4},
|
||||||
{"RGBA", "RGBAX", 40, copy4skip1},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBAX, 40, copy4skip1},
|
||||||
{"RGBA", "RGBAXX", 48, copy4skip2},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBAXX, 48, copy4skip2},
|
||||||
{"RGBA", "RGBa", 32, unpackRGBa},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa, 32, unpackRGBa},
|
||||||
{"RGBA", "RGBaX", 40, unpackRGBaskip1},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBaX, 40, unpackRGBaskip1},
|
||||||
{"RGBA", "RGBaXX", 48, unpackRGBaskip2},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBaXX, 48, unpackRGBaskip2},
|
||||||
{"RGBA", "RGBa;16L", 64, unpackRGBa16L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa_16L, 64, unpackRGBa16L},
|
||||||
{"RGBA", "RGBa;16B", 64, unpackRGBa16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa_16B, 64, unpackRGBa16B},
|
||||||
{"RGBA", "BGR", 24, ImagingUnpackBGR},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGR, 24, ImagingUnpackBGR},
|
||||||
{"RGBA", "BGRa", 32, unpackBGRa},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRa, 32, unpackBGRa},
|
||||||
{"RGBA", "RGBA;I", 32, unpackRGBAI},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_I, 32, unpackRGBAI},
|
||||||
{"RGBA", "RGBA;L", 32, unpackRGBAL},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_L, 32, unpackRGBAL},
|
||||||
{"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_15, 16, ImagingUnpackRGBA15},
|
||||||
{"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA_15, 16, ImagingUnpackBGRA15},
|
||||||
{"RGBA", "BGRA;15Z", 16, ImagingUnpackBGRA15Z},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA_15Z, 16, ImagingUnpackBGRA15Z},
|
||||||
{"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_4B, 16, ImagingUnpackRGBA4B},
|
||||||
{"RGBA", "RGBA;16L", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_16L, 64, unpackRGBA16L},
|
||||||
{"RGBA", "RGBA;16B", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_16B, 64, unpackRGBA16B},
|
||||||
{"RGBA", "BGRA", 32, unpackBGRA},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA, 32, unpackBGRA},
|
||||||
{"RGBA", "BGRA;16L", 64, unpackBGRA16L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA_16L, 64, unpackBGRA16L},
|
||||||
{"RGBA", "BGRA;16B", 64, unpackBGRA16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGRA_16B, 64, unpackBGRA16B},
|
||||||
{"RGBA", "BGAR", 32, unpackBGAR},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_BGAR, 32, unpackBGAR},
|
||||||
{"RGBA", "ARGB", 32, unpackARGB},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_ARGB, 32, unpackARGB},
|
||||||
{"RGBA", "ABGR", 32, unpackABGR},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_ABGR, 32, unpackABGR},
|
||||||
{"RGBA", "YCCA;P", 32, ImagingUnpackYCCA},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_YCCA_P, 32, ImagingUnpackYCCA},
|
||||||
{"RGBA", "R", 8, band0},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGBA", "G", 8, band1},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGBA", "B", 8, band2},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B, 8, band2},
|
||||||
{"RGBA", "A", 8, band3},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A, 8, band3},
|
||||||
{"RGBA", "R;16L", 16, band016L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R_16L, 16, band016L},
|
||||||
{"RGBA", "G;16L", 16, band116L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G_16L, 16, band116L},
|
||||||
{"RGBA", "B;16L", 16, band216L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B_16L, 16, band216L},
|
||||||
{"RGBA", "A;16L", 16, band316L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A_16L, 16, band316L},
|
||||||
{"RGBA", "R;16B", 16, band016B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R_16B, 16, band016B},
|
||||||
{"RGBA", "G;16B", 16, band116B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G_16B, 16, band116B},
|
||||||
{"RGBA", "B;16B", 16, band216B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B_16B, 16, band216B},
|
||||||
{"RGBA", "A;16B", 16, band316B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A_16B, 16, band316B},
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
{"RGB", "RGB;16N", 48, unpackRGB16B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_16N, 48, unpackRGB16B},
|
||||||
{"RGB", "RGBX;16N", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX_16N, 64, unpackRGBA16B},
|
||||||
{"RGBA", "RGBa;16N", 64, unpackRGBa16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa_16N, 64, unpackRGBa16B},
|
||||||
{"RGBA", "RGBA;16N", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_16N, 64, unpackRGBA16B},
|
||||||
{"RGBX", "RGBX;16N", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_16N, 64, unpackRGBA16B},
|
||||||
{"RGB", "R;16N", 16, band016B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R_16N, 16, band016B},
|
||||||
{"RGB", "G;16N", 16, band116B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G_16N, 16, band116B},
|
||||||
{"RGB", "B;16N", 16, band216B},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B_16N, 16, band216B},
|
||||||
|
|
||||||
{"RGBA", "R;16N", 16, band016B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R_16N, 16, band016B},
|
||||||
{"RGBA", "G;16N", 16, band116B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G_16N, 16, band116B},
|
||||||
{"RGBA", "B;16N", 16, band216B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B_16N, 16, band216B},
|
||||||
{"RGBA", "A;16N", 16, band316B},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A_16N, 16, band316B},
|
||||||
#else
|
#else
|
||||||
{"RGB", "RGB;16N", 48, unpackRGB16L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGB_16N, 48, unpackRGB16L},
|
||||||
{"RGB", "RGBX;16N", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_RGBX_16N, 64, unpackRGBA16L},
|
||||||
{"RGBA", "RGBa;16N", 64, unpackRGBa16L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBa_16N, 64, unpackRGBa16L},
|
||||||
{"RGBA", "RGBA;16N", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_RGBA_16N, 64, unpackRGBA16L},
|
||||||
{"RGBX", "RGBX;16N", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_16N, 64, unpackRGBA16L},
|
||||||
{"RGB", "R;16N", 16, band016L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_R_16N, 16, band016L},
|
||||||
{"RGB", "G;16N", 16, band116L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_G_16N, 16, band116L},
|
||||||
{"RGB", "B;16N", 16, band216L},
|
{IMAGING_MODE_RGB, IMAGING_RAWMODE_B_16N, 16, band216L},
|
||||||
|
|
||||||
{"RGBA", "R;16N", 16, band016L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_R_16N, 16, band016L},
|
||||||
{"RGBA", "G;16N", 16, band116L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_G_16N, 16, band116L},
|
||||||
{"RGBA", "B;16N", 16, band216L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_B_16N, 16, band216L},
|
||||||
{"RGBA", "A;16N", 16, band316L},
|
{IMAGING_MODE_RGBA, IMAGING_RAWMODE_A_16N, 16, band316L},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* true colour w. alpha premultiplied */
|
/* true colour w. alpha premultiplied */
|
||||||
{"RGBa", "RGBa", 32, copy4},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_RGBa, 32, copy4},
|
||||||
{"RGBa", "BGRa", 32, unpackBGRA},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_BGRa, 32, unpackBGRA},
|
||||||
{"RGBa", "aRGB", 32, unpackARGB},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_aRGB, 32, unpackARGB},
|
||||||
{"RGBa", "aBGR", 32, unpackABGR},
|
{IMAGING_MODE_RGBa, IMAGING_RAWMODE_aBGR, 32, unpackABGR},
|
||||||
|
|
||||||
/* true colour w. padding */
|
/* true colour w. padding */
|
||||||
{"RGBX", "RGB", 24, ImagingUnpackRGB},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB, 24, ImagingUnpackRGB},
|
||||||
{"RGBX", "RGB;L", 24, unpackRGBL},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB_L, 24, unpackRGBL},
|
||||||
{"RGBX", "RGB;16B", 48, unpackRGB16B},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB_16B, 48, unpackRGB16B},
|
||||||
{"RGBX", "BGR", 24, ImagingUnpackBGR},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGR, 24, ImagingUnpackBGR},
|
||||||
{"RGBX", "RGB;15", 16, ImagingUnpackRGB15},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB_15, 16, ImagingUnpackRGB15},
|
||||||
{"RGBX", "BGR;15", 16, ImagingUnpackBGR15},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGR_15, 16, ImagingUnpackBGR15},
|
||||||
{"RGBX", "RGB;4B", 16, ImagingUnpackRGB4B},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGB_4B, 16, ImagingUnpackRGB4B},
|
||||||
{"RGBX", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGR_5, 16, ImagingUnpackBGR15}, /* compat */
|
||||||
{"RGBX", "RGBX", 32, copy4},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX, 32, copy4},
|
||||||
{"RGBX", "RGBXX", 40, copy4skip1},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBXX, 40, copy4skip1},
|
||||||
{"RGBX", "RGBXXX", 48, copy4skip2},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBXXX, 48, copy4skip2},
|
||||||
{"RGBX", "RGBX;L", 32, unpackRGBAL},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_L, 32, unpackRGBAL},
|
||||||
{"RGBX", "RGBX;16L", 64, unpackRGBA16L},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_16L, 64, unpackRGBA16L},
|
||||||
{"RGBX", "RGBX;16B", 64, unpackRGBA16B},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_RGBX_16B, 64, unpackRGBA16B},
|
||||||
{"RGBX", "BGRX", 32, ImagingUnpackBGRX},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_BGRX, 32, ImagingUnpackBGRX},
|
||||||
{"RGBX", "XRGB", 32, ImagingUnpackXRGB},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_XRGB, 32, ImagingUnpackXRGB},
|
||||||
{"RGBX", "XBGR", 32, ImagingUnpackXBGR},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_XBGR, 32, ImagingUnpackXBGR},
|
||||||
{"RGBX", "YCC;P", 24, ImagingUnpackYCC},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_YCC_P, 24, ImagingUnpackYCC},
|
||||||
{"RGBX", "R", 8, band0},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_R, 8, band0},
|
||||||
{"RGBX", "G", 8, band1},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_G, 8, band1},
|
||||||
{"RGBX", "B", 8, band2},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_B, 8, band2},
|
||||||
{"RGBX", "X", 8, band3},
|
{IMAGING_MODE_RGBX, IMAGING_RAWMODE_X, 8, band3},
|
||||||
|
|
||||||
/* colour separation */
|
/* colour separation */
|
||||||
{"CMYK", "CMYK", 32, copy4},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK, 32, copy4},
|
||||||
{"CMYK", "CMYKX", 40, copy4skip1},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYKX, 40, copy4skip1},
|
||||||
{"CMYK", "CMYKXX", 48, copy4skip2},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYKXX, 48, copy4skip2},
|
||||||
{"CMYK", "CMYK;I", 32, unpackCMYKI},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_I, 32, unpackCMYKI},
|
||||||
{"CMYK", "CMYK;L", 32, unpackRGBAL},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_L, 32, unpackRGBAL},
|
||||||
{"CMYK", "CMYK;16L", 64, unpackRGBA16L},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_16L, 64, unpackRGBA16L},
|
||||||
{"CMYK", "CMYK;16B", 64, unpackRGBA16B},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_16B, 64, unpackRGBA16B},
|
||||||
{"CMYK", "C", 8, band0},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_C, 8, band0},
|
||||||
{"CMYK", "M", 8, band1},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_M, 8, band1},
|
||||||
{"CMYK", "Y", 8, band2},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_Y, 8, band2},
|
||||||
{"CMYK", "K", 8, band3},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_K, 8, band3},
|
||||||
{"CMYK", "C;I", 8, band0I},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_C_I, 8, band0I},
|
||||||
{"CMYK", "M;I", 8, band1I},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_M_I, 8, band1I},
|
||||||
{"CMYK", "Y;I", 8, band2I},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_Y_I, 8, band2I},
|
||||||
{"CMYK", "K;I", 8, band3I},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_K_I, 8, band3I},
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
{"CMYK", "CMYK;16N", 64, unpackRGBA16B},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_16N, 64, unpackRGBA16B},
|
||||||
#else
|
#else
|
||||||
{"CMYK", "CMYK;16N", 64, unpackRGBA16L},
|
{IMAGING_MODE_CMYK, IMAGING_RAWMODE_CMYK_16N, 64, unpackRGBA16L},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* video (YCbCr) */
|
/* video (YCbCr) */
|
||||||
{"YCbCr", "YCbCr", 24, ImagingUnpackRGB},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCr, 24, ImagingUnpackRGB},
|
||||||
{"YCbCr", "YCbCr;L", 24, unpackRGBL},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCr_L, 24, unpackRGBL},
|
||||||
{"YCbCr", "YCbCrX", 32, copy4},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCrX, 32, copy4},
|
||||||
{"YCbCr", "YCbCrK", 32, copy4},
|
{IMAGING_MODE_YCbCr, IMAGING_RAWMODE_YCbCrK, 32, copy4},
|
||||||
|
|
||||||
/* LAB Color */
|
/* LAB Color */
|
||||||
{"LAB", "LAB", 24, ImagingUnpackLAB},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_LAB, 24, ImagingUnpackLAB},
|
||||||
{"LAB", "L", 8, band0},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_L, 8, band0},
|
||||||
{"LAB", "A", 8, band1},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_A, 8, band1},
|
||||||
{"LAB", "B", 8, band2},
|
{IMAGING_MODE_LAB, IMAGING_RAWMODE_B, 8, band2},
|
||||||
|
|
||||||
/* HSV Color */
|
/* HSV Color */
|
||||||
{"HSV", "HSV", 24, ImagingUnpackRGB},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_HSV, 24, ImagingUnpackRGB},
|
||||||
{"HSV", "H", 8, band0},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_H, 8, band0},
|
||||||
{"HSV", "S", 8, band1},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_S, 8, band1},
|
||||||
{"HSV", "V", 8, band2},
|
{IMAGING_MODE_HSV, IMAGING_RAWMODE_V, 8, band2},
|
||||||
|
|
||||||
/* integer variations */
|
/* integer variations */
|
||||||
{"I", "I", 32, copy4},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I, 32, copy4},
|
||||||
{"I", "I;8", 8, unpackI8},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_8, 8, unpackI8},
|
||||||
{"I", "I;8S", 8, unpackI8S},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_8S, 8, unpackI8S},
|
||||||
{"I", "I;16", 16, unpackI16},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16, 16, unpackI16},
|
||||||
{"I", "I;16S", 16, unpackI16S},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16S, 16, unpackI16S},
|
||||||
{"I", "I;16B", 16, unpackI16B},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16B, 16, unpackI16B},
|
||||||
{"I", "I;16BS", 16, unpackI16BS},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16BS, 16, unpackI16BS},
|
||||||
{"I", "I;16N", 16, unpackI16N},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16N, 16, unpackI16N},
|
||||||
{"I", "I;16NS", 16, unpackI16NS},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_16NS, 16, unpackI16NS},
|
||||||
{"I", "I;32", 32, unpackI32},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32, 32, unpackI32},
|
||||||
{"I", "I;32S", 32, unpackI32S},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32S, 32, unpackI32S},
|
||||||
{"I", "I;32B", 32, unpackI32B},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32B, 32, unpackI32B},
|
||||||
{"I", "I;32BS", 32, unpackI32BS},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32BS, 32, unpackI32BS},
|
||||||
{"I", "I;32N", 32, unpackI32N},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32N, 32, unpackI32N},
|
||||||
{"I", "I;32NS", 32, unpackI32NS},
|
{IMAGING_MODE_I, IMAGING_RAWMODE_I_32NS, 32, unpackI32NS},
|
||||||
|
|
||||||
/* floating point variations */
|
/* floating point variations */
|
||||||
{"F", "F", 32, copy4},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F, 32, copy4},
|
||||||
{"F", "F;8", 8, unpackF8},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_8, 8, unpackF8},
|
||||||
{"F", "F;8S", 8, unpackF8S},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_8S, 8, unpackF8S},
|
||||||
{"F", "F;16", 16, unpackF16},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16, 16, unpackF16},
|
||||||
{"F", "F;16S", 16, unpackF16S},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16S, 16, unpackF16S},
|
||||||
{"F", "F;16B", 16, unpackF16B},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16B, 16, unpackF16B},
|
||||||
{"F", "F;16BS", 16, unpackF16BS},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16BS, 16, unpackF16BS},
|
||||||
{"F", "F;16N", 16, unpackF16N},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16N, 16, unpackF16N},
|
||||||
{"F", "F;16NS", 16, unpackF16NS},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_16NS, 16, unpackF16NS},
|
||||||
{"F", "F;32", 32, unpackF32},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32, 32, unpackF32},
|
||||||
{"F", "F;32S", 32, unpackF32S},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32S, 32, unpackF32S},
|
||||||
{"F", "F;32B", 32, unpackF32B},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32B, 32, unpackF32B},
|
||||||
{"F", "F;32BS", 32, unpackF32BS},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32BS, 32, unpackF32BS},
|
||||||
{"F", "F;32N", 32, unpackF32N},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32N, 32, unpackF32N},
|
||||||
{"F", "F;32NS", 32, unpackF32NS},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32NS, 32, unpackF32NS},
|
||||||
{"F", "F;32F", 32, unpackF32F},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32F, 32, unpackF32F},
|
||||||
{"F", "F;32BF", 32, unpackF32BF},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32BF, 32, unpackF32BF},
|
||||||
{"F", "F;32NF", 32, unpackF32NF},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_32NF, 32, unpackF32NF},
|
||||||
#ifdef FLOAT64
|
#ifdef FLOAT64
|
||||||
{"F", "F;64F", 64, unpackF64F},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_64F, 64, unpackF64F},
|
||||||
{"F", "F;64BF", 64, unpackF64BF},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_64BF, 64, unpackF64BF},
|
||||||
{"F", "F;64NF", 64, unpackF64NF},
|
{IMAGING_MODE_F, IMAGING_RAWMODE_F_64NF, 64, unpackF64NF},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* storage modes */
|
/* storage modes */
|
||||||
{"I;16", "I;16", 16, copy2},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16, 16, copy2},
|
||||||
{"I;16B", "I;16B", 16, copy2},
|
{IMAGING_MODE_I_16B, IMAGING_RAWMODE_I_16B, 16, copy2},
|
||||||
{"I;16L", "I;16L", 16, copy2},
|
{IMAGING_MODE_I_16L, IMAGING_RAWMODE_I_16L, 16, copy2},
|
||||||
{"I;16N", "I;16N", 16, copy2},
|
{IMAGING_MODE_I_16N, IMAGING_RAWMODE_I_16N, 16, copy2},
|
||||||
|
|
||||||
{"I;16", "I;16B", 16, unpackI16B_I16},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16B, 16, unpackI16B_I16},
|
||||||
{"I;16", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian.
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16N, 16, unpackI16N_I16
|
||||||
{"I;16L", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian.
|
}, // LibTiff native->image endian.
|
||||||
{"I;16B", "I;16N", 16, unpackI16N_I16B},
|
{IMAGING_MODE_I_16L, IMAGING_RAWMODE_I_16N, 16, unpackI16N_I16
|
||||||
|
}, // LibTiff native->image endian.
|
||||||
|
{IMAGING_MODE_I_16B, IMAGING_RAWMODE_I_16N, 16, unpackI16N_I16B},
|
||||||
|
|
||||||
{"I;16", "I;16R", 16, unpackI16R_I16},
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_16R, 16, unpackI16R_I16},
|
||||||
|
|
||||||
{"I;16", "I;12", 12, unpackI12_I16}, // 12 bit Tiffs stored in 16bits.
|
{IMAGING_MODE_I_16, IMAGING_RAWMODE_I_12, 12, unpackI12_I16
|
||||||
|
} // 12 bit Tiffs stored in 16bits.
|
||||||
{NULL} /* sentinel */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ImagingShuffler
|
ImagingShuffler
|
||||||
ImagingFindUnpacker(const char *mode, const char *rawmode, int *bits_out) {
|
ImagingFindUnpacker(const ModeID mode, const RawModeID rawmode, int *bits_out) {
|
||||||
int i;
|
for (size_t i = 0; i < sizeof(unpackers) / sizeof(*unpackers); i++) {
|
||||||
|
if (unpackers[i].mode == mode && unpackers[i].rawmode == rawmode) {
|
||||||
/* find a suitable pixel unpacker */
|
|
||||||
for (i = 0; unpackers[i].rawmode; i++) {
|
|
||||||
if (strcmp(unpackers[i].mode, mode) == 0 &&
|
|
||||||
strcmp(unpackers[i].rawmode, rawmode) == 0) {
|
|
||||||
if (bits_out) {
|
if (bits_out) {
|
||||||
*bits_out = unpackers[i].bits;
|
*bits_out = unpackers[i].bits;
|
||||||
}
|
}
|
||||||
|
|
10
src/map.c
10
src/map.c
|
@ -55,7 +55,7 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) {
|
||||||
|
|
||||||
PyObject *target;
|
PyObject *target;
|
||||||
Py_buffer view;
|
Py_buffer view;
|
||||||
char *mode;
|
char *mode_name;
|
||||||
char *codec;
|
char *codec;
|
||||||
Py_ssize_t offset;
|
Py_ssize_t offset;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
|
@ -70,7 +70,7 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) {
|
||||||
&ysize,
|
&ysize,
|
||||||
&codec,
|
&codec,
|
||||||
&offset,
|
&offset,
|
||||||
&mode,
|
&mode_name,
|
||||||
&stride,
|
&stride,
|
||||||
&ystep
|
&ystep
|
||||||
)) {
|
)) {
|
||||||
|
@ -82,10 +82,12 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModeID mode = findModeID(mode_name);
|
||||||
|
|
||||||
if (stride <= 0) {
|
if (stride <= 0) {
|
||||||
if (!strcmp(mode, "L") || !strcmp(mode, "P")) {
|
if (mode == IMAGING_MODE_L || mode == IMAGING_MODE_P) {
|
||||||
stride = xsize;
|
stride = xsize;
|
||||||
} else if (!strncmp(mode, "I;16", 4)) {
|
} else if (isModeI16(mode)) {
|
||||||
stride = xsize * 2;
|
stride = xsize * 2;
|
||||||
} else {
|
} else {
|
||||||
stride = xsize * 4;
|
stride = xsize * 4;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user