237 #include "allheaders.h" 239 extern l_float32 AlphaMaskBorderVals[2];
241 #ifndef NO_CONSOLE_IO 288 PROCNAME(
"pixAffineSampledPta");
291 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
293 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
295 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
297 return (
PIX *)ERROR_PTR(
"invalid incolor", procName, NULL);
299 return (
PIX *)ERROR_PTR(
"ptas count not 3", procName, NULL);
301 return (
PIX *)ERROR_PTR(
"ptad count not 3", procName, NULL);
334 l_int32 i, j, w, h, d, x, y, wpls, wpld, color, cmapindex;
336 l_uint32 *datas, *datad, *lines, *lined;
340 PROCNAME(
"pixAffineSampled");
343 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
345 return (
PIX *)ERROR_PTR(
"vc not defined", procName, NULL);
347 return (
PIX *)ERROR_PTR(
"invalid incolor", procName, NULL);
349 if (d != 1 && d != 2 && d != 4 && d != 8 && d != 32)
350 return (
PIX *)ERROR_PTR(
"depth not 1, 2, 4, 8 or 16", procName, NULL);
354 if ((cmap = pixGetColormap(pixs)) != NULL) {
372 wpls = pixGetWpl(pixs);
374 wpld = pixGetWpl(pixd);
375 for (i = 0; i < h; i++) {
376 lined = datad + i * wpld;
377 for (j = 0; j < w; j++) {
379 if (x < 0 || y < 0 || x >=w || y >= h)
381 lines = datas + y * wpls;
388 }
else if (d == 32) {
430 PIX *pixt1, *pixt2, *pixd;
432 PROCNAME(
"pixAffinePta");
435 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
437 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
439 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
441 return (
PIX *)ERROR_PTR(
"invalid incolor", procName, NULL);
443 return (
PIX *)ERROR_PTR(
"ptas count not 3", procName, NULL);
445 return (
PIX *)ERROR_PTR(
"ptad count not 3", procName, NULL);
447 if (pixGetDepth(pixs) == 1)
452 d = pixGetDepth(pixt1);
457 d = pixGetDepth(pixt2);
465 colorval = 0xffffff00;
499 PIX *pixt1, *pixt2, *pixd;
501 PROCNAME(
"pixAffine");
504 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
506 return (
PIX *)ERROR_PTR(
"vc not defined", procName, NULL);
508 if (pixGetDepth(pixs) == 1)
513 d = pixGetDepth(pixt1);
518 d = pixGetDepth(pixt2);
526 colorval = 0xffffff00;
557 PROCNAME(
"pixAffinePtaColor");
560 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
562 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
564 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
565 if (pixGetDepth(pixs) != 32)
566 return (
PIX *)ERROR_PTR(
"pixs must be 32 bpp", procName, NULL);
568 return (
PIX *)ERROR_PTR(
"ptas count not 3", procName, NULL);
570 return (
PIX *)ERROR_PTR(
"ptad count not 3", procName, NULL);
594 l_int32 i, j, w, h, d, wpls, wpld;
596 l_uint32 *datas, *datad, *lined;
598 PIX *pix1, *pix2, *pixd;
600 PROCNAME(
"pixAffineColor");
603 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
606 return (
PIX *)ERROR_PTR(
"pixs must be 32 bpp", procName, NULL);
608 return (
PIX *)ERROR_PTR(
"vc not defined", procName, NULL);
611 wpls = pixGetWpl(pixs);
615 wpld = pixGetWpl(pixd);
618 for (i = 0; i < h; i++) {
619 lined = datad + i * wpld;
620 for (j = 0; j < w; j++) {
630 if (pixGetSpp(pixs) == 4) {
660 PROCNAME(
"pixAffinePtaGray");
663 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
665 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
667 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
668 if (pixGetDepth(pixs) != 8)
669 return (
PIX *)ERROR_PTR(
"pixs must be 8 bpp", procName, NULL);
671 return (
PIX *)ERROR_PTR(
"ptas count not 3", procName, NULL);
673 return (
PIX *)ERROR_PTR(
"ptad count not 3", procName, NULL);
698 l_int32 i, j, w, h, wpls, wpld, val;
699 l_uint32 *datas, *datad, *lined;
703 PROCNAME(
"pixAffineGray");
706 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
708 if (pixGetDepth(pixs) != 8)
709 return (
PIX *)ERROR_PTR(
"pixs must be 8 bpp", procName, NULL);
711 return (
PIX *)ERROR_PTR(
"vc not defined", procName, NULL);
714 wpls = pixGetWpl(pixs);
718 wpld = pixGetWpl(pixd);
721 for (i = 0; i < h; i++) {
722 lined = datad + i * wpld;
723 for (j = 0; j < w; j++) {
790 PIX *pixd, *pixb1, *pixb2, *pixg2, *pixga;
793 PROCNAME(
"pixAffinePtaWithAlpha");
796 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
798 if (d != 32 && pixGetColormap(pixs) == NULL)
799 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, NULL);
800 if (pixg && pixGetDepth(pixg) != 8) {
801 L_WARNING(
"pixg not 8 bpp; using 'fract' transparent alpha\n",
805 if (!pixg && (fract < 0.0 || fract > 1.0)) {
806 L_WARNING(
"invalid fract; using 1.0 (fully transparent)\n", procName);
809 if (!pixg && fract == 0.0)
810 L_WARNING(
"fully opaque alpha; image will not be blended\n", procName);
812 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
814 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
834 if (ws > 10 && hs > 10) {
836 (l_int32)(255.0 * fract * AlphaMaskBorderVals[0]));
838 (l_int32)(255.0 * fract * AlphaMaskBorderVals[1]));
936 l_float32 x1, y1, x2, y2, x3, y3;
940 PROCNAME(
"getAffineXformCoeffs");
943 return ERROR_INT(
"ptas not defined", procName, 1);
945 return ERROR_INT(
"ptad not defined", procName, 1);
947 return ERROR_INT(
"&vc not defined", procName, 1);
949 if ((b = (l_float32 *)LEPT_CALLOC(6,
sizeof(l_float32))) == NULL)
950 return ERROR_INT(
"b not made", procName, 1);
960 for (i = 0; i < 6; i++)
961 if ((a[i] = (l_float32 *)LEPT_CALLOC(6,
sizeof(l_float32))) == NULL)
962 return ERROR_INT(
"a[i] not made", procName, 1);
985 for (i = 0; i < 6; i++)
1030 l_float32 b[3] = {1.0, 1.0, 1.0};
1032 PROCNAME(
"affineInvertXform");
1035 return ERROR_INT(
"&vci not defined", procName, 1);
1038 return ERROR_INT(
"vc not defined", procName, 1);
1041 for (i = 0; i < 3; i++)
1042 a[i] = (l_float32 *)LEPT_CALLOC(3,
sizeof(l_float32));
1051 vci = (l_float32 *)LEPT_CALLOC(6,
sizeof(l_float32));
1059 for (i = 0; i < 3; i++)
1066 for (i = 0; i < 2; i++)
1067 a2[i] = (l_float32 *)LEPT_CALLOC(2,
sizeof(l_float32));
1075 vci = (l_float32 *)LEPT_CALLOC(6,
sizeof(l_float32));
1083 for (i = 0; i < 2; i++)
1113 PROCNAME(
"affineXformSampledPt");
1116 return ERROR_INT(
"vc not defined", procName, 1);
1118 *pxp = (l_int32)(vc[0] * x + vc[1] * y + vc[2] + 0.5);
1119 *pyp = (l_int32)(vc[3] * x + vc[4] * y + vc[5] + 0.5);
1145 PROCNAME(
"affineXformPt");
1148 return ERROR_INT(
"vc not defined", procName, 1);
1150 *pxp = vc[0] * x + vc[1] * y + vc[2];
1151 *pyp = vc[3] * x + vc[4] * y + vc[5];
1189 l_int32 valid, xpm, ypm, xp, xp2, yp, xf, yf;
1190 l_int32 rval, gval, bval;
1191 l_uint32 word00, word01, word10, word11;
1194 PROCNAME(
"linearInterpolatePixelColor");
1197 return ERROR_INT(
"&val not defined", procName, 1);
1200 return ERROR_INT(
"datas not defined", procName, 1);
1206 valid = (x >= 0.0 && y >= 0.0 && x < w && y < h);
1207 if (!valid)
return 0;
1209 xpm = (l_int32)(16.0 * x);
1210 ypm = (l_int32)(16.0 * y);
1212 xp2 = xp + 1 < w ? xp + 1 : xp;
1214 if (yp + 1 >= h) wpls = 0;
1219 if (xf < 0 || yf < 0)
1220 fprintf(stderr,
"xp = %d, yp = %d, xf = %d, yf = %d\n", xp, yp, xf, yf);
1224 lines = datas + yp * wpls;
1225 word00 = *(lines + xp);
1226 word10 = *(lines + xp2);
1227 word01 = *(lines + wpls + xp);
1228 word11 = *(lines + wpls + xp2);
1229 rval = ((16 - xf) * (16 - yf) * ((word00 >> L_RED_SHIFT) & 0xff) +
1230 xf * (16 - yf) * ((word10 >> L_RED_SHIFT) & 0xff) +
1231 (16 - xf) * yf * ((word01 >> L_RED_SHIFT) & 0xff) +
1232 xf * yf * ((word11 >> L_RED_SHIFT) & 0xff)) / 256;
1233 gval = ((16 - xf) * (16 - yf) * ((word00 >> L_GREEN_SHIFT) & 0xff) +
1234 xf * (16 - yf) * ((word10 >> L_GREEN_SHIFT) & 0xff) +
1235 (16 - xf) * yf * ((word01 >> L_GREEN_SHIFT) & 0xff) +
1236 xf * yf * ((word11 >> L_GREEN_SHIFT) & 0xff)) / 256;
1237 bval = ((16 - xf) * (16 - yf) * ((word00 >> L_BLUE_SHIFT) & 0xff) +
1238 xf * (16 - yf) * ((word10 >> L_BLUE_SHIFT) & 0xff) +
1239 (16 - xf) * yf * ((word01 >> L_BLUE_SHIFT) & 0xff) +
1240 xf * yf * ((word11 >> L_BLUE_SHIFT) & 0xff)) / 256;
1275 l_int32 valid, xpm, ypm, xp, xp2, yp, xf, yf, v00, v10, v01, v11;
1278 PROCNAME(
"linearInterpolatePixelGray");
1281 return ERROR_INT(
"&val not defined", procName, 1);
1284 return ERROR_INT(
"datas not defined", procName, 1);
1290 valid = (x >= 0.0 && y >= 0.0 && x < w && y < h);
1291 if (!valid)
return 0;
1293 xpm = (l_int32)(16.0 * x);
1294 ypm = (l_int32)(16.0 * y);
1296 xp2 = xp + 1 < w ? xp + 1 : xp;
1298 if (yp + 1 >= h) wpls = 0;
1303 if (xf < 0 || yf < 0)
1304 fprintf(stderr,
"xp = %d, yp = %d, xf = %d, yf = %d\n", xp, yp, xf, yf);
1308 lines = datas + yp * wpls;
1313 *pval = (v00 + v01 + v10 + v11) / 256;
1322 #define SWAP(a,b) {temp = (a); (a) = (b); (b) = temp;} 1349 l_int32 i, icol, irow, j, k, col, row, success;
1350 l_int32 *indexc, *indexr, *ipiv;
1351 l_float32 maxval, val, pivinv, temp;
1353 PROCNAME(
"gaussjordan");
1356 return ERROR_INT(
"a not defined", procName, 1);
1358 return ERROR_INT(
"b not defined", procName, 1);
1361 indexc = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32));
1362 indexr = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32));
1363 ipiv = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32));
1364 if (!indexc || !indexr || !ipiv) {
1365 L_ERROR(
"array not made\n", procName);
1367 goto cleanup_arrays;
1371 for (i = 0; i < n; i++) {
1373 for (j = 0; j < n; j++) {
1375 for (k = 0; k < n; k++) {
1377 if (fabs(a[j][k]) >= maxval) {
1378 maxval = fabs(a[j][k]);
1382 }
else if (ipiv[k] > 1) {
1383 L_ERROR(
"singular matrix\n", procName);
1385 goto cleanup_arrays;
1393 for (col = 0; col < n; col++)
1394 SWAP(a[irow][col], a[icol][col]);
1395 SWAP(b[irow], b[icol]);
1400 if (a[icol][icol] == 0.0) {
1401 L_ERROR(
"singular matrix\n", procName);
1403 goto cleanup_arrays;
1405 pivinv = 1.0 / a[icol][icol];
1406 a[icol][icol] = 1.0;
1407 for (col = 0; col < n; col++)
1408 a[icol][col] *= pivinv;
1411 for (row = 0; row < n; row++) {
1415 for (col = 0; col < n; col++)
1416 a[row][col] -= a[icol][col] * val;
1417 b[row] -= b[icol] * val;
1422 for (col = n - 1; col >= 0; col--) {
1423 if (indexr[col] != indexc[col]) {
1424 for (k = 0; k < n; k++)
1425 SWAP(a[k][indexr[col]], a[k][indexc[col]]);
1433 return (success) ? 0 : 1;
1475 l_int32 x1, y1, x2, y2, x3, y3;
1476 l_int32 x1p, y1p, x2p, y2p, x3p, y3p;
1478 l_float32 x2s, x2sp, scalex, scaley;
1479 l_float32 th3, th3p, ph2, ph2p;
1483 PIX *pix1, *pix2, *pixd;
1485 PROCNAME(
"pixAffineSequential");
1488 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1490 return (
PIX *)ERROR_PTR(
"ptas not defined", procName, NULL);
1492 return (
PIX *)ERROR_PTR(
"ptad not defined", procName, NULL);
1495 return (
PIX *)ERROR_PTR(
"ptas count not 3", procName, NULL);
1497 return (
PIX *)ERROR_PTR(
"ptad count not 3", procName, NULL);
1505 pix1 = pix2 = pixd = NULL;
1508 return (
PIX *)ERROR_PTR(
"y1 == y3!", procName, NULL);
1510 return (
PIX *)ERROR_PTR(
"y1p == y3p!", procName, NULL);
1512 if (bw != 0 || bh != 0) {
1528 return (
PIX *)ERROR_PTR(
"pix1 not made", procName, NULL);
1545 th3 = atan2((l_float64)(x1 - x3), (l_float64)(y1 - y3));
1546 x2s = (l_float32)(x2 - ((l_float32)(y1 - y2) * (x3 - x1)) / (y1 - y3));
1547 if (x2s == (l_float32)x1) {
1548 L_ERROR(
"x2s == x1!\n", procName);
1551 ph2 = atan2((l_float64)(y1 - y2), (l_float64)(x2s - x1));
1557 th3p = atan2((l_float64)(x1p - x3p), (l_float64)(y1p - y3p));
1558 x2sp = (l_float32)(x2p -
1559 ((l_float32)(y1p - y2p) * (x3p - x1p)) / (y1p - y3p));
1560 if (x2sp == (l_float32)x1p) {
1561 L_ERROR(
"x2sp == x1p!\n", procName);
1564 ph2p = atan2((l_float64)(y1p - y2p), (l_float64)(x2sp - x1p));
1575 scalex = (l_float32)(x2sp - x1p) / (x2s - x1);
1576 scaley = (l_float32)(y3p - y1p) / (y3 - y1);
1577 if ((pix2 =
pixScale(pix1, scalex, scaley)) == NULL) {
1578 L_ERROR(
"pix2 not made\n", procName);
1583 rad2deg = 180. / 3.1415926535;
1584 fprintf(stderr,
"th3 = %5.1f deg, ph2 = %5.1f deg\n",
1585 rad2deg * th3, rad2deg * ph2);
1586 fprintf(stderr,
"th3' = %5.1f deg, ph2' = %5.1f deg\n",
1587 rad2deg * th3p, rad2deg * ph2p);
1588 fprintf(stderr,
"scalex = %6.3f, scaley = %6.3f\n", scalex, scaley);
1602 x1sc = (l_int32)(scalex * x1 + 0.5);
1603 y1sc = (l_int32)(scaley * y1 + 0.5);
1611 if (bw != 0 || bh != 0) {
1613 L_ERROR(
"pixd not made\n", procName);
PIX * pixAffinePta(PIX *pixs, PTA *ptad, PTA *ptas, l_int32 incolor)
pixAffinePta()
l_int32 gaussjordan(l_float32 **a, l_float32 *b, l_int32 n)
gaussjordan()
PIX * pixAffineSampled(PIX *pixs, l_float32 *vc, l_int32 incolor)
pixAffineSampled()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
l_ok pixSetRGBComponent(PIX *pixd, PIX *pixs, l_int32 comp)
pixSetRGBComponent()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
l_ok affineXformPt(l_float32 *vc, l_int32 x, l_int32 y, l_float32 *pxp, l_float32 *pyp)
affineXformPt()
PIX * pixAffineSampledPta(PIX *pixs, PTA *ptad, PTA *ptas, l_int32 incolor)
pixAffineSampledPta()
PIX * pixAffineGray(PIX *pixs, l_float32 *vc, l_uint8 grayval)
pixAffineGray()
l_ok pixRasteropIP(PIX *pixd, l_int32 hshift, l_int32 vshift, l_int32 incolor)
pixRasteropIP()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
PIX * pixAffinePtaGray(PIX *pixs, PTA *ptad, PTA *ptas, l_uint8 grayval)
pixAffinePtaGray()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok pixSetAll(PIX *pix)
pixSetAll()
l_ok pixVShearIP(PIX *pixs, l_int32 xloc, l_float32 radang, l_int32 incolor)
pixVShearIP()
#define SET_DATA_QBIT(pdata, n, val)
l_int32 ptaGetCount(PTA *pta)
ptaGetCount()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok linearInterpolatePixelGray(l_uint32 *datas, l_int32 wpls, l_int32 w, l_int32 h, l_float32 x, l_float32 y, l_int32 grayval, l_int32 *pval)
linearInterpolatePixelGray()
#define GET_DATA_BIT(pdata, n)
l_ok affineXformSampledPt(l_float32 *vc, l_int32 x, l_int32 y, l_int32 *pxp, l_int32 *pyp)
affineXformSampledPt()
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
PIX * pixAffinePtaWithAlpha(PIX *pixs, PTA *ptad, PTA *ptas, PIX *pixg, l_float32 fract, l_int32 border)
pixAffinePtaWithAlpha()
PIX * pixGetRGBComponent(PIX *pixs, l_int32 comp)
pixGetRGBComponent()
PIX * pixAddBorder(PIX *pixs, l_int32 npix, l_uint32 val)
pixAddBorder()
#define SET_DATA_DIBIT(pdata, n, val)
l_ok linearInterpolatePixelColor(l_uint32 *datas, l_int32 wpls, l_int32 w, l_int32 h, l_float32 x, l_float32 y, l_uint32 colorval, l_uint32 *pval)
linearInterpolatePixelColor()
l_ok pixSetAllArbitrary(PIX *pix, l_uint32 val)
pixSetAllArbitrary()
PIX * pixAffinePtaColor(PIX *pixs, PTA *ptad, PTA *ptas, l_uint32 colorval)
pixAffinePtaColor()
l_ok pixHShearIP(PIX *pixs, l_int32 yloc, l_float32 radang, l_int32 incolor)
pixHShearIP()
l_ok pixClearAll(PIX *pix)
pixClearAll()
l_ok pixSetBorderRingVal(PIX *pixs, l_int32 dist, l_uint32 val)
pixSetBorderRingVal()
l_ok ptaGetPt(PTA *pta, l_int32 index, l_float32 *px, l_float32 *py)
ptaGetPt()
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_QBIT(pdata, n)
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BIT_VAL(pdata, n, val)
PIX * pixAffineSequential(PIX *pixs, PTA *ptad, PTA *ptas, l_int32 bw, l_int32 bh)
pixAffineSequential()
PIX * pixClone(PIX *pixs)
pixClone()
l_ok getAffineXformCoeffs(PTA *ptas, PTA *ptad, l_float32 **pvc)
getAffineXformCoeffs()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixAffine(PIX *pixs, l_float32 *vc, l_int32 incolor)
pixAffine()
l_ok pixcmapAddBlackOrWhite(PIXCMAP *cmap, l_int32 color, l_int32 *pindex)
pixcmapAddBlackOrWhite()
#define GET_DATA_DIBIT(pdata, n)
void ptaDestroy(PTA **ppta)
ptaDestroy()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
PIX * pixResizeToMatch(PIX *pixs, PIX *pixt, l_int32 w, l_int32 h)
pixResizeToMatch()
PTA * ptaTransform(PTA *ptas, l_int32 shiftx, l_int32 shifty, l_float32 scalex, l_float32 scaley)
ptaTransform()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
PIX * pixAffineColor(PIX *pixs, l_float32 *vc, l_uint32 colorval)
pixAffineColor()
l_ok affineInvertXform(l_float32 *vc, l_float32 **pvci)
affineInvertXform()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
PIX * pixScale(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScale()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()