- if (((diff&TTAF_LNMASK) && !(a->f&TTAF_LNMASK) && !t->cap.rmul) ||
- ((diff&TTAF_WTMASK) && !(a->f&TTAF_WTMASK)) ||
- ((diff&~a->f&TTAF_ITAL) && !t->cap.ritm) ||
- (diff&~a->f&TTAF_INVV))
- { PUT0(0, sgr0); diff = a->f; }
+
+ c = 0;
+#define CLEARP(mask) ((diff&(mask)) && !(a->f&(mask)))
+#define ADDCOST(cap_) do { \
+ if (t->cap.cap_) c += t->cap.cap_##_cost; \
+ else f |= f_clrall; \
+} while (0)
+ if (CLEARP(TTAF_LNMASK)) ADDCOST(rmul);
+ if (CLEARP(TTAF_WTMASK)) f |= f_clrall;
+ if (diff&~a->f&TTAF_INVV) f |= f_clrall;
+ if (diff&~a->f&TTAF_ITAL) ADDCOST(ritm);
+ if (CLEARP(TTAF_FGSPCMASK) || CLEARP(TTAF_BGSPCMASK)) ADDCOST(op);
+#undef CLEARP
+#undef ADDCOST
+
+ z = 0;
+ switch ((a->f&TTAF_LNMASK) >> TTAF_LNSHIFT) {
+ case TTLN_ULINE: z += t->cap.smul_cost; break;
+ }
+ switch ((a->f&TTAF_WTMASK) >> TTAF_WTSHIFT) {
+ case TTWT_BOLD: z += t->cap.bold_cost; break;
+ case TTWT_DIM: z += t->cap.dim_cost; break;
+ }
+ if (a->f&TTAF_INVV) z += t->cap.rev_cost;
+ if (a->f&TTAF_ITAL) z += t->cap.sitm_cost;
+ if (a->f&TTAF_FGSPCMASK) z += t->cap.setaf_cost;
+ if (a->f&TTAF_BGSPCMASK) z += t->cap.setab_cost;
+
+ if ((t->cap.sgr0 && z + t->cap.sgr0_cost < c) || (f&f_clrall))
+ { PUT0(0, sgr0); diff = a->f; t->tty.st.attr.fg = t->tty.st.attr.bg; }