Blame src/gd_wbmp.c

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