📄 fontfile.cc
字号:
if (nOps != 11) { error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps); } eexecDumpNum(op[0], fp[0]); eexecDumpNum(op[1], fp[1]); eexecDumpNum(op[2], fp[2]); eexecDumpNum(op[3], fp[3]); eexecDumpNum(op[4], fp[4]); eexecDumpNum(op[5], fp[5]); eexecDumpOp1(8); eexecDumpNum(op[6], fp[6]); eexecDumpNum(op[7], fp[7]); eexecDumpNum(op[8], fp[8]); eexecDumpNum(op[9], fp[9]); dx = op[0] + op[2] + op[4] + op[6] + op[8]; dy = op[1] + op[3] + op[5] + op[7] + op[9]; if (fabs(dx) > fabs(dy)) { eexecDumpNum(op[10], fp[10]); eexecDumpNum(-dy, fp[1] | fp[3] | fp[5] | fp[7] | fp[9]); } else { eexecDumpNum(-dx, fp[0] | fp[2] | fp[4] | fp[6] | fp[8]); eexecDumpNum(op[10], fp[10]); } eexecDumpOp1(8); break; case 3: // and case 4: // or case 5: // not case 8: // store case 9: // abs case 10: // add case 11: // sub case 12: // div case 13: // load case 14: // neg case 15: // eq case 18: // drop case 20: // put case 21: // get case 22: // ifelse case 23: // random case 24: // mul case 26: // sqrt case 27: // dup case 28: // exch case 29: // index case 30: // roll error(-1, "Unimplemented Type 2 charstring op: 12.%d", s[i+1]); break; default: error(-1, "Illegal Type 2 charstring op: 12.%d", s[i+1]); break; } i += 2; nOps = 0; } else if (s[i] == 19) { // hintmask // ignored if (first) { cvtGlyphWidth(nOps == 1); first = gFalse; } if (nOps > 0) { if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm", nOps); } nHints += nOps / 2; } i += 1 + ((nHints + 7) >> 3); nOps = 0; } else if (s[i] == 20) { // cntrmask // ignored if (first) { cvtGlyphWidth(nOps == 1); first = gFalse; } if (nOps > 0) { if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm", nOps); } nHints += nOps / 2; } i += 1 + ((nHints + 7) >> 3); nOps = 0; } else if (s[i] == 28) { x = (s[i+1] << 8) + s[i+2]; if (x & 0x8000) { x |= -1 << 15; } if (nOps < 48) { fp[nOps] = gFalse; op[nOps++] = x; } i += 3; } else if (s[i] <= 31) { switch (s[i]) { case 4: // vmoveto if (first) { cvtGlyphWidth(nOps == 2); first = gFalse; } if (nOps != 1) { error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps); } eexecDumpNum(op[0], fp[0]); eexecDumpOp1(4); break; case 5: // rlineto if (nOps < 2 || nOps % 2 != 0) { error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps); } for (k = 0; k < nOps; k += 2) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpOp1(5); } break; case 6: // hlineto if (nOps < 1) { error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps); } for (k = 0; k < nOps; ++k) { eexecDumpNum(op[k], fp[k]); eexecDumpOp1((k & 1) ? 7 : 6); } break; case 7: // vlineto if (nOps < 1) { error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps); } for (k = 0; k < nOps; ++k) { eexecDumpNum(op[k], fp[k]); eexecDumpOp1((k & 1) ? 6 : 7); } break; case 8: // rrcurveto if (nOps < 6 || nOps % 6 != 0) { error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps); } for (k = 0; k < nOps; k += 6) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(op[k+4], fp[k+4]); eexecDumpNum(op[k+5], fp[k+5]); eexecDumpOp1(8); } break; case 14: // endchar / seac if (first) { cvtGlyphWidth(nOps == 1 || nOps == 5); first = gFalse; } if (nOps == 4) { eexecDumpNum(0, 0); eexecDumpNum(op[0], fp[0]); eexecDumpNum(op[1], fp[1]); eexecDumpNum(op[2], fp[2]); eexecDumpNum(op[3], fp[3]); eexecDumpOp2(6); } else if (nOps == 0) { eexecDumpOp1(14); } else { error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps); } break; case 21: // rmoveto if (first) { cvtGlyphWidth(nOps == 3); first = gFalse; } if (nOps != 2) { error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps); } eexecDumpNum(op[0], fp[0]); eexecDumpNum(op[1], fp[1]); eexecDumpOp1(21); break; case 22: // hmoveto if (first) { cvtGlyphWidth(nOps == 2); first = gFalse; } if (nOps != 1) { error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps); } eexecDumpNum(op[0], fp[0]); eexecDumpOp1(22); break; case 24: // rcurveline if (nOps < 8 || (nOps - 2) % 6 != 0) { error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps); } for (k = 0; k < nOps - 2; k += 6) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(op[k+4], fp[k+4]); eexecDumpNum(op[k+5], fp[k+5]); eexecDumpOp1(8); } eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k]); eexecDumpOp1(5); break; case 25: // rlinecurve if (nOps < 8 || (nOps - 6) % 2 != 0) { error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps); } for (k = 0; k < nOps - 6; k += 2) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k]); eexecDumpOp1(5); } eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(op[k+4], fp[k+4]); eexecDumpNum(op[k+5], fp[k+5]); eexecDumpOp1(8); break; case 26: // vvcurveto if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps); } if (nOps % 2 == 1) { eexecDumpNum(op[0], fp[0]); eexecDumpNum(op[1], fp[1]); eexecDumpNum(op[2], fp[2]); eexecDumpNum(op[3], fp[3]); eexecDumpNum(0, gFalse); eexecDumpNum(op[4], fp[4]); eexecDumpOp1(8); k = 5; } else { k = 0; } for (; k < nOps; k += 4) { eexecDumpNum(0, gFalse); eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(0, gFalse); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpOp1(8); } break; case 27: // hhcurveto if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps); } if (nOps % 2 == 1) { eexecDumpNum(op[1], fp[1]); eexecDumpNum(op[0], fp[0]); eexecDumpNum(op[2], fp[2]); eexecDumpNum(op[3], fp[3]); eexecDumpNum(op[4], fp[4]); eexecDumpNum(0, gFalse); eexecDumpOp1(8); k = 5; } else { k = 0; } for (; k < nOps; k += 4) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(0, gFalse); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(0, gFalse); eexecDumpOp1(8); } break; case 30: // vhcurveto if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps); } for (k = 0; k < nOps && k != nOps-5; k += 4) { if (k % 8 == 0) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpOp1(30); } else { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpOp1(31); } } if (k == nOps-5) { if (k % 8 == 0) { eexecDumpNum(0, gFalse); eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(op[k+4], fp[k+4]); } else { eexecDumpNum(op[k], fp[k]); eexecDumpNum(0, gFalse); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+4], fp[k+4]); eexecDumpNum(op[k+3], fp[k+3]); } eexecDumpOp1(8); } break; case 31: // hvcurveto if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps); } for (k = 0; k < nOps && k != nOps-5; k += 4) { if (k % 8 == 0) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpOp1(31); } else { eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpOp1(30); } } if (k == nOps-5) { if (k % 8 == 0) { eexecDumpNum(op[k], fp[k]); eexecDumpNum(0, gFalse); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+4], fp[k+4]); eexecDumpNum(op[k+3], fp[k+3]); } else { eexecDumpNum(0, gFalse); eexecDumpNum(op[k], fp[k]); eexecDumpNum(op[k+1], fp[k+1]); eexecDumpNum(op[k+2], fp[k+2]); eexecDumpNum(op[k+3], fp[k+3]); eexecDumpNum(op[k+4], fp[k+4]); } eexecDumpOp1(8); } break; case 1: // hstem if (first) { cvtGlyphWidth(nOps & 1); first = gFalse; } if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps); } d = 0; dFP = gFalse; for (k = 0; k < nOps; k += 2) { if (op[k+1] < 0) { d += op[k] + op[k+1]; dFP |= fp[k] | fp[k+1]; eexecDumpNum(d, dFP); eexecDumpNum(-op[k+1], fp[k+1]); } else { d += op[k]; dFP |= fp[k]; eexecDumpNum(d, dFP); eexecDumpNum(op[k+1], fp[k+1]); d += op[k+1]; dFP |= fp[k+1]; } eexecDumpOp1(1); } nHints += nOps / 2; break; case 3: // vstem if (first) { cvtGlyphWidth(nOps & 1); first = gFalse; } if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps); } d = 0; dFP = gFalse; for (k = 0; k < nOps; k += 2) { if (op[k+1] < 0) { d += op[k] + op[k+1]; dFP |= fp[k] | fp[k+1]; eexecDumpNum(d, dFP); eexecDumpNum(-op[k+1], fp[k+1]); } else { d += op[k]; dFP |= fp[k]; eexecDumpNum(d, dFP); eexecDumpNum(op[k+1], fp[k+1]); d += op[k+1]; dFP |= fp[k+1]; } eexecDumpOp1(3); } nHints += nOps / 2; break; case 18: // hstemhm // ignored if (first) { cvtGlyphWidth(nOps & 1); first = gFalse; } if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps); } nHints += nOps / 2; break; case 23: // vstemhm // ignored if (first) { cvtGlyphWidth(nOps & 1); first = gFalse; } if (nOps & 1) { error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps); } nHints += nOps / 2; break; case 10: // callsubr case 11: // return case 16: // blend case 29: // callgsubr error(-1, "Unimplemented Type 2 charstring op: %d", s[i]); break; default: error(-1, "Illegal Type 2 charstring op: %d", s[i]); break; } ++i; nOps = 0; } else if (s[i] <= 246) { if (nOps < 48) { fp[nOps] = gFalse; op[nOps++] = (int)s[i] - 139; } ++i; } else if (s[i] <= 250) { if (nOps < 48) { fp[nOps] = gFalse; op[nOps++] = (((int)s[i] - 247) << 8) + (int)s[i+1] + 108; } i += 2; } else if (s[i] <= 254) { if (nOps < 48) { fp[nOps] = gFalse; op[nOps++] = -(((int)s[i] - 251) << 8) - (int)s[i+1] - 108; } i += 2; } else { x = (s[i+1] << 24) | (s[i+2] << 16) | (s[i+3] << 8) | s[i+4]; if (x & 0x80000000) x |= -1 << 31; if (nOps < 48) { fp[nOps] = gTrue; op[nOps++] = (double)x / 65536.0; } i += 5; } } // charstring encryption r2 = 4330; for (i = 0; i < charBuf->getLength(); ++i) { byte = charBuf->getChar(i) ^ (r2 >> 8); charBuf->setChar(i, byte); r2 = (byte + r2) * 52845 + 22719; }}void Type1CFontFile::cvtGlyphWidth(GBool useOp) { double w; GBool wFP; int i; if (useOp) { w = nominalWidthX + op[0]; wFP = nominalWidthXFP | fp[0]; for (i = 1; i < nOps; ++i) { op[i-1] = op[i]; fp[i-1] = fp[i]; } --nOps; } else { w = defaultWidthX; wFP = defaultWidthXFP; } eexecDumpNum(0, gFalse); eexecDumpNum(w, wFP); eexecDumpOp1(13);}void Type1CFontFile::eexecDumpNum(double x, GBool fpA) { Guchar buf[12];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -