mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 17:27:08 +08:00
1 parent
8d3e6944aa
commit
4caf49d3d0
1 file changed
+26
@@ -15,7 +15,9 @@
|
|||||||
package ofdgo
|
package ofdgo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -149,9 +151,15 @@ type fontDataKey struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ResolveFont 使用配置的字体后端解析资源,保留精确匹配与回退的区别
|
// ResolveFont 使用配置的字体后端解析资源,保留精确匹配与回退的区别
|
||||||
|
// 页面取消及后端取消、超时结果不缓存,后续调用可重试
|
||||||
// 入参: id 字体资源标识, exact 是否要求精确匹配
|
// 入参: id 字体资源标识, exact 是否要求精确匹配
|
||||||
// 返回: ResolvedFont 字体与来源, error 解析错误
|
// 返回: ResolvedFont 字体与来源, error 解析错误
|
||||||
func (r *Renderer) ResolveFont(id string, exact bool) (ResolvedFont, error) {
|
func (r *Renderer) ResolveFont(id string, exact bool) (ResolvedFont, error) {
|
||||||
|
if r.pageContext != nil {
|
||||||
|
if err := r.pageContext.Err(); err != nil {
|
||||||
|
return ResolvedFont{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
if r.backends.Fonts == nil {
|
if r.backends.Fonts == nil {
|
||||||
return ResolvedFont{}, fmt.Errorf("fonts: %w", ErrBackendUnavailable)
|
return ResolvedFont{}, fmt.Errorf("fonts: %w", ErrBackendUnavailable)
|
||||||
}
|
}
|
||||||
@@ -163,6 +171,14 @@ func (r *Renderer) ResolveFont(id string, exact bool) (ResolvedFont, error) {
|
|||||||
return cached.font, cached.err
|
return cached.font, cached.err
|
||||||
}
|
}
|
||||||
resolved, err := r.backends.Fonts.ResolveFont(r, key.id, exact)
|
resolved, err := r.backends.Fonts.ResolveFont(r, key.id, exact)
|
||||||
|
if r.pageContext != nil {
|
||||||
|
if err := r.pageContext.Err(); err != nil {
|
||||||
|
return ResolvedFont{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
|
||||||
|
return ResolvedFont{}, err
|
||||||
|
}
|
||||||
key.definition = r.Reader.fontDefinition(id)
|
key.definition = r.Reader.fontDefinition(id)
|
||||||
if key.definition != nil && key.definition.ID != "" {
|
if key.definition != nil && key.definition.ID != "" {
|
||||||
key.id = key.definition.ID
|
key.id = key.definition.ID
|
||||||
@@ -176,6 +192,11 @@ func (r *Renderer) ResolveFont(id string, exact bool) (ResolvedFont, error) {
|
|||||||
// 入参: id 字体资源标识
|
// 入参: id 字体资源标识
|
||||||
// 返回: *PreparedFont 绘制字体, error 字体解析错误
|
// 返回: *PreparedFont 绘制字体, error 字体解析错误
|
||||||
func (r *Renderer) PrepareFont(id string) (*PreparedFont, error) {
|
func (r *Renderer) PrepareFont(id string) (*PreparedFont, error) {
|
||||||
|
if r.pageContext != nil {
|
||||||
|
if err := r.pageContext.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
if definition := r.Reader.fontDefinition(id); definition != nil && definition.ID != "" {
|
if definition := r.Reader.fontDefinition(id); definition != nil && definition.ID != "" {
|
||||||
id = definition.ID
|
id = definition.ID
|
||||||
}
|
}
|
||||||
@@ -216,6 +237,11 @@ func (r *Renderer) PrepareFont(id string) (*PreparedFont, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
prepared.digest = r.fontDigest(prepared.Data)
|
prepared.digest = r.fontDigest(prepared.Data)
|
||||||
|
if r.pageContext != nil {
|
||||||
|
if err := r.pageContext.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
cost := min(len(prepared.Data), r.fontPreparations.limit)*2 + (len(prepared.Glyphs)+len(prepared.CIDs))*48 + 256
|
cost := min(len(prepared.Data), r.fontPreparations.limit)*2 + (len(prepared.Glyphs)+len(prepared.CIDs))*48 + 256
|
||||||
r.fontPreparations.put(key, PreparedFont{ResolvedFont: ResolvedFont{Data: prepared.Data}, Glyphs: prepared.Glyphs, CIDs: prepared.CIDs, digest: prepared.digest}, cost)
|
r.fontPreparations.put(key, PreparedFont{ResolvedFont: ResolvedFont{Data: prepared.Data}, Glyphs: prepared.Glyphs, CIDs: prepared.CIDs, digest: prepared.digest}, cost)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user