11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include <ctype.h>
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkData.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkFontHost.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGlyphCache.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPaint.h"
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPDFCatalog.h"
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFDevice.h"
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFFont.h"
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPDFFontImpl.h"
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFStream.h"
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFTypes.h"
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFUtils.h"
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRefCnt.h"
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkScalar.h"
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkStream.h"
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypeface.h"
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypes.h"
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h"
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if defined (SK_SFNTLY_SUBSETTER)
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include SK_SFNTLY_SUBSETTER
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergernamespace {
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// File-Local Functions
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool parsePFBSection(const uint8_t** src, size_t* len, int sectionType,
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                     size_t* size) {
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // PFB sections have a two or six bytes header. 0x80 and a one byte
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // section type followed by a four byte section length.  Type one is
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // an ASCII section (includes a length), type two is a binary section
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // (includes a length) and type three is an EOF marker with no length.
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const uint8_t* buf = *src;
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (*len < 2 || buf[0] != 0x80 || buf[1] != sectionType) {
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (buf[1] == 3) {
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return true;
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (*len < 6) {
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *size = (size_t)buf[2] | ((size_t)buf[3] << 8) | ((size_t)buf[4] << 16) |
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ((size_t)buf[5] << 24);
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t consumed = *size + 6;
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (consumed > *len) {
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *src = *src + consumed;
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *len = *len - consumed;
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return true;
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool parsePFB(const uint8_t* src, size_t size, size_t* headerLen,
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger              size_t* dataLen, size_t* trailerLen) {
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const uint8_t* srcPtr = src;
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t remaining = size;
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return parsePFBSection(&srcPtr, &remaining, 1, headerLen) &&
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger           parsePFBSection(&srcPtr, &remaining, 2, dataLen) &&
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger           parsePFBSection(&srcPtr, &remaining, 1, trailerLen) &&
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger           parsePFBSection(&srcPtr, &remaining, 3, NULL);
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* The sections of a PFA file are implicitly defined.  The body starts
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * after the line containing "eexec," and the trailer starts with 512
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * literal 0's followed by "cleartomark" (plus arbitrary white space).
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * This function assumes that src is NUL terminated, but the NUL
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * termination is not included in size.
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool parsePFA(const char* src, size_t size, size_t* headerLen,
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger              size_t* hexDataLen, size_t* dataLen, size_t* trailerLen) {
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* end = src + size;
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* dataPos = strstr(src, "eexec");
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!dataPos) {
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    dataPos += strlen("eexec");
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    while ((*dataPos == '\n' || *dataPos == '\r' || *dataPos == ' ') &&
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            dataPos < end) {
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dataPos++;
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *headerLen = dataPos - src;
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* trailerPos = strstr(dataPos, "cleartomark");
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!trailerPos) {
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int zeroCount = 0;
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (trailerPos--; trailerPos > dataPos && zeroCount < 512; trailerPos--) {
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (*trailerPos == '\n' || *trailerPos == '\r' || *trailerPos == ' ') {
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            continue;
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        } else if (*trailerPos == '0') {
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            zeroCount++;
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        } else {
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return false;
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (zeroCount != 512) {
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *hexDataLen = trailerPos - src - *headerLen;
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *trailerLen = size - *headerLen - *hexDataLen;
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Verify that the data section is hex encoded and count the bytes.
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int nibbles = 0;
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (; dataPos < trailerPos; dataPos++) {
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (isspace(*dataPos)) {
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            continue;
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!isxdigit(*dataPos)) {
1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return false;
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        nibbles++;
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    *dataLen = (nibbles + 1) / 2;
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return true;
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerint8_t hexToBin(uint8_t c) {
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!isxdigit(c)) {
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return -1;
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (c <= '9') {
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return c - '0';
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (c <= 'F') {
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return c - 'A' + 10;
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (c <= 'f') {
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return c - 'a' + 10;
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return -1;
1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkStream* handleType1Stream(SkStream* srcStream, size_t* headerLen,
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                            size_t* dataLen, size_t* trailerLen) {
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // srcStream may be backed by a file or a unseekable fd, so we may not be
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // able to use skip(), rewind(), or getMemoryBase().  read()ing through
1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // the input only once is doable, but very ugly. Furthermore, it'd be nice
1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // if the data was NUL terminated so that we can use strstr() to search it.
1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Make as few copies as possible given these constraints.
1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkDynamicMemoryWStream dynamicStream;
1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkMemoryStream> staticStream;
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkData* data = NULL;
1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const uint8_t* src;
1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t srcLen;
1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if ((srcLen = srcStream->getLength()) > 0) {
1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        staticStream = new SkMemoryStream(srcLen + 1);
1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        staticStream->unref();  // new and SkRefPtr both took a ref.
1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        src = (const uint8_t*)staticStream->getMemoryBase();
1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (srcStream->getMemoryBase() != NULL) {
1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            memcpy((void *)src, srcStream->getMemoryBase(), srcLen);
1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        } else {
1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            size_t read = 0;
1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            while (read < srcLen) {
1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                size_t got = srcStream->read((void *)staticStream->getAtPos(),
1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                             srcLen - read);
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (got == 0) {
1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    return NULL;
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                read += got;
1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                staticStream->seek(read);
1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        ((uint8_t *)src)[srcLen] = 0;
1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } else {
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const size_t kBufSize = 4096;
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint8_t buf[kBufSize];
1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        size_t amount;
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        while ((amount = srcStream->read(buf, kBufSize)) > 0) {
1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            dynamicStream.write(buf, amount);
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        amount = 0;
1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dynamicStream.write(&amount, 1);  // NULL terminator.
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        data = dynamicStream.copyToData();
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        src = data->bytes();
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        srcLen = data->size() - 1;
1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // this handles releasing the data we may have gotten from dynamicStream.
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // if data is null, it is a no-op
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoDataUnref aud(data);
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) {
2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkMemoryStream* result =
2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            new SkMemoryStream(*headerLen + *dataLen + *trailerLen);
2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        memcpy((char*)result->getAtPos(), src + 6, *headerLen);
2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->seek(*headerLen);
2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        memcpy((char*)result->getAtPos(), src + 6 + *headerLen + 6, *dataLen);
2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->seek(*headerLen + *dataLen);
2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        memcpy((char*)result->getAtPos(), src + 6 + *headerLen + 6 + *dataLen,
2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger               *trailerLen);
2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->rewind();
2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return result;
2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // A PFA has to be converted for PDF.
2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t hexDataLen;
2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (parsePFA((const char*)src, srcLen, headerLen, &hexDataLen, dataLen,
2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 trailerLen)) {
2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkMemoryStream* result =
2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            new SkMemoryStream(*headerLen + *dataLen + *trailerLen);
2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        memcpy((char*)result->getAtPos(), src, *headerLen);
2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->seek(*headerLen);
2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const uint8_t* hexData = src + *headerLen;
2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const uint8_t* trailer = hexData + hexDataLen;
2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        size_t outputOffset = 0;
2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint8_t dataByte = 0;  // To hush compiler.
2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bool highNibble = true;
2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (; hexData < trailer; hexData++) {
2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            char curNibble = hexToBin(*hexData);
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (curNibble < 0) {
2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                continue;
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            if (highNibble) {
2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                dataByte = curNibble << 4;
2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                highNibble = false;
2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            } else {
2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                dataByte |= curNibble;
2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                highNibble = true;
2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                ((char *)result->getAtPos())[outputOffset++] = dataByte;
2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!highNibble) {
2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            ((char *)result->getAtPos())[outputOffset++] = dataByte;
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkASSERT(outputOffset == *dataLen);
2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->seek(*headerLen + outputOffset);
2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        memcpy((char *)result->getAtPos(), src + *headerLen + hexDataLen,
2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger               *trailerLen);
2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        result->rewind();
2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return result;
2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return NULL;
2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// scale from em-units to base-1000, returning as a SkScalar
2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkScalar scaleFromFontUnits(int16_t val, uint16_t emSize) {
2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar scaled = SkIntToScalar(val);
2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    if (emSize == 1000) {
2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return scaled;
2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } else {
2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return SkScalarMulDiv(scaled, 1000, emSize);
2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid setGlyphWidthAndBoundingBox(SkScalar width, SkIRect box,
2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                 SkWStream* content) {
2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Specify width and bounding box for the glyph.
2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPDFScalar::Append(width, content);
2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeText(" 0 ");
2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeDecAsText(box.fLeft);
2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeText(" ");
2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeDecAsText(box.fTop);
2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeText(" ");
2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeDecAsText(box.fRight);
2750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeText(" ");
2760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeDecAsText(box.fBottom);
2770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    content->writeText(" d1\n");
2780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2800b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkPDFArray* makeFontBBox(SkIRect glyphBBox, uint16_t emSize) {
2810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPDFArray* bbox = new SkPDFArray;
2820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bbox->reserve(4);
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bbox->appendScalar(scaleFromFontUnits(glyphBBox.fLeft, emSize));
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bbox->appendScalar(scaleFromFontUnits(glyphBBox.fBottom, emSize));
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bbox->appendScalar(scaleFromFontUnits(glyphBBox.fRight, emSize));
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bbox->appendScalar(scaleFromFontUnits(glyphBBox.fTop, emSize));
2870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return bbox;
2880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2900b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkPDFArray* appendWidth(const int16_t& width, uint16_t emSize,
2910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                        SkPDFArray* array) {
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    array->appendScalar(scaleFromFontUnits(width, emSize));
2930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return array;
2940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2960b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkPDFArray* appendVerticalAdvance(
2970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkAdvancedTypefaceMetrics::VerticalMetric& advance,
2980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint16_t emSize, SkPDFArray* array) {
2990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    appendWidth(advance.fVerticalAdvance, emSize, array);
3000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    appendWidth(advance.fOriginXDisp, emSize, array);
3010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    appendWidth(advance.fOriginYDisp, emSize, array);
3020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return array;
3030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertemplate <typename Data>
3060b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkPDFArray* composeAdvanceData(
3070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* advanceInfo,
3080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint16_t emSize,
3090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPDFArray* (*appendAdvance)(const Data& advance, uint16_t emSize,
3100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                     SkPDFArray* array),
3110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        Data* defaultAdvance) {
3120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPDFArray* result = new SkPDFArray();
3130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (; advanceInfo != NULL; advanceInfo = advanceInfo->fNext.get()) {
3140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        switch (advanceInfo->fType) {
3150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kDefault: {
3160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkASSERT(advanceInfo->fAdvance.count() == 1);
3170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                *defaultAdvance = advanceInfo->fAdvance[0];
3180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
3190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
3200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kRange: {
3210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkRefPtr<SkPDFArray> advanceArray = new SkPDFArray();
3220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                advanceArray->unref();  // SkRefPtr and new both took a ref.
3230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                for (int j = 0; j < advanceInfo->fAdvance.count(); j++)
3240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                    appendAdvance(advanceInfo->fAdvance[j], emSize,
3250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                  advanceArray.get());
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                result->appendInt(advanceInfo->fStartId);
3270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                result->append(advanceArray.get());
3280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
3290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
3300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kRun: {
3310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkASSERT(advanceInfo->fAdvance.count() == 1);
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                result->appendInt(advanceInfo->fStartId);
3331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                result->appendInt(advanceInfo->fEndId);
3340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                appendAdvance(advanceInfo->fAdvance[0], emSize, result);
3350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
3360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            }
3370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
3380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
3390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return result;
3400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}  // namespace
3430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void append_tounicode_header(SkDynamicMemoryWStream* cmap) {
3450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // 12 dict begin: 12 is an Adobe-suggested value. Shall not change.
3460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // It's there to prevent old version Adobe Readers from malfunctioning.
3470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* kHeader =
3480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/CIDInit /ProcSet findresource begin\n"
3490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "12 dict begin\n"
3500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "begincmap\n";
3510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    cmap->writeText(kHeader);
3520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // The /CIDSystemInfo must be consistent to the one in
3540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // SkPDFFont::populateCIDFont().
3550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // We can not pass over the system info object here because the format is
3560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // different. This is not a reference object.
3570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* kSysInfo =
3580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/CIDSystemInfo\n"
3590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "<<  /Registry (Adobe)\n"
3600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/Ordering (UCS)\n"
3610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/Supplement 0\n"
3620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        ">> def\n";
3630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    cmap->writeText(kSysInfo);
3640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // The CMapName must be consistent to /CIDSystemInfo above.
3660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // /CMapType 2 means ToUnicode.
3670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // We specify codespacerange from 0x0000 to 0xFFFF because we convert our
3680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // code table from unsigned short (16-bits). Codespace range just tells the
3690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // PDF processor the valid range. It does not matter whether a complete
3700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // mapping is provided or not.
3710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* kTypeInfo =
3720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/CMapName /Adobe-Identity-UCS def\n"
3730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "/CMapType 2 def\n"
3740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "1 begincodespacerange\n"
3750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "<0000> <FFFF>\n"
3760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "endcodespacerange\n";
3770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    cmap->writeText(kTypeInfo);
3780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void append_cmap_footer(SkDynamicMemoryWStream* cmap) {
3810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* kFooter =
3820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "endcmap\n"
3830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "CMapName currentdict /CMap defineresource pop\n"
3840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "end\n"
3850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        "end";
3860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    cmap->writeText(kFooter);
3870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
3880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
3891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct BFChar {
3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t fGlyphId;
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkUnichar fUnicode;
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct BFRange {
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t fStart;
3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint16_t fEnd;
3971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkUnichar fUnicode;
3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
3991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void append_bfchar_section(const SkTDArray<BFChar>& bfchar,
4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  SkDynamicMemoryWStream* cmap) {
4020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // PDF spec defines that every bf* list can have at most 100 entries.
4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < bfchar.count(); i += 100) {
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int count = bfchar.count() - i;
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        count = SkMin32(count, 100);
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeDecAsText(count);
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeText(" beginbfchar\n");
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int j = 0; j < count; ++j) {
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText("<");
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeHexAsText(bfchar[i + j].fGlyphId, 4);
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText("> <");
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeHexAsText(bfchar[i + j].fUnicode, 4);
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText(">\n");
4140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeText("endbfchar\n");
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void append_bfrange_section(const SkTDArray<BFRange>& bfrange,
4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   SkDynamicMemoryWStream* cmap) {
4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // PDF spec defines that every bf* list can have at most 100 entries.
4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < bfrange.count(); i += 100) {
4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int count = bfrange.count() - i;
4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        count = SkMin32(count, 100);
4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeDecAsText(count);
4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeText(" beginbfrange\n");
4271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int j = 0; j < count; ++j) {
4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText("<");
4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeHexAsText(bfrange[i + j].fStart, 4);
4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText("> <");
4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeHexAsText(bfrange[i + j].fEnd, 4);
4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText("> <");
4331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeHexAsText(bfrange[i + j].fUnicode, 4);
4341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            cmap->writeText(">\n");
4350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        cmap->writeText("endbfrange\n");
4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Generate <bfchar> and <bfrange> table according to PDF spec 1.4 and Adobe
4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Technote 5014.
4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// The function is not static so we can test it in unit tests.
4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Current implementation guarantees bfchar and bfrange entries do not overlap.
4451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Current implementation does not attempt aggresive optimizations against
4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// following case because the specification is not clear.
4481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// 4 beginbfchar          1 beginbfchar
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// <0003> <0013>          <0020> <0014>
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// <0005> <0015>    to    endbfchar
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// <0007> <0017>          1 beginbfrange
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// <0020> <0014>          <0003> <0007> <0013>
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// endbfchar              endbfrange
4551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Adobe Technote 5014 said: "Code mappings (unlike codespace ranges) may
4571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// overlap, but succeeding maps superceded preceding maps."
4581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// In case of searching text in PDF, bfrange will have higher precedence so
4601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// typing char id 0x0014 in search box will get glyph id 0x0004 first.  However,
4611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// the spec does not mention how will this kind of conflict being resolved.
4621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//
4631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// For the worst case (having 65536 continuous unicode and we use every other
4641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// one of them), the possible savings by aggressive optimization is 416KB
4651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// pre-compressed and does not provide enough motivation for implementation.
4661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
4671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          const SkPDFGlyphSet* subset,
4681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          SkDynamicMemoryWStream* cmap) {
4691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (glyphToUnicode.isEmpty()) {
4701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return;
4710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
4720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
4731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTDArray<BFChar> bfcharEntries;
4741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTDArray<BFRange> bfrangeEntries;
4751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    BFRange currentRangeEntry = {0, 0, 0};
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool rangeEmpty = true;
4781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const int count = glyphToUnicode.count();
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < count + 1; ++i) {
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool inSubset = i < count && (subset == NULL || subset->has(i));
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!rangeEmpty) {
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // PDF spec requires bfrange not changing the higher byte,
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // e.g. <1035> <10FF> <2222> is ok, but
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            //      <1035> <1100> <2222> is no good
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            bool inRange =
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                i == currentRangeEntry.fEnd + 1 &&
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                i >> 8 == currentRangeEntry.fStart >> 8 &&
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                i < count &&
4901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                glyphToUnicode[i] == currentRangeEntry.fUnicode + i -
4911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         currentRangeEntry.fStart;
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (!inSubset || !inRange) {
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (currentRangeEntry.fEnd > currentRangeEntry.fStart) {
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    bfrangeEntries.push(currentRangeEntry);
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    BFChar* entry = bfcharEntries.append();
4971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    entry->fGlyphId = currentRangeEntry.fStart;
4981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    entry->fUnicode = currentRangeEntry.fUnicode;
4991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
5001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rangeEmpty = true;
5011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
5021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (inSubset) {
5041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            currentRangeEntry.fEnd = i;
5051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (rangeEmpty) {
5061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger              currentRangeEntry.fStart = i;
5071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger              currentRangeEntry.fUnicode = glyphToUnicode[i];
5081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger              rangeEmpty = false;
5091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
5101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
5121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // The spec requires all bfchar entries for a font must come before bfrange
5141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // entries.
5151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    append_bfchar_section(bfcharEntries, cmap);
5161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    append_bfrange_section(bfrangeEntries, cmap);
5171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkPDFStream* generate_tounicode_cmap(
5201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkTDArray<SkUnichar>& glyphToUnicode,
5211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkPDFGlyphSet* subset) {
5221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDynamicMemoryWStream cmap;
5231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    append_tounicode_header(&cmap);
5241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    append_cmap_sections(glyphToUnicode, subset, &cmap);
5251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    append_cmap_footer(&cmap);
5261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkMemoryStream> cmapStream = new SkMemoryStream();
5271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    cmapStream->unref();  // SkRefPtr and new took a reference.
5281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    cmapStream->setData(cmap.copyToData());
5291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return new SkPDFStream(cmapStream.get());
5300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
5310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
5321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void sk_delete_array(const void* ptr, size_t, void*) {
5331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Use C-style cast to cast away const and cast type simultaneously.
5341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    delete[] (unsigned char*)ptr;
5351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic int get_subset_font_stream(const char* fontName,
5381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  const SkTypeface* typeface,
5391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  const SkTDArray<uint32_t>& subset,
5401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  SkPDFStream** fontStream) {
5411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkStream> fontData =
5421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkFontHost::OpenStream(SkTypeface::UniqueID(typeface));
5431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fontData->unref();  // SkRefPtr and OpenStream both took a ref.
5441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int fontSize = fontData->getLength();
5461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if defined (SK_SFNTLY_SUBSETTER)
5481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Read font into buffer.
5491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFStream* subsetFontStream = NULL;
5501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTDArray<unsigned char> originalFont;
5511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    originalFont.setCount(fontSize);
5521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fontData->read(originalFont.begin(), fontSize) == (size_t)fontSize) {
5531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        unsigned char* subsetFont = NULL;
5541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // sfntly requires unsigned int* to be passed in, as far as we know,
5551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // unsigned int is equivalent to uint32_t on all platforms.
5561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SK_COMPILE_ASSERT(sizeof(unsigned int) == sizeof(uint32_t),
5571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          unsigned_int_not_32_bits);
5581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int subsetFontSize = SfntlyWrapper::SubsetFont(fontName,
5591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                       originalFont.begin(),
5601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                       fontSize,
5611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                       subset.begin(),
5621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                       subset.count(),
5631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                       &subsetFont);
5641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (subsetFontSize > 0 && subsetFont != NULL) {
5651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkAutoDataUnref data(SkData::NewWithProc(subsetFont,
5661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     subsetFontSize,
5671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     sk_delete_array,
5681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     NULL));
5691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            subsetFontStream = new SkPDFStream(data.get());
5701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fontSize = subsetFontSize;
5711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (subsetFontStream) {
5741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *fontStream = subsetFontStream;
5751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fontSize;
5761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
5781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Fail over: just embed the whole font.
5801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *fontStream = new SkPDFStream(fontData.get());
5811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fontSize;
5821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
5851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFGlyphSet
5861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
5871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5881cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSet::SkPDFGlyphSet() : fBitSet(SK_MaxU16 + 1) {
5891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSet::set(const uint16_t* glyphIDs, int numGlyphs) {
5921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < numGlyphs; ++i) {
5931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fBitSet.setBit(glyphIDs[i], true);
5941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFGlyphSet::has(uint16_t glyphID) const {
5981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fBitSet.isBitSet(glyphID);
5991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSet::merge(const SkPDFGlyphSet& usage) {
6021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fBitSet.orBits(usage.fBitSet);
6031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSet::exportTo(SkTDArray<unsigned int>* glyphIDs) const {
6061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fBitSet.exportTo(glyphIDs);
6071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFGlyphSetMap
6111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6121cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSetMap::FontGlyphSetPair::FontGlyphSetPair(SkPDFFont* font,
6131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SkPDFGlyphSet* glyphSet)
6141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : fFont(font),
6151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fGlyphSet(glyphSet) {
6161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6181cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSetMap::F2BIter::F2BIter(const SkPDFGlyphSetMap& map) {
6191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    reset(map);
6201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6221cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSetMap::FontGlyphSetPair* SkPDFGlyphSetMap::F2BIter::next() const {
6231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fIndex >= fMap->count()) {
6241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return NULL;
6251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return &((*fMap)[fIndex++]);
6271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSetMap::F2BIter::reset(const SkPDFGlyphSetMap& map) {
6301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fMap = &(map.fMap);
6311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fIndex = 0;
6321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6341cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSetMap::SkPDFGlyphSetMap() {
6351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6371cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSetMap::~SkPDFGlyphSetMap() {
6381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    reset();
6391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSetMap::merge(const SkPDFGlyphSetMap& usage) {
6421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < usage.fMap.count(); ++i) {
6431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPDFGlyphSet* myUsage = getGlyphSetForFont(usage.fMap[i].fFont);
6441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        myUsage->merge(*(usage.fMap[i].fGlyphSet));
6451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSetMap::reset() {
6491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < fMap.count(); ++i) {
6501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        delete fMap[i].fGlyphSet;  // Should not be NULL.
6511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fMap.reset();
6531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFGlyphSetMap::noteGlyphUsage(SkPDFFont* font, const uint16_t* glyphIDs,
6561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      int numGlyphs) {
6571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFGlyphSet* subset = getGlyphSetForFont(font);
6581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (subset) {
6591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        subset->set(glyphIDs, numGlyphs);
6601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6631cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFGlyphSet* SkPDFGlyphSetMap::getGlyphSetForFont(SkPDFFont* font) {
6641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int index = fMap.count();
6651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < index; ++i) {
6661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fMap[i].fFont == font) {
6671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return fMap[i].fGlyphSet;
6681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fMap.append();
6711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    index = fMap.count() - 1;
6721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fMap[index].fFont = font;
6731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fMap[index].fGlyphSet = new SkPDFGlyphSet();
6741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fMap[index].fGlyphSet;
6751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFFont
6791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* Font subset design: It would be nice to be able to subset fonts
6820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * (particularly type 3 fonts), but it's a lot of work and not a priority.
6830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
6840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Resources are canonicalized and uniqueified by pointer so there has to be
6850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * some additional state indicating which subset of the font is used.  It
6860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * must be maintained at the page granularity and then combined at the document
6870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * granularity. a) change SkPDFFont to fill in its state on demand, kind of
6880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * like SkPDFGraphicState.  b) maintain a per font glyph usage class in each
6890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * page/pdf device. c) in the document, retrieve the per font glyph usage
6900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * from each page and combine it and ask for a resource with that subset.
6910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
6920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
6930b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkPDFFont::~SkPDFFont() {
6941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoMutexAcquire lock(CanonicalFontsMutex());
6950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int index;
6961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (Find(SkTypeface::UniqueID(fTypeface.get()), fFirstGlyphID, &index) &&
6971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            CanonicalFonts()[index].fFont == this) {
6981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        CanonicalFonts().removeShuffle(index);
6990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
7000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    fResources.unrefAll();
7010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkPDFFont::getResources(SkTDArray<SkPDFObject*>* resourceList) {
7041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GetResourcesHelper(&fResources, resourceList);
7050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7070b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkTypeface* SkPDFFont::typeface() {
7080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return fTypeface.get();
7090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7110b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkAdvancedTypefaceMetrics::FontType SkPDFFont::getType() {
7121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fFontType;
7130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool SkPDFFont::hasGlyph(uint16_t id) {
7160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return (id >= fFirstGlyphID && id <= fLastGlyphID) || id == 0;
7170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergersize_t SkPDFFont::glyphsToPDFFontEncoding(uint16_t* glyphIDs,
7200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                          size_t numGlyphs) {
7210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // A font with multibyte glyphs will support all glyph IDs in a single font.
7221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (this->multiByteGlyphs()) {
7230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return numGlyphs;
7240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
7250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (size_t i = 0; i < numGlyphs; i++) {
7270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (glyphIDs[i] == 0) {
7280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            continue;
7290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
7300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (glyphIDs[i] < fFirstGlyphID || glyphIDs[i] > fLastGlyphID) {
7310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return i;
7320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
7330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        glyphIDs[i] -= (fFirstGlyphID - 1);
7340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
7350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return numGlyphs;
7370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// static
7401cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) {
7411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoMutexAcquire lock(CanonicalFontsMutex());
7420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const uint32_t fontID = SkTypeface::UniqueID(typeface);
7431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int relatedFontIndex;
7441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (Find(fontID, glyphID, &relatedFontIndex)) {
7451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        CanonicalFonts()[relatedFontIndex].fFont->ref();
7461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return CanonicalFonts()[relatedFontIndex].fFont;
7471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkAdvancedTypefaceMetrics> fontMetrics;
7501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFDict* relatedFontDescriptor = NULL;
7511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (relatedFontIndex >= 0) {
7521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPDFFont* relatedFont = CanonicalFonts()[relatedFontIndex].fFont;
7531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fontMetrics = relatedFont->fontInfo();
7541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        relatedFontDescriptor = relatedFont->getFontDescriptor();
7550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } else {
7560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAdvancedTypefaceMetrics::PerGlyphInfo info;
7571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        info = SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo;
7580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
7590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                  info, SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo);
7601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if !defined (SK_SFNTLY_SUBSETTER)
7611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
7621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
7631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
7641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fontMetrics =
7651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0);
7661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if defined (SK_SFNTLY_SUBSETTER)
7671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkASSERT(fontMetrics);
7681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkSafeUnref(fontMetrics.get());  // SkRefPtr and Get both took a ref.
7691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fontMetrics &&
7701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fontMetrics->fType != SkAdvancedTypefaceMetrics::kTrueType_Font) {
7711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Font does not support subsetting, get new info with advance.
7721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
7731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                      info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
7741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fontMetrics =
7751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0);
7761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkSafeUnref(fontMetrics.get());  // SkRefPtr and Get both took a ref
7771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
7790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
7800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFFont* font = Create(fontMetrics.get(), typeface, glyphID,
7821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             relatedFontDescriptor);
7830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    FontRec newEntry(font, fontID, font->fFirstGlyphID);
7841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    CanonicalFonts().push(newEntry);
7850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return font;  // Return the reference new SkPDFFont() created.
7860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7881cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont* SkPDFFont::getFontSubset(const SkPDFGlyphSet* usage) {
7891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return NULL;  // Default: no support.
7901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
7911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// static
7931cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkTDArray<SkPDFFont::FontRec>& SkPDFFont::CanonicalFonts() {
7940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // This initialization is only thread safe with gcc.
7950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkTDArray<FontRec> gCanonicalFonts;
7960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return gCanonicalFonts;
7970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
7980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
7990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// static
8004f1dae40e24d57d647db01443b8bf2410514b8b5Derek SollenbergerSkBaseMutex& SkPDFFont::CanonicalFontsMutex() {
8014f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // This initialization is only thread safe with gcc, or when
8024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // POD-style mutex initialization is used.
8034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SK_DECLARE_STATIC_MUTEX(gCanonicalFontsMutex);
8040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return gCanonicalFontsMutex;
8050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
8060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
8070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger// static
8081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFFont::Find(uint32_t fontID, uint16_t glyphID, int* index) {
8091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // TODO(vandebo): Optimize this, do only one search?
8100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    FontRec search(NULL, fontID, glyphID);
8111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *index = CanonicalFonts().find(search);
8121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (*index >= 0) {
8130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return true;
8141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    search.fGlyphID = 0;
8161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *index = CanonicalFonts().find(search);
8170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return false;
8180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
8190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
8201cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont::SkPDFFont(SkAdvancedTypefaceMetrics* info, SkTypeface* typeface,
8211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     uint16_t glyphID, bool descendantFont)
8220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        : SkPDFDict("Font"),
8230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger          fTypeface(typeface),
8240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger          fFirstGlyphID(1),
8251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fLastGlyphID(info ? info->fLastGlyphID : 0),
8261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fFontInfo(info) {
8271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (info == NULL) {
8281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFontType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font;
8291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (info->fMultiMaster) {
8301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFontType = SkAdvancedTypefaceMetrics::kOther_Font;
8311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
8321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFontType = info->fType;
8331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// static
8371cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont* SkPDFFont::Create(SkAdvancedTypefaceMetrics* info,
8381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SkTypeface* typeface, uint16_t glyphID,
8391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SkPDFDict* relatedFontDescriptor) {
8401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAdvancedTypefaceMetrics::FontType type =
8411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        info ? info->fType : SkAdvancedTypefaceMetrics::kNotEmbeddable_Font;
8421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (info && info->fMultiMaster) {
8440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        NOT_IMPLEMENTED(true, true);
8451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return new SkPDFType3Font(info,
8461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  typeface,
8471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  glyphID,
8481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  relatedFontDescriptor);
8490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
8501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (type == SkAdvancedTypefaceMetrics::kType1CID_Font ||
8511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        type == SkAdvancedTypefaceMetrics::kTrueType_Font) {
8521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkASSERT(relatedFontDescriptor == NULL);
8531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return new SkPDFType0Font(info, typeface);
8541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (type == SkAdvancedTypefaceMetrics::kType1_Font) {
8561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return new SkPDFType1Font(info,
8571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  typeface,
8581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  glyphID,
8591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  relatedFontDescriptor);
8601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font ||
8631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger             type == SkAdvancedTypefaceMetrics::kOther_Font ||
8641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger             type == SkAdvancedTypefaceMetrics::kNotEmbeddable_Font);
8651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return new SkPDFType3Font(info, typeface, glyphID, relatedFontDescriptor);
8671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8691cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() {
8701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fFontInfo.get();
8711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::setFontInfo(SkAdvancedTypefaceMetrics* info) {
8741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (info == NULL || info == fFontInfo.get()) {
8750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return;
8760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
8771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fFontInfo = info;
8781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergeruint16_t SkPDFFont::firstGlyphID() const {
8811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fFirstGlyphID;
8821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
8841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergeruint16_t SkPDFFont::lastGlyphID() const {
8851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fLastGlyphID;
8861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::setLastGlyphID(uint16_t glyphID) {
8891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fLastGlyphID = glyphID;
8901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::addResource(SkPDFObject* object) {
8931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(object != NULL);
8941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fResources.push(object);
8951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8971cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFDict* SkPDFFont::getFontDescriptor() {
8981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fDescriptor.get();
8991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::setFontDescriptor(SkPDFDict* descriptor) {
9021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor = descriptor;
9031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) {
9061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fDescriptor.get() == NULL) {
9071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
9081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint16_t emSize = fFontInfo->fEmSize;
9111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertName("FontName", fFontInfo->fFontName);
9131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertInt("Flags", fFontInfo->fStyle);
9141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertScalar("Ascent",
9151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scaleFromFontUnits(fFontInfo->fAscent, emSize));
9161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertScalar("Descent",
9171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scaleFromFontUnits(fFontInfo->fDescent, emSize));
9181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertScalar("StemV",
9191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scaleFromFontUnits(fFontInfo->fStemV, emSize));
9201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertScalar("CapHeight",
9211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scaleFromFontUnits(fFontInfo->fCapHeight, emSize));
9221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insertInt("ItalicAngle", fFontInfo->fItalicAngle);
9231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fDescriptor->insert("FontBBox", makeFontBBox(fFontInfo->fBBox,
9241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 fFontInfo->fEmSize))->unref();
9251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (defaultWidth > 0) {
9271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fDescriptor->insertScalar("MissingWidth",
9281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                scaleFromFontUnits(defaultWidth, emSize));
9291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
9311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::adjustGlyphRangeForSingleByteEncoding(int16_t glyphID) {
9341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Single byte glyph encoding supports a max of 255 glyphs.
9351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fFirstGlyphID = glyphID - (glyphID - 1) % 255;
9361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fLastGlyphID > fFirstGlyphID + 255 - 1) {
9371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fLastGlyphID = fFirstGlyphID + 255 - 1;
9381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFFont::FontRec::operator==(const SkPDFFont::FontRec& b) const {
9421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFontID != b.fFontID) {
9431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
9441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFont != NULL && b.fFont != NULL) {
9461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fFont->fFirstGlyphID == b.fFont->fFirstGlyphID &&
9471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fFont->fLastGlyphID == b.fFont->fLastGlyphID;
9481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fGlyphID == 0 || b.fGlyphID == 0) {
9501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return true;
9511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFont != NULL) {
9541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fFont->fFirstGlyphID <= b.fGlyphID &&
9551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            b.fGlyphID <= fFont->fLastGlyphID;
9561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (b.fFont != NULL) {
9571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return b.fFont->fFirstGlyphID <= fGlyphID &&
9581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fGlyphID <= b.fFont->fLastGlyphID;
9591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return fGlyphID == b.fGlyphID;
9611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9631cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont::FontRec::FontRec(SkPDFFont* font, uint32_t fontID, uint16_t glyphID)
9641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    : fFont(font),
9651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      fFontID(fontID),
9661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger      fGlyphID(glyphID) {
9671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) {
9701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFontInfo == NULL || fFontInfo->fGlyphToUnicode.begin() == NULL) {
9710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return;
9720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
9731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFStream> pdfCmap =
9741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset);
9751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addResource(pdfCmap.get());  // Pass reference from new.
9761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insert("ToUnicode", new SkPDFObjRef(pdfCmap.get()))->unref();
9771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
9791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
9801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFType0Font
9811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
9821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9831cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType0Font::SkPDFType0Font(SkAdvancedTypefaceMetrics* info,
9841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkTypeface* typeface)
9851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : SkPDFFont(info, typeface, 0, false) {
9861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDEBUGCODE(fPopulated = false);
9870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
9880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
9891cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType0Font::~SkPDFType0Font() {}
9900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
9911cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) {
9921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFType0Font* newSubset = new SkPDFType0Font(fontInfo(), typeface());
9931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    newSubset->populate(subset);
9941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return newSubset;
9951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
9960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
9971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_DEBUG
9981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFType0Font::emitObject(SkWStream* stream, SkPDFCatalog* catalog,
9991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                bool indirect) {
10001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(fPopulated);
10011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return INHERITED::emitObject(stream, catalog, indirect);
10021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
10041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFType0Font::populate(const SkPDFGlyphSet* subset) {
10061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("Subtype", "Type0");
10071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("BaseFont", fontInfo()->fFontName);
10081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("Encoding", "Identity-H");
10091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPDFCIDFont* newCIDFont;
10111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    newCIDFont = new SkPDFCIDFont(fontInfo(), typeface(), subset);
10120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Pass ref new created to fResources.
10141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addResource(newCIDFont);
10151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFArray> descendantFonts = new SkPDFArray();
10161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descendantFonts->unref();  // SkRefPtr and new took a reference.
10171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descendantFonts->append(new SkPDFObjRef(newCIDFont))->unref();
10180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("DescendantFonts", descendantFonts.get());
10190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    populateToUnicodeTable(subset);
10211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDEBUGCODE(fPopulated = true);
10231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
10240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
10250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
10271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFCIDFont
10281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
10291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10301cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFCIDFont::SkPDFCIDFont(SkAdvancedTypefaceMetrics* info,
10311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           SkTypeface* typeface, const SkPDFGlyphSet* subset)
10321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : SkPDFFont(info, typeface, 0, true) {
10331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    populate(subset);
10341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10361cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFCIDFont::~SkPDFCIDFont() {}
10371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth,
10391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     const SkTDArray<uint32_t>* subset) {
10401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFDict> descriptor = new SkPDFDict("FontDescriptor");
10411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor->unref();  // SkRefPtr and new both took a ref.
10421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    setFontDescriptor(descriptor.get());
10431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (getType()) {
10451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkAdvancedTypefaceMetrics::kTrueType_Font: {
10461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkASSERT(subset);
10471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Font subsetting
10481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPDFStream* rawStream = NULL;
10491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(),
10501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  typeface(),
10511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  *subset,
10521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  &rawStream);
10531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkASSERT(fontSize);
10541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkASSERT(rawStream);
10551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkRefPtr<SkPDFStream> fontStream = rawStream;
10561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // SkRefPtr and new both ref()'d fontStream, pass one.
10571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            addResource(fontStream.get());
10581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fontStream->insertInt("Length1", fontSize);
10601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            descriptor->insert("FontFile2",
10611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                new SkPDFObjRef(fontStream.get()))->unref();
10621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
10631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
10641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkAdvancedTypefaceMetrics::kCFF_Font:
10651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkAdvancedTypefaceMetrics::kType1CID_Font: {
10661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkRefPtr<SkStream> fontData =
10671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()));
10681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fontData->unref();  // SkRefPtr and OpenStream both took a ref.
10691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkRefPtr<SkPDFStream> fontStream = new SkPDFStream(fontData.get());
10701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // SkRefPtr and new both ref()'d fontStream, pass one.
10711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            addResource(fontStream.get());
10721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (getType() == SkAdvancedTypefaceMetrics::kCFF_Font) {
10741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fontStream->insertName("Subtype", "Type1C");
10751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
10761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fontStream->insertName("Subtype", "CIDFontType0c");
10771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
10781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            descriptor->insert("FontFile3",
10791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                new SkPDFObjRef(fontStream.get()))->unref();
10801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
10811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
10821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
10831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkASSERT(false);
10840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
10850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addResource(descriptor.get());
10871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor->ref();
10881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
10901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return addCommonFontDescriptorEntries(defaultWidth);
10910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
10920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
10931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) {
10941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Generate new font metrics with advance info for true type fonts.
10951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fontInfo()->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) {
10961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Generate glyph id array.
10971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkTDArray<uint32_t> glyphIDs;
10981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glyphIDs.push(0);  // Always include glyph 0.
10991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (subset) {
11001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            subset->exportTo(&glyphIDs);
11011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
11020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
11031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRefPtr<SkAdvancedTypefaceMetrics> fontMetrics;
11041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkAdvancedTypefaceMetrics::PerGlyphInfo info;
11051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        info = SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo;
11061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
11071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
11081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint32_t* glyphs = (glyphIDs.count() == 1) ? NULL : glyphIDs.begin();
11091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0;
11101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fontMetrics =
11111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkFontHost::GetAdvancedTypefaceMetrics(
11121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkTypeface::UniqueID(typeface()),
11131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    info,
11141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    glyphs,
11151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    glyphsCount);
11161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkSafeUnref(fontMetrics.get());  // SkRefPtr and Get both took a ref
11171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        setFontInfo(fontMetrics.get());
11181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        addFontDescriptor(0, &glyphIDs);
11191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
11201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Other CID fonts
11211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        addFontDescriptor(0, NULL);
11221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
11231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("BaseFont", fontInfo()->fFontName);
11251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (getType() == SkAdvancedTypefaceMetrics::kType1CID_Font) {
11271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        insertName("Subtype", "CIDFontType0");
11281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (getType() == SkAdvancedTypefaceMetrics::kTrueType_Font) {
11291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        insertName("Subtype", "CIDFontType2");
11301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        insertName("CIDToGIDMap", "Identity");
11310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    } else {
11320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkASSERT(false);
11330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
11340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
11350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> sysInfo = new SkPDFDict;
11360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    sysInfo->unref();  // SkRefPtr and new both took a reference.
11370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    sysInfo->insert("Registry", new SkPDFString("Adobe"))->unref();
11380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    sysInfo->insert("Ordering", new SkPDFString("Identity"))->unref();
11391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    sysInfo->insertInt("Supplement", 0);
11400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("CIDSystemInfo", sysInfo.get());
11410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
11421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fontInfo()->fGlyphWidths.get()) {
11430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        int16_t defaultWidth = 0;
11440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRefPtr<SkPDFArray> widths =
11451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            composeAdvanceData(fontInfo()->fGlyphWidths.get(),
11461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               fontInfo()->fEmSize, &appendWidth,
11471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               &defaultWidth);
11480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        widths->unref();  // SkRefPtr and compose both took a reference.
11490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (widths->size())
11500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            insert("W", widths.get());
11510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (defaultWidth != 0) {
11521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            insertScalar("DW", scaleFromFontUnits(defaultWidth,
11531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  fontInfo()->fEmSize));
11540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
11550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
11561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fontInfo()->fVerticalMetrics.get()) {
11570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        struct SkAdvancedTypefaceMetrics::VerticalMetric defaultAdvance;
11580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        defaultAdvance.fVerticalAdvance = 0;
11590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        defaultAdvance.fOriginXDisp = 0;
11600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        defaultAdvance.fOriginYDisp = 0;
11610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRefPtr<SkPDFArray> advances =
11621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            composeAdvanceData(fontInfo()->fVerticalMetrics.get(),
11631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               fontInfo()->fEmSize, &appendVerticalAdvance,
11640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                               &defaultAdvance);
11650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        advances->unref();  // SkRefPtr and compose both took a ref.
11660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (advances->size())
11670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            insert("W2", advances.get());
11680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (defaultAdvance.fVerticalAdvance ||
11690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                defaultAdvance.fOriginXDisp ||
11700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                defaultAdvance.fOriginYDisp) {
11710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            insert("DW2", appendVerticalAdvance(defaultAdvance,
11721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                fontInfo()->fEmSize,
11730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                new SkPDFArray))->unref();
11740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
11750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
11761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
11781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
11791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
11811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFType1Font
11821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
11831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11841cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType1Font::SkPDFType1Font(SkAdvancedTypefaceMetrics* info,
11851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkTypeface* typeface,
11861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint16_t glyphID,
11871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkPDFDict* relatedFontDescriptor)
11881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : SkPDFFont(info, typeface, glyphID, false) {
11891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    populate(glyphID);
11901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
11911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11921cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType1Font::~SkPDFType1Font() {}
11931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) {
11951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFDict> descriptor = getFontDescriptor();
11961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (descriptor.get() != NULL) {
11971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        addResource(descriptor.get());
11981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        descriptor->ref();
11991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
12001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return true;
12011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor = new SkPDFDict("FontDescriptor");
12041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor->unref();  // SkRefPtr and new both took a ref.
12051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    setFontDescriptor(descriptor.get());
12061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t header SK_INIT_TO_AVOID_WARNING;
12081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t data SK_INIT_TO_AVOID_WARNING;
12091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t trailer SK_INIT_TO_AVOID_WARNING;
12101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkStream> rawFontData =
12111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()));
12121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    rawFontData->unref();  // SkRefPtr and OpenStream both took a ref.
12131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkStream* fontData = handleType1Stream(rawFontData.get(), &header, &data,
12141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                           &trailer);
12151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fontData == NULL) {
12161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
12171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFStream> fontStream = new SkPDFStream(fontData);
12191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // SkRefPtr and new both ref()'d fontStream, pass one.
12201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addResource(fontStream.get());
12211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fontStream->insertInt("Length1", header);
12221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fontStream->insertInt("Length2", data);
12231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fontStream->insertInt("Length3", trailer);
12241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor->insert("FontFile", new SkPDFObjRef(fontStream.get()))->unref();
12251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addResource(descriptor.get());
12271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    descriptor->ref();
12281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref();
12291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return addCommonFontDescriptorEntries(defaultWidth);
12310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
12320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFType1Font::populate(int16_t glyphID) {
12341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(!fontInfo()->fVerticalMetrics.get());
12351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(fontInfo()->fGlyphWidths.get());
12360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    adjustGlyphRangeForSingleByteEncoding(glyphID);
12380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int16_t defaultWidth = 0;
12400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry = NULL;
12410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const SkAdvancedTypefaceMetrics::WidthRange* widthEntry;
12421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (widthEntry = fontInfo()->fGlyphWidths.get();
12430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            widthEntry != NULL;
12440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            widthEntry = widthEntry->fNext.get()) {
12450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        switch (widthEntry->fType) {
12460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kDefault:
12470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                defaultWidth = widthEntry->fAdvance[0];
12480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
12490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kRun:
12500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkASSERT(false);
12510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
12520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            case SkAdvancedTypefaceMetrics::WidthRange::kRange:
12530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                SkASSERT(widthRangeEntry == NULL);
12540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                widthRangeEntry = widthEntry;
12550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                break;
12560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
12570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
12580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!addFontDescriptor(defaultWidth)) {
12600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return false;
12611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("Subtype", "Type1");
12641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("BaseFont", fontInfo()->fFontName);
12650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    addWidthInfoFromRange(defaultWidth, widthRangeEntry);
12670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> encoding = new SkPDFDict("Encoding");
12690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encoding->unref();  // SkRefPtr and new both took a reference.
12700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("Encoding", encoding.get());
12710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFArray> encDiffs = new SkPDFArray;
12730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encDiffs->unref();  // SkRefPtr and new both took a reference.
12740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encoding->insert("Differences", encDiffs.get());
12750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2);
12771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    encDiffs->appendInt(1);
12781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int gID = firstGlyphID(); gID <= lastGlyphID(); gID++) {
12791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        encDiffs->appendName(fontInfo()->fGlyphNames->get()[gID].c_str());
12800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
12810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return true;
12830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
12840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
12851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPDFType1Font::addWidthInfoFromRange(
12861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int16_t defaultWidth,
12871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry) {
12881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRefPtr<SkPDFArray> widthArray = new SkPDFArray();
12891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    widthArray->unref();  // SkRefPtr and new both took a ref.
12901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int firstChar = 0;
12911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (widthRangeEntry) {
12921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const uint16_t emSize = fontInfo()->fEmSize;
12931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int startIndex = firstGlyphID() - widthRangeEntry->fStartId;
12941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int endIndex = startIndex + lastGlyphID() - firstGlyphID() + 1;
12951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (startIndex < 0)
12961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            startIndex = 0;
12971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (endIndex > widthRangeEntry->fAdvance.count())
12981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            endIndex = widthRangeEntry->fAdvance.count();
12991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (widthRangeEntry->fStartId == 0) {
13001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            appendWidth(widthRangeEntry->fAdvance[0], emSize, widthArray.get());
13011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
13021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            firstChar = startIndex + widthRangeEntry->fStartId;
13031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
13041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = startIndex; i < endIndex; i++) {
13051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            appendWidth(widthRangeEntry->fAdvance[i], emSize, widthArray.get());
13061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
13071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
13081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        appendWidth(defaultWidth, 1000, widthArray.get());
13091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertInt("FirstChar", firstChar);
13111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertInt("LastChar", firstChar + widthArray->size() - 1);
13121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insert("Widths", widthArray.get());
13131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
13161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// class SkPDFType3Font
13171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
13181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13191cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType3Font::SkPDFType3Font(SkAdvancedTypefaceMetrics* info,
13201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkTypeface* typeface,
13211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint16_t glyphID,
13221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkPDFDict* relatedFontDescriptor)
13231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : SkPDFFont(info, typeface, glyphID, false) {
13241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    populate(glyphID);
13251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13271cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkPDFType3Font::~SkPDFType3Font() {}
13281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPDFType3Font::populate(int16_t glyphID) {
13300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPaint paint;
13311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setTypeface(typeface());
13320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setTextSize(1000);
13330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkAutoGlyphCache autoCache(paint, NULL);
13340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGlyphCache* cache = autoCache.getCache();
13350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // If fLastGlyphID isn't set (because there is not fFontInfo), look it up.
13361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (lastGlyphID() == 0) {
13371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        setLastGlyphID(cache->getGlyphCount() - 1);
13380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
13390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    adjustGlyphRangeForSingleByteEncoding(glyphID);
13410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("Subtype", "Type3");
13430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Flip about the x-axis and scale by 1/1000.
13440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMatrix fontMatrix;
13450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    fontMatrix.setScale(SkScalarInvert(1000), -SkScalarInvert(1000));
13460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("FontMatrix", SkPDFUtils::MatrixToArray(fontMatrix))->unref();
13470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> charProcs = new SkPDFDict;
13490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    charProcs->unref();  // SkRefPtr and new both took a reference.
13500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("CharProcs", charProcs.get());
13510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFDict> encoding = new SkPDFDict("Encoding");
13530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encoding->unref();  // SkRefPtr and new both took a reference.
13540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("Encoding", encoding.get());
13550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFArray> encDiffs = new SkPDFArray;
13570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encDiffs->unref();  // SkRefPtr and new both took a reference.
13580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    encoding->insert("Differences", encDiffs.get());
13591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2);
13601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    encDiffs->appendInt(1);
13610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRefPtr<SkPDFArray> widthArray = new SkPDFArray();
13630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    widthArray->unref();  // SkRefPtr and new both took a ref.
13640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkIRect bbox = SkIRect::MakeEmpty();
13661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int gID = firstGlyphID(); gID <= lastGlyphID(); gID++) {
13670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkString characterName;
13680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        characterName.printf("gid%d", gID);
13691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        encDiffs->appendName(characterName.c_str());
13700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkGlyph& glyph = cache->getGlyphIDMetrics(gID);
13721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        widthArray->appendScalar(SkFixedToScalar(glyph.fAdvanceX));
13730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkIRect glyphBBox = SkIRect::MakeXYWH(glyph.fLeft, glyph.fTop,
13740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                              glyph.fWidth, glyph.fHeight);
13750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bbox.join(glyphBBox);
13760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkDynamicMemoryWStream content;
13780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        setGlyphWidthAndBoundingBox(SkFixedToScalar(glyph.fAdvanceX), glyphBBox,
13790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                    &content);
13800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkPath* path = cache->findPath(glyph);
13810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (path) {
13820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPDFUtils::EmitPath(*path, &content);
13830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkPDFUtils::PaintPath(paint.getStyle(), path->getFillType(),
13840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                  &content);
13850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
13860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRefPtr<SkMemoryStream> glyphStream = new SkMemoryStream();
13870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        glyphStream->unref();  // SkRefPtr and new both took a ref.
13881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glyphStream->setData(content.copyToData())->unref();
13890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRefPtr<SkPDFStream> glyphDescription =
13910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            new SkPDFStream(glyphStream.get());
13920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // SkRefPtr and new both ref()'d charProcs, pass one.
13931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        addResource(glyphDescription.get());
13940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        charProcs->insert(characterName.c_str(),
13950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                          new SkPDFObjRef(glyphDescription.get()))->unref();
13960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
13970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
13980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("FontBBox", makeFontBBox(bbox, 1000))->unref();
13991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertInt("FirstChar", firstGlyphID());
14001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertInt("LastChar", lastGlyphID());
14010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    insert("Widths", widthArray.get());
14021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    insertName("CIDToGIDMap", "Identity");
14030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
14041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    populateToUnicodeTable(NULL);
14050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return true;
14060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1407