Partially fix 1823082. It works OK for polygon, region, outline and star now. Plant...
[synfig.git] / synfig-core / trunk / src / synfig / layer_shape.cpp
index 2c2d71d..a686bcf 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -233,7 +234,7 @@ struct MonoSegment
 
        int intersect(Real x,Real y) const
        {
-               if((y < aabb.miny) || (y > aabb.maxy) || (x < aabb.minx)) return 0;
+               if((y < aabb.miny+EPSILON) || (y > aabb.maxy) || (x < aabb.minx)) return 0;
                if(x > aabb.maxx) return ydir;
 
                //int i = 0;
@@ -316,7 +317,7 @@ struct CurveArray
                degrees.push_back(2);
        }
 
-       static int intersect_conic(Real x, Real y, Point *p, int level = 0)
+       static int intersect_conic(Real x, Real y, Point *p, int /*level*/ = 0)
        {
                Real ymin,ymax,xmin,xmax;
                int intersects = 0;
@@ -440,7 +441,7 @@ struct CurveArray
                const Real cn[4] = {a,b,c,d};
                Real p,dp,newt,oldpmag=FLT_MAX;
 
-               //eval cubic eqn and it's derivative
+               //eval cubic eqn and its derivative
                for(;;)
                {
                        p = cn[0]*t + cn[1];
@@ -471,7 +472,7 @@ struct CurveArray
                }
        }
 
