Draw_bitmap.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * draw a line between two given points in the current color.
  3. *
  4. * Called by:
  5. * Cont_abs() in ../lib/Cont_abs.c
  6. */
  7. #include <math.h>
  8. #include "pngdriver.h"
  9. #ifndef min
  10. #define min(a,b) ((a)<(b)?(a):(b))
  11. #endif
  12. #ifndef max
  13. #define max(a,b) ((a)>(b)?(a):(b))
  14. #endif
  15. void PNG_draw_bitmap(int ncols, int nrows, int threshold,
  16. const unsigned char *buf)
  17. {
  18. int i0 = max(png.clip_left - cur_x, 0);
  19. int i1 = min(png.clip_rite - cur_x, ncols);
  20. int j0 = max(png.clip_top - cur_y, 0);
  21. int j1 = min(png.clip_bot - cur_y, nrows);
  22. if (!png.true_color) {
  23. int i, j;
  24. for (j = j0; j < j1; j++) {
  25. int y = cur_y + j;
  26. for (i = i0; i < i1; i++) {
  27. int x = cur_x + i;
  28. unsigned int k = buf[j * ncols + i];
  29. unsigned int *p = &png.grid[y * png.width + x];
  30. if (k > threshold)
  31. *p = png.current_color;
  32. }
  33. }
  34. }
  35. else {
  36. int r1, g1, b1, a1;
  37. int i, j;
  38. png_get_pixel(png.current_color, &r1, &g1, &b1, &a1);
  39. for (j = j0; j < j1; j++) {
  40. int y = cur_y + j;
  41. for (i = i0; i < i1; i++) {
  42. int x = cur_x + i;
  43. unsigned int k = buf[j * ncols + i];
  44. unsigned int *p = &png.grid[y * png.width + x];
  45. unsigned int a0, r0, g0, b0;
  46. unsigned int a, r, g, b;
  47. png_get_pixel(*p, &r0, &g0, &b0, &a0);
  48. a = (a0 * (255 - k) + a1 * k) / 255;
  49. r = (r0 * (255 - k) + r1 * k) / 255;
  50. g = (g0 * (255 - k) + g1 * k) / 255;
  51. b = (b0 * (255 - k) + b1 * k) / 255;
  52. *p = png_get_color(r, g, b, a);
  53. }
  54. }
  55. }
  56. png.modified = 1;
  57. }