void anonWrite(hotCtx g) { anonCtx h = g->ctx.anon; AnonTbl *tbl = &h->tbls.array[h->iTbl++]; /* Copy client data to output */ for (;;) { long count; char *data = tbl->refill(g->cb.ctx, &count, tbl->tag); if (count == 0) { break; } OUTN(count, data); } }
void MMFXWrite(hotCtx g) { MMFXCtx h = g->ctx.MMFX; int i; /* Write header */ OUT4(h->tbl.version); OUT2(h->tbl.nMetrics); OUT2(h->tbl.offSize); /* Write offset array */ if (h->tbl.offSize == 2) for (i = 0; i < h->tbl.nMetrics; i++) OUT2((short)h->tbl.offset[i]); else for (i = 0; i < h->tbl.nMetrics; i++) OUT4(h->tbl.offset[i]); /* Write charstring data */ OUTN(h->cstrs.cnt, h->cstrs.array); }
/* Write font set file */ static void writeSet(tcCtx g) { tcprivCtx h = g->ctx.tcpriv; int i; int nSynthetics; Offset offset; struct { char header[1024]; char trailer[128]; } wrap; if (h->FontSet.name != NULL) { /* Create wrappers */ fillWrapHeader(g, wrap.header); fillWrapTrailer(g, wrap.trailer); h->FontSet.size += strlen(wrap.header) + strlen(wrap.trailer); } if (g->cb.cffSize != NULL) { /* Report FontSet size to client */ g->cb.cffSize(g->cb.ctx, h->FontSet.size, (g->status & TC_EURO_ADDED) != 0); } if (h->FontSet.name != NULL) { OUTN(strlen(wrap.header), wrap.header); } /* Write header */ OUT1(h->cffHdr.major); OUT1(h->cffHdr.minor); OUT1(h->cffHdr.hdrSize); OUT1(h->cffHdr.offSize); /* Write name index */ OUT2(h->nameHdr.count); OUT1(h->nameHdr.offSize); offset = 1; OUTOFF(h->nameHdr.offSize, offset); for (i = 0; i < h->set.cnt; i++) { offset += h->set.array[i].size.FontName; OUTOFF(h->nameHdr.offSize, offset); } for (i = 0; i < h->set.cnt; i++) { OUTN(h->set.array[i].size.FontName, h->set.array[i].FontName); } /* Write top dict index */ OUT2(h->dictHdr.count); OUT1(h->dictHdr.offSize); offset = 1; OUTOFF(h->dictHdr.offSize, offset); for (i = 0; i < h->set.cnt; i++) { offset += h->set.array[i].size.dict; OUTOFF(h->dictHdr.offSize, offset); } for (i = 0; i < h->set.cnt; i++) { OUTN(h->set.array[i].dict.cnt, h->set.array[i].dict.array); } #if 0 for (i = 0; i < h->set.cnt; i++) { dictDump(g, &h->set.array[i].dict); } #endif sindexWrite(g); /* Write string table */ subrWriteGlobal(g); /* Write global subrs */ /* Write charsets, encodings, and fdIndexes */ encodingWrite(g); charsetWrite(g); fdselectWrite(g); /* Write remainder of font data */ nSynthetics = 0; for (i = 0; i < h->set.cnt; i++) { Font *font = &h->set.array[i]; if (font->flags & FONT_SYNTHETIC) { nSynthetics++; } else if (font->flags & FONT_CHAMELEON) { OUTN(font->size.Private, font->chameleon.data); } else { DICT *Private = &font->Private; csWriteChars(g, font); /* Write CharsStrings */ if (font->flags & FONT_CID) { /* Write font and Private dict indexes */ writeCIDDicts(g, font); } else { /* Write Private dict */ OUTN(Private->cnt, Private->array); } #if TC_SUBR_SUPPORT subrWriteLocal(g, &font->subrs); /* Write Subrs */ #endif /* TC_SUBR_SUPPORT */ } } /* Write legal text */ if (h->copyright != NULL) { OUTN(strlen(h->copyright), h->copyright); } else if (g->flags & TC_NONOTICE && h->set.cnt > 1) { tcWarning(g, "no copyright notice specified"); } if (h->FontSet.name != NULL) { OUTN(strlen(wrap.trailer), wrap.trailer); } #if TC_STATISTICS if (g->stats.gather) { showStats(h); } else { fprintf(stderr, "Created: %s (fonts=%ld+%d=%ld, size=%ld, %ld/font)\n", (g->cb.cffId == NULL) ? "?" : g->cb.cffId(g->cb.ctx), h->set.cnt - nSynthetics, nSynthetics, h->set.cnt, h->FontSet.size, h->FontSet.size / h->set.cnt); } #endif /* TC_STATISTICS */ }
/* Write CID font dicts */ static void writeCIDDicts(tcCtx g, Font *font) { OffSize offSize; unsigned count; Offset offset; int i; long sizeFDs; /* Only output fd's which contained a character. */ /* The FDSelect which is written syncs with this. See cidAddChars. */ count = 0; sizeFDs = 0; for (i = 0; i < font->fdCount; i++) { FDInfo *info = &font->fdInfo[i]; if (info->seenChar) { sizeFDs += info->FD.cnt; count++; } } /* Font dict index */ OUT2(count); offSize = INDEX_OFF_SIZE(sizeFDs); OUT1(offSize); offset = 1; OUTOFF(offSize, offset); for (i = 0; i < font->fdCount; i++) { FDInfo *info = &font->fdInfo[i]; if (info->seenChar) { offset += info->FD.cnt; OUTOFF(offSize, offset); } } for (i = 0; i < font->fdCount; i++) { FDInfo *info = &font->fdInfo[i]; if (info->seenChar) { OUTN(info->FD.cnt, info->FD.array); } } /* Private dicts */ for (i = 0; i < font->fdCount; i++) { FDInfo *info = &font->fdInfo[i]; if (info->seenChar) { OUTN(info->Private.cnt, info->Private.array); } } #if TC_SUBR_SUPPORT /* Subrs */ for (i = 0; i < font->fdCount; i++) { FDInfo *info = &font->fdInfo[i]; if (info->seenChar && info->size.Subrs != 0) { subrWriteLocal(g, &info->subrs); } } #endif /* TC_SUBR_SUPPORT */ #if 0 for (i = 0; i < font->fdCount; i++) { printf("--- FD/PD[%d]\n", i); dictDump(g, &font->fdInfo[i].FD); dictDump(g, &font->fdInfo[i].Private); } #endif }