GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include "cairodriver.h" 00002 00003 static int src_t, src_b, src_l, src_r, src_w, src_h; 00004 static int dst_t, dst_b, dst_l, dst_r, dst_w, dst_h; 00005 00006 static cairo_surface_t *src_surf; 00007 static unsigned char *src_data; 00008 static int src_stride; 00009 00010 static int masked; 00011 00012 void Cairo_begin_scaled_raster(int mask, int s[2][2], int d[2][2]) 00013 { 00014 G_debug(1, "Cairo_begin_scaled_raster: %d %d %d %d %d %d %d %d %d", 00015 mask, s[0][0], s[0][1], s[1][0], s[1][1], d[0][0], d[0][1], 00016 d[1][0], d[1][1]); 00017 00018 masked = mask; 00019 00020 /* TODO: are top and left swapped? */ 00021 00022 src_l = s[0][0]; 00023 src_r = s[0][1]; 00024 src_t = s[1][0]; 00025 src_b = s[1][1]; 00026 00027 src_w = src_r - src_l; 00028 src_h = src_b - src_t; 00029 00030 dst_l = d[0][0]; 00031 dst_r = d[0][1]; 00032 dst_t = d[1][0]; 00033 dst_b = d[1][1]; 00034 00035 dst_w = dst_r - dst_l; 00036 dst_h = dst_b - dst_t; 00037 00038 G_debug(1, " src (TBLR): %d %d %d %d, dst (TBLR) %d %d %d %d", 00039 src_t, src_b, src_l, src_r, dst_t, dst_b, dst_l, dst_r); 00040 00041 /* create source surface */ 00042 src_surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, src_w, src_h); 00043 if (cairo_surface_status(src_surf) != CAIRO_STATUS_SUCCESS) 00044 G_fatal_error("Cairo_begin_scaled_raster: Failed to create surface"); 00045 00046 src_data = cairo_image_surface_get_data(src_surf); 00047 src_stride = cairo_image_surface_get_stride(src_surf); 00048 } 00049 00050 int Cairo_scaled_raster(int n, int row, 00051 const unsigned char *red, const unsigned char *grn, 00052 const unsigned char *blu, const unsigned char *nul) 00053 { 00054 unsigned int *dst = 00055 (unsigned int *)(src_data + (row - src_t) * src_stride); 00056 int i; 00057 00058 G_debug(3, "Cairo_scaled_raster: %d %d", n, row); 00059 00060 for (i = 0; i < n; i++) { 00061 if (masked && nul && nul[i]) 00062 *dst++ = 0; 00063 else { 00064 unsigned int r = red[i]; 00065 unsigned int g = grn[i]; 00066 unsigned int b = blu[i]; 00067 unsigned int a = 0xFF; 00068 00069 *dst++ = (a << 24) + (r << 16) + (g << 8) + (b << 0); 00070 } 00071 } 00072 00073 return row + 1; 00074 } 00075 00076 void Cairo_end_scaled_raster(void) 00077 { 00078 G_debug(1, "Cairo_end_scaled_raster"); 00079 00080 /* paint source surface onto dstination (scaled) */ 00081 cairo_save(cairo); 00082 cairo_translate(cairo, dst_l, dst_t); 00083 cairo_scale(cairo, (double)dst_w / (double)src_w, 00084 (double)dst_h / (double)src_h); 00085 cairo_set_source_surface(cairo, src_surf, 0, 0); 00086 cairo_paint(cairo); 00087 cairo_restore(cairo); 00088 00089 /* cleanup */ 00090 cairo_surface_destroy(src_surf); 00091 modified = 1; 00092 }