gnash-commit
[Top][All Lists]
Advanced

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

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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ...
Date: Fri, 11 Apr 2008 09:58:42 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/04/11 09:58:42

Modified files:
        .              : ChangeLog 
        server         : edit_text_character.cpp edit_text_character.h 
                         text.cpp text.h 
        server/asobj   : TextFormat.cpp 
        testsuite/misc-ming.all: DefineEditTextTest.c 

Log message:
                * server/asobj/TextFormat.cpp: implement getter-setter for
                  'underline'
                * testsuite/misc-ming.all/DefineEditTextTest.c: test
                  getTextFormat().underline.
                * server/edit_text_character.{cpp,h}, server/text.{cpp,h}:
                  Implement text underlining.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6250&r2=1.6251
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.172&r2=1.173
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.h?cvsroot=gnash&r1=1.74&r2=1.75
http://cvs.savannah.gnu.org/viewcvs/gnash/server/text.cpp?cvsroot=gnash&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/gnash/server/text.h?cvsroot=gnash&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/TextFormat.cpp?cvsroot=gnash&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/DefineEditTextTest.c?cvsroot=gnash&r1=1.36&r2=1.37

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6250
retrieving revision 1.6251
diff -u -b -r1.6250 -r1.6251
--- ChangeLog   11 Apr 2008 09:04:23 -0000      1.6250
+++ ChangeLog   11 Apr 2008 09:58:40 -0000      1.6251
@@ -1,3 +1,12 @@
+2008-04-11 Sandro Santilli <address@hidden>
+
+       * server/asobj/TextFormat.cpp: implement getter-setter for
+         'underline'
+       * testsuite/misc-ming.all/DefineEditTextTest.c: test 
+         getTextFormat().underline.
+       * server/edit_text_character.{cpp,h}, server/text.{cpp,h}:
+         Implement text underlining.
+
 2008-04-11 Benjamin Wolsey <address@hidden>
 
        * testsuite/actionscript.all/System.as: correct expected results.

Index: server/edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.172
retrieving revision 1.173
diff -u -b -r1.172 -r1.173
--- server/edit_text_character.cpp      10 Apr 2008 21:51:07 -0000      1.172
+++ server/edit_text_character.cpp      11 Apr 2008 09:58:41 -0000      1.173
@@ -175,6 +175,7 @@
        tf->leftMarginSet(text->getLeftMargin());
        tf->rightMarginSet(text->getRightMargin());
        tf->colorSet(text->getTextColor());
+       tf->underlinedSet(text->getUnderlined());
 
        const font* font = text->getFont();
        if (font)
@@ -186,7 +187,7 @@
 
        // TODO: add font color and some more
 
