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

📄 fofitype1c.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
  // trailer  if (ascii && eb.line > 0) {    (*outputFunc)(outputStream, "\n", 1);  }  for (i = 0; i < 8; ++i) {    (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);  }  (*outputFunc)(outputStream, "cleartomark\n", 12);}void FoFiType1C::convertToCIDType0(char *psName,				   FoFiOutputFunc outputFunc,				   void *outputStream) {  int *cidMap;  GString *charStrings;  int *charStringOffsets;  Type1CIndex subrIdx;  Type1CIndexVal val;  int nCIDs, gdBytes;  GString *buf;  char buf2[256];  GBool ok;  int gid, offset, n, i, j, k;  // compute the CID count and build the CID-to-GID mapping  nCIDs = 0;  for (i = 0; i < nGlyphs; ++i) {    if (charset[i] >= nCIDs) {      nCIDs = charset[i] + 1;    }  }  cidMap = (int *)gmallocn(nCIDs, sizeof(int));  for (i = 0; i < nCIDs; ++i) {    cidMap[i] = -1;  }  for (i = 0; i < nGlyphs; ++i) {    cidMap[charset[i]] = i;  }  // build the charstrings  charStrings = new GString();  charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int));  for (i = 0; i < nCIDs; ++i) {    charStringOffsets[i] = charStrings->getLength();    if ((gid = cidMap[i]) >= 0) {      ok = gTrue;      getIndexVal(&charStringsIdx, gid, &val, &ok);      if (ok) {	getIndex(privateDicts[fdSelect[gid]].subrsOffset, &subrIdx, &ok);	if (!ok) {	  subrIdx.pos = -1;	}	cvtGlyph(val.pos, val.len, charStrings,		 &subrIdx, &privateDicts[fdSelect[gid]], gTrue);      }    }  }  charStringOffsets[nCIDs] = charStrings->getLength();  // compute gdBytes = number of bytes needed for charstring offsets  // (offset size needs to account for the charstring offset table,  // with a worst case of five bytes per entry, plus the charstrings  // themselves)  i = (nCIDs + 1) * 5 + charStrings->getLength();  if (i < 0x100) {    gdBytes = 1;  } else if (i < 0x10000) {    gdBytes = 2;  } else if (i < 0x1000000) {    gdBytes = 3;  } else {    gdBytes = 4;  }  // begin the font dictionary  (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37);  (*outputFunc)(outputStream, "20 dict begin\n", 14);  (*outputFunc)(outputStream, "/CIDFontName /", 14);  (*outputFunc)(outputStream, psName, strlen(psName));  (*outputFunc)(outputStream, " def\n", 5);  (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19);  (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);  if (topDict.registrySID > 0 && topDict.orderingSID > 0) {    ok = gTrue;    getString(topDict.registrySID, buf2, &ok);    if (ok) {      (*outputFunc)(outputStream, "  /Registry (", 13);      (*outputFunc)(outputStream, buf2, strlen(buf2));      (*outputFunc)(outputStream, ") def\n", 6);    }    ok = gTrue;    getString(topDict.orderingSID, buf2, &ok);    if (ok) {      (*outputFunc)(outputStream, "  /Ordering (", 13);      (*outputFunc)(outputStream, buf2, strlen(buf2));      (*outputFunc)(outputStream, ") def\n", 6);    }  } else {    (*outputFunc)(outputStream, "  /Registry (Adobe) def\n", 24);    (*outputFunc)(outputStream, "  /Ordering (Identity) def\n", 27);  }  buf = GString::format("  /Supplement {0:d} def\n", topDict.supplement);  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  (*outputFunc)(outputStream, "end def\n", 8);  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 if (privateDicts[0].hasFontMatrix) {    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);  } else {    (*outputFunc)(outputStream,		  "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38);  }  buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n",			topDict.fontBBox[0], topDict.fontBBox[1],			topDict.fontBBox[2], topDict.fontBBox[3]);  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27);  (*outputFunc)(outputStream, "  /FSType 8 def\n", 16);  (*outputFunc)(outputStream, "end def\n", 8);  // CIDFont-specific entries  buf = GString::format("/CIDCount {0:d} def\n", nCIDs);  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15);  buf = GString::format("/GDBytes {0:d} def\n", gdBytes);  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20);  if (topDict.paintType != 0) {    buf = GString::format("/PaintType {0:d} def\n", topDict.paintType);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;  }  // FDArray entry  buf = GString::format("/FDArray {0:d} array\n", nFDs);  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  for (i = 0; i < nFDs; ++i) {    buf = GString::format("dup {0:d} 10 dict begin\n", i);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);    if (privateDicts[i].hasFontMatrix) {      buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",			    privateDicts[i].fontMatrix[0],			    privateDicts[i].fontMatrix[1],			    privateDicts[i].fontMatrix[2],			    privateDicts[i].fontMatrix[3],			    privateDicts[i].fontMatrix[4],			    privateDicts[i].fontMatrix[5]);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    } else {      (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);    }    buf = GString::format("/PaintType {0:d} def\n", topDict.paintType);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23);    if (privateDicts[i].nBlueValues) {      (*outputFunc)(outputStream, "/BlueValues [", 13);      for (j = 0; j < privateDicts[i].nBlueValues; ++j) {	buf = GString::format("{0:s}{1:d}",			      j > 0 ? " " : "", privateDicts[i].blueValues[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].nOtherBlues) {      (*outputFunc)(outputStream, "/OtherBlues [", 13);      for (j = 0; j < privateDicts[i].nOtherBlues; ++j) {	buf = GString::format("{0:s}{1:d}",			      j > 0 ? " " : "", privateDicts[i].otherBlues[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].nFamilyBlues) {      (*outputFunc)(outputStream, "/FamilyBlues [", 14);      for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) {	buf = GString::format("{0:s}{1:d}",			      j > 0 ? " " : "",			      privateDicts[i].familyBlues[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].nFamilyOtherBlues) {      (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19);      for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) {	buf = GString::format("{0:s}{1:d}", j > 0 ? " " : "",			      privateDicts[i].familyOtherBlues[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].blueScale != 0.039625) {      buf = GString::format("/BlueScale {0:.4g} def\n",			    privateDicts[i].blueScale);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].blueShift != 7) {      buf = GString::format("/BlueShift {0:d} def\n",			    privateDicts[i].blueShift);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].blueFuzz != 1) {      buf = GString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].hasStdHW) {      buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].hasStdVW) {      buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].nStemSnapH) {      (*outputFunc)(outputStream, "/StemSnapH [", 12);      for (j = 0; j < privateDicts[i].nStemSnapH; ++j) {	buf = GString::format("{0:s}{1:.4g}",			      j > 0 ? " " : "", privateDicts[i].stemSnapH[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].nStemSnapV) {      (*outputFunc)(outputStream, "/StemSnapV [", 12);      for (j = 0; j < privateDicts[i].nStemSnapV; ++j) {	buf = GString::format("{0:s}{1:.4g}",			      j > 0 ? " " : "", privateDicts[i].stemSnapV[j]);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }      (*outputFunc)(outputStream, "] def\n", 6);    }    if (privateDicts[i].hasForceBold) {      buf = GString::format("/ForceBold {0:s} def\n",			    privateDicts[i].forceBold ? "true" : "false");      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].forceBoldThreshold != 0) {      buf = GString::format("/ForceBoldThreshold {0:.4g} def\n",			    privateDicts[i].forceBoldThreshold);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].languageGroup != 0) {      buf = GString::format("/LanguageGroup {0:d} def\n",			    privateDicts[i].languageGroup);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (privateDicts[i].expansionFactor != 0.06) {      buf = GString::format("/ExpansionFactor {0:.4g} def\n",			    privateDicts[i].expansionFactor);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    (*outputFunc)(outputStream, "currentdict end def\n", 20);    (*outputFunc)(outputStream, "currentdict end put\n", 20);  }  (*outputFunc)(outputStream, "def\n", 4);  // start the binary section  offset = (nCIDs + 1) * (1 + gdBytes);  buf = GString::format("(Hex) {0:d} StartData\n",			offset + charStrings->getLength());  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());  delete buf;  // write the charstring offset (CIDMap) table  for (i = 0; i <= nCIDs; i += 6) {    for (j = 0; j < 6 && i+j <= nCIDs; ++j) {      if (i+j < nCIDs && cidMap[i+j] >= 0) {	buf2[0] = (char)fdSelect[cidMap[i+j]];      } else {	buf2[0] = (char)0;      }      n = offset + charStringOffsets[i+j];      for (k = gdBytes; k >= 1; --k) {	buf2[k] = (char)(n & 0xff);	n >>= 8;      }      for (k = 0; k <= gdBytes; ++k) {	buf = GString::format("{0:02x}", buf2[k] & 0xff);	(*outputFunc)(outputStream, buf->getCString(), buf->getLength());	delete buf;      }    }    (*outputFunc)(outputStream, "\n", 1);  }  // write the charstring data  n = charStrings->getLength();  for (i = 0; i < n; i += 32) {    for (j = 0; j < 32 && i+j < n; ++j) {      buf = GString::format("{0:02x}", charStrings->getChar(i+j) & 0xff);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    if (i + 32 >= n) {      (*outputFunc)(outputStream, ">", 1);    }    (*outputFunc)(outputStream, "\n", 1);  }  gfree(charStringOffsets);  delete charStrings;  gfree(cidMap);}void FoFiType1C::convertToType0(char *psName,				FoFiOutputFunc outputFunc,				void *outputStream) {  int *cidMap;  Type1CIndex subrIdx;  Type1CIndexVal val;  int nCIDs;  GString *buf;  Type1CEexecBuf eb;  GBool ok;  int fd, i, j, k;  // compute the CID count and build the CID-to-GID mapping  nCIDs = 0;  for (i = 0; i < nGlyphs; ++i) {    if (charset[i] >= nCIDs) {      nCIDs = charset[i] + 1;    }  }  cidMap = (int *)gmallocn(nCIDs, sizeof(int));  for (i = 0; i < nCIDs; ++i) {    cidMap[i] = -1;  }  for (i = 0; i < nGlyphs; ++i) {    cidMap[charset[i]] = i;  }  // write the descendant Type 1 fonts  for (i = 0; i < nCIDs; i += 256) {    //~ this assumes that all CIDs in this block have the same FD --    //~ to handle multiple FDs correctly, need to somehow divide the    //~ font up by FD; as a kludge we ignore CID 0, which is .notdef    fd = 0;    for (j = i==0 ? 1 : 0; j < 256 && i+j < nCIDs; ++j) {      if (cidMap[i+j] >= 0) {	fd = fdSelect[cidMap[i+j]];	break;      }    }    // font dictionary (unencrypted section)    (*outputFunc)(outputStream, "16 dict begin\n", 14);    (*outputFunc)(outputStream, "/FontName /", 11);    (*outputFunc)(outputStream, psName, strlen(psName));    buf = GString::format("_{0:02x} def\n", i >> 8);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);    if (privateDicts[fd].hasFontMatrix) {      buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",			    privateDicts[fd].fontMatrix[0],			    privateDicts[fd].fontMatrix[1],			    privateDicts[fd].fontMatrix[2],			    privateDicts[fd].fontMatrix[3],			    privateDicts[fd].fontMatrix[4],			    privateDicts[fd].fontMatrix[5]);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    } else if (topDict.hasFontMatrix) {      (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);    } else {      (*outputFunc)(outputStream,		    "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38);    }    buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n",			  topDict.fontBBox[0], topDict.fontBBox[1],			  topDict.fontBBox[2], topDict.fontBBox[3]);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    buf = GString::format("/PaintType {0:d} def\n", topDict.paintType);    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());    delete buf;    if (topDict.paintType != 0) {      buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;    }    (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);    for (j = 0; j < 256 && i+j < nCIDs; ++j) {      buf = GString::format("dup {0:d} /c{1:02x} put\n", j, j);      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());      delete buf;

⌨️ 快捷键说明

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