[Swfdec] 5 commits - libswfdec/swfdec_html_parser.c libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_xml.c libswfdec/swfdec_xml.h
Pekka Lampila
medar at kemper.freedesktop.org
Sun Oct 14 05:09:30 PDT 2007
libswfdec/swfdec_html_parser.c | 2 +-
libswfdec/swfdec_text_field.c | 32 +++++++++++++++++++++-----------
libswfdec/swfdec_text_field.h | 4 +++-
libswfdec/swfdec_text_field_movie.c | 6 ++++--
libswfdec/swfdec_text_field_movie_as.c | 12 ++++++------
libswfdec/swfdec_xml.c | 18 +++++++++---------
libswfdec/swfdec_xml.h | 12 ++++++++----
7 files changed, 52 insertions(+), 34 deletions(-)
New commits:
commit 5272df32bbe0ad08d920a5c3e4342aab8c4572e8
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Sun Oct 14 15:08:57 2007 +0300
Get only the name of the font from EditText tag, not SwfdecFont
diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c
index fabddb2..2f38d85 100644
--- a/libswfdec/swfdec_text_field.c
+++ b/libswfdec/swfdec_text_field.c
@@ -62,6 +62,8 @@ swfdec_text_field_dispose (GObject *object)
text->text_input = NULL;
g_free (text->variable);
text->variable = NULL;
+ g_free (text->font);
+ text->font = NULL;
G_OBJECT_CLASS (swfdec_text_field_parent_class)->dispose (object);
}
@@ -396,7 +398,7 @@ tag_func_define_edit_text (SwfdecSwfDecoder * s, guint tag)
font = swfdec_swf_decoder_get_character (s, id);
if (SWFDEC_IS_FONT (font)) {
SWFDEC_LOG (" font = %u", id);
- text->font = SWFDEC_FONT (font);
+ text->font = g_strdup (SWFDEC_FONT (font)->name);
} else {
SWFDEC_ERROR ("id %u does not specify a font", id);
}
diff --git a/libswfdec/swfdec_text_field.h b/libswfdec/swfdec_text_field.h
index c565b2a..938dbfd 100644
--- a/libswfdec/swfdec_text_field.h
+++ b/libswfdec/swfdec_text_field.h
@@ -101,9 +101,9 @@ struct _SwfdecTextField
gboolean background;
/* only to be passed to the movie object */
- SwfdecFont * font;
char * text_input;
char * variable;
+ char * font;
guint size;
SwfdecColor color;
SwfdecTextAlign align;
diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 304e8e8..69a7a68 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -542,8 +542,10 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
swfdec_text_format_set_defaults (text->format_new);
text->format_new->color = text->text->color;
text->format_new->align = text->text->align;
- if (text->text->font != NULL && text->text->font->name != NULL)
- text->format_new->font = text->text->font->name;
+ if (text->text->font != NULL) {
+ text->format_new->font =
+ swfdec_as_context_get_string (cx, text->text->font);
+ }
text->format_new->size = text->text->size / 20;
text->format_new->left_margin = text->text->left_margin / 20;
text->format_new->right_margin = text->text->right_margin / 20;
commit eecddf540e4e6cc66af293061e2f1d58fa9e0843
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Sun Oct 14 14:11:42 2007 +0300
Make swfdec_xml_unescape output different based on the version
diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 3c0ca04..cba7aa7 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -339,7 +339,7 @@ swfdec_text_field_movie_html_parse_text (ParserData *data, const char *p,
end = p + strcspn (p, "<\n");
}
- unescaped = swfdec_xml_unescape_len (p, end - p);
+ unescaped = swfdec_xml_unescape_len (data->cx, p, end - p);
data->text = g_string_append (data->text, unescaped);
g_free (unescaped);
diff --git a/libswfdec/swfdec_xml.c b/libswfdec/swfdec_xml.c
index a710f15..c3c2e44 100644
--- a/libswfdec/swfdec_xml.c
+++ b/libswfdec/swfdec_xml.c
@@ -116,7 +116,8 @@ swfdec_xml_escape (const char *orginal)
}
char *
-swfdec_xml_unescape_len (const char *orginal, gssize length)
+swfdec_xml_unescape_len (SwfdecAsContext *cx, const char *orginal,
+ gssize length)
{
int i;
const char *p, *start;
@@ -132,7 +133,7 @@ swfdec_xml_unescape_len (const char *orginal, gssize length)
if (!g_ascii_strncasecmp (p, xml_entities[i].escaped,
strlen (xml_entities[i].escaped))) {
// FIXME: Do this cleaner
- if (xml_entities[i].character == '\xa0')
+ if (cx->version > 5 && xml_entities[i].character == '\xa0')
string = g_string_append_c (string, '\xc2');
string = g_string_append_c (string, xml_entities[i].character);
p += strlen (xml_entities[i].escaped);
@@ -152,9 +153,9 @@ swfdec_xml_unescape_len (const char *orginal, gssize length)
}
char *
-swfdec_xml_unescape (const char *orginal)
+swfdec_xml_unescape (SwfdecAsContext *cx, const char *orginal)
{
- return swfdec_xml_unescape_len (orginal, strlen (orginal));
+ return swfdec_xml_unescape_len (cx, orginal, strlen (orginal));
}
// this is never declared, only available as ASnative (100, 5)
@@ -481,7 +482,7 @@ swfdec_xml_parse_attribute (SwfdecXml *xml, SwfdecXmlNode *node, const char *p)
text = g_strndup (p, end - p);
name = swfdec_as_context_give_string (SWFDEC_AS_OBJECT (node)->context,
- swfdec_xml_unescape (text));
+ swfdec_xml_unescape (SWFDEC_AS_OBJECT (xml)->context, text));
g_free (text);
p = end + strspn (end, " \r\n\t");
@@ -506,9 +507,8 @@ swfdec_xml_parse_attribute (SwfdecXml *xml, SwfdecXmlNode *node, const char *p)
return strchr (p, '\0');
}
- text = g_strndup (p + 1, end - (p + 1));
- unescaped = swfdec_xml_unescape (text);
- g_free (text);
+ unescaped = swfdec_xml_unescape_len (SWFDEC_AS_OBJECT (xml)->context, p + 1,
+ end - (p + 1));
value = swfdec_as_context_give_string (SWFDEC_AS_OBJECT (node)->context,
unescaped);
SWFDEC_AS_VALUE_SET_STRING (&val, value);
@@ -638,7 +638,7 @@ swfdec_xml_parse_text (SwfdecXml *xml, SwfdecXmlNode *node,
if (!xml->ignoreWhite || strspn (p, " \t\r\n") < (size_t)(end - p))
{
text = g_strndup (p, end - p);
- unescaped = swfdec_xml_unescape (text);
+ unescaped = swfdec_xml_unescape (SWFDEC_AS_OBJECT (xml)->context, text);
g_free (text);
child = swfdec_xml_node_new (SWFDEC_AS_OBJECT (node)->context,
SWFDEC_XML_NODE_TEXT, unescaped);
diff --git a/libswfdec/swfdec_xml.h b/libswfdec/swfdec_xml.h
index 3b0396d..1faff6b 100644
--- a/libswfdec/swfdec_xml.h
+++ b/libswfdec/swfdec_xml.h
@@ -69,10 +69,14 @@ struct _SwfdecXmlClass {
GType swfdec_xml_get_type (void);
-char * swfdec_xml_escape (const char *orginal);
-char * swfdec_xml_escape_len (const char *orginal, gssize length);
-char * swfdec_xml_unescape (const char *orginal);
-char * swfdec_xml_unescape_len (const char *orginal, gssize length);
+char * swfdec_xml_escape (const char * orginal);
+char * swfdec_xml_escape_len (const char * orginal,
+ gssize length);
+char * swfdec_xml_unescape (SwfdecAsContext * cx,
+ const char * orginal);
+char * swfdec_xml_unescape_len (SwfdecAsContext * cx,
+ const char * orginal,
+ gssize length);
G_END_DECLS
#endif
commit 4a8fa887bc77eaa276b39e3196a804a75e959e32
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Sun Oct 14 14:03:41 2007 +0300
Use SWFDEC_GRAPHIC (x) not x.graphic
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 77c2652..e21183a 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -737,12 +737,12 @@ swfdec_text_field_movie_createTextField (SwfdecAsContext *cx,
edittext->indent = 0;
edittext->leading = 0;
- edittext->graphic.extents.x0 = SWFDEC_DOUBLE_TO_TWIPS (x);
- edittext->graphic.extents.x1 =
- edittext->graphic.extents.x0 + SWFDEC_DOUBLE_TO_TWIPS (width);
- edittext->graphic.extents.y0 = SWFDEC_DOUBLE_TO_TWIPS (y);
- edittext->graphic.extents.y1 =
- edittext->graphic.extents.y0 + SWFDEC_DOUBLE_TO_TWIPS (height);
+ SWFDEC_GRAPHIC (edittext)->extents.x0 = SWFDEC_DOUBLE_TO_TWIPS (x);
+ SWFDEC_GRAPHIC (edittext)->extents.x1 =
+ SWFDEC_GRAPHIC (edittext)->extents.x0 + SWFDEC_DOUBLE_TO_TWIPS (width);
+ SWFDEC_GRAPHIC (edittext)->extents.y0 = SWFDEC_DOUBLE_TO_TWIPS (y);
+ SWFDEC_GRAPHIC (edittext)->extents.y1 =
+ SWFDEC_GRAPHIC (edittext)->extents.y0 + SWFDEC_DOUBLE_TO_TWIPS (height);
movie = swfdec_movie_find (parent, depth);
if (movie)
commit 75d1a8f000dbd98afd375f521cf8c0fff79ea9a1
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Sun Oct 14 13:38:04 2007 +0300
Don't allow negative indent in TextField that goes over the left edge
diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c
index b6a97a3..fabddb2 100644
--- a/libswfdec/swfdec_text_field.c
+++ b/libswfdec/swfdec_text_field.c
@@ -138,8 +138,11 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr,
block->right_margin - block->block_indent;
if (block->index_ == 0 && paragraphs[i].indent < 0) {
- layout->render_offset_x += paragraphs[i].indent / PANGO_SCALE;
- width += -paragraphs[i].indent / PANGO_SCALE;
+ // limit negative indent to not go over leftMargin + blockIndent
+ int indent = MAX (paragraphs[i].indent / PANGO_SCALE,
+ -(block->left_margin + block->block_indent));
+ layout->render_offset_x += indent;
+ width += -indent;
}
if (text->word_wrap) {
commit 3000a03cfb7eeea8c55b8975802a98ec6baa8265
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Sun Oct 14 12:53:50 2007 +0300
Add support for vertical scrolling to the rendering part of TextField
diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c
index 867b30d..b6a97a3 100644
--- a/libswfdec/swfdec_text_field.c
+++ b/libswfdec/swfdec_text_field.c
@@ -295,19 +295,21 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr,
PangoLayoutIter *iter_line;
PangoLayoutLine *line;
PangoRectangle rect;
+ int skipped;
iter_line = pango_layout_get_iter (layout->layout);
+ skipped = 0;
do {
- /*if (++linenum < text->text->scroll) {
- cairo_rel_move_to (cr, 0, -rect.height);
- y -= rect.height;
+ if (++linenum < text->scroll + 1)
continue;
- }*/
pango_layout_iter_get_line_extents (iter_line, NULL, &rect);
pango_extents_to_pixels (NULL, &rect);
+ if (linenum == text->scroll + 1)
+ skipped = rect.y;
+
if (y + rect.y > limit.y1 ||
y + rect.y + rect.height > SWFDEC_GRAPHIC (text)->extents.y1)
break;
@@ -318,15 +320,18 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr,
continue;
cairo_rel_move_to (cr, layout->render_offset_x + rect.x,
- pango_layout_iter_get_baseline (iter_line) / PANGO_SCALE);
+ pango_layout_iter_get_baseline (iter_line) / PANGO_SCALE - skipped);
line = pango_layout_iter_get_line_readonly (iter_line);
pango_cairo_show_layout_line (cr, line);
cairo_rel_move_to (cr, -(layout->render_offset_x + rect.x),
- -pango_layout_iter_get_baseline (iter_line) / PANGO_SCALE);
+ -(pango_layout_iter_get_baseline (iter_line) / PANGO_SCALE - skipped));
} while (pango_layout_iter_next_line (iter_line));
- cairo_rel_move_to (cr, 0, layout->height);
- y += layout->height;
+ if (linenum >= text->scroll + 1) {
+ cairo_rel_move_to (cr, 0, layout->height - skipped);
+ y += layout->height - skipped;
+ skipped = 0;
+ }
}
for (iter = layouts; iter != NULL; iter = iter->next)
diff --git a/libswfdec/swfdec_text_field.h b/libswfdec/swfdec_text_field.h
index dda2787..c565b2a 100644
--- a/libswfdec/swfdec_text_field.h
+++ b/libswfdec/swfdec_text_field.h
@@ -95,6 +95,8 @@ struct _SwfdecTextField
gboolean multiline;
SwfdecAutoSize auto_size;
+ int scroll;
+
gboolean border;
gboolean background;
More information about the Swfdec
mailing list