CGFontCopyName() is too intricate to recreate. We might have to wind up calling it directly...
This commit is contained in:
parent
9b28bd5ecd
commit
2858c56528
|
@ -8,7 +8,7 @@ func (f *CTFont) IsRegistered() bool {
|
||||||
return n.(*CFNumber).Uint32Value() == kCTFontManagerScopeNone
|
return n.(*CFNumber).Uint32Value() == kCTFontManagerScopeNone
|
||||||
}
|
}
|
||||||
|
|
||||||
xx this type is in libFontRegistry.dylib; functions like x_list.Prepend() are called things like x_list_prepend() there
|
// this type is in libFontRegistry.dylib; functions like x_list.Prepend() are called things like x_list_prepend() there
|
||||||
type x_list struct {
|
type x_list struct {
|
||||||
Data interface{}
|
Data interface{}
|
||||||
Next *x_list
|
Next *x_list
|
||||||
|
@ -44,6 +44,23 @@ func (x *x_list) Reverse() *x_list {
|
||||||
return old
|
return old
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *x_list) Concat(y *x_list) *x_list {
|
||||||
|
if x == nil {
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
start := x
|
||||||
|
z := x
|
||||||
|
for {
|
||||||
|
x = z
|
||||||
|
z = z.next
|
||||||
|
if z == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x.next = y
|
||||||
|
return start
|
||||||
|
}
|
||||||
|
|
||||||
// based on CoreGraphics dylib's _CGFontCopyName
|
// based on CoreGraphics dylib's _CGFontCopyName
|
||||||
// note that this is different from the public API function CGFontCopyPostScriptName() (which is font type-independent)
|
// note that this is different from the public API function CGFontCopyPostScriptName() (which is font type-independent)
|
||||||
// also note that in reality these keys are strings but the implementation of the function turns them into ints and only uses them as such
|
// also note that in reality these keys are strings but the implementation of the function turns them into ints and only uses them as such
|
||||||
|
@ -60,7 +77,7 @@ func (f *CGFont) CopyName(key int) (string, bool) {
|
||||||
b := table.Bytes()
|
b := table.Bytes()
|
||||||
n := table.Len()
|
n := table.Len()
|
||||||
|
|
||||||
xx this code looks weird, but we're imitating the assembly, or the effective effects thereof
|
// this code looks weird, but we're imitating the assembly, or the effective effects thereof
|
||||||
offCount := uint16(0)
|
offCount := uint16(0)
|
||||||
offStringOffset := uint16(2)
|
offStringOffset := uint16(2)
|
||||||
if n > 1 {
|
if n > 1 {
|
||||||
|
@ -96,7 +113,7 @@ func (f *CGFont) CopyName(key int) (string, bool) {
|
||||||
}
|
}
|
||||||
pos := offNameRecords
|
pos := offNameRecords
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
xx TODO note assembly logic here
|
// TODO note assembly logic here
|
||||||
} else {
|
} else {
|
||||||
for {
|
for {
|
||||||
var nr NameRecord
|
var nr NameRecord
|
||||||
|
@ -145,7 +162,7 @@ func (f *CGFont) CopyName(key int) (string, bool) {
|
||||||
|
|
||||||
strpos := stringOffset + nr.Offset
|
strpos := stringOffset + nr.Offset
|
||||||
if strpos >= n {
|
if strpos >= n {
|
||||||
xx TODO put comment about imitating the assembly comparisons here
|
// TODO put comment about imitating the assembly comparisons here
|
||||||
} else {
|
} else {
|
||||||
realLen := nr.Length
|
realLen := nr.Length
|
||||||
strend = strpos + nr.Length
|
strend = strpos + nr.Length
|
||||||
|
@ -175,6 +192,40 @@ func (f *CGFont) CopyName(key int) (string, bool) {
|
||||||
nameList = nameList.Reverse()
|
nameList = nameList.Reverse()
|
||||||
|
|
||||||
hasLanguageTags:
|
hasLanguageTags:
|
||||||
|
add_localized_names := func(platformID uint16, platformSpecificID uint16, to *x_list) *x_list {
|
||||||
|
out := (*x_list)(nil)
|
||||||
|
if nameList == nil {
|
||||||
|
xx TODO logic verbatim etc.
|
||||||
|
} else {
|
||||||
|
x := nameList
|
||||||
|
for {
|
||||||
|
name := (*sfnt_name_t)(x.data)
|
||||||
|
if name.PlatformID != platformID {
|
||||||
|
xx TODO
|
||||||
|
} else {
|
||||||
|
if platformSpecificID == 0xFFFF || name.PlatformSpecificID == platformSpecificID {
|
||||||
|
out = out.Prepend(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x = x.next
|
||||||
|
if x == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out = out.Reverse()
|
||||||
|
return to.Concat(out)
|
||||||
|
}
|
||||||
|
localized := (*x_list)(nil)
|
||||||
|
localized = add_localized_names(0x1, 0xFFFF, localized)
|
||||||
|
localized = add_localized_names(0, 0xFFFF, localized)
|
||||||
|
localized = add_localized_names(0x3, 0xFFFF, localized)
|
||||||
|
localized = add_localized_names(0x1, 0, localized)
|
||||||
|
localized = add_localized_names(0x3, 0x9, localized)
|
||||||
|
localized = add_localized_names(0x3, 0x409, localized)
|
||||||
|
|
||||||
|
sysLocale := CFLocaleGetSystem()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// based on libFontRegistry.dylib's __ZNK8OS2Table15DetermineWeightERf — OS2Table::DetermineWeight(float&) const
|
// based on libFontRegistry.dylib's __ZNK8OS2Table15DetermineWeightERf — OS2Table::DetermineWeight(float&) const
|
||||||
|
|
Loading…
Reference in New Issue