freetype-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ft-devel] FreeType version 2.2.1 released


From: David Turner
Subject: Re: [ft-devel] FreeType version 2.2.1 released
Date: Wed, 17 May 2006 14:12:36 +0200
User-agent: Thunderbird 1.5 (Windows/20051201)

Hello everyone,

here's attached a small patch to libXfont-X11R7.0-1.0.0 that I've just
written to let the library compile with 2.2

I still consider the patch experimental, for the following reasons:

- first of all, I could only _compile_ and install libXfont with it. I have
 no idea of how to quickly test the changes, and clearly don't have the
 time to rebuild the whole X.Org server.

- the patch doesn't disable features. Most of what was done by the
 original code can be performed with the public API (yeaaah, just like
 most rogue clients anyway ;-)

 the only difference is the way the bitmap character sizes are computed
 in the function "FreeTypeOpenInstance" function. The old code tested
an internal font table flag that is, as far as I know, always set in TrueType
 fonts. Also, I really don't understand why the test was here in the first
 place, since it only relates to internal computations needed by the
 bytecode interpreter.

I'd appreciate if someone could test this patch and inform me of any
problems with it. If it works well, we'll add it to our list of rogue patches.

Regards,

- David Turner
- The FreeType Project  (www.freetype.org)



address@hidden a écrit :
Hi,

On Tue, 16 May 2006 13:19:33 -0400
Matthias Clasen <address@hidden> wrote:

We looked at updating freetype to 2.2.1 in Fedora
recently, but discovered that libXfont still depends
on the internal freetype headers (in the X 7.1 release candidate).

So I wondered if anybody has a libXfont patch. There is none on the list of rogue clients...

I think Turner is aware of libXfont issue. I was
working to fix libXfont but not finished, see
http://lists.gnu.org/archive/html/freetype-devel/2006-02/msg00098.html
At least, I can't have a time to restart the work
until 2006/06/18. Too late? oops.

Regards,
mpsuzuki


_______________________________________________
Freetype-devel mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/freetype-devel


***********************************************************************************
Information contained in this email message is confidential and may be 
privileged, and is intended only for use of the individual or entity named 
above. If the reader of this message is not the intended recipient, or the 
employee or agent responsible to deliver it to the intended recipient, you are 
hereby notified that any dissemination, distribution or copying of this 
communication is strictly prohibited. If you have received this communication 
in error, please immediately notify the address@hidden and destroy the original 
message.
***********************************************************************************
diff -ubrN libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.c 
libXfont-X11R7.0-1.0.0-new/src/FreeType/ftfuncs.c
--- libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.c       2005-10-23 
20:32:05.000000000 +0200
+++ libXfont-X11R7.0-1.0.0-new/src/FreeType/ftfuncs.c   2006-05-17 
13:50:17.527499000 +0200
@@ -54,10 +54,7 @@
 #include FT_TYPE1_TABLES_H
 #include FT_XFREE86_H
 #include FT_BBOX_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_TRUETYPE_TAGS_H
-#include FT_INTERNAL_SFNT_H
-#include FT_INTERNAL_STREAM_H
 /*
  *  If you want to use FT_Outline_Get_CBox instead of 
  *  FT_Outline_Get_BBox, define here.
@@ -123,6 +120,46 @@
 };
 
 
+/* read 2-byte value from a SFNT table */
+static FT_UShort
+sfnt_get_ushort( FT_Face     face,
+                 FT_ULong    table_tag,
+                 FT_ULong    table_offset )
+{
+  FT_Byte    buff[2];
+  FT_ULong   len = sizeof(buff);
+  FT_UShort  result = 0;
+
+  if ( !FT_Load_Sfnt_Table( face, table_tag, table_offset, buff, &len ) );
+    result = (FT_UShort)( (buff[0] << 8) | buff[1] );
+
+  return result;
+}
+
+#define  sfnt_get_short(f,t,o)  ((FT_Short)sfnt_get_ushort((f),(t),(o)))
+
+
+#if 0
+static FT_ULong
+sfnt_get_ulong( FT_Face   face,
+                FT_ULong  table_tag,
+                FT_ULong  table_offset )
+{
+  FT_Byte    buff[4];
+  FT_ULong   len = sizeof(buff);
+  FT_UShort  result = 0;
+
+  if  ( !FT_Load_Sfnt_Table( face, table_tag, table_offset, buff, &len );
+    result = ((FT_ULong)buff[0] << 24) | ((FT_ULong)buff[1] << 16) |
+             ((FT_ULong)buff[2] << 8)  |  (FT_ULong)buff[3];
+
+  return result;
+}
+#endif
+
+
+
+
 static int ftypeInitP = 0;      /* is the engine initialised? */
 FT_Library ftypeLibrary;
 
@@ -211,6 +248,10 @@
         if(maxp && maxp->maxContours == 0)
             face->bitmap = 1;
     }
