mirror of https://github.com/freetype/freetype
* docs/CHANGES: Mention the size selection change.
* src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select), src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select), src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size matching for request of type NOMINAL and REAL_DIM. * src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when `pixel_height' is used for nominal height. * src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the face is bitmap only and driver doesn't provide `request_size'. This is added merely for completion as no driver satisfies the conditions.
This commit is contained in:
parent
f1c2b91e14
commit
e33dc2ebee
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
|||
2006-01-14 Chia-I Wu <b90201047@ntu.edu.tw>
|
||||
|
||||
* docs/CHANGES: Mention the size selection change.
|
||||
|
||||
* src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select),
|
||||
src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select),
|
||||
src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size
|
||||
matching for request of type NOMINAL and REAL_DIM.
|
||||
|
||||
* src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when
|
||||
`pixel_height' is used for nominal height.
|
||||
|
||||
* src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the
|
||||
face is bitmap only and driver doesn't provide `request_size'. This
|
||||
is added merely for completion as no driver satisfies the conditions.
|
||||
|
||||
2006-01-13 Chia-I Wu <b90201047@ntu.edu.tw>
|
||||
|
||||
Introduce new size selection interface.
|
||||
|
|
10
docs/CHANGES
10
docs/CHANGES
|
@ -52,6 +52,16 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10
|
|||
`FT_GetFile_From_Mac_Name'. Legacy APIs are still available, if
|
||||
FreeType is built without disabling them.
|
||||
|
||||
- A new API `FT_Select_Size' is added to select a bitmap strike by
|
||||
its index. Code using other functions to select bitmap strikes
|
||||
should be updated to use this function.
|
||||
|
||||
- In 2.1.10, the behavior of `FT_Set_Pixel_Sizes' is changed for
|
||||
BDF/PCF fonts, and only for them. This causes inconsistency.
|
||||
In this release, we undo the change. The intent of the change
|
||||
in 2.1.10 is to allow size selection through real dimensions,
|
||||
which can now be done through `FT_Request_Size'.
|
||||
|
||||
|
||||
III. MISCELLANEOUS
|
||||
|
||||
|
|
|
@ -2093,6 +2093,7 @@
|
|||
FT_Driver_Class clazz;
|
||||
FT_Size_Metrics* metrics;
|
||||
FT_Error error;
|
||||
FT_Bool bitmap_only = 0;
|
||||
|
||||
|
||||
if ( !face )
|
||||
|
@ -2190,13 +2191,36 @@
|
|||
else
|
||||
{
|
||||
FT_ZERO( metrics );
|
||||
|
||||
if ( FT_HAS_FIXED_SIZES( face ) )
|
||||
bitmap_only = 1;
|
||||
|
||||
error = FT_Err_Invalid_Pixel_Size;
|
||||
}
|
||||
|
||||
if ( clazz->request_size )
|
||||
return clazz->request_size( face->size, req );
|
||||
else
|
||||
return error;
|
||||
error = clazz->request_size( face->size, req );
|
||||
/*
|
||||
* The reason that a driver not having `request_size' defined is
|
||||
* either the scaling here suffices or the supported formats
|
||||
* are bitmap-only and size matching is not implmented.
|
||||
*
|
||||
* In the latter case, a simple size matching is done.
|
||||
*/
|
||||
else if ( bitmap_only )
|
||||
{
|
||||
FT_ULong index;
|
||||
|
||||
|
||||
if ( !FT_Match_Size( face, req, 0, &index ) )
|
||||
{
|
||||
FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n", index ));
|
||||
|
||||
error = FT_Select_Size( face, index );
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -592,6 +592,8 @@ THE SOFTWARE.
|
|||
|
||||
size->metrics.ascender = bdffont->font_ascent << 6;
|
||||
size->metrics.descender = -bdffont->font_descent << 6;
|
||||
size->metrics.height = ( bdffont->font_ascent +
|
||||
bdffont->font_descent ) << 6;
|
||||
size->metrics.max_advance = bdffont->bbx.width << 6;
|
||||
|
||||
return BDF_Err_Ok;
|
||||
|
@ -602,20 +604,40 @@ THE SOFTWARE.
|
|||
BDF_Size_Request( FT_Size size,
|
||||
FT_Size_Request req )
|
||||
{
|
||||
FT_Face face = size->face;
|
||||
FT_Error error;
|
||||
FT_Face face = size->face;
|
||||
FT_Bitmap_Size* bsize = face->available_sizes;
|
||||
bdf_font_t* bdffont = ( (BDF_Face)face )->bdffont;
|
||||
FT_Error error = BDF_Err_Invalid_Pixel_Size;
|
||||
FT_Long height;
|
||||
|
||||
|
||||
error = FT_Match_Size( face, req, 1, NULL );
|
||||
if ( req->vertResolution )
|
||||
height = ( req->height * req->vertResolution + 36 ) / 72;
|
||||
else
|
||||
height = req->height;
|
||||
|
||||
height = ( height + 32 ) >> 6;
|
||||
|
||||
switch ( req->type )
|
||||
{
|
||||
case FT_SIZE_REQUEST_TYPE_NOMINAL:
|
||||
if ( height == ( bsize->y_ppem + 32 ) >> 6 )
|
||||
error = BDF_Err_Ok;
|
||||
break;
|
||||
case FT_SIZE_REQUEST_TYPE_REAL_DIM:
|
||||
if ( height == ( bdffont->font_ascent +
|
||||
bdffont->font_descent ) )
|
||||
error = BDF_Err_Ok;
|
||||
break;
|
||||
default:
|
||||
error = BDF_Err_Unimplemented_Feature;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( error )
|
||||
return error;
|
||||
else
|
||||
{
|
||||
size->metrics.height = face->available_sizes->height << 6;
|
||||
|
||||
return BDF_Size_Select( size, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -375,6 +375,9 @@ THE SOFTWARE.
|
|||
size->metrics.descender = -face->accel.fontDescent << 6;
|
||||
#if 0
|
||||
size->metrics.height = face->accel.maxbounds.ascent << 6;
|
||||
#else
|
||||
size->metrics.height = size->metrics.ascender -
|
||||
size->metrics.descender;
|
||||
#endif
|
||||
size->metrics.max_advance = face->accel.maxbounds.characterWidth << 6;
|
||||
|
||||
|
@ -386,20 +389,39 @@ THE SOFTWARE.
|
|||
PCF_Size_Request( FT_Size size,
|
||||
FT_Size_Request req )
|
||||
{
|
||||
FT_Face face = size->face;
|
||||
FT_Error error;
|
||||
PCF_Face face = (PCF_Face)size->face;
|
||||
FT_Bitmap_Size* bsize = size->face->available_sizes;
|
||||
FT_Error error = PCF_Err_Invalid_Pixel_Size;
|
||||
FT_Long height;
|
||||
|
||||
|
||||
error = FT_Match_Size( face, req, 1, NULL );
|
||||
if ( req->vertResolution )
|
||||
height = ( req->height * req->vertResolution + 36 ) / 72;
|
||||
else
|
||||
height = req->height;
|
||||
|
||||
height = ( height + 32 ) >> 6;
|
||||
|
||||
switch ( req->type )
|
||||
{
|
||||
case FT_SIZE_REQUEST_TYPE_NOMINAL:
|
||||
if ( height == ( bsize->y_ppem + 32 ) >> 6 )
|
||||
error = PCF_Err_Ok;
|
||||
break;
|
||||
case FT_SIZE_REQUEST_TYPE_REAL_DIM:
|
||||
if ( height == ( face->accel.fontAscent +
|
||||
face->accel.fontDescent ) )
|
||||
error = PCF_Err_Ok;
|
||||
break;
|
||||
default:
|
||||
error = PCF_Err_Unimplemented_Feature;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( error )
|
||||
return error;
|
||||
else
|
||||
{
|
||||
size->metrics.height = face->available_sizes->height << 6;
|
||||
|
||||
return PCF_Size_Select( size, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -489,6 +489,8 @@
|
|||
*/
|
||||
if ( bsize->y_ppem > font->header.pixel_height << 6 )
|
||||
{
|
||||
FT_TRACE2(( "use pixel_height as the nominal height\n" ));
|
||||
|
||||
bsize->y_ppem = font->header.pixel_height << 6;
|
||||
bsize->size = FT_MulDiv( bsize->y_ppem, 72, y_res );
|
||||
}
|
||||
|
@ -579,6 +581,8 @@
|
|||
size->metrics.ascender = header->ascent * 64;
|
||||
size->metrics.descender = -( header->pixel_height -
|
||||
header->ascent ) * 64;
|
||||
size->metrics.height = ( header->pixel_height +
|
||||
header->external_leading ) * 64;
|
||||
size->metrics.max_advance = header->max_width * 64;
|
||||
|
||||
return FNT_Err_Ok;
|
||||
|
@ -589,20 +593,39 @@
|
|||
FNT_Size_Request( FT_Size size,
|
||||
FT_Size_Request req )
|
||||
{
|
||||
FT_Face face = size->face;
|
||||
FT_Error error;
|
||||
|
||||
FNT_Face face = (FNT_Face)size->face;
|
||||
FT_WinFNT_Header header = &face->font->header;
|
||||
FT_Bitmap_Size* bsize = size->face->available_sizes;
|
||||
FT_Error error = FNT_Err_Invalid_Pixel_Size;
|
||||
FT_Long height;
|
||||
|
||||
error = FT_Match_Size( face, req, 1, NULL );
|
||||
|
||||
if ( req->vertResolution )
|
||||
height = ( req->height * req->vertResolution + 36 ) / 72;
|
||||
else
|
||||
height = req->height;
|
||||
|
||||
height = ( height + 32 ) >> 6;
|
||||
|
||||
switch ( req->type )
|
||||
{
|
||||
case FT_SIZE_REQUEST_TYPE_NOMINAL:
|
||||
if ( height == ( bsize->y_ppem + 32 ) >> 6 )
|
||||
error = FNT_Err_Ok;
|
||||
break;
|
||||
case FT_SIZE_REQUEST_TYPE_REAL_DIM:
|
||||
if ( height == header->pixel_height )
|
||||
error = FNT_Err_Ok;
|
||||
break;
|
||||
default:
|
||||
error = FNT_Err_Unimplemented_Feature;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( error )
|
||||
return error;
|
||||
else
|
||||
{
|
||||
size->metrics.height = face->available_sizes->height << 6;
|
||||
|
||||
return FNT_Size_Select( size );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue