Blame src/gd_wbmp.c

Packit Service df60bb
/*
Packit Service df60bb
 * WBMP: Wireless Bitmap Type 0: B/W, Uncompressed Bitmap
Packit Service df60bb
 * Specification of the WBMP format can be found in the file:
Packit Service df60bb
 * SPEC-WAESpec-19990524.pdf
Packit Service df60bb
 * You can download the WAP specification on: http://www.wapforum.com/
Packit Service df60bb
 *
Packit Service df60bb
 * gd_wbmp.c
Packit Service df60bb
 *
Packit Service df60bb
 * Copyright (C) Johan Van den Brande (johan@vandenbrande.com)
Packit Service df60bb
 *
Packit Service df60bb
 * Fixed: gdImageWBMPPtr, gdImageWBMP
Packit Service df60bb
 *
Packit Service df60bb
 * Recoded: gdImageWBMPCtx for use with my wbmp library
Packit Service df60bb
 * (wbmp library included, but you can find the latest distribution
Packit Service df60bb
 * at http://www.vandenbrande.com/wbmp)
Packit Service df60bb
 *
Packit Service df60bb
 * Implemented: gdImageCreateFromWBMPCtx, gdImageCreateFromWBMP
Packit Service df60bb
 *
Packit Service df60bb
 *--------------------------------------------------------------------------
Packit Service df60bb
 *
Packit Service df60bb
 * Parts of this code are from Maurice Smurlo.
Packit Service df60bb
 *
Packit Service df60bb
 ** Copyright (C) Maurice Szmurlo --- T-SIT --- January 2000
Packit Service df60bb
 ** (Maurice.Szmurlo@info.unicaen.fr)
Packit Service df60bb
 **
Packit Service df60bb
 ** Permission to use, copy, modify, and distribute this software and its
Packit Service df60bb
 ** documentation for any purpose and without fee is hereby granted, provided
Packit Service df60bb
 ** that the above copyright notice appear in all copies and that both that
Packit Service df60bb
 ** copyright notice and this permission notice appear in supporting
Packit Service df60bb
 ** documentation.  This software is provided "as is" without express or
Packit Service df60bb
 ** implied warranty.
Packit Service df60bb
 *
Packit Service df60bb
 *--------------------------------------------------------------------------
Packit Service df60bb
 *
Packit Service df60bb
 * Parts of this code are inspired by  'pbmtowbmp.c' and 'wbmptopbm.c' by
Packit Service df60bb
 * Terje Sannum <terje@looplab.com>.
Packit Service df60bb
 *
Packit Service df60bb
 ** Permission to use, copy, modify, and distribute this software and its
Packit Service df60bb
 ** documentation for any purpose and without fee is hereby granted, provided
Packit Service df60bb
 ** that the above copyright notice appear in all copies and that both that
Packit Service df60bb
 ** copyright notice and this permission notice appear in supporting
Packit Service df60bb
 ** documentation.  This software is provided "as is" without express or
Packit Service df60bb
 ** implied warranty.
Packit Service df60bb
 *
Packit Service df60bb
 *--------------------------------------------------------------------------
Packit Service df60bb
 *
Packit Service df60bb
 * Todo:
Packit Service df60bb
 *
Packit Service df60bb
 * gdCreateFromWBMP function for reading WBMP files
Packit Service df60bb
 *
Packit Service df60bb
 *--------------------------------------------------------------------------
Packit Service df60bb
 */
Packit Service df60bb
Packit Service df60bb
/**
Packit Service df60bb
 * File: WBMP IO
Packit Service df60bb
 *
Packit Service df60bb
 * Read and write WBMP images.
Packit Service df60bb
 */
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_CONFIG_H
Packit Service df60bb
#	include "config.h"
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
#include "gd.h"
Packit Service df60bb
#include "gd_errors.h"
Packit Service df60bb
#include "gdfonts.h"
Packit Service df60bb
#include <stdio.h>
Packit Service df60bb
#include <stdlib.h>
Packit Service df60bb
#include <limits.h>
Packit Service df60bb
Packit Service df60bb
#include "wbmp.h"
Packit Service df60bb
Packit Service df60bb
/* gd_putout
Packit Service df60bb
 * ---------
Packit Service df60bb
 * Wrapper around gdPutC for use with writewbmp
Packit Service df60bb
 */
