]> git.imager.perl.org - imager.git/blobdiff - render.im
Imager 0.96 release
[imager.git] / render.im
index 08129142471eb0ca99fa39b971d02cc6c9eb7c88..947dcb211ac7688160522fea57f02434fd91d9d8 100644 (file)
--- a/render.im
+++ b/render.im
@@ -333,8 +333,8 @@ i_render_fill(i_render *r, i_img_dim x, i_img_dim y, i_img_dim width,
        }
        else if (*src) {
          for (ch = 0; ch < im->channels; ++ch) {
-           IM_WORK_T work = (destc->channel[ch] * (IM_SAMPLE_MAX - *src)
-                             + srcc->channel[ch] * *src) / IM_SAMPLE_MAX;
+           IM_WORK_T work = (destc->channel[ch] * (255 - *src)
+                             + srcc->channel[ch] * *src) / 255.0;
            destc->channel[ch] = IM_LIMIT(work);
          }
        }
@@ -353,16 +353,22 @@ i_render_fill(i_render *r, i_img_dim x, i_img_dim y, i_img_dim width,
 #/code
 }
 
+#if 0
+
+/* for debuggin */
+
 static void
 dump_src(const char *note, unsigned char const *src, i_img_dim width) {
   i_img_dim i;
-  printf("%s - %p/%d\n", note, src, width);
+  printf("%s - %p/%" i_DF "\n", note, src, i_DFc(width));
   for (i = 0; i < width; ++i) {
     printf("%02x ", src[i]);
   }
   putchar('\n');
 }
 
+#endif
+
 #code
 
 /*
@@ -479,6 +485,7 @@ IM_SUFFIX(render_color_13)(i_render *r, i_img_dim x, i_img_dim y,
   IM_COLOR *linep = r->IM_SUFFIX(line);
   int ch, channels = im->channels;
   i_img_dim fetch_offset;
+  int color_alpha = color->channel[im->channels];
 #undef STORE_COLOR
 #ifdef IM_EIGHT_BIT
 #define STORE_COLOR (*color)
@@ -492,17 +499,19 @@ IM_SUFFIX(render_color_13)(i_render *r, i_img_dim x, i_img_dim y,
 #endif
  
   fetch_offset = 0;
-  while (fetch_offset < width && *src == 0xFF) {
-    *linep++ = STORE_COLOR;
-    ++src;
-    ++fetch_offset;
+  if (color_alpha == 0xFF) {
+    while (fetch_offset < width && *src == 0xFF) {
+      *linep++ = STORE_COLOR;
+      ++src;
+      ++fetch_offset;
+    }
   }
   IM_GLIN(im, x+fetch_offset, x+width, y, linep);
   while (fetch_offset < width) {
 #ifdef IM_EIGHT_BIT
-    IM_WORK_T alpha = *src++;
+    IM_WORK_T alpha = *src++ * color_alpha / 255;
 #else
-    IM_WORK_T alpha = *src++ / 255.0;
+    IM_WORK_T alpha = *src++ * color_alpha / (255.0 * 255.0);
 #endif
     if (alpha == IM_SAMPLE_MAX)
       *linep = STORE_COLOR;
@@ -527,6 +536,7 @@ IM_SUFFIX(render_color_alpha)(i_render *r, i_img_dim x, i_img_dim y,
   int ch;
   int alpha_channel = r->im->channels - 1;
   i_img_dim fetch_offset;
+  int color_alpha = color->channel[alpha_channel];
 #undef STORE_COLOR
 #ifdef IM_EIGHT_BIT
 #define STORE_COLOR (*color)
@@ -540,17 +550,19 @@ IM_SUFFIX(render_color_alpha)(i_render *r, i_img_dim x, i_img_dim y,
 #endif
 
   fetch_offset = 0;
-  while (fetch_offset < width && *src == 0xFF) {
-    *linep++ = STORE_COLOR;
-    ++src;
-    ++fetch_offset;
+  if (color->channel[alpha_channel] == 0xFF) {
+    while (fetch_offset < width && *src == 0xFF) {
+      *linep++ = STORE_COLOR;
+      ++src;
+      ++fetch_offset;
+    }
   }
   IM_GLIN(r->im, x+fetch_offset, x+width, y, linep);
   while (fetch_offset < width) {
 #ifdef IM_EIGHT_BIT
-    IM_WORK_T src_alpha = *src++;
+    IM_WORK_T src_alpha = *src++ * color_alpha / 255;
 #else
-    IM_WORK_T src_alpha = *src++ / 255.0;
+    IM_WORK_T src_alpha = *src++ * color_alpha / (255.0 * 255.0);
 #endif
     if (src_alpha == IM_SAMPLE_MAX)
       *linep = STORE_COLOR;