[Top][All Lists]
[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();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog server/DynamicShape.cpp server/...,
Sandro Santilli <=