res_bitmap.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "fitz-internal.h"
  2. fz_bitmap *
  3. fz_new_bitmap(fz_context *ctx, int w, int h, int n)
  4. {
  5. fz_bitmap *bit;
  6. bit = fz_malloc_struct(ctx, fz_bitmap);
  7. bit->refs = 1;
  8. bit->w = w;
  9. bit->h = h;
  10. bit->n = n;
  11. /* Span is 32 bit aligned. We may want to make this 64 bit if we
  12. * use SSE2 etc. */
  13. bit->stride = ((n * w + 31) & ~31) >> 3;
  14. bit->samples = fz_malloc_array(ctx, h, bit->stride);
  15. return bit;
  16. }
  17. fz_bitmap *
  18. fz_keep_bitmap(fz_context *ctx, fz_bitmap *bit)
  19. {
  20. if (bit)
  21. bit->refs++;
  22. return bit;
  23. }
  24. void
  25. fz_drop_bitmap(fz_context *ctx, fz_bitmap *bit)
  26. {
  27. if (bit && --bit->refs == 0)
  28. {
  29. fz_free(ctx, bit->samples);
  30. fz_free(ctx, bit);
  31. }
  32. }
  33. void
  34. fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit)
  35. {
  36. memset(bit->samples, 0, bit->stride * bit->h);
  37. }
  38. /*
  39. * Write bitmap to PBM file
  40. */
  41. void
  42. fz_write_pbm(fz_context *ctx, fz_bitmap *bitmap, char *filename)
  43. {
  44. FILE *fp;
  45. unsigned char *p;
  46. int h, bytestride;
  47. fp = fopen(filename, "wb");
  48. if (!fp)
  49. fz_throw(ctx, "cannot open file '%s': %s", filename, strerror(errno));
  50. assert(bitmap->n == 1);
  51. fprintf(fp, "P4\n%d %d\n", bitmap->w, bitmap->h);
  52. p = bitmap->samples;
  53. h = bitmap->h;
  54. bytestride = (bitmap->w + 7) >> 3;
  55. while (h--)
  56. {
  57. fwrite(p, 1, bytestride, fp);
  58. p += bitmap->stride;
  59. }
  60. fclose(fp);
  61. }
  62. fz_colorspace *fz_pixmap_colorspace(fz_context *ctx, fz_pixmap *pix)
  63. {
  64. if (!pix)
  65. return NULL;
  66. return pix->colorspace;
  67. }
  68. int fz_pixmap_components(fz_context *ctx, fz_pixmap *pix)
  69. {
  70. if (!pix)
  71. return 0;
  72. return pix->n;
  73. }
  74. unsigned char *fz_pixmap_samples(fz_context *ctx, fz_pixmap *pix)
  75. {
  76. if (!pix)
  77. return NULL;
  78. return pix->samples;
  79. }
  80. void fz_bitmap_details(fz_bitmap *bit, int *w, int *h, int *n, int *stride)
  81. {
  82. if (!bit)
  83. {
  84. if (w)
  85. *w = 0;
  86. if (h)
  87. *h = 0;
  88. if (n)
  89. *n = 0;
  90. if (stride)
  91. *stride = 0;
  92. return;
  93. }
  94. if (w)
  95. *w = bit->w;
  96. if (h)
  97. *h = bit->h;
  98. if (n)
  99. *n = bit->n;
  100. if (stride)
  101. *stride = bit->stride;
  102. }