Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-core / trunk / src / synfig / layer_shape.cpp
index 2d8af12..2116d2f 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
@@ -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
@@ -945,7 +947,7 @@ struct PenMark
        void setcover(Real c, Real a)                           { cover = c; area = a; }
        void addcover(Real c, Real a)                           { cover += c; area += a; }
 
-       bool operator < (const PenMark &rhs) const
+       bool operator<(const PenMark &rhs) const
        {
                return y == rhs.y ? x < rhs.x : y < rhs.y;
        }
@@ -1122,7 +1124,7 @@ Layer_Shape::Layer_Shape(const Real &a, const Color::BlendMethod m):
        Layer_Composite (a,m),
        edge_table              (new Intersector),
        color                   (Color::black()),
-       offset                  (0,0),
+       origin                  (0,0),
        invert                  (false),
        antialias               (true),
        blurtype                (Blur::FASTGAUSSIAN),
@@ -1149,14 +1151,18 @@ Layer_Shape::clear()
 bool
 Layer_Shape::set_param(const String & param, const ValueBase &value)
 {
-       IMPORT(color);
-       IMPORT(offset);
+       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(origin);
        IMPORT(invert);
        IMPORT(antialias);
-       IMPORT(feather);
+       IMPORT_PLUS(feather, if(feather<0)feather=0;);
        IMPORT(blurtype);
        IMPORT(winding_style);
 
+       IMPORT_AS(origin,"offset");
+
        return Layer_Composite::set_param(param,value);
 }
 
@@ -1164,7 +1170,7 @@ ValueBase
 Layer_Shape::get_param(const String &param)const
 {
        EXPORT(color);
-       EXPORT(offset);
+       EXPORT(origin);
        EXPORT(invert);
        EXPORT(antialias);
        EXPORT(feather);
@@ -1186,8 +1192,8 @@ Layer_Shape::get_param_vocab()const
                .set_local_name(_("Color"))
                .set_description(_("Layer_Shape Color"))
        );
