X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Flayer_shape.cpp;h=a686bcffa3cecd4bcbf46829f029a6112368c092;hb=2e98eca8dbf8e348f2456d9a9372cf23055a81c9;hp=2c2d71d72edf25ce1ee31c1d3006d06bb2bff04d;hpb=0c9d20cc16815ec51cb7edec3ead326977f1c3c5;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/layer_shape.cpp b/synfig-core/trunk/src/synfig/layer_shape.cpp index 2c2d71d..a686bcf 100644 --- a/synfig-core/trunk/src/synfig/layer_shape.cpp +++ b/synfig-core/trunk/src/synfig/layer_shape.cpp @@ -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 *surface,int quality, - const RendDesc &renddesc, ProgressCallback *cb)const +Layer_Shape::render_shape(surface *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 *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;