Leptonica  1.77.0
Image processing and image analysis suite
fpix2.c
Go to the documentation of this file.
1 /*====================================================================*
2  - Copyright (C) 2001 Leptonica. All rights reserved.
3  -
4  - Redistribution and use in source and binary forms, with or without
5  - modification, are permitted provided that the following conditions
6  - are met:
7  - 1. Redistributions of source code must retain the above copyright
8  - notice, this list of conditions and the following disclaimer.
9  - 2. Redistributions in binary form must reproduce the above
10  - copyright notice, this list of conditions and the following
11  - disclaimer in the documentation and/or other materials
12  - provided with the distribution.
13  -
14  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18  - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23  - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *====================================================================*/
26 
104 #include <string.h>
105 #include "allheaders.h"
106 
107 /*--------------------------------------------------------------------*
108  * FPix <--> Pix conversions *
109  *--------------------------------------------------------------------*/
125 FPIX *
127  l_int32 ncomps)
128 {
129 l_int32 w, h, d, i, j, val, wplt, wpld;
130 l_uint32 uval;
131 l_uint32 *datat, *linet;
132 l_float32 *datad, *lined;
133 PIX *pixt;
134 FPIX *fpixd;
135 
136  PROCNAME("pixConvertToFPix");
137 
138  if (!pixs)
139  return (FPIX *)ERROR_PTR("pixs not defined", procName, NULL);
140 
141  /* Convert to a single component */
142  if (pixGetColormap(pixs))
144  else if (pixGetDepth(pixs) == 32 && ncomps == 3)
145  pixt = pixConvertRGBToLuminance(pixs);
146  else
147  pixt = pixClone(pixs);
148  pixGetDimensions(pixt, &w, &h, &d);
149  if (d != 1 && d != 2 && d != 4 && d != 8 && d != 16 && d != 32) {
150  pixDestroy(&pixt);
151  return (FPIX *)ERROR_PTR("invalid depth", procName, NULL);
152  }
153 
154  if ((fpixd = fpixCreate(w, h)) == NULL) {
155  pixDestroy(&pixt);
156  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
157  }
158  datat = pixGetData(pixt);
159  wplt = pixGetWpl(pixt);
160  datad = fpixGetData(fpixd);
161  wpld = fpixGetWpl(fpixd);
162  for (i = 0; i < h; i++) {
163  linet = datat + i * wplt;
164  lined = datad + i * wpld;
165  if (d == 1) {
166  for (j = 0; j < w; j++) {
167  val = GET_DATA_BIT(linet, j);
168  lined[j] = (l_float32)val;
169  }
170  } else if (d == 2) {
171  for (j = 0; j < w; j++) {
172  val = GET_DATA_DIBIT(linet, j);
173  lined[j] = (l_float32)val;
174  }
175  } else if (d == 4) {
176  for (j = 0; j < w; j++) {
177  val = GET_DATA_QBIT(linet, j);
178  lined[j] = (l_float32)val;
179  }
180  } else if (d == 8) {
181  for (j = 0; j < w; j++) {
182  val = GET_DATA_BYTE(linet, j);
183  lined[j] = (l_float32)val;
184  }
185  } else if (d == 16) {
186  for (j = 0; j < w; j++) {
187  val = GET_DATA_TWO_BYTES(linet, j);
188  lined[j] = (l_float32)val;
189  }
190  } else { /* d == 32 */
191  for (j = 0; j < w; j++) {
192  uval = GET_DATA_FOUR_BYTES(linet, j);
193  lined[j] = (l_float32)uval;
194  }
195  }
196  }
197 
198  pixDestroy(&pixt);
199  return fpixd;
200 }
201 
202 
218 DPIX *
220  l_int32 ncomps)
221 {
222 l_int32 w, h, d, i, j, val, wplt, wpld;
223 l_uint32 uval;
224 l_uint32 *datat, *linet;
225 l_float64 *datad, *lined;
226 PIX *pixt;
227 DPIX *dpixd;
228 
229  PROCNAME("pixConvertToDPix");
230 
231  if (!pixs)
232  return (DPIX *)ERROR_PTR("pixs not defined", procName, NULL);
233 
234  /* Convert to a single component */
235  if (pixGetColormap(pixs))
237  else if (pixGetDepth(pixs) == 32 && ncomps == 3)
238  pixt = pixConvertRGBToLuminance(pixs);
239  else
240  pixt = pixClone(pixs);
241  pixGetDimensions(pixt, &w, &h, &d);
242  if (d != 1 && d != 2 && d != 4 && d != 8 && d != 16 && d != 32) {
243  pixDestroy(&pixt);
244  return (DPIX *)ERROR_PTR("invalid depth", procName, NULL);
245  }
246 
247  if ((dpixd = dpixCreate(w, h)) == NULL) {
248  pixDestroy(&pixt);
249  return (DPIX *)ERROR_PTR("dpixd not made", procName, NULL);
250  }
251  datat = pixGetData(pixt);
252  wplt = pixGetWpl(pixt);
253  datad = dpixGetData(dpixd);
254  wpld = dpixGetWpl(dpixd);
255  for (i = 0; i < h; i++) {
256  linet = datat + i * wplt;
257  lined = datad + i * wpld;
258  if (d == 1) {
259  for (j = 0; j < w; j++) {
260  val = GET_DATA_BIT(linet, j);
261  lined[j] = (l_float64)val;
262  }
263  } else if (d == 2) {
264  for (j = 0; j < w; j++) {
265  val = GET_DATA_DIBIT(linet, j);
266  lined[j] = (l_float64)val;
267  }
268  } else if (d == 4) {
269  for (j = 0; j < w; j++) {
270  val = GET_DATA_QBIT(linet, j);
271  lined[j] = (l_float64)val;
272  }
273  } else if (d == 8) {
274  for (j = 0; j < w; j++) {
275  val = GET_DATA_BYTE(linet, j);
276  lined[j] = (l_float64)val;
277  }
278  } else if (d == 16) {
279  for (j = 0; j < w; j++) {
280  val = GET_DATA_TWO_BYTES(linet, j);
281  lined[j] = (l_float64)val;
282  }
283  } else { /* d == 32 */
284  for (j = 0; j < w; j++) {
285  uval = GET_DATA_FOUR_BYTES(linet, j);
286  lined[j] = (l_float64)uval;
287  }
288  }
289  }
290 
291  pixDestroy(&pixt);
292  return dpixd;
293 }
294 
295 
319 PIX *
321  l_int32 outdepth,
322  l_int32 negvals,
323  l_int32 errorflag)
324 {
325 l_int32 w, h, i, j, wpls, wpld;
326 l_uint32 vald, maxval;
327 l_float32 val;
328 l_float32 *datas, *lines;
329 l_uint32 *datad, *lined;
330 PIX *pixd;
331 
332  PROCNAME("fpixConvertToPix");
333 
334  if (!fpixs)
335  return (PIX *)ERROR_PTR("fpixs not defined", procName, NULL);
336  if (negvals != L_CLIP_TO_ZERO && negvals != L_TAKE_ABSVAL)
337  return (PIX *)ERROR_PTR("invalid negvals", procName, NULL);
338  if (outdepth != 0 && outdepth != 8 && outdepth != 16 && outdepth != 32)
339  return (PIX *)ERROR_PTR("outdepth not in {0,8,16,32}", procName, NULL);
340 
341  fpixGetDimensions(fpixs, &w, &h);
342  datas = fpixGetData(fpixs);
343  wpls = fpixGetWpl(fpixs);
344 
345  /* Adaptive determination of output depth */
346  if (outdepth == 0) {
347  outdepth = 8;
348  for (i = 0; i < h && outdepth < 32; i++) {
349  lines = datas + i * wpls;
350  for (j = 0; j < w && outdepth < 32; j++) {
351  if (lines[j] > 65535.5)
352  outdepth = 32;
353  else if (lines[j] > 255.5)
354  outdepth = 16;
355  }
356  }
357  }
358  if (outdepth == 8)
359  maxval = 0xff;
360  else if (outdepth == 16)
361  maxval = 0xffff;
362  else /* outdepth == 32 */
363  maxval = 0xffffffff;
364 
365  /* Gather statistics if %errorflag = TRUE */
366  if (errorflag) {
367  l_int32 negs = 0;
368  l_int32 overvals = 0;
369  for (i = 0; i < h; i++) {
370  lines = datas + i * wpls;
371  for (j = 0; j < w; j++) {
372  val = lines[j];
373  if (val < 0.0)
374  negs++;
375  else if (val > maxval)
376  overvals++;
377  }
378  }
379  if (negs > 0)
380  L_ERROR("Number of negative values: %d\n", procName, negs);
381  if (overvals > 0)
382  L_ERROR("Number of too-large values: %d\n", procName, overvals);
383  }
384 
385  /* Make the pix and convert the data */
386  if ((pixd = pixCreate(w, h, outdepth)) == NULL)
387  return (PIX *)ERROR_PTR("pixd not made", procName, NULL);
388  datad = pixGetData(pixd);
389  wpld = pixGetWpl(pixd);
390  for (i = 0; i < h; i++) {
391  lines = datas + i * wpls;
392  lined = datad + i * wpld;
393  for (j = 0; j < w; j++) {
394  val = lines[j];
395  if (val >= 0.0)
396  vald = (l_uint32)(val + 0.5);
397  else if (negvals == L_CLIP_TO_ZERO) /* and val < 0.0 */
398  vald = 0;
399  else
400  vald = (l_uint32)(-val + 0.5);
401  if (vald > maxval)
402  vald = maxval;
403 
404  if (outdepth == 8)
405  SET_DATA_BYTE(lined, j, vald);
406  else if (outdepth == 16)
407  SET_DATA_TWO_BYTES(lined, j, vald);
408  else /* outdepth == 32 */
409  SET_DATA_FOUR_BYTES(lined, j, vald);
410  }
411  }
412 
413  return pixd;
414 }
415 
416 
423 PIX *
425 {
426 l_uint8 dval;
427 l_int32 i, j, w, h, wpls, wpld;
428 l_float32 factor, sval, maxval;
429 l_float32 *lines, *datas;
430 l_uint32 *lined, *datad;
431 PIX *pixd;
432 
433  PROCNAME("fpixDisplayMaxDynamicRange");
434 
435  if (!fpixs)
436  return (PIX *)ERROR_PTR("fpixs not defined", procName, NULL);
437 
438  fpixGetDimensions(fpixs, &w, &h);
439  datas = fpixGetData(fpixs);
440  wpls = fpixGetWpl(fpixs);
441 
442  maxval = 0.0;
443  for (i = 0; i < h; i++) {
444  lines = datas + i * wpls;
445  for (j = 0; j < w; j++) {
446  sval = *(lines + j);
447  if (sval > maxval)
448  maxval = sval;
449  }
450  }
451 
452  pixd = pixCreate(w, h, 8);
453  if (maxval == 0.0)
454  return pixd; /* all pixels are 0 */
455 
456  datad = pixGetData(pixd);
457  wpld = pixGetWpl(pixd);
458  factor = 255. / maxval;
459  for (i = 0; i < h; i++) {
460  lines = datas + i * wpls;
461  lined = datad + i * wpld;
462  for (j = 0; j < w; j++) {
463  sval = *(lines + j);
464  if (sval < 0.0) sval = 0.0;
465  dval = (l_uint8)(factor * sval + 0.5);
466  SET_DATA_BYTE(lined, j, dval);
467  }
468  }
469 
470  return pixd;
471 }
472 
473 
480 DPIX *
482 {
483 l_int32 w, h, i, j, wpls, wpld;
484 l_float32 val;
485 l_float32 *datas, *lines;
486 l_float64 *datad, *lined;
487 DPIX *dpix;
488 
489  PROCNAME("fpixConvertToDPix");
490 
491  if (!fpix)
492  return (DPIX *)ERROR_PTR("fpix not defined", procName, NULL);
493 
494  fpixGetDimensions(fpix, &w, &h);
495  if ((dpix = dpixCreate(w, h)) == NULL)
496  return (DPIX *)ERROR_PTR("dpix not made", procName, NULL);
497 
498  datas = fpixGetData(fpix);
499  datad = dpixGetData(dpix);
500  wpls = fpixGetWpl(fpix);
501  wpld = dpixGetWpl(dpix); /* 8 byte words */
502  for (i = 0; i < h; i++) {
503  lines = datas + i * wpls;
504  lined = datad + i * wpld;
505  for (j = 0; j < w; j++) {
506  val = lines[j];
507  lined[j] = val;
508  }
509  }
510 
511  return dpix;
512 }
513 
514 
538 PIX *
540  l_int32 outdepth,
541  l_int32 negvals,
542  l_int32 errorflag)
543 {
544 l_int32 w, h, i, j, wpls, wpld, maxval;
545 l_uint32 vald;
546 l_float64 val;
547 l_float64 *datas, *lines;
548 l_uint32 *datad, *lined;
549 PIX *pixd;
550 
551  PROCNAME("dpixConvertToPix");
552 
553  if (!dpixs)
554  return (PIX *)ERROR_PTR("dpixs not defined", procName, NULL);
555  if (negvals != L_CLIP_TO_ZERO && negvals != L_TAKE_ABSVAL)
556  return (PIX *)ERROR_PTR("invalid negvals", procName, NULL);
557  if (outdepth != 0 && outdepth != 8 && outdepth != 16 && outdepth != 32)
558  return (PIX *)ERROR_PTR("outdepth not in {0,8,16,32}", procName, NULL);
559 
560  dpixGetDimensions(dpixs, &w, &h);
561  datas = dpixGetData(dpixs);
562  wpls = dpixGetWpl(dpixs);
563 
564  /* Adaptive determination of output depth */
565  if (outdepth == 0) {
566  outdepth = 8;
567  for (i = 0; i < h && outdepth < 32; i++) {
568  lines = datas + i * wpls;
569  for (j = 0; j < w && outdepth < 32; j++) {
570  if (lines[j] > 65535.5)
571  outdepth = 32;
572  else if (lines[j] > 255.5)
573  outdepth = 16;
574  }
575  }
576  }
577  maxval = 0xff;
578  if (outdepth == 16)
579  maxval = 0xffff;
580  else /* outdepth == 32 */
581  maxval = 0xffffffff;
582 
583  /* Gather statistics if %errorflag = TRUE */
584  if (errorflag) {
585  l_int32 negs = 0;
586  l_int32 overvals = 0;
587  for (i = 0; i < h; i++) {
588  lines = datas + i * wpls;
589  for (j = 0; j < w; j++) {
590  val = lines[j];
591  if (val < 0.0)
592  negs++;
593  else if (val > maxval)
594  overvals++;
595  }
596  }
597  if (negs > 0)
598  L_ERROR("Number of negative values: %d\n", procName, negs);
599  if (overvals > 0)
600  L_ERROR("Number of too-large values: %d\n", procName, overvals);
601  }
602 
603  /* Make the pix and convert the data */
604  if ((pixd = pixCreate(w, h, outdepth)) == NULL)
605  return (PIX *)ERROR_PTR("pixd not made", procName, NULL);
606  datad = pixGetData(pixd);
607  wpld = pixGetWpl(pixd);
608  for (i = 0; i < h; i++) {
609  lines = datas + i * wpls;
610  lined = datad + i * wpld;
611  for (j = 0; j < w; j++) {
612  val = lines[j];
613  if (val >= 0.0) {
614  vald = (l_uint32)(val + 0.5);
615  } else { /* val < 0.0 */
616  if (negvals == L_CLIP_TO_ZERO)
617  vald = 0;
618  else
619  vald = (l_uint32)(-val + 0.5);
620  }
621  if (vald > maxval)
622  vald = maxval;
623  if (outdepth == 8)
624  SET_DATA_BYTE(lined, j, vald);
625  else if (outdepth == 16)
626  SET_DATA_TWO_BYTES(lined, j, vald);
627  else /* outdepth == 32 */
628  SET_DATA_FOUR_BYTES(lined, j, vald);
629  }
630  }
631 
632  return pixd;
633 }
634 
635 
642 FPIX *
644 {
645 l_int32 w, h, i, j, wpls, wpld;
646 l_float64 val;
647 l_float32 *datad, *lined;
648 l_float64 *datas, *lines;
649 FPIX *fpix;
650 
651  PROCNAME("dpixConvertToFPix");
652 
653  if (!dpix)
654  return (FPIX *)ERROR_PTR("dpix not defined", procName, NULL);
655 
656  dpixGetDimensions(dpix, &w, &h);
657  if ((fpix = fpixCreate(w, h)) == NULL)
658  return (FPIX *)ERROR_PTR("fpix not made", procName, NULL);
659 
660  datas = dpixGetData(dpix);
661  datad = fpixGetData(fpix);
662  wpls = dpixGetWpl(dpix); /* 8 byte words */
663  wpld = fpixGetWpl(fpix);
664  for (i = 0; i < h; i++) {
665  lines = datas + i * wpls;
666  lined = datad + i * wpld;
667  for (j = 0; j < w; j++) {
668  val = lines[j];
669  lined[j] = (l_float32)val;
670  }
671  }
672 
673  return fpix;
674 }
675 
676 
677 
678 /*--------------------------------------------------------------------*
679  * Min/max value *
680  *--------------------------------------------------------------------*/
690 l_ok
692  l_float32 *pminval,
693  l_int32 *pxminloc,
694  l_int32 *pyminloc)
695 {
696 l_int32 i, j, w, h, wpl, xminloc, yminloc;
697 l_float32 *data, *line;
698 l_float32 minval;
699 
700  PROCNAME("fpixGetMin");
701 
702  if (!pminval && !pxminloc && !pyminloc)
703  return ERROR_INT("no return val requested", procName, 1);
704  if (pminval) *pminval = 0.0;
705  if (pxminloc) *pxminloc = 0;
706  if (pyminloc) *pyminloc = 0;
707  if (!fpix)
708  return ERROR_INT("fpix not defined", procName, 1);
709 
710  minval = +1.0e20;
711  xminloc = 0;
712  yminloc = 0;
713  fpixGetDimensions(fpix, &w, &h);
714  data = fpixGetData(fpix);
715  wpl = fpixGetWpl(fpix);
716  for (i = 0; i < h; i++) {
717  line = data + i * wpl;
718  for (j = 0; j < w; j++) {
719  if (line[j] < minval) {
720  minval = line[j];
721  xminloc = j;
722  yminloc = i;
723  }
724  }
725  }
726 
727  if (pminval) *pminval = minval;
728  if (pxminloc) *pxminloc = xminloc;
729  if (pyminloc) *pyminloc = yminloc;
730  return 0;
731 }
732 
733 
743 l_ok
745  l_float32 *pmaxval,
746  l_int32 *pxmaxloc,
747  l_int32 *pymaxloc)
748 {
749 l_int32 i, j, w, h, wpl, xmaxloc, ymaxloc;
750 l_float32 *data, *line;
751 l_float32 maxval;
752 
753  PROCNAME("fpixGetMax");
754 
755  if (!pmaxval && !pxmaxloc && !pymaxloc)
756  return ERROR_INT("no return val requested", procName, 1);
757  if (pmaxval) *pmaxval = 0.0;
758  if (pxmaxloc) *pxmaxloc = 0;
759  if (pymaxloc) *pymaxloc = 0;
760  if (!fpix)
761  return ERROR_INT("fpix not defined", procName, 1);
762 
763  maxval = -1.0e20;
764  xmaxloc = 0;
765  ymaxloc = 0;
766  fpixGetDimensions(fpix, &w, &h);
767  data = fpixGetData(fpix);
768  wpl = fpixGetWpl(fpix);
769  for (i = 0; i < h; i++) {
770  line = data + i * wpl;
771  for (j = 0; j < w; j++) {
772  if (line[j] > maxval) {
773  maxval = line[j];
774  xmaxloc = j;
775  ymaxloc = i;
776  }
777  }
778  }
779 
780  if (pmaxval) *pmaxval = maxval;
781  if (pxmaxloc) *pxmaxloc = xmaxloc;
782  if (pymaxloc) *pymaxloc = ymaxloc;
783  return 0;
784 }
785 
786 
796 l_ok
798  l_float64 *pminval,
799  l_int32 *pxminloc,
800  l_int32 *pyminloc)
801 {
802 l_int32 i, j, w, h, wpl, xminloc, yminloc;
803 l_float64 *data, *line;
804 l_float64 minval;
805 
806  PROCNAME("dpixGetMin");
807 
808  if (!pminval && !pxminloc && !pyminloc)
809  return ERROR_INT("no return val requested", procName, 1);
810  if (pminval) *pminval = 0.0;
811  if (pxminloc) *pxminloc = 0;
812  if (pyminloc) *pyminloc = 0;
813  if (!dpix)
814  return ERROR_INT("dpix not defined", procName, 1);
815 
816  minval = +1.0e300;
817  xminloc = 0;
818  yminloc = 0;
819  dpixGetDimensions(dpix, &w, &h);
820  data = dpixGetData(dpix);
821  wpl = dpixGetWpl(dpix);
822  for (i = 0; i < h; i++) {
823  line = data + i * wpl;
824  for (j = 0; j < w; j++) {
825  if (line[j] < minval) {
826  minval = line[j];
827  xminloc = j;
828  yminloc = i;
829  }
830  }
831  }
832 
833  if (pminval) *pminval = minval;
834  if (pxminloc) *pxminloc = xminloc;
835  if (pyminloc) *pyminloc = yminloc;
836  return 0;
837 }
838 
839 
849 l_ok
851  l_float64 *pmaxval,
852  l_int32 *pxmaxloc,
853  l_int32 *pymaxloc)
854 {
855 l_int32 i, j, w, h, wpl, xmaxloc, ymaxloc;
856 l_float64 *data, *line;
857 l_float64 maxval;
858 
859  PROCNAME("dpixGetMax");
860 
861  if (!pmaxval && !pxmaxloc && !pymaxloc)
862  return ERROR_INT("no return val requested", procName, 1);
863  if (pmaxval) *pmaxval = 0.0;
864  if (pxmaxloc) *pxmaxloc = 0;
865  if (pymaxloc) *pymaxloc = 0;
866  if (!dpix)
867  return ERROR_INT("dpix not defined", procName, 1);
868 
869  maxval = -1.0e20;
870  xmaxloc = 0;
871  ymaxloc = 0;
872  dpixGetDimensions(dpix, &w, &h);
873  data = dpixGetData(dpix);
874  wpl = dpixGetWpl(dpix);
875  for (i = 0; i < h; i++) {
876  line = data + i * wpl;
877  for (j = 0; j < w; j++) {
878  if (line[j] > maxval) {
879  maxval = line[j];
880  xmaxloc = j;
881  ymaxloc = i;
882  }
883  }
884  }
885 
886  if (pmaxval) *pmaxval = maxval;
887  if (pxmaxloc) *pxmaxloc = xmaxloc;
888  if (pymaxloc) *pymaxloc = ymaxloc;
889  return 0;
890 }
891 
892 
893 /*--------------------------------------------------------------------*
894  * Special integer scaling *
895  *--------------------------------------------------------------------*/
916 FPIX *
918  l_int32 factor)
919 {
920 l_int32 i, j, k, m, ws, hs, wd, hd, wpls, wpld;
921 l_float32 val0, val1, val2, val3;
922 l_float32 *datas, *datad, *lines, *lined, *fract;
923 FPIX *fpixd;
924 
925  PROCNAME("fpixScaleByInteger");
926 
927  if (!fpixs)
928  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
929 
930  fpixGetDimensions(fpixs, &ws, &hs);
931  wd = factor * (ws - 1) + 1;
932  hd = factor * (hs - 1) + 1;
933  fpixd = fpixCreate(wd, hd);
934  datas = fpixGetData(fpixs);
935  datad = fpixGetData(fpixd);
936  wpls = fpixGetWpl(fpixs);
937  wpld = fpixGetWpl(fpixd);
938  fract = (l_float32 *)LEPT_CALLOC(factor, sizeof(l_float32));
939  for (i = 0; i < factor; i++)
940  fract[i] = i / (l_float32)factor;
941  for (i = 0; i < hs - 1; i++) {
942  lines = datas + i * wpls;
943  for (j = 0; j < ws - 1; j++) {
944  val0 = lines[j];
945  val1 = lines[j + 1];
946  val2 = lines[wpls + j];
947  val3 = lines[wpls + j + 1];
948  for (k = 0; k < factor; k++) { /* rows of sub-block */
949  lined = datad + (i * factor + k) * wpld;
950  for (m = 0; m < factor; m++) { /* cols of sub-block */
951  lined[j * factor + m] =
952  val0 * (1.0 - fract[m]) * (1.0 - fract[k]) +
953  val1 * fract[m] * (1.0 - fract[k]) +
954  val2 * (1.0 - fract[m]) * fract[k] +
955  val3 * fract[m] * fract[k];
956  }
957  }
958  }
959  }
960 
961  /* Do the right-most column of fpixd, skipping LR corner */
962  for (i = 0; i < hs - 1; i++) {
963  lines = datas + i * wpls;
964  val0 = lines[ws - 1];
965  val1 = lines[wpls + ws - 1];
966  for (k = 0; k < factor; k++) {
967  lined = datad + (i * factor + k) * wpld;
968  lined[wd - 1] = val0 * (1.0 - fract[k]) + val1 * fract[k];
969  }
970  }
971 
972  /* Do the bottom-most row of fpixd */
973  lines = datas + (hs - 1) * wpls;
974  lined = datad + (hd - 1) * wpld;
975  for (j = 0; j < ws - 1; j++) {
976  val0 = lines[j];
977  val1 = lines[j + 1];
978  for (m = 0; m < factor; m++)
979  lined[j * factor + m] = val0 * (1.0 - fract[m]) + val1 * fract[m];
980  lined[wd - 1] = lines[ws - 1]; /* LR corner */
981  }
982 
983  LEPT_FREE(fract);
984  return fpixd;
985 }
986 
987 
1008 DPIX *
1010  l_int32 factor)
1011 {
1012 l_int32 i, j, k, m, ws, hs, wd, hd, wpls, wpld;
1013 l_float64 val0, val1, val2, val3;
1014 l_float64 *datas, *datad, *lines, *lined, *fract;
1015 DPIX *dpixd;
1016 
1017  PROCNAME("dpixScaleByInteger");
1018 
1019  if (!dpixs)
1020  return (DPIX *)ERROR_PTR("dpixs not defined", procName, NULL);
1021 
1022  dpixGetDimensions(dpixs, &ws, &hs);
1023  wd = factor * (ws - 1) + 1;
1024  hd = factor * (hs - 1) + 1;
1025  dpixd = dpixCreate(wd, hd);
1026  datas = dpixGetData(dpixs);
1027  datad = dpixGetData(dpixd);
1028  wpls = dpixGetWpl(dpixs);
1029  wpld = dpixGetWpl(dpixd);
1030  fract = (l_float64 *)LEPT_CALLOC(factor, sizeof(l_float64));
1031  for (i = 0; i < factor; i++)
1032  fract[i] = i / (l_float64)factor;
1033  for (i = 0; i < hs - 1; i++) {
1034  lines = datas + i * wpls;
1035  for (j = 0; j < ws - 1; j++) {
1036  val0 = lines[j];
1037  val1 = lines[j + 1];
1038  val2 = lines[wpls + j];
1039  val3 = lines[wpls + j + 1];
1040  for (k = 0; k < factor; k++) { /* rows of sub-block */
1041  lined = datad + (i * factor + k) * wpld;
1042  for (m = 0; m < factor; m++) { /* cols of sub-block */
1043  lined[j * factor + m] =
1044  val0 * (1.0 - fract[m]) * (1.0 - fract[k]) +
1045  val1 * fract[m] * (1.0 - fract[k]) +
1046  val2 * (1.0 - fract[m]) * fract[k] +
1047  val3 * fract[m] * fract[k];
1048  }
1049  }
1050  }
1051  }
1052 
1053  /* Do the right-most column of dpixd, skipping LR corner */
1054  for (i = 0; i < hs - 1; i++) {
1055  lines = datas + i * wpls;
1056  val0 = lines[ws - 1];
1057  val1 = lines[wpls + ws - 1];
1058  for (k = 0; k < factor; k++) {
1059  lined = datad + (i * factor + k) * wpld;
1060  lined[wd - 1] = val0 * (1.0 - fract[k]) + val1 * fract[k];
1061  }
1062  }
1063 
1064  /* Do the bottom-most row of dpixd */
1065  lines = datas + (hs - 1) * wpls;
1066  lined = datad + (hd - 1) * wpld;
1067  for (j = 0; j < ws - 1; j++) {
1068  val0 = lines[j];
1069  val1 = lines[j + 1];
1070  for (m = 0; m < factor; m++)
1071  lined[j * factor + m] = val0 * (1.0 - fract[m]) + val1 * fract[m];
1072  lined[wd - 1] = lines[ws - 1]; /* LR corner */
1073  }
1074 
1075  LEPT_FREE(fract);
1076  return dpixd;
1077 }
1078 
1079 
1080 /*--------------------------------------------------------------------*
1081  * Arithmetic operations *
1082  *--------------------------------------------------------------------*/
1105 FPIX *
1107  FPIX *fpixs1,
1108  FPIX *fpixs2,
1109  l_float32 a,
1110  l_float32 b)
1111 {
1112 l_int32 i, j, ws, hs, w, h, wpls, wpld;
1113 l_float32 *datas, *datad, *lines, *lined;
1114 
1115  PROCNAME("fpixLinearCombination");
1116 
1117  if (!fpixs1)
1118  return (FPIX *)ERROR_PTR("fpixs1 not defined", procName, fpixd);
1119  if (!fpixs2)
1120  return (FPIX *)ERROR_PTR("fpixs2 not defined", procName, fpixd);
1121  if (fpixs1 == fpixs2)
1122  return (FPIX *)ERROR_PTR("fpixs1 == fpixs2", procName, fpixd);
1123  if (fpixs2 == fpixd)
1124  return (FPIX *)ERROR_PTR("fpixs2 == fpixd", procName, fpixd);
1125 
1126  if (fpixs1 != fpixd)
1127  fpixd = fpixCopy(fpixd, fpixs1);
1128 
1129  datas = fpixGetData(fpixs2);
1130  datad = fpixGetData(fpixd);
1131  wpls = fpixGetWpl(fpixs2);
1132  wpld = fpixGetWpl(fpixd);
1133  fpixGetDimensions(fpixs2, &ws, &hs);
1134  fpixGetDimensions(fpixd, &w, &h);
1135  w = L_MIN(ws, w);
1136  h = L_MIN(hs, h);
1137  for (i = 0; i < h; i++) {
1138  lines = datas + i * wpls;
1139  lined = datad + i * wpld;
1140  for (j = 0; j < w; j++)
1141  lined[j] = a * lined[j] + b * lines[j];
1142  }
1143 
1144  return fpixd;
1145 }
1146 
1147 
1164 l_ok
1166  l_float32 addc,
1167  l_float32 multc)
1168 {
1169 l_int32 i, j, w, h, wpl;
1170 l_float32 *line, *data;
1171 
1172  PROCNAME("fpixAddMultConstant");
1173 
1174  if (!fpix)
1175  return ERROR_INT("fpix not defined", procName, 1);
1176 
1177  if (addc == 0.0 && multc == 1.0)
1178  return 0;
1179 
1180  fpixGetDimensions(fpix, &w, &h);
1181  data = fpixGetData(fpix);
1182  wpl = fpixGetWpl(fpix);
1183  for (i = 0; i < h; i++) {
1184  line = data + i * wpl;
1185  if (addc == 0.0) {
1186  for (j = 0; j < w; j++)
1187  line[j] *= multc;
1188  } else if (multc == 1.0) {
1189  for (j = 0; j < w; j++)
1190  line[j] += addc;
1191  } else {
1192  for (j = 0; j < w; j++) {
1193  line[j] = multc * line[j] + addc;
1194  }
1195  }
1196  }
1197 
1198  return 0;
1199 }
1200 
1201 
1224 DPIX *
1226  DPIX *dpixs1,
1227  DPIX *dpixs2,
1228  l_float32 a,
1229  l_float32 b)
1230 {
1231 l_int32 i, j, ws, hs, w, h, wpls, wpld;
1232 l_float64 *datas, *datad, *lines, *lined;
1233 
1234  PROCNAME("dpixLinearCombination");
1235 
1236  if (!dpixs1)
1237  return (DPIX *)ERROR_PTR("dpixs1 not defined", procName, dpixd);
1238  if (!dpixs2)
1239  return (DPIX *)ERROR_PTR("dpixs2 not defined", procName, dpixd);
1240  if (dpixs1 == dpixs2)
1241  return (DPIX *)ERROR_PTR("dpixs1 == dpixs2", procName, dpixd);
1242  if (dpixs2 == dpixd)
1243  return (DPIX *)ERROR_PTR("dpixs2 == dpixd", procName, dpixd);
1244 
1245  if (dpixs1 != dpixd)
1246  dpixd = dpixCopy(dpixd, dpixs1);
1247 
1248  datas = dpixGetData(dpixs2);
1249  datad = dpixGetData(dpixd);
1250  wpls = dpixGetWpl(dpixs2);
1251  wpld = dpixGetWpl(dpixd);
1252  dpixGetDimensions(dpixs2, &ws, &hs);
1253  dpixGetDimensions(dpixd, &w, &h);
1254  w = L_MIN(ws, w);
1255  h = L_MIN(hs, h);
1256  for (i = 0; i < h; i++) {
1257  lines = datas + i * wpls;
1258  lined = datad + i * wpld;
1259  for (j = 0; j < w; j++)
1260  lined[j] = a * lined[j] + b * lines[j];
1261  }
1262 
1263  return dpixd;
1264 }
1265 
1266 
1283 l_ok
1285  l_float64 addc,
1286  l_float64 multc)
1287 {
1288 l_int32 i, j, w, h, wpl;
1289 l_float64 *line, *data;
1290 
1291  PROCNAME("dpixAddMultConstant");
1292 
1293  if (!dpix)
1294  return ERROR_INT("dpix not defined", procName, 1);
1295 
1296  if (addc == 0.0 && multc == 1.0)
1297  return 0;
1298 
1299  dpixGetDimensions(dpix, &w, &h);
1300  data = dpixGetData(dpix);
1301  wpl = dpixGetWpl(dpix);
1302  for (i = 0; i < h; i++) {
1303  line = data + i * wpl;
1304  if (addc == 0.0) {
1305  for (j = 0; j < w; j++)
1306  line[j] *= multc;
1307  } else if (multc == 1.0) {
1308  for (j = 0; j < w; j++)
1309  line[j] += addc;
1310  } else {
1311  for (j = 0; j < w; j++)
1312  line[j] = multc * line[j] + addc;
1313  }
1314  }
1315 
1316  return 0;
1317 }
1318 
1319 
1320 /*--------------------------------------------------------------------*
1321  * Set all *
1322  *--------------------------------------------------------------------*/
1330 l_ok
1332  l_float32 inval)
1333 {
1334 l_int32 i, j, w, h;
1335 l_float32 *data, *line;
1336 
1337  PROCNAME("fpixSetAllArbitrary");
1338 
1339  if (!fpix)
1340  return ERROR_INT("fpix not defined", procName, 1);
1341 
1342  fpixGetDimensions(fpix, &w, &h);
1343  data = fpixGetData(fpix);
1344  for (i = 0; i < h; i++) {
1345  line = data + i * w;
1346  for (j = 0; j < w; j++)
1347  *(line + j) = inval;
1348  }
1349 
1350  return 0;
1351 }
1352 
1353 
1361 l_ok
1363  l_float64 inval)
1364 {
1365 l_int32 i, j, w, h;
1366 l_float64 *data, *line;
1367 
1368  PROCNAME("dpixSetAllArbitrary");
1369 
1370  if (!dpix)
1371  return ERROR_INT("dpix not defined", procName, 1);
1372 
1373  dpixGetDimensions(dpix, &w, &h);
1374  data = dpixGetData(dpix);
1375  for (i = 0; i < h; i++) {
1376  line = data + i * w;
1377  for (j = 0; j < w; j++)
1378  *(line + j) = inval;
1379  }
1380 
1381  return 0;
1382 }
1383 
1384 
1385 /*--------------------------------------------------------------------*
1386  * Border functions *
1387  *--------------------------------------------------------------------*/
1400 FPIX *
1402  l_int32 left,
1403  l_int32 right,
1404  l_int32 top,
1405  l_int32 bot)
1406 {
1407 l_int32 ws, hs, wd, hd;
1408 FPIX *fpixd;
1409 
1410  PROCNAME("fpixAddBorder");
1411 
1412  if (!fpixs)
1413  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1414 
1415  if (left <= 0 && right <= 0 && top <= 0 && bot <= 0)
1416  return fpixCopy(NULL, fpixs);
1417  fpixGetDimensions(fpixs, &ws, &hs);
1418  wd = ws + left + right;
1419  hd = hs + top + bot;
1420  if ((fpixd = fpixCreate(wd, hd)) == NULL)
1421  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1422 
1423  fpixCopyResolution(fpixd, fpixs);
1424  fpixRasterop(fpixd, left, top, ws, hs, fpixs, 0, 0);
1425  return fpixd;
1426 }
1427 
1428 
1436 FPIX *
1438  l_int32 left,
1439  l_int32 right,
1440  l_int32 top,
1441  l_int32 bot)
1442 {
1443 l_int32 ws, hs, wd, hd;
1444 FPIX *fpixd;
1445 
1446  PROCNAME("fpixRemoveBorder");
1447 
1448  if (!fpixs)
1449  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1450 
1451  if (left <= 0 && right <= 0 && top <= 0 && bot <= 0)
1452  return fpixCopy(NULL, fpixs);
1453  fpixGetDimensions(fpixs, &ws, &hs);
1454  wd = ws - left - right;
1455  hd = hs - top - bot;
1456  if (wd <= 0 || hd <= 0)
1457  return (FPIX *)ERROR_PTR("width & height not both > 0", procName, NULL);
1458  if ((fpixd = fpixCreate(wd, hd)) == NULL)
1459  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1460 
1461  fpixCopyResolution(fpixd, fpixs);
1462  fpixRasterop(fpixd, 0, 0, wd, hd, fpixs, left, top);
1463  return fpixd;
1464 }
1465 
1466 
1467 
1480 FPIX *
1482  l_int32 left,
1483  l_int32 right,
1484  l_int32 top,
1485  l_int32 bot)
1486 {
1487 l_int32 i, j, w, h;
1488 FPIX *fpixd;
1489 
1490  PROCNAME("fpixAddMirroredBorder");
1491 
1492  if (!fpixs)
1493  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1494 
1495  fpixd = fpixAddBorder(fpixs, left, right, top, bot);
1496  fpixGetDimensions(fpixs, &w, &h);
1497  for (j = 0; j < left; j++)
1498  fpixRasterop(fpixd, left - 1 - j, top, 1, h,
1499  fpixd, left + j, top);
1500  for (j = 0; j < right; j++)
1501  fpixRasterop(fpixd, left + w + j, top, 1, h,
1502  fpixd, left + w - 1 - j, top);
1503  for (i = 0; i < top; i++)
1504  fpixRasterop(fpixd, 0, top - 1 - i, left + w + right, 1,
1505  fpixd, 0, top + i);
1506  for (i = 0; i < bot; i++)
1507  fpixRasterop(fpixd, 0, top + h + i, left + w + right, 1,
1508  fpixd, 0, top + h - 1 - i);
1509 
1510  return fpixd;
1511 }
1512 
1513 
1527 FPIX *
1529  l_int32 left,
1530  l_int32 right,
1531  l_int32 top,
1532  l_int32 bot)
1533 {
1534 l_int32 i, j, w, h;
1535 FPIX *fpixd;
1536 
1537  PROCNAME("fpixAddContinuedBorder");
1538 
1539  if (!fpixs)
1540  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1541 
1542  fpixd = fpixAddBorder(fpixs, left, right, top, bot);
1543  fpixGetDimensions(fpixs, &w, &h);
1544  for (j = 0; j < left; j++)
1545  fpixRasterop(fpixd, j, top, 1, h, fpixd, left, top);
1546  for (j = 0; j < right; j++)
1547  fpixRasterop(fpixd, left + w + j, top, 1, h, fpixd, left + w - 1, top);
1548  for (i = 0; i < top; i++)
1549  fpixRasterop(fpixd, 0, i, left + w + right, 1, fpixd, 0, top);
1550  for (i = 0; i < bot; i++)
1551  fpixRasterop(fpixd, 0, top + h + i, left + w + right, 1,
1552  fpixd, 0, top + h - 1);
1553 
1554  return fpixd;
1555 }
1556 
1557 
1572 FPIX *
1574  l_int32 left,
1575  l_int32 right,
1576  l_int32 top,
1577  l_int32 bot)
1578 {
1579 l_int32 i, j, w, h, fullw, fullh;
1580 l_float32 val1, val2, del;
1581 FPIX *fpixd;
1582 
1583  PROCNAME("fpixAddSlopeBorder");
1584 
1585  if (!fpixs)
1586  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1587 
1588  fpixd = fpixAddBorder(fpixs, left, right, top, bot);
1589  fpixGetDimensions(fpixs, &w, &h);
1590 
1591  /* Left */
1592  for (i = top; i < top + h; i++) {
1593  fpixGetPixel(fpixd, left, i, &val1);
1594  fpixGetPixel(fpixd, left + 1, i, &val2);
1595  del = val1 - val2;
1596  for (j = 0; j < left; j++)
1597  fpixSetPixel(fpixd, j, i, val1 + del * (left - j));
1598  }
1599 
1600  /* Right */
1601  fullw = left + w + right;
1602  for (i = top; i < top + h; i++) {
1603  fpixGetPixel(fpixd, left + w - 1, i, &val1);
1604  fpixGetPixel(fpixd, left + w - 2, i, &val2);
1605  del = val1 - val2;
1606  for (j = left + w; j < fullw; j++)
1607  fpixSetPixel(fpixd, j, i, val1 + del * (j - left - w + 1));
1608  }
1609 
1610  /* Top */
1611  for (j = 0; j < fullw; j++) {
1612  fpixGetPixel(fpixd, j, top, &val1);
1613  fpixGetPixel(fpixd, j, top + 1, &val2);
1614  del = val1 - val2;
1615  for (i = 0; i < top; i++)
1616  fpixSetPixel(fpixd, j, i, val1 + del * (top - i));
1617  }
1618 
1619  /* Bottom */
1620  fullh = top + h + bot;
1621  for (j = 0; j < fullw; j++) {
1622  fpixGetPixel(fpixd, j, top + h - 1, &val1);
1623  fpixGetPixel(fpixd, j, top + h - 2, &val2);
1624  del = val1 - val2;
1625  for (i = top + h; i < fullh; i++)
1626  fpixSetPixel(fpixd, j, i, val1 + del * (i - top - h + 1));
1627  }
1628 
1629  return fpixd;
1630 }
1631 
1632 
1633 /*--------------------------------------------------------------------*
1634  * Simple rasterop *
1635  *--------------------------------------------------------------------*/
1661 l_ok
1663  l_int32 dx,
1664  l_int32 dy,
1665  l_int32 dw,
1666  l_int32 dh,
1667  FPIX *fpixs,
1668  l_int32 sx,
1669  l_int32 sy)
1670 {
1671 l_int32 fsw, fsh, fdw, fdh, dhangw, shangw, dhangh, shangh;
1672 l_int32 i, j, wpls, wpld;
1673 l_float32 *datas, *datad, *lines, *lined;
1674 
1675  PROCNAME("fpixRasterop");
1676 
1677  if (!fpixs)
1678  return ERROR_INT("fpixs not defined", procName, 1);
1679  if (!fpixd)
1680  return ERROR_INT("fpixd not defined", procName, 1);
1681 
1682  /* -------------------------------------------------------- *
1683  * Clip to maximum rectangle with both src and dest *
1684  * -------------------------------------------------------- */
1685  fpixGetDimensions(fpixs, &fsw, &fsh);
1686  fpixGetDimensions(fpixd, &fdw, &fdh);
1687 
1688  /* First clip horizontally (sx, dx, dw) */
1689  if (dx < 0) {
1690  sx -= dx; /* increase sx */
1691  dw += dx; /* reduce dw */
1692  dx = 0;
1693  }
1694  if (sx < 0) {
1695  dx -= sx; /* increase dx */
1696  dw += sx; /* reduce dw */
1697  sx = 0;
1698  }
1699  dhangw = dx + dw - fdw; /* rect overhang of dest to right */
1700  if (dhangw > 0)
1701  dw -= dhangw; /* reduce dw */
1702  shangw = sx + dw - fsw; /* rect overhang of src to right */
1703  if (shangw > 0)
1704  dw -= shangw; /* reduce dw */
1705 
1706  /* Then clip vertically (sy, dy, dh) */
1707  if (dy < 0) {
1708  sy -= dy; /* increase sy */
1709  dh += dy; /* reduce dh */
1710  dy = 0;
1711  }
1712  if (sy < 0) {
1713  dy -= sy; /* increase dy */
1714  dh += sy; /* reduce dh */
1715  sy = 0;
1716  }
1717  dhangh = dy + dh - fdh; /* rect overhang of dest below */
1718  if (dhangh > 0)
1719  dh -= dhangh; /* reduce dh */
1720  shangh = sy + dh - fsh; /* rect overhang of src below */
1721  if (shangh > 0)
1722  dh -= shangh; /* reduce dh */
1723 
1724  /* if clipped entirely, quit */
1725  if ((dw <= 0) || (dh <= 0))
1726  return 0;
1727 
1728  /* -------------------------------------------------------- *
1729  * Copy block of data *
1730  * -------------------------------------------------------- */
1731  datas = fpixGetData(fpixs);
1732  datad = fpixGetData(fpixd);
1733  wpls = fpixGetWpl(fpixs);
1734  wpld = fpixGetWpl(fpixd);
1735  datas += sy * wpls + sx; /* at UL corner of block */
1736  datad += dy * wpld + dx; /* at UL corner of block */
1737  for (i = 0; i < dh; i++) {
1738  lines = datas + i * wpls;
1739  lined = datad + i * wpld;
1740  for (j = 0; j < dw; j++) {
1741  *lined = *lines;
1742  lines++;
1743  lined++;
1744  }
1745  }
1746 
1747  return 0;
1748 }
1749 
1750 
1751 /*--------------------------------------------------------------------*
1752  * Rotation by multiples of 90 degrees *
1753  *--------------------------------------------------------------------*/
1761 FPIX *
1763  l_int32 quads)
1764 {
1765  PROCNAME("fpixRotateOrth");
1766 
1767  if (!fpixs)
1768  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1769  if (quads < 0 || quads > 3)
1770  return (FPIX *)ERROR_PTR("quads not in {0,1,2,3}", procName, NULL);
1771 
1772  if (quads == 0)
1773  return fpixCopy(NULL, fpixs);
1774  else if (quads == 1)
1775  return fpixRotate90(fpixs, 1);
1776  else if (quads == 2)
1777  return fpixRotate180(NULL, fpixs);
1778  else /* quads == 3 */
1779  return fpixRotate90(fpixs, -1);
1780 }
1781 
1782 
1807 FPIX *
1809  FPIX *fpixs)
1810 {
1811  PROCNAME("fpixRotate180");
1812 
1813  if (!fpixs)
1814  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1815 
1816  /* Prepare pixd for in-place operation */
1817  if ((fpixd = fpixCopy(fpixd, fpixs)) == NULL)
1818  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1819 
1820  fpixFlipLR(fpixd, fpixd);
1821  fpixFlipTB(fpixd, fpixd);
1822  return fpixd;
1823 }
1824 
1825 
1840 FPIX *
1842  l_int32 direction)
1843 {
1844 l_int32 i, j, wd, hd, wpls, wpld;
1845 l_float32 *datas, *datad, *lines, *lined;
1846 FPIX *fpixd;
1847 
1848  PROCNAME("fpixRotate90");
1849 
1850  if (!fpixs)
1851  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1852  if (direction != 1 && direction != -1)
1853  return (FPIX *)ERROR_PTR("invalid direction", procName, NULL);
1854 
1855  fpixGetDimensions(fpixs, &hd, &wd);
1856  if ((fpixd = fpixCreate(wd, hd)) == NULL)
1857  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1858  fpixCopyResolution(fpixd, fpixs);
1859 
1860  datas = fpixGetData(fpixs);
1861  wpls = fpixGetWpl(fpixs);
1862  datad = fpixGetData(fpixd);
1863  wpld = fpixGetWpl(fpixd);
1864  if (direction == 1) { /* clockwise */
1865  for (i = 0; i < hd; i++) {
1866  lined = datad + i * wpld;
1867  lines = datas + (wd - 1) * wpls;
1868  for (j = 0; j < wd; j++) {
1869  lined[j] = lines[i];
1870  lines -= wpls;
1871  }
1872  }
1873  } else { /* ccw */
1874  for (i = 0; i < hd; i++) {
1875  lined = datad + i * wpld;
1876  lines = datas;
1877  for (j = 0; j < wd; j++) {
1878  lined[j] = lines[hd - 1 - i];
1879  lines += wpls;
1880  }
1881  }
1882  }
1883 
1884  return fpixd;
1885 }
1886 
1887 
1913 FPIX *
1915  FPIX *fpixs)
1916 {
1917 l_int32 i, j, w, h, wpl, bpl;
1918 l_float32 *line, *data, *buffer;
1919 
1920  PROCNAME("fpixFlipLR");
1921 
1922  if (!fpixs)
1923  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1924 
1925  fpixGetDimensions(fpixs, &w, &h);
1926 
1927  /* Prepare fpixd for in-place operation */
1928  if ((fpixd = fpixCopy(fpixd, fpixs)) == NULL)
1929  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1930 
1931  data = fpixGetData(fpixd);
1932  wpl = fpixGetWpl(fpixd); /* 4-byte words */
1933  bpl = 4 * wpl;
1934  if ((buffer = (l_float32 *)LEPT_CALLOC(wpl, sizeof(l_float32))) == NULL) {
1935  fpixDestroy(&fpixd);
1936  return (FPIX *)ERROR_PTR("buffer not made", procName, NULL);
1937  }
1938  for (i = 0; i < h; i++) {
1939  line = data + i * wpl;
1940  memcpy(buffer, line, bpl);
1941  for (j = 0; j < w; j++)
1942  line[j] = buffer[w - 1 - j];
1943  }
1944  LEPT_FREE(buffer);
1945  return fpixd;
1946 }
1947 
1948 
1974 FPIX *
1976  FPIX *fpixs)
1977 {
1978 l_int32 i, k, h, h2, wpl, bpl;
1979 l_float32 *linet, *lineb, *data, *buffer;
1980 
1981  PROCNAME("fpixFlipTB");
1982 
1983  if (!fpixs)
1984  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
1985 
1986  /* Prepare fpixd for in-place operation */
1987  if ((fpixd = fpixCopy(fpixd, fpixs)) == NULL)
1988  return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
1989 
1990  data = fpixGetData(fpixd);
1991  wpl = fpixGetWpl(fpixd);
1992  fpixGetDimensions(fpixd, NULL, &h);
1993  if ((buffer = (l_float32 *)LEPT_CALLOC(wpl, sizeof(l_float32))) == NULL) {
1994  fpixDestroy(&fpixd);
1995  return (FPIX *)ERROR_PTR("buffer not made", procName, NULL);
1996  }
1997  h2 = h / 2;
1998  bpl = 4 * wpl;
1999  for (i = 0, k = h - 1; i < h2; i++, k--) {
2000  linet = data + i * wpl;
2001  lineb = data + k * wpl;
2002  memcpy(buffer, linet, bpl);
2003  memcpy(linet, lineb, bpl);
2004  memcpy(lineb, buffer, bpl);
2005  }
2006  LEPT_FREE(buffer);
2007  return fpixd;
2008 }
2009 
2010 
2011 /*--------------------------------------------------------------------*
2012  * Affine and projective interpolated transforms *
2013  *--------------------------------------------------------------------*/
2036 FPIX *
2038  PTA *ptad,
2039  PTA *ptas,
2040  l_int32 border,
2041  l_float32 inval)
2042 {
2043 l_float32 *vc;
2044 PTA *ptas2, *ptad2;
2045 FPIX *fpixs2, *fpixd, *fpixd2;
2046 
2047  PROCNAME("fpixAffinePta");
2048 
2049  if (!fpixs)
2050  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
2051  if (!ptas)
2052  return (FPIX *)ERROR_PTR("ptas not defined", procName, NULL);
2053  if (!ptad)
2054  return (FPIX *)ERROR_PTR("ptad not defined", procName, NULL);
2055 
2056  /* If a border is to be added, also translate the ptas */
2057  if (border > 0) {
2058  ptas2 = ptaTransform(ptas, border, border, 1.0, 1.0);
2059  ptad2 = ptaTransform(ptad, border, border, 1.0, 1.0);
2060  fpixs2 = fpixAddSlopeBorder(fpixs, border, border, border, border);
2061  } else {
2062  ptas2 = ptaClone(ptas);
2063  ptad2 = ptaClone(ptad);
2064  fpixs2 = fpixClone(fpixs);
2065  }
2066 
2067  /* Get backwards transform from dest to src, and apply it */
2068  getAffineXformCoeffs(ptad2, ptas2, &vc);
2069  fpixd2 = fpixAffine(fpixs2, vc, inval);
2070  fpixDestroy(&fpixs2);
2071  ptaDestroy(&ptas2);
2072  ptaDestroy(&ptad2);
2073  LEPT_FREE(vc);
2074 
2075  if (border == 0)
2076  return fpixd2;
2077 
2078  /* Remove the added border */
2079  fpixd = fpixRemoveBorder(fpixd2, border, border, border, border);
2080  fpixDestroy(&fpixd2);
2081  return fpixd;
2082 }
2083 
2084 
2093 FPIX *
2095  l_float32 *vc,
2096  l_float32 inval)
2097 {
2098 l_int32 i, j, w, h, wpld;
2099 l_float32 val;
2100 l_float32 *datas, *datad, *lined;
2101 l_float32 x, y;
2102 FPIX *fpixd;
2103 
2104  PROCNAME("fpixAffine");
2105 
2106  if (!fpixs)
2107  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
2108  fpixGetDimensions(fpixs, &w, &h);
2109  if (!vc)
2110  return (FPIX *)ERROR_PTR("vc not defined", procName, NULL);
2111 
2112  datas = fpixGetData(fpixs);
2113  fpixd = fpixCreateTemplate(fpixs);
2114  fpixSetAllArbitrary(fpixd, inval);
2115  datad = fpixGetData(fpixd);
2116  wpld = fpixGetWpl(fpixd);
2117 
2118  /* Iterate over destination pixels */
2119  for (i = 0; i < h; i++) {
2120  lined = datad + i * wpld;
2121  for (j = 0; j < w; j++) {
2122  /* Compute float src pixel location corresponding to (i,j) */
2123  affineXformPt(vc, j, i, &x, &y);
2124  linearInterpolatePixelFloat(datas, w, h, x, y, inval, &val);
2125  *(lined + j) = val;
2126  }
2127  }
2128 
2129  return fpixd;
2130 }
2131 
2132 
2155 FPIX *
2157  PTA *ptad,
2158  PTA *ptas,
2159  l_int32 border,
2160  l_float32 inval)
2161 {
2162 l_float32 *vc;
2163 PTA *ptas2, *ptad2;
2164 FPIX *fpixs2, *fpixd, *fpixd2;
2165 
2166  PROCNAME("fpixProjectivePta");
2167 
2168  if (!fpixs)
2169  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
2170  if (!ptas)
2171  return (FPIX *)ERROR_PTR("ptas not defined", procName, NULL);
2172  if (!ptad)
2173  return (FPIX *)ERROR_PTR("ptad not defined", procName, NULL);
2174 
2175  /* If a border is to be added, also translate the ptas */
2176  if (border > 0) {
2177  ptas2 = ptaTransform(ptas, border, border, 1.0, 1.0);
2178  ptad2 = ptaTransform(ptad, border, border, 1.0, 1.0);
2179  fpixs2 = fpixAddSlopeBorder(fpixs, border, border, border, border);
2180  } else {
2181  ptas2 = ptaClone(ptas);
2182  ptad2 = ptaClone(ptad);
2183  fpixs2 = fpixClone(fpixs);
2184  }
2185 
2186  /* Get backwards transform from dest to src, and apply it */
2187  getProjectiveXformCoeffs(ptad2, ptas2, &vc);
2188  fpixd2 = fpixProjective(fpixs2, vc, inval);
2189  fpixDestroy(&fpixs2);
2190  ptaDestroy(&ptas2);
2191  ptaDestroy(&ptad2);
2192  LEPT_FREE(vc);
2193 
2194  if (border == 0)
2195  return fpixd2;
2196 
2197  /* Remove the added border */
2198  fpixd = fpixRemoveBorder(fpixd2, border, border, border, border);
2199  fpixDestroy(&fpixd2);
2200  return fpixd;
2201 }
2202 
2203 
2212 FPIX *
2214  l_float32 *vc,
2215  l_float32 inval)
2216 {
2217 l_int32 i, j, w, h, wpld;
2218 l_float32 val;
2219 l_float32 *datas, *datad, *lined;
2220 l_float32 x, y;
2221 FPIX *fpixd;
2222 
2223  PROCNAME("fpixProjective");
2224 
2225  if (!fpixs)
2226  return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
2227  fpixGetDimensions(fpixs, &w, &h);
2228  if (!vc)
2229  return (FPIX *)ERROR_PTR("vc not defined", procName, NULL);
2230 
2231  datas = fpixGetData(fpixs);
2232  fpixd = fpixCreateTemplate(fpixs);
2233  fpixSetAllArbitrary(fpixd, inval);
2234  datad = fpixGetData(fpixd);
2235  wpld = fpixGetWpl(fpixd);
2236 
2237  /* Iterate over destination pixels */
2238  for (i = 0; i < h; i++) {
2239  lined = datad + i * wpld;
2240  for (j = 0; j < w; j++) {
2241  /* Compute float src pixel location corresponding to (i,j) */
2242  projectiveXformPt(vc, j, i, &x, &y);
2243  linearInterpolatePixelFloat(datas, w, h, x, y, inval, &val);
2244  *(lined + j) = val;
2245  }
2246  }
2247 
2248  return fpixd;
2249 }
2250 
2251 
2270 l_ok
2272  l_int32 w,
2273  l_int32 h,
2274  l_float32 x,
2275  l_float32 y,
2276  l_float32 inval,
2277  l_float32 *pval)
2278 {
2279 l_int32 xpm, ypm, xp, yp, xf, yf;
2280 l_float32 v00, v01, v10, v11;
2281 l_float32 *lines;
2282 
2283  PROCNAME("linearInterpolatePixelFloat");
2284 
2285  if (!pval)
2286  return ERROR_INT("&val not defined", procName, 1);
2287  *pval = inval;
2288  if (!datas)
2289  return ERROR_INT("datas not defined", procName, 1);
2290 
2291  /* Skip if off the edge */
2292  if (x < 0.0 || y < 0.0 || x > w - 2.0 || y > h - 2.0)
2293  return 0;
2294 
2295  xpm = (l_int32)(16.0 * x + 0.5);
2296  ypm = (l_int32)(16.0 * y + 0.5);
2297  xp = xpm >> 4;
2298  yp = ypm >> 4;
2299  xf = xpm & 0x0f;
2300  yf = ypm & 0x0f;
2301 
2302 #if DEBUG
2303  if (xf < 0 || yf < 0)
2304  fprintf(stderr, "xp = %d, yp = %d, xf = %d, yf = %d\n", xp, yp, xf, yf);
2305 #endif /* DEBUG */
2306 
2307  /* Interpolate by area weighting. */
2308  lines = datas + yp * w;
2309  v00 = (16.0 - xf) * (16.0 - yf) * (*(lines + xp));
2310  v10 = xf * (16.0 - yf) * (*(lines + xp + 1));
2311  v01 = (16.0 - xf) * yf * (*(lines + w + xp));
2312  v11 = (l_float32)(xf) * yf * (*(lines + w + xp + 1));
2313  *pval = (v00 + v01 + v10 + v11) / 256.0;
2314  return 0;
2315 }
2316 
2317 
2318 /*--------------------------------------------------------------------*
2319  * Thresholding to 1 bpp Pix *
2320  *--------------------------------------------------------------------*/
2334 PIX *
2336  l_float32 thresh)
2337 {
2338 l_int32 i, j, w, h, wpls, wpld;
2339 l_float32 *datas, *lines;
2340 l_uint32 *datad, *lined;
2341 PIX *pixd;
2342 
2343  PROCNAME("fpixThresholdToPix");
2344 
2345  if (!fpix)
2346  return (PIX *)ERROR_PTR("fpix not defined", procName, NULL);
2347 
2348  fpixGetDimensions(fpix, &w, &h);
2349  datas = fpixGetData(fpix);
2350  wpls = fpixGetWpl(fpix);
2351  pixd = pixCreate(w, h, 1);
2352  datad = pixGetData(pixd);
2353  wpld = pixGetWpl(pixd);
2354  for (i = 0; i < h; i++) {
2355  lines = datas + i * wpls;
2356  lined = datad + i * wpld;
2357  for (j = 0; j < w; j++) {
2358  if (lines[j] <= thresh)
2359  SET_DATA_BIT(lined, j);
2360  }
2361  }
2362 
2363  return pixd;
2364 }
2365 
2366 
2367 /*--------------------------------------------------------------------*
2368  * Generate function from components *
2369  *--------------------------------------------------------------------*/
2392 FPIX *
2394  l_float32 rnum,
2395  l_float32 gnum,
2396  l_float32 bnum,
2397  l_float32 rdenom,
2398  l_float32 gdenom,
2399  l_float32 bdenom)
2400 {
2401 l_int32 i, j, w, h, wpls, wpld, rval, gval, bval, zerodenom, onedenom;
2402 l_float32 fnum, fdenom;
2403 l_uint32 *datas, *lines;
2404 l_float32 *datad, *lined, *recip;
2405 FPIX *fpixd;
2406 
2407  PROCNAME("pixComponentFunction");
2408 
2409  if (!pix || pixGetDepth(pix) != 32)
2410  return (FPIX *)ERROR_PTR("pix undefined or not 32 bpp", procName, NULL);
2411 
2412  pixGetDimensions(pix, &w, &h, NULL);
2413  datas = pixGetData(pix);
2414  wpls = pixGetWpl(pix);
2415  fpixd = fpixCreate(w, h);
2416  datad = fpixGetData(fpixd);
2417  wpld = fpixGetWpl(fpixd);
2418  zerodenom = (rdenom == 0.0 && gdenom == 0.0 && bdenom == 0.0) ? 1: 0;
2419  onedenom = ((rdenom == 1.0 && gdenom == 0.0 && bdenom == 0.0) ||
2420  (rdenom == 0.0 && gdenom == 1.0 && bdenom == 0.0) ||
2421  (rdenom == 0.0 && gdenom == 0.0 && bdenom == 1.0)) ? 1 : 0;
2422  recip = NULL;
2423  if (onedenom) {
2424  recip = (l_float32 *)LEPT_CALLOC(256, sizeof(l_float32));
2425  recip[0] = 256; /* arbitrary large number */
2426  for (i = 1; i < 256; i++)
2427  recip[i] = 1.0 / (l_float32)i;
2428  }
2429  for (i = 0; i < h; i++) {
2430  lines = datas + i * wpls;
2431  lined = datad + i * wpld;
2432  if (zerodenom) {
2433  for (j = 0; j < w; j++) {
2434  extractRGBValues(lines[j], &rval, &gval, &bval);
2435  lined[j] = rnum * rval + gnum * gval + bnum * bval;
2436  }
2437  } else if (onedenom && rdenom == 1.0) {
2438  for (j = 0; j < w; j++) {
2439  extractRGBValues(lines[j], &rval, &gval, &bval);
2440  lined[j]
2441  = recip[rval] * (rnum * rval + gnum * gval + bnum * bval);
2442  }
2443  } else if (onedenom && gdenom == 1.0) {
2444  for (j = 0; j < w; j++) {
2445  extractRGBValues(lines[j], &rval, &gval, &bval);
2446  lined[j]
2447  = recip[gval] * (rnum * rval + gnum * gval + bnum * bval);
2448  }
2449  } else if (onedenom && bdenom == 1.0) {
2450  for (j = 0; j < w; j++) {
2451  extractRGBValues(lines[j], &rval, &gval, &bval);
2452  lined[j]
2453  = recip[bval] * (rnum * rval + gnum * gval + bnum * bval);
2454  }
2455  } else { /* general case */
2456  for (j = 0; j < w; j++) {
2457  extractRGBValues(lines[j], &rval, &gval, &bval);
2458  fnum = rnum * rval + gnum * gval + bnum * bval;
2459  fdenom = rdenom * rval + gdenom * gval + bdenom * bval;
2460  lined[j] = (fdenom == 0) ? 256.0 * fnum : fnum / fdenom;
2461  }
2462  }
2463  }
2464 
2465  LEPT_FREE(recip);
2466  return fpixd;
2467 }
l_ok fpixGetMax(FPIX *fpix, l_float32 *pmaxval, l_int32 *pxmaxloc, l_int32 *pymaxloc)
fpixGetMax()
Definition: fpix2.c:744
l_ok fpixCopyResolution(FPIX *fpixd, FPIX *fpixs)
fpixCopyResolution()
Definition: fpix1.c:580
DPIX * pixConvertToDPix(PIX *pixs, l_int32 ncomps)
pixConvertToDPix()
Definition: fpix2.c:219
PIX * pixConvertRGBToLuminance(PIX *pixs)
pixConvertRGBToLuminance()
Definition: pixconv.c:733
PIX * pixRemoveColormap(PIX *pixs, l_int32 type)
pixRemoveColormap()
Definition: pixconv.c:322
l_ok dpixGetMax(DPIX *dpix, l_float64 *pmaxval, l_int32 *pxmaxloc, l_int32 *pymaxloc)
dpixGetMax()
Definition: fpix2.c:850
PIX * fpixThresholdToPix(FPIX *fpix, l_float32 thresh)
fpixThresholdToPix()
Definition: fpix2.c:2335
l_ok fpixGetPixel(FPIX *fpix, l_int32 x, l_int32 y, l_float32 *pval)
fpixGetPixel()
Definition: fpix1.c:646
DPIX * dpixCreate(l_int32 width, l_int32 height)
dpixCreate()
Definition: fpix1.c:1156
DPIX * dpixScaleByInteger(DPIX *dpixs, l_int32 factor)
dpixScaleByInteger()
Definition: fpix2.c:1009
l_ok affineXformPt(l_float32 *vc, l_int32 x, l_int32 y, l_float32 *pxp, l_float32 *pyp)
affineXformPt()
Definition: affine.c:1139
l_float64 * dpixGetData(DPIX *dpix)
dpixGetData()
Definition: fpix1.c:1596
FPIX * fpixAddContinuedBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddContinuedBorder()
Definition: fpix2.c:1528
PIX * dpixConvertToPix(DPIX *dpixs, l_int32 outdepth, l_int32 negvals, l_int32 errorflag)
dpixConvertToPix()
Definition: fpix2.c:539
FPIX * fpixAddMirroredBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddMirroredBorder()
Definition: fpix2.c:1481
l_int32 dpixGetWpl(DPIX *dpix)
dpixGetWpl()
Definition: fpix1.c:1453
DPIX * fpixConvertToDPix(FPIX *fpix)
fpixConvertToDPix()
Definition: fpix2.c:481
l_ok dpixSetAllArbitrary(DPIX *dpix, l_float64 inval)
dpixSetAllArbitrary()
Definition: fpix2.c:1362
#define GET_DATA_FOUR_BYTES(pdata, n)
Definition: arrayaccess.h:231
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
Definition: pix1.c:302
FPIX * fpixProjectivePta(FPIX *fpixs, PTA *ptad, PTA *ptas, l_int32 border, l_float32 inval)
fpixProjectivePta()
Definition: fpix2.c:2156
l_ok fpixAddMultConstant(FPIX *fpix, l_float32 addc, l_float32 multc)
fpixAddMultConstant()
Definition: fpix2.c:1165
l_ok fpixGetDimensions(FPIX *fpix, l_int32 *pw, l_int32 *ph)
fpixGetDimensions()
Definition: fpix1.c:412
l_uint32 * pixGetData(PIX *pix)
pixGetData()
Definition: pix1.c:1624
PIX * fpixConvertToPix(FPIX *fpixs, l_int32 outdepth, l_int32 negvals, l_int32 errorflag)
fpixConvertToPix()
Definition: fpix2.c:320
DPIX * dpixCopy(DPIX *dpixd, DPIX *dpixs)
dpixCopy()
Definition: fpix1.c:1278
#define GET_DATA_BIT(pdata, n)
Definition: arrayaccess.h:123
l_ok fpixRasterop(FPIX *fpixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, FPIX *fpixs, l_int32 sx, l_int32 sy)
fpixRasterop()
Definition: fpix2.c:1662
l_ok fpixSetPixel(FPIX *fpix, l_int32 x, l_int32 y, l_float32 val)
fpixSetPixel()
Definition: fpix1.c:683
FPIX * fpixAffinePta(FPIX *fpixs, PTA *ptad, PTA *ptas, l_int32 border, l_float32 inval)
fpixAffinePta()
Definition: fpix2.c:2037
PIX * fpixDisplayMaxDynamicRange(FPIX *fpixs)
fpixDisplayMaxDynamicRange()
Definition: fpix2.c:424
FPIX * fpixAddSlopeBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddSlopeBorder()
Definition: fpix2.c:1573
FPIX * fpixAffine(FPIX *fpixs, l_float32 *vc, l_float32 inval)
fpixAffine()
Definition: fpix2.c:2094
l_ok fpixGetMin(FPIX *fpix, l_float32 *pminval, l_int32 *pxminloc, l_int32 *pyminloc)
fpixGetMin()
Definition: fpix2.c:691
FPIX * pixComponentFunction(PIX *pix, l_float32 rnum, l_float32 gnum, l_float32 bnum, l_float32 rdenom, l_float32 gdenom, l_float32 bdenom)
pixComponentFunction()
Definition: fpix2.c:2393
FPIX * fpixLinearCombination(FPIX *fpixd, FPIX *fpixs1, FPIX *fpixs2, l_float32 a, l_float32 b)
fpixLinearCombination()
Definition: fpix2.c:1106
PTA * ptaClone(PTA *pta)
ptaClone()
Definition: ptabasic.c:296
FPIX * fpixFlipTB(FPIX *fpixd, FPIX *fpixs)
fpixFlipTB()
Definition: fpix2.c:1975
DPIX * dpixLinearCombination(DPIX *dpixd, DPIX *dpixs1, DPIX *dpixs2, l_float32 a, l_float32 b)
dpixLinearCombination()
Definition: fpix2.c:1225
l_ok projectiveXformPt(l_float32 *vc, l_int32 x, l_int32 y, l_float32 *pxp, l_float32 *pyp)
projectiveXformPt()
Definition: projective.c:911
FPIX * fpixRotateOrth(FPIX *fpixs, l_int32 quads)
fpixRotateOrth()
Definition: fpix2.c:1762
#define SET_DATA_BYTE(pdata, n, val)
Definition: arrayaccess.h:198
#define GET_DATA_QBIT(pdata, n)
Definition: arrayaccess.h:164
l_ok dpixGetMin(DPIX *dpix, l_float64 *pminval, l_int32 *pxminloc, l_int32 *pyminloc)
dpixGetMin()
Definition: fpix2.c:797
l_ok dpixAddMultConstant(DPIX *dpix, l_float64 addc, l_float64 multc)
dpixAddMultConstant()
Definition: fpix2.c:1284
#define GET_DATA_BYTE(pdata, n)
Definition: arrayaccess.h:188
l_int32 fpixGetWpl(FPIX *fpix)
fpixGetWpl()
Definition: fpix1.c:459
FPIX * fpixClone(FPIX *fpix)
fpixClone()
Definition: fpix1.c:233
PIX * pixClone(PIX *pixs)
pixClone()
Definition: pix1.c:515
FPIX * fpixRotate90(FPIX *fpixs, l_int32 direction)
fpixRotate90()
Definition: fpix2.c:1841
l_ok getAffineXformCoeffs(PTA *ptas, PTA *ptad, l_float32 **pvc)
getAffineXformCoeffs()
Definition: affine.c:931
void pixDestroy(PIX **ppix)
pixDestroy()
Definition: pix1.c:543
FPIX * fpixScaleByInteger(FPIX *fpixs, l_int32 factor)
fpixScaleByInteger()
Definition: fpix2.c:917
l_float32 * fpixGetData(FPIX *fpix)
fpixGetData()
Definition: fpix1.c:602
FPIX * fpixRotate180(FPIX *fpixd, FPIX *fpixs)
fpixRotate180()
Definition: fpix2.c:1808
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
Definition: pix1.c:1065
FPIX * pixConvertToFPix(PIX *pixs, l_int32 ncomps)
pixConvertToFPix()
Definition: fpix2.c:126
FPIX * dpixConvertToFPix(DPIX *dpix)
dpixConvertToFPix()
Definition: fpix2.c:643
l_ok getProjectiveXformCoeffs(PTA *ptas, PTA *ptad, l_float32 **pvc)
getProjectiveXformCoeffs()
Definition: projective.c:775
l_ok dpixGetDimensions(DPIX *dpix, l_int32 *pw, l_int32 *ph)
dpixGetDimensions()
Definition: fpix1.c:1406
#define SET_DATA_FOUR_BYTES(pdata, n, val)
Definition: arrayaccess.h:235
FPIX * fpixCreateTemplate(FPIX *fpixs)
fpixCreateTemplate()
Definition: fpix1.c:203
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
Definition: fpix1.c:153
#define GET_DATA_TWO_BYTES(pdata, n)
Definition: arrayaccess.h:212
#define GET_DATA_DIBIT(pdata, n)
Definition: arrayaccess.h:145
FPIX * fpixFlipLR(FPIX *fpixd, FPIX *fpixs)
pixFlipLR()
Definition: fpix2.c:1914
Definition: pix.h:134
void ptaDestroy(PTA **ppta)
ptaDestroy()
Definition: ptabasic.c:192
FPIX * fpixRemoveBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixRemoveBorder()
Definition: fpix2.c:1437
FPIX * fpixCopy(FPIX *fpixd, FPIX *fpixs)
fpixCopy()
Definition: fpix1.c:276
FPIX * fpixAddBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddBorder()
Definition: fpix2.c:1401
PTA * ptaTransform(PTA *ptas, l_int32 shiftx, l_int32 shifty, l_float32 scalex, l_float32 scaley)
ptaTransform()
Definition: ptafunc1.c:735
l_ok fpixSetAllArbitrary(FPIX *fpix, l_float32 inval)
fpixSetAllArbitrary()
Definition: fpix2.c:1331
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
Definition: fpix1.c:373
#define SET_DATA_TWO_BYTES(pdata, n, val)
Definition: arrayaccess.h:222
Definition: pix.h:613
void extractRGBValues(l_uint32 pixel, l_int32 *prval, l_int32 *pgval, l_int32 *pbval)
extractRGBValues()
Definition: pix2.c:2737
l_ok linearInterpolatePixelFloat(l_float32 *datas, l_int32 w, l_int32 h, l_float32 x, l_float32 y, l_float32 inval, l_float32 *pval)
linearInterpolatePixelFloat()
Definition: fpix2.c:2271
FPIX * fpixProjective(FPIX *fpixs, l_float32 *vc, l_float32 inval)
fpixProjective()
Definition: fpix2.c:2213
#define SET_DATA_BIT(pdata, n)
Definition: arrayaccess.h:127
Definition: pix.h:517
Definition: pix.h:582