GRASS Programmer's Manual  6.5.svn(2014)-r66266
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pngdriver/Raster.c
Go to the documentation of this file.
1 
2 #include <string.h>
3 #include <math.h>
4 #include <grass/gis.h>
5 #include "driver.h"
6 #include "pngdriver.h"
7 
8 #ifndef min
9 #define min(a,b) ((a)<(b)?(a):(b))
10 #endif
11 #ifndef max
12 #define max(a,b) ((a)>(b)?(a):(b))
13 #endif
14 
15 static int *trans;
16 static int ncols;
17 static int nalloc;
18 static int masked;
19 static int src[2][2];
20 static int dst[2][2];
21 
22 static double scale(double k, const int src[2], const int dst[2])
23 {
24  return dst[0] + (double)(k - src[0]) * (dst[1] - dst[0]) / (src[1] -
25  src[0]);
26 }
27 
28 static int scale_fwd_y(int sy)
29 {
30  return (int)floor(scale(sy, src[1], dst[1]) + 0.5);
31 }
32 
33 static int scale_rev_x(int dx)
34 {
35  return (int)floor(scale(dx + 0.5, dst[0], src[0]));
36 }
37 
38 static int next_row(int sy, int dy)
39 {
40  sy++;
41 
42  for (;;) {
43  int y = scale_fwd_y(sy);
44 
45  if (y > dy)
46  return sy - 1;
47  sy++;
48  }
49 }
50 
51 static void alloc_buffers(void)
52 {
53  if (nalloc >= ncols)
54  return;
55 
56  nalloc = ncols;
57  trans = G_realloc(trans, nalloc * sizeof(int));
58 }
59 
60 void PNG_begin_scaled_raster(int mask, int s[2][2], int d[2][2])
61 {
62  int i;
63 
64  ncols = d[0][1] - d[0][0];
65 
66  memcpy(src, s, sizeof(src));
67  memcpy(dst, d, sizeof(dst));
68  masked = mask;
69 
70  alloc_buffers();
71 
72  for (i = 0; i < ncols; i++)
73  trans[i] = scale_rev_x(d[0][0] + i);
74 }
75 
76 int PNG_scaled_raster(int n, int row,
77  const unsigned char *red, const unsigned char *grn,
78  const unsigned char *blu, const unsigned char *nul)
79 {
80  int d_y0 = scale_fwd_y(row + 0);
81  int d_y1 = scale_fwd_y(row + 1);
82  int d_rows = d_y1 - d_y0;
83  int x0 = max(clip_left - dst[0][0], 0);
84  int x1 = min(clip_rite - dst[0][0], ncols);
85  int y0 = max(clip_top - d_y0, 0);
86  int y1 = min(clip_bot - d_y0, d_rows);
87  int x, y;
88 
89  if (y1 <= y0)
90  return next_row(row, d_y0);
91 
92  for (x = x0; x < x1; x++) {
93  int xx = dst[0][0] + x;
94  int j = trans[x];
95  int c;
96 
97  if (masked && nul && nul[j])
98  continue;
99 
100  c = get_color(red[j], grn[j], blu[j], 0);
101 
102  for (y = y0; y < y1; y++) {
103  int yy = d_y0 + y;
104 
105  grid[yy * width + xx] = c;
106  }
107  }
108 
109  modified = 1;
110 
111  return next_row(row, d_y1);
112 }
#define min(a, b)
int modified
tuple width
int clip_rite
unsigned char * grid
int y
Definition: plot.c:34
int clip_bot
int clip_top
void PNG_begin_scaled_raster(int, int[2][2], int[2][2])
int PNG_scaled_raster(int, int, const unsigned char *, const unsigned char *, const unsigned char *, const unsigned char *)
int clip_left
unsigned int get_color(int r, int g, int b, int a)
int n
Definition: dataquad.c:291
#define max(a, b)