Evas textblock: Fixed coord (int) overflow.
authorTom Hacohen <tom@stosb.com>
Mon, 11 Mar 2013 15:18:21 +0000 (15:18 +0000)
committerTom Hacohen <tom@stosb.com>
Mon, 11 Mar 2013 15:33:28 +0000 (15:33 +0000)
X advance coords can be bigger than the limits of short.

src/lib/evas/common/evas_text_utils.h
src/tests/evas/evas_test_textblock.c

index 144761ea2807ae225043ec294e73bb8d501f61fd..c24ded60154fd56b0ffc7ff3ce20af97b0d5b6c6 100644 (file)
@@ -123,7 +123,8 @@ struct _Evas_Font_Glyph_Info
 #if 1
    // done with shorts to save space... if we need 32k or bigger glyphs and
    // relative layout info... worry then.
-   short x_bear, y_bear, width, pen_after; // 8
+   Evas_Coord pen_after; // 4
+   short x_bear, y_bear, width; // 6
 #else   
    Evas_Coord x_bear; // 4
    /* This one is rarely used, only in draw, in which we already get the glyph
index 20b31e8de67ef478acbef0c7a956cd59cde99dae..117ea15d0262104057777f17bde607f9c247cef8 100644 (file)
@@ -1353,6 +1353,40 @@ START_TEST(evas_textblock_various)
    evas_textblock_cursor_pos_set(cur, 0);
    evas_textblock_cursor_char_delete(cur);
 
+   /* Super big one line item. */
+     {
+#define CNT 10000
+        char str[(CNT * 6) + 128], *d;
+        const char substr[] = "x";
+        Evas_Textblock_Style *stt;
+        int i, l;
+
+        l = strlen(substr);
+        d = str;
+        for (i = 0; i < CNT; i++)
+          {
+             memcpy(d, substr, l);
+             d += l;
+          }
+        *d = 0;
+
+        stt = evas_textblock_style_new();
+        evas_textblock_style_set(stt,
+              "DEFAULT='font=" TEST_FONT " font_size=10 align=left color=#000000 wrap=char'");
+        evas_object_textblock_style_set(tb, stt);
+        evas_textblock_style_free(stt);
+
+        evas_object_textblock_text_markup_set(tb, substr);
+        Evas_Textblock_Cursor *cr;
+
+        cr = evas_object_textblock_cursor_get(tb);
+        evas_textblock_cursor_text_append(cr, str);
+        evas_object_resize(tb, 480, 800);
+
+        evas_object_textblock_size_formatted_get(tb, &w, &h);
+        fail_if(w == 0);
+     }
+
    END_TB_TEST();
 }
 END_TEST