You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

644 lines
17 KiB

//
// Little cms
// Copyright (C) 1998-2007 Marti Maria
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//
// IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
// INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
// OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
// LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
// OF THIS SOFTWARE.
//
// Version 1.17
/* File lcms.i */
%module lcms
%{
#include "lcms.h"
%}
#define register
%varargs(char* args) cmsSignalError;
%ignore USE_FLOAT;
%ignore USE_C;
%ignore USE_ASSEMBLER;
%ignore USE_INLINE;
%ignore LCMS_DLL;
%ignore LCMS_DLL_BUILD;
%ignore USE_BIG_ENDIAN;
%ignore USE_INT64;
%ignore USE_CUSTOM_SWAB;
%ignore M_PI;
%ignore LOGE;
%ignore MAX_PATH;
%ignore TRUE;
%ignore FALSE;
%ignore _cmsSAMPLER;
%ignore SAMPLEDCURVE;
%ignore LPSAMPLEDCURVE;
%rename (cmsSaveProfile) _cmsSaveProfile;
%{
static PyObject *lcmsError;
static volatile int InErrorFlag;
static
int MyErrorHandler(int Severity, const char* Txt)
{
if (Severity == LCMS_ERRC_WARNING)
PyErr_Warn(lcmsError, (char*) Txt);
else
PyErr_SetString(lcmsError, Txt);
InErrorFlag = 1;
return 1;
}
%}
%init %{
lcmsError = PyErr_NewException("lcms.error", NULL, NULL);
PyDict_SetItemString(d, "error", lcmsError);
cmsSetErrorHandler(MyErrorHandler);
%}
%exception %{
InErrorFlag = 0;
$function
if (InErrorFlag) SWIG_fail;
%}
/*
* Some typemaps
*/
/*
* Gamma triple. Must be specified as tuple.
*/
%typemap(in) LPGAMMATABLE[3](LPGAMMATABLE gamma[3]) {
PyObject* tmp[3];
if (PyTuple_Check($input)) {
if (!PyArg_ParseTuple($input,"OOO",&tmp[0],&tmp[1],&tmp[2])) {
PyErr_SetString(PyExc_TypeError,"gamma must have 3 elements");
return NULL;
}
if ((SWIG_ConvertPtr(tmp[0], (void **) &gamma[0], SWIGTYPE_p_GAMMATABLE,1)) == -1) return NULL;
if ((SWIG_ConvertPtr(tmp[1], (void **) &gamma[1], SWIGTYPE_p_GAMMATABLE,1)) == -1) return NULL;
if ((SWIG_ConvertPtr(tmp[2], (void **) &gamma[2], SWIGTYPE_p_GAMMATABLE,1)) == -1) return NULL;
$1 = gamma;
} else {
PyErr_SetString(PyExc_TypeError,"expected a tuple.");
return NULL;
}
}
/*
* 1-Color containers
*/
%inline %{
typedef struct {
WORD w[MAXCHANNELS];
} COLORW;
typedef COLORW* LPCOLORW;
typedef struct {
BYTE b[MAXCHANNELS];
} COLORB;
typedef COLORB* LPCOLORB;
typedef struct {
LCMSHANDLE hIT8;
} IT8;
typedef IT8* LPIT8;
%}
%include "lcms.h"
/*
** Extend our basic types
*/
%extend COLORB {
COLORB() {
LPCOLORB v;
v = (LPCOLORB) _cmsMalloc(sizeof(COLORB));
ZeroMemory(v, sizeof(COLORB));
return v;
}
~COLORB() {
_cmsFree(self);
}
const char* __repr__() {
return "Color 8 bps";
}
WORD __getitem__(int key) {
return self -> b[key];
}
void __setitem__(int key, int val) {
self -> b[key] = (BYTE) val;
}
};
%extend COLORW {
COLORW() {
LPCOLORW v;
v = (LPCOLORW) _cmsMalloc(sizeof(COLORW));
ZeroMemory(v, sizeof(COLORW));
return v;
}
~COLORB() {
_cmsFree(self);
}
const char* __repr__() {
return "Color 16 bps";
}
WORD __getitem__(int key) {
return self -> w[key];
}
void __setitem__(int key, int val) {
self -> w[key] = (WORD) val;
}
};
%extend cmsCIEXYZ {
cmsCIEXYZ(double x=0, double y=0, double z=0) {
LPcmsCIEXYZ v;
v = (LPcmsCIEXYZ) _cmsMalloc(sizeof(cmsCIEXYZ));
v->X = x;
v->Y = y;
v->Z = z;
return v;
}
~cmsCIEXYZ() {
_cmsFree(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "XYZ [%g, %g, %g]", self->X,self->Y,self->Z);
return Buffer;
}
};
%extend cmsCIExyY {
cmsCIExyY(double x=0, double y=0, double Y=0) {
LPcmsCIExyY v;
v = (LPcmsCIExyY) _cmsMalloc(sizeof(cmsCIExyY));
v->x = x;
v->y = y;
v->Y = Y;
return v;
}
~cmsCIExyY() {
_cmsFree(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "xyY [%g, %g, %g]", self->x,self->y,self->Y);
return Buffer;
}
};
%extend cmsCIELab {
cmsCIELab(double L=0, double a=0, double b=0) {
LPcmsCIELab v;
v = (LPcmsCIELab) _cmsMalloc(sizeof(cmsCIELab));
v->L = L;
v->a = a;
v->b = b;
return v;
}
~cmsCIELab() {
_cmsFree(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "Lab [%g, %g, %g]", self->L,self->a,self->b);
return Buffer;
}
int __cmp__(cmsCIELab* a) {
return cmsDeltaE(self, a) > 0.0;
}
};
%extend cmsCIELCh {
cmsCIELCh(double L=0, double C=0, double h=0) {
LPcmsCIELCh v;
v = (LPcmsCIELCh) _cmsMalloc(sizeof(cmsCIELCh));
v->L = L;
v->C = C;
v->h = h;
return v;
}
~cmsCIELCh() {
_cmsFree(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "LCh [%g, %g, %g]", self->L,self->C,self->h);
return Buffer;
}
};
%extend cmsJCh {
cmsJCh(double J=0, double C=0, double h=0) {
LPcmsJCh v;
v = (LPcmsJCh) _cmsMalloc(sizeof(cmsJCh));
v->J = J;
v->C = C;
v->h = h;
return v;
}
~cmsJCh() {
_cmsFree(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "CIECAM JCh [%g, %g, %g]", self->J,self->C,self->h);
return Buffer;
}
};
%extend GAMMATABLE {
GAMMATABLE(double Gamma, int nEntries=256) {
return Gamma <= 0 ? cmsAllocGamma(nEntries) : cmsBuildGamma(nEntries, Gamma);
}
~GAMMATABLE() {
cmsFreeGamma(self);
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "Gamma Table of %d entries [estimated gamma %g]", self ->nEntries, cmsEstimateGamma(self));
return Buffer;
}
WORD __getitem__(int key) {
return self -> GammaTable[key];
}
void __setitem__(int key, WORD val) {
self -> GammaTable[key] = val;
}
};
%extend cmsCIExyYTRIPLE {
cmsCIExyYTRIPLE(cmsCIExyY* Red, cmsCIExyY* Green, cmsCIExyY* Blue) {
LPcmsCIExyYTRIPLE v;
v = (LPcmsCIExyYTRIPLE) _cmsMalloc(sizeof(cmsCIExyYTRIPLE));
CopyMemory(&v->Red, Red, sizeof(cmsCIExyY));
CopyMemory(&v->Green, Green, sizeof(cmsCIExyY));
CopyMemory(&v->Blue, Blue, sizeof(cmsCIExyY));
return v;
}
~cmsCIExyYTRIPLE() {
_cmsFree(self);
}
const char* __repr__() {
return "xyY Triple";
}
};
%extend cmsCIEXYZTRIPLE {
cmsCIEXYZTRIPLE(cmsCIEXYZ* Red, cmsCIEXYZ* Green, cmsCIEXYZ* Blue) {
LPcmsCIEXYZTRIPLE v;
v = (LPcmsCIEXYZTRIPLE) _cmsMalloc(sizeof(cmsCIEXYZTRIPLE));
CopyMemory(&v->Red, Red, sizeof(cmsCIExyY));
CopyMemory(&v->Green, Green, sizeof(cmsCIExyY));
CopyMemory(&v->Blue, Blue, sizeof(cmsCIExyY));
return v;
}
~cmsCIEXYZTRIPLE() {
_cmsFree(self);
}
const char* __repr__() {
return "xyY Triple";
}
};
%extend cmsViewingConditions {
cmsViewingConditions(cmsCIEXYZ* WhitePoint, double Yb, double La, int surround, double D_value) {
LPcmsViewingConditions v;
v = (LPcmsViewingConditions) _cmsMalloc(sizeof(cmsViewingConditions));
CopyMemory(&v -> whitePoint, WhitePoint, sizeof(cmsCIEXYZ));
v ->Yb = Yb;
v ->La = La;
v -> surround = surround;
v -> D_value = D_value;
return v;
}
~cmsViewingConditions() {
_cmsFree(self);
}
const char* __repr__() {
return "CIECAM97s viewing conditions";
}
};
%extend VEC3 {
VEC3(double vx=0, double vy=0, double vz=0) {
LPVEC3 v;
v = (LPVEC3) _cmsMalloc(sizeof(VEC3));
v->n[VX] =vx;
v->n[VY] =vy;
v->n[VZ] =vz;
return v;
}
~VEC3() {
_cmsFree(self);
}
double __getitem__(int key) {
return self -> n[key];
}
void __setitem__(int key, double val) {
self -> n[key] = val;
}
const char* __repr__() {
static char Buffer[256];
sprintf(Buffer, "VEC3 [%g, %g, %g]", self->n[VX],self->n[VY],self->n[VZ]);
return Buffer;
}
};
class icTagSignature {
};
%extend icTagSignature {
icTagSignature(unsigned int n) {
icTagSignature* v = (icTagSignature*) _cmsMalloc(sizeof(icTagSignature));
*v = (icTagSignature) n;
return v;
}
~icTagSignature() {
_cmsFree(self);
}
};
%extend IT8 {
IT8(const char* FileName) {
LPIT8 it8;
it8 = (LPIT8) _cmsMalloc(sizeof(IT8));
InErrorFlag = 0;
it8 -> hIT8 = cmsIT8LoadFromFile(FileName);
if (InErrorFlag) {
_cmsFree(it8);
return NULL;
}
return it8;
}
IT8() {
LPIT8 it8;
it8 = (LPIT8) _cmsMalloc(sizeof(IT8));
it8 -> hIT8 = cmsIT8Alloc();
return it8;
}
~IT8() {
cmsIT8Free(self -> hIT8);
_cmsFree(self);
}
const char* __repr__() {
return "CGATS.13/IT8 parser";
}
int saveToFile(const char* Filename) {
return cmsIT8SaveToFile(self -> hIT8, Filename);
}
int tableCount() { return cmsIT8TableCount(self -> hIT8); }
int setTable(int n) { return cmsIT8SetTable(self -> hIT8, n); }
const char* getSheetType() { return cmsIT8GetSheetType(self -> hIT8); }
int setSheetType(const char* Type) { return cmsIT8SetSheetType(self -> hIT8, Type); }
int addComment(const char* txt) { return cmsIT8SetComment(self -> hIT8, txt); }
int setProperty(const char* Prop, const char* Str) { return cmsIT8SetPropertyStr(self -> hIT8, Prop, Str); }
int setProperty(const char* Prop, double dbl) { return cmsIT8SetPropertyDbl(self -> hIT8, Prop, dbl); }
int setPropertyAsHex(const char* Prop, int Val) { return cmsIT8SetPropertyHex(self -> hIT8, Prop, Val); }
int setPropertyUncooked(const char* Prop,
const char* Str) { return cmsIT8SetPropertyUncooked(self -> hIT8, Prop, Str); }
const char* getProperty(const char* Prop) { return cmsIT8GetProperty(self -> hIT8, Prop); }
double getPropertyAsDbl(const char* Prop) { return cmsIT8GetPropertyDbl(self -> hIT8, Prop); }
const char* getData(int row, int col) { return cmsIT8GetDataRowCol(self -> hIT8, row, col); }
const char* getData(const char* Patch,
const char* Sample) { return cmsIT8GetData(self -> hIT8, Patch, Sample); }
double getDataAsDbl(int row, int col) { return cmsIT8GetDataRowColDbl(self -> hIT8, row, col); }
double getDataAsDbl(const char* Patch,
const char* Sample) { return cmsIT8GetDataDbl(self -> hIT8, Patch, Sample); }
int setData(int row, int col, const char* Val) { return cmsIT8SetDataRowCol(self ->hIT8, row, col, Val); }
int setData(int row, int col, double dbl) { return cmsIT8SetDataRowColDbl(self ->hIT8, row, col, dbl); }
int setData(const char* Patch,
const char* Sample,
const char* Val) { return cmsIT8SetData(self ->hIT8, Patch, Sample, Val); }
int setData(const char* Patch,
const char* Sample,
double dbl) { return cmsIT8SetDataDbl(self ->hIT8, Patch, Sample, dbl); }
int setDataFormat(int nSample, const char* Sample) { return cmsIT8SetDataFormat(self -> hIT8, nSample, Sample); }
const char* getPatchName(int nPatch) { return cmsIT8GetPatchName(self -> hIT8, nPatch, NULL); }
int getDataFormat(const char* Patch) { return cmsIT8GetDataFormat(self -> hIT8, Patch); }
PyObject* enumDataFormat() {
char** DataFormat;
PyObject* TheList;
PyObject* OneDataFormat;
int i, n;
n = cmsIT8EnumDataFormat(self -> hIT8, &DataFormat);
TheList = PyList_New(n);
if (!TheList) return NULL;
for (i = 0; i < n; i++) {
OneDataFormat = PyString_FromString(DataFormat[i]);
PyList_SET_ITEM(TheList, i, OneDataFormat);
}
return TheList;
}
PyObject* enumProperties() {
const char** Props;
PyObject* TheList;
PyObject* OneProp;
int i, n;
n = cmsIT8EnumProperties(self -> hIT8, &Props);
TheList = PyList_New(n);
if (!TheList) return NULL;
for (i = 0; i < n; i++) {
OneProp = PyString_FromString(Props[i]);
PyList_SET_ITEM(TheList, i, OneProp);
}
return TheList;
}
int setTableByLabel(const char* cSet, const char *cFld = NULL, const char* ExpectedType = NULL) {
return cmsIT8SetTableByLabel(self -> hIT8, cSet, cFld, ExpectedType);
}
PyObject* getRow(int n) {
PyObject* TheList;
PyObject* OneProp;
int i;
int nf = (int) cmsIT8GetPropertyDbl(self -> hIT8, "NUMBER_OF_FIELDS");
if (nf <= 0) return NULL;
TheList = PyList_New(nf);
if (!TheList) return NULL;
for (i = 0; i < nf; i++) {
OneProp = PyString_FromString(cmsIT8GetDataRowCol(self ->hIT8, n, i));
PyList_SET_ITEM(TheList, i, OneProp);
}
return TheList;
}
PyObject* getCol(const char *Patch) {
PyObject* TheList;
PyObject* OneProp;
int i;
int n = cmsIT8GetDataFormat(self -> hIT8, Patch);
if (n < 0) return NULL;
int ns = (int) cmsIT8GetPropertyDbl(self -> hIT8, "NUMBER_OF_SETS");
if (ns <= 0) return NULL;
TheList = PyList_New(ns);
if (!TheList) return NULL;
for (i = 0; i < ns; i++) {
OneProp = PyString_FromString(cmsIT8GetDataRowCol(self ->hIT8, i, n));
PyList_SET_ITEM(TheList, i, OneProp);
}
return TheList;
}
};
// ----------------------------------------------------------------------- TODO
%inline %{
class StrPointer {
};
%}
%extend StrPointer {
StrPointer(char* s) {
return (StrPointer*) s;
}
};