-       static int intersect_cubic(Real x, Real y, Point *p, int level = 0)
+       static int intersect_cubic(Real x, Real y, Point *p, int /*level*/ = 0)
        {
                const Real INVALIDROOT = -FLT_MAX;
                Real ymin,ymax,xmin,xmax;
@@ -712,7 +713,7 @@ struct Layer_Shape::Intersector
 {
        Rect    aabb;
 
-       //! true iff aabb hasn't been initialised yet
+       //! true iff aabb hasn't been initialized yet
        bool    initaabb;
 
        int     flags;
@@ -1327,7 +1328,7 @@ void Layer_Shape::PolySpan::line_to(Real x, Real y)
                        //generate data for the ending clipped info
                        if(y > window.maxy)
                        {
-                               //intial line to intersection (and degenerate)
+                               //initial line to intersection (and degenerate)
                                n[2] = x + (window.maxy - y) * dx / dy;
 
                                //intersect coords
@@ -1351,7 +1352,7 @@ void Layer_Shape::PolySpan::line_to(Real x, Real y)
                        //generate data for the ending clipped info
                        if(y < window.miny)
                        {
-                               //intial line to intersection (and degenerate)
+                               //initial line to intersection (and degenerate)
                                n[2] = x + (window.miny - y) * dx / dy;
 
                                //intersect coords
@@ -1401,7 +1402,7 @@ void Layer_Shape::PolySpan::line_to(Real x, Real y)
                                //generate data for the ending clipped info
                                if(x > window.maxx)
                                {
-                                       //intial line to intersection (and degenerate)
+                                       //initial line to intersection (and degenerate)
                                        n[2] = y + (window.maxx - x) * dy / dx;
 
                                        n[0] = window.maxx;
@@ -1430,7 +1431,7 @@ void Layer_Shape::PolySpan::line_to(Real x, Real y)
                                //generate data for the ending clipped info
                                if(x < window.minx)
                                {
-                                       //intial line to intersection (and degenerate)
+                                       //initial line to intersection (and degenerate)
                                        n[2] = y + (window.minx - x) * dy / dx;
 
                                        n[0] = window.minx;
@@ -1547,7 +1548,7 @@ void Layer_Shape::PolySpan::conic_to(Real x1, Real y1, Real x, Real y)
        {
                if(num >= MAX_SUBDIVISION_SIZE)
                {
-                       warning("Curve subdivision somehow ran out of space while tesselating!");
+                       warning("Curve subdivision somehow ran out of space while tessellating!");
 
                        //do something...
                        assert(0);
@@ -1620,7 +1621,7 @@ void Layer_Shape::PolySpan::cubic_to(Real x1, Real y1, Real x2, Real y2, Real x,
        {
                if(num >= MAX_SUBDIVISION_SIZE)
                {
-                       warning("Curve subdivision somehow ran out of space while tesselating!");
+                       warning("Curve subdivision somehow ran out of space while tessellating!");
 
                        //do something...
                        assert(0);
@@ -1698,7 +1699,7 @@ void Layer_Shape::PolySpan::draw_scanline(int y, Real x1, Real fy1, Real x2, Rea
        //case all in same pixel
        if(ix1 == ix2)  //impossible for degenerate case (covered by the previous cases)
        {
-               current.addcover(dy,(fx1 + fx2)*dy/2); //horizontal trapazoid area
+               current.addcover(dy,(fx1 + fx2)*dy/2); //horizontal trapezoid area
                return;
        }
 
@@ -1712,7 +1713,7 @@ void Layer_Shape::PolySpan::draw_scanline(int y, Real x1, Real fy1, Real x2, Rea
                mult = (1 - fx1)*dydx;  //next y intersection diff value (at 1)
 
                //first pixel
-               current.addcover(mult,(1 + fx1)*mult/2);        // fx1,fy1,1,fy@1 - starting trapazoidal area
+               current.addcover(mult,(1 + fx1)*mult/2);        // fx1,fy1,1,fy@1 - starting trapezoidal area
 
                //move to the next pixel
                fy1 += mult;
@@ -1748,7 +1749,7 @@ void Layer_Shape::PolySpan::draw_scanline(int y, Real x1, Real fy1, Real x2, Rea
                mult = fx1*dydx;        //next y intersection diff value
 
                //first pixel
-               current.addcover(mult,fx1*mult/2);      // fx1,fy1,0,fy@0 - starting trapazoidal area
+               current.addcover(mult,fx1*mult/2);      // fx1,fy1,0,fy@0 - starting trapezoidal area
 
                //move to next pixel
                fy1 += mult;
@@ -1876,7 +1877,7 @@ void Layer_Shape::PolySpan::draw_line(Real x1, Real y1, Real x2, Real y2)
 
                mult = (1 - fy1) * dxdy;
 
-               //x interset scanline
+               //x intersect scanline
                x_from = x1 + mult;
                draw_scanline(iy1,x1,fy1,x_from,1);
 
@@ -1906,7 +1907,7 @@ void Layer_Shape::PolySpan::draw_line(Real x1, Real y1, Real x2, Real y2)
 
                mult = fy1 * dxdy;
 
-               //x interset scanline
+               //x intersect scanline
                x_from = x1 + mult;
                draw_scanline(iy1,x1,fy1,x_from,0);
 
@@ -2614,7 +2615,7 @@ Layer_Shape::accelerated_render(Context context,Surface *surface,int quality, co
 }
 
 bool
-Layer_Shape::render_shape(Surface *surface,bool useblend,int quality,
+Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                                        const RendDesc &renddesc, ProgressCallback *cb)const
 {
        int tmp(0);
@@ -2639,7 +2640,11 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int quality,
 
        PolySpan        span;
 
-       //optimization for tesselating only inside tiles
+       // if the pixels are zero sized then we're too zoomed out to see anything
+       if (pw == 0 || ph == 0)
+               return true;
+
+       //optimization for tessellating only inside tiles
        span.window.minx = 0;
        span.window.miny = 0;
        span.window.maxx = w;
@@ -2854,8 +2859,8 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int quality,
 }
 
 bool
-Layer_Shape::render_shape(surface<float> *surface,int quality,
-                                                       const RendDesc &renddesc, ProgressCallback *cb)const
+Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
+                                                       const RendDesc &renddesc, ProgressCallback */*cb*/)const
 {
        // If our amount is set to zero, no need to render anything
        if(!get_amount())
@@ -2875,7 +2880,7 @@ Layer_Shape::render_shape(surface<float> *surface,int quality,
 
        PolySpan        span;
 
-       //optimization for tesselating only inside tiles
+       //optimization for tessellating only inside tiles
        span.window.minx = 0;
        span.window.miny = 0;
        span.window.maxx = w;