57 #include "allheaders.h" 60 static const l_float32 MIN_DIFF_FROM_HALF_PI = 0.04;
62 static l_float32 normalizeAngleForShear(l_float32 radang, l_float32 mindif);
120 l_int32 y, yincr, inityincr, hshift;
121 l_float32 tanangle, invangle;
123 PROCNAME(
"pixHShear");
126 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
128 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, pixd);
131 if (pixGetColormap(pixs))
132 return (
PIX *)ERROR_PTR(
"pixs is colormapped", procName, pixd);
140 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
146 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
147 if (radang == 0.0 || tan(radang) == 0.0)
154 sign = L_SIGN(radang);
155 tanangle = tan(radang);
156 invangle = L_ABS(1. / tanangle);
157 inityincr = (l_int32)(invangle / 2.);
158 yincr = (l_int32)invangle;
160 pixs, 0, yloc - inityincr);
162 for (hshift = 1, y = yloc + inityincr; y < h; hshift++) {
163 yincr = (l_int32)(invangle * (hshift + 0.5) + 0.5) - (y - yloc);
168 fprintf(stderr,
"y = %d, hshift = %d, yincr = %d\n", y, hshift, yincr);
173 for (hshift = -1, y = yloc - inityincr; y > 0; hshift--) {
174 yincr = (y - yloc) - (l_int32)(invangle * (hshift - 0.5) + 0.5);
180 fprintf(stderr,
"y = %d, hshift = %d, yincr = %d\n",
181 y - yincr, hshift, yincr);
237 l_int32 x, xincr, initxincr, vshift;
238 l_float32 tanangle, invangle;
240 PROCNAME(
"pixVShear");
243 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
245 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
248 if (pixGetColormap(pixs))
249 return (
PIX *)ERROR_PTR(
"pixs is colormapped", procName, pixd);
257 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
263 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
264 if (radang == 0.0 || tan(radang) == 0.0)
271 sign = L_SIGN(radang);
272 tanangle = tan(radang);
273 invangle = L_ABS(1. / tanangle);
274 initxincr = (l_int32)(invangle / 2.);
275 xincr = (l_int32)invangle;
277 pixs, xloc - initxincr, 0);
279 for (vshift = 1, x = xloc + initxincr; x < w; vshift++) {
280 xincr = (l_int32)(invangle * (vshift + 0.5) + 0.5) - (x - xloc);
285 fprintf(stderr,
"x = %d, vshift = %d, xincr = %d\n", x, vshift, xincr);
290 for (vshift = -1, x = xloc - initxincr; x > 0; vshift--) {
291 xincr = (x - xloc) - (l_int32)(invangle * (vshift - 0.5) + 0.5);
297 fprintf(stderr,
"x = %d, vshift = %d, xincr = %d\n",
298 x - xincr, vshift, xincr);
333 PROCNAME(
"pixHShearCorner");
336 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
338 return pixHShear(pixd, pixs, 0, radang, incolor);
364 PROCNAME(
"pixVShearCorner");
367 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
369 return pixVShear(pixd, pixs, 0, radang, incolor);
395 PROCNAME(
"pixHShearCenter");
398 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
400 return pixHShear(pixd, pixs, pixGetHeight(pixs) / 2, radang, incolor);
426 PROCNAME(
"pixVShearCenter");
429 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
431 return pixVShear(pixd, pixs, pixGetWidth(pixs) / 2, radang, incolor);
465 l_int32 y, yincr, inityincr, hshift;
466 l_float32 tanangle, invangle;
468 PROCNAME(
"pixHShearIP");
471 return ERROR_INT(
"pixs not defined", procName, 1);
473 return ERROR_INT(
"invalid incolor value", procName, 1);
474 if (pixGetColormap(pixs))
475 return ERROR_INT(
"pixs is colormapped", procName, 1);
478 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
479 if (radang == 0.0 || tan(radang) == 0.0)
482 sign = L_SIGN(radang);
484 tanangle = tan(radang);
485 invangle = L_ABS(1. / tanangle);
486 inityincr = (l_int32)(invangle / 2.);
487 yincr = (l_int32)invangle;
490 pixRasteropHip(pixs, yloc - inityincr, 2 * inityincr, 0, incolor);
492 for (hshift = 1, y = yloc + inityincr; y < h; hshift++) {
493 yincr = (l_int32)(invangle * (hshift + 0.5) + 0.5) - (y - yloc);
494 if (yincr == 0)
continue;
501 for (hshift = -1, y = yloc - inityincr; y > 0; hshift--) {
502 yincr = (y - yloc) - (l_int32)(invangle * (hshift - 0.5) + 0.5);
503 if (yincr == 0)
continue;
540 l_int32 x, xincr, initxincr, vshift;
541 l_float32 tanangle, invangle;
543 PROCNAME(
"pixVShearIP");
546 return ERROR_INT(
"pixs not defined", procName, 1);
548 return ERROR_INT(
"invalid incolor value", procName, 1);
549 if (pixGetColormap(pixs))
550 return ERROR_INT(
"pixs is colormapped", procName, 1);
553 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
554 if (radang == 0.0 || tan(radang) == 0.0)
557 sign = L_SIGN(radang);
559 tanangle = tan(radang);
560 invangle = L_ABS(1. / tanangle);
561 initxincr = (l_int32)(invangle / 2.);
562 xincr = (l_int32)invangle;
565 pixRasteropVip(pixs, xloc - initxincr, 2 * initxincr, 0, incolor);
567 for (vshift = 1, x = xloc + initxincr; x < w; vshift++) {
568 xincr = (l_int32)(invangle * (vshift + 0.5) + 0.5) - (x - xloc);
569 if (xincr == 0)
continue;
576 for (vshift = -1, x = xloc - initxincr; x > 0; vshift--) {
577 xincr = (x - xloc) - (l_int32)(invangle * (vshift - 0.5) + 0.5);
578 if (xincr == 0)
continue;
622 l_int32 i, jd, x, xp, xf, w, h, d, wm, wpls, wpld, val, rval, gval, bval;
623 l_uint32 word0, word1;
624 l_uint32 *datas, *datad, *lines, *lined;
625 l_float32 tanangle, xshift;
628 PROCNAME(
"pixHShearLI");
631 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
633 if (d != 8 && d != 32 && !pixGetColormap(pixs))
634 return (
PIX *)ERROR_PTR(
"pixs not 8, 32 bpp, or cmap", procName, NULL);
636 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
637 if (yloc < 0 || yloc >= h)
638 return (
PIX *)ERROR_PTR(
"yloc not in [0 ... h-1]", procName, NULL);
640 if (pixGetColormap(pixs))
646 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
647 if (radang == 0.0 || tan(radang) == 0.0) {
657 d = pixGetDepth(pixd);
660 wpls = pixGetWpl(pix);
661 wpld = pixGetWpl(pixd);
662 tanangle = tan(radang);
663 for (i = 0; i < h; i++) {
664 lines = datas + i * wpls;
665 lined = datad + i * wpld;
666 xshift = (yloc - i) * tanangle;
667 for (jd = 0; jd < w; jd++) {
668 x = (l_int32)(64.0 * (-xshift + jd) + 0.5);
672 if (xp < 0 || xp > wm)
continue;
683 word0 = *(lines + xp);
684 word1 = *(lines + xp + 1);
685 rval = ((63 - xf) * ((word0 >> L_RED_SHIFT) & 0xff) +
686 xf * ((word1 >> L_RED_SHIFT) & 0xff) + 31) / 63;
687 gval = ((63 - xf) * ((word0 >> L_GREEN_SHIFT) & 0xff) +
688 xf * ((word1 >> L_GREEN_SHIFT) & 0xff) + 31) / 63;
689 bval = ((63 - xf) * ((word0 >> L_BLUE_SHIFT) & 0xff) +
690 xf * ((word1 >> L_BLUE_SHIFT) & 0xff) + 31) / 63;
693 lined[jd] = lines[xp];
734 l_int32 id, y, yp, yf, j, w, h, d, hm, wpls, wpld, val, rval, gval, bval;
735 l_uint32 word0, word1;
736 l_uint32 *datas, *datad, *lines, *lined;
737 l_float32 tanangle, yshift;
740 PROCNAME(
"pixVShearLI");
743 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
745 if (d != 8 && d != 32 && !pixGetColormap(pixs))
746 return (
PIX *)ERROR_PTR(
"pixs not 8, 32 bpp, or cmap", procName, NULL);
748 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
749 if (xloc < 0 || xloc >= w)
750 return (
PIX *)ERROR_PTR(
"xloc not in [0 ... w-1]", procName, NULL);
752 if (pixGetColormap(pixs))
758 radang = normalizeAngleForShear(radang, MIN_DIFF_FROM_HALF_PI);
759 if (radang == 0.0 || tan(radang) == 0.0) {
769 d = pixGetDepth(pixd);
772 wpls = pixGetWpl(pix);
773 wpld = pixGetWpl(pixd);
774 tanangle = tan(radang);
775 for (j = 0; j < w; j++) {
776 yshift = (j - xloc) * tanangle;
777 for (
id = 0;
id < h;
id++) {
778 y = (l_int32)(64.0 * (-yshift +
id) + 0.5);
782 if (yp < 0 || yp > hm)
continue;
783 lines = datas + yp * wpls;
784 lined = datad +
id * wpld;
795 word0 = *(lines + j);
796 word1 = *(lines + wpls + j);
797 rval = ((63 - yf) * ((word0 >> L_RED_SHIFT) & 0xff) +
798 yf * ((word1 >> L_RED_SHIFT) & 0xff) + 31) / 63;
799 gval = ((63 - yf) * ((word0 >> L_GREEN_SHIFT) & 0xff) +
800 yf * ((word1 >> L_GREEN_SHIFT) & 0xff) + 31) / 63;
801 bval = ((63 - yf) * ((word0 >> L_BLUE_SHIFT) & 0xff) +
802 yf * ((word1 >> L_BLUE_SHIFT) & 0xff) + 31) / 63;
820 normalizeAngleForShear(l_float32 radang,
825 PROCNAME(
"normalizeAngleForShear");
828 pi2 = 3.14159265 / 2.0;
829 if (radang < -pi2 || radang > pi2)
830 radang = radang - (l_int32)(radang / pi2) * pi2;
833 if (radang > pi2 - mindif) {
834 L_WARNING(
"angle close to pi/2; shifting away\n", procName);
835 radang = pi2 - mindif;
836 }
else if (radang < -pi2 + mindif) {
837 L_WARNING(
"angle close to -pi/2; shifting away\n", procName);
838 radang = -pi2 + mindif;
l_ok pixResizeImageData(PIX *pixd, const PIX *pixs)
pixResizeImageData()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
l_ok pixRasteropVip(PIX *pixd, l_int32 bx, l_int32 bw, l_int32 vshift, l_int32 incolor)
pixRasteropVip()
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
l_ok pixVShearIP(PIX *pixs, l_int32 xloc, l_float32 radang, l_int32 incolor)
pixVShearIP()
PIX * pixHShearLI(PIX *pixs, l_int32 yloc, l_float32 radang, l_int32 incolor)
pixHShearLI()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixCreateTemplate(PIX *pixs)
pixCreateTemplate()
PIX * pixVShearCenter(PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
pixVShearCenter()
PIX * pixVShear(PIX *pixd, PIX *pixs, l_int32 xloc, l_float32 radang, l_int32 incolor)
pixVShear()
PIX * pixVShearCorner(PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
pixVShearCorner()
l_ok pixHShearIP(PIX *pixs, l_int32 yloc, l_float32 radang, l_int32 incolor)
pixHShearIP()
#define SET_DATA_BYTE(pdata, n, val)
PIX * pixHShearCenter(PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
pixHShearCenter()
l_ok pixSetBlackOrWhite(PIX *pixs, l_int32 op)
pixSetBlackOrWhite()
#define GET_DATA_BYTE(pdata, n)
PIX * pixClone(PIX *pixs)
pixClone()
void pixDestroy(PIX **ppix)
pixDestroy()
PIX * pixHShear(PIX *pixd, PIX *pixs, l_int32 yloc, l_float32 radang, l_int32 incolor)
pixHShear()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixHShearCorner(PIX *pixd, PIX *pixs, l_float32 radang, l_int32 incolor)
pixHShearCorner()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
l_ok pixRasteropHip(PIX *pixd, l_int32 by, l_int32 bh, l_int32 hshift, l_int32 incolor)
pixRasteropHip()
PIX * pixVShearLI(PIX *pixs, l_int32 xloc, l_float32 radang, l_int32 incolor)
pixVShearLI()