114 #include "allheaders.h" 117 l_int32 wpld, l_uint32 *datas, l_int32 ws,
118 l_int32 hs, l_int32 wpls);
119 static void scaleGrayLILow(l_uint32 *datad, l_int32 wd, l_int32 hd,
120 l_int32 wpld, l_uint32 *datas, l_int32 ws,
121 l_int32 hs, l_int32 wpls);
123 l_int32 ws, l_int32 hs, l_int32 wpls);
125 l_uint32 *lines, l_int32 ws, l_int32 wpls,
126 l_int32 lastlineflag);
127 static void scaleGray2xLILow(l_uint32 *datad, l_int32 wpld, l_uint32 *datas,
128 l_int32 ws, l_int32 hs, l_int32 wpls);
130 l_uint32 *lines, l_int32 ws, l_int32 wpls,
131 l_int32 lastlineflag);
132 static void scaleGray4xLILow(l_uint32 *datad, l_int32 wpld, l_uint32 *datas,
133 l_int32 ws, l_int32 hs, l_int32 wpls);
135 l_uint32 *lines, l_int32 ws, l_int32 wpls,
136 l_int32 lastlineflag);
138 l_int32 wpld, l_uint32 *datas, l_int32 ws,
139 l_int32 hs, l_int32 d, l_int32 wpls);
140 static l_int32
scaleSmoothLow(l_uint32 *datad, l_int32 wd, l_int32 hd,
141 l_int32 wpld, l_uint32 *datas, l_int32 ws,
142 l_int32 hs, l_int32 d, l_int32 wpls,
145 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
146 l_float32 rwt, l_float32 gwt, l_float32 bwt);
148 l_int32 wpld, l_uint32 *datas, l_int32 ws,
149 l_int32 hs, l_int32 wpls);
151 l_int32 wpld, l_uint32 *datas, l_int32 ws,
152 l_int32 hs, l_int32 wpls);
154 l_int32 wpld, l_uint32 *datas, l_int32 d,
156 static l_int32 scaleBinaryLow(l_uint32 *datad, l_int32 wd, l_int32 hd,
157 l_int32 wpld, l_uint32 *datas, l_int32 ws,
158 l_int32 hs, l_int32 wpls);
160 #ifndef NO_CONSOLE_IO 161 #define DEBUG_OVERFLOW 0 162 #define DEBUG_UNROLLING 0 248 l_float32 maxscale, sharpfract;
250 PROCNAME(
"pixScale");
253 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
256 maxscale = L_MAX(scalex, scaley);
257 sharpfract = (maxscale < 0.7) ? 0.2 : 0.4;
258 sharpwidth = (maxscale < 0.7) ? 1 : 2;
277 l_int32 w, h, wd, hd;
279 PROCNAME(
"pixScaleToSizeRel");
282 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
284 if (delw == 0 && delh == 0)
290 if (wd <= 0 || hd <= 0)
291 return (
PIX *)ERROR_PTR(
"pix dimension reduced to 0", procName, NULL);
321 l_float32 scalex, scaley;
323 PROCNAME(
"pixScaleToSize");
326 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
327 if (wd <= 0 && hd <= 0)
328 return (
PIX *)ERROR_PTR(
"neither wd nor hd > 0", procName, NULL);
332 scaley = (l_float32)hd / (l_float32)h;
334 }
else if (hd <= 0) {
335 scalex = (l_float32)wd / (l_float32)w;
338 scalex = (l_float32)wd / (l_float32)w;
339 scaley = (l_float32)hd / (l_float32)h;
342 return pixScale(pixs, scalex, scaley);
377 l_float32 sharpfract,
382 PIX *pixt, *pixt2, *pixd;
384 PROCNAME(
"pixScaleGeneral");
387 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
388 d = pixGetDepth(pixs);
389 if (d != 1 && d != 2 && d != 4 && d != 8 && d != 16 && d != 32)
390 return (
PIX *)ERROR_PTR(
"pixs not {1,2,4,8,16,32} bpp", procName, NULL);
391 if (scalex <= 0.0 || scaley <= 0.0)
392 return (
PIX *)ERROR_PTR(
"scale factor <= 0", procName, NULL);
393 if (scalex == 1.0 && scaley == 1.0)
401 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
404 d = pixGetDepth(pixt);
405 maxscale = L_MAX(scalex, scaley);
406 if (maxscale < 0.7) {
408 if (maxscale > 0.2 && sharpfract > 0.0 && sharpwidth > 0)
417 if (maxscale < 1.4 && sharpfract > 0.0 && sharpwidth > 0)
425 pixCopyText(pixd, pixs);
426 pixCopyInputFormat(pixd, pixs);
466 PROCNAME(
"pixScaleLI");
468 if (!pixs || (pixGetDepth(pixs) == 1))
469 return (
PIX *)ERROR_PTR(
"pixs not defined or 1 bpp", procName, NULL);
470 maxscale = L_MAX(scalex, scaley);
471 if (maxscale < 0.7) {
472 L_WARNING(
"scaling factors < 0.7; do regular scaling\n", procName);
475 d = pixGetDepth(pixs);
476 if (d != 2 && d != 4 && d != 8 && d != 16 && d != 32)
477 return (
PIX *)ERROR_PTR(
"pixs not {2,4,8,16,32} bpp", procName, NULL);
481 return (
PIX *)ERROR_PTR(
"pixt not made", procName, NULL);
483 d = pixGetDepth(pixt);
490 pixCopyInputFormat(pixd, pixs);
523 l_int32 ws, hs, wpls, wd, hd, wpld;
524 l_uint32 *datas, *datad;
528 PROCNAME(
"pixScaleColorLI");
530 if (!pixs || (pixGetDepth(pixs) != 32))
531 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
532 maxscale = L_MAX(scalex, scaley);
533 if (maxscale < 0.7) {
534 L_WARNING(
"scaling factors < 0.7; do regular scaling\n", procName);
539 if (scalex == 1.0 && scaley == 1.0)
541 if (scalex == 2.0 && scaley == 2.0)
543 if (scalex == 4.0 && scaley == 4.0)
549 wpls = pixGetWpl(pixs);
550 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
551 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
552 if ((pixd =
pixCreate(wd, hd, 32)) == NULL)
553 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
554 pixCopyResolution(pixd, pixs);
555 pixScaleResolution(pixd, scalex, scaley);
557 wpld = pixGetWpl(pixd);
559 if (pixGetSpp(pixs) == 4)
562 pixCopyInputFormat(pixd, pixs);
587 l_int32 ws, hs, wpls, wpld;
588 l_uint32 *datas, *datad;
591 PROCNAME(
"pixScaleColor2xLI");
593 if (!pixs || (pixGetDepth(pixs) != 32))
594 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
598 wpls = pixGetWpl(pixs);
599 if ((pixd =
pixCreate(2 * ws, 2 * hs, 32)) == NULL)
600 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
601 pixCopyResolution(pixd, pixs);
602 pixScaleResolution(pixd, 2.0, 2.0);
604 wpld = pixGetWpl(pixd);
606 if (pixGetSpp(pixs) == 4)
609 pixCopyInputFormat(pixd, pixs);
636 PIX *pixr, *pixg, *pixb;
637 PIX *pixrs, *pixgs, *pixbs;
640 PROCNAME(
"pixScaleColor4xLI");
642 if (!pixs || (pixGetDepth(pixs) != 32))
643 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, NULL);
656 L_ERROR(
"pixd not made\n", procName);
658 if (pixGetSpp(pixs) == 4)
660 pixCopyInputFormat(pixd, pixs);
742 l_int32 ws, hs, wpls, wd, hd, wpld;
743 l_uint32 *datas, *datad;
747 PROCNAME(
"pixScaleGrayLI");
749 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
750 return (
PIX *)ERROR_PTR(
"pixs undefined, cmapped or not 8 bpp",
752 maxscale = L_MAX(scalex, scaley);
753 if (maxscale < 0.7) {
754 L_WARNING(
"scaling factors < 0.7; do regular scaling\n", procName);
759 if (scalex == 1.0 && scaley == 1.0)
761 if (scalex == 2.0 && scaley == 2.0)
763 if (scalex == 4.0 && scaley == 4.0)
769 wpls = pixGetWpl(pixs);
770 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
771 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
772 if ((pixd =
pixCreate(wd, hd, 8)) == NULL)
773 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
774 pixCopyText(pixd, pixs);
775 pixCopyResolution(pixd, pixs);
776 pixCopyInputFormat(pixd, pixs);
777 pixScaleResolution(pixd, scalex, scaley);
779 wpld = pixGetWpl(pixd);
803 l_int32 ws, hs, wpls, wpld;
804 l_uint32 *datas, *datad;
807 PROCNAME(
"pixScaleGray2xLI");
809 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
810 return (
PIX *)ERROR_PTR(
"pixs undefined, cmapped or not 8 bpp",
815 wpls = pixGetWpl(pixs);
816 if ((pixd =
pixCreate(2 * ws, 2 * hs, 8)) == NULL)
817 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
818 pixCopyResolution(pixd, pixs);
819 pixCopyInputFormat(pixd, pixs);
820 pixScaleResolution(pixd, 2.0, 2.0);
822 wpld = pixGetWpl(pixd);
846 l_int32 ws, hs, wpls, wpld;
847 l_uint32 *datas, *datad;
850 PROCNAME(
"pixScaleGray4xLI");
852 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
853 return (
PIX *)ERROR_PTR(
"pixs undefined, cmapped or not 8 bpp",
858 wpls = pixGetWpl(pixs);
859 if ((pixd =
pixCreate(4 * ws, 4 * hs, 8)) == NULL)
860 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
861 pixCopyResolution(pixd, pixs);
862 pixCopyInputFormat(pixd, pixs);
863 pixScaleResolution(pixd, 4.0, 4.0);
865 wpld = pixGetWpl(pixd);
892 l_int32 i, ws, hs, hsm, wd, hd, wpls, wplb, wpld;
893 l_uint32 *datas, *datad, *lines, *lined, *lineb;
896 PROCNAME(
"pixScaleGray2xLIThresh");
898 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
899 return (
PIX *)ERROR_PTR(
"pixs undefined, not 8 bpp, or cmapped",
901 if (thresh < 0 || thresh > 256)
902 return (
PIX *)ERROR_PTR(
"thresh must be in [0, ... 256]",
910 wpls = pixGetWpl(pixs);
914 if ((lineb = (l_uint32 *)LEPT_CALLOC(2 * wplb,
sizeof(l_uint32))) == NULL)
915 return (
PIX *)ERROR_PTR(
"lineb not made", procName, NULL);
918 if ((pixd =
pixCreate(wd, hd, 1)) == NULL) {
920 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
922 pixCopyInputFormat(pixd, pixs);
923 pixCopyResolution(pixd, pixs);
924 pixScaleResolution(pixd, 2.0, 2.0);
925 wpld = pixGetWpl(pixd);
929 for (i = 0; i < hsm; i++) {
930 lines = datas + i * wpls;
931 lined = datad + 2 * i * wpld;
933 thresholdToBinaryLineLow(lined, wd, lineb, 8, thresh);
934 thresholdToBinaryLineLow(lined + wpld, wd, lineb + wplb, 8, thresh);
938 lines = datas + hsm * wpls;
939 lined = datad + 2 * hsm * wpld;
941 thresholdToBinaryLineLow(lined, wd, lineb, 8, thresh);
942 thresholdToBinaryLineLow(lined + wpld, wd, lineb + wplb, 8, thresh);
970 l_int32 i, ws, hs, hsm, wd, hd, wpls, wplb, wpld;
971 l_uint32 *datas, *datad;
973 l_uint32 *lineb = NULL;
974 l_uint32 *linebp = NULL;
975 l_uint32 *bufs = NULL;
978 PROCNAME(
"pixScaleGray2xLIDither");
980 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
981 return (
PIX *)ERROR_PTR(
"pixs undefined, not 8 bpp, or cmapped",
989 wpls = pixGetWpl(pixs);
992 if ((bufs = (l_uint32 *)LEPT_CALLOC(2 * wpls,
sizeof(l_uint32))) == NULL)
993 return (
PIX *)ERROR_PTR(
"bufs not made", procName, NULL);
997 if ((lineb = (l_uint32 *)LEPT_CALLOC(2 * wplb,
sizeof(l_uint32))) == NULL) {
998 L_ERROR(
"lineb not made\n", procName);
1003 if ((linebp = (l_uint32 *)LEPT_CALLOC(wplb,
sizeof(l_uint32))) == NULL) {
1004 L_ERROR(
"linebp not made\n", procName);
1009 if ((pixd =
pixCreate(wd, hd, 1)) == NULL) {
1010 L_ERROR(
"pixd not made\n", procName);
1013 pixCopyInputFormat(pixd, pixs);
1014 pixCopyResolution(pixd, pixs);
1015 pixScaleResolution(pixd, 2.0, 2.0);
1016 wpld = pixGetWpl(pixd);
1020 memcpy(bufs, datas, 4 * wpls);
1021 memcpy(bufs + wpls, datas + wpls, 4 * wpls);
1029 for (i = 1; i < hsm; i++) {
1030 memcpy(bufs, datas + i * wpls, 4 * wpls);
1031 memcpy(bufs + wpls, datas + (i + 1) * wpls, 4 * wpls);
1032 memcpy(linebp, lineb + wplb, 4 * wplb);
1034 lined = datad + 2 * i * wpld;
1044 memcpy(bufs, datas + hsm * wpls, 4 * wpls);
1045 memcpy(linebp, lineb + wplb, 4 * wplb);
1090 l_int32 i, j, ws, hs, hsm, wd, hd, wpls, wplb, wpld;
1091 l_uint32 *datas, *datad, *lines, *lined, *lineb;
1094 PROCNAME(
"pixScaleGray4xLIThresh");
1096 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
1097 return (
PIX *)ERROR_PTR(
"pixs undefined, not 8 bpp, or cmapped",
1099 if (thresh < 0 || thresh > 256)
1100 return (
PIX *)ERROR_PTR(
"thresh must be in [0, ... 256]",
1108 wpls = pixGetWpl(pixs);
1111 wplb = (wd + 3) / 4;
1112 if ((lineb = (l_uint32 *)LEPT_CALLOC(4 * wplb,
sizeof(l_uint32))) == NULL)
1113 return (
PIX *)ERROR_PTR(
"lineb not made", procName, NULL);
1116 if ((pixd =
pixCreate(wd, hd, 1)) == NULL) {
1118 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1120 pixCopyInputFormat(pixd, pixs);
1121 pixCopyResolution(pixd, pixs);
1122 pixScaleResolution(pixd, 4.0, 4.0);
1123 wpld = pixGetWpl(pixd);
1127 for (i = 0; i < hsm; i++) {
1128 lines = datas + i * wpls;
1129 lined = datad + 4 * i * wpld;
1131 for (j = 0; j < 4; j++) {
1132 thresholdToBinaryLineLow(lined + j * wpld, wd,
1133 lineb + j * wplb, 8, thresh);
1138 lines = datas + hsm * wpls;
1139 lined = datad + 4 * hsm * wpld;
1141 for (j = 0; j < 4; j++) {
1142 thresholdToBinaryLineLow(lined + j * wpld, wd,
1143 lineb + j * wplb, 8, thresh);
1177 l_int32 i, j, ws, hs, hsm, wd, hd, wpls, wplb, wpld;
1178 l_uint32 *datas, *datad;
1180 l_uint32 *lineb = NULL;
1181 l_uint32 *linebp = NULL;
1182 l_uint32 *bufs = NULL;
1185 PROCNAME(
"pixScaleGray4xLIDither");
1187 if (!pixs || pixGetDepth(pixs) != 8 || pixGetColormap(pixs))
1188 return (
PIX *)ERROR_PTR(
"pixs undefined, not 8 bpp, or cmapped",
1196 wpls = pixGetWpl(pixs);
1199 if ((bufs = (l_uint32 *)LEPT_CALLOC(2 * wpls,
sizeof(l_uint32))) == NULL)
1200 return (
PIX *)ERROR_PTR(
"bufs not made", procName, NULL);
1203 wplb = (wd + 3) / 4;
1204 if ((lineb = (l_uint32 *)LEPT_CALLOC(4 * wplb,
sizeof(l_uint32))) == NULL) {
1205 L_ERROR(
"lineb not made\n", procName);
1210 if ((linebp = (l_uint32 *)LEPT_CALLOC(wplb,
sizeof(l_uint32))) == NULL) {
1211 L_ERROR(
"linebp not made\n", procName);
1216 if ((pixd =
pixCreate(wd, hd, 1)) == NULL) {
1217 L_ERROR(
"pixd not made\n", procName);
1220 pixCopyInputFormat(pixd, pixs);
1221 pixCopyResolution(pixd, pixs);
1222 pixScaleResolution(pixd, 4.0, 4.0);
1223 wpld = pixGetWpl(pixd);
1227 memcpy(bufs, datas, 4 * wpls);
1228 memcpy(bufs + wpls, datas + wpls, 4 * wpls);
1231 for (j = 0; j < 3; j++) {
1233 lineb + (j + 1) * wplb,
1238 for (i = 1; i < hsm; i++) {
1239 memcpy(bufs, datas + i * wpls, 4 * wpls);
1240 memcpy(bufs + wpls, datas + (i + 1) * wpls, 4 * wpls);
1241 memcpy(linebp, lineb + 3 * wplb, 4 * wplb);
1243 lined = datad + 4 * i * wpld;
1247 for (j = 0; j < 3; j++) {
1249 lineb + (j + 1) * wplb,
1255 memcpy(bufs, datas + hsm * wpls, 4 * wpls);
1256 memcpy(linebp, lineb + 3 * wplb, 4 * wplb);
1258 lined = datad + 4 * hsm * wpld;
1262 for (j = 0; j < 3; j++) {
1264 lineb + (j + 1) * wplb,
1302 l_int32 ws, hs, d, wpls, wd, hd, wpld;
1303 l_uint32 *datas, *datad;
1306 PROCNAME(
"pixScaleBySampling");
1309 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1310 if (scalex <= 0.0 || scaley <= 0.0)
1311 return (
PIX *)ERROR_PTR(
"scale factor <= 0", procName, NULL);
1312 if (scalex == 1.0 && scaley == 1.0)
1314 if ((d = pixGetDepth(pixs)) == 1)
1319 wpls = pixGetWpl(pixs);
1320 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
1321 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
1322 if ((pixd =
pixCreate(wd, hd, d)) == NULL)
1323 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1324 pixCopyResolution(pixd, pixs);
1325 pixScaleResolution(pixd, scalex, scaley);
1327 pixCopyText(pixd, pixs);
1328 pixCopyInputFormat(pixd, pixs);
1331 wpld = pixGetWpl(pixd);
1333 if (d == 32 && pixGetSpp(pixs) == 4)
1365 l_float32 scalex, scaley;
1367 PROCNAME(
"pixScaleBySamplingToSize");
1370 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1371 if (wd <= 0 && hd <= 0)
1372 return (
PIX *)ERROR_PTR(
"neither wd nor hd > 0", procName, NULL);
1376 scaley = (l_float32)hd / (l_float32)h;
1378 }
else if (hd <= 0) {
1379 scalex = (l_float32)wd / (l_float32)w;
1382 scalex = (l_float32)wd / (l_float32)w;
1383 scaley = (l_float32)hd / (l_float32)h;
1410 PROCNAME(
"pixScaleByIntSampling");
1413 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1416 L_ERROR(
"factor must be >= 1; returning a copy\n", procName);
1420 scale = 1. / (l_float32)factor;
1451 l_int32 byteval, shift;
1452 l_int32 i, j, ws, hs, wd, hd, wpls, wpld;
1453 l_uint32 *datas, *words, *datad, *lined;
1457 PROCNAME(
"pixScaleRGBToGrayFast");
1460 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1461 if (pixGetDepth(pixs) != 32)
1462 return (
PIX *)ERROR_PTR(
"depth not 32 bpp", procName, NULL);
1464 return (
PIX *)ERROR_PTR(
"factor must be >= 1", procName, NULL);
1467 shift = L_RED_SHIFT;
1469 shift = L_GREEN_SHIFT;
1471 shift = L_BLUE_SHIFT;
1473 return (
PIX *)ERROR_PTR(
"invalid color", procName, NULL);
1477 wpls = pixGetWpl(pixs);
1481 if ((pixd =
pixCreate(wd, hd, 8)) == NULL)
1482 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1483 pixCopyResolution(pixd, pixs);
1484 pixCopyInputFormat(pixd, pixs);
1485 scale = 1. / (l_float32) factor;
1486 pixScaleResolution(pixd, scale, scale);
1488 wpld = pixGetWpl(pixd);
1490 for (i = 0; i < hd; i++) {
1491 words = datas + i * factor * wpls;
1492 lined = datad + i * wpld;
1493 for (j = 0; j < wd; j++, words += factor) {
1494 byteval = ((*words) >> shift) & 0xff;
1527 l_int32 i, j, ws, hs, wd, hd, wpls, wpld;
1528 l_uint32 *datas, *words, *datad, *lined;
1532 PROCNAME(
"pixScaleRGBToBinaryFast");
1535 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1537 return (
PIX *)ERROR_PTR(
"factor must be >= 1", procName, NULL);
1538 if (pixGetDepth(pixs) != 32)
1539 return (
PIX *)ERROR_PTR(
"depth not 32 bpp", procName, NULL);
1543 wpls = pixGetWpl(pixs);
1547 if ((pixd =
pixCreate(wd, hd, 1)) == NULL)
1548 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1549 pixCopyResolution(pixd, pixs);
1550 pixCopyInputFormat(pixd, pixs);
1551 scale = 1. / (l_float32) factor;
1552 pixScaleResolution(pixd, scale, scale);
1554 wpld = pixGetWpl(pixd);
1556 for (i = 0; i < hd; i++) {
1557 words = datas + i * factor * wpls;
1558 lined = datad + i * wpld;
1559 for (j = 0; j < wd; j++, words += factor) {
1560 byteval = ((*words) >> L_GREEN_SHIFT) & 0xff;
1561 if (byteval < thresh)
1593 l_int32 i, j, ws, hs, wd, hd, wpls, wpld, sj;
1594 l_uint32 *datas, *datad, *lines, *lined;
1598 PROCNAME(
"pixScaleGrayToBinaryFast");
1601 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1603 return (
PIX *)ERROR_PTR(
"factor must be >= 1", procName, NULL);
1604 if (pixGetDepth(pixs) != 8)
1605 return (
PIX *)ERROR_PTR(
"depth not 8 bpp", procName, NULL);
1609 wpls = pixGetWpl(pixs);
1613 if ((pixd =
pixCreate(wd, hd, 1)) == NULL)
1614 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1615 pixCopyResolution(pixd, pixs);
1616 pixCopyInputFormat(pixd, pixs);
1617 scale = 1. / (l_float32) factor;
1618 pixScaleResolution(pixd, scale, scale);
1620 wpld = pixGetWpl(pixd);
1622 for (i = 0; i < hd; i++) {
1623 lines = datas + i * factor * wpls;
1624 lined = datad + i * wpld;
1625 for (j = 0, sj = 0; j < wd; j++, sj += factor) {
1627 if (byteval < thresh)
1675 l_int32 ws, hs, d, wd, hd, wpls, wpld, isize;
1676 l_uint32 *datas, *datad;
1677 l_float32 minscale, size;
1680 PROCNAME(
"pixScaleSmooth");
1683 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
1684 if (scalex >= 0.7 || scaley >= 0.7) {
1685 L_WARNING(
"scaling factor not < 0.7; do regular scaling\n", procName);
1691 d = pixGetDepth(pix);
1692 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
1693 L_WARNING(
"pix has colormap; removing\n", procName);
1695 d = pixGetDepth(pixs);
1696 }
else if (d == 2 || d == 4) {
1703 if (d != 8 && d != 32) {
1704 L_WARNING(
"depth not 8 or 32 bpp; do regular scaling\n", procName);
1712 minscale = L_MIN(scalex, scaley);
1713 size = 1.0 / minscale;
1714 isize = L_MAX(2, (l_int32)(size + 0.5));
1717 if ((ws < isize) || (hs < isize)) {
1719 return (
PIX *)ERROR_PTR(
"pixs too small", procName, NULL);
1722 wpls = pixGetWpl(pixs);
1723 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
1724 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
1725 if (wd < 1 || hd < 1) {
1727 return (
PIX *)ERROR_PTR(
"pixd too small", procName, NULL);
1729 if ((pixd =
pixCreate(wd, hd, d)) == NULL) {
1731 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1733 pixCopyResolution(pixd, pixs);
1734 pixCopyInputFormat(pixd, pixs);
1735 pixScaleResolution(pixd, scalex, scaley);
1737 wpld = pixGetWpl(pixd);
1738 scaleSmoothLow(datad, wd, hd, wpld, datas, ws, hs, d, wpls, isize);
1739 if (d == 32 && pixGetSpp(pixs) == 4)
1772 l_float32 scalex, scaley;
1774 PROCNAME(
"pixScaleSmoothToSize");
1777 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1778 if (wd <= 0 && hd <= 0)
1779 return (
PIX *)ERROR_PTR(
"neither wd nor hd > 0", procName, NULL);
1783 scaley = (l_float32)hd / (l_float32)h;
1785 }
else if (hd <= 0) {
1786 scalex = (l_float32)wd / (l_float32)w;
1789 scalex = (l_float32)wd / (l_float32)w;
1790 scaley = (l_float32)hd / (l_float32)h;
1810 l_int32 wd, hd, wpls, wpld;
1811 l_uint32 *datas, *datad;
1814 PROCNAME(
"pixScaleRGBToGray2");
1817 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1818 if (pixGetDepth(pixs) != 32)
1819 return (
PIX *)ERROR_PTR(
"pixs not 32 bpp", procName, NULL);
1820 if (rwt + gwt + bwt < 0.98 || rwt + gwt + bwt > 1.02)
1821 return (
PIX *)ERROR_PTR(
"sum of wts should be 1.0", procName, NULL);
1823 wd = pixGetWidth(pixs) / 2;
1824 hd = pixGetHeight(pixs) / 2;
1825 wpls = pixGetWpl(pixs);
1827 if ((pixd =
pixCreate(wd, hd, 8)) == NULL)
1828 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1829 pixCopyResolution(pixd, pixs);
1830 pixCopyInputFormat(pixd, pixs);
1831 pixScaleResolution(pixd, 0.5, 0.5);
1832 wpld = pixGetWpl(pixd);
1876 l_int32 ws, hs, d, wd, hd, wpls, wpld;
1877 l_uint32 *datas, *datad;
1879 PIX *pixs, *pixd, *pixt1, *pixt2, *pixt3;
1881 PROCNAME(
"pixScaleAreaMap");
1884 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
1885 d = pixGetDepth(pix);
1886 if (d != 2 && d != 4 && d != 8 && d != 32)
1887 return (
PIX *)ERROR_PTR(
"pix not 2, 4, 8 or 32 bpp", procName, NULL);
1888 maxscale = L_MAX(scalex, scaley);
1889 if (maxscale >= 0.7) {
1890 L_WARNING(
"scaling factors not < 0.7; do regular scaling\n", procName);
1895 if (scalex == 0.5 && scaley == 0.5)
1897 if (scalex == 0.25 && scaley == 0.25) {
1903 if (scalex == 0.125 && scaley == 0.125) {
1911 if (scalex == 0.0625 && scaley == 0.0625) {
1924 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
1925 L_WARNING(
"pix has colormap; removing\n", procName);
1927 d = pixGetDepth(pixs);
1928 }
else if (d == 2 || d == 4) {
1937 wpls = pixGetWpl(pixs);
1938 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
1939 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
1940 if (wd < 1 || hd < 1) {
1942 return (
PIX *)ERROR_PTR(
"pixd too small", procName, NULL);
1944 if ((pixd =
pixCreate(wd, hd, d)) == NULL) {
1946 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
1948 pixCopyInputFormat(pixd, pixs);
1949 pixCopyResolution(pixd, pixs);
1950 pixScaleResolution(pixd, scalex, scaley);
1952 wpld = pixGetWpl(pixd);
1957 if (pixGetSpp(pixs) == 4)
1994 l_int32 wd, hd, d, wpls, wpld;
1995 l_uint32 *datas, *datad;
1998 PROCNAME(
"pixScaleAreaMap2");
2001 return (
PIX *)ERROR_PTR(
"pix not defined", procName, NULL);
2002 d = pixGetDepth(pix);
2003 if (d != 2 && d != 4 && d != 8 && d != 32)
2004 return (
PIX *)ERROR_PTR(
"pix not 2, 4, 8 or 32 bpp", procName, NULL);
2008 if ((d == 2 || d == 4 || d == 8) && pixGetColormap(pix)) {
2009 L_WARNING(
"pix has colormap; removing\n", procName);
2011 d = pixGetDepth(pixs);
2012 }
else if (d == 2 || d == 4) {
2019 wd = pixGetWidth(pixs) / 2;
2020 hd = pixGetHeight(pixs) / 2;
2022 wpls = pixGetWpl(pixs);
2025 wpld = pixGetWpl(pixd);
2026 pixCopyInputFormat(pixd, pixs);
2027 pixCopyResolution(pixd, pixs);
2028 pixScaleResolution(pixd, 0.5, 0.5);
2030 if (pixGetSpp(pixs) == 4)
2062 l_float32 scalex, scaley;
2064 PROCNAME(
"pixScaleAreaMapToSize");
2067 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2068 if (wd <= 0 && hd <= 0)
2069 return (
PIX *)ERROR_PTR(
"neither wd nor hd > 0", procName, NULL);
2073 scaley = (l_float32)hd / (l_float32)h;
2075 }
else if (hd <= 0) {
2076 scalex = (l_float32)wd / (l_float32)w;
2079 scalex = (l_float32)wd / (l_float32)w;
2080 scaley = (l_float32)hd / (l_float32)h;
2109 l_int32 ws, hs, wpls, wd, hd, wpld;
2110 l_uint32 *datas, *datad;
2113 PROCNAME(
"pixScaleBinary");
2116 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
2117 if (pixGetDepth(pixs) != 1)
2118 return (
PIX *)ERROR_PTR(
"pixs must be 1 bpp", procName, NULL);
2119 if (scalex <= 0.0 || scaley <= 0.0)
2120 return (
PIX *)ERROR_PTR(
"scale factor <= 0", procName, NULL);
2121 if (scalex == 1.0 && scaley == 1.0)
2126 wpls = pixGetWpl(pixs);
2127 wd = (l_int32)(scalex * (l_float32)ws + 0.5);
2128 hd = (l_int32)(scaley * (l_float32)hs + 0.5);
2129 if ((pixd =
pixCreate(wd, hd, 1)) == NULL)
2130 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
2132 pixCopyText(pixd, pixs);
2133 pixCopyInputFormat(pixd, pixs);
2134 pixCopyResolution(pixd, pixs);
2135 pixScaleResolution(pixd, scalex, scaley);
2137 wpld = pixGetWpl(pixd);
2138 scaleBinaryLow(datad, wd, hd, wpld, datas, ws, hs, wpls);
2171 l_int32 i, j, wm2, hm2;
2173 l_int32 xp, yp, xf, yf;
2174 l_int32 v00r, v01r, v10r, v11r, v00g, v01g, v10g, v11g;
2175 l_int32 v00b, v01b, v10b, v11b, area00, area01, area10, area11;
2176 l_uint32 pixels1, pixels2, pixels3, pixels4, pixel;
2177 l_uint32 *lines, *lined;
2184 scx = 16. * (l_float32)ws / (l_float32)wd;
2185 scy = 16. * (l_float32)hs / (l_float32)hd;
2190 for (i = 0; i < hd; i++) {
2191 ypm = (l_int32)(scy * (l_float32)i);
2194 lined = datad + i * wpld;
2195 lines = datas + yp * wpls;
2196 for (j = 0; j < wd; j++) {
2197 xpm = (l_int32)(scx * (l_float32)j);
2206 pixels1 = *(lines + xp);
2208 if (xp > wm2 || yp > hm2) {
2209 if (yp > hm2 && xp <= wm2) {
2210 pixels2 = *(lines + xp + 1);
2213 }
else if (xp > wm2 && yp <= hm2) {
2215 pixels3 = *(lines + wpls + xp);
2218 pixels4 = pixels3 = pixels2 = pixels1;
2221 pixels2 = *(lines + xp + 1);
2222 pixels3 = *(lines + wpls + xp);
2223 pixels4 = *(lines + wpls + xp + 1);
2226 area00 = (16 - xf) * (16 - yf);
2227 area10 = xf * (16 - yf);
2228 area01 = (16 - xf) * yf;
2230 v00r = area00 * ((pixels1 >> L_RED_SHIFT) & 0xff);
2231 v00g = area00 * ((pixels1 >> L_GREEN_SHIFT) & 0xff);
2232 v00b = area00 * ((pixels1 >> L_BLUE_SHIFT) & 0xff);
2233 v10r = area10 * ((pixels2 >> L_RED_SHIFT) & 0xff);
2234 v10g = area10 * ((pixels2 >> L_GREEN_SHIFT) & 0xff);
2235 v10b = area10 * ((pixels2 >> L_BLUE_SHIFT) & 0xff);
2236 v01r = area01 * ((pixels3 >> L_RED_SHIFT) & 0xff);
2237 v01g = area01 * ((pixels3 >> L_GREEN_SHIFT) & 0xff);
2238 v01b = area01 * ((pixels3 >> L_BLUE_SHIFT) & 0xff);
2239 v11r = area11 * ((pixels4 >> L_RED_SHIFT) & 0xff);
2240 v11g = area11 * ((pixels4 >> L_GREEN_SHIFT) & 0xff);
2241 v11b = area11 * ((pixels4 >> L_BLUE_SHIFT) & 0xff);
2242 pixel = (((v00r + v10r + v01r + v11r + 128) << 16) & 0xff000000) |
2243 (((v00g + v10g + v01g + v11g + 128) << 8) & 0x00ff0000) |
2244 ((v00b + v10b + v01b + v11b + 128) & 0x0000ff00);
2245 *(lined + j) = pixel;
2273 l_int32 i, j, wm2, hm2;
2275 l_int32 xp, yp, xf, yf;
2276 l_int32 v00, v01, v10, v11, v00_val, v01_val, v10_val, v11_val;
2278 l_uint32 *lines, *lined;
2285 scx = 16. * (l_float32)ws / (l_float32)wd;
2286 scy = 16. * (l_float32)hs / (l_float32)hd;
2291 for (i = 0; i < hd; i++) {
2292 ypm = (l_int32)(scy * (l_float32)i);
2295 lined = datad + i * wpld;
2296 lines = datas + yp * wpls;
2297 for (j = 0; j < wd; j++) {
2298 xpm = (l_int32)(scx * (l_float32)j);
2307 if (xp > wm2 || yp > hm2) {
2308 if (yp > hm2 && xp <= wm2) {
2312 }
else if (xp > wm2 && yp <= hm2) {
2317 v10_val = v01_val = v11_val = v00_val;
2325 v00 = (16 - xf) * (16 - yf) * v00_val;
2326 v10 = xf * (16 - yf) * v10_val;
2327 v01 = (16 - xf) * yf * v01_val;
2328 v11 = xf * yf * v11_val;
2330 val = (l_uint8)((v00 + v01 + v10 + v11 + 128) / 256);
2388 l_uint32 *lines, *lined;
2403 for (i = 0; i < hsm; i++) {
2404 lines = datas + i * wpls;
2405 lined = datad + 2 * i * wpld;
2410 lines = datas + hsm * wpls;
2411 lined = datad + 2 * hsm * wpld;
2433 l_int32 lastlineflag)
2436 l_int32 rval1, rval2, rval3, rval4, gval1, gval2, gval3, gval4;
2437 l_int32 bval1, bval2, bval3, bval4;
2438 l_uint32 pixels1, pixels2, pixels3, pixels4, pixel;
2439 l_uint32 *linesp, *linedp;
2443 if (lastlineflag == 0) {
2444 linesp = lines + wpls;
2445 linedp = lined + wpld;
2450 rval2 = pixels1 >> 24;
2451 gval2 = (pixels1 >> 16) & 0xff;
2452 bval2 = (pixels1 >> 8) & 0xff;
2453 rval4 = pixels3 >> 24;
2454 gval4 = (pixels3 >> 16) & 0xff;
2455 bval4 = (pixels3 >> 8) & 0xff;
2457 for (j = 0, jd = 0; j < wsm; j++, jd += 2) {
2466 pixels2 = *(lines + j + 1);
2467 pixels4 = *(linesp + j + 1);
2468 rval2 = pixels2 >> 24;
2469 gval2 = (pixels2 >> 16) & 0xff;
2470 bval2 = (pixels2 >> 8) & 0xff;
2471 rval4 = pixels4 >> 24;
2472 gval4 = (pixels4 >> 16) & 0xff;
2473 bval4 = (pixels4 >> 8) & 0xff;
2475 pixel = (rval1 << 24 | gval1 << 16 | bval1 << 8);
2476 *(lined + jd) = pixel;
2477 pixel = ((((rval1 + rval2) << 23) & 0xff000000) |
2478 (((gval1 + gval2) << 15) & 0x00ff0000) |
2479 (((bval1 + bval2) << 7) & 0x0000ff00));
2480 *(lined + jd + 1) = pixel;
2481 pixel = ((((rval1 + rval3) << 23) & 0xff000000) |
2482 (((gval1 + gval3) << 15) & 0x00ff0000) |
2483 (((bval1 + bval3) << 7) & 0x0000ff00));
2484 *(linedp + jd) = pixel;
2485 pixel = ((((rval1 + rval2 + rval3 + rval4) << 22) & 0xff000000) |
2486 (((gval1 + gval2 + gval3 + gval4) << 14) & 0x00ff0000) |
2487 (((bval1 + bval2 + bval3 + bval4) << 6) & 0x0000ff00));
2488 *(linedp + jd + 1) = pixel;
2497 pixel = (rval1 << 24 | gval1 << 16 | bval1 << 8);
2498 *(lined + 2 * wsm) = pixel;
2499 *(lined + 2 * wsm + 1) = pixel;
2500 pixel = ((((rval1 + rval3) << 23) & 0xff000000) |
2501 (((gval1 + gval3) << 15) & 0x00ff0000) |
2502 (((bval1 + bval3) << 7) & 0x0000ff00));
2503 *(linedp + 2 * wsm) = pixel;
2504 *(linedp + 2 * wsm + 1) = pixel;
2506 linedp = lined + wpld;
2508 rval2 = pixels2 >> 24;
2509 gval2 = (pixels2 >> 16) & 0xff;
2510 bval2 = (pixels2 >> 8) & 0xff;
2511 for (j = 0, jd = 0; j < wsm; j++, jd += 2) {
2515 pixels2 = *(lines + j + 1);
2516 rval2 = pixels2 >> 24;
2517 gval2 = (pixels2 >> 16) & 0xff;
2518 bval2 = (pixels2 >> 8) & 0xff;
2519 pixel = (rval1 << 24 | gval1 << 16 | bval1 << 8);
2520 *(lined + jd) = pixel;
2521 *(linedp + jd) = pixel;
2522 pixel = ((((rval1 + rval2) << 23) & 0xff000000) |
2523 (((gval1 + gval2) << 15) & 0x00ff0000) |
2524 (((bval1 + bval2) << 7) & 0x0000ff00));
2525 *(lined + jd + 1) = pixel;
2526 *(linedp + jd + 1) = pixel;
2531 pixel = (rval1 << 24 | gval1 << 16 | bval1 << 8);
2532 *(lined + 2 * wsm) = pixel;
2533 *(lined + 2 * wsm + 1) = pixel;
2534 *(linedp + 2 * wsm) = pixel;
2535 *(linedp + 2 * wsm + 1) = pixel;
2587 l_uint32 *lines, *lined;
2602 for (i = 0; i < hsm; i++) {
2603 lines = datas + i * wpls;
2604 lined = datad + 2 * i * wpld;
2609 lines = datas + hsm * wpls;
2610 lined = datad + 2 * hsm * wpld;
2632 l_int32 lastlineflag)
2634 l_int32 j, jd, wsm, w;
2635 l_int32 sval1, sval2, sval3, sval4;
2636 l_uint32 *linesp, *linedp;
2637 l_uint32 words, wordsp, wordd, worddp;
2641 if (lastlineflag == 0) {
2642 linesp = lines + wpls;
2643 linedp = lined + wpld;
2648 sval2 = (words >> 24) & 0xff;
2649 sval4 = (wordsp >> 24) & 0xff;
2650 for (j = 0, jd = 0, w = 0; j + 3 < wsm; j += 4, jd += 8, w++) {
2656 sval2 = (words >> 16) & 0xff;
2658 sval4 = (wordsp >> 16) & 0xff;
2659 wordd = (sval1 << 24) | (((sval1 + sval2) >> 1) << 16);
2660 worddp = (((sval1 + sval3) >> 1) << 24) |
2661 (((sval1 + sval2 + sval3 + sval4) >> 2) << 16);
2664 sval2 = (words >> 8) & 0xff;
2666 sval4 = (wordsp >> 8) & 0xff;
2667 wordd |= (sval1 << 8) | ((sval1 + sval2) >> 1);
2668 worddp |= (((sval1 + sval3) >> 1) << 8) |
2669 ((sval1 + sval2 + sval3 + sval4) >> 2);
2670 lined[w * 2] = wordd;
2671 linedp[w * 2] = worddp;
2674 sval2 = words & 0xff;
2676 sval4 = wordsp & 0xff;
2677 wordd = (sval1 << 24) |
2678 (((sval1 + sval2) >> 1) << 16);
2679 worddp = (((sval1 + sval3) >> 1) << 24) |
2680 (((sval1 + sval2 + sval3 + sval4) >> 2) << 16);
2683 words = lines[w + 1];
2684 wordsp = linesp[w + 1];
2686 sval2 = (words >> 24) & 0xff;
2688 sval4 = (wordsp >> 24) & 0xff;
2689 wordd |= (sval1 << 8) |
2690 ((sval1 + sval2) >> 1);
2691 worddp |= (((sval1 + sval3) >> 1) << 8) |
2692 ((sval1 + sval2 + sval3 + sval4) >> 2);
2693 lined[w * 2 + 1] = wordd;
2694 linedp[w * 2 + 1] = worddp;
2698 for (; j < wsm; j++, jd += 2) {
2707 (sval1 + sval2 + sval3 + sval4) / 4);
2717 #define CHECK_BYTE(a, b, c) if (GET_DATA_BYTE(a, b) != c) {\ 2718 fprintf(stderr, "Error: mismatch at %d, %d vs %d\n", \ 2719 j, GET_DATA_BYTE(a, b), c); } 2723 for (j = 0, jd = 0; j < wsm; j++, jd += 2) {
2728 CHECK_BYTE(lined, jd, sval1);
2729 CHECK_BYTE(lined, jd + 1, (sval1 + sval2) / 2);
2730 CHECK_BYTE(linedp, jd, (sval1 + sval3) / 2);
2731 CHECK_BYTE(linedp, jd + 1,
2732 (sval1 + sval2 + sval3 + sval4) / 4);
2736 CHECK_BYTE(lined, 2 * wsm, sval1);
2737 CHECK_BYTE(lined, 2 * wsm + 1, sval1);
2738 CHECK_BYTE(linedp, 2 * wsm, (sval1 + sval3) / 2);
2739 CHECK_BYTE(linedp, 2 * wsm + 1, (sval1 + sval3) / 2);
2743 linedp = lined + wpld;
2745 for (j = 0, jd = 0; j < wsm; j++, jd += 2) {
2825 l_uint32 *lines, *lined;
2838 for (i = 0; i < hsm; i++) {
2839 lines = datas + i * wpls;
2840 lined = datad + 4 * i * wpld;
2845 lines = datas + hsm * wpls;
2846 lined = datad + 4 * hsm * wpld;
2868 l_int32 lastlineflag)
2870 l_int32 j, jd, wsm, wsm4;
2871 l_int32 s1, s2, s3, s4, s1t, s2t, s3t, s4t;
2872 l_uint32 *linesp, *linedp1, *linedp2, *linedp3;
2877 if (lastlineflag == 0) {
2878 linesp = lines + wpls;
2879 linedp1 = lined + wpld;
2880 linedp2 = lined + 2 * wpld;
2881 linedp3 = lined + 3 * wpld;
2884 for (j = 0, jd = 0; j < wsm; j++, jd += 4) {
2898 SET_DATA_BYTE(linedp1, jd + 1, (9*s1 + s2t + s3t + s4) / 16);
2900 SET_DATA_BYTE(linedp1, jd + 3, (s1t + 9*s2 + s3 + s4t) / 16);
2906 SET_DATA_BYTE(linedp3, jd + 1, (s1t + s2 + 9*s3 + s4t) / 16);
2908 SET_DATA_BYTE(linedp3, jd + 3, (s1 + s2t + s3t + 9*s4) / 16);
2931 linedp1 = lined + wpld;
2932 linedp2 = lined + 2 * wpld;
2933 linedp3 = lined + 3 * wpld;
2935 for (j = 0, jd = 0; j < wsm; j++, jd += 4) {
3006 l_int32 xs, prevxs, sval;
3007 l_int32 *srow, *scol;
3009 l_uint32 *lines, *prevlines, *lined, *prevlined;
3010 l_float32 wratio, hratio;
3012 PROCNAME(
"scaleBySamplingLow");
3014 if (d != 2 && d != 4 && d !=8 && d != 16 && d != 32)
3015 return ERROR_INT(
"pixel depth not supported", procName, 1);
3019 memset((
char *)datad, 0, hd * bpld);
3023 if ((srow = (l_int32 *)LEPT_CALLOC(hd,
sizeof(l_int32))) == NULL)
3024 return ERROR_INT(
"srow not made", procName, 1);
3025 if ((scol = (l_int32 *)LEPT_CALLOC(wd,
sizeof(l_int32))) == NULL) {
3027 return ERROR_INT(
"scol not made", procName, 1);
3030 wratio = (l_float32)ws / (l_float32)wd;
3031 hratio = (l_float32)hs / (l_float32)hd;
3032 for (i = 0; i < hd; i++)
3033 srow[i] = L_MIN((l_int32)(hratio * i + 0.5), hs - 1);
3034 for (j = 0; j < wd; j++)
3035 scol[j] = L_MIN((l_int32)(wratio * j + 0.5), ws - 1);
3038 for (i = 0; i < hd; i++) {
3039 lines = datas + srow[i] * wpls;
3040 lined = datad + i * wpld;
3041 if (lines != prevlines) {
3046 for (j = 0; j < wd; j++) {
3056 }
else if (d == 4) {
3057 for (j = 0; j < wd; j++) {
3067 }
else if (d == 8) {
3068 for (j = 0; j < wd; j++) {
3078 }
else if (d == 16) {
3079 for (j = 0; j < wd; j++) {
3090 for (j = 0; j < wd; j++) {
3102 prevlined = lined - wpld;
3103 memcpy((
char *)lined, (
char *)prevlined, bpld);
3138 l_int32 i, j, m, n, xstart;
3139 l_int32 val, rval, gval, bval;
3140 l_int32 *srow, *scol;
3141 l_uint32 *lines, *lined, *line, *ppixel;
3143 l_float32 wratio, hratio, norm;
3145 PROCNAME(
"scaleSmoothLow");
3148 memset((
char *)datad, 0, 4 * wpld * hd);
3155 if ((srow = (l_int32 *)LEPT_CALLOC(hd,
sizeof(l_int32))) == NULL)
3156 return ERROR_INT(
"srow not made", procName, 1);
3157 if ((scol = (l_int32 *)LEPT_CALLOC(wd,
sizeof(l_int32))) == NULL) {
3159 return ERROR_INT(
"scol not made", procName, 1);
3162 norm = 1. / (l_float32)(size * size);
3163 wratio = (l_float32)ws / (l_float32)wd;
3164 hratio = (l_float32)hs / (l_float32)hd;
3165 for (i = 0; i < hd; i++)
3166 srow[i] = L_MIN((l_int32)(hratio * i), hs - size);
3167 for (j = 0; j < wd; j++)
3168 scol[j] = L_MIN((l_int32)(wratio * j), ws - size);
3172 for (i = 0; i < hd; i++) {
3173 lines = datas + srow[i] * wpls;
3174 lined = datad + i * wpld;
3175 for (j = 0; j < wd; j++) {
3178 for (m = 0; m < size; m++) {
3179 line = lines + m * wpls;
3180 for (n = 0; n < size; n++) {
3184 val = (l_int32)((l_float32)val * norm);
3189 for (i = 0; i < hd; i++) {
3190 lines = datas + srow[i] * wpls;
3191 lined = datad + i * wpld;
3192 for (j = 0; j < wd; j++) {
3194 rval = gval = bval = 0;
3195 for (m = 0; m < size; m++) {
3196 ppixel = lines + m * wpls + xstart;
3197 for (n = 0; n < size; n++) {
3198 pixel = *(ppixel + n);
3199 rval += (pixel >> L_RED_SHIFT) & 0xff;
3200 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3201 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3204 rval = (l_int32)((l_float32)rval * norm);
3205 gval = (l_int32)((l_float32)gval * norm);
3206 bval = (l_int32)((l_float32)bval * norm);
3207 *(lined + j) = rval << L_RED_SHIFT |
3208 gval << L_GREEN_SHIFT |
3209 bval << L_BLUE_SHIFT;
3238 l_int32 i, j, val, rval, gval, bval;
3239 l_uint32 *lines, *lined;
3245 for (i = 0; i < hd; i++) {
3246 lines = datas + 2 * i * wpls;
3247 lined = datad + i * wpld;
3248 for (j = 0; j < wd; j++) {
3250 pixel = *(lines + 2 * j);
3251 rval = (pixel >> L_RED_SHIFT) & 0xff;
3252 gval = (pixel >> L_GREEN_SHIFT) & 0xff;
3253 bval = (pixel >> L_BLUE_SHIFT) & 0xff;
3254 pixel = *(lines + 2 * j + 1);
3255 rval += (pixel >> L_RED_SHIFT) & 0xff;
3256 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3257 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3258 pixel = *(lines + wpls + 2 * j);
3259 rval += (pixel >> L_RED_SHIFT) & 0xff;
3260 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3261 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3262 pixel = *(lines + wpls + 2 * j + 1);
3263 rval += (pixel >> L_RED_SHIFT) & 0xff;
3264 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3265 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3267 val = (l_int32)(rwt * rval + gwt * gval + bwt * bval);
3299 l_int32 i, j, k, m, wm2, hm2;
3300 l_int32 area00, area10, area01, area11, areal, arear, areat, areab;
3303 l_int32 xup, yup, xuf, yuf;
3304 l_int32 xlp, ylp, xlf, ylf;
3305 l_int32 delx, dely, area;
3306 l_int32 v00r, v00g, v00b;
3307 l_int32 v01r, v01g, v01b;
3308 l_int32 v10r, v10g, v10b;
3309 l_int32 v11r, v11g, v11b;
3310 l_int32 vinr, ving, vinb;
3311 l_int32 vmidr, vmidg, vmidb;
3312 l_int32 rval, gval, bval;
3313 l_uint32 pixel00, pixel10, pixel01, pixel11, pixel;
3314 l_uint32 *lines, *lined;
3321 scx = 16. * (l_float32)ws / (l_float32)wd;
3322 scy = 16. * (l_float32)hs / (l_float32)hd;
3327 for (i = 0; i < hd; i++) {
3328 yu = (l_int32)(scy * i);
3329 yl = (l_int32)(scy * (i + 1.0));
3335 lined = datad + i * wpld;
3336 lines = datas + yup * wpls;
3337 for (j = 0; j < wd; j++) {
3338 xu = (l_int32)(scx * j);
3339 xl = (l_int32)(scx * (j + 1.0));
3347 if (xlp > wm2 || ylp > hm2) {
3348 *(lined + j) = *(lines + xup);
3355 area = ((16 - xuf) + 16 * (delx - 1) + xlf) *
3356 ((16 - yuf) + 16 * (dely - 1) + ylf);
3359 pixel00 = *(lines + xup);
3360 pixel10 = *(lines + xlp);
3361 pixel01 = *(lines + dely * wpls + xup);
3362 pixel11 = *(lines + dely * wpls + xlp);
3363 area00 = (16 - xuf) * (16 - yuf);
3364 area10 = xlf * (16 - yuf);
3365 area01 = (16 - xuf) * ylf;
3367 v00r = area00 * ((pixel00 >> L_RED_SHIFT) & 0xff);
3368 v00g = area00 * ((pixel00 >> L_GREEN_SHIFT) & 0xff);
3369 v00b = area00 * ((pixel00 >> L_BLUE_SHIFT) & 0xff);
3370 v10r = area10 * ((pixel10 >> L_RED_SHIFT) & 0xff);
3371 v10g = area10 * ((pixel10 >> L_GREEN_SHIFT) & 0xff);
3372 v10b = area10 * ((pixel10 >> L_BLUE_SHIFT) & 0xff);
3373 v01r = area01 * ((pixel01 >> L_RED_SHIFT) & 0xff);
3374 v01g = area01 * ((pixel01 >> L_GREEN_SHIFT) & 0xff);
3375 v01b = area01 * ((pixel01 >> L_BLUE_SHIFT) & 0xff);
3376 v11r = area11 * ((pixel11 >> L_RED_SHIFT) & 0xff);
3377 v11g = area11 * ((pixel11 >> L_GREEN_SHIFT) & 0xff);
3378 v11b = area11 * ((pixel11 >> L_BLUE_SHIFT) & 0xff);
3379 vinr = ving = vinb = 0;
3380 for (k = 1; k < dely; k++) {
3381 for (m = 1; m < delx; m++) {
3382 pixel = *(lines + k * wpls + xup + m);
3383 vinr += 256 * ((pixel >> L_RED_SHIFT) & 0xff);
3384 ving += 256 * ((pixel >> L_GREEN_SHIFT) & 0xff);
3385 vinb += 256 * ((pixel >> L_BLUE_SHIFT) & 0xff);
3388 vmidr = vmidg = vmidb = 0;
3389 areal = (16 - xuf) * 16;
3391 areat = 16 * (16 - yuf);
3393 for (k = 1; k < dely; k++) {
3394 pixel = *(lines + k * wpls + xup);
3395 vmidr += areal * ((pixel >> L_RED_SHIFT) & 0xff);
3396 vmidg += areal * ((pixel >> L_GREEN_SHIFT) & 0xff);
3397 vmidb += areal * ((pixel >> L_BLUE_SHIFT) & 0xff);
3399 for (k = 1; k < dely; k++) {
3400 pixel = *(lines + k * wpls + xlp);
3401 vmidr += arear * ((pixel >> L_RED_SHIFT) & 0xff);
3402 vmidg += arear * ((pixel >> L_GREEN_SHIFT) & 0xff);
3403 vmidb += arear * ((pixel >> L_BLUE_SHIFT) & 0xff);
3405 for (m = 1; m < delx; m++) {
3406 pixel = *(lines + xup + m);
3407 vmidr += areat * ((pixel >> L_RED_SHIFT) & 0xff);
3408 vmidg += areat * ((pixel >> L_GREEN_SHIFT) & 0xff);
3409 vmidb += areat * ((pixel >> L_BLUE_SHIFT) & 0xff);
3411 for (m = 1; m < delx; m++) {
3412 pixel = *(lines + dely * wpls + xup + m);
3413 vmidr += areab * ((pixel >> L_RED_SHIFT) & 0xff);
3414 vmidg += areab * ((pixel >> L_GREEN_SHIFT) & 0xff);
3415 vmidb += areab * ((pixel >> L_BLUE_SHIFT) & 0xff);
3419 rval = (v00r + v01r + v10r + v11r + vinr + vmidr + 128) / area;
3420 gval = (v00g + v01g + v10g + v11g + ving + vmidg + 128) / area;
3421 bval = (v00b + v01b + v10b + v11b + vinb + vmidb + 128) / area;
3423 if (rval > 255) fprintf(stderr,
"rval ovfl: %d\n", rval);
3424 if (gval > 255) fprintf(stderr,
"gval ovfl: %d\n", gval);
3425 if (bval > 255) fprintf(stderr,
"bval ovfl: %d\n", bval);
3454 l_int32 i, j, k, m, wm2, hm2;
3457 l_int32 xup, yup, xuf, yuf;
3458 l_int32 xlp, ylp, xlf, ylf;
3459 l_int32 delx, dely, area;
3467 l_uint32 *lines, *lined;
3474 scx = 16. * (l_float32)ws / (l_float32)wd;
3475 scy = 16. * (l_float32)hs / (l_float32)hd;
3480 for (i = 0; i < hd; i++) {
3481 yu = (l_int32)(scy * i);
3482 yl = (l_int32)(scy * (i + 1.0));
3488 lined = datad + i * wpld;
3489 lines = datas + yup * wpls;
3490 for (j = 0; j < wd; j++) {
3491 xu = (l_int32)(scx * j);
3492 xl = (l_int32)(scx * (j + 1.0));
3500 if (xlp > wm2 || ylp > hm2) {
3508 area = ((16 - xuf) + 16 * (delx - 1) + xlf) *
3509 ((16 - yuf) + 16 * (dely - 1) + ylf);
3514 v01 = (16 - xuf) * ylf *
GET_DATA_BYTE(lines + dely * wpls, xup);
3516 for (vin = 0, k = 1; k < dely; k++) {
3517 for (m = 1; m < delx; m++) {
3521 for (vmid = 0, k = 1; k < dely; k++)
3522 vmid += (16 - xuf) * 16 *
GET_DATA_BYTE(lines + k * wpls, xup);
3523 for (k = 1; k < dely; k++)
3525 for (m = 1; m < delx; m++)
3527 for (m = 1; m < delx; m++)
3528 vmid += 16 * ylf *
GET_DATA_BYTE(lines + dely * wpls, xup + m);
3529 val = (v00 + v01 + v10 + v11 + vin + vmid + 128) / area;
3531 if (val > 255) fprintf(stderr,
"val overflow: %d\n", val);
3558 l_int32 i, j, val, rval, gval, bval;
3559 l_uint32 *lines, *lined;
3563 for (i = 0; i < hd; i++) {
3564 lines = datas + 2 * i * wpls;
3565 lined = datad + i * wpld;
3566 for (j = 0; j < wd; j++) {
3577 for (i = 0; i < hd; i++) {
3578 lines = datas + 2 * i * wpls;
3579 lined = datad + i * wpld;
3580 for (j = 0; j < wd; j++) {
3582 pixel = *(lines + 2 * j);
3583 rval = (pixel >> L_RED_SHIFT) & 0xff;
3584 gval = (pixel >> L_GREEN_SHIFT) & 0xff;
3585 bval = (pixel >> L_BLUE_SHIFT) & 0xff;
3586 pixel = *(lines + 2 * j + 1);
3587 rval += (pixel >> L_RED_SHIFT) & 0xff;
3588 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3589 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3590 pixel = *(lines + wpls + 2 * j);
3591 rval += (pixel >> L_RED_SHIFT) & 0xff;
3592 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3593 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3594 pixel = *(lines + wpls + 2 * j + 1);
3595 rval += (pixel >> L_RED_SHIFT) & 0xff;
3596 gval += (pixel >> L_GREEN_SHIFT) & 0xff;
3597 bval += (pixel >> L_BLUE_SHIFT) & 0xff;
3599 *(lined + j) = pixel;
3620 scaleBinaryLow(l_uint32 *datad,
3630 l_int32 xs, prevxs, sval;
3631 l_int32 *srow, *scol;
3632 l_uint32 *lines, *prevlines, *lined, *prevlined;
3633 l_float32 wratio, hratio;
3635 PROCNAME(
"scaleBinaryLow");
3639 memset((
char *)datad, 0, hd * bpld);
3643 if ((srow = (l_int32 *)LEPT_CALLOC(hd,
sizeof(l_int32))) == NULL)
3644 return ERROR_INT(
"srow not made", procName, 1);
3645 if ((scol = (l_int32 *)LEPT_CALLOC(wd,
sizeof(l_int32))) == NULL) {
3647 return ERROR_INT(
"scol not made", procName, 1);
3650 wratio = (l_float32)ws / (l_float32)wd;
3651 hratio = (l_float32)hs / (l_float32)hd;
3652 for (i = 0; i < hd; i++)
3653 srow[i] = L_MIN((l_int32)(hratio * i + 0.5), hs - 1);
3654 for (j = 0; j < wd; j++)
3655 scol[j] = L_MIN((l_int32)(wratio * j + 0.5), ws - 1);
3660 for (i = 0; i < hd; i++) {
3661 lines = datas + srow[i] * wpls;
3662 lined = datad + i * wpld;
3663 if (lines != prevlines) {
3664 for (j = 0; j < wd; j++) {
3676 prevlined = lined - wpld;
3677 memcpy((
char *)lined, (
char *)prevlined, bpld);
PIX * pixScaleRGBToGray2(PIX *pixs, l_float32 rwt, l_float32 gwt, l_float32 bwt)
pixScaleRGBToGray2()
PIX * pixScaleColor2xLI(PIX *pixs)
pixScaleColor2xLI()
l_int32 pixCopyColormap(PIX *pixd, PIX *pixs)
pixCopyColormap()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
PIX * pixScaleColor4xLI(PIX *pixs)
pixScaleColor4xLI()
PIX * pixScaleToSizeRel(PIX *pixs, l_int32 delw, l_int32 delh)
pixScaleToSizeRel()
PIX * pixScaleGray2xLIDither(PIX *pixs)
pixScaleGray2xLIDither()
PIX * pixScaleRGBToGrayFast(PIX *pixs, l_int32 factor, l_int32 color)
pixScaleRGBToGrayFast()
static void scaleRGBToGray2Low(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_float32 rwt, l_float32 gwt, l_float32 bwt)
scaleRGBToGray2Low()
static void scaleGrayLILow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleGrayLILow()
PIX * pixScaleGray4xLIThresh(PIX *pixs, l_int32 thresh)
pixScaleGray4xLIThresh()
PIX * pixScaleGrayToBinaryFast(PIX *pixs, l_int32 factor, l_int32 thresh)
pixScaleGrayToBinaryFast()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixScaleGeneral(PIX *pixs, l_float32 scalex, l_float32 scaley, l_float32 sharpfract, l_int32 sharpwidth)
pixScaleGeneral()
PIX * pixScaleGray2xLIThresh(PIX *pixs, l_int32 thresh)
pixScaleGray2xLIThresh()
PIX * pixScaleAreaMap(PIX *pix, l_float32 scalex, l_float32 scaley)
pixScaleAreaMap()
PIX * pixScaleColorLI(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleColorLI()
#define SET_DATA_QBIT(pdata, n, val)
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixScaleBySampling(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleBySampling()
static void scaleColorLILow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleColorLILow()
#define GET_DATA_BIT(pdata, n)
static l_int32 scaleSmoothLow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 d, l_int32 wpls, l_int32 size)
scaleSmoothLow()
static l_int32 scaleBySamplingLow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 d, l_int32 wpls)
scaleBySamplingLow()
PIX * pixGetRGBComponent(PIX *pixs, l_int32 comp)
pixGetRGBComponent()
#define SET_DATA_DIBIT(pdata, n, val)
static void scaleColor2xLILineLow(l_uint32 *lined, l_int32 wpld, l_uint32 *lines, l_int32 ws, l_int32 wpls, l_int32 lastlineflag)
scaleColor2xLILineLow()
static void scaleColor2xLILow(l_uint32 *datad, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleColor2xLILow()
l_int32 pixCopySpp(PIX *pixd, PIX *pixs)
pixCopySpp()
PIX * pixScaleBinary(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleBinary()
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_QBIT(pdata, n)
static void scaleGray4xLILow(l_uint32 *datad, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleGray4xLILow()
#define GET_DATA_BYTE(pdata, n)
void ditherToBinaryLineLow(l_uint32 *lined, l_int32 w, l_uint32 *bufs1, l_uint32 *bufs2, l_int32 lowerclip, l_int32 upperclip, l_int32 lastlineflag)
ditherToBinaryLineLow()
PIX * pixCreateRGBImage(PIX *pixr, PIX *pixg, PIX *pixb)
pixCreateRGBImage()
static void scaleGray4xLILineLow(l_uint32 *lined, l_int32 wpld, l_uint32 *lines, l_int32 ws, l_int32 wpls, l_int32 lastlineflag)
scaleGray4xLILineLow()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixScaleToSize(PIX *pixs, l_int32 wd, l_int32 hd)
pixScaleToSize()
void pixDestroy(PIX **ppix)
pixDestroy()
static void scaleGrayAreaMapLow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleGrayAreaMapLow()
PIX * pixScaleLI(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleLI()
PIX * pixScaleAreaMapToSize(PIX *pixs, l_int32 wd, l_int32 hd)
pixScaleAreaMapToSize()
PIX * pixScaleByIntSampling(PIX *pixs, l_int32 factor)
pixScaleByIntSampling()
static void scaleColorAreaMapLow(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleColorAreaMapLow()
PIX * pixScaleAreaMap2(PIX *pix)
pixScaleAreaMap2()
PIX * pixScaleGrayLI(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleGrayLI()
l_int32 pixScaleAndTransferAlpha(PIX *pixd, PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScaleAndTransferAlpha()
PIX * pixScaleGray2xLI(PIX *pixs)
pixScaleGray2xLI()
#define GET_DATA_TWO_BYTES(pdata, n)
#define GET_DATA_DIBIT(pdata, n)
static void scaleGray2xLILow(l_uint32 *datad, l_int32 wpld, l_uint32 *datas, l_int32 ws, l_int32 hs, l_int32 wpls)
scaleGray2xLILow()
PIX * pixScaleSmoothToSize(PIX *pixs, l_int32 wd, l_int32 hd)
pixScaleSmoothToSize()
static void scaleAreaMapLow2(l_uint32 *datad, l_int32 wd, l_int32 hd, l_int32 wpld, l_uint32 *datas, l_int32 d, l_int32 wpls)
scaleAreaMapLow2()
PIX * pixScaleBySamplingToSize(PIX *pixs, l_int32 wd, l_int32 hd)
pixScaleBySamplingToSize()
PIX * pixUnsharpMasking(PIX *pixs, l_int32 halfwidth, l_float32 fract)
pixUnsharpMasking()
l_int32 composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
static void scaleGray2xLILineLow(l_uint32 *lined, l_int32 wpld, l_uint32 *lines, l_int32 ws, l_int32 wpls, l_int32 lastlineflag)
scaleGray2xLILineLow()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
l_int32 pixGetDimensions(PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixScaleRGBToBinaryFast(PIX *pixs, l_int32 factor, l_int32 thresh)
pixScaleRGBToBinaryFast()
PIX * pixScaleGray4xLIDither(PIX *pixs)
pixScaleGray4xLIDither()
PIX * pixScaleSmooth(PIX *pix, l_float32 scalex, l_float32 scaley)
pixScaleSmooth()
PIX * pixScale(PIX *pixs, l_float32 scalex, l_float32 scaley)
pixScale()
#define SET_DATA_TWO_BYTES(pdata, n, val)
PIX * pixConvertTo8Or32(PIX *pixs, l_int32 copyflag, l_int32 warnflag)
pixConvertTo8Or32()
#define SET_DATA_BIT(pdata, n)
PIX * pixScaleGray4xLI(PIX *pixs)
pixScaleGray4xLI()