back: implement coveredCharacterSet for CairoFontInfo

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@32716 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
ericwa 2011-03-28 04:19:41 +00:00
parent f4de37421d
commit e6b42470de
6 changed files with 97 additions and 1 deletions

View file

@ -1,3 +1,18 @@
2011-03-27 Eric Wasylishen <ewasylishen@gmail.com>
* Source/cairo/CairoFontEnumerator.m:
* Source/cairo/CairoFaceInfo.m:
* Source/cairo/CairoFontInfo.m:
* Headers/cairo/CairoFontEnumerator.h:
* Headers/cairo/CairoFaceInfo.h: Set the coveredCharacterSet ivar
of CairoFontInfo. The character set is obtained from Fontconfig.
There is an NSCharacterSet subclass which wraps the FcCharSet
structure from fontconfig, so there is no need for a slow conversion
from one character set format to another.
This has the effect of enabling glyph substitution when using
the cairo backend.
2011-03-23 Fred Kiefer <FredKiefer@gmx.de>
* Tools/xpbs.m (-pasteboard:provideDataForType:, -availableTypes)

View file

@ -64,5 +64,7 @@
- (cairo_font_face_t *)fontFace;
- (NSCharacterSet*)characterSet;
@end
#endif

View file

@ -30,10 +30,21 @@
#include <GNUstepGUI/GSFontInfo.h>
#include <cairo.h>
#include <fontconfig/fontconfig.h>
#include "cairo/CairoFaceInfo.h"
@interface CairoFontEnumerator : GSFontEnumerator
+ (CairoFaceInfo *) fontWithName: (NSString *)name;
@end
@interface FontconfigCharacterSet : NSCharacterSet
{
FcCharSet *_charset;
}
- (id)initWithFontconfigCharSet: (FcCharSet*)charset;
- (FcCharSet*)fontconfigCharSet;
@end
#endif

View file

@ -29,6 +29,7 @@
*/
#include "cairo/CairoFaceInfo.h"
#include "cairo/CairoFontEnumerator.h"
#include <cairo-ft.h>
#include <AppKit/NSFontManager.h>
@ -122,4 +123,24 @@
return _fontFace;
}
- (NSCharacterSet*)characterSet
{
FcResult result;
FcPattern *resolved;
FcCharSet *charset;
NSCharacterSet *characterSet = nil;
FcConfigSubstitute(NULL, _pattern, FcMatchPattern);
FcDefaultSubstitute(_pattern);
resolved = FcFontMatch(NULL, _pattern, &result);
if (FcResultMatch == FcPatternGetCharSet(resolved, FC_CHARSET, 0, &charset))
{
characterSet = [[[FontconfigCharacterSet alloc] initWithFontconfigCharSet: charset] autorelease];
}
FcPatternDestroy(resolved);
return characterSet;
}
@end

View file

@ -236,3 +236,48 @@ static NSArray *faFromFc(FcPattern *pat)
}
@end
@implementation FontconfigCharacterSet
- (id)initWithFontconfigCharSet: (FcCharSet*)charset
{
if ((self = [super init]))
{
_charset = FcCharSetCopy(charset);
}
return self;
}
- (id)mutableCopyWithZone: (NSZone*)aZone
{
return [[NSMutableCharacterSet characterSetWithBitmapRepresentation:
[self bitmapRepresentation]] retain];
}
- (void)dealloc
{
FcCharSetDestroy(_charset);
[super dealloc];
}
- (FcCharSet*)fontconfigCharSet
{
return _charset;
}
- (BOOL)characterIsMember: (unichar)c
{
return FcCharSetHasChar(_charset, c);
}
- (BOOL)longCharacterIsMember: (UTF32Char)c
{
return FcCharSetHasChar(_charset, c);
}
// FIXME: Implement for better performance
//- (NSData *)bitmapRepresentation
//{
//}
@end

View file

@ -79,7 +79,7 @@
/* setting GSFontInfo:
* weight, traits, familyName,
* mostCompatibleStringEncoding, encodingScheme,
* mostCompatibleStringEncoding, encodingScheme, coveredCharacterSet
*/
weight = [_faceInfo weight];
@ -87,6 +87,8 @@
familyName = [[_faceInfo familyName] copy];
mostCompatibleStringEncoding = NSUTF8StringEncoding;
encodingScheme = @"iso10646-1";
coveredCharacterSet = [[_faceInfo characterSet] retain];
/* setting GSFontInfo:
* xHeight, pix_width, pix_height