Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 138177
Collapse All | Expand All

(-)libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.c (-22 / +114 lines)
Lines 54-63 Link Here
54
#include FT_TYPE1_TABLES_H
54
#include FT_TYPE1_TABLES_H
55
#include FT_XFREE86_H
55
#include FT_XFREE86_H
56
#include FT_BBOX_H
56
#include FT_BBOX_H
57
#include FT_INTERNAL_TRUETYPE_TYPES_H
58
#include FT_TRUETYPE_TAGS_H
57
#include FT_TRUETYPE_TAGS_H
59
#include FT_INTERNAL_SFNT_H
60
#include FT_INTERNAL_STREAM_H
61
/*
58
/*
62
 *  If you want to use FT_Outline_Get_CBox instead of 
59
 *  If you want to use FT_Outline_Get_CBox instead of 
63
 *  FT_Outline_Get_BBox, define here.
60
 *  FT_Outline_Get_BBox, define here.
Lines 123-128 Link Here
123
};
120
};
124
121
125
122
123
/* read 2-byte value from a SFNT table */
124
static FT_UShort
125
sfnt_get_ushort( FT_Face     face,
126
                 FT_ULong    table_tag,
127
                 FT_ULong    table_offset )
128
{
129
  FT_Byte    buff[2];
130
  FT_ULong   len = sizeof(buff);
131
  FT_UShort  result = 0;
132
133
  if ( !FT_Load_Sfnt_Table( face, table_tag, table_offset, buff, &len ) );
134
    result = (FT_UShort)( (buff[0] << 8) | buff[1] );
135
136
  return result;
137
}
138
139
#define  sfnt_get_short(f,t,o)  ((FT_Short)sfnt_get_ushort((f),(t),(o)))
140
141
142
#if 0
143
static FT_ULong
144
sfnt_get_ulong( FT_Face   face,
145
                FT_ULong  table_tag,
146
                FT_ULong  table_offset )
147
{
148
  FT_Byte    buff[4];
149
  FT_ULong   len = sizeof(buff);
150
  FT_UShort  result = 0;
151
152
  if  ( !FT_Load_Sfnt_Table( face, table_tag, table_offset, buff, &len );
153
    result = ((FT_ULong)buff[0] << 24) | ((FT_ULong)buff[1] << 16) |
154
             ((FT_ULong)buff[2] << 8)  |  (FT_ULong)buff[3];
155
156
  return result;
157
}
158
#endif
159
160
161
162
126
static int ftypeInitP = 0;      /* is the engine initialised? */
163
static int ftypeInitP = 0;      /* is the engine initialised? */
127
FT_Library ftypeLibrary;
164
FT_Library ftypeLibrary;
128
165
Lines 211-216 Link Here
211
        if(maxp && maxp->maxContours == 0)
248
        if(maxp && maxp->maxContours == 0)
212
            face->bitmap = 1;
249
            face->bitmap = 1;
213
    }
250
    }
251
252
    face->num_hmetrics = (FT_UInt) sfnt_get_ushort( face->face,
253
                                                    TTAG_hhea, 34 );
254
214
    /* Insert face in hashtable and return it */
255
    /* Insert face in hashtable and return it */
215
    face->next = faceTable[bucket];
256
    face->next = faceTable[bucket];
216
    faceTable[bucket] = face;
257
    faceTable[bucket] = face;
Lines 462-467 Link Here
462
    }
503
    }
463
504
464
    if( FT_IS_SFNT( face->face ) ) {
505
    if( FT_IS_SFNT( face->face ) ) {
506
#if 1
507
        FT_F26Dot6  tt_char_width, tt_char_height, tt_dim_x, tt_dim_y;
508
        FT_UInt     nn;
509
510
        instance->strike_index=0xFFFFU;
511
512
	tt_char_width  = (int)(trans->scale*(1<<6) + 0.5);
513
	tt_char_height = (int)(trans->scale*(1<<6) + 0.5);
514
515
        tt_dim_x = ( ( tt_char_width  * trans->xres + (36+32*72) ) / 72 ) & -64;
516
        tt_dim_y = ( ( tt_char_height * trans->yres + (36+32*72) ) / 72 ) & -64;
517
518
        for ( nn = 0; nn < face->face->num_fixed_sizes; nn++ )
519
        {
520
          FT_Bitmap_Size*  sz = &face->face->available_sizes[nn];
521
522
          if ( tt_dim_x == sz->x_ppem && tt_dim_y == sz->y_ppem )
523
          {
524
            instance->strike_index = nn;
525
            break;
526
          }
527
        }
528
#else
465
	/* See Set_Char_Sizes() in ttdriver.c */
529
	/* See Set_Char_Sizes() in ttdriver.c */
466
	FT_Error err;
530
	FT_Error err;
467
	TT_Face tt_face;
531
	TT_Face tt_face;
Lines 486-491 Link Here
486
	sfnt   = (SFNT_Service)tt_face->sfnt;
550
	sfnt   = (SFNT_Service)tt_face->sfnt;
487
	err = sfnt->set_sbit_strike(tt_face,tt_x_ppem,tt_y_ppem,&instance->strike_index);
551
	err = sfnt->set_sbit_strike(tt_face,tt_x_ppem,tt_y_ppem,&instance->strike_index);
488
	if ( err ) instance->strike_index=0xFFFFU;
552
	if ( err ) instance->strike_index=0xFFFFU;
553
#endif
489
    }
554
    }
