123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- /*
- WBMP: Wireless Bitmap Type 0: B/W, Uncompressed Bitmap
- Specification of the WBMP format can be found in the file:
- SPEC-WAESpec-19990524.pdf
- You can download the WAP specification on: http://www.wapforum.com/
- gd_wbmp.c
- Copyright (C) Johan Van den Brande (johan@vandenbrande.com)
- Fixed: gdImageWBMPPtr, gdImageWBMP
- Recoded: gdImageWBMPCtx for use with my wbmp library
- (wbmp library included, but you can find the latest distribution
- at http://www.vandenbrande.com/wbmp)
- Implemented: gdImageCreateFromWBMPCtx, gdImageCreateFromWBMP
- ---------------------------------------------------------------------------
- Parts of this code are from Maurice Smurlo.
- ** Copyright (C) Maurice Szmurlo --- T-SIT --- January 2000
- ** (Maurice.Szmurlo@info.unicaen.fr)
- ** Permission to use, copy, modify, and distribute this software and its
- ** documentation for any purpose and without fee is hereby granted, provided
- ** that the above copyright notice appear in all copies and that both that
- ** copyright notice and this permission notice appear in supporting
- ** documentation. This software is provided "as is" without express or
- ** implied warranty.
- ---------------------------------------------------------------------------
- Parts od this code are inspired by 'pbmtowbmp.c' and 'wbmptopbm.c' by
- Terje Sannum <terje@looplab.com>.
- **
- ** Permission to use, copy, modify, and distribute this software and its
- ** documentation for any purpose and without fee is hereby granted, provided
- ** that the above copyright notice appear in all copies and that both that
- ** copyright notice and this permission notice appear in supporting
- ** documentation. This software is provided "as is" without express or
- ** implied warranty.
- **
- ---------------------------------------------------------------------------
- Todo:
- gdCreateFromWBMP function for reading WBMP files
- ----------------------------------------------------------------------------
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- #include "gd.h"
- #include "gdfonts.h"
- #include "gd_errors.h"
- #include "wbmp.h"
- /* gd_putout
- ** ---------
- ** Wrapper around gdPutC for use with writewbmp
- **
- */
- void gd_putout (int i, void *out)
- {
- gdPutC(i, (gdIOCtx *) out);
- }
- /* gd_getin
- ** --------
- ** Wrapper around gdGetC for use with readwbmp
- **
- */
- int gd_getin (void *in)
- {
- return (gdGetC((gdIOCtx *) in));
- }
- static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out);
- /* gdImageWBMPCtx
- ** --------------
- ** Write the image as a wbmp file
- ** Parameters are:
- ** image: gd image structure;
- ** fg: the index of the foreground color. any other value will be
- ** considered as background and will not be written
- ** out: the stream where to write
- */
- void gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out)
- {
- _gdImageWBMPCtx(image, fg, out);
- }
- /* returns 0 on success, 1 on failure */
- static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out)
- {
- int x, y, pos;
- Wbmp *wbmp;
- /* create the WBMP */
- if ((wbmp = createwbmp (gdImageSX (image), gdImageSY (image), WBMP_WHITE)) == NULL) {
- gd_error("Could not create WBMP");
- return 1;
- }
- /* fill up the WBMP structure */
- pos = 0;
- for (y = 0; y < gdImageSY(image); y++) {
- for (x = 0; x < gdImageSX(image); x++) {
- if (gdImageGetPixel (image, x, y) == fg) {
- wbmp->bitmap[pos] = WBMP_BLACK;
- }
- pos++;
- }
- }
- /* write the WBMP to a gd file descriptor */
- if (writewbmp (wbmp, &gd_putout, out)) {
- freewbmp(wbmp);
- gd_error("Could not save WBMP");
- return 1;
- }
- /* des submitted this bugfix: gdFree the memory. */
- freewbmp(wbmp);
- return 0;
- }
- /* gdImageCreateFromWBMPCtx
- ** ------------------------
- ** Create a gdImage from a WBMP file input from an gdIOCtx
- */
- gdImagePtr gdImageCreateFromWBMPCtx (gdIOCtx * infile)
- {
- /* FILE *wbmp_file; */
- Wbmp *wbmp;
- gdImagePtr im = NULL;
- int black, white;
- int col, row, pos;
- if (readwbmp (&gd_getin, infile, &wbmp)) {
- return NULL;
- }
- if (!(im = gdImageCreate (wbmp->width, wbmp->height))) {
- freewbmp (wbmp);
- return NULL;
- }
- /* create the background color */
- white = gdImageColorAllocate(im, 255, 255, 255);
- /* create foreground color */
- black = gdImageColorAllocate(im, 0, 0, 0);
- /* fill in image (in a wbmp 1 = white/ 0 = black) */
- pos = 0;
- for (row = 0; row < wbmp->height; row++) {
- for (col = 0; col < wbmp->width; col++) {
- if (wbmp->bitmap[pos++] == WBMP_WHITE) {
- gdImageSetPixel(im, col, row, white);
- } else {
- gdImageSetPixel(im, col, row, black);
- }
- }
- }
- freewbmp(wbmp);
- return im;
- }
- /* gdImageCreateFromWBMP
- ** ---------------------
- */
- gdImagePtr gdImageCreateFromWBMP (FILE * inFile)
- {
- gdImagePtr im;
- gdIOCtx *in = gdNewFileCtx(inFile);
- im = gdImageCreateFromWBMPCtx(in);
- in->gd_free(in);
- return im;
- }
- gdImagePtr gdImageCreateFromWBMPPtr (int size, void *data)
- {
- gdImagePtr im;
- gdIOCtx *in = gdNewDynamicCtxEx(size, data, 0);
- im = gdImageCreateFromWBMPCtx(in);
- in->gd_free(in);
- return im;
- }
- /* gdImageWBMP
- ** -----------
- */
- void gdImageWBMP (gdImagePtr im, int fg, FILE * outFile)
- {
- gdIOCtx *out = gdNewFileCtx(outFile);
- gdImageWBMPCtx(im, fg, out);
- out->gd_free(out);
- }
- /* gdImageWBMPPtr
- ** --------------
- */
- void * gdImageWBMPPtr (gdImagePtr im, int *size, int fg)
- {
- void *rv;
- gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
- if (!_gdImageWBMPCtx(im, fg, out)) {
- rv = gdDPExtractData(out, size);
- } else {
- rv = NULL;
- }
- out->gd_free(out);
- return rv;
- }
|