Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-core / trunk / src / modules / lyr_std / warp.cpp
index f485be0..f11c290 100644 (file)
@@ -1,11 +1,12 @@
 /* === S Y N F I G ========================================================= */
 /*!    \file warp.cpp
-**     \brief Template File
+**     \brief Implementation of the "Warp" layer
 **
 **     $Id$
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     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
@@ -51,8 +52,8 @@
 
 SYNFIG_LAYER_INIT(Warp);
 SYNFIG_LAYER_SET_NAME(Warp,"warp");
-SYNFIG_LAYER_SET_LOCAL_NAME(Warp,_("Warp"));
-SYNFIG_LAYER_SET_CATEGORY(Warp,_("Distortions"));
+SYNFIG_LAYER_SET_LOCAL_NAME(Warp,N_("Warp"));
+SYNFIG_LAYER_SET_CATEGORY(Warp,N_("Distortions"));
 SYNFIG_LAYER_SET_VERSION(Warp,"0.1");
 SYNFIG_LAYER_SET_CVS_ID(Warp,"$Id$");
 
@@ -67,8 +68,8 @@ Warp::Warp():
        src_br  (2,-2),
        dest_tl (-1.8,2.1),
        dest_tr (1.8,2.1),
-       dest_br (2.2,-2),
        dest_bl (-2.2,-2),
+       dest_br (2.2,-2),
        clip    (true)
 {
        sync();
@@ -516,7 +517,11 @@ Warp::accelerated_render(Context context,Surface *surface,int quality, const Ren
                // Real trans_z[4];
                Real z,minz(10000000000000.0f),maxz(0);
 
-
+               //! \todo checking the 4 corners for 0<=z<horizon*2 and using
+               //! only 4 corners which satisfy this condition isn't the
+               //! right thing to do.  It's possible that none of the 4
+               //! corners fall within that range, and yet content of the
+               //! tile does.
                p=transform_forward(min);
                z=transform_backward_z(p);
                if(z>0 && z<horizon*2)
@@ -609,6 +614,12 @@ Warp::accelerated_render(Context context,Surface *surface,int quality, const Ren
        Point min_point(bounding_rect.get_min());
        Point max_point(bounding_rect.get_max());
 
+       // we're going to divide by the difference of these pairs soon;
+       // if they're the same, we'll be dividing by zero, and we don't
+       // want to do that!
+       // \todo what should we do in this case?
+       if (min_point[0] == max_point[0]) max_point[0] += 0.001;
+       if (min_point[1] == max_point[1]) max_point[1] += 0.001;
 
        if(tl[0]>br[0])
        {
@@ -691,13 +702,11 @@ Warp::accelerated_render(Context context,Surface *surface,int quality, const Ren
                                v=(tmp[1]-tl[1])*src_ph;
 
                                if(u<0 || v<0 || u>=source.get_w() || v>=source.get_h() || isnan(u) || isnan(v))
-                               {
                                        (*surface)[y][x]=context.get_color(tmp);
-                               }
                                else
                                        (*surface)[y][x]=source.cubic_sample(u,v);
                        }
-                       if(y&31==0 && cb)
+                       if((y&31)==0 && cb)
                        {
                                if(!stagetwo.amount_complete(y,surface->get_h()))
                                        return false;
@@ -727,16 +736,11 @@ Warp::accelerated_render(Context context,Surface *surface,int quality, const Ren
                                v=(tmp[1]-tl[1])*src_ph;
 
                                if(u<0 || v<0 || u>=source.get_w() || v>=source.get_h() || isnan(u) || isnan(v))
-                               {
-                                       if(clip)
-                                               (*surface)[y][x]=Color::alpha();
-                                       else
-                                               (*surface)[y][x]=context.get_color(tmp);
-                               }
+                                       (*surface)[y][x]=context.get_color(tmp);
                                else
                                        (*surface)[y][x]=source.linear_sample(u,v);
                        }
-                       if(y&31==0 && cb)
+                       if((y&31)==0 && cb)
                        {
                                if(!stagetwo.amount_complete(y,surface->get_h()))
                                        return false;
@@ -765,17 +769,12 @@ Warp::accelerated_render(Context context,Surface *surface,int quality, const Ren
                                v=(tmp[1]-tl[1])*src_ph;
 
                                if(u<0 || v<0 || u>=source.get_w() || v>=source.get_h() || isnan(u) || isnan(v))
-                               {
-                                       if(clip)
-                                               (*surface)[y][x]=Color::alpha();
-                                       else
-                                               (*surface)[y][x]=context.get_color(tmp);
-                               }
+                                       (*surface)[y][x]=context.get_color(tmp);
                                else
-                               //pen.set_value(source[v][u]);
-                               (*surface)[y][x]=source[floor_to_int(v)][floor_to_int(u)];
+                                       //pen.set_value(source[v][u]);
+                                       (*surface)[y][x]=source[floor_to_int(v)][floor_to_int(u)];
                        }
-                       if(y&31==0 && cb)
+                       if((y&31)==0 && cb)
                        {
                                if(!stagetwo.amount_complete(y,surface->get_h()))
                                        return false;