raster.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <string.h>
  2. #include "psdriver.h"
  3. static int masked;
  4. void PS_begin_raster(int mask, int src[2][2], double dst[2][2])
  5. {
  6. const char *type = ps.true_color ? (mask ? "RASTERRGBMASK" : "RASTERRGB")
  7. : (mask ? "RASTERGRAYMASK" : "RASTERGRAY");
  8. int ssx = src[0][1] - src[0][0];
  9. int ssy = src[1][1] - src[1][0];
  10. int sox = src[0][0];
  11. int soy = src[1][0];
  12. double dsx = dst[0][1] - dst[0][0];
  13. double dsy = dst[1][1] - dst[1][0];
  14. double dox = dst[0][0];
  15. double doy = dst[1][0];
  16. masked = mask;
  17. output("gsave\n");
  18. output("%f %f translate %f %f scale\n", dox, doy, dsx, dsy);
  19. output("%d %d [%d 0 0 %d %d %d] %s\n", ssx, ssy, ssx, ssy, sox, soy,
  20. type);
  21. }
  22. int PS_raster(int n, int row,
  23. const unsigned char *red, const unsigned char *grn,
  24. const unsigned char *blu, const unsigned char *nul)
  25. {
  26. int i;
  27. for (i = 0; i < n; i++) {
  28. if (ps.true_color) {
  29. if (masked)
  30. output("%02X%02X%02X%02X", (nul && nul[i]) ? 0xFF : 0x00,
  31. red[i], grn[i], blu[i]);
  32. else
  33. output("%02X%02X%02X", red[i], grn[i], blu[i]);
  34. }
  35. else {
  36. unsigned int gray =
  37. (unsigned int)(red[i] * 0.299 + grn[i] * 0.587 +
  38. blu[i] * 0.114);
  39. if (masked)
  40. output("%02X%02X", (nul && nul[i]) ? 0xFF : 0x00, gray);
  41. else
  42. output("%02X", gray);
  43. }
  44. }
  45. output("\n");
  46. return row + 1;
  47. }
  48. void PS_end_raster(void)
  49. {
  50. output("grestore\n");
  51. }