[Top][All Lists]
[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;"
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/01
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/02
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/08
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/10
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/10
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/10
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/10
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ...,
Sandro Santilli <=
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/19
- Re: [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., zou lunkai, 2008/04/28
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Benjamin Wolsey, 2008/04/28
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Benjamin Wolsey, 2008/04/28
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/04/29