Hi, below patch fixes the problem of T1 font characters being rendered incorrectly. I've made two screenshots illustrating this. In the broken rendering [1], the characters are messed up. [2] shows the result after applying the patch.
The problem turned out to be code using an incorrect row increment when copying the bitmap. Note that the patch also affects the truetype font loader. I haven't tested this part, but the patched code should be functionally equivalent to the old code. Also note that bug 354434 [3] seems to report the same problem. However, the bug was closed without taking any action, probably because it is likely to not show up when testing against a development tree. This was the case during my tests, the reason was that the loader couldn't find the T1 font and was falling back to bitmap fonts which are rendered correctly. Please CC me on replies, I'm not subscribed to the list. Cheers, Mattias [1] http://www-user.rhrk.uni-kl.de/~nissler/tmp/evince_broken.png [2] http://www-user.rhrk.uni-kl.de/~nissler/tmp/evince_ok.png# [3] http://bugzilla.gnome.org/show_bug.cgi?id=354434 Index: backend/dvi/mdvi-lib/bitmap.c =================================================================== --- backend/dvi/mdvi-lib/bitmap.c (revision 2998) +++ backend/dvi/mdvi-lib/bitmap.c (working copy) @@ -125,7 +125,7 @@ * hopelessly slow. */ -BITMAP *bitmap_convert_lsb8(Uchar *bits, int w, int h) +BITMAP *bitmap_convert_lsb8(Uchar *bits, int w, int h, int stride) { BITMAP *bm; int i; @@ -147,12 +147,13 @@ for(i = 0; i < h; i++) { #ifdef WORD_LITTLE_ENDIAN memcpy(unit, curr, bytes); - curr += bytes; + curr += stride; #else int j; for(j = 0; j < bytes; curr++, j++) unit[j] = bit_swap[*curr]; + cur += stride - bytes; #endif memzero(unit + bytes, bm->stride - bytes); unit += bm->stride; @@ -162,7 +163,7 @@ return bm; } -BITMAP *bitmap_convert_msb8(Uchar *data, int w, int h) +BITMAP *bitmap_convert_msb8(Uchar *data, int w, int h, int stride) { BITMAP *bm; Uchar *unit; @@ -180,9 +181,10 @@ for(j = 0; j < bytes; curr++, j++) unit[j] = bit_swap[*curr]; + curr += stride - bytes; #else memcpy(unit, curr, bytes); - curr += bytes; + curr += stride; #endif memzero(unit + bytes, bm->stride - bytes); unit += bm->stride; Index: backend/dvi/mdvi-lib/bitmap.h =================================================================== --- backend/dvi/mdvi-lib/bitmap.h (revision 2998) +++ backend/dvi/mdvi-lib/bitmap.h (working copy) @@ -136,8 +136,8 @@ extern void bitmap_rotate_counter_clockwise __PROTO((BITMAP *)); extern void bitmap_flip_rotate_clockwise __PROTO((BITMAP *)); extern void bitmap_flip_rotate_counter_clockwise __PROTO((BITMAP *)); -extern BITMAP *bitmap_convert_lsb8 __PROTO((Uchar *, int, int)); -extern BITMAP *bitmap_convert_msb8 __PROTO((Uchar *, int, int)); +extern BITMAP *bitmap_convert_lsb8 __PROTO((Uchar *, int, int, int)); +extern BITMAP *bitmap_convert_msb8 __PROTO((Uchar *, int, int, int)); #include <stdio.h> extern void bitmap_print __PROTO((FILE *, BITMAP *)); Index: backend/dvi/mdvi-lib/t1.c =================================================================== --- backend/dvi/mdvi-lib/t1.c (revision 2998) +++ backend/dvi/mdvi-lib/t1.c (working copy) @@ -437,25 +437,16 @@ static inline BITMAP *t1_glyph_bitmap(GLYPH *glyph) { - BITMAP *bm; - int w, h; + int w, h, pad; w = GLYPH_WIDTH(glyph); h = GLYPH_HEIGHT(glyph); if(!w || !h) return MDVI_GLYPH_EMPTY; - switch(glyph->bpp << 3) { - case 8: - bm = bitmap_convert_lsb8((unsigned char *)glyph->bits, w, h); - break; - default: - warning(_("(t1) unsupported bitmap pad size %d\n"), - glyph->bpp); - bm = MDVI_GLYPH_EMPTY; - break; - } - return bm; + + pad = T1_GetBitmapPad(); + return bitmap_convert_lsb8((unsigned char *)glyph->bits, w, h, ROUND(w, pad) * (pad >> 3)); } static void t1_font_shrink_glyph(DviContext *dvi, DviFont *font, DviFontChar *ch, DviGlyph *dest) Index: backend/dvi/mdvi-lib/tt.c =================================================================== --- backend/dvi/mdvi-lib/tt.c (revision 2998) +++ backend/dvi/mdvi-lib/tt.c (working copy) @@ -382,7 +382,7 @@ TT_Translate_Outline(&outline, -bbox.xMin, -bbox.yMin); TT_Get_Outline_Bitmap(tt_handle, &outline, &raster); - glyph->data = bitmap_convert_msb8(raster.bitmap, w, h); + glyph->data = bitmap_convert_msb8(raster.bitmap, w, h, ROUND(w, 8)); TT_Done_Outline(&outline); mdvi_free(raster.bitmap); _______________________________________________ Evince-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/evince-list
