2010-07-31 06:52:47 +04:00
|
|
|
/*
|
|
|
|
* The Python Imaging Library
|
|
|
|
* $Id$
|
2013-07-01 02:42:19 +04:00
|
|
|
*
|
2010-07-31 06:52:47 +04:00
|
|
|
* declarations for the imaging core library
|
|
|
|
*
|
|
|
|
* Copyright (c) 1997-2005 by Secret Labs AB
|
|
|
|
* Copyright (c) 1995-2005 by Fredrik Lundh
|
|
|
|
*
|
|
|
|
* See the README file for information on usage and redistribution.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "ImPlatform.h"
|
|
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef M_PI
|
2021-01-03 06:17:51 +03:00
|
|
|
#define M_PI 3.1415926535897932384626433832795
|
2010-07-31 06:52:47 +04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Image data organization:
|
|
|
|
*
|
2017-09-16 20:46:09 +03:00
|
|
|
* mode bytes byte order
|
2010-07-31 06:52:47 +04:00
|
|
|
* -------------------------------
|
2017-09-16 20:46:09 +03:00
|
|
|
* 1 1 1
|
|
|
|
* L 1 L
|
|
|
|
* P 1 P
|
2010-07-31 06:52:47 +04:00
|
|
|
* I 4 I (32-bit integer, native byte order)
|
|
|
|
* F 4 F (32-bit IEEE float, native byte order)
|
2017-09-16 20:46:09 +03:00
|
|
|
* RGB 4 R, G, B, -
|
|
|
|
* RGBA 4 R, G, B, A
|
|
|
|
* CMYK 4 C, M, Y, K
|
|
|
|
* YCbCr 4 Y, Cb, Cr, -
|
|
|
|
* Lab 4 L, a, b, -
|
2010-07-31 06:52:47 +04:00
|
|
|
*
|
|
|
|
* experimental modes (incomplete):
|
|
|
|
* LA 4 L, -, -, A
|
|
|
|
* PA 4 P, -, -, A
|
|
|
|
* I;16 2 I (16-bit integer, native byte order)
|
|
|
|
*
|
|
|
|
* "P" is an 8-bit palette mode, which should be mapped through the
|
|
|
|
* palette member to get an output image. Check palette->mode to
|
|
|
|
* find the corresponding "real" mode.
|
|
|
|
*
|
|
|
|
* For information on how to access Imaging objects from your own C
|
|
|
|
* extensions, see http://www.effbot.org/zone/pil-extending.htm
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Handles */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef struct ImagingMemoryInstance *Imaging;
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef struct ImagingAccessInstance *ImagingAccess;
|
|
|
|
typedef struct ImagingHistogramInstance *ImagingHistogram;
|
|
|
|
typedef struct ImagingOutlineInstance *ImagingOutline;
|
|
|
|
typedef struct ImagingPaletteInstance *ImagingPalette;
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* handle magics (used with PyCObject). */
|
|
|
|
#define IMAGING_MAGIC "PIL Imaging"
|
|
|
|
|
|
|
|
/* pixel types */
|
|
|
|
#define IMAGING_TYPE_UINT8 0
|
|
|
|
#define IMAGING_TYPE_INT32 1
|
|
|
|
#define IMAGING_TYPE_FLOAT32 2
|
|
|
|
#define IMAGING_TYPE_SPECIAL 3 /* check mode for details */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
#define IMAGING_MODE_LENGTH \
|
|
|
|
6 + 1 /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */
|
2013-03-15 03:36:51 +04:00
|
|
|
|
2017-09-18 22:41:28 +03:00
|
|
|
typedef struct {
|
|
|
|
char *ptr;
|
|
|
|
int size;
|
|
|
|
} ImagingMemoryBlock;
|
|
|
|
|
2010-07-31 06:52:47 +04:00
|
|
|
struct ImagingMemoryInstance {
|
|
|
|
/* Format */
|
2021-01-03 06:17:51 +03:00
|
|
|
char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK",
|
|
|
|
"YCbCr", "BGR;xy") */
|
|
|
|
int type; /* Data type (IMAGING_TYPE_*) */
|
|
|
|
int depth; /* Depth (ignored in this version) */
|
|
|
|
int bands; /* Number of bands (1, 2, 3, or 4) */
|
|
|
|
int xsize; /* Image dimension. */
|
2010-07-31 06:52:47 +04:00
|
|
|
int ysize;
|
|
|
|
|
|
|
|
/* Colour palette (for "P" images only) */
|
|
|
|
ImagingPalette palette;
|
|
|
|
|
|
|
|
/* Data pointers */
|
2021-01-03 06:17:51 +03:00
|
|
|
UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */
|
|
|
|
INT32 **image32; /* Set for 32-bit images (pixelsize=4). */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Internals */
|
2021-01-03 06:17:51 +03:00
|
|
|
char **image; /* Actual raster data. */
|
|
|
|
char *block; /* Set if data is allocated in a single block. */
|
|
|
|
ImagingMemoryBlock *blocks; /* Memory blocks for pixel storage */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */
|
|
|
|
int linesize; /* Size of a line, in bytes (xsize * pixelsize) */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Virtual methods */
|
|
|
|
void (*destroy)(Imaging im);
|
|
|
|
};
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
#define IMAGING_PIXEL_1(im, x, y) ((im)->image8[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_L(im, x, y) ((im)->image8[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_LA(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
#define IMAGING_PIXEL_P(im, x, y) ((im)->image8[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_PA(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
#define IMAGING_PIXEL_I(im, x, y) ((im)->image32[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_F(im, x, y) (((FLOAT32 *)(im)->image32[y])[x])
|
|
|
|
#define IMAGING_PIXEL_RGB(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
#define IMAGING_PIXEL_RGBA(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
#define IMAGING_PIXEL_CMYK(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
#define IMAGING_PIXEL_YCbCr(im, x, y) ((im)->image[(y)][(x)*4])
|
|
|
|
|
|
|
|
#define IMAGING_PIXEL_UINT8(im, x, y) ((im)->image8[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_INT32(im, x, y) ((im)->image32[(y)][(x)])
|
|
|
|
#define IMAGING_PIXEL_FLOAT32(im, x, y) (((FLOAT32 *)(im)->image32[y])[x])
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
struct ImagingAccessInstance {
|
2021-01-03 06:17:51 +03:00
|
|
|
const char *mode;
|
|
|
|
void (*get_pixel)(Imaging im, int x, int y, void *pixel);
|
|
|
|
void (*put_pixel)(Imaging im, int x, int y, const void *pixel);
|
2010-07-31 06:52:47 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ImagingHistogramInstance {
|
|
|
|
/* Format */
|
2021-01-03 06:17:51 +03:00
|
|
|
char mode[IMAGING_MODE_LENGTH]; /* Band names (of corresponding source image) */
|
|
|
|
int bands; /* Number of bands (1, 3, or 4) */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Data */
|
2021-01-03 06:17:51 +03:00
|
|
|
long *histogram; /* Histogram (bands*256 longs) */
|
2010-07-31 06:52:47 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ImagingPaletteInstance {
|
|
|
|
/* Format */
|
2021-01-03 06:17:51 +03:00
|
|
|
char mode[IMAGING_MODE_LENGTH]; /* Band names */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Data */
|
2022-02-16 01:56:13 +03:00
|
|
|
int size;
|
2021-01-03 06:17:51 +03:00
|
|
|
UINT8 palette[1024]; /* Palette data (same format as image data) */
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
INT16 *cache; /* Palette cache (used for predefined palettes) */
|
|
|
|
int keep_cache; /* This palette will be reused; keep cache */
|
2010-07-31 06:52:47 +04:00
|
|
|
};
|
|
|
|
|
2017-09-17 21:31:50 +03:00
|
|
|
typedef struct ImagingMemoryArena {
|
2021-01-03 06:17:51 +03:00
|
|
|
int alignment; /* Alignment in memory of each line of an image */
|
|
|
|
int block_size; /* Preferred block size, bytes */
|
|
|
|
int blocks_max; /* Maximum number of cached blocks */
|
|
|
|
int blocks_cached; /* Current number of blocks not associated with images */
|
2017-09-30 15:03:28 +03:00
|
|
|
ImagingMemoryBlock *blocks_pool;
|
2021-01-03 06:17:51 +03:00
|
|
|
int stats_new_count; /* Number of new allocated images */
|
|
|
|
int stats_allocated_blocks; /* Number of allocated blocks */
|
|
|
|
int stats_reused_blocks; /* Number of blocks which were retrieved from a pool */
|
|
|
|
int stats_reallocated_blocks; /* Number of blocks which were actually reallocated
|
|
|
|
after retrieving */
|
|
|
|
int stats_freed_blocks; /* Number of freed blocks */
|
|
|
|
} * ImagingMemoryArena;
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Objects */
|
|
|
|
/* ------- */
|
|
|
|
|
2017-09-17 21:31:50 +03:00
|
|
|
extern struct ImagingMemoryArena ImagingDefaultArena;
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max);
|
|
|
|
extern void
|
|
|
|
ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size);
|
|
|
|
|
|
|
|
extern Imaging
|
|
|
|
ImagingNew(const char *mode, int xsize, int ysize);
|
|
|
|
extern Imaging
|
|
|
|
ImagingNewDirty(const char *mode, int xsize, int ysize);
|
|
|
|
extern Imaging
|
|
|
|
ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn);
|
|
|
|
extern void
|
|
|
|
ImagingDelete(Imaging im);
|
|
|
|
|
|
|
|
extern Imaging
|
|
|
|
ImagingNewBlock(const char *mode, int xsize, int ysize);
|
|
|
|
|
|
|
|
extern Imaging
|
|
|
|
ImagingNewPrologue(const char *mode, int xsize, int ysize);
|
|
|
|
extern Imaging
|
|
|
|
ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int structure_size);
|
|
|
|
|
|
|
|
extern void
|
|
|
|
ImagingCopyPalette(Imaging destination, Imaging source);
|
|
|
|
|
|
|
|
extern void
|
|
|
|
ImagingHistogramDelete(ImagingHistogram histogram);
|
|
|
|
|
|
|
|
extern void
|
|
|
|
ImagingAccessInit(void);
|
|
|
|
extern ImagingAccess
|
|
|
|
ImagingAccessNew(Imaging im);
|
|
|
|
extern void
|
|
|
|
_ImagingAccessDelete(Imaging im, ImagingAccess access);
|
2010-07-31 06:52:47 +04:00
|
|
|
#define ImagingAccessDelete(im, access) /* nop, for now */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern ImagingPalette
|
|
|
|
ImagingPaletteNew(const char *mode);
|
|
|
|
extern ImagingPalette
|
|
|
|
ImagingPaletteNewBrowser(void);
|
|
|
|
extern ImagingPalette
|
|
|
|
ImagingPaletteDuplicate(ImagingPalette palette);
|
|
|
|
extern void
|
|
|
|
ImagingPaletteDelete(ImagingPalette palette);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingPaletteCachePrepare(ImagingPalette palette);
|
|
|
|
extern void
|
|
|
|
ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b);
|
|
|
|
extern void
|
|
|
|
ImagingPaletteCacheDelete(ImagingPalette palette);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
#define ImagingPaletteCache(p, r, g, b) \
|
|
|
|
p->cache[(r >> 2) + (g >> 2) * 64 + (b >> 2) * 64 * 64]
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingQuantize(Imaging im, int colours, int mode, int kmeans);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Threading */
|
|
|
|
/* --------- */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef void *ImagingSectionCookie;
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern void
|
|
|
|
ImagingSectionEnter(ImagingSectionCookie *cookie);
|
|
|
|
extern void
|
|
|
|
ImagingSectionLeave(ImagingSectionCookie *cookie);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Exceptions */
|
|
|
|
/* ---------- */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern void *
|
|
|
|
ImagingError_OSError(void);
|
|
|
|
extern void *
|
|
|
|
ImagingError_MemoryError(void);
|
|
|
|
extern void *
|
|
|
|
ImagingError_ModeError(void); /* maps to ValueError by default */
|
|
|
|
extern void *
|
|
|
|
ImagingError_Mismatch(void); /* maps to ValueError by default */
|
|
|
|
extern void *
|
|
|
|
ImagingError_ValueError(const char *message);
|
|
|
|
extern void
|
|
|
|
ImagingError_Clear(void);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Transform callbacks */
|
|
|
|
/* ------------------- */
|
|
|
|
|
|
|
|
/* standard transforms */
|
|
|
|
#define IMAGING_TRANSFORM_AFFINE 0
|
|
|
|
#define IMAGING_TRANSFORM_PERSPECTIVE 2
|
|
|
|
#define IMAGING_TRANSFORM_QUAD 3
|
|
|
|
|
|
|
|
/* standard filters */
|
|
|
|
#define IMAGING_TRANSFORM_NEAREST 0
|
2016-06-16 20:04:20 +03:00
|
|
|
#define IMAGING_TRANSFORM_BOX 4
|
2010-07-31 06:52:47 +04:00
|
|
|
#define IMAGING_TRANSFORM_BILINEAR 2
|
2016-06-16 20:04:20 +03:00
|
|
|
#define IMAGING_TRANSFORM_HAMMING 5
|
2010-07-31 06:52:47 +04:00
|
|
|
#define IMAGING_TRANSFORM_BICUBIC 3
|
2016-06-16 20:04:20 +03:00
|
|
|
#define IMAGING_TRANSFORM_LANCZOS 1
|
2010-07-31 06:52:47 +04:00
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef int (*ImagingTransformMap)(double *X, double *Y, int x, int y, void *data);
|
|
|
|
typedef int (*ImagingTransformFilter)(void *out, Imaging im, double x, double y);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Image Manipulation Methods */
|
|
|
|
/* -------------------------- */
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingAlphaComposite(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha);
|
|
|
|
extern Imaging
|
|
|
|
ImagingCopy(Imaging im);
|
|
|
|
extern Imaging
|
|
|
|
ImagingConvert(Imaging im, const char *mode, ImagingPalette palette, int dither);
|
|
|
|
extern Imaging
|
|
|
|
ImagingConvertInPlace(Imaging im, const char *mode);
|
|
|
|
extern Imaging
|
|
|
|
ImagingConvertMatrix(Imaging im, const char *mode, float m[]);
|
|
|
|
extern Imaging
|
|
|
|
ImagingConvertTransparent(Imaging im, const char *mode, int r, int g, int b);
|
|
|
|
extern Imaging
|
|
|
|
ImagingCrop(Imaging im, int x0, int y0, int x1, int y1);
|
|
|
|
extern Imaging
|
|
|
|
ImagingExpand(Imaging im, int x, int y, int mode);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFill(Imaging im, const void *ink);
|
|
|
|
extern int
|
|
|
|
ImagingFill2(
|
|
|
|
Imaging into, const void *ink, Imaging mask, int x0, int y0, int x1, int y1);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFillBand(Imaging im, int band, int color);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFillLinearGradient(const char *mode);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFillRadialGradient(const char *mode);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32 *kernel, FLOAT32 offset);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFlipLeftRight(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingFlipTopBottom(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes);
|
|
|
|
extern Imaging
|
|
|
|
ImagingGetBand(Imaging im, int band);
|
|
|
|
extern Imaging
|
|
|
|
ImagingMerge(const char *mode, Imaging bands[4]);
|
|
|
|
extern int
|
|
|
|
ImagingSplit(Imaging im, Imaging bands[4]);
|
|
|
|
extern int
|
2023-04-29 08:02:11 +03:00
|
|
|
ImagingGetBBox(Imaging im, int bbox[4], int consider_alpha);
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef struct {
|
|
|
|
int x, y;
|
|
|
|
INT32 count;
|
|
|
|
INT32 pixel;
|
|
|
|
} ImagingColorItem;
|
|
|
|
extern ImagingColorItem *
|
|
|
|
ImagingGetColors(Imaging im, int maxcolors, int *colors);
|
|
|
|
extern int
|
|
|
|
ImagingGetExtrema(Imaging im, void *extrema);
|
|
|
|
extern int
|
|
|
|
ImagingGetProjection(Imaging im, UINT8 *xproj, UINT8 *yproj);
|
|
|
|
extern ImagingHistogram
|
|
|
|
ImagingGetHistogram(Imaging im, Imaging mask, void *extrema);
|
|
|
|
extern Imaging
|
|
|
|
ImagingModeFilter(Imaging im, int size);
|
|
|
|
extern Imaging
|
|
|
|
ImagingNegative(Imaging im);
|
|
|
|
extern Imaging
|
|
|
|
ImagingOffset(Imaging im, int xoffset, int yoffset);
|
|
|
|
extern int
|
|
|
|
ImagingPaste(Imaging into, Imaging im, Imaging mask, int x0, int y0, int x1, int y1);
|
|
|
|
extern Imaging
|
|
|
|
ImagingPoint(Imaging im, const char *tablemode, const void *table);
|
|
|
|
extern Imaging
|
|
|
|
ImagingPointTransform(Imaging imIn, double scale, double offset);
|
|
|
|
extern Imaging
|
|
|
|
ImagingPutBand(Imaging im, Imaging imIn, int band);
|
|
|
|
extern Imaging
|
|
|
|
ImagingRankFilter(Imaging im, int size, int rank);
|
|
|
|
extern Imaging
|
|
|
|
ImagingRotate90(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingRotate180(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingRotate270(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingTranspose(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingTransverse(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]);
|
|
|
|
extern Imaging
|
|
|
|
ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]);
|
|
|
|
extern Imaging
|
|
|
|
ImagingTransform(
|
|
|
|
Imaging imOut,
|
|
|
|
Imaging imIn,
|
|
|
|
int method,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
2021-06-10 12:01:12 +03:00
|
|
|
double a[8],
|
2021-01-03 06:17:51 +03:00
|
|
|
int filter,
|
|
|
|
int fill);
|
|
|
|
extern Imaging
|
|
|
|
ImagingUnsharpMask(Imaging imOut, Imaging im, float radius, int percent, int threshold);
|
|
|
|
extern Imaging
|
|
|
|
ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n);
|
|
|
|
extern Imaging
|
|
|
|
ImagingColorLUT3D_linear(
|
|
|
|
Imaging imOut,
|
|
|
|
Imaging imIn,
|
|
|
|
int table_channels,
|
|
|
|
int size1D,
|
|
|
|
int size2D,
|
|
|
|
int size3D,
|
|
|
|
INT16 *table);
|
|
|
|
|
|
|
|
extern Imaging
|
|
|
|
ImagingCopy2(Imaging imOut, Imaging imIn);
|
|
|
|
extern Imaging
|
|
|
|
ImagingConvert2(Imaging imOut, Imaging imIn);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Channel operations */
|
|
|
|
/* any mode, except "F" */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingChopLighter(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopDarker(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopDifference(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopMultiply(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopScreen(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopAddModulo(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopSoftLight(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopHardLight(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingOverlay(Imaging imIn1, Imaging imIn2);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* "1" images only */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingChopAnd(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopOr(Imaging imIn1, Imaging imIn2);
|
|
|
|
extern Imaging
|
|
|
|
ImagingChopXor(Imaging imIn1, Imaging imIn2);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Graphics */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingDrawArc(
|
|
|
|
Imaging im,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
float start,
|
|
|
|
float end,
|
|
|
|
const void *ink,
|
|
|
|
int width,
|
|
|
|
int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void *ink, int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawChord(
|
|
|
|
Imaging im,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
float start,
|
|
|
|
float end,
|
|
|
|
const void *ink,
|
|
|
|
int fill,
|
|
|
|
int width,
|
|
|
|
int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawEllipse(
|
|
|
|
Imaging im,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
const void *ink,
|
|
|
|
int fill,
|
|
|
|
int width,
|
|
|
|
int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink, int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawWideLine(
|
|
|
|
Imaging im, int x0, int y0, int x1, int y1, const void *ink, int width, int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawPieslice(
|
|
|
|
Imaging im,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
float start,
|
|
|
|
float end,
|
|
|
|
const void *ink,
|
|
|
|
int fill,
|
|
|
|
int width,
|
|
|
|
int op);
|
|
|
|
extern int
|
|
|
|
ImagingDrawPoint(Imaging im, int x, int y, const void *ink, int op);
|
|
|
|
extern int
|
2021-11-16 14:02:54 +03:00
|
|
|
ImagingDrawPolygon(Imaging im, int points, int *xy, const void *ink, int fill, int width, int op);
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingDrawRectangle(
|
|
|
|
Imaging im,
|
|
|
|
int x0,
|
|
|
|
int y0,
|
|
|
|
int x1,
|
|
|
|
int y1,
|
|
|
|
const void *ink,
|
|
|
|
int fill,
|
|
|
|
int width,
|
|
|
|
int op);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Level 2 graphics (WORK IN PROGRESS) */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern ImagingOutline
|
|
|
|
ImagingOutlineNew(void);
|
|
|
|
extern void
|
|
|
|
ImagingOutlineDelete(ImagingOutline outline);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ImagingDrawOutline(
|
|
|
|
Imaging im, ImagingOutline outline, const void *ink, int fill, int op);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ImagingOutlineMove(ImagingOutline outline, float x, float y);
|
|
|
|
extern int
|
|
|
|
ImagingOutlineLine(ImagingOutline outline, float x, float y);
|
|
|
|
extern int
|
|
|
|
ImagingOutlineCurve(
|
|
|
|
ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3);
|
|
|
|
extern int
|
|
|
|
ImagingOutlineTransform(ImagingOutline outline, double a[6]);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ImagingOutlineClose(ImagingOutline outline);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Special effects */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingEffectSpread(Imaging imIn, int distance);
|
|
|
|
extern Imaging
|
|
|
|
ImagingEffectNoise(int xsize, int ysize, float sigma);
|
|
|
|
extern Imaging
|
|
|
|
ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* File I/O */
|
|
|
|
/* -------- */
|
|
|
|
|
|
|
|
/* Built-in drivers */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Imaging
|
|
|
|
ImagingOpenPPM(const char *filename);
|
|
|
|
extern int
|
|
|
|
ImagingSavePPM(Imaging im, const char *filename);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Codecs */
|
|
|
|
typedef struct ImagingCodecStateInstance *ImagingCodecState;
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef int (*ImagingCodec)(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
#ifdef HAVE_LIBJPEG
|
|
|
|
extern int
|
|
|
|
ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingJpegDecodeCleanup(ImagingCodecState state);
|
|
|
|
extern int
|
|
|
|
ImagingJpegUseJCSExtensions(void);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
2010-07-31 06:52:47 +04:00
|
|
|
#endif
|
2014-03-12 20:25:59 +04:00
|
|
|
#ifdef HAVE_OPENJPEG
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingJpeg2KDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingJpeg2KDecodeCleanup(ImagingCodecState state);
|
|
|
|
extern int
|
|
|
|
ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingJpeg2KEncodeCleanup(ImagingCodecState state);
|
2014-03-12 20:25:59 +04:00
|
|
|
#endif
|
2021-01-03 06:17:51 +03:00
|
|
|
#ifdef HAVE_LIBTIFF
|
|
|
|
extern int
|
|
|
|
ImagingLibTiffDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
2013-03-09 07:51:59 +04:00
|
|
|
#endif
|
2021-01-03 06:17:51 +03:00
|
|
|
#ifdef HAVE_LIBMPEG
|
|
|
|
extern int
|
|
|
|
ImagingMpegDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
2010-07-31 06:52:47 +04:00
|
|
|
#endif
|
2021-01-03 06:17:51 +03:00
|
|
|
extern int
|
|
|
|
ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingPackbitsDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingSgiRleDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingSunRleDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingTgaRleDecode(
|
|
|
|
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
#ifdef HAVE_LIBZ
|
|
|
|
extern int
|
|
|
|
ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
ImagingZipDecodeCleanup(ImagingCodecState state);
|
|
|
|
extern int
|
|
|
|
ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
|
|
|
|
extern int
|
|
|
|
ImagingZipEncodeCleanup(ImagingCodecState state);
|
2010-07-31 06:52:47 +04:00
|
|
|
#endif
|
|
|
|
|
2021-01-03 06:17:51 +03:00
|
|
|
typedef void (*ImagingShuffler)(UINT8 *out, const UINT8 *in, int pixels);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
/* Public shufflers */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern void
|
|
|
|
ImagingPackBGR(UINT8 *out, const UINT8 *in, int pixels);
|
|
|
|
extern void
|
|
|
|
ImagingUnpackYCC(UINT8 *out, const UINT8 *in, int pixels);
|
|
|
|
extern void
|
|
|
|
ImagingUnpackYCCA(UINT8 *out, const UINT8 *in, int pixels);
|
|
|
|
|
|
|
|
extern void
|
|
|
|
ImagingConvertRGB2YCbCr(UINT8 *out, const UINT8 *in, int pixels);
|
|
|
|
extern void
|
|
|
|
ImagingConvertYCbCr2RGB(UINT8 *out, const UINT8 *in, int pixels);
|
|
|
|
|
|
|
|
extern ImagingShuffler
|
|
|
|
ImagingFindUnpacker(const char *mode, const char *rawmode, int *bits_out);
|
|
|
|
extern ImagingShuffler
|
|
|
|
ImagingFindPacker(const char *mode, const char *rawmode, int *bits_out);
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
struct ImagingCodecStateInstance {
|
|
|
|
int count;
|
|
|
|
int state;
|
|
|
|
int errcode;
|
|
|
|
int x, y;
|
|
|
|
int ystep;
|
|
|
|
int xsize, ysize, xoff, yoff;
|
|
|
|
ImagingShuffler shuffle;
|
|
|
|
int bits, bytes;
|
|
|
|
UINT8 *buffer;
|
|
|
|
void *context;
|
2016-05-29 01:07:36 +03:00
|
|
|
PyObject *fd;
|
2010-07-31 06:52:47 +04:00
|
|
|
};
|
|
|
|
|
2016-06-17 13:03:21 +03:00
|
|
|
/* Codec read/write python fd */
|
2021-01-03 06:17:51 +03:00
|
|
|
extern Py_ssize_t
|
|
|
|
_imaging_read_pyFd(PyObject *fd, char *dest, Py_ssize_t bytes);
|
|
|
|
extern Py_ssize_t
|
|
|
|
_imaging_write_pyFd(PyObject *fd, char *src, Py_ssize_t bytes);
|
|
|
|
extern int
|
|
|
|
_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence);
|
|
|
|
extern Py_ssize_t
|
|
|
|
_imaging_tell_pyFd(PyObject *fd);
|
2014-03-12 20:25:59 +04:00
|
|
|
|
2010-07-31 06:52:47 +04:00
|
|
|
/* Errcodes */
|
2021-01-03 06:17:51 +03:00
|
|
|
#define IMAGING_CODEC_END 1
|
|
|
|
#define IMAGING_CODEC_OVERRUN -1
|
|
|
|
#define IMAGING_CODEC_BROKEN -2
|
|
|
|
#define IMAGING_CODEC_UNKNOWN -3
|
|
|
|
#define IMAGING_CODEC_CONFIG -8
|
|
|
|
#define IMAGING_CODEC_MEMORY -9
|
2017-08-19 15:30:41 +03:00
|
|
|
|
|
|
|
#include "ImagingUtils.h"
|
2018-03-26 18:02:08 +03:00
|
|
|
extern UINT8 *clip8_lookups;
|
|
|
|
|
2010-07-31 06:52:47 +04:00
|
|
|
#if defined(__cplusplus)
|
|
|
|
}
|
|
|
|
#endif
|