Loading...
Searching...
No Matches
pngdriver/write_bmp.c
Go to the documentation of this file.
/*!
\file lib/pngdriver/write_bmp.c
\brief GRASS png display driver - write bitmap (lower level functions)
(C) 2007-2014 by Glynn Clements and the GRASS Development Team
This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.
\author Glynn Clements
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <grass/gis.h>
#include "pngdriver.h"
static unsigned char *put_2(unsigned char *p, unsigned int n)
{
*p++ = n & 0xFF;
n >>= 8;
*p++ = n & 0xFF;
return p;
}
static unsigned char *put_4(unsigned char *p, unsigned int n)
{
*p++ = n & 0xFF;
n >>= 8;
*p++ = n & 0xFF;
n >>= 8;
*p++ = n & 0xFF;
n >>= 8;
*p++ = n & 0xFF;
return p;
}
static void make_bmp_header(unsigned char *p)
{
*p++ = 'B';
*p++ = 'M';
p = put_4(p, HEADER_SIZE + png.width * png.height * 4);
p = put_4(p, 0);
p = put_4(p, HEADER_SIZE);
p = put_4(p, 40);
p = put_4(p, png.width);
p = put_4(p, -png.height);
p = put_2(p, 1);
p = put_2(p, 32);
p = put_4(p, 0);
p = put_4(p, png.width * png.height * 4);
p = put_4(p, 0);
p = put_4(p, 0);
p = put_4(p, 0);
p = put_4(p, 0);
}
void write_bmp(void)
{
unsigned char header[HEADER_SIZE];
FILE *output;
int x, y;
unsigned int *p;
output = fopen(png.file_name, "wb");
if (!output)
G_fatal_error("PNG: couldn't open output file %s", png.file_name);
memset(header, 0, sizeof(header));
make_bmp_header(header);
fwrite(header, sizeof(header), 1, output);
for (y = 0, p = png.grid; y < png.height; y++) {
for (x = 0; x < png.width; x++, p++) {
unsigned int c = *p;
int r, g, b, a;
png_get_pixel(c, &r, &g, &b, &a);
fputc((unsigned char)b, output);
fputc((unsigned char)g, output);
fputc((unsigned char)r, output);
fputc((unsigned char)a, output);
}
}
fclose(output);
}
HEADER_SIZE
#define HEADER_SIZE
Definition cairodriver.h:46
png_get_pixel
void png_get_pixel(unsigned int pixel, int *r, int *g, int *b, int *a)
Definition color_table.c:110
b
double b
Definition driver/set_window.c:5
r
double r
Definition driver/set_window.c:5
G_fatal_error
void G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
Definition gis/error.c:159
g
float g
Definition named_colr.c:7
png
struct png_state png
Definition pngdriver/graph_set.c:32
write_bmp
void write_bmp(void)
Definition pngdriver/write_bmp.c:63
pngdriver.h
GRASS png display driver - header file.
output
void output(const char *fmt,...)
Definition psdriver/graph_set.c:233
x
#define x