From eedcd5cb740b1eeb31ff37e5377192b7d327952a Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Thu, 3 Nov 2011 21:22:02 +0100 Subject: [PATCH] Factor out common code of bci_action_stem*. --- src/tabytecode.h | 3 +- src/tafpgm.c | 403 +++++++++++++++---------------------------------------- 2 files changed, 110 insertions(+), 296 deletions(-) diff --git a/src/tabytecode.h b/src/tabytecode.h index 001fd0a..b347d2a 100644 --- a/src/tabytecode.h +++ b/src/tabytecode.h @@ -335,10 +335,11 @@ #define bci_ip_between_align_points bci_ip_between_align_point + 1 #define bci_action_adjust_common bci_ip_between_align_points + 1 +#define bci_action_stem_common bci_action_adjust_common + 1 /* the order of the `bci_action_*' entries must correspond */ /* to the order of the TA_Action enumeration entries */ -#define bci_action_ip_before bci_action_adjust_common + 1 +#define bci_action_ip_before bci_action_stem_common + 1 #define bci_action_ip_after bci_action_ip_before + 1 #define bci_action_ip_on bci_action_ip_after + 1 #define bci_action_ip_between bci_action_ip_on + 1 diff --git a/src/tafpgm.c b/src/tafpgm.c index d49c779..ebef9cf 100644 --- a/src/tafpgm.c +++ b/src/tafpgm.c @@ -1658,63 +1658,9 @@ unsigned char FPGM(bci_action_adjust_bound) [] = { /* - * bci_action_stem_bound - * - * Handle the STEM action to align two edges of a stem, then moving one - * edge again if necessary to stay bound. - * - * The code after computing `cur_len' to shift `edge' and `edge2' - * is equivalent to the snippet below (part of `ta_latin_hint_edges'): - * - * if cur_len < 96: - * if cur_len < = 64: - * u_off = 32 - * d_off = 32 - * else: - * u_off = 38 - * d_off = 26 + * bci_action_stem_common * - * org_pos = anchor + (edge_orig - anchor_orig); - * org_center = org_pos + org_len / 2; - * - * cur_pos1 = ROUND(org_center) - * delta1 = ABS(org_center - (cur_pos1 - u_off)) - * delta2 = ABS(org_center - (cur_pos1 + d_off)) - * if (delta1 < delta2): - * cur_pos1 = cur_pos1 - u_off - * else: - * cur_pos1 = cur_pos1 + d_off - * - * edge = cur_pos1 - cur_len / 2 - * - * else: - * org_pos = anchor + (edge_orig - anchor_orig) - * org_center = org_pos + org_len / 2; - * - * cur_pos1 = ROUND(org_pos) - * delta1 = ABS(cur_pos1 + cur_len / 2 - org_center) - * cur_pos2 = ROUND(org_pos + org_len) - cur_len - * delta2 = ABS(cur_pos2 + cur_len / 2 - org_center) - * - * if (delta1 < delta2): - * edge = cur_pos1 - * else: - * edge = cur_pos2 - * - * edge2 = edge + cur_len - * - * in: edge2_is_serif - * edge_is_round - * edge_point (in twilight zone) - * edge2_point (in twilight zone) - * edge[-1] (in twilight zone) - * ... stuff for bci_align_segments (edge) ... - * ... stuff for bci_align_segments (edge2)... - * - * sal: sal_anchor - * sal_temp1 - * sal_temp2 - * sal_temp3 + * Common code for bci_action_stem routines. */ #undef sal_u_off @@ -1726,10 +1672,10 @@ unsigned char FPGM(bci_action_adjust_bound) [] = { #undef sal_edge2 #define sal_edge2 sal_temp3 -unsigned char FPGM(bci_action_stem_bound) [] = { +unsigned char FPGM(bci_action_stem_common) [] = { PUSHB_1, - bci_action_stem_bound, + bci_action_stem_common, FDEF, PUSHB_1, @@ -1742,10 +1688,10 @@ unsigned char FPGM(bci_action_stem_bound) [] = { PUSHB_1, 4, CINDEX, - DUP, /* s: edge[-1] edge2 edge is_round is_serif edge2 edge edge */ + DUP, /* s: [...] edge2 edge is_round is_serif edge2 edge edge */ MDAP_noround, /* set rp0 and rp1 to `edge_point' (for ALIGNRP below) */ - MD_orig_ZP2_0, /* s: edge[-1] edge2 edge is_round is_serif org_len */ + MD_orig_ZP2_0, /* s: [...] edge2 edge is_round is_serif org_len */ DUP, PUSHB_1, sal_org_len, @@ -1754,7 +1700,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { PUSHB_1, bci_compute_stem_width, - CALL, /* s: edge[-1] edge2 edge cur_len */ + CALL, /* s: [...] edge2 edge cur_len */ DUP, PUSHB_1, @@ -1782,30 +1728,30 @@ unsigned char FPGM(bci_action_stem_bound) [] = { WS, WS, - SWAP, /* s: edge[-1] edge2 cur_len edge */ + SWAP, /* s: [...] edge2 cur_len edge */ DUP, PUSHB_1, sal_anchor, RS, - DUP, /* s: edge[-1] edge2 cur_len edge edge anchor anchor */ + DUP, /* s: [...] edge2 cur_len edge edge anchor anchor */ ROLL, SWAP, MD_orig_ZP2_0, SWAP, GC_cur, - ADD, /* s: edge[-1] edge2 cur_len edge org_pos */ + ADD, /* s: [...] edge2 cur_len edge org_pos */ PUSHB_1, sal_org_len, RS, PUSHB_1, 2*64, DIV, - ADD, /* s: edge[-1] edge2 cur_len edge org_center */ + ADD, /* s: [...] edge2 cur_len edge org_center */ DUP, PUSHB_1, bci_round, - CALL, /* s: edge[-1] edge2 cur_len edge org_center cur_pos1 */ + CALL, /* s: [...] edge2 cur_len edge org_center cur_pos1 */ DUP, ROLL, @@ -1824,7 +1770,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { sal_d_off, RS, SUB, - ABS, /* s: edge[-1] edge2 cur_len edge cur_pos1 delta1 delta2 */ + ABS, /* s: [...] edge2 cur_len edge cur_pos1 delta1 delta2 */ LT, /* delta1 < delta2 */ IF, @@ -1838,7 +1784,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { sal_d_off, RS, ADD, /* cur_pos1 = cur_pos1 + d_off */ - EIF, /* s: edge[-1] edge2 cur_len edge cur_pos1 */ + EIF, /* s: [...] edge2 cur_len edge cur_pos1 */ PUSHB_1, 3, @@ -1848,23 +1794,23 @@ unsigned char FPGM(bci_action_stem_bound) [] = { DIV, SUB, /* arg = cur_pos1 - cur_len/2 */ - SWAP, /* s: edge[-1] edge2 cur_len arg edge */ + SWAP, /* s: [...] edge2 cur_len arg edge */ DUP, DUP, PUSHB_1, 4, MINDEX, - SWAP, /* s: edge[-1] edge2 cur_len edge edge arg edge */ + SWAP, /* s: [...] edge2 cur_len edge edge arg edge */ GC_cur, SUB, SHPIX, /* edge = cur_pos1 - cur_len/2 */ ELSE, - SWAP, /* s: edge[-1] edge2 cur_len edge */ + SWAP, /* s: [...] edge2 cur_len edge */ PUSHB_1, sal_anchor, RS, - GC_cur, /* s: edge[-1] edge2 cur_len edge anchor_pos */ + GC_cur, /* s: [...] edge2 cur_len edge anchor_pos */ PUSHB_1, 2, CINDEX, @@ -1872,7 +1818,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { sal_anchor, RS, MD_orig_ZP2_0, - ADD, /* s: edge[-1] edge2 cur_len edge org_pos */ + ADD, /* s: [...] edge2 cur_len edge org_pos */ DUP, PUSHB_1, @@ -1881,7 +1827,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { PUSHB_1, 2*64, DIV, - ADD, /* s: edge[-1] edge2 cur_len edge org_pos org_center */ + ADD, /* s: [...] edge2 cur_len edge org_pos org_center */ SWAP, DUP, @@ -1899,7 +1845,7 @@ unsigned char FPGM(bci_action_stem_bound) [] = { PUSHB_1, 5, CINDEX, - SUB, /* s: edge[-1] edge2 cur_len edge org_center cur_pos1 cur_pos2 */ + SUB, /* s: [...] edge2 cur_len edge org_center cur_pos1 cur_pos2 */ PUSHB_1, 5, @@ -1931,18 +1877,95 @@ unsigned char FPGM(bci_action_stem_bound) [] = { ELSE, SWAP, POP, /* arg = cur_pos2 */ - EIF, /* s: edge[-1] edge2 cur_len edge arg */ + EIF, /* s: [...] edge2 cur_len edge arg */ SWAP, DUP, DUP, PUSHB_1, 4, MINDEX, - SWAP, /* s: edge[-1] edge2 cur_len edge edge arg edge */ + SWAP, /* s: [...] edge2 cur_len edge edge arg edge */ GC_cur, SUB, SHPIX, /* edge = arg */ - EIF, /* s: edge[-1] edge2 cur_len edge */ + EIF, /* s: [...] edge2 cur_len edge */ + + ENDF, + +}; + + +/* + * bci_action_stem_bound + * + * Handle the STEM action to align two edges of a stem, then moving one + * edge again if necessary to stay bound. + * + * The code after computing `cur_len' to shift `edge' and `edge2' + * is equivalent to the snippet below (part of `ta_latin_hint_edges'): + * + * if cur_len < 96: + * if cur_len < = 64: + * u_off = 32 + * d_off = 32 + * else: + * u_off = 38 + * d_off = 26 + * + * org_pos = anchor + (edge_orig - anchor_orig); + * org_center = org_pos + org_len / 2; + * + * cur_pos1 = ROUND(org_center) + * delta1 = ABS(org_center - (cur_pos1 - u_off)) + * delta2 = ABS(org_center - (cur_pos1 + d_off)) + * if (delta1 < delta2): + * cur_pos1 = cur_pos1 - u_off + * else: + * cur_pos1 = cur_pos1 + d_off + * + * edge = cur_pos1 - cur_len / 2 + * + * else: + * org_pos = anchor + (edge_orig - anchor_orig) + * org_center = org_pos + org_len / 2; + * + * cur_pos1 = ROUND(org_pos) + * delta1 = ABS(cur_pos1 + cur_len / 2 - org_center) + * cur_pos2 = ROUND(org_pos + org_len) - cur_len + * delta2 = ABS(cur_pos2 + cur_len / 2 - org_center) + * + * if (delta1 < delta2): + * edge = cur_pos1 + * else: + * edge = cur_pos2 + * + * edge2 = edge + cur_len + * + * in: edge2_is_serif + * edge_is_round + * edge_point (in twilight zone) + * edge2_point (in twilight zone) + * edge[-1] (in twilight zone) + * ... stuff for bci_align_segments (edge) ... + * ... stuff for bci_align_segments (edge2)... + * + * sal: sal_anchor + * sal_temp1 + * sal_temp2 + * sal_temp3 + * + * uses: bci_action_stem_common + */ + +unsigned char FPGM(bci_action_stem_bound) [] = { + + PUSHB_1, + bci_action_stem_bound, + FDEF, + + PUSHB_1, + bci_action_stem_common, + CALL, ROLL, /* s: edge[-1] cur_len edge edge2 */ DUP, @@ -2411,17 +2434,10 @@ unsigned char FPGM(bci_action_adjust) [] = { * sal_temp1 * sal_temp2 * sal_temp3 + * + * uses: bci_action_stem_common */ -#undef sal_u_off -#define sal_u_off sal_temp1 -#undef sal_d_off -#define sal_d_off sal_temp2 -#undef sal_org_len -#define sal_org_len sal_temp3 -#undef sal_edge2 -#define sal_edge2 sal_temp3 - unsigned char FPGM(bci_action_stem) [] = { PUSHB_1, @@ -2429,215 +2445,10 @@ unsigned char FPGM(bci_action_stem) [] = { FDEF, PUSHB_1, - 0, - SZPS, /* set zp0, zp1, and zp2 to twilight zone 0 */ - - PUSHB_1, - 4, - CINDEX, - PUSHB_1, - 4, - CINDEX, - DUP, /* s: edge2 edge is_round is_serif edge2 edge edge */ - MDAP_noround, /* set rp0 and rp1 to `edge_point' (for ALIGNRP below) */ - - MD_orig_ZP2_0, /* s: edge2 edge is_round is_serif org_len */ - DUP, - PUSHB_1, - sal_org_len, - SWAP, - WS, - - PUSHB_1, - bci_compute_stem_width, - CALL, /* s: edge2 edge cur_len */ - - DUP, - PUSHB_1, - 96, - LT, /* cur_len < 96 */ - IF, - DUP, - PUSHB_1, - 64, - LTEQ, /* cur_len <= 64 */ - IF, - PUSHB_4, - sal_u_off, - 32, - sal_d_off, - 32, - - ELSE, - PUSHB_4, - sal_u_off, - 38, - sal_d_off, - 26, - EIF, - WS, - WS, - - SWAP, /* s: edge2 cur_len edge */ - DUP, - PUSHB_1, - sal_anchor, - RS, - DUP, /* s: edge2 cur_len edge edge anchor anchor */ - ROLL, - SWAP, - MD_orig_ZP2_0, - SWAP, - GC_cur, - ADD, /* s: edge2 cur_len edge org_pos */ - PUSHB_1, - sal_org_len, - RS, - PUSHB_1, - 2*64, - DIV, - ADD, /* s: edge2 cur_len edge org_center */ - - DUP, - PUSHB_1, - bci_round, - CALL, /* s: edge2 cur_len edge org_center cur_pos1 */ - - DUP, - ROLL, - ROLL, - SUB, /* s: edge2 cur_len edge cur_pos1 (org_center - cur_pos1) */ - - DUP, - PUSHB_1, - sal_u_off, - RS, - ADD, - ABS, /* s: ... cur_len edge cur_pos1 (org_center - cur_pos1) delta1 */ - - SWAP, - PUSHB_1, - sal_d_off, - RS, - SUB, - ABS, /* s: edge2 cur_len edge cur_pos1 delta1 delta2 */ - - LT, /* delta1 < delta2 */ - IF, - PUSHB_1, - sal_u_off, - RS, - SUB, /* cur_pos1 = cur_pos1 - u_off */ - - ELSE, - PUSHB_1, - sal_d_off, - RS, - ADD, /* cur_pos1 = cur_pos1 + d_off */ - EIF, /* s: edge2 cur_len edge cur_pos1 */ - - PUSHB_1, - 3, - CINDEX, - PUSHB_1, - 2*64, - DIV, - SUB, /* arg = cur_pos1 - cur_len/2 */ - - SWAP, /* s: edge2 cur_len arg edge */ - DUP, - PUSHB_1, - 3, - MINDEX, - SWAP, /* s: edge2 cur_len edge arg edge */ - GC_cur, - SUB, - SHPIX, /* edge = cur_pos1 - cur_len/2 */ - - ELSE, - SWAP, /* s: edge2 cur_len edge */ - PUSHB_1, - sal_anchor, - RS, - GC_cur, /* s: edge2 cur_len edge anchor_pos */ - PUSHB_1, - 2, - CINDEX, - PUSHB_1, - sal_anchor, - RS, - MD_orig_ZP2_0, - ADD, /* s: edge2 cur_len edge org_pos */ - - DUP, - PUSHB_1, - sal_org_len, - RS, - PUSHB_1, - 2*64, - DIV, - ADD, /* s: edge2 cur_len edge org_pos org_center */ - - SWAP, - DUP, - PUSHB_1, - bci_round, - CALL, /* cur_pos1 = ROUND(org_pos) */ - SWAP, - PUSHB_1, - sal_org_len, - RS, - ADD, - PUSHB_1, - bci_round, - CALL, - PUSHB_1, - 5, - CINDEX, - SUB, /* s: edge2 cur_len edge org_center cur_pos1 cur_pos2 */ - - PUSHB_1, - 5, - CINDEX, - PUSHB_1, - 2*64, - DIV, - PUSHB_1, - 4, - MINDEX, - SUB, /* s: ... cur_len edge cur_pos1 cur_pos2 (cur_len/2 - org_center) */ - - DUP, - PUSHB_1, - 4, - CINDEX, - ADD, - ABS, /* delta1 = ABS(cur_pos1 + cur_len / 2 - org_center) */ - SWAP, - PUSHB_1, - 3, - CINDEX, - ADD, - ABS, /* s: edge2 cur_len edge cur_pos1 cur_pos2 delta1 delta2 */ - LT, /* delta1 < delta2 */ - IF, - POP, /* arg = cur_pos1 */ - - ELSE, - SWAP, - POP, /* arg = cur_pos2 */ - EIF, /* s: edge2 cur_len edge arg */ - SWAP, - DUP, - PUSHB_1, - 3, - MINDEX, - SWAP, /* s: edge2 cur_len edge arg edge */ - GC_cur, - SUB, - SHPIX, /* edge = arg */ - EIF, /* s: edge2 cur_len */ + bci_action_stem_common, + CALL, + POP, SWAP, /* s: cur_len edge2 */ DUP, DUP, @@ -4130,6 +3941,7 @@ TA_table_build_fpgm(FT_Byte** fpgm, + sizeof (FPGM(bci_ip_between_align_points)) + sizeof (FPGM(bci_action_adjust_common)) + + sizeof (FPGM(bci_action_stem_common)) + sizeof (FPGM(bci_action_ip_before)) + sizeof (FPGM(bci_action_ip_after)) @@ -4206,6 +4018,7 @@ TA_table_build_fpgm(FT_Byte** fpgm, COPY_FPGM(bci_ip_between_align_points); COPY_FPGM(bci_action_adjust_common); + COPY_FPGM(bci_action_stem_common); COPY_FPGM(bci_action_ip_before); COPY_FPGM(bci_action_ip_after); -- 2.11.4.GIT