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