+
+    face->num_hmetrics = (FT_UInt) sfnt_get_ushort( face->face,
+                                                    TTAG_hhea, 34 );
+
     /* Insert face in hashtable and return it */
     face->next = faceTable[bucket];
     faceTable[bucket] = face;
@@ -462,6 +503,29 @@
     }
 
     if( FT_IS_SFNT( face->face ) ) {
+#if 1
+        FT_F26Dot6  tt_char_width, tt_char_height, tt_dim_x, tt_dim_y;
+        FT_UInt     nn;
+
+        instance->strike_index=0xFFFFU;
+
+       tt_char_width  = (int)(trans->scale*(1<<6) + 0.5);
+       tt_char_height = (int)(trans->scale*(1<<6) + 0.5);
+
+        tt_dim_x = ( ( tt_char_width  * trans->xres + (36+32*72) ) / 72 ) & 
-64;
+        tt_dim_y = ( ( tt_char_height * trans->yres + (36+32*72) ) / 72 ) & 
-64;
+
+        for ( nn = 0; nn < face->face->num_fixed_sizes; nn++ )
+        {
+          FT_Bitmap_Size*  sz = &face->face->available_sizes[nn];
+
+          if ( tt_dim_x == sz->x_ppem && tt_dim_y == sz->y_ppem )
+          {
+            instance->strike_index = nn;
+            break;
+          }
+        }
+#else
        /* See Set_Char_Sizes() in ttdriver.c */
        FT_Error err;
        TT_Face tt_face;
@@ -486,6 +550,7 @@
        sfnt   = (SFNT_Service)tt_face->sfnt;
        err = 
sfnt->set_sbit_strike(tt_face,tt_x_ppem,tt_y_ppem,&instance->strike_index);
        if ( err ) instance->strike_index=0xFFFFU;
+#endif
     }
 
     /* maintain a linked list of instances */
@@ -803,31 +868,36 @@
  * parse the htmx field in TrueType font.
  */
 
-/* from src/truetype/ttgload.c */
 static void