-       ONCE( log_unimpl("TextField.getTextFormat() discards url, target, 
underline, tabStops, bullet and display") );
+       ONCE( log_unimpl("TextField.getTextFormat() discards url, target, 
tabStops, bullet and display") );
 
        return as_value(tf.get());
 }
@@ -240,6 +241,7 @@
        if ( tf->leftMarginDefined() ) text->setLeftMargin(tf->leftMargin());
        if ( tf->rightMarginDefined() ) text->setRightMargin(tf->rightMargin());
        if ( tf->colorDefined() ) text->setTextColor(tf->color());
+       if ( tf->underlinedDefined() ) text->setUnderlined(tf->underlined());
 
        if ( tf->fontDefined() )
        {
@@ -259,7 +261,7 @@
 
        // TODO: add font color and some more
 
-       ONCE( log_unimpl("TextField.setTextFormat() discards url, target, 
underline, tabStops, bullet and display") );
+       ONCE( log_unimpl("TextField.setTextFormat() discards url, target, 
tabStops, bullet and display") );
 
        return as_value();
 
@@ -470,6 +472,7 @@
        _text(L""),
        _textDefined(def->has_text()),
        m_def(def),
+       _underlined(false),
        _leading(m_def->get_leading()),
        _alignment(def->get_alignment()),
        _indent(def->get_indent()), 
@@ -1219,9 +1222,9 @@
        {
                text_glyph_record&      rec = m_text_glyph_records[i];
 
-               if (rec.m_style.m_has_x_offset)
+               if ( rec.m_style.hasXOffset() )
                {
-                       rec.m_style.m_x_offset += shift_right;
+                       rec.m_style.shiftXOffset(shift_right); 
                }
        }
        return shift_right;
@@ -1242,7 +1245,7 @@
 void
 edit_text_character::format_text()
 {
-       m_text_glyph_records.resize(0);
+       m_text_glyph_records.clear();
 
        // nothing more to do if text is empty
        if ( _text.empty() ) return;
@@ -1285,26 +1288,24 @@
        boost::uint16_t rightMargin = getRightMargin();
        boost::uint16_t indent = getIndent();
        boost::uint16_t blockIndent = getBlockIndent();
+       bool underlined = getUnderlined();
 
        text_glyph_record       rec;    // one to work on
        rec.m_style.setFont(_font.get());
+       rec.m_style.setUnderlined(underlined);
        rec.m_style.m_color = getTextColor(); 
-       rec.m_style.m_x_offset = PADDING_TWIPS + std::max(0, leftMargin + 
indent + blockIndent);
-       rec.m_style.m_y_offset = PADDING_TWIPS + fontHeight
-               + (fontLeading - fontDescent);
+       rec.m_style.setXOffset( PADDING_TWIPS + std::max(0, leftMargin + indent 
+ blockIndent) );
+       rec.m_style.setYOffset( PADDING_TWIPS + fontHeight + (fontLeading - 
fontDescent) );
        rec.m_style.m_text_height = fontHeight;
-       rec.m_style.m_has_x_offset = true;
-       rec.m_style.m_has_y_offset = true;
-
-       float   x = rec.m_style.m_x_offset;
-       float   y = rec.m_style.m_y_offset;
        
+       float   x = rec.m_style.getXOffset();
+       float   y = rec.m_style.getYOffset();
 
        // Start the bbox at the upper-left corner of the first glyph.
        reset_bounding_box(x, y - fontDescent + fontHeight); 
 
        float leading = getLeading();
-       leading += fontLeading * scale;
+       leading += fontLeading * scale; // not sure this is correct...
 
        int     last_code = -1; // only used if _embedFonts
        int     last_space_glyph = -1;
@@ -1353,12 +1354,11 @@
                        // Start a new record on the next line.
                        rec.m_glyphs.resize(0);
                        rec.m_style.setFont(_font.get()); 
+                       rec.m_style.setUnderlined(underlined);
                        rec.m_style.m_color = getTextColor();
-                       rec.m_style.m_x_offset = x;
-                       rec.m_style.m_y_offset = y;
+                       rec.m_style.setXOffset(x);
+                       rec.m_style.setYOffset(y);
                        rec.m_style.m_text_height = fontHeight; 
-                       rec.m_style.m_has_x_offset = true;
-                       rec.m_style.m_has_y_offset = true;
 
                        last_space_glyph = -1;
                        last_line_start_record = m_text_glyph_records.size();
@@ -1561,12 +1561,11 @@
                                        // Start a new record on the next line.
                                        rec.m_glyphs.resize(0);
                                        rec.m_style.setFont(_font.get());
+                                       rec.m_style.setUnderlined(underlined);
                                        rec.m_style.m_color = getTextColor();
-                                       rec.m_style.m_x_offset = x;
-                                       rec.m_style.m_y_offset = y;
+                                       rec.m_style.setXOffset(x);
+                                       rec.m_style.setYOffset(y);
                                        rec.m_style.m_text_height = 
getFontHeight();
-                                       rec.m_style.m_has_x_offset = true;
-                                       rec.m_style.m_has_y_offset = true;
                                        
                                        // TODO : what if m_text_glyph_records 
is empty ? Is it possible ?
                                        assert(!m_text_glyph_records.empty());
@@ -1979,6 +1978,17 @@
 }
 
 void
+edit_text_character::setUnderlined(bool v)
+{
+       if ( _underlined != v )
+       {
+               set_invalidated();
+               _underlined = v;
+               format_text();
+       }
+}
+
+void
 edit_text_character::setAlignment(edit_text_character_def::alignment h)
 {
        if ( _alignment != h )

Index: server/edit_text_character.h
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.h,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -b -r1.74 -r1.75
--- server/edit_text_character.h        10 Apr 2008 21:45:20 -0000      1.74
+++ server/edit_text_character.h        11 Apr 2008 09:58:41 -0000      1.75
@@ -389,6 +389,13 @@
 
        void setLeading(boost::uint16_t h);
 
+       bool getUnderlined() const
+       {
+               return _underlined;
+       }
+
+       void setUnderlined(bool v);
+
 private:
 
        /// Set our text to the given string.
@@ -463,6 +470,7 @@
        float align_line(edit_text_character_def::alignment align,
                        int last_line_start_record, float x);
 
+       bool _underlined;
 
        boost::uint16_t _leading;
 

Index: server/text.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/text.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- server/text.cpp     9 Apr 2008 20:32:37 -0000       1.46
+++ server/text.cpp     11 Apr 2008 09:58:41 -0000      1.47
@@ -100,18 +100,12 @@
 
                matrix  base_matrix = mat;
 
-               float   scale = 1.0f;
-               float   x = 0.0f;
-               float   y = 0.0f;
-
                for (unsigned int i = 0; i < records.size(); i++)
                {
                        // Draw the characters within the current record; i.e. 
consecutive
                        // chars that share a particular style.
                        const text_glyph_record&        rec = records[i];
 
-                       //rec.m_style.resolve_font(root_def);
-
                        const font*     fnt = rec.m_style.getFont();
                        if (fnt == NULL)
                        {
@@ -121,35 +115,31 @@
                                continue;
                        }
 
+                       float   scale = 1.0f;
                        scale = rec.m_style.m_text_height / 1024.0f;    // the 
EM square is 1024 x 1024
+                       if (fnt->is_subpixel_font()) scale*=0.05f; 
 
 #ifdef GNASH_DEBUG_TEXT_RENDERING
-                       log_debug("font for record %u == %p", i, (const 
void*)rec.m_style.getFont());
+                       log_debug("font for record %u == %p", i, (const 
void*)fnt);
 #endif
 
-                       if (rec.m_style.m_has_x_offset)
-                       {
-                               x = rec.m_style.m_x_offset;
-                       }
-                       if (rec.m_style.m_has_y_offset)
-                       {
-                               y = rec.m_style.m_y_offset;
-                       }
+                       float x = rec.m_style.hasXOffset() ? 
rec.m_style.getXOffset() : 0.0f;
+                       float y = rec.m_style.hasYOffset() ? 
rec.m_style.getYOffset() : 0.0f;
 
                        s_dummy_style[0].set_color(rec.m_style.m_color);
 
                        rgba    transformed_color = 
cx.transform(rec.m_style.m_color);
 
-                       for (unsigned int j = 0; j < rec.m_glyphs.size(); j++)
+                       unsigned int nglyphs = rec.m_glyphs.size();
+                       for (unsigned int j = 0; j < nglyphs; ++j)
                        {
-                               int     index = rec.m_glyphs[j].m_glyph_index;
+                               // the glyph entry
+                               const text_glyph_record::glyph_entry& ge = 
rec.m_glyphs[j];
+
+                               int     index = ge.m_glyph_index;
                                        
                                mat = base_matrix;
                                mat.concatenate_translation(x, y);
-                               //mat.concatenate_scale(scale);
-                               if (fnt->is_subpixel_font())
-                                       mat.concatenate_scale(0.05f * scale);
-                               else
                                        mat.concatenate_scale(scale);
 
                                if (index == -1)
@@ -187,10 +177,37 @@
 #endif
 
                                                
gnash::render::draw_glyph(glyph, mat, transformed_color, pixel_scale);
-                                               
                                        }
                                }
-                               x += rec.m_glyphs[j].m_glyph_advance;
+                               x += ge.m_glyph_advance;
+                       }
+
+                       bool underline = rec.m_style.isUnderlined(); 
+                       if ( nglyphs && underline )
+                       {
+                               // Starting offset
+                               boost::int16_t startX = 
rec.m_style.hasXOffset() ? (int)rec.m_style.getXOffset() : 0;
+
+                               // Underline should end where last displayed 
glyphs
+                               // does. 'x' here is where next glyph would be 
displayed
+                               // which is normally after some space.
+                               // For more precise metrics we should substract 
the advance
+                               // of last glyph and add the actual size of it.
+                               // This will only be known if a glyph was 
actually found,
+                               // or would be the size of the empty box 
(arbitrary size)
+                               //
+                               boost::int16_t endX = (int)x; // - 
rec.m_glyphs.back().m_glyph_advance + (480.0*scale);
+
+                               // The underline is made to be some pixels 
below the baseline (0)
+                               // and scaled so it's further as font size 
increases.
+                               //
+                               boost::int16_t posY = int(y+int(256.0*scale)); 
// some offset far from baseline (should this be scaled on font size?)
+                               boost::int16_t underline[2 * 2] =
+                               {
+                                       startX,   posY,
+                                         endX,   posY,
+                               };
+                               render::draw_line_strip(underline, 2, 
transformed_color, base_matrix);
                        }
                }
        }

Index: server/text.h
===================================================================
RCS file: /sources/gnash/gnash/server/text.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- server/text.h       9 Apr 2008 20:32:37 -0000       1.23
+++ server/text.h       11 Apr 2008 09:58:41 -0000      1.24
@@ -42,6 +42,7 @@
                bool    m_has_x_offset;
                bool    m_has_y_offset;
 
+
                text_style()
                        :
                        m_x_offset(0),
@@ -53,6 +54,71 @@
                {
                }
 
+               /// Should text be underlined ?
+               bool isUnderlined() const { return _underlined; }
+
+               /// Specify whether text should be underlined or not
+               void setUnderlined(bool v) { _underlined=v; }
+
+               /// Set an X offset
+               void setXOffset(float o)
+               {
+                       // TODO: is this really needed ?
+                       m_has_x_offset=true;
+                       m_x_offset=o;
+               }
+
+               /// Shift X offset by given amount
+               void shiftXOffset(float xo)
+               {
+                       //assert(m_has_x_offset)
+                       m_x_offset+=xo;
+               }
+
+               /// Return true if text has an X offset
+               //
+               // TODO: is this really needed ?
+               //
+               bool hasXOffset() const
+               {
+                       return m_has_x_offset;
+               }
+
+               /// Return the X offset
+               float getXOffset() const
+               {
+                       return m_x_offset;
+               }
+
+               /// Set an Y offset
+               void setYOffset(float o)
+               {
+                       m_has_y_offset=true;
+                       m_y_offset=o;
+               }
+
+               /// Shift Y offset by given amount
+               void shiftYOffset(float yo)
+               {
+                       //assert(m_has_y_offset)
+                       m_y_offset+=yo;
+               }
+
+               /// Return true if text has an Y offset
+               //
+               // TODO: is this really needed ?
+               //
+               bool hasYOffset() const
+               {
+                       return m_has_y_offset;
+               }
+
+               /// Return the Y offset
+               float getYOffset() const
+               {
+                       return m_y_offset;
+               }
+
                /// Set font by id and movie_definition
                //
                /// This method will perform a lookup from the movie_definition
@@ -94,6 +160,12 @@
 
        private:
 
+               // TODO: turn _underlined, has_x_offset and has_y_offset
+               //       into a single bitwise flag.
+               //       Also, check if the has_{x,y}_offset are needed
+               //       at all !
+               bool    _underlined;
+
                const font* m_font;
 
                /// Set m_font based on m_font_id.

Index: server/asobj/TextFormat.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/TextFormat.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- server/asobj/TextFormat.cpp 10 Apr 2008 21:45:21 -0000      1.11
+++ server/asobj/TextFormat.cpp 11 Apr 2008 09:58:41 -0000      1.12
@@ -227,10 +227,23 @@
 }
 
 as_value
-TextFormat::underline_getset(const fn_call& /*fn*/)
+TextFormat::underline_getset(const fn_call& fn)
 {
-       ONCE( log_unimpl("TextField.underline") );
-       return as_value();
+       boost::intrusive_ptr<TextFormat> ptr = 
ensureType<TextFormat>(fn.this_ptr);
+
+       as_value ret;
+
+       if ( fn.nargs == 0 ) // getter
+       {
+               if ( ptr->underlinedDefined() ) ret.set_bool(ptr->underlined());
+               else ret.set_null();
+       }
+       else // setter
+       {
+               ptr->underlinedSet(fn.arg(0).to_bool());
+       }
+
+       return ret;
 }
 
 as_value

Index: testsuite/misc-ming.all/DefineEditTextTest.c
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/DefineEditTextTest.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- testsuite/misc-ming.all/DefineEditTextTest.c        10 Apr 2008 21:45:21 
-0000      1.36
+++ testsuite/misc-ming.all/DefineEditTextTest.c        11 Apr 2008 09:58:41 
-0000      1.37
@@ -298,6 +298,10 @@
   check_equals(mo, "typeof(dtext2.tf.blockIndent)", "'number'");
   check_equals(mo, "etext1.tf.blockIndent", "0");
   check_equals(mo, "dtext2.tf.blockIndent", "0");
+  check_equals(mo, "typeof(etext1.tf.underline)", "'boolean'");
+  check_equals(mo, "typeof(dtext2.tf.underline)", "'boolean'");
+  check_equals(mo, "etext1.tf.underline", "false");
+  check_equals(mo, "dtext2.tf.underline", "false");
 
   add_actions(mo, "dtext1.background = true;"
                   "etext1.background = true;"




reply via email to

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