And fixed other compile errors. Of course I forgot to add uiFontButton back in (I wanted to properly comment that first :/ ). Now for linker errors, which may result in some warning fixes along the way.

This commit is contained in:
Pietro Gagliardi 2018-03-09 18:01:23 -05:00
parent 82d3de7c31
commit c82197f408
7 changed files with 61 additions and 61 deletions

View File

@ -6,7 +6,7 @@
// problem: for a CTFrame made from an empty string, the CTLine array will be empty, and we will crash when doing anything requiring a CTLine // problem: for a CTFrame made from an empty string, the CTLine array will be empty, and we will crash when doing anything requiring a CTLine
// solution: for those cases, maintain a separate framesetter just for computing those things // solution: for those cases, maintain a separate framesetter just for computing those things
// in the usual case, the separate copy will just be identical to the regular one, with extra references to everything within // in the usual case, the separate copy will just be identical to the regular one, with extra references to everything within
@interface uiprivTextFrame { @interface uiprivTextFrame : NSObject {
CFAttributedStringRef attrstr; CFAttributedStringRef attrstr;
NSArray *backgroundBlocks; NSArray *backgroundBlocks;
CTFramesetterRef framesetter; CTFramesetterRef framesetter;
@ -25,7 +25,7 @@
- (id)initWithLayoutParams:(uiDrawTextLayoutParams *)p - (id)initWithLayoutParams:(uiDrawTextLayoutParams *)p
{ {
CFRange range; CFRange range;
CGFloat width; CGFloat cgwidth;
CFRange unused; CFRange unused;
CGRect rect; CGRect rect;
@ -54,7 +54,7 @@
rect.origin = CGPointZero; rect.origin = CGPointZero;
rect.size = self->size; rect.size = self->size;
self->path = CGPathCreateWithRect(rect, NULL); self->path = CGPathCreateWithRect(rect, NULL);
self->frame = CTFramesetterCreateFrame(tl->framesetter, self->frame = CTFramesetterCreateFrame(self->framesetter,
range, range,
self->path, self->path,
// TODO kCTFramePathWidthAttributeName? // TODO kCTFramePathWidthAttributeName?
@ -144,7 +144,7 @@ uiDrawTextLayout *uiDrawNewTextLayout(uiDrawTextLayoutParams *p)
tl = uiprivNew(uiDrawTextLayout); tl = uiprivNew(uiDrawTextLayout);
tl->frame = [[uiprivTextFrame alloc] initWithLayoutParams:p]; tl->frame = [[uiprivTextFrame alloc] initWithLayoutParams:p];
if (uiAttributedStringLength(p->String) != 0) if (uiAttributedStringLen(p->String) != 0)
tl->forLines = [tl->frame retain]; tl->forLines = [tl->frame retain];
else { else {
uiAttributedString *space; uiAttributedString *space;

View File

@ -275,9 +275,9 @@ FONTNAME(familyName,
struct closeness { struct closeness {
CFIndex index; CFIndex index;
uiDrawTextWeight weight; uiTextWeight weight;
double italic; double italic;
uiDrawTextStretch stretch; uiTextStretch stretch;
double distance; double distance;
}; };
@ -287,14 +287,14 @@ static const double italicClosenessNormal[] = { 0, 1, 1 };
static const double italicClosenessOblique[] = { 1, 0, 0.5 }; static const double italicClosenessOblique[] = { 1, 0, 0.5 };
static const double italicClosenessItalic[] = { 1, 0.5, 0 }; static const double italicClosenessItalic[] = { 1, 0.5, 0 };
static const double *italicClosenesses[] = { static const double *italicClosenesses[] = {
[uiDrawTextItalicNormal] = italicClosenessNormal, [uiTextItalicNormal] = italicClosenessNormal,
[uiDrawTextItalicOblique] = italicClosenessOblique, [uiTextItalicOblique] = italicClosenessOblique,
[uiDrawTextItalicItalic] = italicClosenessItalic, [uiTextItalicItalic] = italicClosenessItalic,
}; };
// Core Text doesn't seem to differentiate between Italic and Oblique. // Core Text doesn't seem to differentiate between Italic and Oblique.
// Pango's Core Text code just does a g_strrstr() (backwards case-sensitive search) for "Oblique" in the font's style name (see https://git.gnome.org/browse/pango/tree/pango/pangocoretext-fontmap.c); let's do that too I guess // Pango's Core Text code just does a g_strrstr() (backwards case-sensitive search) for "Oblique" in the font's style name (see https://git.gnome.org/browse/pango/tree/pango/pangocoretext-fontmap.c); let's do that too I guess
static uiDrawTextItalic guessItalicOblique(uiprivFontStyleData *d) static uiTextItalic guessItalicOblique(uiprivFontStyleData *d)
{ {
CFStringRef styleName; CFStringRef styleName;
BOOL isOblique; BOOL isOblique;
@ -309,8 +309,8 @@ static uiDrawTextItalic guessItalicOblique(uiprivFontStyleData *d)
isOblique = YES; isOblique = YES;
} }
if (isOblique) if (isOblique)
return uiDrawTextItalicOblique; return uiTextItalicOblique;
return uiDrawTextItalicItalic; return uiTextItalicItalic;
} }
// Italics are hard because Core Text does NOT distinguish between italic and oblique. // Italics are hard because Core Text does NOT distinguish between italic and oblique.
@ -320,7 +320,7 @@ static uiDrawTextItalic guessItalicOblique(uiprivFontStyleData *d)
// TODO there is still one catch that might matter from a user's POV: the reverse is not true the italic bit can be set even if the style of the font face/subfamily/style isn't named as Italic (for example, script typefaces like Adobe's Palace Script MT Std); I don't know what to do about this... I know how to start: find a script font that has an italic form (Adobe's Palace Script MT Std does not; only Regular and Semibold) // TODO there is still one catch that might matter from a user's POV: the reverse is not true the italic bit can be set even if the style of the font face/subfamily/style isn't named as Italic (for example, script typefaces like Adobe's Palace Script MT Std); I don't know what to do about this... I know how to start: find a script font that has an italic form (Adobe's Palace Script MT Std does not; only Regular and Semibold)
static void setItalic(uiprivFontStyleData *d, uiFontDescriptor *out) static void setItalic(uiprivFontStyleData *d, uiFontDescriptor *out)
{ {
out->Italic = uiDrawTextItalicNormal; out->Italic = uiTextItalicNormal;
if (([d symbolicTraits] & kCTFontItalicTrait) != 0) if (([d symbolicTraits] & kCTFontItalicTrait) != 0)
out->Italic = guessItalicOblique(d); out->Italic = guessItalicOblique(d);
} }

View File

@ -31,18 +31,18 @@ static BOOL fontRegistered(uiprivFontStyleData *d)
// Core Text does (usWidthClass / 10) - 0.5 here. // Core Text does (usWidthClass / 10) - 0.5 here.
// This roughly maps to our values with increments of 0.1, except for the fact 0 and 10 are allowed by Core Text, despite being banned by TrueType and OpenType themselves. // This roughly maps to our values with increments of 0.1, except for the fact 0 and 10 are allowed by Core Text, despite being banned by TrueType and OpenType themselves.
// We'll just treat them as identical to 1 and 9, respectively. // We'll just treat them as identical to 1 and 9, respectively.
static const uiDrawTextStretch os2WidthsToStretches[] = { static const uiTextStretch os2WidthsToStretches[] = {
uiDrawTextStretchUltraCondensed, uiTextStretchUltraCondensed,
uiDrawTextStretchUltraCondensed, uiTextStretchUltraCondensed,
uiDrawTextStretchExtraCondensed, uiTextStretchExtraCondensed,
uiDrawTextStretchCondensed, uiTextStretchCondensed,
uiDrawTextStretchSemiCondensed, uiTextStretchSemiCondensed,
uiDrawTextStretchNormal, uiTextStretchNormal,
uiDrawTextStretchSemiExpanded, uiTextStretchSemiExpanded,
uiDrawTextStretchExpanded, uiTextStretchExpanded,
uiDrawTextStretchExtraExpanded, uiTextStretchExtraExpanded,
uiDrawTextStretchUltraExpanded, uiTextStretchUltraExpanded,
uiDrawTextStretchUltraExpanded, uiTextStretchUltraExpanded,
}; };
static const CFStringRef exceptions[] = { static const CFStringRef exceptions[] = {
@ -174,50 +174,50 @@ void uiprivProcessFontTraits(uiprivFontStyleData *d, uiFontDescriptor *out)
if (!hasWeight) if (!hasWeight)
// TODO this scale is a bit lopsided // TODO this scale is a bit lopsided
if (weight <= -0.7) if (weight <= -0.7)
out->Weight = uiDrawTextWeightThin; out->Weight = uiTextWeightThin;
else if (weight <= -0.5) else if (weight <= -0.5)
out->Weight = uiDrawTextWeightUltraLight; out->Weight = uiTextWeightUltraLight;
else if (weight <= -0.3) else if (weight <= -0.3)
out->Weight = uiDrawTextWeightLight; out->Weight = uiTextWeightLight;
else if (weight <= -0.23) { else if (weight <= -0.23) {
out->Weight = uiDrawTextWeightBook; out->Weight = uiTextWeightBook;
if (shouldReallyBeThin(d)) if (shouldReallyBeThin(d))
out->Weight = uiDrawTextWeightThin; out->Weight = uiTextWeightThin;
} else if (weight <= 0.0) } else if (weight <= 0.0)
out->Weight = uiDrawTextWeightNormal; out->Weight = uiTextWeightNormal;
else if (weight <= 0.23) else if (weight <= 0.23)
out->Weight = uiDrawTextWeightMedium; out->Weight = uiTextWeightMedium;
else if (weight <= 0.3) else if (weight <= 0.3)
out->Weight = uiDrawTextWeightSemiBold; out->Weight = uiTextWeightSemiBold;
else if (weight <= 0.4) else if (weight <= 0.4)
out->Weight = uiDrawTextWeightBold; out->Weight = uiTextWeightBold;
else if (weight <= 0.5) else if (weight <= 0.5)
out->Weight = uiDrawTextWeightUltraBold; out->Weight = uiTextWeightUltraBold;
else if (weight <= 0.7) else if (weight <= 0.7)
out->Weight = uiDrawTextWeightHeavy; out->Weight = uiTextWeightHeavy;
else else
out->Weight = uiDrawTextWeightUltraHeavy; out->Weight = uiTextWeightUltraHeavy;
if (!hasWidth) if (!hasWidth)
// TODO this scale is a bit lopsided // TODO this scale is a bit lopsided
if (width <= -0.7) { if (width <= -0.7) {
out->Stretch = uiDrawTextStretchUltraCondensed; out->Stretch = uiTextStretchUltraCondensed;
if (shouldReallyBeSemiCondensed(d)) if (shouldReallyBeSemiCondensed(d))
out->Stretch = uiDrawTextStretchSemiCondensed; out->Stretch = uiTextStretchSemiCondensed;
} else if (width <= -0.5) } else if (width <= -0.5)
out->Stretch = uiDrawTextStretchExtraCondensed; out->Stretch = uiTextStretchExtraCondensed;
else if (width <= -0.2) else if (width <= -0.2)
out->Stretch = uiDrawTextStretchCondensed; out->Stretch = uiTextStretchCondensed;
else if (width <= -0.1) else if (width <= -0.1)
out->Stretch = uiDrawTextStretchSemiCondensed; out->Stretch = uiTextStretchSemiCondensed;
else if (width <= 0.0) else if (width <= 0.0)
out->Stretch = uiDrawTextStretchNormal; out->Stretch = uiTextStretchNormal;
else if (width <= 0.1) else if (width <= 0.1)
out->Stretch = uiDrawTextStretchSemiExpanded; out->Stretch = uiTextStretchSemiExpanded;
else if (width <= 0.2) else if (width <= 0.2)
out->Stretch = uiDrawTextStretchExpanded; out->Stretch = uiTextStretchExpanded;
else if (width <= 0.6) else if (width <= 0.6)
out->Stretch = uiDrawTextStretchExtraExpanded; out->Stretch = uiTextStretchExtraExpanded;
else else
out->Stretch = uiDrawTextStretchUltraExpanded; out->Stretch = uiTextStretchUltraExpanded;
} }

View File

@ -310,8 +310,8 @@ void uiprivProcessFontVariation(uiprivFontStyleData *d, NSDictionary *axisDict,
CFDictionaryRef var; CFDictionaryRef var;
double v; double v;
out->Weight = uiDrawTextWeightNormal; out->Weight = uiTextWeightNormal;
out->Stretch = uiDrawTextStretchNormal; out->Stretch = uiTextStretchNormal;
var = [d variation]; var = [d variation];
@ -320,14 +320,14 @@ void uiprivProcessFontVariation(uiprivFontStyleData *d, NSDictionary *axisDict,
// we want a linear value between 0 and 1000 with 400 being normal // we want a linear value between 0 and 1000 with 400 being normal
if (v < 0) { if (v < 0) {
v += 1; v += 1;
out->Weight = (uiDrawTextWeight) (v * 400); out->Weight = (uiTextWeight) (v * 400);
} else if (v > 0) } else if (v > 0)
out->Weight += (uiDrawTextWeight) (v * 600); out->Weight += (uiTextWeight) (v * 600);
} }
if (tryAxis(axisDict, var, fvarAxisKey(fvarWidth), &v)) { if (tryAxis(axisDict, var, fvarAxisKey(fvarWidth), &v)) {
// likewise, but with stretches, we go from 0 to 8 with 4 being directly between the two, so this is sufficient // likewise, but with stretches, we go from 0 to 8 with 4 being directly between the two, so this is sufficient
v += 1; v += 1;
out->Stretch = (uiDrawTextStretch) (v * 4); out->Stretch = (uiTextStretch) (v * 4);
} }
} }

View File

@ -92,7 +92,7 @@ static uiForEach otfArrayForEachOT(const uiOpenTypeFeatures *otf, char a, char b
p.valueValue = (const SInt32 *) (&value); p.valueValue = (const SInt32 *) (&value);
addCTFeatureEntry(&p); addCTFeatureEntry(&p);
CFRelease(strTag); CFRelease(tagstr);
return uiForEachContinue; return uiForEachContinue;
} }

View File

@ -61,11 +61,3 @@ _UI_EXTERN double uiDrawTextLayoutByteLocationInLine(uiDrawTextLayout *tl, size_
_UI_EXTERN void uiDrawCaret(uiDrawContext *c, double x, double y, uiDrawTextLayout *layout, size_t pos, int *line); _UI_EXTERN void uiDrawCaret(uiDrawContext *c, double x, double y, uiDrawTextLayout *layout, size_t pos, int *line);
// TODO allow blinking // TODO allow blinking
// TODO allow secondary carets // TODO allow secondary carets
typedef struct uiFontButton uiFontButton;
#define uiFontButton(this) ((uiFontButton *) (this))
// TODO have a function that sets an entire font descriptor to a range in a uiAttributedString at once, for SetFont?
_UI_EXTERN void uiFontButtonFont(uiFontButton *b, uiDrawFontDescriptor *desc);
// TOOD SetFont, mechanics
_UI_EXTERN void uiFontButtonOnChanged(uiFontButton *b, void (*f)(uiFontButton *, void *), void *data);
_UI_EXTERN uiFontButton *uiNewFontButton(void);

View File

@ -495,3 +495,11 @@ _UI_EXTERN void uiDrawTextLayoutLineByteRange(uiDrawTextLayout *tl, int line, si
// TODO metrics functions // TODO metrics functions
// TODO number of lines visible for clipping rect, range visible for clipping rect? // TODO number of lines visible for clipping rect, range visible for clipping rect?
typedef struct uiFontButton uiFontButton;
#define uiFontButton(this) ((uiFontButton *) (this))
// TODO have a function that sets an entire font descriptor to a range in a uiAttributedString at once, for SetFont?
_UI_EXTERN void uiFontButtonFont(uiFontButton *b, uiFontDescriptor *desc);
// TOOD SetFont, mechanics
_UI_EXTERN void uiFontButtonOnChanged(uiFontButton *b, void (*f)(uiFontButton *, void *), void *data);
_UI_EXTERN uiFontButton *uiNewFontButton(void);