20 #define MAX_IMAGE_SIZE 32767 22 #define MIN(a,b) ((a)<(b)?(a):(b)) 25 #define MAX(a,b) ((a)>(b)?(a):(b)) 28 static int src_t, src_b, src_l, src_r, src_w, src_h;
29 static int dst_t, dst_b, dst_l, dst_r, dst_w, dst_h;
33 static cairo_surface_t *src_surf;
34 static unsigned char *src_data;
35 static int src_stride, ca_row;
39 static double scale(
double k,
int src_0,
int src_1,
int dst_0,
int dst_1)
41 return dst_0 + (double) (k - src_0) * (dst_1 - dst_0) / (src_1 - src_0);
44 static int scale_fwd_y(
int sy)
46 return (
int)floor(scale(sy, src_t, src_b, dst_t, dst_b) + 0.5);
49 static int scale_rev_x(
int dx)
51 return (
int)floor(scale(dx + 0.5, dst_l, dst_r, src_l, src_r));
54 static int next_row(
int sy,
int dy)
59 int y = scale_fwd_y(sy);
79 cairo_status_t status;
88 src_w = src_r - src_l;
89 src_h = src_b - src_t;
91 dst_l = (int) floor(d[0][0] + 0.5);
92 dst_r = (int) floor(d[0][1] + 0.5);
93 dst_t = (int) floor(d[1][0] + 0.5);
94 dst_b = (int) floor(d[1][1] + 0.5);
96 dst_w = dst_r - dst_l;
97 dst_h = dst_b - dst_t;
99 G_debug(1,
"Cairo_begin_raster(): masked=%d, src_lrtb=%d %d %d %d -> w/h=%d %d, " 100 "dst_lrtb=%d %d %d %d -> w/h=%d %d",
101 masked, src_l, src_r, src_t, src_b, src_w, src_h,
102 dst_l, dst_r, dst_t, dst_b, dst_w, dst_h);
105 src_surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
ca.
width,
ca.
height);
106 status = cairo_surface_status(src_surf);
107 if (status != CAIRO_STATUS_SUCCESS)
109 _(
"Failed to create cairo surface"),
113 src_data = cairo_image_surface_get_data(src_surf);
114 src_stride = cairo_image_surface_get_stride(src_surf);
118 trans =
G_malloc(dst_w *
sizeof(
int));
119 for (i = 0; i < dst_w; i++)
120 trans[i] = scale_rev_x(dst_l + i);
133 const unsigned char *red,
const unsigned char *grn,
134 const unsigned char *blu,
const unsigned char *nul)
136 int d_y0 = scale_fwd_y(row + 0);
137 int d_y1 = scale_fwd_y(row + 1);
138 int d_rows = d_y1 - d_y0;
139 int x0 =
MAX(0 - dst_l, 0);
141 int y0 =
MAX(0 - d_y0, 0);
146 return next_row(row, d_y1);
148 G_debug(3,
"Cairo_raster(): n=%d row=%d", n, row);
150 for (x = x0; x < x1; x++) {
155 if (masked && nul && nul[j])
158 unsigned int r = red[j];
159 unsigned int g = grn[j];
160 unsigned int b = blu[j];
161 unsigned int a = 0xFF;
162 c = (a << 24) + (r << 16) + (g << 8) + (b << 0);
165 for (y = y0; y < y1; y++) {
167 *(
unsigned int *)(src_data + yy * src_stride + xx * 4) = c;
174 return next_row(row, d_y1);
182 G_debug(1,
"Cairo_end_raster()");
188 cairo_surface_mark_dirty(src_surf);
189 cairo_set_source_surface(
cairo, src_surf, 0, 0);
190 cairo_pattern_set_filter(cairo_get_source(
cairo), CAIRO_FILTER_NEAREST);
192 cairo_restore(
cairo);
196 cairo_surface_destroy(src_surf);
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void Cairo_begin_raster(int mask, int s[2][2], double d[2][2])
Start drawing raster.
void G_free(void *)
Free allocated memory.
int Cairo_raster(int n, int row, const unsigned char *red, const unsigned char *grn, const unsigned char *blu, const unsigned char *nul)
Draw raster row.
void Cairo_end_raster(void)
Finish drawing raster.
GRASS cairo display driver - header file.
int G_debug(int, const char *,...) __attribute__((format(printf