-       ret.push_back(ParamDesc("offset")
-               .set_local_name(_("Position"))
+       ret.push_back(ParamDesc("origin")
+               .set_local_name(_("Origin"))
        );
        ret.push_back(ParamDesc("invert")
                .set_local_name(_("Invert"))
@@ -1223,7 +1229,7 @@ Layer_Shape::get_param_vocab()const
 synfig::Layer::Handle
 Layer_Shape::hit_check(synfig::Context context, const synfig::Point &p)const
 {
-       Point pos(p-offset);
+       Point pos(p-origin);
 
        int intercepts = edge_table->intersect(pos[0],pos[1]);
 
@@ -1270,7 +1276,7 @@ Layer_Shape::get_color(Context context, const Point &p)const
        if(feather)
                pp = Blur(feather,feather,blurtype)(p);
 
-       Point pos(pp-offset);
+       Point pos(pp-origin);
 
        int intercepts = edge_table->intersect(pos[0],pos[1]);
 
@@ -1279,7 +1285,7 @@ Layer_Shape::get_color(Context context, const Point &p)const
        bool intersect = ((!!intercepts) ^ invert);
 
        if(!intersect)
-               return context.get_color(pp);
+               return Color::blend(Color::alpha(),context.get_color(pp),get_amount(),get_blend_method());
 
        //Ok, we're inside... bummmm ba bum buM...
        if(get_blend_method() == Color::BLEND_STRAIGHT && get_amount() == 1)
@@ -1291,7 +1297,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);
@@ -2470,15 +2476,15 @@ Layer_Shape::accelerated_render(Context context,Surface *surface,int quality, co
        if(is_solid_color() && invert)
        {
                Rect aabb = edge_table->aabb;
-               Point tl = renddesc.get_tl() - offset;
+               Point tl = renddesc.get_tl() - origin;
 
                Real    pw = renddesc.get_pw(),
                                ph = renddesc.get_ph();
 
                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 +2525,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
 
@@ -2719,9 +2725,9 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::MOVE_TO:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        if(curnum == 0)
                                        {
@@ -2746,9 +2752,9 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::LINE_TO:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        tangent[0] = x - span.cur_x;
                                        tangent[1] = y - span.cur_y;
@@ -2761,14 +2767,14 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::CONIC_TO:
                                {
                                        x = data[curnum+1][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+1][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x1 = data[curnum][0];
-                                       x1 = (x1 - tl[0] + offset[0])*pw;
+                                       x1 = (x1 - tl[0] + origin[0])*pw;
                                        y1 = data[curnum][1];
-                                       y1 = (y1 - tl[1] + offset[1])*ph;
+                                       y1 = (y1 - tl[1] + origin[1])*ph;
 
                                        tangent[0] = 2*(x - x1);
                                        tangent[1] = 2*(y - y1);
@@ -2781,9 +2787,9 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::CONIC_TO_SMOOTH:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x1 = span.cur_x + tangent[0]/2;
                                        y1 = span.cur_y + tangent[1]/2;
@@ -2800,19 +2806,19 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::CUBIC_TO:
                                {
                                        x = data[curnum+2][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+2][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x2 = data[curnum+1][0];
-                                       x2 = (x2 - tl[0] + offset[0])*pw;
+                                       x2 = (x2 - tl[0] + origin[0])*pw;
                                        y2 = data[curnum+1][1];
-                                       y2 = (y2 - tl[1] + offset[1])*ph;
+                                       y2 = (y2 - tl[1] + origin[1])*ph;
 
                                        x1 = data[curnum][0];
-                                       x1 = (x1 - tl[0] + offset[0])*pw;
+                                       x1 = (x1 - tl[0] + origin[0])*pw;
                                        y1 = data[curnum][1];
-                                       y1 = (y1 - tl[1] + offset[1])*ph;
+                                       y1 = (y1 - tl[1] + origin[1])*ph;
 
                                        tangent[0] = 2*(x - x2);
                                        tangent[1] = 2*(y - y2);
@@ -2826,14 +2832,14 @@ Layer_Shape::render_shape(Surface *surface,bool useblend,int /*quality*/,
                                case Primitive::CUBIC_TO_SMOOTH:
                                {
                                        x = data[curnum+1][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+1][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x2 = data[curnum][0];
-                                       x2 = (x2 - tl[0] + offset[0])*pw;
+                                       x2 = (x2 - tl[0] + origin[0])*pw;
                                        y2 = data[curnum][1];
-                                       y2 = (y2 - tl[1] + offset[1])*ph;
+                                       y2 = (y2 - tl[1] + origin[1])*ph;
 
                                        x1 = span.cur_x + tangent[0]/3.0;
                                        y1 = span.cur_y + tangent[1]/3.0;
@@ -2859,7 +2865,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
@@ -2948,9 +2954,9 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::MOVE_TO:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        if(curnum == 0)
                                        {
@@ -2975,9 +2981,9 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::LINE_TO:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        tangent[0] = x - span.cur_x;
                                        tangent[1] = y - span.cur_y;
@@ -2990,14 +2996,14 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::CONIC_TO:
                                {
                                        x = data[curnum+1][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+1][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x1 = data[curnum][0];
-                                       x1 = (x1 - tl[0] + offset[0])*pw;
+                                       x1 = (x1 - tl[0] + origin[0])*pw;
                                        y1 = data[curnum][1];
-                                       y1 = (y1 - tl[1] + offset[1])*ph;
+                                       y1 = (y1 - tl[1] + origin[1])*ph;
 
                                        tangent[0] = 2*(x - x1);
                                        tangent[1] = 2*(y - y1);
@@ -3010,9 +3016,9 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::CONIC_TO_SMOOTH:
                                {
                                        x = data[curnum][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x1 = span.cur_x + tangent[0]/2;
                                        y1 = span.cur_y + tangent[1]/2;
@@ -3029,19 +3035,19 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::CUBIC_TO:
                                {
                                        x = data[curnum+2][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+2][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x2 = data[curnum+1][0];
-                                       x2 = (x2 - tl[0] + offset[0])*pw;
+                                       x2 = (x2 - tl[0] + origin[0])*pw;
                                        y2 = data[curnum+1][1];
-                                       y2 = (y2 - tl[1] + offset[1])*ph;
+                                       y2 = (y2 - tl[1] + origin[1])*ph;
 
                                        x1 = data[curnum][0];
-                                       x1 = (x1 - tl[0] + offset[0])*pw;
+                                       x1 = (x1 - tl[0] + origin[0])*pw;
                                        y1 = data[curnum][1];
-                                       y1 = (y1 - tl[1] + offset[1])*ph;
+                                       y1 = (y1 - tl[1] + origin[1])*ph;
 
                                        tangent[0] = 2*(x - x2);
                                        tangent[1] = 2*(y - y2);
@@ -3055,14 +3061,14 @@ Layer_Shape::render_shape(surface<float> *surface,int /*quality*/,
                                case Primitive::CUBIC_TO_SMOOTH:
                                {
                                        x = data[curnum+1][0];
-                                       x = (x - tl[0] + offset[0])*pw;
+                                       x = (x - tl[0] + origin[0])*pw;
                                        y = data[curnum+1][1];
-                                       y = (y - tl[1] + offset[1])*ph;
+                                       y = (y - tl[1] + origin[1])*ph;
 
                                        x2 = data[curnum][0];
-                                       x2 = (x2 - tl[0] + offset[0])*pw;
+                                       x2 = (x2 - tl[0] + origin[0])*pw;
                                        y2 = data[curnum][1];
-                                       y2 = (y2 - tl[1] + offset[1])*ph;
+                                       y2 = (y2 - tl[1] + origin[1])*ph;
 
                                        x1 = span.cur_x + tangent[0]/3.0;
                                        y1 = span.cur_y + tangent[1]/3.0;
@@ -3094,7 +3100,7 @@ Layer_Shape::get_bounding_rect()const
        if (edge_table->initaabb)
                return Rect::zero();
 
-       Rect bounds(edge_table->aabb+offset);
+       Rect bounds(edge_table->aabb+origin);
        bounds.expand(max((bounds.get_min() - bounds.get_max()).mag()*0.01,
                                          feather));