[Top][All Lists]
[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
Re: [ft-devel] FreeType version 2.2.1 released, James Cloos, 2006/05/16