-tt_get_metrics( TT_HoriHeader*  header,
+tt_get_metrics( FT_Face         face,
                FT_UInt         idx,
+               FT_UInt         num_hmetrics,
                FT_Short*       bearing,
                FT_UShort*      advance )
-/*  Copyright 1996-2001, 2002 by                      */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg. */
 {
-    TT_LongMetrics  longs_m;
-    FT_UShort       k = header->number_Of_HMetrics;
+   /* read the metrics directly from the horizontal header, we
+    * parse the SFNT table directly through the standard FreeType API.
+    * this works with any version of the library and doesn't need to
+    * peek at its internals. Maybe a bit less
+    */
+    FT_UInt    count = num_hmetrics;
 
-    if ( k == 0 ) {
-       *bearing = *advance = 0;
-       return;
+    if ( count == 0 )
+    {
+      *advance = 0;
+      *bearing = 0;
     }
+    else if ( idx < count )
+    {
+      FT_ULong  offset = idx*4;
 
-    if ( idx < (FT_UInt)k ) {
-       longs_m  = (TT_LongMetrics )header->long_metrics + idx;
-       *bearing = longs_m->bearing;
-       *advance = longs_m->advance;
+      *advance = sfnt_get_ushort( face, TTAG_hmtx, offset );
+      *bearing = sfnt_get_short ( face, TTAG_hmtx, offset+2 );
     }
-    else {
-       *bearing = ((TT_ShortMetrics*)header->short_metrics)[idx - k];
-       *advance = ((TT_LongMetrics )header->long_metrics)[k - 1].advance;
+    else
+    {
+      *advance = sfnt_get_ushort( face, TTAG_hmtx, (count-1)*4 );
+      *bearing = sfnt_get_short ( face, TTAG_hmtx, (count+idx)*2 );
     }
 }
 
@@ -835,6 +905,7 @@
 ft_get_very_lazy_bbox( FT_UInt index,
                       FT_Face face,
                       FT_Size size,
+                      FT_UInt  num_hmetrics,
                       double slant,
                       FT_Matrix *matrix,
                       FT_BBox *bbox,
@@ -842,14 +913,13 @@
                       FT_Long *vertAdvance)
 {
     if ( FT_IS_SFNT( face ) ) {
-       TT_Face   ttface = (TT_Face)face;
        FT_Size_Metrics *smetrics = &size->metrics;
        FT_Short  leftBearing = 0;
        FT_UShort advance = 0;
        FT_Vector p0, p1, p2, p3;
 
        /* horizontal */
-       tt_get_metrics(&ttface->horizontal, index,
+       tt_get_metrics( face, num_hmetrics, index,
                       &leftBearing, &advance);
 
 #if 0
@@ -910,7 +980,27 @@
                    FT_UShort glyph_index, FT_Glyph_Metrics *metrics_return,
                    int *sbitchk_incomplete_but_exist )
 {
-#if (FREETYPE_VERSION >= 2001008)
+#if 1
+    if ( strike_index != 0xFFFFU )
+    {
+      FT_Error         error;
+      FT_Bitmap_Size*  sz = &ft_face->available_sizes[strike_index];
+
+      error = FT_Set_Pixel_Sizes( ft_face, sz->x_ppem/64, sz->y_ppem/64 );
+      if ( !error )
+      {
+        error = FT_Load_Glyph( ft_face, glyph_index, FT_LOAD_SBITS_ONLY );
+        if ( !error )
+        {
+          if ( metrics_return != NULL )
+            *metrics_return = ft_face->glyph->metrics;
+
+          return 0;
+        }
+      }
+    }
+    return -1;
+#elif (FREETYPE_VERSION >= 2001008)
     SFNT_Service       sfnt;
     TT_Face            face;
     FT_Error           error;
@@ -1043,6 +1133,7 @@
            if( bitmap_metrics == NULL ) {
                if ( sbitchk_incomplete_but_exist==0 && (instance->ttcap.flags 
& TTCAP_IS_VERY_LAZY) ) {
                    if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
+                                              face->num_hmetrics,
                                               instance->ttcap.vl_slant,
                                               &instance->transformation.matrix,
                                               &bbox, &outline_hori_advance, 
@@ -1221,6 +1312,7 @@
        if( is_outline == 1 ){
            if( correct ){
                if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
+                                          face->num_hmetrics,
                                           instance->ttcap.vl_slant,
                                           &instance->transformation.matrix,
                                           &bbox, &outline_hori_advance, 
diff -ubrN libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.h 
libXfont-X11R7.0-1.0.0-new/src/FreeType/ftfuncs.h
--- libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.h       2005-07-07 
16:59:47.000000000 +0200
+++ libXfont-X11R7.0-1.0.0-new/src/FreeType/ftfuncs.h   2006-05-17 
11:16:33.304210000 +0200
@@ -47,6 +47,7 @@
     char *filename;
     FT_Face face;
     int bitmap;
+    FT_UInt num_hmetrics;
     struct _FTInstance *instances;
     struct _FTInstance *active_instance;
     struct _FTFace *next;       /* link to next face in bucket */
diff -ubrN libXfont-X11R7.0-1.0.0/src/FreeType/ftsystem.c 
libXfont-X11R7.0-1.0.0-new/src/FreeType/ftsystem.c
--- libXfont-X11R7.0-1.0.0/src/FreeType/ftsystem.c      2005-07-09 
08:36:10.000000000 +0200
+++ libXfont-X11R7.0-1.0.0-new/src/FreeType/ftsystem.c  2006-05-17 
13:58:07.177239000 +0200
@@ -35,7 +35,6 @@
 #endif
 #include <ft2build.h>
 #include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_DEBUG_H
 #include FT_SYSTEM_H
 #include FT_ERRORS_H
 #include FT_TYPES_H

reply via email to

[Prev in Thread] Current Thread [Next in Thread]