]> git.imager.perl.org - imager.git/blobdiff - fills.c
RT#128481: fix handling of GIF files with no images
[imager.git] / fills.c
diff --git a/fills.c b/fills.c
index 76508c98af6ed79221083562c47c174a6de4d880..b2305802b545dee2522236267bd22bd103942429 100644 (file)
--- a/fills.c
+++ b/fills.c
@@ -1,6 +1,7 @@
 #define IMAGER_NO_CONTEXT
 #include "imager.h"
 #include "imageri.h"
+#include <assert.h>
 
 /*
 =head1 NAME
@@ -429,13 +430,15 @@ If C<cust_hatch> is NULL then one of the standard hatches is used.
 
 (C<dx>, C<dy>) are an offset into the hatch which can be used to hatch
 adjoining areas out of alignment, or to align the origin of a hatch
-with the the side of a filled area.
+with the side of a filled area.
 
 =cut
 */
 i_fill_t *
 i_new_fill_hatch(const i_color *fg, const i_color *bg, int combine, int hatch, 
             const unsigned char *cust_hatch, i_img_dim dx, i_img_dim dy) {
+  assert(fg);
+  assert(bg);
   return i_new_hatch_low(fg, bg, NULL, NULL, combine, hatch, cust_hatch, 
                          dx, dy);
 }
@@ -457,13 +460,15 @@ If C<cust_hatch> is NULL then one of the standard hatches is used.
 
 (C<dx>, C<dy>) are an offset into the hatch which can be used to hatch
 adjoining areas out of alignment, or to align the origin of a hatch
-with the the side of a filled area.
+with the side of a filled area.
 
 =cut
 */
 i_fill_t *
 i_new_fill_hatchf(const i_fcolor *fg, const i_fcolor *bg, int combine, int hatch, 
                  const unsigned char *cust_hatch, i_img_dim dx, i_img_dim dy) {
+  assert(fg);
+  assert(bg);
   return i_new_hatch_low(NULL, NULL, fg, bg, combine, hatch, cust_hatch, 
                          dx, dy);
 }
@@ -642,25 +647,23 @@ i_new_hatch_low(const i_color *fg, const i_color *bg,
   i_fill_hatch_t *fill = mymalloc(sizeof(i_fill_hatch_t)); /* checked 14jul05 tonyc */
 
   *fill = hatch_fill_proto;
-  /* Some Sun C didn't like the condition expressions that were here.
-     See https://rt.cpan.org/Ticket/Display.html?id=21944
-   */
-  if (fg)
+  if (fg && bg) {
     fill->fg = *fg;
-  else
-    fill->fg = fcolor_to_color(ffg);
-  if (bg)
     fill->bg = *bg;
-  else
+    fill->ffg = color_to_fcolor(fg);
+    fill->fbg = color_to_fcolor(bg);
+  }
+  else if (ffg && fbg) {
+    fill->fg = fcolor_to_color(ffg);
     fill->bg = fcolor_to_color(fbg);
-  if (ffg) 
     fill->ffg = *ffg;
-  else
-    fill->ffg = color_to_fcolor(fg);
-  if (fbg)
     fill->fbg = *fbg;
-  else
-    fill->fbg = color_to_fcolor(bg);
+  }
+  else {
+    assert(0);
+    /* NOTREACHED */
+  }
+  
   if (combine) {
     i_get_combine(combine, &fill->base.combine, &fill->base.combinef);
   }
@@ -672,8 +675,10 @@ i_new_hatch_low(const i_color *fg, const i_color *bg,
     memcpy(fill->hatch, cust_hatch, 8);
   }
   else {
-    if (hatch > sizeof(builtin_hatches)/sizeof(*builtin_hatches)) 
+    if (hatch >= sizeof(builtin_hatches)/sizeof(*builtin_hatches)
+       || hatch < 0) {
       hatch = 0;
+    }
     memcpy(fill->hatch, builtin_hatches[hatch], 8);
   }
   fill->dx = dx & 7;
@@ -720,7 +725,7 @@ fill_hatch(i_fill_t *fill, i_img_dim x, i_img_dim y, i_img_dim width,
 
 The floating sample fill function for hatched fills.
 
-=back
+=cut
 */
 static void
 fill_hatchf(i_fill_t *fill, i_img_dim x, i_img_dim y, i_img_dim width,
@@ -758,14 +763,16 @@ static i_color interp_i_color(i_color before, i_color after, double pos,
   pos -= floor(pos);
   for (ch = 0; ch < channels; ++ch)
     out.channel[ch] = (1-pos) * before.channel[ch] + pos * after.channel[ch];
-  if (channels > 3 && out.channel[3])
-    for (ch = 0; ch < channels; ++ch)
+  if (channels > 3 && out.channel[3]) {
+    for (ch = 0; ch < channels; ++ch) {
       if (ch != 3) {
         int temp = out.channel[ch] * 255 / out.channel[3];
         if (temp > 255)
           temp = 255;
         out.channel[ch] = temp;
       }
+    }
+  }
 
   return out;
 }
@@ -780,14 +787,16 @@ static i_fcolor interp_i_fcolor(i_fcolor before, i_fcolor after, double pos,
   pos -= floor(pos);
   for (ch = 0; ch < channels; ++ch)
     out.channel[ch] = (1-pos) * before.channel[ch] + pos * after.channel[ch];
-  if (out.channel[3])
-    for (ch = 0; ch < channels; ++ch)
+  if (out.channel[3]) {
+    for (ch = 0; ch < channels; ++ch) {
       if (ch != 3) {
         int temp = out.channel[ch] / out.channel[3];
         if (temp > 1.0)
           temp = 1.0;
         out.channel[ch] = temp;
       }
+    }
+  }
 
   return out;
 }
@@ -857,7 +866,7 @@ fill_image(i_fill_t *fill, i_img_dim x, i_img_dim y, i_img_dim width,
       }
       else if (f->yoff) {
         ry += ix * f->yoff;
-        iy = ry / f->src->xsize;
+        iy = ry / f->src->ysize;
       }
       rx -= ix * f->src->xsize;
       ry -= iy * f->src->ysize;