root/ext/gd/libgd/gd_wbmp.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gd_putout
  2. gd_getin
  3. gdImageWBMPCtx
  4. gdImageCreateFromWBMPCtx
  5. gdImageCreateFromWBMP
  6. gdImageCreateFromWBMPPtr
  7. gdImageWBMP
  8. gdImageWBMPPtr

   1 /*
   2    WBMP: Wireless Bitmap Type 0: B/W, Uncompressed Bitmap
   3    Specification of the WBMP format can be found in the file:
   4    SPEC-WAESpec-19990524.pdf
   5    You can download the WAP specification on: http://www.wapforum.com/
   6 
   7    gd_wbmp.c
   8 
   9    Copyright (C) Johan Van den Brande (johan@vandenbrande.com)
  10 
  11    Fixed: gdImageWBMPPtr, gdImageWBMP
  12 
  13    Recoded: gdImageWBMPCtx for use with my wbmp library
  14    (wbmp library included, but you can find the latest distribution
  15    at http://www.vandenbrande.com/wbmp)
  16 
  17    Implemented: gdImageCreateFromWBMPCtx, gdImageCreateFromWBMP
  18 
  19    ---------------------------------------------------------------------------
  20 
  21    Parts of this code are from Maurice Smurlo.
  22 
  23 
  24    ** Copyright (C) Maurice Szmurlo --- T-SIT --- January 2000
  25    ** (Maurice.Szmurlo@info.unicaen.fr)
  26 
  27    ** Permission to use, copy, modify, and distribute this software and its
  28    ** documentation for any purpose and without fee is hereby granted, provided
  29    ** that the above copyright notice appear in all copies and that both that
  30    ** copyright notice and this permission notice appear in supporting
  31    ** documentation.  This software is provided "as is" without express or
  32    ** implied warranty.
  33 
  34    ---------------------------------------------------------------------------
  35    Parts od this code are inspired by  'pbmtowbmp.c' and 'wbmptopbm.c' by
  36    Terje Sannum <terje@looplab.com>.
  37    **
  38    ** Permission to use, copy, modify, and distribute this software and its
  39    ** documentation for any purpose and without fee is hereby granted, provided
  40    ** that the above copyright notice appear in all copies and that both that
  41    ** copyright notice and this permission notice appear in supporting
  42    ** documentation.  This software is provided "as is" without express or
  43    ** implied warranty.
  44    **
  45    ---------------------------------------------------------------------------
  46 
  47    Todo:
  48 
  49    gdCreateFromWBMP function for reading WBMP files
  50 
  51    ----------------------------------------------------------------------------
  52  */
  53 
  54 #include <gd.h>
  55 #include <gdfonts.h>
  56 #include <stdio.h>
  57 #include <stdlib.h>
  58 #include <limits.h>
  59 
  60 #include "wbmp.h"
  61 
  62 
  63 /* gd_putout
  64    ** ---------
  65    ** Wrapper around gdPutC for use with writewbmp
  66    **
  67  */
  68 void gd_putout (int i, void *out)
  69 {
  70         gdPutC(i, (gdIOCtx *) out);
  71 }
  72 
  73 
  74 /* gd_getin
  75    ** --------
  76    ** Wrapper around gdGetC for use with readwbmp
  77    **
  78  */
  79 int gd_getin (void *in)
  80 {
  81         return (gdGetC((gdIOCtx *) in));
  82 }
  83 
  84 
  85 /*      gdImageWBMPCtx
  86    **  --------------
  87    **  Write the image as a wbmp file
  88    **  Parameters are:
  89    **  image:  gd image structure;
  90    **  fg:     the index of the foreground color. any other value will be
  91    **          considered as background and will not be written
  92    **  out:    the stream where to write
  93  */
  94 void gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out)
  95 {
  96         int x, y, pos;
  97         Wbmp *wbmp;
  98 
  99         /* create the WBMP */
 100         if ((wbmp = createwbmp (gdImageSX (image), gdImageSY (image), WBMP_WHITE)) == NULL) {
 101                 php_gd_error("Could not create WBMP");
 102         }
 103 
 104         /* fill up the WBMP structure */
 105         pos = 0;
 106         for (y = 0; y < gdImageSY(image); y++) {
 107                 for (x = 0; x < gdImageSX(image); x++) {
 108                         if (gdImageGetPixel (image, x, y) == fg) {
 109                                 wbmp->bitmap[pos] = WBMP_BLACK;
 110                         }
 111                         pos++;
 112                 }
 113         }
 114 
 115         /* write the WBMP to a gd file descriptor */
 116         if (writewbmp (wbmp, &gd_putout, out)) {
 117                 php_gd_error("Could not save WBMP");
 118         }
 119         /* des submitted this bugfix: gdFree the memory. */
 120         freewbmp(wbmp);
 121 }
 122 
 123 /* gdImageCreateFromWBMPCtx
 124    ** ------------------------
 125    ** Create a gdImage from a WBMP file input from an gdIOCtx
 126  */
 127 gdImagePtr gdImageCreateFromWBMPCtx (gdIOCtx * infile)
 128 {
 129         /* FILE *wbmp_file; */
 130         Wbmp *wbmp;
 131         gdImagePtr im = NULL;
 132         int black, white;
 133         int col, row, pos;
 134 
 135         if (readwbmp (&gd_getin, infile, &wbmp)) {
 136                 return NULL;
 137         }
 138 
 139         if (!(im = gdImageCreate (wbmp->width, wbmp->height))) {
 140                 freewbmp (wbmp);
 141                 return NULL;
 142         }
 143 
 144         /* create the background color */
 145         white = gdImageColorAllocate(im, 255, 255, 255);
 146         /* create foreground color */
 147         black = gdImageColorAllocate(im, 0, 0, 0);
 148 
 149         /* fill in image (in a wbmp 1 = white/ 0 = black) */
 150         pos = 0;
 151         for (row = 0; row < wbmp->height; row++) {
 152                 for (col = 0; col < wbmp->width; col++) {
 153                         if (wbmp->bitmap[pos++] == WBMP_WHITE) {
 154                                 gdImageSetPixel(im, col, row, white);
 155                         } else {
 156                                 gdImageSetPixel(im, col, row, black);
 157                         }
 158                 }
 159         }
 160 
 161         freewbmp(wbmp);
 162 
 163         return im;
 164 }
 165 
 166 /* gdImageCreateFromWBMP
 167    ** ---------------------
 168  */
 169 gdImagePtr gdImageCreateFromWBMP (FILE * inFile)
 170 {
 171         gdImagePtr im;
 172         gdIOCtx *in = gdNewFileCtx(inFile);
 173         im = gdImageCreateFromWBMPCtx(in);
 174         in->gd_free(in);
 175 
 176         return im;
 177 }
 178 
 179 gdImagePtr gdImageCreateFromWBMPPtr (int size, void *data)
 180 {
 181         gdImagePtr im;
 182         gdIOCtx *in = gdNewDynamicCtxEx(size, data, 0);
 183         im = gdImageCreateFromWBMPCtx(in);
 184         in->gd_free(in);
 185         return im;
 186 }
 187 
 188 /* gdImageWBMP
 189    ** -----------
 190  */
 191 void gdImageWBMP (gdImagePtr im, int fg, FILE * outFile)
 192 {
 193         gdIOCtx *out = gdNewFileCtx(outFile);
 194         gdImageWBMPCtx(im, fg, out);
 195         out->gd_free(out);
 196 }
 197 
 198 /* gdImageWBMPPtr
 199    ** --------------
 200  */
 201 void * gdImageWBMPPtr (gdImagePtr im, int *size, int fg)
 202 {
 203         void *rv;
 204         gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
 205         gdImageWBMPCtx(im, fg, out);
 206         rv = gdDPExtractData(out, size);
 207         out->gd_free(out);
 208 
 209         return rv;
 210 }

/* [<][>][^][v][top][bottom][index][help] */