Packit Service df60bb
void gd_putout(int i, void *out)
Packit Service df60bb
{
Packit Service df60bb
	gdPutC(i, (gdIOCtx *)out);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/* gd_getin
Packit Service df60bb
 * --------
Packit Service df60bb
 * Wrapper around gdGetC for use with readwbmp
Packit Service df60bb
 */
Packit Service df60bb
int gd_getin(void *in)
Packit Service df60bb
{
Packit Service df60bb
	return (gdGetC((gdIOCtx *)in));
Packit Service df60bb
}
Packit Service df60bb
Packit Service 176cb2
static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out);
Packit Service 176cb2
Packit Service df60bb
/*
Packit Service df60bb
	Function: gdImageWBMPCtx
Packit Service df60bb
Packit Service df60bb
	Write the image as a wbmp file
Packit Service df60bb
Packit Service df60bb
	Parameters:
Packit Service df60bb
		image - gd image structure
Packit Service df60bb
		fg    - the index of the foreground color. any other value will be
Packit Service df60bb
				considered as background and will not be written
Packit Service df60bb
		out   - the stream where to write
Packit Service df60bb
*/
Packit Service df60bb
BGD_DECLARE(void) gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out)
Packit Service df60bb
{
Packit Service 176cb2
	_gdImageWBMPCtx(image, fg, out);
Packit Service 176cb2
}
Packit Service 176cb2
Packit Service 176cb2
/* returns 0 on success, 1 on failure */
Packit Service 176cb2
static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out)
Packit Service 176cb2
{
Packit Service df60bb
	int x, y, pos;
Packit Service df60bb
	Wbmp *wbmp;
Packit Service df60bb
Packit Service df60bb
	/* create the WBMP */
Packit Service df60bb
	if((wbmp = createwbmp(gdImageSX(image), gdImageSY(image), WBMP_WHITE)) == NULL) {
Packit Service df60bb
		gd_error("Could not create WBMP\n");
Packit Service 176cb2
		return 1;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	/* fill up the WBMP structure */
Packit Service df60bb
	pos = 0;
Packit Service df60bb
	for(y = 0; y < gdImageSY(image); y++) {
Packit Service df60bb
		for(x = 0; x < gdImageSX(image); x++) {
Packit Service df60bb
			if(gdImageGetPixel(image, x, y) == fg) {
Packit Service df60bb
				wbmp->bitmap[pos] = WBMP_BLACK;
Packit Service df60bb
			}
Packit Service df60bb
			pos++;
Packit Service df60bb
		}
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	/* write the WBMP to a gd file descriptor */
Packit Service df60bb
	if(writewbmp(wbmp, &gd_putout, out)) {
Packit Service 176cb2
		freewbmp(wbmp);
Packit Service df60bb
		gd_error("Could not save WBMP\n");
Packit Service 176cb2
		return 1;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	/* des submitted this bugfix: gdFree the memory. */
Packit Service df60bb
	freewbmp(wbmp);
Packit Service 176cb2
Packit Service 176cb2
	return 0;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
  Function: gdImageCreateFromWBMPCtx
Packit Service df60bb
Packit Service df60bb
  Reads in a WBMP image via a <gdIOCtx> struct.  See
Packit Service df60bb
  <gdImageCreateFromWBMP>.  
Packit Service df60bb
*/
Packit Service df60bb
BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMPCtx(gdIOCtx *infile)
Packit Service df60bb
{
Packit Service df60bb
	Wbmp *wbmp;
Packit Service df60bb
	gdImagePtr im = NULL;
Packit Service df60bb
	int black, white;
Packit Service df60bb
	int col, row, pos;
Packit Service df60bb
Packit Service df60bb
	if(readwbmp(&gd_getin, infile, &wbmp)) {
Packit Service df60bb
		return (NULL);
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	if(!(im = gdImageCreate(wbmp->width, wbmp->height))) {
Packit Service df60bb
		freewbmp(wbmp);
Packit Service df60bb
		return NULL;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	/* create the background color */
Packit Service df60bb
	white = gdImageColorAllocate(im, 255, 255, 255);
Packit Service df60bb
	/* create foreground color */
Packit Service df60bb
	black = gdImageColorAllocate(im, 0, 0, 0);
Packit Service df60bb
Packit Service df60bb
	/* fill in image (in a wbmp 1 = white/ 0 = black) */
Packit Service df60bb
	pos = 0;
Packit Service df60bb
	for(row = 0; row < wbmp->height; row++) {
Packit Service df60bb
		for(col = 0; col < wbmp->width; col++) {
Packit Service df60bb
			if(wbmp->bitmap[pos++] == WBMP_WHITE) {
Packit Service df60bb
				gdImageSetPixel(im, col, row, white);
Packit Service df60bb
			} else {
Packit Service df60bb
				gdImageSetPixel(im, col, row, black);
Packit Service df60bb
			}
Packit Service df60bb
		}
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	freewbmp(wbmp);
Packit Service df60bb
Packit Service df60bb
	return im;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
  Function: gdImageCreateFromWBMP
Packit Service df60bb
Packit Service df60bb
    <gdImageCreateFromWBMP> is called to load images from WBMP format
Packit Service df60bb
    files. Invoke <gdImageCreateFromWBMP> with an already opened
Packit Service df60bb
    pointer to a file containing the desired
Packit Service df60bb
    image. <gdImageCreateFromWBMP> returns a gdImagePtr to the new
Packit Service df60bb
    image, or NULL if unable to load the image (most often because the
Packit Service df60bb
    file is corrupt or does not contain a WBMP
Packit Service df60bb
    image). <gdImageCreateFromWBMP> does not close the file. You can
Packit Service df60bb
    inspect the sx and sy members of the image to determine its
Packit Service df60bb
    size. The image must eventually be destroyed using
Packit Service df60bb
    <gdImageDestroy>.
Packit Service df60bb
Packit Service df60bb
  Variants:
Packit Service df60bb
Packit Service df60bb
    <gdImageCreateFromWBMPPtr> creates an image from WBMP data (i.e. the
Packit Service df60bb
    contents of a WBMP file) already in memory.
Packit Service df60bb
Packit Service df60bb
    <gdImageCreateFromWBMPCtx> reads in an image using the functions in
Packit Service df60bb
    a <gdIOCtx> struct.
Packit Service df60bb
Packit Service df60bb
  Parameters:
Packit Service df60bb
Packit Service df60bb
    infile - The input FILE pointer
Packit Service df60bb
Packit Service df60bb
  Returns:
Packit Service df60bb
Packit Service df60bb
    A pointer to the new image or NULL if an error occurred.
Packit Service df60bb
Packit Service df60bb
  Example:
Packit Service df60bb
    (start code)
Packit Service df60bb
Packit Service df60bb
    gdImagePtr im;
Packit Service df60bb
    FILE *in;
Packit Service df60bb
    in = fopen("mywbmp.wbmp", "rb");
Packit Service df60bb
    im = gdImageCreateFromWBMP(in);
Packit Service df60bb
    fclose(in);
Packit Service df60bb
    // ... Use the image ...
Packit Service df60bb
    gdImageDestroy(im);
Packit Service df60bb
Packit Service df60bb
    (end code)
Packit Service df60bb
*/
Packit Service df60bb
Packit Service df60bb
BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMP(FILE *inFile)
Packit Service df60bb
{
Packit Service df60bb
	gdImagePtr im;
Packit Service df60bb
	gdIOCtx *in = gdNewFileCtx(inFile);
Packit Service df60bb
	if (in == NULL) return NULL;
Packit Service df60bb
	im = gdImageCreateFromWBMPCtx(in);
Packit Service df60bb
	in->gd_free(in);
Packit Service df60bb
	return im;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
  Function: gdImageCreateFromWBMPPtr
Packit Service df60bb
Packit Service df60bb
  Parameters:
Packit Service df60bb
Packit Service df60bb
    size - size of WBMP data in bytes.
Packit Service df60bb
    data - WBMP data (i.e. contents of a WBMP file).
Packit Service df60bb
Packit Service df60bb
  See <gdImageCreateFromWBMP>.
Packit Service df60bb
*/
Packit Service df60bb
BGD_DECLARE(gdImagePtr) gdImageCreateFromWBMPPtr(int size, void *data)
Packit Service df60bb
{
Packit Service df60bb
	gdImagePtr im;
Packit Service df60bb
	gdIOCtx *in = gdNewDynamicCtxEx(size, data, 0);
Packit Service df60bb
	if(!in) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
	im = gdImageCreateFromWBMPCtx(in);
Packit Service df60bb
	in->gd_free(in);
Packit Service df60bb
	return im;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
	Function: gdImageWBMP
Packit Service df60bb
*/
Packit Service df60bb
BGD_DECLARE(void) gdImageWBMP(gdImagePtr im, int fg, FILE *outFile)
Packit Service df60bb
{
Packit Service df60bb
	gdIOCtx *out = gdNewFileCtx(outFile);
Packit Service df60bb
	if (out == NULL) return;
Packit Service df60bb
	gdImageWBMPCtx(im, fg, out);
Packit Service df60bb
	out->gd_free(out);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
	Function: gdImageWBMPPtr
Packit Service df60bb
*/
Packit Service df60bb
BGD_DECLARE(void *) gdImageWBMPPtr(gdImagePtr im, int *size, int fg)
Packit Service df60bb
{
Packit Service df60bb
	void *rv;
Packit Service df60bb
	gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
Packit Service df60bb
	if (out == NULL) return NULL;
Packit Service 176cb2
	if (!_gdImageWBMPCtx(im, fg, out)) {
Packit Service 176cb2
		rv = gdDPExtractData(out, size);
Packit Service 176cb2
	} else {
Packit Service 176cb2
		rv = NULL;
Packit Service 176cb2
	}
Packit Service df60bb
	out->gd_free(out);
Packit Service df60bb
	return rv;
Packit Service df60bb
}