⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fofitype1c.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
    }    if (j < 256) {      buf = GString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n",			    j);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    (*outputFunc)(outputStream, "readonly def\n", 13);    (*outputFunc)(outputStream, "currentdict end\n", 16);    // start the binary section    (*outputFunc)(outputStream, "currentfile eexec\n", 18);    eb.outputFunc = outputFunc;    eb.outputStream = outputStream;    eb.ascii = gTrue;    eb.r1 = 55665;    eb.line = 0;    // start the private dictionary    eexecWrite(&eb, "\x83\xca\x73\xd5");    eexecWrite(&eb, "dup /Private 32 dict dup begin\n");    eexecWrite(&eb, "/RD {string currentfile exch readstring pop}"	       " executeonly def\n");    eexecWrite(&eb, "/ND {noaccess def} executeonly def\n");    eexecWrite(&eb, "/NP {noaccess put} executeonly def\n");    eexecWrite(&eb, "/MinFeature {16 16} def\n");    eexecWrite(&eb, "/password 5839 def\n");    if (privateDicts[fd].nBlueValues) {      eexecWrite(&eb, "/BlueValues [");      for (k = 0; k < privateDicts[fd].nBlueValues; ++k) {	buf = GString::format("{0:s}{1:d}",			      k > 0 ? " " : "",			      privateDicts[fd].blueValues[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].nOtherBlues) {      eexecWrite(&eb, "/OtherBlues [");      for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) {	buf = GString::format("{0:s}{1:d}",			      k > 0 ? " " : "",			      privateDicts[fd].otherBlues[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].nFamilyBlues) {      eexecWrite(&eb, "/FamilyBlues [");      for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) {	buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "",			      privateDicts[fd].familyBlues[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].nFamilyOtherBlues) {      eexecWrite(&eb, "/FamilyOtherBlues [");      for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) {	buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "",			      privateDicts[fd].familyOtherBlues[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].blueScale != 0.039625) {      buf = GString::format("/BlueScale {0:.4g} def\n",			    privateDicts[fd].blueScale);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].blueShift != 7) {      buf = GString::format("/BlueShift {0:d} def\n",			    privateDicts[fd].blueShift);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].blueFuzz != 1) {      buf = GString::format("/BlueFuzz {0:d} def\n",			    privateDicts[fd].blueFuzz);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].hasStdHW) {      buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].hasStdVW) {      buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].nStemSnapH) {      eexecWrite(&eb, "/StemSnapH [");      for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) {	buf = GString::format("{0:s}{1:.4g}",			      k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].nStemSnapV) {      eexecWrite(&eb, "/StemSnapV [");      for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) {	buf = GString::format("{0:s}{1:.4g}",			      k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]);	eexecWrite(&eb, buf->getCString());	delete buf;      }      eexecWrite(&eb, "] def\n");    }    if (privateDicts[fd].hasForceBold) {      buf = GString::format("/ForceBold {0:s} def\n",			    privateDicts[fd].forceBold ? "true" : "false");      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].forceBoldThreshold != 0) {      buf = GString::format("/ForceBoldThreshold {0:.4g} def\n",			    privateDicts[fd].forceBoldThreshold);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].languageGroup != 0) {      buf = GString::format("/LanguageGroup {0:d} def\n",			    privateDicts[fd].languageGroup);      eexecWrite(&eb, buf->getCString());      delete buf;    }    if (privateDicts[fd].expansionFactor != 0.06) {      buf = GString::format("/ExpansionFactor {0:.4g} def\n",			    privateDicts[fd].expansionFactor);      eexecWrite(&eb, buf->getCString());      delete buf;    }    // set up the subroutines    ok = gTrue;    getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok);    if (!ok) {      subrIdx.pos = -1;    }    // start the CharStrings    eexecWrite(&eb, "2 index /CharStrings 256 dict dup begin\n");    // write the .notdef CharString    ok = gTrue;    getIndexVal(&charStringsIdx, 0, &val, &ok);    if (ok) {      eexecCvtGlyph(&eb, ".notdef", val.pos, val.len,		    &subrIdx, &privateDicts[fd]);    }    // write the CharStrings    for (j = 0; j < 256 && i+j < nCIDs; ++j) {      if (cidMap[i+j] >= 0) {	ok = gTrue;	getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok);	if (ok) {	  buf = GString::format("c{0:02x}", j);	  eexecCvtGlyph(&eb, buf->getCString(), val.pos, val.len,			&subrIdx, &privateDicts[fd]);	  delete buf;	}      }    }    eexecWrite(&eb, "end\n");    eexecWrite(&eb, "end\n");    eexecWrite(&eb, "readonly put\n");    eexecWrite(&eb, "noaccess put\n");    eexecWrite(&eb, "dup /FontName get exch definefont pop\n");    eexecWrite(&eb, "mark currentfile closefile\n");    // trailer    if (eb.line > 0) {      (*outputFunc)(outputStream, "\n", 1);    }    for (j = 0; j < 8; ++j) {      (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);    }    (*outputFunc)(outputStream, "cleartomark\n", 12);  }  // write the Type 0 parent font  (*outputFunc)(outputStream, "16 dict begin\n", 14);  (*outputFunc)(outputStream, "/FontName /", 11);  (*outputFunc)(outputStream, psName, strlen(psName));  (*outputFunc)(outputStream, " def\n", 5);  (*outputFunc)(outputStream, "/FontType 0 def\n", 16);  if (topDict.hasFontMatrix) {    buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",			  topDict.fontMatrix[0], topDict.fontMatrix[1],			  topDict.fontMatrix[2], topDict.fontMatrix[3],			  topDict.fontMatrix[4], topDict.fontMatrix[5]);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;  } else {    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);  }  (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);  (*outputFunc)(outputStream, "/Encoding [\n", 12);  for (i = 0; i < nCIDs; i += 256) {    buf = GString::format("{0:d}\n", i >> 8);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;  }  (*outputFunc)(outputStream, "] def\n", 6);  (*outputFunc)(outputStream, "/FDepVector [\n", 14);  for (i = 0; i < nCIDs; i += 256) {    (*outputFunc)(outputStream, "/", 1);    (*outputFunc)(outputStream, psName, strlen(psName));    buf = GString::format("_{0:02x} findfont\n", i >> 8);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;  }  (*outputFunc)(outputStream, "] def\n", 6);  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);  gfree(cidMap);}void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName,			       int offset, int nBytes,			       Type1CIndex *subrIdx,			       Type1CPrivateDict *pDict) {  GString *buf;  GString *charBuf;  // generate the charstring  charBuf = new GString();  cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue);  buf = GString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength());  eexecWrite(eb, buf->getCString());  delete buf;  eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(),		       charBuf->getLength());  eexecWrite(eb, " ND\n");  delete charBuf;}void FoFiType1C::cvtGlyph(int offset, int nBytes, GString *charBuf,			  Type1CIndex *subrIdx, Type1CPrivateDict *pDict,			  GBool top) {  Type1CIndexVal val;  GBool ok, dFP;  double d, dx, dy;  Gushort r2;  Guchar byte;  int pos, subrBias, start, i, k;  start = charBuf->getLength();  if (top) {    charBuf->append((char)73);    charBuf->append((char)58);    charBuf->append((char)147);    charBuf->append((char)134);    nOps = 0;    nHints = 0;    firstOp = gTrue;    openPath = gFalse;  }  pos = offset;  while (pos < offset + nBytes) {    ok = gTrue;    pos = getOp(pos, gTrue, &ok);    if (!ok) {      break;    }    if (!ops[nOps - 1].isNum) {      --nOps; // drop the operator      switch (ops[nOps].op) {      case 0x0001:		// hstem	if (firstOp) {	  cvtGlyphWidth(nOps & 1, charBuf, pDict);	  firstOp = 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) {	  // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints	  if (ops[k+1].num < 0) {	    d += ops[k].num + ops[k+1].num;	    dFP |= ops[k].isFP | ops[k+1].isFP;	    cvtNum(d, dFP, charBuf);	    cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);	  } else {	    d += ops[k].num;	    dFP |= ops[k].isFP;	    cvtNum(d, dFP, charBuf);	    cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);	    d += ops[k+1].num;	    dFP |= ops[k+1].isFP;	  }	  charBuf->append((char)1);	}	nHints += nOps / 2;	nOps = 0;	break;      case 0x0003:		// vstem	if (firstOp) {	  cvtGlyphWidth(nOps & 1, charBuf, pDict);	  firstOp = 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) {	  // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints	  if (ops[k+1].num < 0) {	    d += ops[k].num + ops[k+1].num;	    dFP |= ops[k].isFP | ops[k+1].isFP;	    cvtNum(d, dFP, charBuf);	    cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);	  } else {	    d += ops[k].num;	    dFP |= ops[k].isFP;	    cvtNum(d, dFP, charBuf);	    cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);	    d += ops[k+1].num;	    dFP |= ops[k+1].isFP;	  }	  charBuf->append((char)3);	}	nHints += nOps / 2;	nOps = 0;	break;      case 0x0004:		// vmoveto	if (firstOp) {	  cvtGlyphWidth(nOps == 2, charBuf, pDict);	  firstOp = gFalse;	}	if (openPath) {	  charBuf->append((char)9);	  openPath = gFalse;	}	if (nOps != 1) {	  //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps);	}	cvtNum(ops[0].num, ops[0].isFP, charBuf);	charBuf->append((char)4);	nOps = 0;	break;      case 0x0005:		// 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) {	  cvtNum(ops[k].num, ops[k].isFP, charBuf);	  cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);	  charBuf->append((char)5);	}	nOps = 0;	openPath = gTrue;	break;      case 0x0006:		// hlineto	if (nOps < 1) {	  //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps);	}	for (k = 0; k < nOps; ++k) {	  cvtNum(ops[k].num, ops[k].isFP, charBuf);	  charBuf->append((char)((k & 1) ? 7 : 6));	}	nOps = 0;	openPath = gTrue;	break;      case 0x0007:		// vlineto	if (nOps < 1) {	  //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps);	}	for (k = 0; k < nOps; ++k) {	  cvtNum(ops[k].num, ops[k].isFP, charBuf);	  charBuf->append((char)((k & 1) ? 6 : 7));	}	nOps = 0;	openPath = gTrue;	break;      case 0x0008:		// 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) {	  cvtNum(ops[k].num, ops[k].isFP, charBuf);	  cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);	  cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);	  cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);	  cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);	  cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);	  charBuf->append((char)8);	}	nOps = 0;	openPath = gTrue;	break;      case 0x000a:		// callsubr	if (nOps >= 1) {	  subrBias = (subrIdx->len < 1240)	               ? 107 : (subrIdx->len < 33900) ? 1131 : 32768;	  k = subrBias + (int)ops[nOps - 1].num;	  --nOps;	  ok = gTrue;	  getIndexVal(subrIdx, k, &val, &ok);	  if (ok) {	    cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse);	  }	} else {	  //~ error(-1, "Too few args to Type 2 callsubr");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -