|
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 |
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 |
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 |
ed3af9 |
return;
|
|
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 |
ed3af9 |
gd_error("Could not save WBMP\n");
|
|
Packit |
ed3af9 |
}
|
|
Packit |
ed3af9 |
|
|
Packit |
ed3af9 |
/* des submitted this bugfix: gdFree the memory. */
|
|
Packit |
ed3af9 |
freewbmp(wbmp);
|
|
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 |
ed3af9 |
gdImageWBMPCtx(im, fg, out);
|
|
Packit |
ed3af9 |
rv = gdDPExtractData(out, size);
|
|
Packit |
ed3af9 |
out->gd_free(out);
|
|
Packit |
ed3af9 |
return rv;
|
|
Packit |
ed3af9 |
}
|