490
555
491
    /* maintain a linked list of instances */
556
    /* maintain a linked list of instances */
Lines 803-833 Link Here
803
 * parse the htmx field in TrueType font.
868
 * parse the htmx field in TrueType font.
804
 */
869
 */
805
870
806
/* from src/truetype/ttgload.c */
807
static void
871
static void
808
tt_get_metrics( TT_HoriHeader*  header,
872
tt_get_metrics( FT_Face         face,
809
		FT_UInt         idx,
873
		FT_UInt         idx,
874
		FT_UInt         num_hmetrics,
810
		FT_Short*       bearing,
875
		FT_Short*       bearing,
811
		FT_UShort*      advance )
876
		FT_UShort*      advance )
812
/*  Copyright 1996-2001, 2002 by                      */
813
/*  David Turner, Robert Wilhelm, and Werner Lemberg. */
814
{
877
{
815
    TT_LongMetrics  longs_m;
878
   /* read the metrics directly from the horizontal header, we
816
    FT_UShort       k = header->number_Of_HMetrics;
879
    * parse the SFNT table directly through the standard FreeType API.
880
    * this works with any version of the library and doesn't need to
881
    * peek at its internals. Maybe a bit less
882
    */
883
    FT_UInt    count = num_hmetrics;
817
884
818
    if ( k == 0 ) {
885
    if ( count == 0 )
819
	*bearing = *advance = 0;
886
    {
820
	return;
887
      *advance = 0;
888
      *bearing = 0;
821
    }
889
    }
890
    else if ( idx < count )
891
    {
892
      FT_ULong  offset = idx*4;
822
893
823
    if ( idx < (FT_UInt)k ) {
894
      *advance = sfnt_get_ushort( face, TTAG_hmtx, offset );
824
	longs_m  = (TT_LongMetrics )header->long_metrics + idx;
895
      *bearing = sfnt_get_short ( face, TTAG_hmtx, offset+2 );
825
	*bearing = longs_m->bearing;
826
	*advance = longs_m->advance;
827
    }
896
    }
828
    else {
897
    else
829
	*bearing = ((TT_ShortMetrics*)header->short_metrics)[idx - k];
898
    {
830
	*advance = ((TT_LongMetrics )header->long_metrics)[k - 1].advance;
899
      *advance = sfnt_get_ushort( face, TTAG_hmtx, (count-1)*4 );
900
      *bearing = sfnt_get_short ( face, TTAG_hmtx, (count+idx)*2 );
831
    }
901
    }
832
}
902
}
833
903
Lines 835-840 Link Here
835
ft_get_very_lazy_bbox( FT_UInt index,
905
ft_get_very_lazy_bbox( FT_UInt index,
836
		       FT_Face face,
906
		       FT_Face face,
837
		       FT_Size size,
907
		       FT_Size size,
908
		       FT_UInt  num_hmetrics,
838
		       double slant,
909
		       double slant,
839
		       FT_Matrix *matrix,
910
		       FT_Matrix *matrix,
840
		       FT_BBox *bbox,
911
		       FT_BBox *bbox,
Lines 842-855 Link Here
842
		       FT_Long *vertAdvance)
913
		       FT_Long *vertAdvance)
