GRASS GIS 8 Programmer's Manual 8.3.2(2024)-exported
Loading...
Searching...
No Matches
pngdriver/raster.c
Go to the documentation of this file.
1/*!
2 \file lib/pngdriver/raster.c
3
4 \brief GRASS png display driver - draw raster
5
6 (C) 2003-2014 by Per Henrik Johansen and the GRASS Development Team
7
8 This program is free software under the GNU General Public License
9 (>=v2). Read the file COPYING that comes with GRASS for details.
10
11 \author Per Henrik Johansen (original contributor)
12 \author Glynn Clements
13 */
14
15#include <string.h>
16#include <math.h>
17#include <grass/gis.h>
18#include "driver.h"
19#include "pngdriver.h"
20
21#ifndef min
22#define min(a, b) ((a) < (b) ? (a) : (b))
23#endif
24#ifndef max
25#define max(a, b) ((a) > (b) ? (a) : (b))
26#endif
27
28static int *trans;
29static int ncols;
30static int nalloc;
31static int masked;
32static int src[2][2];
33static int dst[2][2];
34
35static double scale(double k, const int src[2], const int dst[2])
36{
37 return dst[0] +
38 (double)(k - src[0]) * (dst[1] - dst[0]) / (src[1] - src[0]);
39}
40
41static int scale_fwd_y(int sy)
42{
43 return (int)floor(scale(sy, src[1], dst[1]) + 0.5);
44}
45
46static int scale_rev_x(int dx)
47{
48 return (int)floor(scale(dx + 0.5, dst[0], src[0]));
49}
50
51static int next_row(int sy, int dy)
52{
53 sy++;
54
55 for (;;) {
56 int y = scale_fwd_y(sy);
57
58 if (y > dy)
59 return sy - 1;
60 sy++;
61 }
62}
63
64static void alloc_buffers(void)
65{
66 if (nalloc >= ncols)
67 return;
68
69 nalloc = ncols;
70 trans = G_realloc(trans, nalloc * sizeof(int));
71}
72
73/*!
74 \brief Start drawing raster
75
76 \param mask non-zero int for mask
77 \param s source (map) extent (left, right, top, bottom)
78 \param fd destination (image) extent (left, right, top, bottom)
79 */
80void PNG_begin_raster(int mask, int s[2][2], double fd[2][2])
81{
82 int d[2][2];
83 int i;
84
85 d[0][0] = (int)floor(fd[0][0] + 0.5);
86 d[0][1] = (int)floor(fd[0][1] + 0.5);
87 d[1][0] = (int)floor(fd[1][0] + 0.5);
88 d[1][1] = (int)floor(fd[1][1] + 0.5);
89
90 ncols = d[0][1] - d[0][0];
91
92 memcpy(src, s, sizeof(src));
93 memcpy(dst, d, sizeof(dst));
94 masked = mask;
95
96 alloc_buffers();
97
98 for (i = 0; i < ncols; i++)
99 trans[i] = scale_rev_x(d[0][0] + i);
100}
101
102/*!
103 \brief Draw raster row
104
105 \param n number of cells
106 \param row raster row (starts at 0)
107 \param red,grn,blu,nul red,green,blue and null value
108
109 \return next row
110 */
111int PNG_raster(UNUSED int n, int row, const unsigned char *red,
112 const unsigned char *grn, const unsigned char *blu,
113 const unsigned char *nul)
114{
115 int d_y0 = scale_fwd_y(row + 0);
116 int d_y1 = scale_fwd_y(row + 1);
117 int d_rows = d_y1 - d_y0;
118 int x0 = max(png.clip_left - dst[0][0], 0);
119 int x1 = min(png.clip_rite - dst[0][0], ncols);
120 int y0 = max(png.clip_top - d_y0, 0);
121 int y1 = min(png.clip_bot - d_y0, d_rows);
122 int x, y;
123
124 if (y1 <= y0)
125 return next_row(row, d_y1);
126
127 for (x = x0; x < x1; x++) {
128 int xx = dst[0][0] + x;
129 int j = trans[x];
130 int c;
131
132 if (masked && nul && nul[j])
133 continue;
134
135 c = png_get_color(red[j], grn[j], blu[j], 0);
136
137 for (y = y0; y < y1; y++) {
138 int yy = d_y0 + y;
139
140 png.grid[yy * png.width + xx] = c;
141 }
142 }
143
144 png.modified = 1;
145
146 return next_row(row, d_y1);
147}
unsigned int png_get_color(int r, int g, int b, int a)
struct png_state png
int PNG_raster(UNUSED int n, int row, const unsigned char *red, const unsigned char *grn, const unsigned char *blu, const unsigned char *nul)
Draw raster row.
void PNG_begin_raster(int mask, int s[2][2], double fd[2][2])
Start drawing raster.
#define min(a, b)
#define max(a, b)
GRASS png display driver - header file.
double clip_left
Definition pngdriver.h:41
double clip_bot
Definition pngdriver.h:41
double clip_top
Definition pngdriver.h:41
unsigned int * grid
Definition pngdriver.h:43
int width
Definition pngdriver.h:42
double clip_rite
Definition pngdriver.h:41
int modified
Definition pngdriver.h:46
#define x