|
|
|
@ -64,27 +64,61 @@ impl From<&DynamicText> for XMLElement {
|
|
|
|
// let graphene_count = txt.text.graphemes(true).count();
|
|
|
|
// let graphene_count = txt.text.graphemes(true).count();
|
|
|
|
let mut cjk_char_count = 0;
|
|
|
|
let mut cjk_char_count = 0;
|
|
|
|
let mut graphene_count = 0;
|
|
|
|
let mut graphene_count = 0;
|
|
|
|
for grapheme in txt.text.graphemes(true) {
|
|
|
|
// for grapheme in txt.text.graphemes(true) {
|
|
|
|
graphene_count += 1;
|
|
|
|
// graphene_count += 1;
|
|
|
|
if grapheme.chars().any(|c| {
|
|
|
|
// if grapheme.chars().any(|c| {
|
|
|
|
// 检查是否为中文字符(包括中日韩统一表意文字)
|
|
|
|
// // 检查是否为中文字符(包括中日韩统一表意文字)
|
|
|
|
(c >= '\u{4E00}' && c <= '\u{9FFF}') || // CJK统一表意文字
|
|
|
|
// (c >= '\u{4E00}' && c <= '\u{9FFF}') || // CJK统一表意文字
|
|
|
|
(c >= '\u{3400}' && c <= '\u{4DBF}') || // CJK扩展A
|
|
|
|
// (c >= '\u{3400}' && c <= '\u{4DBF}') || // CJK扩展A
|
|
|
|
(c >= '\u{20000}' && c <= '\u{2A6DF}') || // CJK扩展B
|
|
|
|
// (c >= '\u{20000}' && c <= '\u{2A6DF}') || // CJK扩展B
|
|
|
|
(c >= '\u{2A700}' && c <= '\u{2B73F}') || // CJK扩展C
|
|
|
|
// (c >= '\u{2A700}' && c <= '\u{2B73F}') || // CJK扩展C
|
|
|
|
(c >= '\u{2B740}' && c <= '\u{2B81F}') || // CJK扩展D
|
|
|
|
// (c >= '\u{2B740}' && c <= '\u{2B81F}') || // CJK扩展D
|
|
|
|
(c >= '\u{2B820}' && c <= '\u{2CEAF}') || // CJK扩展E
|
|
|
|
// (c >= '\u{2B820}' && c <= '\u{2CEAF}') || // CJK扩展E
|
|
|
|
(c >= '\u{F900}' && c <= '\u{FAFF}') || // CJK兼容表意文字
|
|
|
|
// (c >= '\u{F900}' && c <= '\u{FAFF}') || // CJK兼容表意文字
|
|
|
|
(c >= '\u{2F800}' && c <= '\u{2FA1F}') // CJK兼容表意文字补充
|
|
|
|
// (c >= '\u{2F800}' && c <= '\u{2FA1F}') // CJK兼容表意文字补充
|
|
|
|
}) {
|
|
|
|
// }) {
|
|
|
|
cjk_char_count += 1;
|
|
|
|
// cjk_char_count += 1;
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
let txt_width = if txt.reference_rectangle_width > 2.0 {
|
|
|
|
let txt_width = if txt.reference_rectangle_width > 2.0 {
|
|
|
|
txt.reference_rectangle_width
|
|
|
|
txt.reference_rectangle_width
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
(graphene_count as f64) * pt_size * 0.75
|
|
|
|
// 不同的字母,宽度与高度的比例并不相同,0.75只是一个平均值
|
|
|
|
|
|
|
|
// (graphene_count as f64) * pt_size * 0.75
|
|
|
|
|
|
|
|
// 根据字符类型计算宽度,考虑不同字符的宽高比例
|
|
|
|
|
|
|
|
let mut total_width = 0.0;
|
|
|
|
|
|
|
|
for grapheme in txt.text.graphemes(true) {
|
|
|
|
|
|
|
|
let char_width = if grapheme.chars().any(|c| {
|
|
|
|
|
|
|
|
// 检查是否为中文字符(包括中日韩统一表意文字)
|
|
|
|
|
|
|
|
(c >= '\u{4E00}' && c <= '\u{9FFF}') || // CJK统一表意文字
|
|
|
|
|
|
|
|
(c >= '\u{3400}' && c <= '\u{4DBF}') || // CJK扩展A
|
|
|
|
|
|
|
|
(c >= '\u{20000}' && c <= '\u{2A6DF}') || // CJK扩展B
|
|
|
|
|
|
|
|
(c >= '\u{2A700}' && c <= '\u{2B73F}') || // CJK扩展C
|
|
|
|
|
|
|
|
(c >= '\u{2B740}' && c <= '\u{2B81F}') || // CJK扩展D
|
|
|
|
|
|
|
|
(c >= '\u{2B820}' && c <= '\u{2CEAF}') || // CJK扩展E
|
|
|
|
|
|
|
|
(c >= '\u{F900}' && c <= '\u{FAFF}') || // CJK兼容表意文字
|
|
|
|
|
|
|
|
(c >= '\u{2F800}' && c <= '\u{2FA1F}') // CJK兼容表意文字补充
|
|
|
|
|
|
|
|
}) {
|
|
|
|
|
|
|
|
// 中文字符:宽高比 1:1
|
|
|
|
|
|
|
|
cjk_char_count += 1;
|
|
|
|
|
|
|
|
pt_size * 1.5
|
|
|
|
|
|
|
|
} else if grapheme.chars().any(|c| matches!(c, 'i' | 'l' | 'I' | ',' | ';' | ':' | '!')) {
|
|
|
|
|
|
|
|
pt_size * 0.3
|
|
|
|
|
|
|
|
} else if grapheme.chars().any(|c| matches!(c, 'W' | 'M' | '@' )) {
|
|
|
|
|
|
|
|
pt_size * 1.0
|
|
|
|
|
|
|
|
} else if grapheme.chars().any(|c| matches!(c, 'w' |'m' | '%' )) {
|
|
|
|
|
|
|
|
pt_size * 0.9
|
|
|
|
|
|
|
|
}else if grapheme.chars().any(|c| matches!(c, 'f' |'j' | 't' | 'r' | 'J' | 'T' | 'F' | '/' | '\\' | 's' | 'z' )) {
|
|
|
|
|
|
|
|
// 其他标点符号:宽高比约 0.4:1
|
|
|
|
|
|
|
|
pt_size * 0.5
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 中等宽度字母(默认):宽高比约 0.6:1
|
|
|
|
|
|
|
|
pt_size * 0.7
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
total_width += char_width;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
total_width
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// let x_pos = {
|
|
|
|
// let x_pos = {
|
|
|
|
@ -132,16 +166,16 @@ impl From<&DynamicText> for XMLElement {
|
|
|
|
let cjk_offset:f64 = (cjk_char_count as f64) * pt_size * 0.75;
|
|
|
|
let cjk_offset:f64 = (cjk_char_count as f64) * pt_size * 0.75;
|
|
|
|
|
|
|
|
|
|
|
|
// 左对齐是不需要中文偏移的,居中对齐需要偏移,右对齐要偏移
|
|
|
|
// 左对齐是不需要中文偏移的,居中对齐需要偏移,右对齐要偏移
|
|
|
|
let base_x = left_x + 0.5 - (pt_size / 8.0) - 4.05
|
|
|
|
let base_x = left_x + 0.5 - (pt_size / 8.0) - 4.05;
|
|
|
|
- match txt.h_alignment {
|
|
|
|
// - match txt.h_alignment {
|
|
|
|
HAlignment::Left => 0.0,
|
|
|
|
// HAlignment::Left => 0.0,
|
|
|
|
HAlignment::Center => cjk_offset / 2.0,
|
|
|
|
// HAlignment::Center => cjk_offset / 2.0,
|
|
|
|
HAlignment::Right => cjk_offset,
|
|
|
|
// HAlignment::Right => cjk_offset,
|
|
|
|
};
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
let base_y = top_y + 0.5 - (7.0 / 5.0 * pt_size + 26.0 / 5.0)
|
|
|
|
let base_y = top_y + 0.5 - (7.0 / 5.0 * pt_size + 26.0 / 5.0)
|
|
|
|
+ match txt.v_alignment {
|
|
|
|
+ match txt.v_alignment {
|
|
|
|
VAlignment::Top => pt_size / 2.0,
|
|
|
|
VAlignment::Top => pt_size * 1.5,
|
|
|
|
VAlignment::Center => pt_size,
|
|
|
|
VAlignment::Center => pt_size,
|
|
|
|
VAlignment::Bottom => pt_size / 2.0,
|
|
|
|
VAlignment::Bottom => pt_size / 2.0,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|