#include "cii.h"
#include "cii←matrix.h"
#ifdef DEBUG
#define CHK(x) {res=x; if (CII←RES←ok!=res) (*((CII←RES*)1)) = (res);}
/* debugging CHK intentionally crashes if there is an error */
#else
#define CHK(x) {res=x; if (CII←RES←ok!=res) return(res);}
#endif
extern void run←ciiicecream(CII←Handle h);
static CII←RectangleRep rect1 = {0.0, 0.0, 1000.0, 1000.0};
static CII←RES
graywedge(CII←Handle h)
{
CII←RES res = CII←RES←ok;
CII←RectangleRep rect = {0.0, 0.0, 1.0, 100.0};
int i;
i = 0;
while (i < 100) {
float g;
rect.x = i;
g = i / 99.0;
CHK(CII←SetGray(h, &g));
CHK(CII←MaskRectangle(h, &rect));
i = i + 1;
};
return(res);
}
static long*
WordPointer(unsigned char * charP)
{
long unsigned w;
long unsigned d;
d = sizeof(long);
w = (long unsigned) charP;
w = w / d;
w = w * d;
return((long*)w);
}
static unsigned
BitIndex(unsigned char * charP)
{
long unsigned w;
long unsigned bitsPerWord;
bitsPerWord = sizeof(long) * 8;
w = (long unsigned) charP;
return ((w * 8) % bitsPerWord);
}
static CII←RES
setblackhalftone(CII←Handle h, int lines, int dots, unsigned phase, unsigned char thresh[])
{
CII←RES res = CII←RES←ok;
CII←HalftonePropertiesForSeparation hps[1];
CII←HalftoneProperties hp = (void*)0;
hps[0].halftoneType = (char*)0;
hps[0].toner = CII←TONER←BLACK;
hps[0].maxSample = 255;
hps[0].thresholds.sMinBox = 0;
hps[0].thresholds.fMinBox = 0;
hps[0].thresholds.sMaxBox = lines;
hps[0].thresholds.fMaxBox = dots;
hps[0].thresholds.bitsPerSample = 8;
hps[0].thresholds.bitsPerLine = 8*dots;
hps[0].thresholds.basePointer = WordPointer(thresh);
hps[0].thresholds.bitIndex = BitIndex(thresh);
hps[0].thresholds.ref = (void*)0;
hps[0].phase = phase;
hps[0].reserved = (void*)0;
CHK(CII←MakeHalftoneProperties(h, 1, hps, &hp));
CHK(CII←SetHalftoneProperties(h, hp));
CHK(CII←DestroyHalftoneProperties(h, hp));
return(res);
}
extern CII←RES
run←ciitesthalftone(CII←Handle h)
{
CII←RES res = CII←RES←ok;
float matrix[6];
float savematrix[6];
CII←HalftoneProperties hpsave = (void*)0;
CHK(CII←GetMatrix(h, savematrix));
CHK(CII←GetMatrix(h, matrix));
CHK(CIU←ApplyPreTranslate(72.0, 144.0, matrix));
CHK(CIU←ApplyPreScale(2.0, matrix));
CHK(CII←SetMatrix(h, matrix));
CHK(graywedge(h));
CHK(CIU←ApplyPreTranslate(105.0, 0.0, matrix));
CHK(CII←SetMatrix(h, matrix));
{
unsigned char thresh[8] =
{
159, 64, 32, 223,
0, 254, 191, 127
};
CHK(setblackhalftone(h, 4, 2, 4, thresh));
}
CHK(CII←GetHalftoneProperties(h, &hpsave));
CHK(graywedge(h));
CHK(CII←GetHalftoneProperties(h, &hpsave));
{
unsigned char thresh[8] =
{
0, 30, 200, 115, 60, 225, 160, 90
};
CHK(setblackhalftone(h, 1, 7, 3, thresh+1));
}
{
unsigned char thresh[7] =
{
30, 200, 115, 60, 225, 160, 90
};
CHK(setblackhalftone(h, 1, 7, 3, thresh));
}
CHK(CIU←ApplyPreTranslate(-105.0, 105.0, matrix));
CHK(CII←SetMatrix(h, matrix));
CHK(graywedge(h));
CHK(CIU←ApplyPreTranslate(105.0, 0.0, matrix));
CHK(CII←SetMatrix(h, matrix));
CHK(CII←SetHalftoneProperties(h, hpsave));
CHK(graywedge(h));
CHK(CII←DestroyHalftoneProperties(h, hpsave));
CHK(CII←SetMatrix(h, savematrix));
return(res);
}
extern void
XR←run←ciitesthalftone()
{
CII←Handle h = (CII←Handle)CII←TestDevice();
float t[6];
CII←GetInitialMatrix(h, t);
CII←SetMatrix(h, t);
run←ciitesthalftone(h);
CII←Destroy(h);
}