Draw_bitmap.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "cairodriver.h"
  2. static cairo_surface_t *fix_surface(cairo_surface_t * src)
  3. {
  4. int width = cairo_image_surface_get_width(src);
  5. int height = cairo_image_surface_get_height(src);
  6. int stride = cairo_image_surface_get_stride(src);
  7. cairo_format_t format = cairo_image_surface_get_format(src);
  8. unsigned char *data = cairo_image_surface_get_data(src);
  9. cairo_surface_t *dst = cairo_image_surface_create(format, width, height);
  10. int stride2 = cairo_image_surface_get_stride(dst);
  11. unsigned char *data2 = cairo_image_surface_get_data(dst);
  12. int i;
  13. for (i = 0; i < height; i++) {
  14. void *p = data + i * stride;
  15. void *q = data2 + i * stride2;
  16. int n = stride < stride2 ? stride : stride2;
  17. memcpy(q, p, n);
  18. }
  19. cairo_surface_destroy(src);
  20. return dst;
  21. }
  22. void Cairo_draw_bitmap(int ncols, int nrows, int threshold,
  23. const unsigned char *buf)
  24. {
  25. cairo_surface_t *surf;
  26. G_debug(1, "Cairo_draw_bitmap: %d %d %d", ncols, nrows, threshold);
  27. surf = cairo_image_surface_create_for_data((unsigned char *)buf,
  28. CAIRO_FORMAT_A8, ncols, nrows,
  29. ncols);
  30. if (cairo_surface_status(surf) != CAIRO_STATUS_SUCCESS)
  31. G_fatal_error("Cairo_draw_bitmap: Failed to create source");
  32. surf = fix_surface(surf);
  33. cairo_mask_surface(cairo, surf, cur_x, cur_y);
  34. cairo_surface_destroy(surf);
  35. ca.modified = 1;
  36. }