Pekka Lampila
2007-Oct-15 09:33 UTC
[Swfdec] 6 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_video.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_text_field_movie.h libswfdec/swfdec_text_format.c libswfdec/swfdec_text_format.h
libswfdec/swfdec_as_strings.c | 8 + libswfdec/swfdec_codec_audio.c | 1 libswfdec/swfdec_codec_video.c | 1 libswfdec/swfdec_text_field.c | 74 +++++---- libswfdec/swfdec_text_field.h | 5 libswfdec/swfdec_text_field_movie.c | 140 +++++++++++++++--- libswfdec/swfdec_text_field_movie.h | 26 --- libswfdec/swfdec_text_field_movie_as.c | 247 ++++++++++++++++++++++++++++----- libswfdec/swfdec_text_format.c | 67 ++++++++ libswfdec/swfdec_text_format.h | 4 10 files changed, 464 insertions(+), 109 deletions(-) New commits: commit d964fa7f3b9b06dc6af4bb62cd64ff473714c543 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Mon Oct 15 12:33:43 2007 +0300 Fix compile warnings in swfdec_video_decoder_new and swfdec_audio_decoder_new diff --git a/libswfdec/swfdec_codec_audio.c b/libswfdec/swfdec_codec_audio.c index bdf33f3..7c4ab8a 100644 --- a/libswfdec/swfdec_codec_audio.c +++ b/libswfdec/swfdec_codec_audio.c @@ -160,6 +160,7 @@ swfdec_audio_decoder_new (SwfdecAudioCodec codec, SwfdecAudioFormat format) list = g_getenv ("SWFDEC_CODEC"); if (list == NULL) { guint i; + ret = NULL; for (i = 0; audio_codecs[i].name != NULL; i++) { ret = audio_codecs[i].func (codec, format); if (ret) diff --git a/libswfdec/swfdec_codec_video.c b/libswfdec/swfdec_codec_video.c index bdcce56..291c24d 100644 --- a/libswfdec/swfdec_codec_video.c +++ b/libswfdec/swfdec_codec_video.c @@ -73,6 +73,7 @@ swfdec_video_decoder_new (SwfdecVideoCodec codec) list = g_getenv ("SWFDEC_CODEC"); if (list == NULL) { guint i; + ret = NULL; for (i = 0; video_codecs[i].name != NULL; i++) { ret = video_codecs[i].func (codec); if (ret) commit 3247196e467bdeafa5414229bdfd4722ac071ce9 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Mon Oct 15 12:30:58 2007 +0300 Make TextField setTextFormat merge any styles that become equal diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index d6e89e9..e40001f 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -686,7 +686,7 @@ void swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text, SwfdecTextFormat *format, guint start_index, guint end_index) { - SwfdecFormatIndex *findex, *findex_new; + SwfdecFormatIndex *findex, *findex_new, *findex_prev; guint findex_end_index; GSList *iter, *next; @@ -698,10 +698,13 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text, g_assert (text->formats != NULL); g_assert (text->formats->data != NULL); g_assert (((SwfdecFormatIndex *)text->formats->data)->index == 0); + + findex = NULL; for (iter = text->formats; iter != NULL && ((SwfdecFormatIndex *)iter->data)->index < end_index; iter = next) { + findex_prev = findex; next = iter->next; findex = iter->data; if (iter->next != NULL) { @@ -714,6 +717,9 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text, if (findex_end_index < start_index) continue; + if (swfdec_text_format_equal_or_undefined (findex->format, format)) + continue; + if (findex_end_index > end_index) { findex_new = g_new (SwfdecFormatIndex, 1); findex_new->index = end_index; @@ -729,8 +735,25 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text, swfdec_text_format_add (findex_new->format, format); iter = g_slist_insert (iter, findex_new, 1); + findex = findex_new; } else { swfdec_text_format_add (findex->format, format); + + // if current format now equals previous one, remove current + if (findex_prev != NULL && + swfdec_text_format_equal (findex->format, findex_prev->format)) { + text->formats = g_slist_remove (text->formats, findex); + findex = findex_prev; + } + } + + // if current format now equals the next one, remove current + if (findex_end_index <= end_index && next != NULL && + swfdec_text_format_equal (findex->format, + ((SwfdecFormatIndex *)next->data)->format)) + { + text->formats = g_slist_remove (text->formats, findex); + findex = findex_prev; } } diff --git a/libswfdec/swfdec_text_format.c b/libswfdec/swfdec_text_format.c index f507b86..3a12605 100644 --- a/libswfdec/swfdec_text_format.c +++ b/libswfdec/swfdec_text_format.c @@ -947,6 +947,73 @@ swfdec_text_format_add (SwfdecTextFormat *format, const SwfdecTextFormat *from) format->values_set |= from->values_set; } +gboolean +swfdec_text_format_equal_or_undefined (const SwfdecTextFormat *a, + const SwfdecTextFormat *b) +{ + int set; + + set = a->values_set & b->values_set; + + g_return_val_if_fail (SWFDEC_IS_TEXT_FORMAT (a), FALSE); + g_return_val_if_fail (SWFDEC_IS_TEXT_FORMAT (b), FALSE); + + if (set & (1 << PROP_ALIGN) && a->align != b->align) + return FALSE; + if (set & (1 << PROP_BLOCK_INDENT) && a->block_indent != b->block_indent) + return FALSE; + if (set & (1 << PROP_BOLD) && a->bold != b->bold) + return FALSE; + if (set & (1 << PROP_BULLET) && a->bullet != b->bullet) + return FALSE; + if (set & (1 << PROP_COLOR) && a->color != b->color) + return FALSE; + if (set & (1 << PROP_DISPLAY) && a->display != b->display) + return FALSE; + if (set & (1 << PROP_FONT) && a->font != b->font) + return FALSE; + if (set & (1 << PROP_INDENT) && a->indent != b->indent) + return FALSE; + if (set & (1 << PROP_ITALIC) && a->italic != b->italic) + return FALSE; + if (set & (1 << PROP_KERNING) && a->kerning != b->kerning) + return FALSE; + if (set & (1 << PROP_LEADING) && a->leading != b->leading) + return FALSE; + if (set & (1 << PROP_LEFT_MARGIN) && a->left_margin != b->left_margin) + return FALSE; + if (set & (1 << PROP_LETTER_SPACING) && + a->letter_spacing != b->letter_spacing) { + return FALSE; + } + if (set & (1 << PROP_RIGHT_MARGIN) && a->right_margin != b->right_margin) + return FALSE; + if (set & (1 << PROP_SIZE) && a->size != b->size) + return FALSE; + if (set & (1 << PROP_TAB_STOPS) && a->tab_stops != b->tab_stops) + return FALSE; + if (set & (1 << PROP_TARGET) && a->target != b->target) + return FALSE; + if (set & (1 << PROP_UNDERLINE) && a->underline != b->underline) + return FALSE; + if (set & (1 << PROP_URL) && a->url != b->url) + return FALSE; + + return TRUE; +} + +gboolean +swfdec_text_format_equal (const SwfdecTextFormat *a, const SwfdecTextFormat *b) +{ + g_return_val_if_fail (SWFDEC_IS_TEXT_FORMAT (a), FALSE); + g_return_val_if_fail (SWFDEC_IS_TEXT_FORMAT (b), FALSE); + + if (a->values_set != b->values_set) + return FALSE; + + return swfdec_text_format_equal_or_undefined (a, b); +} + void swfdec_text_format_set_defaults (SwfdecTextFormat *format) { diff --git a/libswfdec/swfdec_text_format.h b/libswfdec/swfdec_text_format.h index 9fc7cee..6726b43 100644 --- a/libswfdec/swfdec_text_format.h +++ b/libswfdec/swfdec_text_format.h @@ -89,6 +89,10 @@ void swfdec_text_format_set_defaults (SwfdecTextFormat * format); SwfdecTextFormat * swfdec_text_format_copy (const SwfdecTextFormat *copy_from); void swfdec_text_format_add (SwfdecTextFormat * format, const SwfdecTextFormat *from); +gboolean swfdec_text_format_equal (const SwfdecTextFormat *a, + const SwfdecTextFormat *b); +gboolean swfdec_text_format_equal_or_undefined (const SwfdecTextFormat *a, + const SwfdecTextFormat *b); G_END_DECLS #endif commit 5dbe5e92642672a4514158331785204edfc619d9 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Mon Oct 15 12:18:19 2007 +0300 TextField: Render first visible line, even if it doesn't fit completely diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c index e848c90..a594bbd 100644 --- a/libswfdec/swfdec_text_field.c +++ b/libswfdec/swfdec_text_field.c @@ -276,6 +276,7 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, SwfdecRect limit; SwfdecColor color; int i, y, x, linenum; + gboolean first; g_return_if_fail (SWFDEC_IS_TEXT_FIELD (text)); g_return_if_fail (cr != NULL); @@ -308,6 +309,7 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, layouts = swfdec_text_field_generate_layouts (text, cr, paragraphs, trans, inval, NULL); + first = TRUE; linenum = 0; x = SWFDEC_GRAPHIC (text)->extents.x0; y = SWFDEC_GRAPHIC (text)->extents.y0 + 1; @@ -334,10 +336,15 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, if (linenum == text->scroll) skipped = rect.y; - if (y + rect.y > limit.y1 || + if (!first && y + rect.y + rect.height > SWFDEC_GRAPHIC (text)->extents.y1) break; + first = FALSE; + + if (y + rect.y > limit.y1) + break; + if (y + rect.y + rect.height < limit.y0 || x + layout->render_offset_x + rect.x > limit.x1 || x + layout->render_offset_x + rect.x + rect.width < limit.x0) commit 971e4423bd5d8656d1be8b8d6ba70a15a325a1d6 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Mon Oct 15 11:07:28 2007 +0300 More TextField code cleanup diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 11540ba..d6e89e9 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -364,9 +364,6 @@ swfdec_text_field_movie_free_paragraphs (SwfdecTextFieldMovie *text) } } -static cairo_surface_t *surface = NULL; -static cairo_t *cr = NULL; - static SwfdecLayout * swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num) { @@ -375,14 +372,7 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num) if (text->paragraphs == NULL) swfdec_text_field_movie_generate_paragraphs (text); - // FIXME: Temporary using image surface, until there is a way to get cairo_t - // outside the rendering functions - g_assert (surface == NULL); - g_assert (cr == NULL); - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); - cr = cairo_create (surface); - - return swfdec_text_field_generate_layouts (text->text, cr, + return swfdec_text_field_generate_layouts (text->text, text->cr, text->paragraphs, NULL, NULL, num); } @@ -398,14 +388,6 @@ swfdec_text_field_movie_free_layouts (SwfdecLayout *layouts) } g_free (layouts); - - g_assert (cr != NULL); - g_assert (surface != NULL); - - cairo_destroy (cr); - cr = NULL; - cairo_surface_destroy (surface); - surface = NULL; } void @@ -551,6 +533,9 @@ swfdec_text_field_movie_dispose (GObject *object) } g_slist_free (text->formats); + cairo_destroy (text->cr); + cairo_surface_destroy (text->surface); + G_OBJECT_CLASS (swfdec_text_field_movie_parent_class)->dispose (object); } @@ -693,6 +678,8 @@ swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class) static void swfdec_text_field_movie_init (SwfdecTextFieldMovie *text) { + text->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + text->cr = cairo_create (text->surface); } void diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h index f394747..d7bbb03 100644 --- a/libswfdec/swfdec_text_field_movie.h +++ b/libswfdec/swfdec_text_field_movie.h @@ -63,6 +63,11 @@ struct _SwfdecTextFieldMovie { SwfdecColor border_color; SwfdecColor background_color; + // FIXME: Temporary using image surface, until there is a way to get cairo_t + // outside the rendering functions + cairo_surface_t * surface; + cairo_t * cr; + /* for rendering */ SwfdecParagraph * paragraphs; }; commit 251eb0e0a313a7ebf017e4f17105b96fedf77e4a Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Mon Oct 15 10:59:29 2007 +0300 Cleaned up some TextField code. Added and fixed properties Added properties: multiline, type, scroll Fixed length property to work with UTF strings correctly Changed the handling of PangoLayouts somewhat (WIP) Removed some cruft from swfdec_text_field_movie.h diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index a58a1e8..957f484 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -400,5 +400,10 @@ const char swfdec_as_strings[] SWFDEC_AS_CONSTANT_STRING ("background") SWFDEC_AS_CONSTANT_STRING ("backgroundColor") SWFDEC_AS_CONSTANT_STRING ("borderColor") + SWFDEC_AS_CONSTANT_STRING ("multiline") + SWFDEC_AS_CONSTANT_STRING ("type") + SWFDEC_AS_CONSTANT_STRING ("input") + SWFDEC_AS_CONSTANT_STRING ("dynamic") + SWFDEC_AS_CONSTANT_STRING ("scroll") /* add more here */ ; diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c index 214e338..e848c90 100644 --- a/libswfdec/swfdec_text_field.c +++ b/libswfdec/swfdec_text_field.c @@ -82,25 +82,24 @@ swfdec_text_field_class_init (SwfdecTextFieldClass * g_class) static void swfdec_text_field_init (SwfdecTextField * text) { + text->scroll = 1; text->max_length = G_MAXUINT; } -GList * +SwfdecLayout * swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, const SwfdecParagraph *paragraphs, const SwfdecColorTransform *trans, - const SwfdecRect *inval) + const SwfdecRect *inval, int *num) { - GList *layouts; + GArray *layouts; guint i; g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD (text), NULL); g_return_val_if_fail (cr != NULL, NULL); g_return_val_if_fail (paragraphs != NULL, NULL); - if (paragraphs[0].text == NULL) - return NULL; + layouts = g_array_new (TRUE, TRUE, sizeof (SwfdecLayout)); - layouts = NULL; for (i = 0; paragraphs[i].text != NULL; i++) { GList *iter; @@ -109,7 +108,7 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, skip = 0; for (iter = paragraphs[i].blocks; iter != NULL; iter = iter->next) { - SwfdecLayout *layout; + SwfdecLayout layout; PangoLayout *playout; int width; guint length; @@ -129,12 +128,10 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, } // create layout - layout = g_new0 (SwfdecLayout, 1); - playout = layout->layout = pango_cairo_create_layout (cr); - layouts = g_list_append (layouts, layout); + playout = layout.layout = pango_cairo_create_layout (cr); // set rendering position - layout->render_offset_x = block->left_margin + block->block_indent; + layout.render_offset_x = block->left_margin + block->block_indent; width = SWFDEC_GRAPHIC (text)->extents.x1 - SWFDEC_GRAPHIC (text)->extents.x0 - block->left_margin - block->right_margin - block->block_indent; @@ -143,7 +140,7 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, // 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; + layout.render_offset_x += indent; width += -indent; } @@ -240,9 +237,9 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, pango_layout_get_pixel_size (playout, &line_width, 0); if (line_width < width) { if (block->align == PANGO_ALIGN_RIGHT) { - layout->render_offset_x += width - line_width; + layout.render_offset_x += width - line_width; } else if (block->align == PANGO_ALIGN_CENTER) { - layout->render_offset_x += (width - line_width) / 2; + layout.render_offset_x += (width - line_width) / 2; } else { g_assert_not_reached (); } @@ -252,16 +249,21 @@ swfdec_text_field_generate_layouts (SwfdecTextField *text, cairo_t *cr, skip = 0; } - pango_layout_get_pixel_size (playout, &layout->width, &layout->height); - layout->width += layout->render_offset_x + block->right_margin; - layout->height += block->leading / PANGO_SCALE; + pango_layout_get_pixel_size (playout, &layout.width, &layout.height); + layout.width += layout.render_offset_x + block->right_margin; + layout.height += block->leading / PANGO_SCALE; + + layouts = g_array_append_val (layouts, layout); if (!text->word_wrap) break; } } - return layouts; + if (num != NULL) + *num = layouts->len; + + return (SwfdecLayout *)g_array_free (layouts, FALSE); } void @@ -270,10 +272,10 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, SwfdecColor background_color, const SwfdecColorTransform *trans, const SwfdecRect *inval) { - GList *layouts, *iter; + SwfdecLayout *layouts; SwfdecRect limit; SwfdecColor color; - int y, x, linenum; + int i, y, x, linenum; g_return_if_fail (SWFDEC_IS_TEXT_FIELD (text)); g_return_if_fail (cr != NULL); @@ -304,16 +306,16 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, } layouts = swfdec_text_field_generate_layouts (text, cr, paragraphs, trans, - inval); + inval, NULL); linenum = 0; x = SWFDEC_GRAPHIC (text)->extents.x0; y = SWFDEC_GRAPHIC (text)->extents.y0 + 1; cairo_move_to (cr, x, y); - for (iter = layouts; iter != NULL && y < limit.y1; iter = iter->next) + for (i = 0; layouts[i].layout != NULL && y < limit.y1; i++) { - SwfdecLayout *layout = (SwfdecLayout *)iter->data; + SwfdecLayout *layout = &layouts[i]; PangoLayoutIter *iter_line; PangoLayoutLine *line; PangoRectangle rect; @@ -323,13 +325,13 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, skipped = 0; do { - if (++linenum < text->scroll + 1) + if (++linenum < text->scroll) continue; pango_layout_iter_get_line_extents (iter_line, NULL, &rect); pango_extents_to_pixels (NULL, &rect); - if (linenum == text->scroll + 1) + if (linenum == text->scroll) skipped = rect.y; if (y + rect.y > limit.y1 || @@ -349,23 +351,18 @@ swfdec_text_field_render (SwfdecTextField *text, cairo_t *cr, -(pango_layout_iter_get_baseline (iter_line) / PANGO_SCALE - skipped)); } while (pango_layout_iter_next_line (iter_line)); - if (linenum >= text->scroll + 1) { + if (linenum >= text->scroll) { cairo_rel_move_to (cr, 0, layout->height - skipped); y += layout->height - skipped; skipped = 0; } } - for (iter = layouts; iter != NULL; iter = iter->next) - { - SwfdecLayout *layout = (SwfdecLayout *)iter->data; - - g_object_unref (layout->layout); - g_free (layout); - iter->data = NULL; + for (i = 0; layouts[i].layout != NULL; i++) { + g_object_unref (layouts[i].layout); } - g_list_free (layouts); + g_free (layouts); } diff --git a/libswfdec/swfdec_text_field.h b/libswfdec/swfdec_text_field.h index 938dbfd..1609a52 100644 --- a/libswfdec/swfdec_text_field.h +++ b/libswfdec/swfdec_text_field.h @@ -123,11 +123,12 @@ GType swfdec_text_field_get_type (void); int tag_func_define_edit_text (SwfdecSwfDecoder * s, guint tag); -GList * swfdec_text_field_generate_layouts (SwfdecTextField * text, +SwfdecLayout * swfdec_text_field_generate_layouts (SwfdecTextField * text, cairo_t * cr, const SwfdecParagraph * paragraphs, const SwfdecColorTransform * trans, - const SwfdecRect * inval); + const SwfdecRect * inval, + int * num); void swfdec_text_field_render (SwfdecTextField * text, cairo_t * cr, const SwfdecParagraph * paragraphs, diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 3fe67ea..11540ba 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -364,14 +364,107 @@ swfdec_text_field_movie_free_paragraphs (SwfdecTextFieldMovie *text) } } +static cairo_surface_t *surface = NULL; +static cairo_t *cr = NULL; + +static SwfdecLayout * +swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num) +{ + g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text), NULL); + + if (text->paragraphs == NULL) + swfdec_text_field_movie_generate_paragraphs (text); + + // FIXME: Temporary using image surface, until there is a way to get cairo_t + // outside the rendering functions + g_assert (surface == NULL); + g_assert (cr == NULL); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + cr = cairo_create (surface); + + return swfdec_text_field_generate_layouts (text->text, cr, + text->paragraphs, NULL, NULL, num); +} + +static void +swfdec_text_field_movie_free_layouts (SwfdecLayout *layouts) +{ + int i; + + g_return_if_fail (layouts != NULL); + + for (i = 0; layouts[i].layout != NULL; i++) { + g_object_unref (layouts[i].layout); + } + + g_free (layouts); + + g_assert (cr != NULL); + g_assert (surface != NULL); + + cairo_destroy (cr); + cr = NULL; + cairo_surface_destroy (surface); + surface = NULL; +} + +void +swfdec_text_field_movie_set_scroll (SwfdecTextFieldMovie *text, int value) +{ + SwfdecLayout *layouts; + int i, num, y, visible, all, height; + + g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text)); + + layouts = swfdec_text_field_movie_get_layouts (text, &num); + + height = SWFDEC_GRAPHIC (text->text)->extents.y1 - + SWFDEC_GRAPHIC (text->text)->extents.y0; + y = 0; + all = 0; + visible = 0; + + for (i = num - 1; i >= 0; i--) + { + SwfdecLayout *layout = &layouts[i]; + PangoLayoutIter *iter_line; + PangoRectangle rect; + + y += layout->height; + + iter_line = pango_layout_get_iter (layout->layout); + + do { + pango_layout_iter_get_line_extents (iter_line, NULL, &rect); + pango_extents_to_pixels (NULL, &rect); + + if (y - rect.y <= height) + visible++; + + all++; + } while (pango_layout_iter_next_line (iter_line)); + } + + swfdec_text_field_movie_free_layouts (layouts); + + if (value < 1) { + value = 1; + } else if (value > all - visible + 1) { + value = all - visible + 1; + } + + if (text->text->scroll != value) { + text->text->scroll = value; + swfdec_movie_invalidate (SWFDEC_MOVIE (text)); + } +} + static gboolean swfdec_text_field_movie_auto_size (SwfdecTextFieldMovie *text) { - cairo_surface_t *surface; - cairo_t *cr; - GList *layouts, *iter; + SwfdecLayout *layouts; guint height; - int width, diff; + int i, width, diff; gboolean changed; g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text), FALSE); @@ -379,30 +472,21 @@ swfdec_text_field_movie_auto_size (SwfdecTextFieldMovie *text) if (text->text->auto_size == SWFDEC_AUTO_SIZE_NONE) return FALSE; - if (text->paragraphs == NULL) - swfdec_text_field_movie_generate_paragraphs (text); - - // FIXME: Temporary using image surface, until there is a way to get cairo_t - // outside the rendering functions - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); - cr = cairo_create (surface); - - layouts = swfdec_text_field_generate_layouts (text->text, cr, - text->paragraphs, NULL, NULL); + layouts = swfdec_text_field_movie_get_layouts (text, NULL); width = 0; height = 3; - for (iter = layouts; iter != NULL; iter = iter->next) { - SwfdecLayout *layout = (SwfdecLayout *)iter->data; - + for (i = 0; layouts[i].layout != NULL; i++) { if (!text->text->word_wrap) { - if (layout->width > width) - width = layout->width; + if (layouts[i].width > width) + width = layouts[i].width; } - height += layout->height; + height += layouts[i].height; } + swfdec_text_field_movie_free_layouts (layouts); + if (!text->text->word_wrap && SWFDEC_GRAPHIC (text->text)->extents.x1 - SWFDEC_GRAPHIC (text->text)->extents.x0 != width) { diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h index 2ade6e2..f394747 100644 --- a/libswfdec/swfdec_text_field_movie.h +++ b/libswfdec/swfdec_text_field_movie.h @@ -43,17 +43,6 @@ typedef struct { SwfdecTextFormat * format; } SwfdecFormatIndex; -typedef enum { - SWFDEC_ANTI_ALIAS_TYPE_NORMAL, - SWFDEC_ANTI_ALIAS_TYPE_ADVANCED -} SwfdecAntiAliasType; - -typedef enum { - SWFDEC_GRID_FIT_TYPE_NONE, - SWFDEC_GRID_FIT_TYPE_PIXEL, - SWFDEC_GRID_FIT_TYPE_SUBPIXEL -} SwfdecGridFitType; - struct _SwfdecTextFieldMovie { SwfdecMovie movie; @@ -67,17 +56,9 @@ struct _SwfdecTextFieldMovie { SwfdecTextFormat * format_new; GSList * formats; - SwfdecAntiAliasType anti_alias_type; gboolean condense_white; gboolean embed_fonts; - SwfdecGridFitType grid_fit_type; - guint hscroll; - gboolean mouse_wheel_enabled; - const char * restrict_; - guint scroll; - int sharpness; SwfdecStyleSheet * style_sheet; - int thickness; SwfdecColor border_color; SwfdecColor background_color; @@ -100,6 +81,8 @@ void swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie * text, SwfdecTextFormat * format, guint start_index, guint end_index); +void swfdec_text_field_movie_set_scroll (SwfdecTextFieldMovie * text, + int value); /* implemented in swfdec_text_field_movie_as.c */ void swfdec_text_field_movie_init_properties (SwfdecAsContext * cx); diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c index 19aabd6..7e8e20e 100644 --- a/libswfdec/swfdec_text_field_movie_as.c +++ b/libswfdec/swfdec_text_field_movie_as.c @@ -420,7 +420,7 @@ swfdec_text_field_movie_get_length (SwfdecAsContext *cx, SwfdecAsObject *object, SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); - SWFDEC_AS_VALUE_SET_INT (ret, strlen (text->text_display)); + SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_strlen (text->text_display, -1)); } /* @@ -453,6 +453,69 @@ swfdec_text_field_movie_set_condenseWhite (SwfdecAsContext *cx, text->condense_white = value; } +static void +swfdec_text_field_movie_get_multiline (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->multiline); +} + +static void +swfdec_text_field_movie_set_multiline (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + gboolean value; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value); + + swfdec_as_value_to_number (cx, &argv[0]); + + text->text->multiline = value; +} + +static void +swfdec_text_field_movie_do_get_type (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + if (text->text->input) { + SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_input); + } else { + SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_dynamic); + } +} + +static void +swfdec_text_field_movie_do_set_type (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + const char *value; + + if (argc > 0) + swfdec_as_value_to_number (cx, &argv[0]); + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value); + + if (!g_strcasecmp (value, SWFDEC_AS_STR_input)) { + text->text->input = TRUE; + } else if (!g_strcasecmp (value, SWFDEC_AS_STR_dynamic)) { + text->text->input = FALSE; + } +} + /* * Native properties: Background & border */ @@ -577,6 +640,34 @@ swfdec_text_field_movie_set_borderColor (SwfdecAsContext *cx, } /* + * Native properties: Scrolling + */ +static void +swfdec_text_field_movie_do_get_scroll (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + SWFDEC_AS_VALUE_SET_NUMBER (ret, text->text->scroll); +} + +static void +swfdec_text_field_movie_do_set_scroll (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + int value; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value); + + swfdec_text_field_movie_set_scroll (text, value); +} + +/* * Native properties: Display */ static void @@ -938,6 +1029,8 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); // text + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_text, + swfdec_text_field_movie_get_text, swfdec_text_field_movie_do_set_text); swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_html, swfdec_text_field_movie_get_html, swfdec_text_field_movie_set_html); swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_htmlText, @@ -946,8 +1039,6 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_length, swfdec_text_field_movie_get_length, swfdec_text_field_movie_set_readonly); - swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_text, - swfdec_text_field_movie_get_text, swfdec_text_field_movie_do_set_text); // input swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_condenseWhite, @@ -956,17 +1047,18 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_maxChars, swfdec_text_field_movie_get_maxChars, swfdec_text_field_movie_set_maxChars);*/ - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_multiline, + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_multiline, swfdec_text_field_movie_get_multiline, - swfdec_text_field_movie_set_multiline);*/ + swfdec_text_field_movie_set_multiline); /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_restrict, swfdec_text_field_movie_get_restrict, swfdec_text_field_movie_set_restrict);*/ /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_selectable, swfdec_text_field_movie_get_selectable, swfdec_text_field_movie_set_selectable);*/ - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_type, - swfdec_text_field_movie_get_type, swfdec_text_field_movie_set_type);*/ + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_type, + swfdec_text_field_movie_do_get_type, + swfdec_text_field_movie_do_set_type); /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_variable, swfdec_text_field_movie_get_variable, swfdec_text_field_movie_set_variable);*/ @@ -1008,8 +1100,9 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_mouseWheelEnabled, swfdec_text_field_movie_get_mouseWheelEnabled, swfdec_text_field_movie_set_mouseWheelEnabled);*/ - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_scroll, - swfdec_text_field_movie_get_scroll, swfdec_text_field_movie_set_scroll);*/ + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_scroll, + swfdec_text_field_movie_do_get_scroll, + swfdec_text_field_movie_do_set_scroll); // display swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_autoSize, @@ -1025,25 +1118,25 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) // format /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_antiAliasType, swfdec_text_field_movie_get_antiAliasType, - swfdec_text_field_movie_set_antiAliasType); - swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_gridFitType, - swfdec_text_field_movie_get_gridFitType, - swfdec_text_field_movie_set_gridFitType);*/ + swfdec_text_field_movie_set_antiAliasType);*/ swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_embedFonts, swfdec_text_field_movie_get_embedFonts, swfdec_text_field_movie_set_embedFonts); + /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_gridFitType, + swfdec_text_field_movie_get_gridFitType, + swfdec_text_field_movie_set_gridFitType);*/ /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_sharpness, swfdec_text_field_movie_get_sharpness, - swfdec_text_field_movie_set_sharpness); - swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_thickness, - swfdec_text_field_movie_get_thickness, - swfdec_text_field_movie_set_thickness);*/ + swfdec_text_field_movie_set_sharpness);*/ /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_styleSheet, swfdec_text_field_movie_get_styleSheet, swfdec_text_field_movie_set_styleSheet);*/ swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_textColor, swfdec_text_field_movie_get_textColor, swfdec_text_field_movie_set_textColor); + /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_thickness, + swfdec_text_field_movie_get_thickness, + swfdec_text_field_movie_set_thickness);*/ // TODO: filters, menu, tabEnabled, tabIndex } commit e4ff7ba9cd0945885fb8bc2b67455f3c87fffe7a Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Sun Oct 14 19:53:06 2007 +0300 Implement background, backgroundColor and borderColor properties for TextField diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 1477395..a58a1e8 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -397,5 +397,8 @@ const char swfdec_as_strings[] SWFDEC_AS_CONSTANT_STRING ("wordWrap") SWFDEC_AS_CONSTANT_STRING ("border") SWFDEC_AS_CONSTANT_STRING ("Key") + SWFDEC_AS_CONSTANT_STRING ("background") + SWFDEC_AS_CONSTANT_STRING ("backgroundColor") + SWFDEC_AS_CONSTANT_STRING ("borderColor") /* add more here */ ; diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 69a7a68..3fe67ea 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -552,8 +552,8 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie) text->format_new->indent = text->text->indent / 20; text->format_new->leading = text->text->leading / 20; - text->border_color = SWFDEC_COLOR_COMBINE (0, 0, 0, 255); - text->background_color = SWFDEC_COLOR_COMBINE (255, 255, 255, 255); + text->border_color = SWFDEC_COLOR_COMBINE (0, 0, 0, 0); + text->background_color = SWFDEC_COLOR_COMBINE (255, 255, 255, 0); // text if (text->text->text_input != NULL) { diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c index 121fefc..19aabd6 100644 --- a/libswfdec/swfdec_text_field_movie_as.c +++ b/libswfdec/swfdec_text_field_movie_as.c @@ -36,6 +36,16 @@ #include "swfdec_internal.h" #include "swfdec_player_internal.h" +static SwfdecColor +swfdec_text_field_movie_int_to_color (SwfdecAsContext *cx, int value) +{ + if (value < 0) { + return 16777216 + value % 16777216; + } else { + return value % 16777216; + } +} + // does nothing but calls valueOf static void swfdec_text_field_movie_set_readonly (SwfdecAsContext *cx, @@ -447,6 +457,66 @@ swfdec_text_field_movie_set_condenseWhite (SwfdecAsContext *cx, * Native properties: Background & border */ static void +swfdec_text_field_movie_get_background (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->background); +} + +static void +swfdec_text_field_movie_set_background (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + gboolean value; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value); + + swfdec_as_value_to_number (cx, &argv[0]); + + if (text->text->background != value) { + text->text->background = value; + swfdec_movie_invalidate (SWFDEC_MOVIE (text)); + } +} + +static void +swfdec_text_field_movie_get_backgroundColor (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + SWFDEC_AS_VALUE_SET_NUMBER (ret, text->background_color); +} + +static void +swfdec_text_field_movie_set_backgroundColor (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + int value; + SwfdecColor color; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value); + + color = swfdec_text_field_movie_int_to_color (cx, value); + if (text->background_color != color) { + text->background_color = color; + swfdec_movie_invalidate (SWFDEC_MOVIE (text)); + } +} + +static void swfdec_text_field_movie_get_border (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) @@ -476,6 +546,36 @@ swfdec_text_field_movie_set_border (SwfdecAsContext *cx, } } +static void +swfdec_text_field_movie_get_borderColor (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, ""); + + SWFDEC_AS_VALUE_SET_NUMBER (ret, text->border_color); +} + +static void +swfdec_text_field_movie_set_borderColor (SwfdecAsContext *cx, + SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, + SwfdecAsValue *ret) +{ + SwfdecTextFieldMovie *text; + int value; + SwfdecColor color; + + SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value); + + color = swfdec_text_field_movie_int_to_color (cx, value); + if (text->border_color != color) { + text->border_color = color; + swfdec_movie_invalidate (SWFDEC_MOVIE (text)); + } +} + /* * Native properties: Display */ @@ -633,13 +733,7 @@ swfdec_text_field_movie_set_textColor (SwfdecAsContext *cx, SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value); - if (value < 0) { - value = 16777216 + value % 16777216; - } else { - value = value % 16777216; - } - - text->format_new->color = value; + text->format_new->color = swfdec_text_field_movie_int_to_color (cx, value); } /* @@ -886,17 +980,17 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx) swfdec_text_field_movie_set_readonly);*/ // border & background - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_background, + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_background, swfdec_text_field_movie_get_background, - swfdec_text_field_movie_set_background);*/ - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_backgroundColor, + swfdec_text_field_movie_set_background); + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_backgroundColor, swfdec_text_field_movie_get_backgroundColor, - swfdec_text_field_movie_set_backgroundColor);*/ + swfdec_text_field_movie_set_backgroundColor); swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_border, swfdec_text_field_movie_get_border, swfdec_text_field_movie_set_border); - /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_borderColor, + swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_borderColor, swfdec_text_field_movie_get_borderColor, - swfdec_text_field_movie_set_borderColor);*/ + swfdec_text_field_movie_set_borderColor); // scrolling /*swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_bottomScroll,
Reasonably Related Threads
- 10 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c
- 11 commits - libswfdec/swfdec_as_strings.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_text_field_movie.h test/trace
- libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie.c
- 6 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c
- 9 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_style_sheet.c libswfdec/swfdec_style_sheet.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie.h