Пример #1
0
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);
    }
}
Пример #2
0
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);
	}
Пример #3
0
/* 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 */
}
Пример #4
0
/* 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
}