95 #include <config_auto.h>
98 #include "allheaders.h"
139 l_int32 i, n, ncolors, ngray;
144 if (!pixs || pixGetDepth(pixs) == 1)
145 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", __func__, NULL);
147 return (
PIX *)ERROR_PTR(
"boxa not defined", __func__, NULL);
149 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
153 cmap = pixGetColormap(pixs);
157 if (ncolors + ngray < 255) {
167 return (
PIX *)ERROR_PTR(
"thresh must be < 255", __func__, NULL);
169 L_WARNING(
"threshold set very high\n", __func__);
172 return (
PIX *)ERROR_PTR(
"thresh must be > 0", __func__, NULL);
174 L_WARNING(
"threshold set very low\n", __func__);
179 for (i = 0; i < n; i++) {
181 pixColorGray(pixd, box, type, thresh, rval, gval, bval);
238 l_int32 i, j, w, h, d, wpl, x1, x2, y1, y2, bw, bh;
239 l_int32 nrval, ngval, nbval, aveval;
242 l_uint32 *line, *data;
247 return ERROR_INT(
"pixs not defined", __func__, 1);
249 return ERROR_INT(
"invalid type", __func__, 1);
251 cmap = pixGetColormap(pixs);
253 if (!cmap && d != 8 && d != 32)
254 return ERROR_INT(
"pixs not cmapped, 8 bpp or rgb", __func__, 1);
261 return ERROR_INT(
"thresh must be < 255; else this is a no-op",
264 L_WARNING(
"threshold set very high\n", __func__);
267 return ERROR_INT(
"thresh must be > 0; else this is a no-op",
270 L_WARNING(
"threshold set very low\n", __func__);
290 wpl = pixGetWpl(pixs);
292 for (i = y1; i <= y2; i++) {
295 line = data + i * wpl;
296 for (j = x1; j <= x2; j++) {
300 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
301 ((val32 >> 8) & 0xff)) / 3;
305 nrval = (l_int32)(rval * aveval * factor);
306 ngval = (l_int32)(gval * aveval * factor);
307 nbval = (l_int32)(bval * aveval * factor);
311 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
312 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
313 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
362 l_int32 i, j, w, h, d, wm, hm, wmin, hmin, wpl, wplm;
363 l_int32 nrval, ngval, nbval, aveval;
366 l_uint32 *line, *data, *linem, *datam;
371 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
372 if (!pixm || pixGetDepth(pixm) != 1)
373 return (
PIX *)ERROR_PTR(
"pixm undefined or not 1 bpp", __func__, NULL);
375 return (
PIX *)ERROR_PTR(
"invalid type", __func__, NULL);
377 cmap = pixGetColormap(pixs);
379 if (!cmap && d != 8 && d != 32)
380 return (
PIX *)ERROR_PTR(
"pixs not cmapped, 8 bpp gray or 32 bpp",
391 return (
PIX *)ERROR_PTR(
392 "thresh must be < 255; else this is a no-op", __func__, NULL);
394 L_WARNING(
"threshold set very high\n", __func__);
397 return (
PIX *)ERROR_PTR(
398 "thresh must be > 0; else this is a no-op", __func__, NULL);
400 L_WARNING(
"threshold set very low\n", __func__);
405 L_WARNING(
"wm = %d differs from w = %d\n", __func__, wm, w);
407 L_WARNING(
"hm = %d differs from h = %d\n", __func__, hm, h);
416 wpl = pixGetWpl(pixd);
418 wplm = pixGetWpl(pixm);
420 for (i = 0; i < hmin; i++) {
421 line = data + i * wpl;
422 linem = datam + i * wplm;
423 for (j = 0; j < wmin; j++) {
427 aveval = ((val32 >> 24) + ((val32 >> 16) & 0xff) +
428 ((val32 >> 8) & 0xff)) / 3;
432 nrval = (l_int32)(rval * aveval * factor);
433 ngval = (l_int32)(gval * aveval * factor);
434 nbval = (l_int32)(bval * aveval * factor);
438 nrval = rval + (l_int32)((255. - rval) * aveval * factor);
439 ngval = gval + (l_int32)((255. - gval) * aveval * factor);
440 nbval = bval + (l_int32)((255. - bval) * aveval * factor);
483 l_int32 val, sval, dval;
484 l_int32 rval, gval, bval, rsval, gsval, bsval;
485 l_int32 i, j, w, h, d, wpl;
487 l_uint32 *line, *data;
490 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
491 if (pixd && (pixd != pixs))
492 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
494 if (pixGetColormap(pixs))
499 if (pixGetDepth(pixs) < 8)
500 return (
PIX *)ERROR_PTR(
"pixs is < 8 bpp", __func__, pixd);
508 wpl = pixGetWpl(pixd);
510 sval = srcval & 0xff;
511 dval = dstval & 0xff;
512 for (i = 0; i < h; i++) {
513 line = data + i * wpl;
514 for (j = 0; j < w; j++) {
516 if (L_ABS(val - sval) <= diff)
522 for (i = 0; i < h; i++) {
523 line = data + i * wpl;
524 for (j = 0; j < w; j++) {
527 if ((L_ABS(rval - rsval) <= diff) &&
528 (L_ABS(gval - gsval) <= diff) &&
529 (L_ABS(bval - bsval) <= diff))
530 *(line + j) = dstval;
568 l_int32 i, ncolors, index, found;
569 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
575 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
576 if (!pixGetColormap(pixs))
577 return (
PIX *)ERROR_PTR(
"cmap not found", __func__, pixd);
578 if (pixd && (pixd != pixs))
579 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
586 cmap = pixGetColormap(pixd);
592 for (i = 0; i < ncolors; i++) {
594 if ((L_ABS(rval - rsval) <= diff) &&
595 (L_ABS(gval - gsval) <= diff) &&
596 (L_ABS(bval - bsval) <= diff)) {
611 L_INFO(
"nothing to do\n", __func__);
619 tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
620 for (i = 0; i < ncolors; i++) {
622 if ((L_ABS(rval - rsval) <= diff) &&
623 (L_ABS(gval - gsval) <= diff) &&
624 (L_ABS(bval - bsval) <= diff))
682 l_int32 i, j, w, h, wpl;
683 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
684 l_int32 *rtab, *gtab, *btab;
686 l_uint32 *line, *data;
688 if (!pixs || pixGetDepth(pixs) != 32)
689 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", __func__, pixd);
690 if (pixd && (pixd != pixs))
691 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
699 rsval = L_MIN(254, L_MAX(1, rsval));
700 gsval = L_MIN(254, L_MAX(1, gsval));
701 bsval = L_MIN(254, L_MAX(1, bsval));
702 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
703 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
704 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
705 if (!rtab || !gtab || !btab)
706 return (
PIX *)ERROR_PTR(
"calloc fail for tab", __func__, pixd);
707 for (i = 0; i < 256; i++) {
709 rtab[i] = (i * rdval) / rsval;
711 rtab[i] = rdval + ((255 - rdval) * (i - rsval)) / (255 - rsval);
713 gtab[i] = (i * gdval) / gsval;
715 gtab[i] = gdval + ((255 - gdval) * (i - gsval)) / (255 - gsval);
717 btab[i] = (i * bdval) / bsval;
719 btab[i] = bdval + ((255 - bdval) * (i - bsval)) / (255 - bsval);
723 wpl = pixGetWpl(pixd);
724 for (i = 0; i < h; i++) {
725 line = data + i * wpl;
726 for (j = 0; j < w; j++) {
775 l_int32 srval, sgval, sbval, drval, dgval, dbval;
776 l_int32 srmap, sgmap, sbmap, drmap, dgmap, dbmap;
779 return ERROR_INT(
"&dcolor not defined", __func__, 1);
785 srmap = L_MIN(254, L_MAX(1, srmap));
786 sgmap = L_MIN(254, L_MAX(1, sgmap));
787 sbmap = L_MIN(254, L_MAX(1, sbmap));
790 drval = (srval * drmap) / srmap;
792 drval = drmap + ((255 - drmap) * (srval - srmap)) / (255 - srmap);
794 dgval = (sgval * dgmap) / sgmap;
796 dgval = dgmap + ((255 - dgmap) * (sgval - sgmap)) / (255 - sgmap);
798 dbval = (sbval * dbmap) / sbmap;
800 dbval = dbmap + ((255 - dbmap) * (sbval - sbmap)) / (255 - sbmap);
858 l_int32 i, j, w, h, wpl;
859 l_int32 rval, gval, bval, rsval, gsval, bsval, rdval, gdval, bdval;
860 l_int32 *rtab, *gtab, *btab;
862 l_uint32 *line, *data;
866 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, pixd);
867 if (pixd && (pixd != pixs))
868 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
869 if (pixGetDepth(pixs) != 32 && !pixGetColormap(pixs))
870 return (
PIX *)ERROR_PTR(
"pixs not cmapped or 32 bpp", __func__, pixd);
877 if ((cmap = pixGetColormap(pixd)) != NULL) {
884 rtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
885 gtab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
886 btab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32));
887 if (!rtab || !gtab || !btab) {
888 L_ERROR(
"calloc fail for tab\n", __func__);
891 for (i = 0; i < 256; i++) {
894 else if (rdval < rsval)
895 rtab[i] = (i * rdval) / rsval;
897 rtab[i] = 255 - (255 - rdval) * (255 - i) / (255 - rsval);
900 else if (gdval < gsval)
901 gtab[i] = (i * gdval) / gsval;
903 gtab[i] = 255 - (255 - gdval) * (255 - i) / (255 - gsval);
906 else if (bdval < bsval)
907 btab[i] = (i * bdval) / bsval;
909 btab[i] = 255 - (255 - bdval) * (255 - i) / (255 - bsval);
913 wpl = pixGetWpl(pixd);
914 for (i = 0; i < h; i++) {
915 line = data + i * wpl;
916 for (j = 0; j < w; j++) {
959 l_int32 rsval, rdval, gsval, gdval, bsval, bdval, rs, gs, bs;
962 return ERROR_INT(
"&pixel defined", __func__, 1);
968 else if (rdval < rsval)
969 rs = (rval * rdval) / rsval;
971 rs = 255 - (255 - rdval) * (255 - rval) / (255 - rsval);
974 else if (gdval < gsval)
975 gs = (gval * gdval) / gsval;
977 gs = 255 - (255 - gdval) * (255 - gval) / (255 - gsval);
980 else if (bdval < bsval)
981 bs = (bval * bdval) / bsval;
983 bs = 255 - (255 - bdval) * (255 - bval) / (255 - bsval);
1019 l_int32 nrval, ngval, nbval;
1022 return ERROR_INT(
"&pixel defined", __func__, 1);
1023 if (fract < -1.0 || fract > 1.0)
1024 return ERROR_INT(
"fraction not in [-1 ... +1]", __func__, 1);
1026 nrval = (fract < 0) ? (l_int32)((1.0 + fract) * rval + 0.5) :
1027 rval + (l_int32)(fract * (255 - rval) + 0.5);
1028 ngval = (fract < 0) ? (l_int32)((1.0 + fract) * gval + 0.5) :
1029 gval + (l_int32)(fract * (255 - gval) + 0.5);
1030 nbval = (fract < 0) ? (l_int32)((1.0 + fract) * bval + 0.5) :
1031 bval + (l_int32)(fract * (255 - bval) + 0.5);
1067 l_int32 rval, gval, bval;
1070 if (!pixs || pixGetDepth(pixs) != 32)
1071 return (
PIX *)ERROR_PTR(
"pixs undefined or not 32 bpp", __func__, pixd);
1072 if (pixd && (pixd != pixs))
1073 return (
PIX *)ERROR_PTR(
"pixd exists, but != pixs", __func__, pixd);
1074 if (fract < -1.0 || fract > 1.0)
1075 return (
PIX *)ERROR_PTR(
"fraction not in [-1 ... +1]", __func__, NULL);
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BIT(pdata, n)
l_ok boxGetGeometry(const BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 boxaGetCount(const BOXA *boxa)
boxaGetCount()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
PIX * pixColorGrayRegions(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegions()
PIX * pixColorGrayMasked(PIX *pixs, PIX *pixm, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMasked()
PIX * pixLinearMapToTargetColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixLinearMapToTargetColor()
PIX * pixSnapColor(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColor()
l_ok pixelShiftByComponent(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 srcval, l_uint32 dstval, l_uint32 *ppixel)
pixelShiftByComponent()
l_ok pixelLinearMapToTargetColor(l_uint32 scolor, l_uint32 srcmap, l_uint32 dstmap, l_uint32 *pdcolor)
pixelLinearMapToTargetColor()
l_ok pixColorGray(PIX *pixs, BOX *box, l_int32 type, l_int32 thresh, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGray()
PIX * pixSnapColorCmap(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval, l_int32 diff)
pixSnapColorCmap()
PIX * pixShiftByComponent(PIX *pixd, PIX *pixs, l_uint32 srcval, l_uint32 dstval)
pixShiftByComponent()
l_ok pixelFractionalShift(l_int32 rval, l_int32 gval, l_int32 bval, l_float32 fract, l_uint32 *ppixel)
pixelFractionalShift()
PIX * pixMapWithInvariantHue(PIX *pixd, PIX *pixs, l_uint32 srcval, l_float32 fract)
pixMapWithInvariantHue()
l_int32 pixcmapGetCount(const PIXCMAP *cmap)
pixcmapGetCount()
l_ok pixcmapResetColor(PIXCMAP *cmap, l_int32 index, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapResetColor()
l_ok pixcmapCountGrayColors(PIXCMAP *cmap, l_int32 *pngray)
pixcmapCountGrayColors()
l_ok pixcmapGetColor(PIXCMAP *cmap, l_int32 index, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
pixcmapGetColor()
l_int32 pixcmapGetFreeCount(PIXCMAP *cmap)
pixcmapGetFreeCount()
l_ok pixcmapShiftByComponent(PIXCMAP *cmap, l_uint32 srcval, l_uint32 dstval)
pixcmapShiftByComponent()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
l_ok pixRemoveUnusedColors(PIX *pixs)
pixRemoveUnusedColors()
l_ok pixColorGrayCmap(PIX *pixs, BOX *box, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayCmap()
l_ok pixColorGrayMaskedCmap(PIX *pixs, PIX *pixm, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayMaskedCmap()
l_ok pixColorGrayRegionsCmap(PIX *pixs, BOXA *boxa, l_int32 type, l_int32 rval, l_int32 gval, l_int32 bval)
pixColorGrayRegionsCmap()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
l_ok pixTransferAllData(PIX *pixd, PIX **ppixs, l_int32 copytext, l_int32 copyformat)
pixTransferAllData()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
l_ok pixSetMasked(PIX *pixd, PIX *pixm, l_uint32 val)
pixSetMasked()
PIX * pixMakeMaskFromLUT(PIX *pixs, l_int32 *tab)
pixMakeMaskFromLUT()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()