[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/FreetypeGlyphsProvider.c...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/FreetypeGlyphsProvider.c... |
Date: |
Thu, 17 Apr 2008 16:24:08 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 08/04/17 16:24:08
Modified files:
. : ChangeLog
server : FreetypeGlyphsProvider.cpp
FreetypeGlyphsProvider.h
edit_text_character.cpp font.cpp font.h
text.cpp
Log message:
* server/FreetypeGlyphsProvider.{cpp,h}: add a unitsPerEM() method
to retrive the nominal EM square size. Currently always 1024
but could theoretically match the underlying freetype EM square.
* server/font.{cpp,h}: add a unitsPerEM() method workign both
for device and embedde fonts, both DEFINEFONT kinds (small
and largs).
* server/edit_text_character.cpp, server/text.cpp:
don't assume EM square is 1024x1024, fetch from font instead.
Fixes bug #22965.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6317&r2=1.6318
http://cvs.savannah.gnu.org/viewcvs/gnash/server/FreetypeGlyphsProvider.cpp?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/FreetypeGlyphsProvider.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.173&r2=1.174
http://cvs.savannah.gnu.org/viewcvs/gnash/server/font.cpp?cvsroot=gnash&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/gnash/server/font.h?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/text.cpp?cvsroot=gnash&r1=1.49&r2=1.50
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6317
retrieving revision 1.6318
diff -u -b -r1.6317 -r1.6318
--- ChangeLog 17 Apr 2008 12:39:21 -0000 1.6317
+++ ChangeLog 17 Apr 2008 16:24:04 -0000 1.6318
@@ -1,3 +1,15 @@
+2008-04-17 Sandro Santilli <address@hidden>
+
+ * server/FreetypeGlyphsProvider.{cpp,h}: add a unitsPerEM() method
+ to retrive the nominal EM square size. Currently always 1024
+ but could theoretically match the underlying freetype EM square.
+ * server/font.{cpp,h}: add a unitsPerEM() method workign both
+ for device and embedde fonts, both DEFINEFONT kinds (small
+ and largs).
+ * server/edit_text_character.cpp, server/text.cpp:
+ don't assume EM square is 1024x1024, fetch from font instead.
+ Fixes bug #22965.
+
2008-04-17 Benjamin Wolsey <address@hidden>
* testsuite/actionscript.all/case.as: test for case collision
Index: server/FreetypeGlyphsProvider.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/FreetypeGlyphsProvider.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/FreetypeGlyphsProvider.cpp 16 Apr 2008 11:54:46 -0000 1.22
+++ server/FreetypeGlyphsProvider.cpp 17 Apr 2008 16:24:06 -0000 1.23
@@ -80,8 +80,7 @@
///
/// @param scale
/// The scale to apply to coordinates.
- /// This is to match an EM of 1024x1024 when units_per_EM
- /// are of a different value.
+ /// This is to match an arbitrary EM
///
OutlineWalker(DynamicShape& sh, float scale)
:
@@ -386,9 +385,9 @@
break;
}
- // We want an EM of 1024, so if units_per_EM is different
+ // We want an EM of unitsPerEM, so if units_per_EM is different
// we will scale
- scale = 1024.0f/m_face->units_per_EM;
+ scale = (float)unitsPerEM()/m_face->units_per_EM;
#ifdef GNASH_DEBUG_DEVICEFONTS
log_debug("EM square for font '%s' is %d, scale is thus %g",
name.c_str(), m_face->units_per_EM, scale);
Index: server/FreetypeGlyphsProvider.h
===================================================================
RCS file: /sources/gnash/gnash/server/FreetypeGlyphsProvider.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/FreetypeGlyphsProvider.h 27 Mar 2008 10:50:13 -0000 1.8
+++ server/FreetypeGlyphsProvider.h 17 Apr 2008 16:24:07 -0000 1.9
@@ -86,7 +86,9 @@
~FreetypeGlyphsProvider();
- /// Return the given character glyph as a shape character definition in
1024 EM coordinates.
+ /// \brief
+ /// Return the given character glyph as a shape character definition
+ /// in unitsPerEM() coordinates.
//
///
/// TODO: allow using a custom EM square ?
@@ -95,14 +97,21 @@
/// Character code.
///
/// @param advance
- /// Output parameter... units to advance horizontally from this
glyph to the next,
- /// in 1024 EM units.
+ /// Output parameter... units to advance horizontally from this
+ /// glyph to the next, in unitsPerEM() units.
///
- /// @return A shape_character_def in 1024 EM coordinates, or a NULL
pointer if the given
- /// character code doesn't exist in this font.
+ /// @return A shape_character_def in unitsPerEM() coordinates,
+ /// or a NULL pointer if the given character code
+ /// doesn't exist in this font.
///
boost::intrusive_ptr<shape_character_def> getGlyph(boost::uint16_t
code, float& advance);
+ /// Return the number of units of glyphs EM
+ //
+ /// This is currently hard-coded to 1024, but could in future depend
+ /// on actual font file being used.
+ ///
+ unsigned short unitsPerEM() const { return 1024; }
private:
@@ -114,8 +123,8 @@
#ifdef USE_FREETYPE
- /// Scale factor to make the freetype glyph metrix match our 1024 EM
square
- /// coordinate space. Not all font faces have am EM square of 1024, so
we
+ /// Scale factor to make the freetype glyph metrix match our
unitsPerEM()
+ /// coordinate space. Not all font faces have am EM square of
unitsPerEM(), so we
/// use this value to scale both coordinates and advance values
/// The value is computed by the costructor, as soon as a face is
initialized.
float scale;
Index: server/edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.173
retrieving revision 1.174
diff -u -b -r1.173 -r1.174
--- server/edit_text_character.cpp 11 Apr 2008 09:58:41 -0000 1.173
+++ server/edit_text_character.cpp 17 Apr 2008 16:24:07 -0000 1.174
@@ -651,6 +651,7 @@
}
+ //log_debug("Displaying glyph records for textfield %s", getTarget());
display_glyph_records(m, this, m_text_glyph_records,
m_def->get_root_def(), _embedFonts);
@@ -1281,15 +1282,17 @@
}
boost::uint16_t fontHeight = getFontHeight();
- float scale = fontHeight / 1024.0f; // the EM square is 1024 x 1024
- float fontDescent = _font->get_descent() * scale;
- float fontLeading = _font->get_leading() * scale;
+ float scale = fontHeight / (float)_font->unitsPerEM(_embedFonts);
+ float fontDescent = _embedFonts ? (_font->get_descent()*scale) : 0; //
TODO: fetch descent from device fonts as well ?
+ float fontLeading = _embedFonts ? (_font->get_leading()*scale) : 0; //
TODO: fetch leading from device fonts as well ?
boost::uint16_t leftMargin = getLeftMargin();
boost::uint16_t rightMargin = getRightMargin();
boost::uint16_t indent = getIndent();
boost::uint16_t blockIndent = getBlockIndent();
bool underlined = getUnderlined();
+ //log_debug("%s: fontDescent:%g, fontLeading:%g, fontHeight:%g,
scale:%g", getTarget(), fontDescent, fontLeading, fontHeight, scale);
+
text_glyph_record rec; // one to work on
rec.m_style.setFont(_font.get());
rec.m_style.setUnderlined(underlined);
Index: server/font.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/font.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- server/font.cpp 10 Apr 2008 08:44:13 -0000 1.62
+++ server/font.cpp 17 Apr 2008 16:24:07 -0000 1.63
@@ -143,8 +143,10 @@
assert (tag == SWF::DEFINEFONT2 || tag ==
SWF::DEFINEFONT3);
readDefineFont2_or_3(in, m);
if (tag == SWF::DEFINEFONT3)
+ {
m_subpixel_font = true;
}
+ }
// TODO: initialize the deviceFontProvider only when needed ?
if ( ! m_name.empty() && ! initDeviceFontProvider() )
@@ -544,6 +546,25 @@
return 0;
}
+ unsigned short int font::unitsPerEM(bool embed) const
+ {
+ // the EM square is 1024 x 1024 for DefineFont up to 2
+ // and 20 as much for DefineFont3 up
+ if ( embed )
+ {
+ if ( m_subpixel_font ) return 1024*20;
+ else return 1024;
+ }
+ else
+ {
+ if ( ! _ftProvider.get() )
+ {
+ log_error("Device font provider was not
initialized, can't get unitsPerEM");
+ return 0; // can't query it..
+ }
+ return _ftProvider->unitsPerEM();
+ }
+ }
int
font::add_os_glyph(boost::uint16_t code)
Index: server/font.h
===================================================================
RCS file: /sources/gnash/gnash/server/font.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- server/font.h 10 Apr 2008 08:44:14 -0000 1.37
+++ server/font.h 17 Apr 2008 16:24:08 -0000 1.38
@@ -237,6 +237,14 @@
///
float get_kerning_adjustment(int last_code, int this_code) const;
+ /// Return height of the EM square used for glyphs definition
+ //
+ /// @param embedded
+ /// If true, return is based on the SWF tag the font
+ /// was read from, otherwise will query the FreeTypeGlyphsProvider
+ ///
+ unsigned short int unitsPerEM(bool embedded) const;
+
float get_leading() const { return m_leading; }
float get_descent() const { return m_descent; }
Index: server/text.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/text.cpp,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- server/text.cpp 11 Apr 2008 15:48:21 -0000 1.49
+++ server/text.cpp 17 Apr 2008 16:24:08 -0000 1.50
@@ -118,9 +118,10 @@
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;
+ // unitsPerEM returns an int, we cast to float to get
+ // a float division
+ float unitsPerEM = fnt->unitsPerEM(useEmbeddedGlyphs);
+ float scale = rec.m_style.m_text_height / unitsPerEM;
#ifdef GNASH_DEBUG_TEXT_RENDERING
log_debug("font for record %u == %p", i, (const
void*)fnt);
@@ -129,7 +130,7 @@
if ( rec.m_style.hasXOffset() ) x =
rec.m_style.getXOffset();
if ( rec.m_style.hasYOffset() ) y =
rec.m_style.getYOffset();
- float startX = x; // for the underline, if any
+ boost::int16_t startX = x; // for the underline, if any
s_dummy_style[0].set_color(rec.m_style.m_color);
@@ -158,6 +159,11 @@
// We'll use about half the width, and
around 3/4 the height.
// Values adjusted by eye.
// The Y baseline is at 0; negative Y
is up.
+ //
+ // TODO: FIXME (if we'll ever enable it
back): the EM
+ // square is not hard-coded
anymore but can be
+ // queried from the font class
+ //
static const boost::int16_t
s_empty_char_box[5 * 2] =
{
32, 32,
@@ -203,7 +209,9 @@
// 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?)
+ // 1/4 the EM square offset far from baseline
+ boost::int16_t posY =
int(y+int((unitsPerEM/4)*scale));
+
boost::int16_t underline[2 * 2] =
{
startX, posY,