56 #include <config_auto.h> 61 #include "allheaders.h" 64 static const l_float32 MinDiffFromHalfPi = 0.04;
66 static l_float32 normalizeAngleForShear(l_float32 radang, l_float32 mindif);
124 l_int32 y, yincr, inityincr, hshift;
125 l_float32 tanangle, invangle;
127 PROCNAME(
"pixHShear");
130 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
132 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, pixd);
135 if (!pixGetColormap(pixs)) {
139 pixHShear(pixd, pix1, yloc, radang, incolor);
148 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
154 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
155 if (radang == 0.0 || tan(radang) == 0.0)
162 sign = L_SIGN(radang);
163 tanangle = tan(radang);
164 invangle = L_ABS(1. / tanangle);
165 inityincr = (l_int32)(invangle / 2.);
166 yincr = (l_int32)invangle;
168 pixs, 0, yloc - inityincr);
170 for (hshift = 1, y = yloc + inityincr; y < h; hshift++) {
171 yincr = (l_int32)(invangle * (hshift + 0.5) + 0.5) - (y - yloc);
176 lept_stderr(
"y = %d, hshift = %d, yincr = %d\n", y, hshift, yincr);
181 for (hshift = -1, y = yloc - inityincr; y > 0; hshift--) {
182 yincr = (y - yloc) - (l_int32)(invangle * (hshift - 0.5) + 0.5);
189 y - yincr, hshift, yincr);
245 l_int32 x, xincr, initxincr, vshift;
246 l_float32 tanangle, invangle;
248 PROCNAME(
"pixVShear");
251 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
253 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
256 if (!pixGetColormap(pixs)) {
260 pixVShear(pixd, pix1, xloc, radang, incolor);
269 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
275 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
276 if (radang == 0.0 || tan(radang) == 0.0)
283 sign = L_SIGN(radang);
284 tanangle = tan(radang);
285 invangle = L_ABS(1. / tanangle);
286 initxincr = (l_int32)(invangle / 2.);
287 xincr = (l_int32)invangle;
289 pixs, xloc - initxincr, 0);
291 for (vshift = 1, x = xloc + initxincr; x < w; vshift++) {
292 xincr = (l_int32)(invangle * (vshift + 0.5) + 0.5) - (x - xloc);
297 lept_stderr(
"x = %d, vshift = %d, xincr = %d\n", x, vshift, xincr);
302 for (vshift = -1, x = xloc - initxincr; x > 0; vshift--) {
303 xincr = (x - xloc) - (l_int32)(invangle * (vshift - 0.5) + 0.5);
310 x - xincr, vshift, xincr);
345 PROCNAME(
"pixHShearCorner");
348 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
350 return pixHShear(pixd, pixs, 0, radang, incolor);
376 PROCNAME(
"pixVShearCorner");
379 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
381 return pixVShear(pixd, pixs, 0, radang, incolor);
407 PROCNAME(
"pixHShearCenter");
410 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
412 return pixHShear(pixd, pixs, pixGetHeight(pixs) / 2, radang, incolor);
438 PROCNAME(
"pixVShearCenter");
441 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, pixd);
443 return pixVShear(pixd, pixs, pixGetWidth(pixs) / 2, radang, incolor);
477 l_int32 y, yincr, inityincr, hshift;
478 l_float32 tanangle, invangle;
480 PROCNAME(
"pixHShearIP");
483 return ERROR_INT(
"pixs not defined", procName, 1);
485 return ERROR_INT(
"invalid incolor value", procName, 1);
486 if (pixGetColormap(pixs))
487 return ERROR_INT(
"pixs is colormapped", procName, 1);
490 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
491 if (radang == 0.0 || tan(radang) == 0.0)
494 sign = L_SIGN(radang);
496 tanangle = tan(radang);
497 invangle = L_ABS(1. / tanangle);
498 inityincr = (l_int32)(invangle / 2.);
499 yincr = (l_int32)invangle;
502 pixRasteropHip(pixs, yloc - inityincr, 2 * inityincr, 0, incolor);
504 for (hshift = 1, y = yloc + inityincr; y < h; hshift++) {
505 yincr = (l_int32)(invangle * (hshift + 0.5) + 0.5) - (y - yloc);
506 if (yincr == 0)
continue;
513 for (hshift = -1, y = yloc - inityincr; y > 0; hshift--) {
514 yincr = (y - yloc) - (l_int32)(invangle * (hshift - 0.5) + 0.5);
515 if (yincr == 0)
continue;
552 l_int32 x, xincr, initxincr, vshift;
553 l_float32 tanangle, invangle;
555 PROCNAME(
"pixVShearIP");
558 return ERROR_INT(
"pixs not defined", procName, 1);
560 return ERROR_INT(
"invalid incolor value", procName, 1);
561 if (pixGetColormap(pixs))
562 return ERROR_INT(
"pixs is colormapped", procName, 1);
565 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
566 if (radang == 0.0 || tan(radang) == 0.0)
569 sign = L_SIGN(radang);
571 tanangle = tan(radang);
572 invangle = L_ABS(1. / tanangle);
573 initxincr = (l_int32)(invangle / 2.);
574 xincr = (l_int32)invangle;
577 pixRasteropVip(pixs, xloc - initxincr, 2 * initxincr, 0, incolor);
579 for (vshift = 1, x = xloc + initxincr; x < w; vshift++) {
580 xincr = (l_int32)(invangle * (vshift + 0.5) + 0.5) - (x - xloc);
581 if (xincr == 0)
continue;
588 for (vshift = -1, x = xloc - initxincr; x > 0; vshift--) {
589 xincr = (x - xloc) - (l_int32)(invangle * (vshift - 0.5) + 0.5);
590 if (xincr == 0)
continue;
634 l_int32 i, jd, x, xp, xf, w, h, d, wm, wpls, wpld, val, rval, gval, bval;
635 l_uint32 word0, word1;
636 l_uint32 *datas, *datad, *lines, *lined;
637 l_float32 tanangle, xshift;
640 PROCNAME(
"pixHShearLI");
643 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
645 if (d != 8 && d != 32 && !pixGetColormap(pixs))
646 return (
PIX *)ERROR_PTR(
"pixs not 8, 32 bpp, or cmap", procName, NULL);
648 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
649 if (yloc < 0 || yloc >= h)
650 return (
PIX *)ERROR_PTR(
"yloc not in [0 ... h-1]", procName, NULL);
652 if (pixGetColormap(pixs))
658 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
659 if (radang == 0.0 || tan(radang) == 0.0) {
669 d = pixGetDepth(pixd);
672 wpls = pixGetWpl(pix);
673 wpld = pixGetWpl(pixd);
674 tanangle = tan(radang);
675 for (i = 0; i < h; i++) {
676 lines = datas + i * wpls;
677 lined = datad + i * wpld;
678 xshift = (yloc - i) * tanangle;
679 for (jd = 0; jd < w; jd++) {
680 x = (l_int32)(64.0 * (-xshift + jd) + 0.5);
684 if (xp < 0 || xp > wm)
continue;
695 word0 = *(lines + xp);
696 word1 = *(lines + xp + 1);
697 rval = ((63 - xf) * ((word0 >> L_RED_SHIFT) & 0xff) +
698 xf * ((word1 >> L_RED_SHIFT) & 0xff) + 31) / 63;
699 gval = ((63 - xf) * ((word0 >> L_GREEN_SHIFT) & 0xff) +
700 xf * ((word1 >> L_GREEN_SHIFT) & 0xff) + 31) / 63;
701 bval = ((63 - xf) * ((word0 >> L_BLUE_SHIFT) & 0xff) +
702 xf * ((word1 >> L_BLUE_SHIFT) & 0xff) + 31) / 63;
705 lined[jd] = lines[xp];
746 l_int32 id, y, yp, yf, j, w, h, d, hm, wpls, wpld, val, rval, gval, bval;
747 l_uint32 word0, word1;
748 l_uint32 *datas, *datad, *lines, *lined;
749 l_float32 tanangle, yshift;
752 PROCNAME(
"pixVShearLI");
755 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
757 if (d != 8 && d != 32 && !pixGetColormap(pixs))
758 return (
PIX *)ERROR_PTR(
"pixs not 8, 32 bpp, or cmap", procName, NULL);
760 return (
PIX *)ERROR_PTR(
"invalid incolor value", procName, NULL);
761 if (xloc < 0 || xloc >= w)
762 return (
PIX *)ERROR_PTR(
"xloc not in [0 ... w-1]", procName, NULL);
764 if (pixGetColormap(pixs))
770 radang = normalizeAngleForShear(radang, MinDiffFromHalfPi);
771 if (radang == 0.0 || tan(radang) == 0.0) {
781 d = pixGetDepth(pixd);
784 wpls = pixGetWpl(pix);
785 wpld = pixGetWpl(pixd);
786 tanangle = tan(radang);
787 for (j = 0; j < w; j++) {
788 yshift = (j - xloc) * tanangle;
789 for (
id = 0;
id < h;
id++) {
790 y = (l_int32)(64.0 * (-yshift +
id) + 0.5);
794 if (yp < 0 || yp > hm)
continue;
795 lines = datas + yp * wpls;
796 lined = datad +
id * wpld;
807 word0 = *(lines + j);
808 word1 = *(lines + wpls + j);
809 rval = ((63 - yf) * ((word0 >> L_RED_SHIFT) & 0xff) +
810 yf * ((word1 >> L_RED_SHIFT) & 0xff) + 31) / 63;
811 gval = ((63 - yf) * ((word0 >> L_GREEN_SHIFT) & 0xff) +
812 yf * ((word1 >> L_GREEN_SHIFT) & 0xff) + 31) / 63;
813 bval = ((63 - yf) * ((word0 >> L_BLUE_SHIFT) & 0xff) +
814 yf * ((word1 >> L_BLUE_SHIFT) & 0xff) + 31) / 63;
832 normalizeAngleForShear(l_float32 radang,
837 PROCNAME(
"normalizeAngleForShear");
840 pi2 = 3.14159265 / 2.0;
841 if (radang < -pi2 || radang > pi2)
842 radang = radang - (l_int32)(radang / pi2) * pi2;
845 if (radang > pi2 - mindif) {
846 L_WARNING(
"angle close to pi/2; shifting away\n", procName);
847 radang = pi2 - mindif;
848 }
else if (radang < -pi2 + mindif) {
849 L_WARNING(
"angle close to -pi/2; shifting away\n", procName);
850 radang = -pi2 + mindif;
l_ok pixResizeImageData(PIX *pixd, const PIX *pixs)
pixResizeImageData()
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
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()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
void lept_stderr(const char *fmt,...)
lept_stderr()
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 * 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()
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()