feat: 完成三类字母描红开发
This commit is contained in:
@@ -33,6 +33,8 @@ export interface LetterOverride {
|
||||
|
||||
/** 一套完整的字体渲染配置 */
|
||||
export interface FontProfile {
|
||||
/** 唯一标识,同时用作 wx.loadFontFace 的 family 和按名称查找的 key */
|
||||
name: string;
|
||||
/** 字体 URL */
|
||||
url: string;
|
||||
/** 各分类的默认渲染参数 */
|
||||
@@ -41,6 +43,11 @@ export interface FontProfile {
|
||||
letterOverrides?: Record<string, LetterOverride>;
|
||||
}
|
||||
|
||||
/** 构建 CSS font-family 串(含回退字体) */
|
||||
export function fontFamilyOf(profile: FontProfile): string {
|
||||
return `${profile.name}, Roboto, sans-serif`;
|
||||
}
|
||||
|
||||
// ── 字母分类集合 ──
|
||||
const TALL_LOWERCASE = new Set(['b', 'd', 'h', 'k', 'l']);
|
||||
const DESCENDERS = new Set(['g', 'p', 'q', 'y']);
|
||||
@@ -88,88 +95,121 @@ export function getLetterMetrics(
|
||||
|
||||
/** ZhiyongWrite 手写字体 */
|
||||
export const ZHIYONG_WRITE: FontProfile = {
|
||||
name: 'ZhiyongWrite',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/ZhiyongWrite.ttf',
|
||||
// categories: {
|
||||
// uppercase: { scale: 0.93, baselineOffset: 0 },
|
||||
// tallLower: { scale: 0.95, baselineOffset: 0 },
|
||||
// descender: { scale: 1.12, baselineOffset: 0.18 },
|
||||
// lowercase: { scale: 0.83, baselineOffset: 0.03 },
|
||||
// },
|
||||
// letterOverrides: {
|
||||
// i: { scale: 0.78, baselineOffset: 0.02 },
|
||||
// f: { scale: 1.37, baselineOffset: 0.34 },
|
||||
// t: { scale: 0.85, baselineOffset: 0 },
|
||||
// j: { scale: 1, baselineOffset: 0.15 },
|
||||
// },
|
||||
categories: {
|
||||
uppercase: { scale: 0.93, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.95, baselineOffset: 0 },
|
||||
descender: { scale: 1.12, baselineOffset: 0.18 },
|
||||
lowercase: { scale: 0.83, baselineOffset: 0.03 },
|
||||
uppercase: { scale: 0.95, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.85, baselineOffset: 0 },
|
||||
descender: { scale: 1, baselineOffset: 0.12 },
|
||||
lowercase: { scale: 0.75, baselineOffset: 0 },
|
||||
},
|
||||
letterOverrides: {
|
||||
i: { scale: 0.78, baselineOffset: 0.02 },
|
||||
f: { scale: 1.37, baselineOffset: 0.34 },
|
||||
i: { scale: 0.8, baselineOffset: 0 },
|
||||
f: { scale: 1, baselineOffset: 0.05 },
|
||||
t: { scale: 0.85, baselineOffset: 0 },
|
||||
j: { scale: 1, baselineOffset: 0.15 },
|
||||
j: { scale: 0.85, baselineOffset: 0.1 },
|
||||
},
|
||||
};
|
||||
|
||||
/** Handlee Regular — Google 手写风格 */
|
||||
export const HANDLEE_REGULAR: FontProfile = {
|
||||
name: 'HandleeRegular',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/Handlee-Regular.ttf',
|
||||
// categories: {
|
||||
// uppercase: { scale: 0.9, baselineOffset: 0 },
|
||||
// tallLower: { scale: 0.73, baselineOffset: 0.03 },
|
||||
// descender: { scale: 0.8, baselineOffset: 0.05 },
|
||||
// lowercase: { scale: 0.73, baselineOffset: 0.02 },
|
||||
// },
|
||||
// letterOverrides: {
|
||||
// i: { scale: 0.78, baselineOffset: 0.02 },
|
||||
// f: { scale: 0.82, baselineOffset: 0 },
|
||||
// t: { scale: 0.77, baselineOffset: 0.04 },
|
||||
// j: { scale: 0.85, baselineOffset: 0.08 },
|
||||
// },
|
||||
categories: {
|
||||
uppercase: { scale: 0.9, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.73, baselineOffset: 0.03 },
|
||||
descender: { scale: 0.8, baselineOffset: 0.05 },
|
||||
lowercase: { scale: 0.73, baselineOffset: 0.02 },
|
||||
tallLower: { scale: 0.68, baselineOffset: 0 },
|
||||
descender: { scale: 0.68, baselineOffset: 0 },
|
||||
lowercase: { scale: 0.68, baselineOffset: 0 },
|
||||
},
|
||||
letterOverrides: {
|
||||
i: { scale: 0.78, baselineOffset: 0.02 },
|
||||
f: { scale: 0.82, baselineOffset: 0 },
|
||||
t: { scale: 0.77, baselineOffset: 0.04 },
|
||||
j: { scale: 0.85, baselineOffset: 0.08 },
|
||||
i: { scale: 0.68, baselineOffset: 0 },
|
||||
f: { scale: 0.68, baselineOffset: 0 },
|
||||
t: { scale: 0.68, baselineOffset: 0 },
|
||||
j: { scale: 0.68, baselineOffset: 0 },
|
||||
},
|
||||
};
|
||||
|
||||
/** Print Clearly Regular */
|
||||
export const PRINT_CLEARLY_REGULAR: FontProfile = {
|
||||
name: 'PrintClearlyRegular',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/print_clearly_regular_tt.ttf',
|
||||
categories: {
|
||||
uppercase: { scale: 0.95, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.95, baselineOffset: 0 },
|
||||
descender: { scale: 1.05, baselineOffset: 0 },
|
||||
lowercase: { scale: 0.85, baselineOffset: 0 },
|
||||
uppercase: { scale: 1, baselineOffset: 0 },
|
||||
tallLower: { scale: 1, baselineOffset: 0 },
|
||||
descender: { scale: 1, baselineOffset: 0 },
|
||||
lowercase: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
letterOverrides: {
|
||||
f: { scale: 1.35, baselineOffset: 0 },
|
||||
t: { scale: 0.85, baselineOffset: 0 },
|
||||
j: { scale: 1.15, baselineOffset: 0 },
|
||||
i: { scale: 1, baselineOffset: 0 },
|
||||
f: { scale: 1, baselineOffset: 0 },
|
||||
t: { scale: 1, baselineOffset: 0 },
|
||||
j: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
};
|
||||
|
||||
/** Print Clearly Bold */
|
||||
export const PRINT_CLEARLY_BOLD: FontProfile = {
|
||||
name: 'PrintClearlyBold',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/print_clearly_bold_tt.ttf',
|
||||
categories: {
|
||||
uppercase: { scale: 0.95, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.95, baselineOffset: 0 },
|
||||
descender: { scale: 1.05, baselineOffset: 0 },
|
||||
lowercase: { scale: 0.85, baselineOffset: 0 },
|
||||
uppercase: { scale: 1, baselineOffset: 0 },
|
||||
tallLower: { scale: 1, baselineOffset: 0 },
|
||||
descender: { scale: 1, baselineOffset: 0 },
|
||||
lowercase: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
letterOverrides: {
|
||||
f: { scale: 1.35, baselineOffset: 0 },
|
||||
t: { scale: 0.85, baselineOffset: 0 },
|
||||
j: { scale: 1.15, baselineOffset: 0 },
|
||||
i: { scale: 1, baselineOffset: 0 },
|
||||
f: { scale: 1, baselineOffset: 0 },
|
||||
t: { scale: 1, baselineOffset: 0 },
|
||||
j: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
};
|
||||
|
||||
/** Print Clearly Dashed — 虚线描红字体 */
|
||||
export const PRINT_CLEARLY_DASHED: FontProfile = {
|
||||
name: 'PrintClearlyDashed',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/print_clearly_dashed_tt.ttf',
|
||||
categories: {
|
||||
uppercase: { scale: 0.95, baselineOffset: 0 },
|
||||
tallLower: { scale: 0.95, baselineOffset: 0 },
|
||||
descender: { scale: 1.05, baselineOffset: 0 },
|
||||
lowercase: { scale: 0.85, baselineOffset: 0 },
|
||||
uppercase: { scale: 1, baselineOffset: 0 },
|
||||
tallLower: { scale: 1, baselineOffset: 0 },
|
||||
descender: { scale: 1, baselineOffset: 0 },
|
||||
lowercase: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
letterOverrides: {
|
||||
f: { scale: 1.35, baselineOffset: 0 },
|
||||
t: { scale: 0.85, baselineOffset: 0 },
|
||||
j: { scale: 1.15, baselineOffset: 0 },
|
||||
i: { scale: 1, baselineOffset: 0 },
|
||||
f: { scale: 1, baselineOffset: 0 },
|
||||
t: { scale: 1, baselineOffset: 0 },
|
||||
j: { scale: 1, baselineOffset: 0 },
|
||||
},
|
||||
};
|
||||
|
||||
/** Num 数字字体 */
|
||||
export const NUM_FONT: FontProfile = {
|
||||
name: 'NumFont',
|
||||
url: 'https://cdn.joeyone.cn/doodle/fonts/num.woff2',
|
||||
categories: {
|
||||
uppercase: { scale: 0.95, baselineOffset: 0 },
|
||||
@@ -184,6 +224,25 @@ export const NUM_FONT: FontProfile = {
|
||||
},
|
||||
};
|
||||
|
||||
/** 当前激活的字体配置(切换字体只需修改这里) */
|
||||
// export const ACTIVE_FONT_PROFILE = ZHIYONG_WRITE;
|
||||
export const ACTIVE_FONT_PROFILE = HANDLEE_REGULAR;
|
||||
// ── 字体注册表:按 name 索引所有可用字体 ──
|
||||
|
||||
const FONT_PROFILES: ReadonlyArray<FontProfile> = [
|
||||
ZHIYONG_WRITE,
|
||||
HANDLEE_REGULAR,
|
||||
PRINT_CLEARLY_REGULAR,
|
||||
PRINT_CLEARLY_BOLD,
|
||||
PRINT_CLEARLY_DASHED,
|
||||
NUM_FONT,
|
||||
];
|
||||
|
||||
const _profileByName = new Map<string, FontProfile>(
|
||||
FONT_PROFILES.map((p) => [p.name, p]),
|
||||
);
|
||||
|
||||
/** 默认字母字体 */
|
||||
export const DEFAULT_LETTER_PROFILE = PRINT_CLEARLY_REGULAR;
|
||||
|
||||
/** 按名称查找字体配置,找不到返回默认 */
|
||||
export function getFontProfile(name: string): FontProfile {
|
||||
return _profileByName.get(name) ?? DEFAULT_LETTER_PROFILE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user