GRASS Programmer's Manual  6.4.2(2012)
cairodriver/Raster.c
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines