summaryrefslogtreecommitdiff
path: root/render/pixmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/pixmap.c')
-rw-r--r--render/pixmap.c125
1 files changed, 84 insertions, 41 deletions
diff --git a/render/pixmap.c b/render/pixmap.c
index 84a542b9..6ef9d75c 100644
--- a/render/pixmap.c
+++ b/render/pixmap.c
@@ -5,7 +5,7 @@ fz_newpixmap(fz_pixmap **pixp, fz_colorspace *cs, int x, int y, int w, int h, in
{
fz_pixmap *pix;
- pix = *pixp = fz_malloc(sizeof (fz_pixmap));
+ pix = *pixp = fz_malloc(sizeof(fz_pixmap));
if (!pix)
return fz_outofmem;
@@ -43,51 +43,32 @@ fz_clearpixmap(fz_pixmap *pix)
}
void
-fz_debugpixmap(fz_pixmap *pix)
+fz_convertpixmap(fz_pixmap *src, fz_pixmap *dst)
{
- int x, y;
-
- FILE *ppm = fopen("out.ppm", "w");
- FILE *pgm = fopen("out.pgm", "w");
-
- fprintf(ppm, "P6\n%d %d\n255\n", pix->w, pix->h);
- fprintf(pgm, "P5\n%d %d\n255\n", pix->w, pix->h);
-
- if (pix->n == 3 && pix->a == 1)
- {
- for (y = 0; y < pix->h; y++)
- for (x = 0; x < pix->w; x++)
- {
- int r = pix->samples[x * 4 + y * pix->stride + 0];
- int g = pix->samples[x * 4 + y * pix->stride + 1];
- int b = pix->samples[x * 4 + y * pix->stride + 2];
- int a = pix->samples[x * 4 + y * pix->stride + 3];
+ float srcv[32];
+ float dstv[32];
+ int y, x, k;
+ int sna = src->n + src->a;
+ int dna = dst->n + dst->a;
- //putc(r, ppm);
- //putc(g, ppm);
- //putc(b, ppm);
- putc(((r * a) / 255) + (255 - a), ppm);
- putc(((g * a) / 255) + (255 - a), ppm);
- putc(((b * a) / 255) + (255 - a), ppm);
+printf("convert pixmap from %s to %s\n", src->cs->name, dst->cs->name);
- putc(a, pgm);
- }
- }
- else if (pix->n == 0 && pix->a == 1)
+ for (y = 0; y < src->h; y++)
{
- for (y = 0; y < pix->h; y++)
- for (x = 0; x < pix->w; x++)
- {
- int a = pix->samples[x + y * pix->stride];
- putc(0, ppm);
- putc(0, ppm);
- putc(0, ppm);
- putc(a, pgm);
- }
+ for (x = 0; x < src->w; x++)
+ {
+ for (k = 0; k < src->n; k++)
+ srcv[k] = src->samples[ y * src->stride + x * sna + k ] / 255.0;
+ fz_convertcolor(src->cs, srcv, dst->cs, dstv);
+ for (k = 0; k < dst->n; k++)
+ dst->samples[ y * dst->stride + x * dna + k ] = dstv[k] * 255;
+ if (src->a && dst->a)
+ dst->samples[ y * dst->stride + x * dna + dst->n ] =
+ src->samples[ y * src->stride + x * sna + src->n ];
+ else if (dst->a)
+ dst->samples[ y * dst->stride + x * dna + dst->n ] = 255;
+ }
}
-
- fclose(ppm);
- fclose(pgm);
}
void
@@ -147,3 +128,65 @@ fz_blendmask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk)
}
}
+void
+fz_debugpixmap(fz_pixmap *pix)
+{
+ int x, y;
+
+ FILE *ppm = fopen("out.ppm", "w");
+ FILE *pgm = fopen("out.pgm", "w");
+
+ fprintf(ppm, "P6\n%d %d\n255\n", pix->w, pix->h);
+ fprintf(pgm, "P5\n%d %d\n255\n", pix->w, pix->h);
+
+ if (pix->n == 3 && pix->a == 1)
+ {
+ for (y = 0; y < pix->h; y++)
+ for (x = 0; x < pix->w; x++)
+ {
+ int r = pix->samples[x * 4 + y * pix->stride + 0];
+ int g = pix->samples[x * 4 + y * pix->stride + 1];
+ int b = pix->samples[x * 4 + y * pix->stride + 2];
+ int a = pix->samples[x * 4 + y * pix->stride + 3];
+
+ putc(r, ppm);
+ putc(g, ppm);
+ putc(b, ppm);
+ // putc(((r * a) / 255) + (255 - a), ppm);
+ // putc(((g * a) / 255) + (255 - a), ppm);
+ // putc(((b * a) / 255) + (255 - a), ppm);
+
+ putc(a, pgm);
+ }
+ }
+ if (pix->n == 3 && pix->a == 0)
+ {
+ for (y = 0; y < pix->h; y++)
+ for (x = 0; x < pix->w; x++)
+ {
+ int r = pix->samples[x * 3 + y * pix->stride + 0];
+ int g = pix->samples[x * 3 + y * pix->stride + 1];
+ int b = pix->samples[x * 3 + y * pix->stride + 2];
+ putc(r, ppm);
+ putc(g, ppm);
+ putc(b, ppm);
+ putc(255, pgm);
+ }
+ }
+ else if (pix->n == 0 && pix->a == 1)
+ {
+ for (y = 0; y < pix->h; y++)
+ for (x = 0; x < pix->w; x++)
+ {
+ int a = pix->samples[x + y * pix->stride];
+ putc(0, ppm);
+ putc(0, ppm);
+ putc(0, ppm);
+ putc(a, pgm);
+ }
+ }
+
+ fclose(ppm);
+ fclose(pgm);
+}
+