843
{
914
{
844
    if ( FT_IS_SFNT( face ) ) {
915
    if ( FT_IS_SFNT( face ) ) {
845
	TT_Face   ttface = (TT_Face)face;
846
	FT_Size_Metrics *smetrics = &size->metrics;
916
	FT_Size_Metrics *smetrics = &size->metrics;
847
	FT_Short  leftBearing = 0;
917
	FT_Short  leftBearing = 0;
848
	FT_UShort advance = 0;
918
	FT_UShort advance = 0;
849
	FT_Vector p0, p1, p2, p3;
919
	FT_Vector p0, p1, p2, p3;
850
920
851
	/* horizontal */
921
	/* horizontal */
852
	tt_get_metrics(&ttface->horizontal, index,
922
	tt_get_metrics( face, num_hmetrics, index,
853
		       &leftBearing, &advance);
923
		       &leftBearing, &advance);
854
924
855
#if 0
925
#if 0
Lines 910-916 Link Here
910
		    FT_UShort glyph_index, FT_Glyph_Metrics *metrics_return,
980
		    FT_UShort glyph_index, FT_Glyph_Metrics *metrics_return,
911
		    int *sbitchk_incomplete_but_exist )
981
		    int *sbitchk_incomplete_but_exist )
912
{
982
{
913
#if (FREETYPE_VERSION >= 2001008)
983
#if 1
984
    if ( strike_index != 0xFFFFU && ft_face->available_sizes != 0)
985
    {
986
      FT_Error         error;
987
      FT_Bitmap_Size*  sz = &ft_face->available_sizes[strike_index];
988
989
      error = FT_Set_Pixel_Sizes( ft_face, sz->x_ppem/64, sz->y_ppem/64 );
990
      if ( !error )
991
      {
992
        error = FT_Load_Glyph( ft_face, glyph_index, FT_LOAD_SBITS_ONLY );
993
        if ( !error )
994
        {
995
          if ( metrics_return != NULL )
996
            *metrics_return = ft_face->glyph->metrics;
997
998
          return 0;
999
        }
1000
      }
1001
    }
1002
    return -1;
1003
#elif (FREETYPE_VERSION >= 2001008)
914
    SFNT_Service       sfnt;
1004
    SFNT_Service       sfnt;
915
    TT_Face            face;
1005
    TT_Face            face;
916
    FT_Error           error;
1006
    FT_Error           error;
Lines 1043-1048 Link Here
1043
	    if( bitmap_metrics == NULL ) {
1133
	    if( bitmap_metrics == NULL ) {
1044
		if ( sbitchk_incomplete_but_exist==0 && (instance->ttcap.flags & TTCAP_IS_VERY_LAZY) ) {
1134
		if ( sbitchk_incomplete_but_exist==0 && (instance->ttcap.flags & TTCAP_IS_VERY_LAZY) ) {
1045
		    if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
1135
		    if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
1136
		                               face->num_hmetrics,
1046
					       instance->ttcap.vl_slant,
1137
					       instance->ttcap.vl_slant,
1047
					       &instance->transformation.matrix,
1138
					       &instance->transformation.matrix,
1048
					       &bbox, &outline_hori_advance, 
1139
					       &bbox, &outline_hori_advance, 
Lines 1221-1226 Link Here
1221
	if( is_outline == 1 ){
1312
	if( is_outline == 1 ){
1222
	    if( correct ){
1313
	    if( correct ){
1223
		if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
1314
		if( ft_get_very_lazy_bbox( idx, face->face, instance->size, 
1315
		                           face->num_hmetrics,
1224
					   instance->ttcap.vl_slant,
1316
					   instance->ttcap.vl_slant,
1225
					   &instance->transformation.matrix,
1317
					   &instance->transformation.matrix,
1226
					   &bbox, &outline_hori_advance, 
1318
					   &bbox, &outline_hori_advance, 
(-)libXfont-X11R7.0-1.0.0/src/FreeType/ftfuncs.h (+1 lines)
Lines 47-52 Link Here
47
    char *filename;
47
    char *filename;
48
    FT_Face face;
48
    FT_Face face;
49
    int bitmap;
49
    int bitmap;
50
    FT_UInt num_hmetrics;
50
    struct _FTInstance *instances;
51
    struct _FTInstance *instances;
51
    struct _FTInstance *active_instance;
52
    struct _FTInstance *active_instance;
52
    struct _FTFace *next;       /* link to next face in bucket */
53
    struct _FTFace *next;       /* link to next face in bucket */
(-)libXfont-X11R7.0-1.0.0/src/FreeType/ftsystem.c (-1 lines)
Lines 35-41 Link Here
35
#endif
35
#endif
36
#include <ft2build.h>
36
#include <ft2build.h>
37
#include FT_CONFIG_CONFIG_H
37
#include FT_CONFIG_CONFIG_H
38
#include FT_INTERNAL_DEBUG_H
39
#include FT_SYSTEM_H
38
#include FT_SYSTEM_H
40
#include FT_ERRORS_H
39
#include FT_ERRORS_H
41
#include FT_TYPES_H
40
#include FT_TYPES_H

Return to bug 138177