Added copyright lines for files I've edited this year.
[synfig.git] / synfig-core / trunk / src / synfig / layer_shape.cpp
index 522f42e..539d715 100644 (file)
@@ -1,12 +1,12 @@
 /* === S Y N F I G ========================================================= */
 /*!    \file layer_shape.cpp
-**     \brief Template Header
+**     \brief Implementation of the "Shape" layer
 **
 **     $Id$
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 2008 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
@@ -60,8 +60,8 @@ using namespace etl;
 
 SYNFIG_LAYER_INIT(Layer_Shape);
 SYNFIG_LAYER_SET_NAME(Layer_Shape,"shape");
-SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Shape,_("Shape"));
-SYNFIG_LAYER_SET_CATEGORY(Layer_Shape,_("Internal"));
+SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Shape,N_("Shape"));
+SYNFIG_LAYER_SET_CATEGORY(Layer_Shape,N_("Internal"));
 SYNFIG_LAYER_SET_VERSION(Layer_Shape,"0.1");
 SYNFIG_LAYER_SET_CVS_ID(Layer_Shape,"$Id$");
 
@@ -245,11 +245,13 @@ struct MonoSegment
                //assumes that the rect culled away anything that would be beyond the edges
                if(ydir > 0)
                {
-                       while(y > (*++p)[1]);
+                       while(y > (*++p)[1])
+                               ;
                }
                else
                {
-                       while(y < (*++p)[1]);
+                       while(y < (*++p)[1])
+                               ;
                }
 
                //for the loop to break there must have been a slope (straight line would do nothing)
@@ -335,7 +337,7 @@ struct CurveArray
                if( (y > ymax && y > p[1][1]) || (y < ymin && y < p[1][1]) ) return 0;
 
                //degenerate line max
-               if(ymin == ymax == p[1][1])
+               if(ymin == ymax && ymax == p[1][1])
                        return 0;
 
                //degenerate accept - to the right and crossing the base line
@@ -1149,7 +1151,9 @@ Layer_Shape::clear()
 bool
 Layer_Shape::set_param(const String & param, const ValueBase &value)
 {
-       IMPORT(color);
+       IMPORT_PLUS(color, { if (color.get_a() == 0) { if (converted_blend_) {
+                                       set_blend_method(Color::BLEND_ALPHA_OVER);
+                                       color.set_a(1); } else transparent_color_ = true; } });
        IMPORT(offset);
        IMPORT(invert);
        IMPORT(antialias);
@@ -1187,7 +1191,7 @@ Layer_Shape::get_param_vocab()const
                .set_description(_("Layer_Shape Color"))
        );
        ret.push_back(ParamDesc("offset")
-               .set_local_name(_("Position"))
+               .set_local_name(_("Offset"))
        );
        ret.push_back(ParamDesc("invert")
                .set_local_name(_("Invert"))
@@ -1291,7 +1295,7 @@ Layer_Shape::get_color(Context context, const Point &p)const
 //************** SCANLINE RENDERING *********************
 void Layer_Shape::PolySpan::line_to(Real x, Real y)
 {
-       Real n[4];
+       Real n[4] = {0,0,0,0};
        bool afterx = false;
 
        const Real xin(x), yin(y);
@@ -1877,7 +1881,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);
 
@@ -1907,7 +1911,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);
 
@@ -2477,8 +2481,8 @@ Layer_Shape::accelerated_render(Context context,Surface *surface,int quality, co
 
                Rect    nrect;
 
-               Real    pixelfeatherx = abs(feather/pw),
-                               pixelfeathery = abs(feather/ph);
+               Real    pixelfeatherx = quality == 10 ? 0 : abs(feather/pw),
+                               pixelfeathery = quality == 10 ? 0 : abs(feather/ph);
 
                nrect.set_point((aabb.minx - tl[0])/pw,(aabb.miny - tl[1])/ph);
                nrect.expand((aabb.maxx - tl[0])/pw,(aabb.maxy - tl[1])/ph);
@@ -2519,7 +2523,7 @@ Layer_Shape::accelerated_render(Context context,Surface *surface,int quality, co
 
        if(cb && !cb->amount_complete(10000,10001+renddesc.get_h())) return false;
 
-       if(feather)
+       if(feather && quality != 10)
        {
                //we have to blur rather than be crappy
 
@@ -2640,6 +2644,10 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
 
        PolySpan        span;
 
+       // 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;
@@ -2855,7 +2863,7 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
 }
 
 bool
-Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
+Layer_Shape::render_shape(etl::surface<float> *surface,int /*quality*/,
                                                        const RendDesc &renddesc, ProgressCallback */*cb*/)const
 {
        // If our amount is set to zero, no need to render anything