[Swfdec-commits] 3 commits - swfdec/swfdec_font.c swfdec/swfdec_font.h swfdec/swfdec_tag.c

Benjamin Otte company at kemper.freedesktop.org
Sun Mar 16 07:33:48 PDT 2008


 swfdec/swfdec_font.c |  129 +++++++--------------------------------------------
 swfdec/swfdec_font.h |    8 ++-
 swfdec/swfdec_tag.c  |    2 
 3 files changed, 25 insertions(+), 114 deletions(-)

New commits:
commit eee1ceb95119fb048433941e83e76c2ffc1da593
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Mar 13 22:53:02 2008 +0100

    don't try to read values when we should just set defaults

diff --git a/swfdec/swfdec_font.c b/swfdec/swfdec_font.c
index 1334bca..42a40c0 100644
--- a/swfdec/swfdec_font.c
+++ b/swfdec/swfdec_font.c
@@ -349,9 +349,9 @@ tag_func_define_font_2 (SwfdecSwfDecoder * s, guint tag)
     }
     swfdec_font_parse_kerning_table (s, font, wide_codes);
   } else {
-    font->ascent = swfdec_bits_get_u16 (bits);
-    font->descent = swfdec_bits_get_u16 (bits);
-    font->leading = swfdec_bits_get_u16 (bits);
+    font->ascent = font->scale_factor;
+    font->descent = 0;
+    font->leading = 0;
     for (i = 0; i < n_glyphs && swfdec_bits_left (bits); i++) {
       SwfdecFontEntry *entry = &g_array_index (font->glyphs, SwfdecFontEntry, i);
       entry->advance = font->scale_factor;
commit f2c65da2df0de9bb3bf25b9d673a68e8b76e6d6d
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Mar 13 22:47:25 2008 +0100

    remove warning

diff --git a/swfdec/swfdec_font.c b/swfdec/swfdec_font.c
index 6f5ed87..1334bca 100644
--- a/swfdec/swfdec_font.c
+++ b/swfdec/swfdec_font.c
@@ -290,9 +290,6 @@ tag_func_define_font_2 (SwfdecSwfDecoder * s, guint tag)
   SWFDEC_LOG (" wide offsets = %d", wide_offsets);
   wide_codes = swfdec_bits_getbit (bits);
   SWFDEC_LOG (" wide codes = %d", wide_codes);
-  if (wide_codes == 0) {
-    SWFDEC_ERROR (" wide codes should be set in DefineFont3");
-  }
   font->italic = swfdec_bits_getbit (bits);
   SWFDEC_LOG (" italic = %d", font->italic);
   font->bold = swfdec_bits_getbit (bits);
commit cad9dc327dc4725665e0f6f8040d09c37b39ddeb
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Mar 13 18:41:03 2008 +0100

    rework Font parsing
    
    - DefineFont2 and DefineFont3 are almost equal
    - save the rest of proeprties in the SwfdecFont structure

diff --git a/swfdec/swfdec_font.c b/swfdec/swfdec_font.c
index bce8792..6f5ed87 100644
--- a/swfdec/swfdec_font.c
+++ b/swfdec/swfdec_font.c
@@ -265,105 +265,6 @@ swfdec_font_parse_kerning_table (SwfdecSwfDecoder *s, SwfdecFont *font, gboolean
 int
 tag_func_define_font_2 (SwfdecSwfDecoder * s, guint tag)
 {
-  SwfdecBits *bits = &s->b;
-  SwfdecBits offset_bits;
-  guint id;
-  SwfdecFont *font;
-  SwfdecRect rect;
-
-  int has_layout;
-  int shift_jis;
-  int reserved;
-  int ansi;
-  int wide_offsets;
-  int wide_codes;
-  int italic;
-  int bold;
-  int langcode;
-  int font_name_len;
-  int n_glyphs;
-  int font_ascent;
-  int font_descent;
-  int font_leading;
-  int i;
-  guint offset;
-
-  id = swfdec_bits_get_u16 (bits);
-  font = swfdec_swf_decoder_create_character (s, id, SWFDEC_TYPE_FONT);
-  if (!font)
-    return SWFDEC_STATUS_OK;
-  font->scale_factor = SWFDEC_TEXT_SCALE_FACTOR;
-
-  has_layout = swfdec_bits_getbit (bits);
-  shift_jis = swfdec_bits_getbit (bits);
-  reserved = swfdec_bits_getbit (bits);
-  ansi = swfdec_bits_getbit (bits);
-  wide_offsets = swfdec_bits_getbit (bits);
-  wide_codes = swfdec_bits_getbit (bits);
-  italic = swfdec_bits_getbit (bits);
-  bold = swfdec_bits_getbit (bits);
-
-  langcode = swfdec_bits_get_u8 (bits);
-  SWFDEC_DEBUG("langcode %d", langcode);
-
-  font_name_len = swfdec_bits_get_u8 (bits);
-  font->name = swfdec_bits_get_string_length (bits, font_name_len, s->version);
-  if (font->name == NULL) {
-    SWFDEC_ERROR ("error reading font name");
-  } else {
-    SWFDEC_LOG ("  font name = %s", font->name);
-  }
-
-  n_glyphs = swfdec_bits_get_u16 (bits);
-  if (wide_offsets) {
-    swfdec_bits_init_bits (&offset_bits, bits, 4 * n_glyphs + 4);
-    offset = swfdec_bits_get_u32 (&offset_bits);
-  } else {
-    swfdec_bits_init_bits (&offset_bits, bits, 2 * n_glyphs + 2);
-    offset = swfdec_bits_get_u16 (&offset_bits);
-  }
-
-  g_array_set_size (font->glyphs, n_glyphs);
-
-  for (i = 0; i < n_glyphs && swfdec_bits_left (&s->b); i++) {
-    SwfdecFontEntry *entry = &g_array_index (font->glyphs, SwfdecFontEntry, i);
-    guint next_offset;
-
-    if (wide_offsets)
-      next_offset = swfdec_bits_get_u32 (&offset_bits);
-    else
-      next_offset = swfdec_bits_get_u16 (&offset_bits);
-    swfdec_font_parse_shape (s, entry, next_offset - offset);
-    offset = next_offset;
-  }
-  if (i < n_glyphs) {
-    SWFDEC_ERROR ("data was only enough for %u glyphs, not %u", i, n_glyphs);
-    g_array_set_size (font->glyphs, i);
-    n_glyphs = i;
-  }
-  if (wide_codes) {
-    swfdec_bits_skip_bytes (bits, 2 * n_glyphs);
-  } else {
-    swfdec_bits_skip_bytes (bits, 1 * n_glyphs);
-  }
-  if (has_layout) {
-    font_ascent = swfdec_bits_get_s16 (bits);
-    font_descent = swfdec_bits_get_s16 (bits);
-    font_leading = swfdec_bits_get_s16 (bits);
-    //font_advance_table = swfdec_bits_get_s16(bits);
-    swfdec_bits_skip_bytes (bits, 2 * n_glyphs);
-    for (i = 0; i < n_glyphs && swfdec_bits_left (bits); i++) {
-      swfdec_bits_get_rect (bits, &rect);
-    }
-    swfdec_font_parse_kerning_table (s, font, wide_codes);
-  }
-
-  return SWFDEC_STATUS_OK;
-}
-
-int
-tag_func_define_font_3 (SwfdecSwfDecoder * s, guint tag)
-{
   SwfdecBits offsets, *bits = &s->b;
   SwfdecFont *font;
   SwfdecLanguage language;
@@ -375,7 +276,7 @@ tag_func_define_font_3 (SwfdecSwfDecoder * s, guint tag)
   if (!font)
     return SWFDEC_STATUS_OK;
   SWFDEC_LOG ("  id = %u", id);
-  font->scale_factor = 20 * SWFDEC_TEXT_SCALE_FACTOR;
+  font->scale_factor = 20 * SWFDEC_TEXT_SCALE_FACTOR * (tag == SWFDEC_TAG_DEFINEFONT3 ? 20 : 1);
 
   layout = swfdec_bits_getbit (bits);
   SWFDEC_LOG (" layout = %d", layout);
@@ -438,19 +339,28 @@ tag_func_define_font_3 (SwfdecSwfDecoder * s, guint tag)
       entry->value = swfdec_bits_get_u8 (bits);
   }
   if (layout) {
-    guint ascent, descent, leading;
-
-    ascent = swfdec_bits_get_u16 (bits);
-    descent = swfdec_bits_get_u16 (bits);
-    leading = swfdec_bits_get_u16 (bits);
+    font->ascent = swfdec_bits_get_u16 (bits);
+    font->descent = swfdec_bits_get_u16 (bits);
+    font->leading = swfdec_bits_get_u16 (bits);
     for (i = 0; i < n_glyphs && swfdec_bits_left (bits); i++) {
-      /* guint advance = */ swfdec_bits_get_u16 (bits);
+      SwfdecFontEntry *entry = &g_array_index (font->glyphs, SwfdecFontEntry, i);
+      entry->advance = swfdec_bits_get_u16 (bits);
     }
     for (i = 0; i < n_glyphs && swfdec_bits_left (bits); i++) {
-      SwfdecRect rect;
-      swfdec_bits_get_rect (bits, &rect);
+      SwfdecFontEntry *entry = &g_array_index (font->glyphs, SwfdecFontEntry, i);
+      swfdec_bits_get_rect (bits, &entry->extents);
     }
     swfdec_font_parse_kerning_table (s, font, wide_codes);
+  } else {
+    font->ascent = swfdec_bits_get_u16 (bits);
+    font->descent = swfdec_bits_get_u16 (bits);
+    font->leading = swfdec_bits_get_u16 (bits);
+    for (i = 0; i < n_glyphs && swfdec_bits_left (bits); i++) {
+      SwfdecFontEntry *entry = &g_array_index (font->glyphs, SwfdecFontEntry, i);
+      entry->advance = font->scale_factor;
+      entry->extents.x0 = entry->extents.y0 = 0;
+      entry->extents.x1 = entry->extents.y1 = font->scale_factor;
+    }
   }
 
   return SWFDEC_STATUS_OK;
diff --git a/swfdec/swfdec_font.h b/swfdec/swfdec_font.h
index a34eb39..e1425e0 100644
--- a/swfdec/swfdec_font.h
+++ b/swfdec/swfdec_font.h
@@ -51,6 +51,8 @@ typedef enum {
 struct _SwfdecFontEntry {
   SwfdecDraw *		draw;		/* drawing operation to do or %NULL if none (ie space character) */
   gunichar		value;		/* UCS2 value of glyph */
+  guint			advance;	/* advance when rendering character */
+  SwfdecRect		extents;	/* bounding box of the font relative to the scale mode */
 };
 
 struct _SwfdecFont
@@ -64,6 +66,10 @@ struct _SwfdecFont
   gboolean		small;		/* font is rendered at small sizes */
   GArray *		glyphs;		/* SwfdecFontEntry */
   guint			scale_factor;	/* size of a font in glyph entry */
+  /* used when rendering TextFields */
+  guint			ascent;		/* font ascent */
+  guint			descent;	/* font descent */
+  guint			leading;	/* */
 };
 
 struct _SwfdecFontClass
@@ -82,8 +88,6 @@ int		tag_func_define_font		(SwfdecSwfDecoder *	s,
 						 guint			tag);
 int		tag_func_define_font_2		(SwfdecSwfDecoder *	s,
 						 guint			tag);
-int		tag_func_define_font_3		(SwfdecSwfDecoder *	s,
-						 guint			tag);
 
 G_END_DECLS
 #endif
diff --git a/swfdec/swfdec_tag.c b/swfdec/swfdec_tag.c
index dc98ee7..1995e99 100644
--- a/swfdec/swfdec_tag.c
+++ b/swfdec/swfdec_tag.c
@@ -581,7 +581,7 @@ static struct tag_func_struct tag_funcs[] = {
   [SWFDEC_TAG_IMPORTASSETS2] = {"ImportAssets2", NULL, 0},
   [SWFDEC_TAG_DEFINEFONTALIGNZONES] = {"DefineFontAlignZones", NULL, 0},
   [SWFDEC_TAG_CSMTEXTSETTINGS] = {"CSMTextSettings", NULL, 0},
-  [SWFDEC_TAG_DEFINEFONT3] = {"DefineFont3", tag_func_define_font_3, 0},
+  [SWFDEC_TAG_DEFINEFONT3] = {"DefineFont3", tag_func_define_font_2, 0},
   [SWFDEC_TAG_AVM2DECL] = {"AVM2Decl", NULL, SWFDEC_TAG_DEFINE_SPRITE },
   [SWFDEC_TAG_METADATA] = {"Metadata", NULL, 0},
   [SWFDEC_TAG_DEFINESCALINGGRID] = {"DefineScalingGrid", NULL, 0},


More information about the Swfdec-commits mailing list