summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXFont.c
diff options
context:
space:
mode:
authorKevin Walzer <kw@codebykevin.com>2019-05-12 00:42:45 (GMT)
committerKevin Walzer <kw@codebykevin.com>2019-05-12 00:42:45 (GMT)
commit072a5b975a1be10db800fc4351679183f6156030 (patch)
tree098900bab48f027128bc7e1a6ab9db696fb3df89 /macosx/tkMacOSXFont.c
parentddeb2946c0ec5f9e882e148622452f5e9a9304b1 (diff)
parent71c5035aac2580da0a2644e9f047364affbe44eb (diff)
downloadtk-072a5b975a1be10db800fc4351679183f6156030.zip
tk-072a5b975a1be10db800fc4351679183f6156030.tar.gz
tk-072a5b975a1be10db800fc4351679183f6156030.tar.bz2
Merge in core-8-6-branch
Diffstat (limited to 'macosx/tkMacOSXFont.c')
-rw-r--r--macosx/tkMacOSXFont.c193
1 files changed, 104 insertions, 89 deletions
diff --git a/macosx/tkMacOSXFont.c b/macosx/tkMacOSXFont.c
index 353ad6b..0e05ae5 100644
--- a/macosx/tkMacOSXFont.c
+++ b/macosx/tkMacOSXFont.c
@@ -1,8 +1,8 @@
/*
* tkMacOSXFont.c --
*
- * Contains the Macintosh implementation of the platform-independant
- * font package interface.
+ * Contains the Macintosh implementation of the platform-independant font
+ * package interface.
*
* Copyright 2002-2004 Benjamin Riefenstahl, Benjamin.Riefenstahl@epost.de
* Copyright (c) 2006-2009 Daniel A. Steffen <das@users.sourceforge.net>
@@ -32,9 +32,8 @@
*/
typedef struct {
- TkFont font; /* Stuff used by generic font package. Must
- * be first in structure. */
-
+ TkFont font; /* Stuff used by generic font package. Must be
+ * first in structure. */
NSFont *nsFont;
NSDictionary *nsAttributes;
} MacFont;
@@ -83,17 +82,21 @@ static int antialiasedTextEnabled = -1;
static NSCharacterSet *whitespaceCharacterSet = nil;
static NSCharacterSet *lineendingCharacterSet = nil;
-static void GetTkFontAttributesForNSFont(NSFont *nsFont,
- TkFontAttributes *faPtr);
-static NSFont *FindNSFont(const char *familyName, NSFontTraitMask traits,
- NSInteger weight, CGFloat size, int fallbackToDefault);
-static void InitFont(NSFont *nsFont, const TkFontAttributes *reqFaPtr,
- MacFont * fontPtr);
-static int CreateNamedSystemFont(Tcl_Interp *interp, Tk_Window tkwin,
- const char* name, TkFontAttributes *faPtr);
-static void DrawCharsInContext(Display *display, Drawable drawable, GC gc,
- Tk_Font tkfont, const char *source, int numBytes, int rangeStart,
- int rangeLength, int x, int y, double angle);
+static void GetTkFontAttributesForNSFont(NSFont *nsFont,
+ TkFontAttributes *faPtr);
+static NSFont * FindNSFont(const char *familyName,
+ NSFontTraitMask traits, NSInteger weight,
+ CGFloat size, int fallbackToDefault);
+static void InitFont(NSFont *nsFont,
+ const TkFontAttributes *reqFaPtr,
+ MacFont *fontPtr);
+static int CreateNamedSystemFont(Tcl_Interp *interp,
+ Tk_Window tkwin, const char *name,
+ TkFontAttributes *faPtr);
+static void DrawCharsInContext(Display *display, Drawable drawable,
+ GC gc, Tk_Font tkfont, const char *source,
+ int numBytes, int rangeStart, int rangeLength,
+ int x, int y, double angle);
#pragma mark -
#pragma mark Font Helpers:
@@ -232,7 +235,7 @@ InitFont(
int ascent, descent/*, dontAA*/;
static const UniChar ch[] = {'.', 'W', ' ', 0xc4, 0xc1, 0xc2, 0xc3, 0xc7};
/* ., W, Space, Auml, Aacute, Acirc, Atilde, Ccedilla */
- #define nCh (sizeof(ch) / sizeof(UniChar))
+#define nCh (sizeof(ch) / sizeof(UniChar))
CGGlyph glyphs[nCh];
CGRect boundingRects[nCh];
@@ -244,7 +247,11 @@ InitFont(
TkInitFontAttributes(faPtr);
}
fontPtr->nsFont = nsFont;
- // some don't like antialiasing on fixed-width even if bigger than limit
+
+ /*
+ * Some don't like antialiasing on fixed-width even if bigger than limit
+ */
+
// dontAA = [nsFont isFixedPitch] && fontPtr->font.fa.size <= 10;
if (antialiasedTextEnabled >= 0/* || dontAA*/) {
renderingMode = (antialiasedTextEnabled == 0/* || dontAA*/) ?
@@ -294,7 +301,7 @@ InitFont(
NSLigatureAttributeName,
[NSNumber numberWithDouble:kern], NSKernAttributeName, nil];
fontPtr->nsAttributes = [nsAttributes retain];
- #undef nCh
+#undef nCh
}
/*
@@ -358,10 +365,14 @@ TkpFontPkgInit(
NSFont *nsFont;
TkFontAttributes fa;
NSMutableCharacterSet *cs;
- /* Since we called before TkpInit, we need our own autorelease pool. */
+ /*
+ * Since we called before TkpInit, we need our own autorelease pool.
+ */
NSAutoreleasePool *pool = [NSAutoreleasePool new];
- /* force this for now */
+ /*
+ * Force this for now.
+ */
if (!mainPtr->winPtr->mainPtr) {
mainPtr->winPtr->mainPtr = mainPtr;
}
@@ -413,17 +424,17 @@ TkpFontPkgInit(
* Map a platform-specific native font name to a TkFont.
*
* Results:
- * The return value is a pointer to a TkFont that represents the
- * native font. If a native font by the given name could not be
- * found, the return value is NULL.
+ * The return value is a pointer to a TkFont that represents the native
+ * font. If a native font by the given name could not be found, the return
+ * value is NULL.
*
- * Every call to this procedure returns a new TkFont structure, even
- * if the name has already been seen before. The caller should call
+ * Every call to this procedure returns a new TkFont structure, even if
+ * the name has already been seen before. The caller should call
* TkpDeleteFont() when the font is no longer needed.
*
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generics TkFont before calling TkpDeleteFont().
+ * The caller is responsible for initializing the memory associated with
+ * the generic TkFont when this function returns and releasing the
+ * contents of the generics TkFont before calling TkpDeleteFont().
*
* Side effects:
* None.
@@ -449,8 +460,8 @@ TkpGetNativeFont(
} else {
return NULL;
}
- ctFont = CTFontCreateUIFontForLanguage(HIThemeGetUIFontType(
- themeFontId), 0, NULL);
+ ctFont = CTFontCreateUIFontForLanguage(
+ HIThemeGetUIFontType(themeFontId), 0, NULL);
if (ctFont) {
fontPtr = ckalloc(sizeof(MacFont));
InitFont((NSFont*) ctFont, NULL, fontPtr);
@@ -468,19 +479,18 @@ TkpGetNativeFont(
* closest matching attributes.
*
* Results:
- * The return value is a pointer to a TkFont that represents the font
- * with the desired attributes. If a font with the desired attributes
- * could not be constructed, some other font will be substituted
- * automatically.
+ * The return value is a pointer to a TkFont that represents the font with
+ * the desired attributes. If a font with the desired attributes could not
+ * be constructed, some other font will be substituted automatically.
*
- * Every call to this procedure returns a new TkFont structure, even
- * if the specified attributes have already been seen before. The
- * caller should call TkpDeleteFont() to free the platform- specific
- * data when the font is no longer needed.
+ * Every call to this procedure returns a new TkFont structure, even if
+ * the specified attributes have already been seen before. The caller
+ * should call TkpDeleteFont() to free the platform- specific data when
+ * the font is no longer needed.
*
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generic TkFont before calling TkpDeleteFont().
+ * The caller is responsible for initializing the memory associated with
+ * the generic TkFont when this function returns and releasing the
+ * contents of the generic TkFont before calling TkpDeleteFont().
*
* Side effects:
* None.
@@ -492,16 +502,16 @@ TkFont *
TkpGetFontFromAttributes(
TkFont *tkFontPtr, /* If non-NULL, store the information in this
* existing TkFont structure, rather than
- * allocating a new structure to hold the
- * font; the existing contents of the font
- * will be released. If NULL, a new TkFont
- * structure is allocated. */
+ * allocating a new structure to hold the font;
+ * the existing contents of the font will be
+ * released. If NULL, a new TkFont structure is
+ * allocated. */
Tk_Window tkwin, /* For display where font will be used. */
const TkFontAttributes *faPtr)
/* Set of attributes to match. */
{
MacFont *fontPtr;
- int points = (int)(TkFontGetPoints(tkwin, faPtr->size) + 0.5);
+ int points = (int) (TkFontGetPoints(tkwin, faPtr->size) + 0.5);
NSFontTraitMask traits = GetNSFontTraitsFromTkFontAttributes(faPtr);
NSInteger weight = (faPtr->weight == TK_FW_BOLD ? 9 : 5);
NSFont *nsFont;
@@ -538,9 +548,9 @@ TkpGetFontFromAttributes(
* TkpDeleteFont --
*
* Called to release a font allocated by TkpGetNativeFont() or
- * TkpGetFontFromAttributes(). The caller should have already
- * released the fields of the TkFont that are used exclusively by the
- * generic TkFont code.
+ * TkpGetFontFromAttributes(). The caller should have already released the
+ * fields of the TkFont that are used exclusively by the generic TkFont
+ * code.
*
* Results:
* TkFont is deallocated.
@@ -567,8 +577,8 @@ TkpDeleteFont(
*
* TkpGetFontFamilies --
*
- * Return information about the font families that are available on
- * the display of the given window.
+ * Return information about the font families that are available on the
+ * display of the given window.
*
* Results:
* Modifies interp's result object to hold a list of all the available
@@ -600,12 +610,12 @@ TkpGetFontFamilies(
*
* TkpGetSubFonts --
*
- * A function used by the testing package for querying the actual
- * screen fonts that make up a font object.
+ * A function used by the testing package for querying the actual screen
+ * fonts that make up a font object.
*
* Results:
- * Modifies interp's result object to hold a list containing the names
- * of the screen fonts that make up the given font object.
+ * Modifies interp's result object to hold a list containing the names of
+ * the screen fonts that make up the given font object.
*
* Side effects:
* None.
@@ -642,8 +652,8 @@ TkpGetSubFonts(
*
* TkpGetFontAttrsForChar --
*
- * Retrieve the font attributes of the actual font used to render a
- * given character.
+ * Retrieve the font attributes of the actual font used to render a given
+ * character.
*
* Results:
* None.
@@ -745,10 +755,9 @@ Tk_MeasureChars(
* all the characters on the line for context.
*
* Results:
- * The return value is the number of bytes from source that
- * fit into the span that extends from 0 to maxLength. *lengthPtr is
- * filled with the x-coordinate of the right edge of the last
- * character that did fit.
+ * The return value is the number of bytes from source that fit into the
+ * span that extends from 0 to maxLength. *lengthPtr is filled with the
+ * x-coordinate of the right edge of the last character that did fit.
*
* Side effects:
* None.
@@ -774,11 +783,11 @@ TkpMeasureCharsInContext(
* TK_PARTIAL_OK means include the last char
* which only partially fits on this line.
* TK_WHOLE_WORDS means stop on a word
- * boundary, if possible. TK_AT_LEAST_ONE
- * means return at least one character even
- * if no characters fit. If TK_WHOLE_WORDS
- * and TK_AT_LEAST_ONE are set and the first
- * word doesn't fit, we return at least one
+ * boundary, if possible. TK_AT_LEAST_ONE means
+ * return at least one character even if no
+ * characters fit. If TK_WHOLE_WORDS and
+ * TK_AT_LEAST_ONE are set and the first word
+ * doesn't fit, we return at least one
* character or whatever characters fit into
* maxLength. TK_ISOLATE_END means that the
* last character should not be considered in
@@ -864,14 +873,13 @@ TkpMeasureCharsInContext(
}
/*
- * If there is no line breakpoint in the source string between
- * its start and the index position that fits in maxWidth, then
+ * If there is no line breakpoint in the source string between its
+ * start and the index position that fits in maxWidth, then
* CTTypesetterSuggestLineBreak() returns that very last index.
- * However if the TK_WHOLE_WORDS flag is set, we want to break
- * at a word boundary. In this situation, unless TK_AT_LEAST_ONE
- * is set, we must report that zero chars actually fit (in other
- * words the smallest word of the source string is still larger
- * than maxWidth).
+ * However if the TK_WHOLE_WORDS flag is set, we want to break at a
+ * word boundary. In this situation, unless TK_AT_LEAST_ONE is set, we
+ * must report that zero chars actually fit (in other words the
+ * smallest word of the source string is still larger than maxWidth).
*/
if ((index >= start) && (index < len) &&
@@ -903,9 +911,12 @@ TkpMeasureCharsInContext(
CFRelease(line);
}
- /* The call to CTTypesetterSuggestClusterBreak above will always
- return at least one character regardless of whether it exceeded
- it or not. Clean that up now. */
+ /*
+ * The call to CTTypesetterSuggestClusterBreak above will always return
+ * at least one character regardless of whether it exceeded it or not.
+ * Clean that up now.
+ */
+
while (width > maxWidth && !(flags & TK_PARTIAL_OK)
&& index > start+(flags & TK_AT_LEAST_ONE)) {
range.length = --index;
@@ -946,7 +957,7 @@ done:
* actual implementation in TkpDrawCharsInContext().
*
* Results:
- * None.
+ * None.
*
* Side effects:
* Information gets drawn on the screen.
@@ -964,8 +975,8 @@ Tk_DrawChars(
const char *source, /* UTF-8 string to be displayed. Need not be
* '\0' terminated. All Tk meta-characters
* (tabs, control characters, and newlines)
- * should be stripped out of the string that
- * is passed to this function. If they are not
+ * should be stripped out of the string that is
+ * passed to this function. If they are not
* stripped out, they will be displayed as
* regular printing characters. */
int numBytes, /* Number of bytes in string. */
@@ -986,8 +997,8 @@ TkDrawAngledChars(
const char *source, /* UTF-8 string to be displayed. Need not be
* '\0' terminated. All Tk meta-characters
* (tabs, control characters, and newlines)
- * should be stripped out of the string that
- * is passed to this function. If they are not
+ * should be stripped out of the string that is
+ * passed to this function. If they are not
* stripped out, they will be displayed as
* regular printing characters. */
int numBytes, /* Number of bytes in string. */
@@ -1029,8 +1040,8 @@ TkpDrawCharsInContext(
const char * source, /* UTF-8 string to be displayed. Need not be
* '\0' terminated. All Tk meta-characters
* (tabs, control characters, and newlines)
- * should be stripped out of the string that
- * is passed to this function. If they are not
+ * should be stripped out of the string that is
+ * passed to this function. If they are not
* stripped out, they will be displayed as
* regular printing characters. */
int numBytes, /* Number of bytes in string. */
@@ -1054,8 +1065,8 @@ DrawCharsInContext(
const char * source, /* UTF-8 string to be displayed. Need not be
* '\0' terminated. All Tk meta-characters
* (tabs, control characters, and newlines)
- * should be stripped out of the string that
- * is passed to this function. If they are not
+ * should be stripped out of the string that is
+ * passed to this function. If they are not
* stripped out, they will be displayed as
* regular printing characters. */
int numBytes, /* Number of bytes in string. */
@@ -1091,6 +1102,7 @@ DrawCharsInContext(
if (!string) {
return;
}
+
context = drawingContext.context;
fg = TkMacOSXCreateCGColor(gc, gc->foreground);
attributes = [fontPtr->nsAttributes mutableCopy];
@@ -1119,6 +1131,7 @@ DrawCharsInContext(
len = Tcl_NumUtfChars(source, rangeStart + rangeLength);
if (start > 0) {
CGRect clipRect = CGRectInfinite, startBounds;
+
line = CTTypesetterCreateLine(typesetter, CFRangeMake(0, start));
startBounds = CTLineGetImageBounds(line, context);
CFRelease(line);
@@ -1241,9 +1254,10 @@ TkMacOSXFontDescriptionForNSFontAndNSFontAttributes(
NSUnderlineStyleAttributeName];
id strikethrough = [nsAttributes objectForKey:
NSStrikethroughStyleAttributeName];
+
objv[i++] = Tcl_NewStringObj(familyName, -1);
objv[i++] = Tcl_NewIntObj([nsFont pointSize]);
-#define S(s) Tcl_NewStringObj(STRINGIFY(s),(int)(sizeof(STRINGIFY(s))-1))
+#define S(s) Tcl_NewStringObj(STRINGIFY(s),(int)(sizeof(STRINGIFY(s))-1))
objv[i++] = (traits & NSBoldFontMask) ? S(bold) : S(normal);
objv[i++] = (traits & NSItalicFontMask) ? S(italic) : S(roman);
if ([underline respondsToSelector:@selector(intValue)] &&
@@ -1267,8 +1281,9 @@ TkMacOSXFontDescriptionForNSFontAndNSFontAttributes(
* TkMacOSXUseAntialiasedText --
*
* Enables or disables application-wide use of antialiased text (where
- * available). Sets up a linked Tcl global variable to allow
- * disabling of antialiased text from tcl.
+ * available). Sets up a linked Tcl global variable to allow disabling of
+ * antialiased text from Tcl.
+ *
* The possible values for this variable are:
*
* -1 - Use system default as configurable in "System Prefs" -> "General".