gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/DynamicShape.cpp server/...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/DynamicShape.cpp server/...
Date: Wed, 02 Jan 2008 19:08:32 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/01/02 19:08:32

Modified files:
        .              : ChangeLog 
        server         : DynamicShape.cpp DynamicShape.h fill_style.cpp 
                         fill_style.h matrix.h sprite_instance.cpp 
                         sprite_instance.h 

Log message:
        Draft beginGradientFill support.
        Almost works, just needs to get the matrix argument right ...

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5288&r2=1.5289
http://cvs.savannah.gnu.org/viewcvs/gnash/server/DynamicShape.cpp?cvsroot=gnash&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/gnash/server/DynamicShape.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/fill_style.cpp?cvsroot=gnash&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/gnash/server/fill_style.h?cvsroot=gnash&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/gnash/server/matrix.h?cvsroot=gnash&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.423&r2=1.424
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.162&r2=1.163

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5288
retrieving revision 1.5289
diff -u -b -r1.5288 -r1.5289
--- ChangeLog   2 Jan 2008 14:13:58 -0000       1.5288
+++ ChangeLog   2 Jan 2008 19:08:30 -0000       1.5289
@@ -1,5 +1,13 @@
 2008-01-02 Sandro Santilli <address@hidden>
 
+       * server/DynamicShape.{cpp,h},
+         server/fill_style.{cpp,h}, server/matrix.h,
+         server/sprite_instance.{cpp,h}:
+         Draft beginGradientFill support. Almost works, just
+         needs to get the matrix argument right ...
+
+2008-01-02 Sandro Santilli <address@hidden>
+
        * server/fill_style.cpp, server/font.cpp,
          server/impl.cpp, server/parser/movie_def_impl.{cpp,h},
          server/parser/movie_definition.h, server/swf/tag_loaders.cpp:

Index: server/DynamicShape.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/DynamicShape.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/DynamicShape.cpp     4 Dec 2007 11:45:27 -0000       1.14
+++ server/DynamicShape.cpp     2 Jan 2008 19:08:31 -0000       1.15
@@ -17,7 +17,7 @@
 
 
 
-/* $Id: DynamicShape.cpp,v 1.14 2007/12/04 11:45:27 strk Exp $ */
+/* $Id: DynamicShape.cpp,v 1.15 2008/01/02 19:08:31 strk Exp $ */
 
 #include "DynamicShape.h"
 
@@ -92,6 +92,38 @@
 }
 
 void
