home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / CH_2.3 / INV / Debug / INV.PCH (.txt) < prev    next >
Encoding:
Microsoft Visual C/C++ Precompiled Header file  |  1999-09-11  |  219.3 KB  |  3,047 lines

  1. VCPCH0
  2. Sep 27 199513:24:33
  3. e:\book\book.cup\ch_2.3\inv\debug\vc40.pdb
  4. E:\book\book.cup\ch_2.3\inv\inv.h
  5. D:\MSDEV\INCLUDE\stdio.h
  6. D:\MSDEV\INCLUDE\stdlib.h
  7. D:\MSDEV\INCLUDE\math.h
  8. D:\MSDEV\INCLUDE\malloc.h
  9. ..\..\libip\ip.h
  10. ..\..\libip\ph.h
  11. ..\..\libtiff\libtiff\tiffio.h
  12. ..\..\libtiff\libtiff\tiff.h
  13. D:\MSDEV\INCLUDE\stdarg.h
  14. ..\..\libimage\draw.h
  15. D:\MSDEV\INCLUDE\string.h
  16. ..\..\libimage\tiffimage.h
  17. ..\..\libimage\gd.h
  18. ..\..\libimage\misc.h
  19. D:\MSDEV\INCLUDE\ctype.h
  20. ..\..\libip\lldef.h
  21. ..\..\libip\sgl_stat.h
  22. ..\..\libip\convolve.h
  23. ..\..\libip\pcc2.h
  24. ..\..\libimage\images.h
  25. ..\..\libip\bdy_stru.h
  26. E:\book\book.cup\ch_2.3\inv\inv.c
  27. _INTEGRAL_MAX_BITS=64
  28. _M_IX86=400
  29. _MSC_VER=1000
  30. _WIN32
  31. WIN32
  32. _DEBUG
  33. _CONSOLE
  34. E:\book\book.cup\ch_2.3\inv
  35. ..\..\libimage
  36. ..\..\libtiff\libtiff
  37. ..\..\libip
  38. D:\MSDEV\INCLUDE
  39. D:\MSDEV\MFC\include
  40. F:\MSDEV\INCLUDE
  41. F:\MSDEV\MFC\include
  42. inv.h
  43. 7E:\book\book.cup\ch_2.3\inv\inv.h
  44. )0D:\MSDEV\INCLUDE\stdio.h
  45. /D:\MSDEV\INCLUDE\stdlib.h
  46. /D:\MSDEV\INCLUDE\math.h
  47. /D:\MSDEV\INCLUDE\malloc.h
  48. 7..\..\libip\ip.h
  49. 7..\..\libip\ph.h
  50. 7..\..\libtiff\libtiff\tiffio.h
  51. 7..\..\libtiff\libtiff\tiff.h
  52. )0D:\MSDEV\INCLUDE\stdio.h
  53. /D:\MSDEV\INCLUDE\stdarg.h
  54. 7..\..\libimage\draw.h
  55. )0D:\MSDEV\INCLUDE\stdio.h
  56. /D:\MSDEV\INCLUDE\stdlib.h
  57. /D:\MSDEV\INCLUDE\string.h
  58. /D:\MSDEV\INCLUDE\math.h
  59. 7..\..\libimage\tiffimage.h
  60. 7..\..\libimage\gd.h
  61. )0D:\MSDEV\INCLUDE\stdio.h
  62. 7..\..\libimage\misc.h
  63. )0D:\MSDEV\INCLUDE\stdio.h
  64. /D:\MSDEV\INCLUDE\string.h
  65. /D:\MSDEV\INCLUDE\ctype.h
  66. 7..\..\libip\lldef.h
  67. 7..\..\libip\sgl_stat.h
  68. 7..\..\libip\ph.h
  69. 7..\..\libip\convolve.h
  70. 7..\..\libip\pcc2.h
  71. 7..\..\libimage\images.h
  72. 7..\..\libip\bdy_stru.h
  73. 7..\..\libimage\misc.h
  74. e:\book\book.cup\ch_2.3\inv\debug\vc40.pdb
  75. Debug/inv.obj
  76.  * thin.c
  77.  * Practical Algorithms for Image Analysis
  78.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  79. /* THIN:        program performs thinning on image 
  80.  *              usage: thin inimg outimg [-k K] [-n MAXITER] [-d DISPLAY] [-I] [-L]
  81.  *              The <display> argument shows result of each iteration
  82.  *              of thinning in "line-printer" style.
  83.  *                              
  84. #include <stdio.h>
  85. #include <stdlib.h>
  86. #include <math.h>
  87. #include <string.h>
  88. #include <images.h>
  89. #include <tiffimage.h>          /* tiff file format info */
  90. extern void print_sos_lic ();
  91. #define DFLTMAXK 3              /* dflt maximum thinning kernel size */
  92. #define MAXMAXK 21              /* max of the maximum thinning kernel size */
  93. #define MAXITER 20              /* maximum number of iterations */
  94. #define MIN0RUN 5               /* minimum run of zeros to run-length code */
  95. #define MAXDISPLAY 40           /* maximum length of line for display */
  96. unsigned char OFF, ERASED, ON, PON;  /* values of pixels:
  97.                                       * * - ERASED value is for non-anchor
  98.                                       * * - ERASED  + 1 is for anchor
  99.                                       * * - ERASED increments +2 each iteration */
  100. unsigned char **image;          /* input/output image */
  101. struct point imgSize;           /* image size */
  102. long ySizeM1;                   /* y length minus 1 */
  103. long **xRun;                    /* no., then x locns of 1/0 runs for each y */
  104. long peel0 (unsigned char *, unsigned char *, long, long *, long *, long *);
  105. long peel (unsigned char *, unsigned char *, long, long *, long *);
  106. long ksize (long, long, long);
  107. long sqron (long, long, long);
  108. long getring (long, long, long, unsigned char *);
  109. long thinring (unsigned char *, long, int *);
  110. long chkconnect (unsigned char *, unsigned char *, long);
  111. long anchor (unsigned char *, long);
  112. long erasesqr (long, long, long, int, long *);
  113. long display (long);
  114. long usage (short);
  115. long input (int, char **, long *, long *, long *, long *);
  116. main (argc, argv)
  117.      int argc;
  118.      char *argv[];
  119.   register long x, y,           /* image coordinates */
  120.     i, k;                       /* sidelength of current thinning kernel */
  121.   Image *imgIO;                 /* structure for I/O images */
  122.   long maxK,                    /* max. sidelength of thinning kernel */
  123.     change[MAXMAXK],            /* no. erasures for each mask size */
  124.     nMaxIter,                   /* maximum number of iterations */
  125.     nIter,                      /* no. iterations */
  126.     nChange,                    /* no. thinning operations on iteration */
  127.     displayFlag,                /* display results after each iter if =1 */
  128.     invertFlag,                 /* invert input image before processing */
  129.     nONs,                       /* total ONs in original image */
  130.     nErased;                    /* cumulative no. ERASED in image */
  131.   unsigned char *ring;          /* ring of pixels on perimeter of kxk sqr */
  132.   unsigned char *side;          /* array of 8-connected side pixels */
  133.   if ((input (argc, argv, &maxK, &nMaxIter, &displayFlag, &invertFlag)) < 0)
  134.     return (-1);
  135.   imgIO = ImageIn (argv[1]);
  136.   image = imgIO->img;
  137.   imgSize.x = ImageGetWidth (imgIO);
  138.   imgSize.y = ImageGetHeight (imgIO);
  139.   if (imgSize.y > MAXDISPLAY)
  140.     displayFlag = 0;
  141.   ySizeM1 = imgSize.y - 1;
  142. /* invert image */
  143.   if (invertFlag) {
  144.     for (y = 0; y < imgSize.y; y++)
  145.       for (x = 0; x < imgSize.x; x++)
  146.       image[y][x] = 255 - image[y][x];
  147.   if ((xRun = (long **) calloc (imgSize.y, sizeof (long))) == NULL) {
  148.     printf ("CALLOC: xRun -- not enough memory -- sorry\n");
  149.     return (-1);
  150.   if ((ring = (unsigned char *) malloc (4 * (maxK - 1))) == NULL) {
  151.     printf ("not enough memory -- sorry\n");
  152.     return (-2);
  153.   if ((side = (unsigned char *) malloc (maxK)) == NULL) {
  154.     printf ("not enough memory -- sorry\n");
  155.     return (-3);
  156. /* initialize ON/OFF/ERASED values */
  157.   OFF = 0;
  158.   ERASED = 1;
  159.   ON = 255;
  160.   PON = ON - 1;
  161. /* zero image borders */
  162.   for (y = 0; y < imgSize.y; y++)
  163.     image[y][0] = image[y][imgSize.x - 1] = OFF;
  164.   for (x = 0; x < imgSize.x; x++)
  165.     image[0][x] = image[ySizeM1][x] = OFF;
  166.   for (k = 0; k < MAXMAXK; k++)
  167.     change[k] = 0;
  168. /* on first iteration, perform thinning and accumulate information
  169.  * on x-runs */
  170.   nChange = peel0 (ring, side, maxK, change, &nONs, &nErased);
  171.   printf ("iteration  1:\t");
  172.   for (i = 3; i <= maxK; i++) {
  173.     printf (" %d) %3d;  ", i, change[i]);
  174.     change[i] = 0;
  175.   printf ("\n");
  176.   if (displayFlag == 1)
  177.     display (nChange);
  178.   ERASED += 2;
  179. /* iteratively convolve through image until thinned */
  180.   for (nIter = 1, nChange = 1; (nChange > 0) && nIter <= nMaxIter; nIter++) {
  181.     nChange = peel (ring, side, maxK, change, &nErased);
  182.     printf ("iteration %2d:\t", nIter + 1);
  183.     for (i = 3; i <= maxK; i++) {
  184.       printf (" %d) %3d;  ", i, change[i]);
  185.       change[i] = 0;
  186.     }
  187.     printf ("\n");
  188.     if (displayFlag == 1)
  189.       display (nChange);
  190.     ERASED += 2;
  191.   printf ("%d thinned out of %d original ONs (%d%%)\n",
  192.           nONs - nErased, nONs, ((nONs - nErased) * 100) / nONs);
  193.   if (nIter >= nMaxIter && nChange != 0)
  194.     printf ("Nuts -- maximum iterations reached\n");
  195.   for (y = 1; y < ySizeM1; y++)
  196.     for (x = 1; x < imgSize.x - 1; x++)
  197.       image[y][x] = (image[y][x] < PON) ? OFF : ON;
  198. /* un-invert image */
  199.   if (invertFlag) {
  200.     for (y = 0; y < imgSize.y; y++)
  201.       for (x = 0; x < imgSize.x; x++)
  202.       image[y][x] = 255 - image[y][x];
  203.   ImageOut (argv[2], imgIO);
  204.   return (0);
  205. /* PEEL0:       function performs first thinning iteration where information
  206.  *            on x-runs of ONs is accumulated
  207.  *                    usage: nChange = peel0 (ring, side, maxK, change, 
  208.  *                                                      &nOns, &nErased)
  209. peel0 (ring, side, maxK, change, nONs, nErased)
  210.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  211.      unsigned char *side;       /* array of 8-connected side pixels */
  212.      long maxK,                 /* max sidelength of thinning kernel */
  213.       *change,                  /* no. erasures for each mask size */
  214.       *nONs,                    /* total original ON pixels */
  215.       *nErased;                 /* cumulative no. ERASED in image */
  216.   register long x, y,           /* image coordinates */
  217.     iXRun,                      /* index of runs in x */
  218.     xSizeM1,                    /* imgSize.x minus 1 */
  219.     k;                          /* sidelength of current thinning kernel */
  220.   long onRun,                   /* flag = 1 for run of 1s; 0 for 0s */
  221.     permOn,                     /* permanent ON flag set to 1 if so */
  222.     kM1,                        /* k minus 1 */
  223.     nChange;                    /* no. thinning operations on iteration */
  224.   *nONs = *nErased = nChange = 0;
  225.   xSizeM1 = imgSize.x - 1;
  226.   for (y = 1; y < ySizeM1; y++) {
  227.     xRun[y] = (long *) calloc (imgSize.x + 1, sizeof (long));
  228.     xRun[y][0] = -MIN0RUN;
  229.     for (x = 1, iXRun = 1, onRun = 0; x < xSizeM1; x++) {
  230.       permOn = 0;
  231.       if (image[y][x] < ERASED) {
  232.         if (onRun == 1) {
  233.           onRun = 0;
  234.           xRun[y][iXRun++] = x - 1;
  235.         }
  236.         k = 0;
  237.       }
  238.       else {
  239.         if (onRun == 0) {
  240.           onRun = 1;
  241.           if ((x - xRun[y][iXRun - 1]) < MIN0RUN)
  242.             --iXRun;
  243.           else
  244.             xRun[y][iXRun++] = x;
  245.         }
  246.         (*nONs)++;
  247.         k = ksize (x, y, maxK);
  248.       }
  249.       kM1 = (k > 3) ? k - 1 : 3;
  250.       while (k >= kM1) {
  251.         if (sqron (x, y, k) == 0)
  252.           break;
  253.         if (getring (x, y, k, ring) == 1)
  254.           break;
  255.         if (thinring (ring, k, (int *) &permOn) == 1) {
  256.           if (chkconnect (ring, side, k) == 1) {
  257.             nChange++;
  258.             (change[k])++;
  259.             erasesqr (x, y, k, anchor (ring, k), nErased);
  260.             break;
  261.           }
  262.         }
  263.         --k;
  264.       }
  265.       if (permOn == 1)
  266.         image[y][x] = PON;
  267.     }
  268.     --iXRun;
  269.     if (iXRun % 2 != 0)
  270.       xRun[y][++iXRun] = x;
  271.     xRun[y][0] = iXRun;
  272.     xRun[y] = (long *) realloc (xRun[y], (sizeof (long)) * (iXRun + 1));
  273.   return (nChange);
  274. /* PEEL:        function performs an iteration of thinning
  275.  *                usage: nChange = peel (ring, side, maxK, change, &nErased)
  276. peel (ring, side, maxK, change, nErased)
  277.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  278.      unsigned char *side;       /* array of 8-connected side pixels */
  279.      long maxK,                 /* max sidelength of thinning kernel */
  280.       *change,                  /* no. erasures for each mask size */
  281.       *nErased;                 /* cumulative no. ERASED in image */
  282.   register long x, y,           /* image coordinates */
  283.     xEnd, iXRun,                /* index of runs in x */
  284.     k;                          /* sidelength of current thinning kernel */
  285.   long noOnsInRow,              /* flag = 1 if no ONs in y-row (0 if ONs) */
  286.     permOn,                     /* permanent ON flag set to 1 if so */
  287.     kM1,                        /* k minus 1 */
  288.     nChange;                    /* no. thinning operations on iteration */
  289.   nChange = 0;
  290.   for (y = 1; y < ySizeM1; y++) {
  291.     for (iXRun = 1, noOnsInRow = 1; iXRun <= xRun[y][0]; iXRun += 2) {
  292.       xEnd = xRun[y][iXRun + 1];
  293.       for (x = xRun[y][iXRun]; x <= xEnd; x++) {
  294.         permOn = 0;
  295.         if (image[y][x] < ERASED)
  296.           k = 0;
  297.         else
  298.           k = ksize (x, y, maxK);
  299.         kM1 = (k > 3) ? k - 1 : 3;
  300.         while (k >= kM1) {
  301.           if (sqron (x, y, k) == 0)
  302.             break;
  303.           noOnsInRow = 0;
  304.           if (getring (x, y, k, ring) == 1)
  305.             break;
  306.           if (thinring (ring, k, (int *) &permOn) == 1) {
  307.             if (chkconnect (ring, side, k) == 1) {
  308.               nChange++;
  309.               (change[k])++;
  310.               erasesqr (x, y, k, anchor (ring, k), nErased);
  311.               break;
  312.             }
  313.           }
  314.           --k;
  315.         }
  316.         if (permOn == 1)
  317.           image[y][x] = PON;
  318.       }
  319.     }
  320.     if (noOnsInRow == 1)
  321.       xRun[y][0] = -xRun[y][0];
  322.   return (nChange);
  323. /* KSIZE:       function determines k, where kxk is largest square
  324.  *            around (x,y) which contains all ON or ERASED
  325.  *                      usage: k = ksize (x, y, maxK)
  326. ksize (x, y, maxK)
  327.      long x, y,                 /* image coordinates */
  328.        maxK;                    /* maximum k value */
  329.   register long xMask, yMask,   /* x,y mask coordinates */
  330.     xEnd, yEnd,                 /* end coord.s of square */
  331.     k;                          /* mask size */
  332.   long upHalf, downHalf,        /* half of mask below and above center */
  333.     xStart,                     /* x- start and end of square */
  334.     yStart;                     /* y- start and end of square */
  335.   for (k = 4; k <= maxK; k++) {
  336.     if (k % 2 == 1)
  337.       downHalf = upHalf = (k - 3) / 2;
  338.     else {
  339.       upHalf = (k - 2) / 2;
  340.       downHalf = (k - 4) / 2;
  341.     }
  342.     xStart = x - downHalf;
  343.     xEnd = x + upHalf;
  344.     yStart = y - downHalf;
  345.     yEnd = y + upHalf;
  346.     for (yMask = yStart; yMask <= yEnd; yMask++)
  347.       for (xMask = xStart; xMask <= xEnd; xMask++)
  348.         if (image[yMask][xMask] < ERASED)
  349.           return (k - 1);
  350.   return (maxK);
  351. /* SQRON:       function tests pixels in kxk square are already erased or 
  352.  *            for 3x3 if they can never be erased
  353.  *                      usage: flag = sqron (x, y, k)
  354.  *              flag = 0 if cannot erase any pixels in square
  355.  *                   = 1 if at least one pixel is still ON
  356. sqron (x, y, k)
  357.      register long x, y;        /* image coordinages */
  358.      long k;                    /* square sidelength of ring */
  359.   register long xEnd, yEnd,     /* upper bounds of center erase area */
  360.     erasedP1;                   /* ERASED + 1 */
  361.   long upHalf, downHalf,        /* half of mask below and above center */
  362.     yStart, xStart;             /* bounds of center erase area */
  363. /* check for 3x3 */
  364.   if (k == 3) {
  365.     if (image[y][x] == ON)
  366.       return (1);
  367.     else
  368.       return (0);
  369. /* check center square */
  370.   if (k % 2 == 1)
  371.     downHalf = upHalf = (k - 3) / 2;
  372.   else {
  373.     upHalf = (k - 2) / 2;
  374.     downHalf = (k - 4) / 2;
  375.   xStart = x - downHalf;
  376.   xEnd = x + upHalf;
  377.   yStart = y - downHalf;
  378.   yEnd = y + upHalf;
  379.   erasedP1 = ERASED + 1;
  380.   for (y = yStart; y <= yEnd; y++)
  381.     for (x = xStart; x <= xEnd; x++)
  382.       if (image[y][x] >= erasedP1)
  383.         return (1);
  384.   return (0);
  385. /* GETRING:     function gets ring of pixels on perimeter of k-size square
  386.  *                usage: allOnes = getring (x, y, k, ring)
  387.  *              If ring includes only 1-value pixels, function returns 1,
  388.  *              otherwise 0.
  389. getring (x, y, k, ring)
  390.      register long x, y;        /* image coordinages */
  391.      long k;                    /* square sidelength of ring */
  392.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  393.   register xEnd, yEnd,          /* x,y ends of square */
  394.     allOnes,                    /* =1 if all ones in ring; 0 otherwise */
  395.     i;
  396.   long upHalf, downHalf,        /* half of mask below and above center */
  397.     xStart,                     /* x- start and end of square */
  398.     yStart;                     /* y- start and end of square */
  399.   if (k % 2 == 1)
  400.     downHalf = upHalf = (k - 1) / 2;
  401.   else {
  402.     upHalf = k / 2;
  403.     downHalf = (k - 2) / 2;
  404.   xStart = x - downHalf;
  405.   xEnd = x + upHalf;
  406.   yStart = y - downHalf;
  407.   yEnd = y + upHalf;
  408.   allOnes = 1;
  409.   i = 0;
  410.   for (x = xStart, y = yStart; x <= xEnd; x++) {
  411.     if (image[y][x] < ERASED)
  412.       allOnes = 0;
  413.     ring[i++] = image[y][x];
  414.   for (y = yStart + 1, x = xEnd; y <= yEnd; y++) {
  415.     if (image[y][x] < ERASED)
  416.       allOnes = 0;
  417.     ring[i++] = image[y][x];
  418.   for (x = xEnd - 1, y = yEnd; x >= xStart; --x) {
  419.     if (image[y][x] < ERASED)
  420.       allOnes = 0;
  421.     ring[i++] = image[y][x];
  422.   for (y = yEnd - 1, x = xStart; y > yStart; --y) {
  423.     if (image[y][x] < ERASED)
  424.       allOnes = 0;
  425.     ring[i++] = image[y][x];
  426. /* if this square is already at border, cannot go to larger square */
  427.   if (xStart <= 0 || yStart <= 0
  428.       || xEnd >= (imgSize.x - 1) || yEnd >= (ySizeM1))
  429.     return (0);
  430.   return (allOnes);
  431. /* THINRING:    function makes decision to thin or not based on CNUM
  432.  *            and FNUM in perimeter ring
  433.  *                      usage: flag = thinring (ring, k, &permOn)
  434.  *              Flag = 1 if thinning conditions met, 0 otherwise.
  435. thinring (ring, k, permOn)
  436.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  437.      register long k;           /* square sidelength of ring */
  438.      int *permOn;               /* permanent ON flag set to 1 if so */
  439.   register nRing,               /* no. pixels in ring */
  440.     cNum,                       /* connectivity number */
  441.     n, i;
  442.   long fNum,                    /* no. 1s on ring */
  443.     m;
  444.   long nOff,                    /* current run of OFF in ring */
  445.     phi0,                       /* maximum run of OFF in ring */
  446.     nFirstRun;                  /* no  OFF from ring[0] */
  447.   long lower, upper;            /* adjacent ring elements for cNum calc */
  448.   nRing = 4 * k - 4;
  449. /* calculate FNUM */
  450.   for (i = 0, fNum = 0; i < nRing; i++)
  451.     if (ring[i] >= ERASED)
  452.       fNum++;
  453. /* calculate 4-connected run of 0s */
  454.   nOff = (ring[0] < ERASED) ? 1 : 0;
  455.   nFirstRun = (nOff == 1) ? 0 : -1;
  456.   for (i = 1, phi0 = 0; i < nRing; i++) {
  457.     if (ring[i] < ERASED)
  458.       nOff++;
  459.     else {
  460.       if (nOff > 0) {
  461.         phi0 = (nOff > phi0) ? nOff : phi0;
  462.         if (nFirstRun == 0)
  463.           nFirstRun = nOff;
  464.         nOff = 0;
  465.       }
  466.     }
  467.   if (nOff > 0) {
  468.     if (nFirstRun > 0)
  469.       nOff += nFirstRun;
  470.     phi0 = (nOff > phi0) ? nOff : phi0;
  471. /* CNUM */
  472. /* CNUM skipping corners */
  473.   for (i = 2, cNum = 0; i < nRing; i++) {
  474.     lower = (long) ring[i - 1];
  475.     if ((i % (k - 1)) == 0)
  476.       i++;                      /* skip the corner pixels */
  477.     upper = (long) ring[i];
  478.     if (upper >= ERASED && lower < ERASED)
  479.       cNum++;
  480.   if (ring[1] >= ERASED && ring[nRing - 1] < ERASED)
  481.     cNum++;
  482. /* CNUM at corners */
  483.   for (n = 1; n < 4; n++) {
  484.     m = n * (k - 1);
  485.     if (ring[m] >= ERASED)
  486.       if (ring[m - 1] < ERASED && ring[m + 1] < ERASED)
  487.         cNum++;
  488.   if (ring[0] >= ERASED && ring[1] < ERASED && ring[nRing - 1] < ERASED)
  489.     cNum++;
  490. /* to thin or not to thin */
  491.   if (cNum == 1)
  492.     if (phi0 > (k - 2) && fNum > (k - 2))
  493.       return (1);
  494. /* for 3x3, set flag for perm. ON pixel if connection, end, or cross pt */
  495. /* note that 2nd conditional for cross added 17-Mar-89 to make equivalent
  496.  * to THINWX; this leaves non-8-conn. jct if cross-jct with one branch
  497.  * just one pixel, but it's consistent */
  498.   if (k == 3)
  499.     if (cNum > 1 || fNum <= 1 || (cNum == 0 && fNum == 4))
  500.       *permOn = 1;
  501.   return (0);
  502. /* CHKCONNECT:  function checks connectivity to see if current erasures
  503.  *            combined with past erasures will destroy connectivity
  504.  *                      usage: flag = chkconnect (ring, side, k)
  505.  *              Function returns flag = 0 if connectivity destroyed,
  506.  *              flag = 1 if connectivity retained.
  507. /* if corner or its nbr is ON, then that is value of side, otherwise OFF */
  508. #define CORNER(ISIDE,ICORNER,ICORNERSIDE,ICORNEROTHER) \
  509.         if (ring[ICORNER] >= PON || ring[ICORNEROTHER] >= ERASED) \
  510.               side[ISIDE] = ON; \
  511.         else side[ISIDE] = OFF
  512. /* for a NW corner, check if corner is anchor point, and if so set to ON */
  513. #define CORNERNW(ISIDE,ICORNER,ICORNERSIDE,ICORNEROTHER) \
  514.         if (ring[ICORNER] >= ERASED + 1 \
  515.             || ring[ICORNEROTHER] >= ERASED) \
  516.               side[ISIDE] = ON; \
  517.         else side[ISIDE] = OFF
  518. chkconnect (ring, side, k)
  519.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  520.      unsigned char *side;       /* array of 8-connected side pixels */
  521.      long k;                    /* square sidelength of ring */
  522.   register long i, nSide,       /* no. pixels along 8-connected side */
  523.     nSideM1,                    /* nSide minus 1 */
  524.     iSide,                      /* side array index */
  525.     nRing;                      /* no. pixels in ring */
  526.   long anON,                    /* an ON run along side */
  527.     ONandERASE,                 /* run of ON and n ERASEs */
  528.     N1;                         /* no. ones in nbrhood */
  529.   nRing = 4 * k - 4;
  530.   nSide = k;
  531.   nSideM1 = nSide - 1;
  532. /* calculate N1 */
  533.   for (i = 0, N1 = 0; i < nRing; i++)
  534.     if (ring[i] >= PON)
  535.       N1++;
  536.   if (N1 == 0)
  537.     return (0);
  538. /* check connectivity of west side */
  539.   i = 3 * (k - 1);
  540.   CORNER (0, i, i + 1, i - 1);
  541.   for (i = i + 1, iSide = 1; i < nRing; i++, iSide++)
  542.     side[iSide] = ring[i];
  543.   CORNERNW (nSideM1, 0, nRing - 1, 1);
  544.   for (i = 0, anON = 0, ONandERASE = 0; i < nSide; i++) {
  545.     if (side[i] >= PON) {
  546.       if (ONandERASE == 1)
  547.         return (0);
  548.       else
  549.         anON = 1;
  550.     }
  551.     else if ((side[i] == ERASED || side[i] == ERASED + 1)
  552.              && anON == 1)
  553.       ONandERASE = 1;
  554.     else if (side[i] < ERASED)
  555.       anON = ONandERASE = 0;    /* off */
  556. /* check connectivity of north side */
  557.   i = k - 1;
  558.   CORNER (0, i, i - 1, i + 1);
  559.   for (i = i - 1, iSide = 1; i >= 0; --i, iSide++)
  560.     side[iSide] = ring[i];
  561.   CORNERNW (nSideM1, 0, 1, nRing - 1);
  562.   for (i = 0, anON = 0, ONandERASE = 0; i < nSide; i++) {
  563.     if (side[i] >= PON) {
  564.       if (ONandERASE == 1)
  565.         return (0);
  566.       else
  567.         anON = 1;
  568.     }
  569.     else if ((side[i] == ERASED || side[i] == ERASED + 1)
  570.              && anON == 1)
  571.       ONandERASE = 1;
  572.     else if (side[i] < ERASED)
  573.       anON = ONandERASE = 0;    /* off */
  574. /* check connectivity of east side */
  575.   i = k - 1;
  576.   CORNER (0, i, i + 1, i - 1);
  577.   for (i = i + 1, iSide = 1; iSide < nSideM1; i++, iSide++)
  578.     side[iSide] = ring[i];
  579.   CORNER (nSideM1, 2 * (k - 1), 2 * (k - 1) - 1, 2 * (k - 1) + 1);
  580.   for (i = 0, anON = 0, ONandERASE = 0; i < nSide; i++) {
  581.     if (side[i] >= PON) {
  582.       if (ONandERASE == 1)
  583.         return (0);
  584.       else
  585.         anON = 1;
  586.     }
  587.     else if ((side[i] == ERASED || side[i] == ERASED + 1)
  588.              && anON == 1)
  589.       ONandERASE = 1;
  590.     else if (side[i] < ERASED)
  591.       anON = ONandERASE = 0;    /* off */
  592.   return (1);
  593. /* ANCHOR:      function returns 1 if core is exposed on NW side
  594.  *                    usage: anchor (ring, k)
  595. anchor (ring, k)
  596.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  597.      register long k;           /* square sidelength of ring */
  598.   register long nRing,          /* no. pixels in ring */
  599.     i;
  600.   nRing = 4 * k - 4;
  601.   for (i = 0; i < k; i++)
  602.     if (ring[i] >= ERASED)
  603.       return (0);
  604.   for (i = 3 * (k - 1) + 1; i < nRing; i++)
  605.     if (ring[i] >= ERASED)
  606.       return (0);
  607.   return (1);
  608. /* ERASESQR:    function erases square contained within square perimeter
  609.  *                    usage: erasesqr (x, y, k, anchor, &nErased)
  610.  *              If the core is an anchor, then the pixels are erased
  611.  *              to ERASED + 1, otherwise they are erased to ERASED.
  612.  *              For kxk > 3x3 erasure, PON pixels (permanent ON for 3x3)
  613.  *              are erased; and if an anchor point (ERASED + 1) can be
  614.  *              erased to a non-anchor point by a larger k (I don't know
  615.  *              if this can actually happen... I'm pretty sure it cannot
  616.  *              and have found on a fingerprint it does not, but have not
  617.  *              thought it out yet.) then it is erased to ERASED.
  618.    /* want to erase if ERASED +1, not just ON */
  619. erasesqr (x, y, k, anchor, nErased)
  620.      register long x, y;        /* image coordinages */
  621.      long k;                    /* square sidelength of ring */
  622.      register int anchor;       /* 1 if core is NW pt of NW-SE diag; else 0 */
  623.      long *nErased;             /* no. of erased */
  624.   register long xEnd, yEnd;     /* upper bounds of center erase area */
  625.   long upHalf, downHalf,        /* half of mask below and above center */
  626.     yStart,                     /* bounds of center erase area */
  627.     xStart;
  628. /* erase for 3x3 */
  629.   if (k == 3) {
  630.     if (image[y][x] == ON) {
  631.       (*nErased)++;
  632.       image[y][x] = (anchor == 0) ? ERASED : ERASED + 1;
  633.     }
  634. /* erase for kxk > 3x3 */
  635.   else {
  636.     if (k % 2 == 1)
  637.       downHalf = upHalf = (k - 3) / 2;
  638.     else {
  639.       upHalf = (k - 2) / 2;
  640.       downHalf = (k - 4) / 2;
  641.     }
  642.     xStart = x - downHalf;
  643.     xEnd = x + upHalf;
  644.     yStart = y - downHalf;
  645.     yEnd = y + upHalf;
  646.     for (y = yStart; y <= yEnd; y++) {
  647.       for (x = xStart; x <= xEnd; x++) {
  648.         if (image[y][x] >= ERASED + 1) {
  649.           if (image[y][x] >= PON)
  650.             (*nErased)++;
  651.           image[y][x] = (anchor == 0) ? ERASED : ERASED + 1;
  652.         }
  653.       }
  654.     }
  655.   return (0);
  656. /* DISPLAY:     function displays results after each iteration of thinning
  657.  *                    usage: display (nChange)
  658. display (nChange)
  659.      long nChange;              /* no. thinning operations on iteration */
  660.   long y, x;                    /* image coordinates */
  661.   char c;
  662.   for (y = 0; y < imgSize.y; y++) {
  663.     for (x = 0; x < imgSize.x; x++) {
  664.       if (image[y][x] == ON)
  665.         printf ("* ");
  666.       else if (image[y][x] == PON)
  667.         printf ("O ");
  668.       else if (image[y][x] == ERASED)
  669.         printf ("e ");
  670.       else if (image[y][x] == ERASED + 1)
  671.         printf ("a ");
  672.       else
  673.         printf ("  ");
  674.     }
  675.     printf ("\n");
  676.   if (nChange > 0) {
  677.     printf ("Enter <CR> to continue next iteration.\n");
  678.     scanf ("%c", &c);
  679.   return (0);
  680. /* USAGE:       function gives instructions on usage of program
  681.  *                    usage: usage (flag)
  682.  *              When flag is 1, the long message is given, 0 gives short.
  683. usage (flag)
  684.      short flag;                /* flag =1 for long message; =0 for short message */
  685. /* print short usage message or long */
  686.   printf ("USAGE: thin inimg outimg [-k K] [-n MAXITER] [-d DISPLAY] [-I] [-L]\n");
  687.   if (flag == 0)
  688.     return (-1);
  689.   printf ("\nthin performs iterative thinning of binary objects\n");
  690.   printf ("in input image to produce skeleton image with values\n");
  691.   printf ("OFF (0) anf ON (255)\n\n");
  692.   printf ("ARGUMENTS:\n");
  693.   printf ("    inimg: input image filename (TIF)\n");
  694.   printf ("   outimg: output image filename (TIF)\n\n");
  695.   printf ("OPTIONS:\n");
  696.   printf ("     -k K: window size for kxk mask (k >= 3, default = %d)\n", DFLTMAXK);
  697.   printf (" -n NITER: maximum number of iterations (default max = %d)\n", MAXITER);
  698.   printf ("       -d: to display results of each iteration (< 40x40 image)\n");
  699.   printf ("       -I: invert input image before processing\n");
  700.   printf ("       -L: print Software License for this module\n");
  701.   return (-1);
  702. /* INPUT:       function reads input parameters
  703.  *                  usage: input (argc, argv, &maxK, &nMaxIter, &displayFlag)
  704. #define USAGE_EXIT(VALUE) {usage (VALUE); return (-1);}
  705. input (argc, argv, maxK, nMaxIter, displayFlag, invertFlag)
  706.      int argc;
  707.      char *argv[];
  708.      long *maxK,                /* max. sidelength of thinning kernel */
  709.       *nMaxIter,                /* max. no. iterations */
  710.       *displayFlag,             /* display results after each iter if =1 */
  711.       *invertFlag;              /* invert input image before processing */
  712.   long n;
  713.   static char *kString = "-k";
  714.   static char *nString = "-n";
  715.   static char *dString = "-d";
  716.   static char *IString = "-I";
  717.   static char *dashString = "-";
  718.   if (argc == 1)
  719.     USAGE_EXIT (1);
  720.   if (argc == 2)
  721.     USAGE_EXIT (0);
  722.   *maxK = DFLTMAXK;
  723.   *nMaxIter = MAXITER;
  724.   *displayFlag = 0;
  725.   *invertFlag = 0;
  726.   for (n = 3; n < argc; n++) {
  727.     if (strcmp (argv[n], kString) == 0) {
  728.       if (++n == argc || argv[n][0] == '-')
  729.         USAGE_EXIT (0);
  730.       *maxK = atol (argv[n]);
  731.     }
  732.     else if (strcmp (argv[n], nString) == 0) {
  733.       if (++n == argc || argv[n][0] == '-')
  734.         USAGE_EXIT (0);
  735.       *nMaxIter = atol (argv[n]);
  736.     }
  737.     else if (strcmp (argv[n], dString) == 0)
  738.       *displayFlag = 1;
  739.     else if (strcmp (argv[n], IString) == 0)
  740.       *invertFlag = 1;
  741.     else if (strcmp (argv[n], "-L") == 0) {
  742.       print_sos_lic ();
  743.       exit (0);
  744.     }
  745.     else
  746.       USAGE_EXIT (0);
  747.   if (*maxK < 3)
  748.     USAGE_EXIT (1);
  749.   return (0);
  750.  * thinw.c
  751.  * Practical Algorithms for Image Analysis
  752.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  753. /* THINW:       program performs kxk thinning on image and yields
  754.  *            thinned image whose values are equal to the original
  755.  *              line width around that point
  756.  *              usage: thinw inimg outimg [-k MASK_SIZE] [-d] [-I] [-L]
  757. #include <stdio.h>
  758. #include <string.h>
  759. #include <stdlib.h>
  760. #include <math.h>
  761. #include <images.h>
  762. #include <tiffimage.h>          /* tiff file format info */
  763. extern void print_sos_lic ();
  764. #define DFLTMAXK 3              /* dflt maximum thinning kernel size */
  765. #define MAXMAXK 21              /* max of the maximum thinning kernel size */
  766. #define MAXITER 20              /* maximum number of iterations */
  767. #define MAXDISPLAY 40           /* maximum length of line for display */
  768. #define OFF 0                   /* initial and final value of OFF pixels */
  769. #define ON 255                  /* initial value of ON pixels */
  770. #define ERASEBASE 51            /* OFF (or formerly erased): 0-ERASEBASE */
  771. #define ANCHORBASE 101          /* ERASED (this iteration): ERASEBASE-ANCHORBASE */
  772. #define PONBASE 152             /* ANCHOR (this iteration): ANCHORBASE-PONBASE */
  773.    /* PON (final width value): PONBASE-ON */
  774. long ksize (unsigned char **, struct point, long, long, long);
  775. long getring (unsigned char **, struct point, long, long, long, unsigned char *);
  776. long sqron (unsigned char **, long, long, long);
  777. long thinring (unsigned char *, long, long *);
  778. int width (unsigned char *k, long);
  779. long chkconnect (unsigned char *, long);
  780. int anchor (unsigned char *, long);
  781. int erasesqr (unsigned char **, long, long, unsigned char *, long, int, long *);
  782. long usage (short);
  783. long input (int, char **, long *, long *, long *);
  784. main (argc, argv)
  785.      int argc;
  786.      char *argv[];
  787.   Image *imgIO;                 /* input/output image pointer */
  788.   long maxK,                    /* max. sidelength of thinning kernel */
  789.     k,                          /* sidelength of current thinning kernel */
  790.     kM1,                        /* k - 1 */
  791.     change[MAXMAXK],            /* no. erasures for each mask size */
  792.     nIter,                      /* no. iterations */
  793.     x, y,                       /* image coordinates */
  794.     nChange,                    /* no. thinning operations on iteration */
  795.     dFlag,                      /* display results after each iter if =1 */
  796.     invertFlag;                 /* invert input image before processing */
  797.   long nONs,                    /* total ONs in original image */
  798.     nErased;                    /* cumulative no. ERASED in image */
  799.   char c;
  800.   long temp;
  801.   long permOn;                  /* permanent ON flag set to 1 if so */
  802.   unsigned char **image;        /* input/output image */
  803.   struct point imgSize;         /* image size */
  804.   unsigned char *ring;          /* ring of pixels on perimeter of kxk sqr */
  805. /* user input */
  806.   if (input (argc, argv, &maxK, &dFlag, &invertFlag) < 0)
  807.     return (-1);
  808. /* read input file */
  809.   imgIO = ImageIn (argv[1]);
  810.   image = imgIO->img;
  811.   imgSize.x = ImageGetWidth (imgIO);
  812.   imgSize.y = ImageGetHeight (imgIO);
  813.   if (imgSize.y > MAXDISPLAY)
  814.     dFlag = 0;
  815. /* invert image */
  816.   if (invertFlag) {
  817.     for (y = 0; y < imgSize.y; y++)
  818.       for (x = 0; x < imgSize.x; x++)
  819.       image[y][x] = 255 - image[y][x];
  820.   if ((ring = (unsigned char *) malloc (4 * (maxK - 1))) == NULL) {
  821.     printf ("not enough memory -- sorry");
  822.     return (-1);
  823. /* zero image borders */
  824.   for (y = 0; y < imgSize.y; y++)
  825.     image[y][0] = image[y][imgSize.x - 1] = OFF;
  826.   for (x = 0; x < imgSize.x; x++)
  827.     image[0][x] = image[imgSize.y - 1][x] = OFF;
  828.   for (k = 0; k < MAXMAXK; k++)
  829.     change[k] = 0;
  830. /* iteratively convolve through image until thinned */
  831.   nONs = nErased = 0;
  832.   for (nIter = 0, nChange = 1; (nChange > 0) && nIter <= MAXITER; nIter++) {
  833.     nChange = 0;
  834.     for (y = 1; y < imgSize.y - 1; y++) {
  835.       for (x = 1; x < imgSize.x - 1; x++) {
  836.         permOn = 0;
  837.         k = ksize (image, imgSize, x, y, maxK);
  838.         if (nIter == 0 && k >= 3)
  839.           nONs++;
  840.         kM1 = (k > 3) ? k - 1 : 3;
  841.         while (k >= kM1) {
  842.           if (sqron (image, x, y, k) == 0)
  843.             break;
  844.           if (getring (image, imgSize, x, y, k, ring) == 1)
  845.             break;
  846.           if (thinring (ring, k, &permOn) == 1) {
  847.             if (chkconnect (ring, k) == 1) {
  848.               nChange++;
  849.               (change[k])++;
  850.               erasesqr (image, x, y, ring, k, anchor (ring, k), &nErased);
  851.               break;
  852.             }
  853.           }
  854.           --k;
  855.         }
  856.         if (permOn != 0)
  857.           image[y][x] = (unsigned char) permOn;
  858.       }
  859.     }
  860.     printf ("%d interations: nChange = %7d\n", nIter + 1, nChange);
  861.     printf ("      3: %d,   4: %d,   5: %d,   6: %d,   7: %d\n\n",
  862.             change[3], change[4], change[5], change[6], change[7]);
  863.     for (y = 0; y < imgSize.y; y++) {
  864.       for (x = 0; x < imgSize.x; x++) {
  865.         if (image[y][x] >= ERASEBASE && image[y][x] < ANCHORBASE)
  866.           image[y][x] = image[y][x] - ERASEBASE;
  867.         else if (image[y][x] >= ANCHORBASE && image[y][x] < PONBASE)
  868.           image[y][x] = image[y][x] - ANCHORBASE;
  869.       }
  870.     }
  871.     if (dFlag == 1) {
  872.       for (y = 0; y < imgSize.y; y++) {
  873.         for (x = 0; x < imgSize.x; x++) {
  874.           if (image[y][x] == OFF)
  875.             printf ("  ");
  876.           else if (image[y][x] == ON)
  877.             printf ("X ");
  878.           else if (image[y][x] >= PONBASE) {
  879.             temp = (long) image[y][x] - PONBASE;
  880.             if (temp < 10)
  881.               printf ("%1d ", temp);
  882.             else
  883.               printf ("%1d", temp);
  884.           }
  885.           else {
  886.             temp = (long) image[y][x];
  887.             if (temp < 10)
  888.               printf ("%1d ", temp);
  889.             else
  890.               printf ("%1d", temp);
  891.           }
  892.         }
  893.         printf ("\n");
  894.       }
  895.       printf ("Enter <CR> for next iteration.\n");
  896.       scanf ("%c", &c);
  897.     }
  898.   if (dFlag == 1) {
  899.     for (y = 0; y < imgSize.y; y++) {
  900.       for (x = 0; x < imgSize.x; x++) {
  901.         if (image[y][x] == OFF)
  902.           printf ("  ");
  903.         else if (image[y][x] == ON)
  904.           printf ("X ");
  905.         else if (image[y][x] >= PONBASE) {
  906.           temp = (long) image[y][x] - PONBASE;
  907.           if (temp < 10)
  908.             printf ("%1d ", temp);
  909.           else
  910.             printf ("%1d", temp);
  911.         }
  912.         else {
  913.           printf ("- ");
  914.         }
  915.       }
  916.       printf ("\n");
  917.     }
  918.   if (nONs == 0)
  919.     printf ("empty image\n");
  920.   else
  921.     printf ("nONs = %d, nErased = %d (%d%%)\n", nONs, nErased,
  922.             (nErased * 100) / nONs);
  923.   if (nIter >= MAXITER && nChange != 0)
  924.     printf ("Nuts -- maximum iterations reached\n");
  925.   for (y = 1; y < imgSize.y - 1; y++)
  926.     for (x = 1; x < imgSize.x - 1; x++)
  927.       image[y][x] = (image[y][x] < PONBASE) ? OFF : ON;
  928. /* un-invert image */
  929.   if (invertFlag) {
  930.     for (y = 0; y < imgSize.y; y++)
  931.       for (x = 0; x < imgSize.x; x++)
  932.       image[y][x] = 255 - image[y][x];
  933.   ImageOut (argv[2], imgIO);
  934.   return (0);
  935. /* KSIZE:       function determines k, where kxk is largest square
  936.  *            around (x,y) which contains all ON or ERASED
  937.  *                      usage: k = ksize (image, imgSize, x, y, maxK)
  938. ksize (image, imgSize, x, y, maxK)
  939.      unsigned char **image;     /* input/output image */
  940.      struct point imgSize;      /* image size */
  941.      long x, y,                 /* image coordinates */
  942.        maxK;                    /* maximum k value */
  943.   long k,                       /* mask size */
  944.     upHalf, downHalf,           /* half of mask below and above center */
  945.     xStart, xEnd,               /* x- start and end of square */
  946.     yStart, yEnd,               /* y- start and end of square */
  947.     xMask, yMask;               /* x,y mask coordinates */
  948.   if (image[y][x] < ERASEBASE)
  949.     return (0);
  950.   for (k = 4; k <= maxK; k++) {
  951.     if (k % 2 == 1)
  952.       downHalf = upHalf = (k - 3) / 2;
  953.     else {
  954.       upHalf = (k - 2) / 2;
  955.       downHalf = (k - 4) / 2;
  956.     }
  957.     xStart = x - downHalf;
  958.     xEnd = x + upHalf;
  959.     yStart = y - downHalf;
  960.     yEnd = y + upHalf;
  961.     for (yMask = yStart; yMask <= yEnd; yMask++)
  962.       for (xMask = xStart; xMask <= xEnd; xMask++)
  963.         if (image[yMask][xMask] < ERASEBASE)
  964.           return (k - 1);
  965.   return (maxK);
  966. /* GETRING:     function gets ring of pixels on perimeter of k-size square
  967.  *                usage: allOnes = getring (image, imgSize, x, y, k, ring)
  968.  *              If ring includes only ON pixels, function returns 1,
  969.  *              otherwise 0.
  970. getring (image, imgSize, x, y, k, ring)
  971.      unsigned char **image;     /* input/output image */
  972.      struct point imgSize;      /* image size */
  973.      long x, y,                 /* image coordinages */
  974.        k;                       /* square sidelength of ring */
  975.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  976.   long upHalf, downHalf,        /* half of mask below and above center */
  977.     xStart, xEnd,               /* x- start and end of square */
  978.     yStart, yEnd,               /* y- start and end of square */
  979.     i, allOnes;                 /* =1 if all ones in ring; 0 otherwise */
  980.   if (k % 2 == 1)
  981.     downHalf = upHalf = (k - 1) / 2;
  982.   else {
  983.     upHalf = k / 2;
  984.     downHalf = (k - 2) / 2;
  985.   xStart = x - downHalf;
  986.   xEnd = x + upHalf;
  987.   yStart = y - downHalf;
  988.   yEnd = y + upHalf;
  989.   allOnes = 1;
  990.   i = 0;
  991.   for (x = xStart, y = yStart; x <= xEnd; x++) {
  992.     if (image[y][x] < ERASEBASE)
  993.       allOnes = 0;
  994.     ring[i++] = image[y][x];
  995.   for (y = yStart + 1, x = xEnd; y <= yEnd; y++) {
  996.     if (image[y][x] < ERASEBASE)
  997.       allOnes = 0;
  998.     ring[i++] = image[y][x];
  999.   for (x = xEnd - 1, y = yEnd; x >= xStart; --x) {
  1000.     if (image[y][x] < ERASEBASE)
  1001.       allOnes = 0;
  1002.     ring[i++] = image[y][x];
  1003.   for (y = yEnd - 1, x = xStart; y > yStart; --y) {
  1004.     if (image[y][x] < ERASEBASE)
  1005.       allOnes = 0;
  1006.     ring[i++] = image[y][x];
  1007. /* if this square is already at border, cannot go to larger square */
  1008.   if (xStart <= 0 || yStart <= 0
  1009.       || xEnd >= (imgSize.x - 1) || yEnd >= (imgSize.y - 1))
  1010.     return (0);
  1011.   return (allOnes);
  1012. /* SQRON:       function tests pixels in kxk square are already erased or 
  1013.  *            for 3x3 if they can never be erased
  1014.  *                      usage: flag = sqron (image, x, y, k)
  1015.  *              flag = 0 if cannot erase any pixels in square
  1016.  *                   = 1 if at least one pixel is still ON
  1017. sqron (image, x, y, k)
  1018.      unsigned char **image;     /* input/output image */
  1019.      long x, y,                 /* image coordinages */
  1020.        k;                       /* square sidelength of ring */
  1021.   long upHalf, downHalf,        /* half of mask below and above center */
  1022.     yStart, yEnd,               /* bounds of center erase area */
  1023.     xStart, xEnd;
  1024. /* check for 3x3 */
  1025.   if (k == 3) {
  1026.     if (image[y][x] == ON)
  1027.       return (1);
  1028.     else
  1029.       return (0);
  1030. /* check center square */
  1031.   if (k % 2 == 1)
  1032.     downHalf = upHalf = (k - 3) / 2;
  1033.   else {
  1034.     upHalf = (k - 2) / 2;
  1035.     downHalf = (k - 4) / 2;
  1036.   xStart = x - downHalf;
  1037.   xEnd = x + upHalf;
  1038.   yStart = y - downHalf;
  1039.   yEnd = y + upHalf;
  1040.   for (y = yStart; y <= yEnd; y++)
  1041.     for (x = xStart; x <= xEnd; x++)
  1042.       if (image[y][x] >= PONBASE)
  1043.         return (1);
  1044.   return (0);
  1045. /* THINRING:    function makes decision to thin or not based on CNUM
  1046.  *            and FNUM in perimeter ring
  1047.  *                      usage: flag = thinring (ring, k, &permOn)
  1048.  *              Flag = 1 if thinning conditions met, 0 otherwise.
  1049. thinring (ring, k, permOn)
  1050.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  1051.      long k;                    /* square sidelength of ring */
  1052.      long *permOn;              /* permanent-ON width value */
  1053.   long nRing,                   /* no. pixels in ring */
  1054.     cNum,                       /* connectivity number */
  1055.     fNum,                       /* no. 1s on ring */
  1056.     i, n, m;
  1057.   long nOff,                    /* current run of OFF in ring */
  1058.     phi0,                       /* maximum run of OFF in ring */
  1059.     nFirstRun;                  /* no  OFF from ring[0] */
  1060.   long lower, upper;            /* adjacent ring elements for cNum calc */
  1061.   nRing = 4 * k - 4;
  1062. /* calculate FNUM */
  1063.   for (i = 0, fNum = 0; i < nRing; i++)
  1064.     if (ring[i] >= ERASEBASE)
  1065.       fNum++;
  1066. /* calculate 4-connected run of 0s */
  1067.   nOff = (ring[0] < ERASEBASE) ? 1 : 0;
  1068.   nFirstRun = (nOff == 1) ? 0 : -1;
  1069.   for (i = 1, phi0 = 0; i < nRing; i++) {
  1070.     if (ring[i] < ERASEBASE)
  1071.       nOff++;
  1072.     else {
  1073.       if (nOff > 0) {
  1074.         phi0 = (nOff > phi0) ? nOff : phi0;
  1075.         if (nFirstRun == 0)
  1076.           nFirstRun = nOff;
  1077.         nOff = 0;
  1078.       }
  1079.     }
  1080.   if (nOff > 0) {
  1081.     if (nFirstRun > 0)
  1082.       nOff += nFirstRun;
  1083.     phi0 = (nOff > phi0) ? nOff : phi0;
  1084. /* CNUM */
  1085. /* CNUM skipping corners */
  1086.   for (i = 2, cNum = 0; i < nRing; i++) {
  1087.     lower = (long) ring[i - 1];
  1088.     if ((i % (k - 1)) == 0)
  1089.       i++;                      /* skip the corner pixels */
  1090.     upper = (long) ring[i];
  1091.     if (upper >= ERASEBASE && lower < ERASEBASE)
  1092.       cNum++;
  1093.   if (ring[1] >= ERASEBASE && ring[nRing - 1] < ERASEBASE)
  1094.     cNum++;
  1095. /* CNUM at corners */
  1096.   for (n = 1; n < 4; n++) {
  1097.     m = n * (k - 1);
  1098.     if (ring[m] >= ERASEBASE)
  1099.       if (ring[m - 1] < ERASEBASE && ring[m + 1] < ERASEBASE)
  1100.         cNum++;
  1101.   if (ring[0] >= ERASEBASE && ring[1] < ERASEBASE
  1102.       && ring[nRing - 1] < ERASEBASE)
  1103.     cNum++;
  1104. /* to thin or not to thin */
  1105.   if (cNum == 1)
  1106.     if (phi0 > (k - 2) && fNum > (k - 2))
  1107.       return (1);
  1108. /* for 3x3, set flag for perm. ON pixel if connection, end, or cross pt */
  1109.   if (k == 3)
  1110.     if (cNum > 1 || fNum <= 1 || (cNum == 0 && fNum == 4))
  1111.       *permOn = width (ring, nRing) + PONBASE;
  1112.   return (0);
  1113. /* WIDTH:       function calculates average width from boundary of
  1114.  *            permanent-ON pixel
  1115.  *                      usage: w = width (ring, nRing);
  1116.  *              Width calculation is made by first finding minima of
  1117.  *              each ERASED run. Then the minima are averaged and
  1118.  *              multiplied by 2 to obtain the width estimate.
  1119. #define MAXRUNSERASED 4         /* max. no. runs of erased pix.s (for cross) */
  1120. width (ring, nRing)
  1121.      unsigned char *ring;       /* ring of pixels on perimeter of kxk sqr */
  1122.      long nRing;                /* no. pixels in ring */
  1123.   long min[MAXRUNSERASED],      /* minimum distance for each erased run */
  1124.     nMin,                       /* no. runs of ERASED */
  1125.     width,                      /* estimated width measurement */
  1126.     fNum,                       /* no. ONs in nbrhood */
  1127.     i, j;
  1128. /* initialize minimas */
  1129.   for (i = 0; i < MAXRUNSERASED; i++)
  1130.     min[i] = 255;
  1131. /* calculate minima for each run of OFFs in nbrhood */
  1132.   for (i = 0, nMin = 0, fNum = 0; i < nRing; i++) {
  1133.     if (ring[i] < ERASEBASE) {
  1134.       for (j = i; ring[j] < ERASEBASE && j < nRing; j++) {
  1135.         if (ring[j] < min[nMin])
  1136.           min[nMin] = (long) ring[j];
  1137.         else if (ring[j] > PONBASE)
  1138.           fNum++;
  1139.       }
  1140.       nMin++;
  1141.       i = j;
  1142.     }
  1143.   if (ring[0] < ERASEBASE && ring[nRing - 1] < ERASEBASE && fNum > 0) {
  1144.     min[0] = (min[0] < min[nMin - 1]) ? min[0] : min[nMin - 1];
  1145.     --nMin;
  1146. /* calculate average width measurement */
  1147.   switch (nMin) {
  1148.   case 1:
  1149.     width = 2 * min[0] + 1;
  1150.     break;
  1151.   case 2:
  1152.     width = min[0] + min[1] + 1;
  1153.     break;
  1154.   case 3:
  1155.   case 4:
  1156.     for (i = 0, width = 0; i < nMin; i++)
  1157.       width += min[i];
  1158.     width = (long) ((2.0 / nMin) * width + 0.5) + 1;
  1159.     break;
  1160.   if (width == 0)
  1161.     width = 1;
  1162.   return (width);
  1163. /* CHKCONNECT:  function checks connectivity to see if current erasures
  1164.  *            combined with past erasures will destroy connectivity
  1165.  *                      usage: flag = chkconnect (ring, k)
  1166.  *              Function returns flag = 0 if connectivity destroyed,
  1167.  *              flag = 1 if connectivity retained.
  1168. /* if corner or its nbr is ON, then that is value of side, otherwise OFF */
  1169. #define CORNER(ISIDE,ICORNER,ICORNERSIDE,ICORNEROTHER) \
  1170.         if (ring[ICORNER] >= PONBASE \
  1171.              || ring[ICORNEROTHER] >= ERASEBASE) \
  1172.               side[ISIDE] = ON; \
  1173.         else side[ISIDE] = OFF
  1174. /* for a NW corner,
  1175. break
  1176. const
  1177. continue
  1178. default
  1179. double
  1180. extern
  1181. float
  1182. register
  1183. return
  1184. short
  1185. signed
  1186. sizeof
  1187. static
  1188. struct
  1189. switch
  1190. typedef
  1191. union
  1192. unsigned
  1193. volatile
  1194. while
  1195. __inline
  1196. __cdecl
  1197. __based
  1198. __stdcall
  1199. __declspec
  1200. catch
  1201. class
  1202. const_cast
  1203. delete
  1204. dynamic_cast
  1205. friend
  1206. inline
  1207. operator
  1208. private
  1209. protected
  1210. public
  1211. reinterpret_cast
  1212. static_cast
  1213. template
  1214. throw
  1215. typeid
  1216. virtual
  1217. namespace
  1218. using
  1219. __single_inheritance
  1220. __multiple_inheritance
  1221. __virtual_inheritance
  1222. __novtordisp
  1223. __resume
  1224. __nounwind
  1225. __syscall
  1226. __near
  1227. __far
  1228. __far16
  1229. __huge
  1230. __fortran
  1231. __export
  1232. __interrupt
  1233. __loadds
  1234. __saveregs
  1235. __segment
  1236. __segname
  1237. __self
  1238. __thiscall
  1239. cdecl
  1240. fortran
  1241. pascal
  1242. __pascal
  1243. __try
  1244. __except
  1245. __finally
  1246. __leave
  1247. __asm
  1248. __fastcall
  1249. __unaligned
  1250. __builtin_alignof
  1251. __sysapi
  1252. __builtin_isfloat
  1253. __wchar_t
  1254. __restrict
  1255. __int8
  1256. __int16
  1257. __int32
  1258. __int64
  1259. __int128
  1260. wchar_t
  1261. _inline
  1262. _cdecl
  1263. _based
  1264. _stdcall
  1265. _declspec
  1266. _syscall
  1267. _near
  1268. _far16
  1269. _huge
  1270. _fortran
  1271. _export
  1272. _pascal
  1273. _except
  1274. _finally
  1275. _leave
  1276. _fastcall
  1277. _int8
  1278. _int16
  1279. _int32
  1280. _int64
  1281. dllimport
  1282. dllexport
  1283. naked
  1284. thread
  1285. allocate
  1286. _setjmp
  1287. _exception_info
  1288. _exception_code
  1289. _alloca
  1290. _abnormal_termination
  1291. _ReturnAddress
  1292. defined
  1293. __formal
  1294. abstract declarator
  1295. WinMain
  1296. DllMain
  1297. .alignment member.
  1298. __unnamed
  1299. .drectve
  1300. .local static guard.
  1301. Catch
  1302. __LOCAL_SIZE
  1303. __LINE__Var
  1304. __LINE__
  1305. __FILE__
  1306. __DATE__
  1307. __TIME__
  1308. __TIMESTAMP__
  1309. _INTEGRAL_MAX_BITS
  1310. _M_IX86
  1311. _MSC_VER
  1312. _WIN32
  1313. WIN32
  1314. _DEBUG
  1315. _CONSOLE
  1316. E:\book\book.cup\ch_2.3\inv\inv.c
  1317. include
  1318. E:\book\book.cup\ch_2.3\inv\inv.h
  1319. ifndef
  1320. _INV_H_
  1321. define
  1322. D:\MSDEV\INCLUDE\stdio.h
  1323. _INC_STDIO
  1324. error
  1325. endif
  1326. ifdef
  1327. pragma
  1328. __cplusplus
  1329. _CRTAPI1
  1330. _CRTAPI2
  1331. _CRTIMP
  1332. _NTSDK
  1333. _SIZE_T_DEFINED
  1334. size_t
  1335. _WCHAR_T_DEFINED
  1336. _WCTYPE_T_DEFINED
  1337. wint_t
  1338. wctype_t
  1339. _VA_LIST_DEFINED
  1340. _M_ALPHA
  1341. va_list
  1342. _M_MPPC
  1343. BUFSIZ
  1344. _NFILE
  1345. _NSTREAM_
  1346. _IOB_ENTRIES
  1347. _FILE_DEFINED
  1348. _iobuf
  1349. _base
  1350. _flag
  1351. _file
  1352. _charbuf
  1353. _bufsiz
  1354. _tmpfname
  1355. _M_M68K
  1356. _POSIX_
  1357. _P_tmpdir
  1358. _wP_tmpdir
  1359. L_tmpnam
  1360. SEEK_CUR
  1361. SEEK_END
  1362. SEEK_SET
  1363. FILENAME_MAX
  1364. FOPEN_MAX
  1365. _SYS_OPEN
  1366. TMP_MAX
  1367. _STDIO_DEFINED
  1368. _FPOS_T_DEFINED
  1369. __STDC__
  1370. fpos_t
  1371. stdin
  1372. stdout
  1373. stderr
  1374. _IOREAD
  1375. _IOWRT
  1376. _IOFBF
  1377. _IOLBF
  1378. _IONBF
  1379. _IOMYBUF
  1380. _IOEOF
  1381. _IOERR
  1382. _IOSTRG
  1383. _IORW
  1384. _filbuf
  1385. _flsbuf
  1386. _fsopen
  1387. clearerr
  1388. fclose
  1389. _fcloseall
  1390. _fdopen
  1391. ferror
  1392. fflush
  1393. fgetc
  1394. _fgetchar
  1395. fgetpos
  1396. fgets
  1397. _fileno
  1398. _flushall
  1399. fopen
  1400. fprintf
  1401. fputc
  1402. _fputchar
  1403. fputs
  1404. fread
  1405. freopen
  1406. fscanf
  1407. fsetpos
  1408. fseek
  1409. ftell
  1410. fwrite
  1411. getchar
  1412. _getw
  1413. perror
  1414. _pclose
  1415. _popen
  1416. printf
  1417. putchar
  1418. _putw
  1419. remove
  1420. rename
  1421. rewind
  1422. _rmtmp
  1423. scanf
  1424. setbuf
  1425. _setmaxstdio
  1426. setvbuf
  1427. _snprintf
  1428. sprintf
  1429. sscanf
  1430. _tempnam
  1431. tmpfile
  1432. tmpnam
  1433. ungetc
  1434. _unlink
  1435. vfprintf
  1436. vprintf
  1437. _vsnprintf
  1438. vsprintf
  1439. _WSTDIO_DEFINED
  1440. _wfsopen
  1441. fgetwc
  1442. _fgetwchar
  1443. fputwc
  1444. _fputwchar
  1445. getwc
  1446. getwchar
  1447. putwc
  1448. putwchar
  1449. ungetwc
  1450. fgetws
  1451. fputws
  1452. _getws
  1453. _putws
  1454. fwprintf
  1455. wprintf
  1456. _snwprintf
  1457. swprintf
  1458. vfwprintf
  1459. vwprintf
  1460. _vsnwprintf
  1461. vswprintf
  1462. fwscanf
  1463. swscanf
  1464. wscanf
  1465. _wfdopen
  1466. _wfopen
  1467. _wfreopen
  1468. _wperror
  1469. _wpopen
  1470. _wremove
  1471. _wtempnam
  1472. _wtmpnam
  1473. undef
  1474. P_tmpdir
  1475. SYS_OPEN
  1476. fcloseall
  1477. fdopen
  1478. fgetchar
  1479. fileno
  1480. flushall
  1481. fputchar
  1482. rmtmp
  1483. tempnam
  1484. unlink
  1485. D:\MSDEV\INCLUDE\stdlib.h
  1486. _INC_STDLIB
  1487. EXIT_SUCCESS
  1488. EXIT_FAILURE
  1489. _ONEXIT_T_DEFINED
  1490. _onexit_t
  1491. onexit_t
  1492. _DIV_T_DEFINED
  1493. _div_t
  1494. div_t
  1495. _ldiv_t
  1496. ldiv_t
  1497. RAND_MAX
  1498. MB_CUR_MAX
  1499. __mb_cur_max
  1500. __max
  1501. __min
  1502. _MAX_PATH
  1503. _MAX_DRIVE
  1504. _MAX_DIR
  1505. _MAX_FNAME
  1506. _MAX_EXT
  1507. _OUT_TO_DEFAULT
  1508. _OUT_TO_STDERR
  1509. _OUT_TO_MSGBOX
  1510. _REPORT_ERRMODE
  1511. errno
  1512. _doserrno
  1513. _sys_errlist
  1514. _sys_nerr
  1515. __argc
  1516. __argv
  1517. __wargv
  1518. _environ
  1519. _wenviron
  1520. _fmode
  1521. _fileinfo
  1522. _pgmptr
  1523. _wpgmptr
  1524. _osver
  1525. _winver
  1526. _winmajor
  1527. _winminor
  1528. abort
  1529. _M_MRX000
  1530. atexit
  1531. bsearch
  1532. calloc
  1533. getenv
  1534. _itoa
  1535. _ltoa
  1536. malloc
  1537. mblen
  1538. _mbstrlen
  1539. __cdecl
  1540. __cdecl
  1541. _NSTREAM_
  1542. L"\\"
  1543. sizeof(_P_tmpdir)+12
  1544. 32767
  1545. ((void *)0)
  1546. (&_iob[0])
  1547. (&_iob[1])
  1548. (&_iob[2])
  1549. 0x0001
  1550. 0x0002
  1551. 0x0000
  1552. 0x0040
  1553. 0x0004
  1554. 0x0008
  1555. 0x0010
  1556. 0x0020
  1557. 0x0040
  1558. 0x0080
  1559. (wint_t)(0xFFFF)
  1560. fgetwc(stdin)
  1561. fputwc((
  1562. ),stdout)
  1563. fgetwc(
  1564. fputwc(
  1565. )->_flag & _IOEOF)
  1566. )->_flag & _IOERR)
  1567. )->_file)
  1568. )->_cnt >= 0 ? 0xff & *(
  1569. )->_ptr++ : _filbuf(
  1570. )->_cnt >= 0 ? 0xff & (*(
  1571. )->_ptr++ = (char)(
  1572. )) : _flsbuf((
  1573. getc(stdin)
  1574. putc((
  1575. ),stdout)
  1576. _P_tmpdir
  1577. _SYS_OPEN
  1578. _onexit_t
  1579. 0x7fff
  1580. __mb_cur_max
  1581. ) > (
  1582. )) ? (
  1583. ) : (
  1584. ) < (
  1585. )) ? (
  1586. ) : (
  1587. mbtowc
  1588. mbstowcs
  1589. qsort
  1590. realloc
  1591. _set_error_mode
  1592. srand
  1593. strtod
  1594. strtol
  1595. strtoul
  1596. system
  1597. _ultoa
  1598. wctomb
  1599. wcstombs
  1600. _WSTDLIB_DEFINED
  1601. _itow
  1602. _ltow
  1603. _ultow
  1604. wcstod
  1605. wcstol
  1606. wcstoul
  1607. _wgetenv
  1608. _wsystem
  1609. _wtoi
  1610. _wtol
  1611. _ecvt
  1612. _exit
  1613. _fcvt
  1614. _fullpath
  1615. _gcvt
  1616. _lrotl
  1617. _lrotr
  1618. _makepath
  1619. _onexit
  1620. _putenv
  1621. _rotl
  1622. _rotr
  1623. _searchenv
  1624. _splitpath
  1625. _swab
  1626. _WSTDLIBP_DEFINED
  1627. _wfullpath
  1628. _wmakepath
  1629. _wputenv
  1630. _wsearchenv
  1631. _wsplitpath
  1632. _seterrormode
  1633. _beep
  1634. _sleep
  1635. tolower
  1636. toupper
  1637. sys_errlist
  1638. sys_nerr
  1639. environ
  1640. onexit
  1641. putenv
  1642. ultoa
  1643. D:\MSDEV\INCLUDE\math.h
  1644. _INC_MATH
  1645. __assembler
  1646. _EXCEPTION_DEFINED
  1647. _exception
  1648. retval
  1649. _COMPLEX_DEFINED
  1650. _complex
  1651. complex
  1652. _DOMAIN
  1653. _SING
  1654. _OVERFLOW
  1655. _UNDERFLOW
  1656. _TLOSS
  1657. _PLOSS
  1658. ERANGE
  1659. _HUGE
  1660. HUGE_VAL
  1661. atan2
  1662. log10
  1663. _cabs
  1664. floor
  1665. frexp
  1666. _hypot
  1667. ldexp
  1668. _matherr
  1669. acosl
  1670. asinl
  1671. atanl
  1672. atan2l
  1673. _cabsl
  1674. ceill
  1675. coshl
  1676. fabsl
  1677. floorl
  1678. fmodl
  1679. frexpl
  1680. _hypotl
  1681. ldexpl
  1682. log10l
  1683. _matherrl
  1684. modfl
  1685. sinhl
  1686. sqrtl
  1687. tanhl
  1688. DOMAIN
  1689. OVERFLOW
  1690. UNDERFLOW
  1691. TLOSS
  1692. PLOSS
  1693. matherr
  1694. hypot
  1695. D:\MSDEV\INCLUDE\malloc.h
  1696. _INC_MALLOC
  1697. _HEAP_MAXREQ
  1698. _HEAPEMPTY
  1699. _HEAPOK
  1700. _HEAPBADBEGIN
  1701. _HEAPBADNODE
  1702. _HEAPEND
  1703. _HEAPBADPTR
  1704. _FREEENTRY
  1705. _USEDENTRY
  1706. _HEAPINFO_DEFINED
  1707. _heapinfo
  1708. _pentry
  1709. _size
  1710. _useflag
  1711. _HEAPINFO
  1712. _amblksiz
  1713. _expand
  1714. _heapadd
  1715. _heapchk
  1716. _heapmin
  1717. _heapset
  1718. _heapwalk
  1719. _heapused
  1720. _msize
  1721. alloca
  1722. _M_PPC
  1723. HEAPHOOK
  1724. ..\..\libip\ip.h
  1725. ..\..\libip\ph.h
  1726. _PH_H_
  1727. spoint
  1728. ident
  1729. ..\..\libtiff\libtiff\tiffio.h
  1730. _TIFFIO_
  1731. ..\..\libtiff\libtiff\tiff.h
  1732. _TIFF_
  1733. TIFF_VERSION
  1734. TIFF_BIGENDIAN
  1735. TIFF_LITTLEENDIAN
  1736. _TIFF_DATA_TYPEDEFS_
  1737. uint8
  1738. int16
  1739. uint16
  1740. __alpha
  1741. _MIPS_SZLONG
  1742. int32
  1743. uint32
  1744. tiff_magic
  1745. tiff_version
  1746. tiff_diroff
  1747. TIFFHeader
  1748. tdir_tag
  1749. tdir_type
  1750. tdir_count
  1751. tdir_offset
  1752. TIFFDirEntry
  1753. TIFF_NOTYPE
  1754. TIFF_BYTE
  1755. TIFF_ASCII
  1756. TIFF_SHORT
  1757. TIFF_LONG
  1758. TIFF_RATIONAL
  1759. TIFF_SBYTE
  1760. TIFF_UNDEFINED
  1761. TIFF_SSHORT
  1762. TIFF_SLONG
  1763. TIFF_SRATIONAL
  1764. TIFF_FLOAT
  1765. TIFF_DOUBLE
  1766. TIFFDataType
  1767. TIFFTAG_SUBFILETYPE
  1768. FILETYPE_REDUCEDIMAGE
  1769. FILETYPE_PAGE
  1770. FILETYPE_MASK
  1771. TIFFTAG_OSUBFILETYPE
  1772. OFILETYPE_IMAGE
  1773. OFILETYPE_REDUCEDIMAGE
  1774. OFILETYPE_PAGE
  1775. TIFFTAG_IMAGEWIDTH
  1776. TIFFTAG_IMAGELENGTH
  1777. TIFFTAG_BITSPERSAMPLE
  1778. TIFFTAG_COMPRESSION
  1779. COMPRESSION_NONE
  1780. COMPRESSION_CCITTRLE
  1781. COMPRESSION_CCITTFAX3
  1782. COMPRESSION_CCITTFAX4
  1783. COMPRESSION_LZW
  1784. COMPRESSION_OJPEG
  1785. COMPRESSION_JPEG
  1786. COMPRESSION_NEXT
  1787. COMPRESSION_CCITTRLEW
  1788. COMPRESSION_PACKBITS
  1789. COMPRESSION_THUNDERSCAN
  1790. COMPRESSION_PIXARFILM
  1791. COMPRESSION_PIXARLOG
  1792. COMPRESSION_DEFLATE
  1793. COMPRESSION_DCS
  1794. COMPRESSION_JBIG
  1795. TIFFTAG_PHOTOMETRIC
  1796. PHOTOMETRIC_MINISWHITE
  1797. PHOTOMETRIC_MINISBLACK
  1798. PHOTOMETRIC_RGB
  1799. PHOTOMETRIC_PALETTE
  1800. PHOTOMETRIC_MASK
  1801. PHOTOMETRIC_SEPARATED
  1802. PHOTOMETRIC_YCBCR
  1803. PHOTOMETRIC_CIELAB
  1804. TIFFTAG_THRESHHOLDING
  1805. THRESHHOLD_BILEVEL
  1806. THRESHHOLD_HALFTONE
  1807. THRESHHOLD_ERRORDIFFUSE
  1808. TIFFTAG_CELLWIDTH
  1809. TIFFTAG_CELLLENGTH
  1810. TIFFTAG_FILLORDER
  1811. FILLORDER_MSB2LSB
  1812. FILLORDER_LSB2MSB
  1813. TIFFTAG_DOCUMENTNAME
  1814. TIFFTAG_IMAGEDESCRIPTION
  1815. TIFFTAG_MAKE
  1816. TIFFTAG_MODEL
  1817. TIFFTAG_STRIPOFFSETS
  1818. TIFFTAG_ORIENTATION
  1819. ORIENTATION_TOPLEFT
  1820. ORIENTATION_TOPRIGHT
  1821. ORIENTATION_BOTRIGHT
  1822. ORIENTATION_BOTLEFT
  1823. ORIENTATION_LEFTTOP
  1824. ORIENTATION_RIGHTTOP
  1825. ORIENTATION_RIGHTBOT
  1826. ORIENTATION_LEFTBOT
  1827. TIFFTAG_SAMPLESPERPIXEL
  1828. TIFFTAG_ROWSPERSTRIP
  1829. TIFFTAG_STRIPBYTECOUNTS
  1830. TIFFTAG_MINSAMPLEVALUE
  1831. TIFFTAG_MAXSAMPLEVALUE
  1832. TIFFTAG_XRESOLUTION
  1833. TIFFTAG_YRESOLUTION
  1834. TIFFTAG_PLANARCONFIG
  1835. PLANARCONFIG_CONTIG
  1836. PLANARCONFIG_SEPARATE
  1837. TIFFTAG_PAGENAME
  1838. TIFFTAG_XPOSITION
  1839. TIFFTAG_YPOSITION
  1840. TIFFTAG_FREEOFFSETS
  1841. TIFFTAG_FREEBYTECOUNTS
  1842. TIFFTAG_GRAYRESPONSEUNIT
  1843. GRAYRESPONSEUNIT_10S
  1844. GRAYRESPONSEUNIT_100S
  1845. GRAYRESPONSEUNIT_1000S
  1846. GRAYRESPONSEUNIT_10000S
  1847. GRAYRESPONSEUNIT_100000S
  1848. TIFFTAG_GRAYRESPONSECURVE
  1849. TIFFTAG_GROUP3OPTIONS
  1850. GROUP3OPT_2DENCODING
  1851. GROUP3OPT_UNCOMPRESSED
  1852. GROUP3OPT_FILLBITS
  1853. TIFFTAG_GROUP4OPTIONS
  1854. GROUP4OPT_UNCOMPRESSED
  1855. TIFFTAG_RESOLUTIONUNIT
  1856. RESUNIT_NONE
  1857. RESUNIT_INCH
  1858. RESUNIT_CENTIMETER
  1859. TIFFTAG_PAGENUMBER
  1860. TIFFTAG_COLORRESPONSEUNIT
  1861. COLORRESPONSEUNIT_10S
  1862. COLORRESPONSEUNIT_100S
  1863. COLORRESPONSEUNIT_1000S
  1864. COLORRESPONSEUNIT_10000S
  1865. COLORRESPONSEUNIT_100000S
  1866. TIFFTAG_TRANSFERFUNCTION
  1867. TIFFTAG_SOFTWARE
  1868. TIFFTAG_DATETIME
  1869. TIFFTAG_ARTIST
  1870. TIFFTAG_HOSTCOMPUTER
  1871. TIFFTAG_PREDICTOR
  1872. TIFFTAG_WHITEPOINT
  1873. TIFFTAG_PRIMARYCHROMATICITIES
  1874. TIFFTAG_COLORMAP
  1875. TIFFTAG_HALFTONEHINTS
  1876. TIFFTAG_TILEWIDTH
  1877. TIFFTAG_TILELENGTH
  1878. TIFFTAG_TILEOFFSETS
  1879. TIFFTAG_TILEBYTECOUNTS
  1880. TIFFTAG_BADFAXLINES
  1881. TIFFTAG_CLEANFAXDATA
  1882. CLEANFAXDATA_CLEAN
  1883. CLEANFAXDATA_REGENERATED
  1884. CLEANFAXDATA_UNCLEAN
  1885. TIFFTAG_CONSECUTIVEBADFAXLINES
  1886. TIFFTAG_SUBIFD
  1887. TIFFTAG_INKSET
  1888. INKSET_CMYK
  1889. TIFFTAG_INKNAMES
  1890. TIFFTAG_DOTRANGE
  1891. TIFFTAG_TARGETPRINTER
  1892. TIFFTAG_EXTRASAMPLES
  1893. EXTRASAMPLE_UNSPECIFIED
  1894. ) > (
  1895. )) ? (
  1896. ) : (
  1897. ) < (
  1898. )) ? (
  1899. ) : (
  1900. _sys_errlist
  1901. _sys_nerr
  1902. _environ
  1903. _complex
  1904. _HUGE
  1905. ((long double)acos((double)(
  1906. ((long double)asin((double)(
  1907. ((long double)atan((double)(
  1908. ((long double)atan2((double)(
  1909. ), (double)(
  1910. _cabs
  1911. ((long double)ceil((double)(
  1912. ((long double)cos((double)(
  1913. ((long double)cosh((double)(
  1914. ((long double)exp((double)(
  1915. ((long double)fabs((double)(
  1916. ((long double)floor((double)(
  1917. ((long double)fmod((double)(
  1918. ), (double)(
  1919. ((long double)frexp((double)(
  1920. ((long double)_hypot((double)(
  1921. ), (double)(
  1922. ((long double)ldexp((double)(
  1923. ((long double)log((double)(
  1924. ((long double)log10((double)(
  1925. _matherr
  1926. ((long double)modf((double)(
  1927. ), (double *)(
  1928. ((long double)pow((double)(
  1929. ), (double)(
  1930. ((long double)sin((double)(
  1931. ((long double)sinh((double)(
  1932. ((long double)sqrt((double)(
  1933. ((long double)tan((double)(
  1934. ((long double)tanh((double)(
  1935. _DOMAIN
  1936. _SING
  1937. _OVERFLOW
  1938. _UNDERFLOW
  1939. _TLOSS
  1940. _PLOSS
  1941. _matherr
  1942. 0xFFFFFFE0
  1943. _alloca
  1944. 0x4d4d
  1945. 0x4949
  1946. 32766
  1947. 32771
  1948. 32773
  1949. 32809
  1950. 32908
  1951. 32909
  1952. 32946
  1953. 32947
  1954. 34661
  1955. EXTRASAMPLE_ASSOCALPHA
  1956. EXTRASAMPLE_UNASSALPHA
  1957. TIFFTAG_SAMPLEFORMAT
  1958. SAMPLEFORMAT_UINT
  1959. SAMPLEFORMAT_INT
  1960. SAMPLEFORMAT_IEEEFP
  1961. SAMPLEFORMAT_VOID
  1962. TIFFTAG_SMINSAMPLEVALUE
  1963. TIFFTAG_SMAXSAMPLEVALUE
  1964. TIFFTAG_JPEGTABLES
  1965. TIFFTAG_JPEGPROC
  1966. JPEGPROC_BASELINE
  1967. JPEGPROC_LOSSLESS
  1968. TIFFTAG_JPEGIFOFFSET
  1969. TIFFTAG_JPEGIFBYTECOUNT
  1970. TIFFTAG_JPEGRESTARTINTERVAL
  1971. TIFFTAG_JPEGLOSSLESSPREDICTORS
  1972. TIFFTAG_JPEGPOINTTRANSFORM
  1973. TIFFTAG_JPEGQTABLES
  1974. TIFFTAG_JPEGDCTABLES
  1975. TIFFTAG_JPEGACTABLES
  1976. TIFFTAG_YCBCRCOEFFICIENTS
  1977. TIFFTAG_YCBCRSUBSAMPLING
  1978. TIFFTAG_YCBCRPOSITIONING
  1979. YCBCRPOSITION_CENTERED
  1980. YCBCRPOSITION_COSITED
  1981. TIFFTAG_REFERENCEBLACKWHITE
  1982. TIFFTAG_REFPTS
  1983. TIFFTAG_REGIONTACKPOINT
  1984. TIFFTAG_REGIONWARPCORNERS
  1985. TIFFTAG_REGIONAFFINE
  1986. TIFFTAG_MATTEING
  1987. TIFFTAG_DATATYPE
  1988. TIFFTAG_IMAGEDEPTH
  1989. TIFFTAG_TILEDEPTH
  1990. TIFFTAG_PIXAR_IMAGEFULLWIDTH
  1991. TIFFTAG_PIXAR_IMAGEFULLLENGTH
  1992. TIFFTAG_WRITERSERIALNUMBER
  1993. TIFFTAG_COPYRIGHT
  1994. TIFFTAG_FRAMECOUNT
  1995. TIFFTAG_JBIGOPTIONS
  1996. TIFFTAG_FAXRECVPARAMS
  1997. TIFFTAG_FAXSUBADDRESS
  1998. TIFFTAG_FAXRECVTIME
  1999. TIFFTAG_DCSHUESHIFTVALUES
  2000. TIFFTAG_FAXMODE
  2001. FAXMODE_CLASSIC
  2002. FAXMODE_NORTC
  2003. FAXMODE_NOEOL
  2004. FAXMODE_BYTEALIGN
  2005. FAXMODE_WORDALIGN
  2006. FAXMODE_CLASSF
  2007. TIFFTAG_JPEGQUALITY
  2008. TIFFTAG_JPEGCOLORMODE
  2009. JPEGCOLORMODE_RAW
  2010. JPEGCOLORMODE_RGB
  2011. TIFFTAG_JPEGTABLESMODE
  2012. JPEGTABLESMODE_QUANT
  2013. JPEGTABLESMODE_HUFF
  2014. TIFFTAG_FAXFILLFUNC
  2015. TIFFTAG_PIXARLOGDATAFMT
  2016. PIXARLOGDATAFMT_8BIT
  2017. PIXARLOGDATAFMT_8BITABGR
  2018. PIXARLOGDATAFMT_11BITLOG
  2019. PIXARLOGDATAFMT_12BITPICIO
  2020. PIXARLOGDATAFMT_16BIT
  2021. PIXARLOGDATAFMT_FLOAT
  2022. TIFFTAG_DCSIMAGERTYPE
  2023. DCSIMAGERMODEL_M3
  2024. DCSIMAGERMODEL_M5
  2025. DCSIMAGERMODEL_M6
  2026. DCSIMAGERFILTER_IR
  2027. DCSIMAGERFILTER_MONO
  2028. DCSIMAGERFILTER_CFA
  2029. DCSIMAGERFILTER_OTHER
  2030. TIFFTAG_DCSINTERPMODE
  2031. DCSINTERPMODE_NORMAL
  2032. DCSINTERPMODE_PREVIEW
  2033. TIFFTAG_DCSBALANCEARRAY
  2034. TIFFTAG_DCSCORRECTMATRIX
  2035. TIFFTAG_DCSGAMMA
  2036. TIFFTAG_DCSTOESHOULDERPTS
  2037. TIFFTAG_DCSCALIBRATIONFD
  2038. TIFFTAG_ZIPQUALITY
  2039. TIFFTAG_PIXARLOGQUALITY
  2040. TIFFLIB_VERSION
  2041. ttag_t
  2042. tdir_t
  2043. tsample_t
  2044. tstrip_t
  2045. ttile_t
  2046. tsize_t
  2047. _WINDOWS
  2048. __WIN32__
  2049. _Windows
  2050. thandle_t
  2051. tdata_t
  2052. toff_t
  2053. TIFFPRINT_NONE
  2054. TIFFPRINT_STRIPS
  2055. TIFFPRINT_CURVES
  2056. TIFFPRINT_COLORMAP
  2057. TIFFPRINT_JPEGQTABLES
  2058. TIFFPRINT_JPEGACTABLES
  2059. TIFFPRINT_JPEGDCTABLES
  2060. TIFFRGBValue
  2061. _TIFFRGBAImage
  2062. TIFFRGBAImage
  2063. tileContigRoutine
  2064. tileSeparateRoutine
  2065. clamptab
  2066. Cr_r_tab
  2067. Cb_b_tab
  2068. Cr_g_tab
  2069. Cb_g_tab
  2070. coeffs
  2071. TIFFYCbCrToRGB
  2072. stoponerr
  2073. isContig
  2074. alpha
  2075. width
  2076. height
  2077. bitspersample
  2078. samplesperpixel
  2079. orientation
  2080. photometric
  2081. redcmap
  2082. greencmap
  2083. bluecmap
  2084. contig
  2085. separate
  2086. BWmap
  2087. PALmap
  2088. ycbcr
  2089. TIFFGetR
  2090. TIFFGetG
  2091. TIFFGetB
  2092. TIFFGetA
  2093. TIFFInitMethod
  2094. scheme
  2095. TIFFCodec
  2096. D:\MSDEV\INCLUDE\stdarg.h
  2097. _INC_STDARG
  2098. _INTSIZEOF
  2099. va_start
  2100. va_arg
  2101. va_end
  2102. TIFFErrorHandler
  2103. TIFFReadWriteProc
  2104. TIFFSeekProc
  2105. TIFFCloseProc
  2106. TIFFSizeProc
  2107. TIFFMapFileProc
  2108. TIFFUnmapFileProc
  2109. TIFFExtendProc
  2110. TIFFGetVersion
  2111. TIFFFindCODEC
  2112. TIFFRegisterCODEC
  2113. TIFFUnRegisterCODEC
  2114. _TIFFmalloc
  2115. _TIFFrealloc
  2116. _TIFFmemset
  2117. _TIFFmemcpy
  2118. _TIFFmemcmp
  2119. _TIFFfree
  2120. TIFFClose
  2121. TIFFFlush
  2122. TIFFFlushData
  2123. TIFFGetField
  2124. TIFFVGetField
  2125. TIFFGetFieldDefaulted
  2126. TIFFVGetFieldDefaulted
  2127. TIFFReadDirectory
  2128. TIFFScanlineSize
  2129. TIFFRasterScanlineSize
  2130. TIFFStripSize
  2131. TIFFVStripSize
  2132. TIFFTileRowSize
  2133. TIFFTileSize
  2134. TIFFVTileSize
  2135. TIFFDefaultStripSize
  2136. TIFFDefaultTileSize
  2137. TIFFFileno
  2138. TIFFGetMode
  2139. TIFFIsTiled
  2140. TIFFIsByteSwapped
  2141. TIFFIsUpSampled
  2142. TIFFIsMSB2LSB
  2143. TIFFCurrentRow
  2144. TIFFCurrentDirectory
  2145. TIFFCurrentDirOffset
  2146. TIFFCurrentStrip
  2147. TIFFCurrentTile
  2148. TIFFReadBufferSetup
  2149. TIFFWriteBufferSetup
  2150. TIFFLastDirectory
  2151. TIFFSetDirectory
  2152. TIFFSetSubDirectory
  2153. TIFFUnlinkDirectory
  2154. TIFFSetField
  2155. TIFFVSetField
  2156. TIFFWriteDirectory
  2157. c_plusplus
  2158. TIFFPrintDirectory
  2159. TIFFReadScanline
  2160. TIFFWriteScanline
  2161. TIFFReadRGBAImage
  2162. TIFFRGBAImageOK
  2163. TIFFRGBAImageBegin
  2164. TIFFRGBAImageGet
  2165. TIFFRGBAImageEnd
  2166. TIFFOpen
  2167. TIFFFdOpen
  2168. TIFFClientOpen
  2169. TIFFFileName
  2170. TIFFError
  2171. TIFFWarning
  2172. TIFFSetErrorHandler
  2173. TIFFSetWarningHandler
  2174. TIFFSetTagExtender
  2175. TIFFComputeTile
  2176. TIFFCheckTile
  2177. TIFFNumberOfTiles
  2178. TIFFReadTile
  2179. TIFFWriteTile
  2180. TIFFComputeStrip
  2181. TIFFNumberOfStrips
  2182. TIFFReadEncodedStrip
  2183. TIFFReadRawStrip
  2184. TIFFReadEncodedTile
  2185. TIFFReadRawTile
  2186. TIFFWriteEncodedStrip
  2187. TIFFWriteRawStrip
  2188. TIFFWriteEncodedTile
  2189. TIFFWriteRawTile
  2190. TIFFSetWriteOffset
  2191. TIFFSwabShort
  2192. TIFFSwabLong
  2193. TIFFSwabDouble
  2194. TIFFSwabArrayOfShort
  2195. TIFFSwabArrayOfLong
  2196. TIFFSwabArrayOfDouble
  2197. TIFFReverseBits
  2198. TIFFGetBitRevTable
  2199. ..\..\libimage\draw.h
  2200. _DRAW_H_
  2201. D:\MSDEV\INCLUDE\string.h
  2202. _INC_STRING
  2203. _NLSCMP_DEFINED
  2204. _NLSCMPERROR
  2205. memcpy
  2206. memcmp
  2207. memset
  2208. _strset
  2209. strcpy
  2210. strcat
  2211. strcmp
  2212. strlen
  2213. _memccpy
  2214. memchr
  2215. _memicmp
  2216. memmove
  2217. strchr
  2218. _strcmpi
  2219. _stricmp
  2220. strcoll
  2221. _stricoll
  2222. _strncoll
  2223. _strnicoll
  2224. strcspn
  2225. _strdup
  2226. _strerror
  2227. strerror
  2228. _strlwr
  2229. strncat
  2230. strncmp
  2231. _strnicmp
  2232. strncpy
  2233. _strnset
  2234. strpbrk
  2235. strrchr
  2236. _strrev
  2237. strspn
  2238. strstr
  2239. strtok
  2240. _strupr
  2241. strxfrm
  2242. memccpy
  2243. memicmp
  2244. strcmpi
  2245. stricmp
  2246. strdup
  2247. strlwr
  2248. strnicmp
  2249. strnset
  2250. strrev
  2251. strset
  2252. strupr
  2253. _WSTRING_DEFINED
  2254. wcscat
  2255. wcschr
  2256. wcscmp
  2257. wcscpy
  2258. wcscspn
  2259. wcslen
  2260. wcsncat
  2261. wcsncmp
  2262. wcsncpy
  2263. wcspbrk
  2264. wcsrchr
  2265. wcsspn
  2266. wcsstr
  2267. wcstok
  2268. _wcsdup
  2269. _wcsicmp
  2270. _wcsnicmp
  2271. _wcsnset
  2272. _wcsrev
  2273. _wcsset
  2274. _wcslwr
  2275. _wcsupr
  2276. wcsxfrm
  2277. wcscoll
  2278. _wcsicoll
  2279. _wcsncoll
  2280. _wcsnicoll
  2281. wcswcs
  2282. wcsdup
  2283. wcsicmp
  2284. wcsnicmp
  2285. wcsnset
  2286. wcsrev
  2287. wcsset
  2288. wcslwr
  2289. wcsupr
  2290. 32953
  2291. 32954
  2292. 32955
  2293. 32956
  2294. 32995
  2295. 32996
  2296. 32997
  2297. 32998
  2298. 33300
  2299. 33301
  2300. 33405
  2301. 33432
  2302. 34232
  2303. 34750
  2304. 34908
  2305. 34909
  2306. 34910
  2307. 65535
  2308. 65536
  2309. 0x0000
  2310. 0x0001
  2311. 0x0002
  2312. 0x0004
  2313. 0x0008
  2314. FAXMODE_NORTC
  2315. 65537
  2316. 65538
  2317. 0x0000
  2318. 0x0001
  2319. 65539
  2320. 0x0001
  2321. 0x0002
  2322. 65540
  2323. 65549
  2324. 65550
  2325. 65551
  2326. 65552
  2327. 65553
  2328. 65554
  2329. 65555
  2330. 65556
  2331. 65557
  2332. 65558
  2333. 19960307
  2334. 0x100
  2335. 0x200
  2336. 0x200
  2337. ) & 0xff)
  2338. ) >> 8) & 0xff)
  2339. ) >> 16) & 0xff)
  2340. ) >> 24) & 0xff)
  2341. ( (sizeof(
  2342. ) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
  2343.  = (va_list)&
  2344.  + _INTSIZEOF(
  2345.  *)((
  2346.  += _INTSIZEOF(
  2347. )) - _INTSIZEOF(
  2348.  = (va_list)0 )
  2349. 2147483647
  2350. wcsstr
  2351. wcsicoll
  2352. ..\..\libimage\tiffimage.h
  2353. _TIFFIMAGE_H_
  2354. Image
  2355. ImageAlloc
  2356. ImageCopy
  2357. ImageFree
  2358. ImageGetWidth
  2359. ImageGetHeight
  2360. ImageGetDepth
  2361. ImageGetPtr
  2362. ImageIn
  2363. ImageIsGray
  2364. ImageOut
  2365. ImageSetBWOutput
  2366. ImageSetGrayOutput
  2367. ImageSetHeight
  2368. ImageSetWidth
  2369. ..\..\libimage\gd.h
  2370. gdMaxColors
  2371. gdImageStruct
  2372. pixels
  2373. colorsTotal
  2374. green
  2375. transparent
  2376. polyInts
  2377. polyAllocated
  2378. brush
  2379. brushColorMap
  2380. tileColorMap
  2381. styleLength
  2382. stylePos
  2383. style
  2384. interlace
  2385. gdImage
  2386. gdImagePtr
  2387. nchars
  2388. offset
  2389. gdFont
  2390. gdFontPtr
  2391. gdDashSize
  2392. gdStyled
  2393. gdBrushed
  2394. gdStyledBrushed
  2395. gdTiled
  2396. gdTransparent
  2397. gdImageCreate
  2398. gdImageCreateFromGif
  2399. gdImageCreateFromGd
  2400. gdImageCreateFromXbm
  2401. gdImageDestroy
  2402. gdImageSetPixel
  2403. color
  2404. gdImageGetPixel
  2405. gdImageLine
  2406. gdImageDashedLine
  2407. gdImageRectangle
  2408. gdImageFilledRectangle
  2409. gdImageBoundsSafe
  2410. gdPoint
  2411. gdPointPtr
  2412. gdImagePolygon
  2413. gdImageFilledPolygon
  2414. gdImageColorAllocate
  2415. gdImageColorClosest
  2416. gdImageColorExact
  2417. gdImageColorDeallocate
  2418. gdImageColorTransparent
  2419. gdImageGif
  2420. gdImageGd
  2421. gdImageArc
  2422. gdImageCopy
  2423. gdImageCopyResized
  2424. gdImageSetBrush
  2425. gdImageSetTile
  2426. gdImageSetStyle
  2427. noOfPixels
  2428. gdImageInterlace
  2429. interlaceArg
  2430. gdImageSX
  2431. gdImageSY
  2432. gdImageColorsTotal
  2433. gdImageRed
  2434. gdImageGreen
  2435. gdImageBlue
  2436. gdImageGetTransparent
  2437. gdImageGetInterlaced
  2438. ..\..\libimage\misc.h
  2439. _MISC_H_
  2440. D:\MSDEV\INCLUDE\ctype.h
  2441. _INC_CTYPE
  2442. _CTYPE_DISABLE_MACROS
  2443. _ctype
  2444. _pctype
  2445. _pwctype
  2446. _UPPER
  2447. _LOWER
  2448. _DIGIT
  2449. _SPACE
  2450. _PUNCT
  2451. _CONTROL
  2452. _BLANK
  2453. _LEADBYTE
  2454. _ALPHA
  2455. _CTYPE_DEFINED
  2456. _isctype
  2457. isalpha
  2458. isupper
  2459. islower
  2460. isdigit
  2461. isxdigit
  2462. isspace
  2463. ispunct
  2464. isalnum
  2465. isprint
  2466. isgraph
  2467. iscntrl
  2468. _tolower
  2469. _toupper
  2470. __isascii
  2471. __toascii
  2472. __iscsymf
  2473. __iscsym
  2474. _WCTYPE_DEFINED
  2475. iswalpha
  2476. iswupper
  2477. iswlower
  2478. iswdigit
  2479. iswxdigit
  2480. iswspace
  2481. iswpunct
  2482. iswalnum
  2483. iswprint
  2484. iswgraph
  2485. iswcntrl
  2486. iswascii
  2487. isleadbyte
  2488. towupper
  2489. towlower
  2490. iswctype
  2491. is_wctype
  2492. isascii
  2493. toascii
  2494. iscsymf
  2495. iscsym
  2496. IN_BUF_LEN
  2497. last_bs
  2498. readlin
  2499. setpixel
  2500. imgIO
  2501. value
  2502. getpixel
  2503. getrow
  2504. row_p
  2505. draw_border
  2506. zero_border
  2507. reset_image
  2508. draw_line
  2509. draw_circle
  2510. draw_filled_circle
  2511. gdImageChar
  2512. gdImageCharUp
  2513. gdImageString
  2514. gdImageStringUp
  2515. draw_ellipse
  2516. fill_Voronoi
  2517. gdImageFill
  2518. gdImageFillToBorder
  2519. border
  2520. draw_cross
  2521. draw_poly
  2522. draw_polyfill
  2523. draw_square
  2524. draw_rect
  2525. draw_up_triang
  2526. draw_dn_triang
  2527. draw_horline
  2528. draw_verline
  2529. draw_poly_ovl
  2530. av_dirn
  2531. polytype
  2532. draw_normal
  2533. PIX_RANGE
  2534. WHITE
  2535. BLACK
  2536. APOLY
  2537. HULLPOLY
  2538. DISC_ONLY
  2539. HEXA_ONLY
  2540. HEIGHT
  2541. WIDTH
  2542. ..\..\libip\lldef.h
  2543. _LLDEF_H_
  2544. False
  2545. InActive
  2546. Active
  2547. UnSet
  2548. UnMatched
  2549. Matched
  2550. Accept
  2551. Reject
  2552. Forward
  2553. Reverse
  2554. UnKnown
  2555. Boolean
  2556. linktype
  2557. previous
  2558. linklist
  2559. listlength
  2560. itemlength
  2561. match
  2562. llcrlink
  2563. llsetmatch
  2564. numatch
  2565. llsetsize
  2566. moveitem
  2567. src_addr
  2568. dest_addr
  2569. length
  2570. llzero
  2571. llinit
  2572. newitem
  2573. llhead
  2574. lltail
  2575. llnext
  2576. llprevious
  2577. llsearch
  2578. desired_item
  2579. llretrieve
  2580. lladd
  2581. lladdhead
  2582. lladdprev
  2583. lldelete
  2584. ll_length
  2585. ..\..\libip\sgl_stat.h
  2586. _SGL_STAT_H_
  2587. MAX_REC_SIZE
  2588. MIN_SGL_SIZE
  2589. MIN_SGL_DISPL
  2590. ACCEPT_LEVEL
  2591. slope
  2592. segm_ind
  2593. line_ind
  2594. Segmtype
  2595. sgl_level
  2596. SalStat
  2597. ..\..\libip\convolve.h
  2598. _CONVOLVE_H_
  2599. Matrix
  2600. matrix
  2601. nRows
  2602. nCols
  2603. ..\..\libip\pcc2.h
  2604. _PCC2_H_
  2605. NCODE0
  2606. NCODE1
  2607. NCODE2
  2608. NCODE3
  2609. NCODEF
  2610. CODE0
  2611. MINCODE1
  2612. MAXCODE1
  2613. MINCODE2
  2614. MAXCODE2
  2615. MINCODE3
  2616. MAXCODE3
  2617. MINFEATCODE
  2618. NDIRNSPERFEATURE
  2619. MAXBRANCH
  2620. STOPCODE
  2621. ENDCODE
  2622. LINECODE
  2623. BIFCODE
  2624. CROSSCODE
  2625. STARTCODE
  2626. LINEBRCODE
  2627. BIFBRCODE
  2628. CROSSBRCODE
  2629. NSTOPCODE
  2630. NENDCODE
  2631. NLINECODE
  2632. NBIFCODE
  2633. NCROSSCODE
  2634. NSTARTCODE
  2635. NLINEBRCODE
  2636. NBIFBRCODE
  2637. NCROSSBRCODE
  2638. NDECODE
  2639. ERASED
  2640. MAXPERLOOP
  2641. EELINE
  2642. EBLINE
  2643. ECLINE
  2644. BELINE
  2645. BBLINE
  2646. BCLINE
  2647. CELINE
  2648. CBLINE
  2649. CCLINE
  2650. RLELINE
  2651. RLBLINE
  2652. RLCLINE
  2653. RBELINE
  2654. RBBLINE
  2655. RBCLINE
  2656. RCELINE
  2657. RCBLINE
  2658. RCCLINE
  2659. ..\..\libimage\images.h
  2660. IMAGESH
  2661. XSIZE
  2662. YSIZE
  2663. XSIZEBIG
  2664. YSIZEBIG
  2665. GREEN
  2666. MAGENTA
  2667. YELLOW
  2668. OVERLAY
  2669. CURSOR
  2670. BACKCOLOR
  2671. HIVALUE
  2672. LOWVALUE
  2673. HIBINARY
  2674. IMGOFF
  2675. IMGON
  2676. cg1dd
  2677. pheader
  2678. magic
  2679. psize
  2680. spare1
  2681. xsize
  2682. ysize
  2683. spare2
  2684. PICMAGIC
  2685. PICIMAGES
  2686. PICTYPE
  2687. PICNORMAL
  2688. PICCOMPRESSED
  2689. PICBW
  2690. PICRUNLENGTH
  2691. point
  2692. begin
  2693. rectangle
  2694. raster
  2695. )->sx)
  2696. )->sy)
  2697. )->colorsTotal)
  2698. )->red[(
  2699. )->green[(
  2700. )->blue[(
  2701. )->transparent)
  2702. )->interlace)
  2703. 0x8000
  2704. (0x0100|_UPPER|_LOWER)
  2705. (MB_CUR_MAX > 1 ? _isctype(
  2706. ,_ALPHA) : _pctype[
  2707. ] & _ALPHA)
  2708. (MB_CUR_MAX > 1 ? _isctype(
  2709. ,_UPPER) : _pctype[
  2710. ] & _UPPER)
  2711. (MB_CUR_MAX > 1 ? _isctype(
  2712. ,_LOWER) : _pctype[
  2713. ] & _LOWER)
  2714. (MB_CUR_MAX > 1 ? _isctype(
  2715. ,_DIGIT) : _pctype[
  2716. ] & _DIGIT)
  2717. (MB_CUR_MAX > 1 ? _isctype(
  2718. ,_HEX) : _pctype[
  2719. ] & _HEX)
  2720. (MB_CUR_MAX > 1 ? _isctype(
  2721. ,_SPACE) : _pctype[
  2722. ] & _SPACE)
  2723. (MB_CUR_MAX > 1 ? _isctype(
  2724. ,_PUNCT) : _pctype[
  2725. ] & _PUNCT)
  2726. (MB_CUR_MAX > 1 ? _isctype(
  2727. ,_ALPHA|_DIGIT) : _pctype[
  2728. ] & (_ALPHA|_DIGIT))
  2729. (MB_CUR_MAX > 1 ? _isctype(
  2730. ,_BLANK|_PUNCT|_ALPHA|_DIGIT) : _pctype[
  2731. ] & (_BLANK|_PUNCT|_ALPHA|_DIGIT))
  2732. (MB_CUR_MAX > 1 ? _isctype(
  2733. ,_PUNCT|_ALPHA|_DIGIT) : _pctype[
  2734. ] & (_PUNCT|_ALPHA|_DIGIT))
  2735. (MB_CUR_MAX > 1 ? _isctype(
  2736. ,_CONTROL) : _pctype[
  2737. ] & _CONTROL)
  2738. )-'A'+'a' )
  2739. )-'a'+'A' )
  2740. ( (unsigned)(
  2741. ) < 0x80 )
  2742. ) & 0x7f )
  2743. ( iswctype(
  2744. ,_ALPHA) )
  2745. ( iswctype(
  2746. ,_UPPER) )
  2747. ( iswctype(
  2748. ,_LOWER) )
  2749. ( iswctype(
  2750. ,_DIGIT) )
  2751. ( iswctype(
  2752. ,_HEX) )
  2753. ( iswctype(
  2754. ,_SPACE) )
  2755. ( iswctype(
  2756. ,_PUNCT) )
  2757. ( iswctype(
  2758. ,_ALPHA|_DIGIT) )
  2759. ( iswctype(
  2760. ,_BLANK|_PUNCT|_ALPHA|_DIGIT) )
  2761. ( iswctype(
  2762. ,_PUNCT|_ALPHA|_DIGIT) )
  2763. ( iswctype(
  2764. ,_CONTROL) )
  2765. ( (unsigned)(
  2766. ) < 0x80 )
  2767. (_pctype[(unsigned char)(
  2768. )] & _LEADBYTE)
  2769. (isalpha(
  2770. ) || ((
  2771. ) == '_'))
  2772. (isalnum(
  2773. ) || ((
  2774. ) == '_'))
  2775. __isascii
  2776. __toascii
  2777. __iscsymf
  2778. __iscsym
  2779. ) == 0.0) ? 0 : ( ((
  2780. ) < 0.0) ? -1 : 1 ) )
  2781. bwraster
  2782. dpoint
  2783. dsegment
  2784. code0
  2785. code1
  2786. code2
  2787. code3
  2788. codeFeat
  2789. branch1
  2790. variable
  2791. tolerances
  2792. minEE
  2793. minFE
  2794. attrVar
  2795. iByteCode
  2796. iByteWidth
  2797. inOut
  2798. feat1
  2799. feat2
  2800. nWidth
  2801. sumPt
  2802. attributes
  2803. dirn1
  2804. dirn2
  2805. structures
  2806. iAttr
  2807. nLines
  2808. nEnds
  2809. nLoops
  2810. maxLength
  2811. centroidX
  2812. centroidY
  2813. iStrct
  2814. strctNN
  2815. pccfeat
  2816. iAttrEnd
  2817. iAttrBif
  2818. iAttrCross
  2819. iAttrLoop
  2820. nCross
  2821. nLoop
  2822. nearEnds
  2823. bound
  2824. endLine
  2825. locn1
  2826. locn2
  2827. iAttr1
  2828. iAttr2
  2829. segment
  2830. HORIZVERT
  2831. DIAG100
  2832. MDFLT
  2833. L_DFLT
  2834. L_MIN
  2835. M_MAX
  2836. MAXPERCODE
  2837. MAXBRPERNODE
  2838. MAXADJEDGES
  2839. WWSTRT
  2840. WWCORNER
  2841. WWCURVE
  2842. WWEND
  2843. EPSILON1
  2844. EPSILON2
  2845. BORDERTHETA
  2846. CURVELT180
  2847. CURVEGT180
  2848. CURVEEQ180
  2849. CURVEEQ360
  2850. wwPar
  2851. wwfeats
  2852. center
  2853. radius
  2854. iHigh
  2855. theta
  2856. featNode
  2857. intrsct
  2858. featK
  2859. coord
  2860. featC
  2861. trans1
  2862. trans2
  2863. radiusC
  2864. edgeList
  2865. node1
  2866. node2
  2867. adjEdge1
  2868. adjEdge2
  2869. nAdjEdge1
  2870. nAdjEdge2
  2871. nodeList
  2872. incEdge
  2873. nEdges
  2874. wwFeatPtr
  2875. nWWFeatPtr
  2876. strghtEdges
  2877. front
  2878. pcccodes
  2879. pcccode
  2880. pcctrack
  2881. pccrstore
  2882. pcclstore
  2883. pccfstore
  2884. pccwrite
  2885. pccbranch
  2886. nbrtoxy
  2887. pccread
  2888. pccdecodes
  2889. pccdecode
  2890. pccdetrack
  2891. pcc2xy
  2892. detrack
  2893. tlc1attr
  2894. tlc1track
  2895. tlc1dirn
  2896. dirncalc
  2897. tlc1store
  2898. tlc1tag
  2899. looptest
  2900. tlc1rid
  2901. tlc3structs
  2902. tlc3feats
  2903. ..\..\libip\bdy_stru.h
  2904. _BDYSTRUC_H_
  2905. curv_points
  2906. edge_in
  2907. edge_out
  2908. same_point
  2909. polygon
  2910. d_phi_ptr
  2911. d_l_ptr
  2912. poly_points
  2913. first_x
  2914. first_y
  2915. first_edge_out
  2916. total_delta_phi
  2917. next_poly
  2918. prev_poly
  2919. angular_bend
  2920. d_phik
  2921. phi_k
  2922. arc_length
  2923. arc_len
  2924. vert_to_clen
  2925. curvature_energy
  2926. find_interior_pt
  2927. e_out
  2928. tot_phi
  2929. reconstruct_poly
  2930. e_outk
  2931. fill_bdy_structure
  2932. poly_hull
  2933. hull_area
  2934. poly_hull_tol
  2935. poly_approx
  2936. abort1
  2937. LINUX
  2938. winding_ccw
  2939. winding_cw
  2940. convex_hull
  2941. reprt_hull_center
  2942. nematic_op
  2943. n_sgl
  2944. n_segm
  2945. dirns
  2946. eccentr
  2947. find_ex_hist
  2948. asp_ratio
  2949. ex_hist
  2950. ar_base
  2951. zero_moment
  2952. find_area_hist
  2953. area_hist
  2954. area_base
  2955. find_lsz_hist
  2956. lsize
  2957. lsz_hist
  2958. nbins
  2959. lsz_base
  2960. poly_moments
  2961. moments
  2962. get_next_index
  2963. getopt
  2964. optstring
  2965. exitmess
  2966. prompt
  2967. status
  2968. npoints
  2969. fft2d
  2970. imgReal
  2971. imgImag
  2972. fltrbttr
  2973. passType
  2974. order
  2975. fltrgaus
  2976. convolve
  2977. Kernel
  2978. vert_to_phi_star
  2979. phi_star
  2980. zero_mom
  2981. shape_parm
  2982. c_len
  2983. E_dist
  2984. tg_turn_an
  2985. cont_bend_en
  2986. r_dev
  2987. n2_vert
  2988. select_poly
  2989. poly_head
  2990. acm_prm_size
  2991. acm_cont_parms
  2992. acm_record_size
  2993. acm_moments
  2994. acm_shape_parms
  2995. pc_len
  2996. e_bend
  2997. get_acm_data
  2998. n_mode_parms
  2999. mode_parms
  3000. n_moments
  3001. n_pts
  3002. power_spec
  3003. corr_fct
  3004. write_acm_file
  3005. p_spec
  3006. n_mom
  3007. pix_ct
  3008. res_c_len
  3009. g_shape
  3010. write_fd_file
  3011. n_order
  3012. ratio
  3013. descriptors
  3014. dphik
  3015. msdescriptors
  3016. delta_phik
  3017. delta_lk
  3018. dc_term
  3019. source
  3020. vrtop
  3021. spec_and_corr
  3022. spec_bend_en
  3023. print_sos_lic
  3024. print_bcd_lic
  3025. usage
  3026. inv_image
  3027. ) >= 0) ? (
  3028. ): -(
  3029. ) >= 0.0) ? (
  3030. ): -(
  3031. 1.4142135
  3032. 3.14159265358979
  3033. ..\..\libimage
  3034. ..\..\libtiff\libtiff
  3035. ..\..\libip
  3036. D:\MSDEV\INCLUDE
  3037. D:\MSDEV\MFC\include
  3038. F:\MSDEV\INCLUDE
  3039. F:\MSDEV\MFC\include
  3040. _INTEGRAL_MAX_BITS=64
  3041. _M_IX86=400
  3042. _MSC_VER=1000
  3043. _WIN32
  3044. WIN32
  3045. _DEBUG
  3046. _CONSOLE
  3047.