95 #include <config_auto.h> 98 #include "allheaders.h" 139 l_int32 i, n, ncolors, ngray;
144 PROCNAME(
"pixColorGrayRegions");
146 if (!
pixs || pixGetDepth(
pixs) == 1)
147 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
149 return (
PIX *)ERROR_PTR(
"boxa not defined", procName, NULL);
151 return (
PIX *)ERROR_PTR(
"invalid type", procName, NULL);
155 cmap = pixGetColormap(
pixs);
159 if (ncolors + ngray < 255) {
169 return (
PIX *)ERROR_PTR(
"thresh must be < 255", procName, NULL);
171 L_WARNING(
"threshold set very high\n", procName);
174 return (
PIX *)ERROR_PTR(
"thresh must be > 0", procName, NULL);
176 L_WARNING(
"threshold set very low\n", procName);
181 for (i = 0; i < n; i++) {
183 pixColorGray(pixd, box, type, thresh, rval, gval, bval);
240 l_int32 i, j, w, h, d, wpl, x1, x2, y1, y2, bw, bh;
241 l_int32 nrval, ngval, nbval, aveval;
244 l_uint32 *line, *data;
248 PROCNAME(
"pixColorGray");
251 return ERROR_INT(
"pixs not defined", procName, 1);
253 return ERROR_INT(
"invalid type", procName, 1);
255 cmap = pixGetColormap(
pixs);
257 if (!cmap && d != 8 && d != 32)
258 return ERROR_INT(
"pixs not cmapped, 8 bpp or rgb", procName, 1);
265 return ERROR_INT(
"thresh must be < 255; else this is a no-op",
268 L_WARNING(
"threshold set very high\n", procName);
271 return ERROR_INT(
"thresh must be > 0; else this is a no-op",
274 L_WARNING(
"threshold set very low\n", procName);
294 wpl = pixGetWpl(
pixs);
296 for (i = y1; i <= y2; i++) {
299 line = data + i * wpl;
300 for (j = x1; j <= x2; j++) {
304 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
305 ((val32 >> 8) & 0xff)) / 3;
309 nrval = (l_int32)(rval * aveval * factor);
310 ngval = (l_int32)(gval * aveval * factor);
311 nbval = (l_int32)(bval * aveval * factor);
315 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
316 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
317 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
366 l_int32 i, j, w, h, d, wm, hm, wmin, hmin, wpl, wplm;
367 l_int32 nrval, ngval, nbval, aveval;
370 l_uint32 *line, *data, *linem, *datam;
374 PROCNAME(
"pixColorGrayMasked");
377 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
378 if (!pixm || pixGetDepth(pixm) != 1)
379 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", procName, NULL);
381 return (
PIX *)ERROR_PTR(
"invalid type", procName, NULL);
383 cmap = pixGetColormap(
pixs);
385 if (!cmap && d != 8 && d != 32)
386 return (
PIX *)ERROR_PTR(
"pixs not cmapped, 8 bpp gray or 32 bpp",
397 return (
PIX *)ERROR_PTR(
398 "thresh must be < 255; else this is a no-op", procName, NULL);
400 L_WARNING(
"threshold set very high\n", procName);
403 return (
PIX *)ERROR_PTR(
404 "thresh must be > 0; else this is a no-op", procName, NULL);
406 L_WARNING(
"threshold set very low\n", procName);
411 L_WARNING(
"wm = %d differs from w = %d\n", procName, wm, w);
413 L_WARNING(
"hm = %d differs from h = %d\n", procName, hm, h);
422 wpl = pixGetWpl(pixd);
424 wplm = pixGetWpl(pixm);
426 for (i = 0; i < hmin; i++) {
427 line = data + i * wpl;
428 linem = datam + i * wplm;
429 for (j = 0; j < wmin; j++) {
433 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
434 ((val32 >> 8) & 0xff)) / 3;
438 nrval = (l_int32)(rval * aveval * factor);
439 ngval = (l_int32)(gval * aveval * factor);
440 nbval = (l_int32)(bval * aveval * factor);
444 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
445 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
446 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
489 l_int32 val, sval, dval;
490 l_int32 rval, gval, bval, rsval, gsval, bsval;
491 l_int32 i, j, w, h, d, wpl;
493 l_uint32 *line, *data;
495 PROCNAME(
"pixSnapColor");
498 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
499 if (pixd && (pixd !=
pixs))
500 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", procName, pixd);
502 if (pixGetColormap(
pixs))
507 if (pixGetDepth(
pixs) < 8)
508 return (
PIX *)ERROR_PTR(
"pixs is < 8 bpp", procName, pixd);
516 wpl = pixGetWpl(pixd);
518 sval = srcval & 0xff;
519 dval = dstval & 0xff;
520 for (i = 0; i < h; i++) {
521 line = data + i * wpl;
522 for (j = 0; j < w; j++) {
524 if (L_ABS(val - sval) <= diff)
530 for (i = 0; i < h; i++) {
531 line = data + i * wpl;
532 for (j = 0; j < w; j++) {
535 if ((L_ABS(rval - rsval) <= diff) &&
536 (L_ABS(gval - gsval) <= diff) &&
537 (L_ABS(bval - bsval) <= diff))
538 *(line + j) = dstval;
576 l_int32 i, ncolors, index, found;
577 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
582 PROCNAME(
"pixSnapColorCmap");
585 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
586 if (!pixGetColormap(
pixs))
587 return (
PIX *)ERROR_PTR(
"cmap not found", procName, pixd);
588 if (pixd && (pixd !=
pixs))
589 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", procName, pixd);
596 cmap = pixGetColormap(pixd);
602 for (i = 0; i < ncolors; i++) {
604 if ((L_ABS(rval - rsval) <= diff) &&
605 (L_ABS(gval - gsval) <= diff) &&
606 (L_ABS(bval - bsval) <= diff)) {
621 L_INFO(
"nothing to do\n", procName);
629 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
630 for (i = 0; i < ncolors; i++) {
632 if ((L_ABS(rval - rsval) <= diff) &&
633 (L_ABS(gval - gsval) <= diff) &&
634 (L_ABS(bval - bsval) <= diff))
692 l_int32 i, j, w, h, wpl;
693 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
694 l_int32 *rtab, *gtab, *btab;
696 l_uint32 *line, *data;
698 PROCNAME(
"pixLinearMapToTargetColor");
700 if (!
pixs || pixGetDepth(
pixs) != 32)
701 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, pixd);
702 if (pixd && (pixd !=
pixs))
703 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", procName, pixd);
711 rsval = L_MIN(254, L_MAX(1, rsval));
712 gsval = L_MIN(254, L_MAX(1, gsval));
713 bsval = L_MIN(254, L_MAX(1, bsval));
714 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
715 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
716 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
717 if (!rtab || !gtab || !btab)
718 return (
PIX *)ERROR_PTR(
"calloc fail for tab", procName, pixd);
719 for (i = 0; i < 256; i++) {
721 rtab[i] = (i * rdval) / rsval;
723 rtab[i] = rdval + ((255 - rdval) * (i - rsval)) / (255 - rsval);
725 gtab[i] = (i * gdval) / gsval;
727 gtab[i] = gdval + ((255 - gdval) * (i - gsval)) / (255 - gsval);
729 btab[i] = (i * bdval) / bsval;
731 btab[i] = bdval + ((255 - bdval) * (i - bsval)) / (255 - bsval);
735 wpl = pixGetWpl(pixd);
736 for (i = 0; i < h; i++) {
737 line = data + i * wpl;
738 for (j = 0; j < w; j++) {
787 l_int32 srval, sgval, sbval, drval, dgval, dbval;
788 l_int32 srmap, sgmap, sbmap, drmap, dgmap, dbmap;
790 PROCNAME(
"pixelLinearMapToTargetColor");
793 return ERROR_INT(
"&dcolor not defined", procName, 1);
799 srmap = L_MIN(254, L_MAX(1, srmap));
800 sgmap = L_MIN(254, L_MAX(1, sgmap));
801 sbmap = L_MIN(254, L_MAX(1, sbmap));
804 drval = (srval * drmap) / srmap;
806 drval = drmap + ((255 - drmap) * (srval - srmap)) / (255 - srmap);
808 dgval = (sgval * dgmap) / sgmap;
810 dgval = dgmap + ((255 - dgmap) * (sgval - sgmap)) / (255 - sgmap);
812 dbval = (sbval * dbmap) / sbmap;
814 dbval = dbmap + ((255 - dbmap) * (sbval - sbmap)) / (255 - sbmap);
872 l_int32 i, j, w, h, wpl;
873 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
874 l_int32 *rtab, *gtab, *btab;
876 l_uint32 *line, *data;
879 PROCNAME(
"pixShiftByComponent");
882 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
883 if (pixd && (pixd !=
pixs))
884 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", procName, pixd);
885 if (pixGetDepth(
pixs) != 32 && !pixGetColormap(
pixs))
886 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", procName, pixd);
893 if ((cmap = pixGetColormap(pixd)) != NULL) {
900 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
901 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
902 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
903 if (!rtab || !gtab || !btab) {
904 L_ERROR(
"calloc fail for tab\n", procName);
907 for (i = 0; i < 256; i++) {
910 else if (rdval < rsval)
911 rtab[i] = (i * rdval) / rsval;
913 rtab[i] = 255 - (255 - rdval) * (255 - i) / (255 - rsval);
916 else if (gdval < gsval)
917 gtab[i] = (i * gdval) / gsval;
919 gtab[i] = 255 - (255 - gdval) * (255 - i) / (255 - gsval);
922 else if (bdval < bsval)
923 btab[i] = (i * bdval) / bsval;
925 btab[i] = 255 - (255 - bdval) * (255 - i) / (255 - bsval);
929 wpl = pixGetWpl(pixd);
930 for (i = 0; i < h; i++) {
931 line = data + i * wpl;
932 for (j = 0; j < w; j++) {
975 l_int32 rsval, rdval, gsval, gdval, bsval, bdval, rs, gs, bs;
977 PROCNAME(
"pixelShiftByComponent");
980 return ERROR_INT(
"&pixel defined", procName, 1);
986 else if (rdval < rsval)
987 rs = (rval * rdval) / rsval;
989 rs = 255 - (255 - rdval) * (255 - rval) / (255 - rsval);
992 else if (gdval < gsval)
993 gs = (gval * gdval) / gsval;
995 gs = 255 - (255 - gdval) * (255 - gval) / (255 - gsval);
998 else if (bdval < bsval)
999 bs = (bval * bdval) / bsval;
1001 bs = 255 - (255 - bdval) * (255 - bval) / (255 - bsval);
1037 l_int32 nrval, ngval, nbval;
1039 PROCNAME(
"pixelFractionalShift");
1042 return ERROR_INT(
"&pixel defined", procName, 1);
1043 if (fract < -1.0 || fract > 1.0)
1044 return ERROR_INT(
"fraction not in [-1 ... +1]", procName, 1);
1046 nrval = (fract < 0) ? (l_int32)((1.0 + fract) * rval + 0.5) :
1047 rval + (l_int32)(fract * (255 - rval) + 0.5);
1048 ngval = (fract < 0) ? (l_int32)((1.0 + fract) * gval + 0.5) :
1049 gval + (l_int32)(fract * (255 - gval) + 0.5);
1050 nbval = (fract < 0) ? (l_int32)((1.0 + fract) * bval + 0.5) :
1051 bval + (l_int32)(fract * (255 - bval) + 0.5);
1087 l_int32 rval, gval, bval;
1090 PROCNAME(
"pixMapWithInvariantHue");
1092 if (!
pixs || pixGetDepth(
pixs) != 32)
1093 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", procName, pixd);
1094 if (pixd && (pixd !=
pixs))
1095 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", procName, pixd);
1096 if (fract < -1.0 || fract > 1.0)
1097 return (
PIX *)ERROR_PTR(
"fraction not in [-1 ... +1]", procName, NULL);
l_ok pixcmapCountGrayColors(PIXCMAP *cmap, l_int32 *pngray)
pixcmapCountGrayColors()
PIX * pixMapWithInvariantHue(PIX *pixd, PIX *pixs, l_uint32 srcval, l_float32 fract)
pixMapWithInvariantHue()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
l_ok pixSetMasked(PIX *pixd, PIX *pixm, l_uint32 val)
pixSetMasked()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
PIX * pixSnapColorCmap(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColorCmap()
l_ok pixColorGray(PIX *pixs, BOX *box, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGray()
PIX * pixLinearMapToTargetColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixLinearMapToTargetColor()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
#define GET_DATA_BIT(pdata, n)
l_ok pixColorGrayCmap(PIX *pixs, BOX *box, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayCmap()
l_ok pixelShiftByComponent(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 srcval, l_uint32 dstval, l_uint32 *ppixel)
pixelShiftByComponent()
l_ok pixColorGrayMaskedCmap(PIX *pixs, PIX *pixm, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMaskedCmap()
PIX * pixSnapColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColor()
l_ok pixColorGrayRegionsCmap(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegionsCmap()
l_ok pixcmapGetColor(PIXCMAP *cmap, l_int32 index, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
pixcmapGetColor()
#define SET_DATA_BYTE(pdata, n, val)
l_ok pixelLinearMapToTargetColor(l_uint32 scolor, l_uint32 srcmap, l_uint32 dstmap, l_uint32 *pdcolor)
pixelLinearMapToTargetColor()
PIX * pixColorGrayMasked(PIX *pixs, PIX *pixm, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMasked()
PIX * pixShiftByComponent(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixShiftByComponent()
#define GET_DATA_BYTE(pdata, n)
l_int32 pixcmapGetFreeCount(PIXCMAP *cmap)
pixcmapGetFreeCount()
l_ok pixcmapShiftByComponent(PIXCMAP *cmap, l_uint32 srcval, l_uint32 dstval)
pixcmapShiftByComponent()
void pixDestroy(PIX **ppix)
pixDestroy()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
PIX * pixColorGrayRegions(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegions()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixMakeMaskFromLUT(PIX *pixs, l_int32 *tab)
pixMakeMaskFromLUT()
l_ok pixRemoveUnusedColors(PIX *pixs)
pixRemoveUnusedColors()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 pixcmapGetCount(const PIXCMAP *cmap)
pixcmapGetCount()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
l_ok pixTransferAllData(PIX *pixd, PIX **ppixs, l_int32 copytext, l_int32 copyformat)
pixTransferAllData()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
l_ok boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
l_ok pixelFractionalShift(l_int32 rval, l_int32 gval, l_int32 bval, l_float32 fract, l_uint32 *ppixel)
pixelFractionalShift()