+DynamicShape::beginLinearGradientFill(const std::vector<gradient_record>& 
grad, const matrix& mat)
+{
+       // Add the new fill style and set as current
+       fill_style style; style.setLinearGradient(grad, mat);
+
+       endFill();
+
+       _currfill = add_fill_style(style);
+       // TODO: how to know wheter the fill should be set
+       //       as *left* or *right* fill ?
+       //       A quick test shows that *left* always work fine !
+       path newPath(_x, _y, _currfill, 0, _currline, true); // new fill start 
new subshapes
+       add_path(newPath);
+}
+
+void
+DynamicShape::beginRadialGradientFill(const std::vector<gradient_record>& 
grad, const matrix& mat)
+{
+       // Add the new fill style and set as current
+       fill_style style; style.setRadialGradient(grad, mat);
+
+       endFill();
+
+       _currfill = add_fill_style(style);
+       // TODO: how to know wheter the fill should be set
+       //       as *left* or *right* fill ?
+       //       A quick test shows that *left* always work fine !
+       path newPath(_x, _y, _currfill, 0, _currline, true); // new fill start 
new subshapes
+       add_path(newPath);
+}
+
+void
 DynamicShape::startNewPath(bool newShape)
 {
        // Close any pending filled path

Index: server/DynamicShape.h
===================================================================
RCS file: /sources/gnash/gnash/server/DynamicShape.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/DynamicShape.h       4 Dec 2007 11:45:27 -0000       1.8
+++ server/DynamicShape.h       2 Jan 2008 19:08:31 -0000       1.9
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 
-/* $Id: DynamicShape.h,v 1.8 2007/12/04 11:45:27 strk Exp $ */
+/* $Id: DynamicShape.h,v 1.9 2008/01/02 19:08:31 strk Exp $ */
 
 #ifndef GNASH_DYNAMIC_SHAPE_H
 #define GNASH_DYNAMIC_SHAPE_H
@@ -55,6 +55,12 @@
        /// Start drawing with a solid fill
        void beginFill(const rgba& color);
 
+       /// Start drawing with a linear gradient fill
+       void beginLinearGradientFill(const std::vector<gradient_record>& grad, 
const matrix& mat);
+
+       /// Start drawing with a radial gradient fill
+       void beginRadialGradientFill(const std::vector<gradient_record>& grad, 
const matrix& mat);
+
        /// Close an existing filled path, if any.
        void endFill();
 

Index: server/fill_style.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/fill_style.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- server/fill_style.cpp       2 Jan 2008 14:13:58 -0000       1.17
+++ server/fill_style.cpp       2 Jan 2008 19:08:31 -0000       1.18
@@ -34,13 +34,6 @@
 // gradient_record
 //
 
-gradient_record::gradient_record()
-    :
-    m_ratio(0)
-{
-}
-
-
 void
 gradient_record::read(stream* in, int tag_type)
 {
@@ -540,6 +533,24 @@
        m_color = color;
 }
 
+void
+fill_style::setLinearGradient(const std::vector<gradient_record>& gradients, 
const matrix& mat)
+{
+       m_type = SWF::FILL_LINEAR_GRADIENT;
+       m_gradients = gradients;
+       m_gradient_matrix = mat;
+       m_gradient_bitmap_info = 0;
+}
+
+void
+fill_style::setRadialGradient(const std::vector<gradient_record>& gradients, 
const matrix& mat)
+{
+       m_type = SWF::FILL_RADIAL_GRADIENT;
+       m_gradients = gradients;
+       m_gradient_matrix = mat;
+       m_gradient_bitmap_info = 0;
+}
+
 
 #ifdef GNASH_USE_GC
 void

Index: server/fill_style.h
===================================================================
RCS file: /sources/gnash/gnash/server/fill_style.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/fill_style.h 12 Dec 2007 10:07:00 -0000      1.13
+++ server/fill_style.h 2 Jan 2008 19:08:31 -0000       1.14
@@ -17,7 +17,7 @@
 
 // Based on work of Thatcher Ulrich <address@hidden> 2003
 
-/* $Id: fill_style.h,v 1.13 2007/12/12 10:07:00 zoulunkai Exp $ */
+/* $Id: fill_style.h,v 1.14 2008/01/02 19:08:31 strk Exp $ */
 
 #ifndef GNASH_FILL_STYLE_H
 #define GNASH_FILL_STYLE_H
@@ -39,7 +39,18 @@
 class gradient_record
 {
 public:
-       gradient_record();
+       gradient_record()
+               :
+               m_ratio(0),
+               m_color()
+       {}
+
+       gradient_record(boost::uint8_t ratio, const rgba& color)
+               :
+               m_ratio(ratio),
+               m_color(color)
+       {}
+
        void    read(stream* in, int tag_type);
        
        //data:
@@ -66,6 +77,44 @@
 
        void setSolid(const rgba& color);
 
+       /// Turn this fill style into a linear gradient
+       //
+       /// @param gradients
+       ///     Gradient records.
+       ///
+       /// @param mat
+       ///     Gradient matrix.
+       ///
+       ///
+       void setLinearGradient(const std::vector<gradient_record>& gradients, 
+                       const matrix& mat);
+
+       /// Turn this fill style into a radial gradient
+       //
+       /// @param gradients
+       ///     Gradient records.
+       ///
+       /// @param mat
+       ///     Gradient matrix.
+       ///
+       ///
+       void setRadialGradient(const std::vector<gradient_record>& gradients,
+                       const matrix& mat);
+
+       /// Turn this fill style into a focal gradient
+       //
+       /// @param gradients
+       ///     Gradient records.
+       ///
+       /// @param mat
+       ///     Gradient matrix.
+       ///
+       /// @param fpoint
+       ///     Focal point.
+       ///
+       void setRadialGradient(const std::vector<gradient_record>& gradients,
+                       const matrix& mat, float fpoint);
+
        ~fill_style() {}
        
        /// Read the fill style from a stream

Index: server/matrix.h
===================================================================
RCS file: /sources/gnash/gnash/server/matrix.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/matrix.h     29 Dec 2007 20:15:25 -0000      1.13
+++ server/matrix.h     2 Jan 2008 19:08:31 -0000       1.14
@@ -19,7 +19,7 @@
 //
 // Original author: Thatcher Ulrich <address@hidden> 2003
 //
-// $Id: matrix.h,v 1.13 2007/12/29 20:15:25 strk Exp $ 
+// $Id: matrix.h,v 1.14 2008/01/02 19:08:31 strk Exp $ 
 //
 
 #ifndef GNASH_MATRIX_H
@@ -238,6 +238,11 @@
        ///     | scale_x  x_dep_y  translate_x |
        ///     | y_dep_x  scale_y  translate_y |
        ///
+       /// In cairo dialect, these are:
+       ///
+       ///     |      xx       xy           x0 |
+       ///     |      yx       yy           y0 |
+       ///
        float   m_[2][3];
 };
 

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.423
retrieving revision 1.424
diff -u -b -r1.423 -r1.424
--- server/sprite_instance.cpp  26 Dec 2007 13:05:17 -0000      1.423
+++ server/sprite_instance.cpp  2 Jan 2008 19:08:32 -0000       1.424
@@ -54,6 +54,7 @@
 #include "Object.h" // for getObjectInterface
 #include "DynamicShape.h" // for composition
 #include "namedStrings.h"
+#include "fill_style.h" // for beginGradientFill
 
 #include <vector>
 #include <string>
@@ -1293,12 +1294,180 @@
 sprite_beginGradientFill(const fn_call& fn)
 {
        boost::intrusive_ptr<sprite_instance> sprite = 
ensureType<sprite_instance>(fn.this_ptr);
-       UNUSED(sprite);
+
+       if ( fn.nargs < 5 )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror(_("%s.beginGradientFill(%s): invalid call: 5 
arguments needed"),
+                       sprite->getTarget().c_str(), ss.str().c_str());
+               );
+               return as_value();
+       }
+
+       bool radial = false;
+       string typeStr = fn.arg(0).to_string();
+       // Case-sensitive comparison needed for this ...
+       if ( typeStr == "radial" ) radial = true;
+       else if ( typeStr == "linear" ) radial = false;
+       else
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror(_("%s.beginGradientFill(%s): first arg must be "
+                       "'radial' or 'linear'"),
+                       sprite->getTarget().c_str(), ss.str().c_str());
+               );
+               return as_value();
+       }
+
+       typedef boost::intrusive_ptr<as_object> ObjPtr;
+
+       ObjPtr colors = fn.arg(1).to_object();
+       ObjPtr alphas = fn.arg(2).to_object();
+       ObjPtr ratios = fn.arg(3).to_object();
+       ObjPtr matrixArg = fn.arg(4).to_object();
+
+       if ( ! colors || ! alphas || ! ratios || ! matrixArg )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror(_("%s.beginGradientFill(%s): one or more of the "
+                       " args from 2nd to 5th don't cast to objects"),
+                       sprite->getTarget().c_str(), ss.str().c_str());
+               );
+               return as_value();
+       }
+
+       VM& vm = sprite->getVM();
+       string_table& st = vm.getStringTable();
+
+       // ----------------------------
+       // Parse matrix
+       // ----------------------------
+       //
+       //
+       // TODO: fix this matrix build-up, it is NOT correct
+
+       matrix mat;
+       matrix input_matrix;
+
+       string_table::key keyT = st.find(PROPNAME("matrixType"));
+       if ( matrixArg->getMember(keyT).to_string() == "box" )
+       {
+               
+               string_table::key keyX = st.find("x");
+               string_table::key keyY = st.find("y");
+               string_table::key keyW = st.find("w");
+               string_table::key keyH = st.find("h");
+               string_table::key keyR = st.find("r");
+
+               float valX = matrixArg->getMember(keyX).to_number(); 
+               float valY = matrixArg->getMember(keyY).to_number(); 
+               float valW = matrixArg->getMember(keyW).to_number(); 
+               float valH = matrixArg->getMember(keyH).to_number(); 
+               float valR = matrixArg->getMember(keyR).to_number(); 
+
+               input_matrix.set_translation( (valX+valW)/2, (valY+valH)/2 );
+               input_matrix.set_scale(valW, valH);
+               input_matrix.set_rotation(valR);
+
+               mat.concatenate_scale(20/16384.0);
+               mat.concatenate(input_matrix);
+       }
+       else
+       {
+               string_table::key keyA = st.find("a");
+               string_table::key keyB = st.find("b");
+               string_table::key keyD = st.find("d");
+               string_table::key keyE = st.find("e");
+               string_table::key keyG = st.find("g");
+               string_table::key keyH = st.find("h");
+               float valA = matrixArg->getMember(keyA).to_number() ; // xx
+               float valB = matrixArg->getMember(keyB).to_number() ; // yx
+               float valD = matrixArg->getMember(keyD).to_number() ; // xy
+               float valE = matrixArg->getMember(keyE).to_number() ; // yy
+               float valG = 
PIXELS_TO_TWIPS(matrixArg->getMember(keyG).to_number()); // x0
+               float valH = 
PIXELS_TO_TWIPS(matrixArg->getMember(keyH).to_number()); // y0
+
+               input_matrix.m_[0][0] = valA;
+               input_matrix.m_[1][0] = valB;
+               input_matrix.m_[0][1] = valD;
+               input_matrix.m_[1][1] = valE;
+               input_matrix.m_[0][2] = valG;
+               input_matrix.m_[1][2] = valH;
+
+               mat.concatenate_scale(20/16384.0);
+               mat.concatenate(input_matrix);
+       }
+
+       //cout << mat << endl;
+
+       // ----------------------------
+       // Create the gradients vector
+       // ----------------------------
+
+       size_t ngradients = colors->getMember(NSV::PROP_LENGTH).to_int();
+       // Check length compatibility of all args
+       if ( ngradients != (size_t)alphas->getMember(NSV::PROP_LENGTH).to_int() 
||
+               ngradients != 
(size_t)ratios->getMember(NSV::PROP_LENGTH).to_int() )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror(_("%s.beginGradientFill(%s): colors, alphas and "
+                       "ratios args don't have same length"),
+                       sprite->getTarget().c_str(), ss.str().c_str());
+               );
+               return as_value();
+       }
+
+       // TODO: limit ngradients to a max ?
+       if ( ngradients > 8 )
+       {
+               std::stringstream ss; fn.dump_args(ss);
+               log_debug("%s.beginGradientFill(%s) : too many array elements"
+                       " for colors and ratios (%d), trim to 8", 
+                       sprite->getTarget().c_str(), ss.str().c_str(), 
ngradients); 
+               ngradients = 8;
+       }
+
+       std::vector<gradient_record> gradients;
+       gradients.reserve(ngradients);
+       for (size_t i=0; i<ngradients; ++i)
+       {
+               char buf[32];
+               sprintf(buf, "%d", i);
+               string_table::key key = st.find(buf);
+
+               as_value colVal = colors->getMember(key);
+               boost::uint32_t col = colVal.is_number() ? colVal.to_int() : 0;
+
+               as_value alpVal = alphas->getMember(key);
+               boost::uint8_t alp = alpVal.is_number() ? 
iclamp(alpVal.to_int(), 0, 255) : 0;
+
+               as_value ratVal = ratios->getMember(key);
+               boost::uint8_t rat = ratVal.is_number() ? 
iclamp(ratVal.to_int(), 0, 255) : 0;
+
+               rgba color;
+               color.parseRGB(col);
+               color.m_a = alp;
+
+               gradients.push_back(gradient_record(rat, color));
+       }
+
+       if ( radial )
+       {
+               sprite->beginRadialGradientFill(gradients, mat);
+       }
+       else
+       {
+               sprite->beginLinearGradientFill(gradients, mat);
+       }
 
        static bool warned = false;
        if ( ! warned )
        {
-               log_unimpl("MovieClip.beginGradientFill()");
+               log_debug("MovieClip.beginGradientFill() TESTING");
                warned=true;
        }
        return as_value();

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -b -r1.162 -r1.163
--- server/sprite_instance.h    26 Dec 2007 12:35:13 -0000      1.162
+++ server/sprite_instance.h    2 Jan 2008 19:08:32 -0000       1.163
@@ -49,6 +49,7 @@
        class swf_event;
        class drag_state;
        class LoadVariablesThread;
+       class gradient_record;
 }
 
 namespace gnash
@@ -778,6 +779,16 @@
                _drawable->beginFill(color);
        }
 
+       void beginLinearGradientFill(const std::vector<gradient_record>& grad, 
const matrix& mat)
+       {
+               _drawable->beginLinearGradientFill(grad, mat);
+       }
+
+       void beginRadialGradientFill(const std::vector<gradient_record>& grad, 
const matrix& mat)
+       {
+               _drawable->beginRadialGradientFill(grad, mat);
+       }
+
        void endFill()
        {
                _drawable->endFill();




reply via email to

[Prev in Thread] Current Thread [Next in Thread]