Annotation of embedaddon/php/ext/gd/libgd/wbmp.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /* WBMP
                      3:    ** ----
                      4:    ** WBMP Level 0: B/W, Uncompressed
                      5:    ** This implements the WBMP format as specified in WAPSpec 1.1 and 1.2.
                      6:    ** It does not support ExtHeaders as defined in the spec. The spec states
                      7:    ** that a WAP client does not need to implement ExtHeaders.
                      8:    **
                      9:    ** (c) 2000 Johan Van den Brande <johan@vandenbrande.com>
                     10:  */
                     11: 
                     12: 
                     13: #include <stdio.h>
                     14: #include <stddef.h>
                     15: #include <stdlib.h>
                     16: #include <string.h>
                     17: 
                     18: #include "wbmp.h"
                     19: #include "gd.h"
                     20: #include "gdhelpers.h"
                     21: 
                     22: #ifdef NOTDEF
                     23: #define __TEST                 /* Compile with main function */
                     24: #define __DEBUG                        /* Extra verbose when with __TEST */
                     25: #define __WRITE                        /* readwbmp and writewbmp(stdout) */
                     26: #define __VIEW                 /* view the wbmp on stdout */
                     27: #endif
                     28: 
                     29: /* getmbi
                     30:    ** ------
                     31:    ** Get a multibyte integer from a generic getin function
                     32:    ** 'getin' can be getc, with in = NULL
                     33:    ** you can find getin as a function just above the main function
                     34:    ** This way you gain a lot of flexibilty about how this package
                     35:    ** reads a wbmp file.
                     36:  */
                     37: int
                     38: getmbi (int (*getin) (void *in), void *in)
                     39: {
                     40:   int i, mbi = 0;
                     41: 
                     42:   do
                     43:     {
                     44:       i = getin (in);
                     45:       if (i < 0)
                     46:        return (-1);
                     47:       mbi = (mbi << 7) | (i & 0x7f);
                     48:     }
                     49:   while (i & 0x80);
                     50: 
                     51:   return (mbi);
                     52: }
                     53: 
                     54: 
                     55: /* putmbi
                     56:    ** ------
                     57:    ** Put a multibyte intgerer in some kind of output stream
                     58:    ** I work here with a function pointer, to make it as generic
                     59:    ** as possible. Look at this function as an iterator on the
                     60:    ** mbi integers it spits out.
                     61:    **
                     62:  */
                     63: void
                     64: putmbi (int i, void (*putout) (int c, void *out), void *out)
                     65: {
                     66:   int cnt, l, accu;
                     67: 
                     68:   /* Get number of septets */
                     69:   cnt = 0;
                     70:   accu = 0;
                     71:   while (accu != i)
                     72:     accu += i & 0x7f << 7 * cnt++;
                     73: 
                     74:   /* Produce the multibyte output */
                     75:   for (l = cnt - 1; l > 0; l--)
                     76:     putout (0x80 | (i & 0x7f << 7 * l) >> 7 * l, out);
                     77: 
                     78:   putout (i & 0x7f, out);
                     79: 
                     80: }
                     81: 
                     82: 
                     83: 
                     84: /* skipheader
                     85:    ** ----------
                     86:    ** Skips the ExtHeader. Not needed for the moment
                     87:    **
                     88:  */
                     89: int
                     90: skipheader (int (*getin) (void *in), void *in)
                     91: {
                     92:   int i;
                     93: 
                     94:   do
                     95:     {
                     96:       i = getin (in);
                     97:       if (i < 0)
                     98:        return (-1);
                     99:     }
                    100:   while (i & 0x80);
                    101: 
                    102:   return (0);
                    103: }
                    104: 
                    105: /* create wbmp
                    106:    ** -----------
                    107:    ** create an empty wbmp
                    108:    **
                    109:  */
                    110: Wbmp *
                    111: createwbmp (int width, int height, int color)
                    112: {
                    113:   int i;
                    114: 
                    115:   Wbmp *wbmp;
                    116:   if ((wbmp = (Wbmp *) gdMalloc (sizeof (Wbmp))) == NULL)
                    117:     return (NULL);
                    118: 
                    119:   if (overflow2(sizeof (int), width)) {
                    120:     gdFree(wbmp);
                    121:     return NULL;
                    122:   }
                    123:   if (overflow2(sizeof (int) * width, height)) {
                    124:     gdFree(wbmp);
                    125:     return NULL;
                    126:   }
                    127: 
                    128:   if ((wbmp->bitmap = (int *) safe_emalloc(sizeof(int), width * height, 0)) == NULL)
                    129:     {
                    130:       gdFree (wbmp);
                    131:       return (NULL);
                    132:     }
                    133: 
                    134:   wbmp->width = width;
                    135:   wbmp->height = height;
                    136: 
                    137:   for (i = 0; i < width * height; wbmp->bitmap[i++] = color);
                    138: 
                    139:   return (wbmp);
                    140: }
                    141: 
                    142: 
                    143: 
                    144: /* readwbmp
                    145:    ** -------
                    146:    ** Actually reads the WBMP format from an open file descriptor
                    147:    ** It goes along by returning a pointer to a WBMP struct.
                    148:    **
                    149:  */
                    150: int
                    151: readwbmp (int (*getin) (void *in), void *in, Wbmp ** return_wbmp)
                    152: {
                    153:   int row, col, byte, pel, pos;
                    154:   Wbmp *wbmp;
                    155: 
                    156:   if ((wbmp = (Wbmp *) gdMalloc (sizeof (Wbmp))) == NULL)
                    157:     return (-1);
                    158: 
                    159:   wbmp->type = getin (in);
                    160:   if (wbmp->type != 0)
                    161:     {
                    162:       gdFree (wbmp);
                    163:       return (-1);
                    164:     }
                    165: 
                    166:   if (skipheader (getin, in))
                    167:     return (-1);
                    168: 
                    169: 
                    170:   wbmp->width = getmbi (getin, in);
                    171:   if (wbmp->width == -1)
                    172:     {
                    173:       gdFree (wbmp);
                    174:       return (-1);
                    175:     }
                    176: 
                    177:   wbmp->height = getmbi (getin, in);
                    178:   if (wbmp->height == -1)
                    179:     {
                    180:       gdFree (wbmp);
                    181:       return (-1);
                    182:     }
                    183: 
                    184: #ifdef __DEBUG
                    185:   printf ("W: %d, H: %d\n", wbmp->width, wbmp->height);
                    186: #endif
                    187: 
                    188:   if (overflow2(sizeof (int), wbmp->width) ||
                    189:     overflow2(sizeof (int) * wbmp->width, wbmp->height))
                    190:     {
                    191:       gdFree(wbmp);
                    192:       return (-1);
                    193:     }
                    194: 
                    195:   if ((wbmp->bitmap = (int *) safe_emalloc((size_t)wbmp->width * wbmp->height, sizeof(int), 0)) == NULL)
                    196:     {
                    197:       gdFree (wbmp);
                    198:       return (-1);
                    199:     }
                    200: 
                    201: #ifdef __DEBUG
                    202:   printf ("DATA CONSTRUCTED\n");
                    203: #endif
                    204: 
                    205:   pos = 0;
                    206:   for (row = 0; row < wbmp->height; row++)
                    207:     {
                    208:       for (col = 0; col < wbmp->width;)
                    209:        {
                    210:          byte = getin (in);
                    211: 
                    212:          for (pel = 7; pel >= 0; pel--)
                    213:            {
                    214:              if (col++ < wbmp->width)
                    215:                {
                    216:                  if (byte & 1 << pel)
                    217:                    {
                    218:                      wbmp->bitmap[pos] = WBMP_WHITE;
                    219:                    }
                    220:                  else
                    221:                    {
                    222:                      wbmp->bitmap[pos] = WBMP_BLACK;
                    223:                    }
                    224:                  pos++;
                    225:                }
                    226:            }
                    227:        }
                    228:     }
                    229: 
                    230:   *return_wbmp = wbmp;
                    231: 
                    232:   return (0);
                    233: }
                    234: 
                    235: 
                    236: /* writewbmp
                    237:    ** ---------
                    238:    ** Write a wbmp to a file descriptor
                    239:    **
                    240:    ** Why not just giving a filedescriptor to this function?
                    241:    ** Well, the incentive to write this function was the complete
                    242:    ** integration in gd library from www.boutell.com. They use
                    243:    ** their own io functions, so the passing of a function seemed to be
                    244:    ** a logic(?) decision ...
                    245:    **
                    246:  */
                    247: int
                    248: writewbmp (Wbmp * wbmp, void (*putout) (int c, void *out), void *out)
                    249: {
                    250:   int row, col;
                    251:   int bitpos, octet;
                    252: 
                    253:   /* Generate the header */
                    254:   putout (0, out);             /* WBMP Type 0: B/W, Uncompressed bitmap */
                    255:   putout (0, out);             /* FixHeaderField */
                    256: 
                    257: 
                    258: 
                    259:   /* Size of the image */
                    260:   putmbi (wbmp->width, putout, out);   /* width */
                    261:   putmbi (wbmp->height, putout, out);  /* height */
                    262: 
                    263: 
                    264:   /* Image data */
                    265:   for (row = 0; row < wbmp->height; row++)
                    266:     {
                    267:       bitpos = 8;
                    268:       octet = 0;
                    269:       for (col = 0; col < wbmp->width; col++)
                    270:        {
                    271:          octet |= ((wbmp->bitmap[row * wbmp->width + col] == 1) ? WBMP_WHITE : WBMP_BLACK) << --bitpos;
                    272:          if (bitpos == 0)
                    273:            {
                    274:              bitpos = 8;
                    275:              putout (octet, out);
                    276:              octet = 0;
                    277:            }
                    278:        }
                    279:       if (bitpos != 8)
                    280:        putout (octet, out);
                    281: 
                    282:     }
                    283:   return (0);
                    284: 
                    285: }
                    286: 
                    287: 
                    288: /* freewbmp
                    289:    ** --------
                    290:    ** gdFrees up memory occupied by a WBMP structure
                    291:    **
                    292:  */
                    293: void
                    294: freewbmp (Wbmp * wbmp)
                    295: {
                    296:   gdFree (wbmp->bitmap);
                    297:   gdFree (wbmp);
                    298: }
                    299: 
                    300: 
                    301: /* printwbmp
                    302:    ** ---------
                    303:    ** print a WBMP to stdout for visualisation
                    304:    **
                    305:  */
                    306: void
                    307: printwbmp (Wbmp * wbmp)
                    308: {
                    309:   int row, col;
                    310:   for (row = 0; row < wbmp->height; row++)
                    311:     {
                    312:       for (col = 0; col < wbmp->width; col++)
                    313:        {
                    314:          if (wbmp->bitmap[wbmp->width * row + col] == WBMP_BLACK)
                    315:            {
                    316:              putchar ('#');
                    317:            }
                    318:          else
                    319:            {
                    320:              putchar (' ');
                    321:            }
                    322:        }
                    323:       putchar ('\n');
                    324:     }
                    325: }
                    326: 
                    327: #ifdef __TEST
                    328: 
                    329: /* putout to file descriptor
                    330:    ** -------------------------
                    331:  */
                    332: int
                    333: putout (int c, void *out)
                    334: {
                    335:   return (putc (c, (FILE *) out));
                    336: }
                    337: 
                    338: /* getin from file descriptor
                    339:    ** --------------------------
                    340:  */
                    341: int
                    342: getin (void *in)
                    343: {
                    344:   return (getc ((FILE *) in));
                    345: }
                    346: 
                    347: 
                    348: /* Main function
                    349:    ** -------------
                    350:    **
                    351:  */
                    352: int
                    353: main (int argc, char *argv[])
                    354: {
                    355:   FILE *wbmp_file;
                    356:   Wbmp *wbmp;
                    357: 
                    358:   wbmp_file = fopen (argv[1], "rb");
                    359:   if (wbmp_file)
                    360:     {
                    361:       readwbmp (&getin, wbmp_file, &wbmp);
                    362: 
                    363: #ifdef __VIEW
                    364: 
                    365: #ifdef __DEBUG
                    366:       printf ("\nVIEWING IMAGE\n");
                    367: #endif
                    368: 
                    369:       printwbmp (wbmp);
                    370: #endif
                    371: 
                    372: #ifdef __WRITE
                    373: 
                    374: #ifdef __DEBUG
                    375:       printf ("\nDUMPING WBMP to STDOUT\n");
                    376: #endif
                    377: 
                    378:       writewbmp (wbmp, &putout, stdout);
                    379: #endif
                    380: 
                    381:       freewbmp (wbmp);
                    382:       fclose (wbmp_file);
                    383:     }
                    384: }
                    385: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>