1fb62b3d423fa34c672df42f47017dbef087d19e9halcanary/*
2fb62b3d423fa34c672df42f47017dbef087d19e9halcanary * Copyright 2015 Google Inc.
3fb62b3d423fa34c672df42f47017dbef087d19e9halcanary *
4fb62b3d423fa34c672df42f47017dbef087d19e9halcanary * Use of this source code is governed by a BSD-style license that can be
5fb62b3d423fa34c672df42f47017dbef087d19e9halcanary * found in the LICENSE file.
6fb62b3d423fa34c672df42f47017dbef087d19e9halcanary */
7fb62b3d423fa34c672df42f47017dbef087d19e9halcanary#ifndef SkPDFCanon_DEFINED
8fb62b3d423fa34c672df42f47017dbef087d19e9halcanary#define SkPDFCanon_DEFINED
9fb62b3d423fa34c672df42f47017dbef087d19e9halcanary
109b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary#include "SkBitmapKey.h"
119b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary#include "SkPDFGradientShader.h"
12be27a118c277af23377d38e9b3bfd3fcc276114fhalcanary#include "SkPDFGraphicState.h"
13fb62b3d423fa34c672df42f47017dbef087d19e9halcanary#include "SkPDFShader.h"
14fb62b3d423fa34c672df42f47017dbef087d19e9halcanary#include "SkTDArray.h"
15be27a118c277af23377d38e9b3bfd3fcc276114fhalcanary#include "SkTHash.h"
169b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary#include "SkTypeface.h"
17fb62b3d423fa34c672df42f47017dbef087d19e9halcanary
18fb62b3d423fa34c672df42f47017dbef087d19e9halcanaryclass SkPDFFont;
19209e4b1b70a5e9c2f504de15f038999ed9ee4ae5Hal Canarystruct SkAdvancedTypefaceMetrics;
207a14b310d6c618fa2151d93a43b29f9599adc32ahalcanary
21792c80f5a7b66e75d42664ccb298f31962c6654chalcanary/**
22a50151dcb5a0b8bfdef383e363e519c91d2d2c7ahalcanary *  The SkPDFCanon canonicalizes objects across PDF pages
23a50151dcb5a0b8bfdef383e363e519c91d2d2c7ahalcanary *  (SkPDFDevices) and across draw calls.
24792c80f5a7b66e75d42664ccb298f31962c6654chalcanary */
2594fd66cc2502383628b2c5fb72a445460b752c35Hal Canaryclass SkPDFCanon {
26fb62b3d423fa34c672df42f47017dbef087d19e9halcanarypublic:
27cee13425b5cd862189d1e5d7cf8f258bccae5f5dhalcanary    ~SkPDFCanon();
2894fd66cc2502383628b2c5fb72a445460b752c35Hal Canary    SkPDFCanon();
2994fd66cc2502383628b2c5fb72a445460b752c35Hal Canary    SkPDFCanon(const SkPDFCanon&) = delete;
3094fd66cc2502383628b2c5fb72a445460b752c35Hal Canary    SkPDFCanon& operator=(const SkPDFCanon&) = delete;
312e3f9d8a9309686eeb4c76ccfde5800da87a68b3halcanary
32ec2576864139967dc0359c5ec5223625123354fbHal Canary    SkTHashMap<SkPDFImageShaderKey, sk_sp<SkPDFObject>> fImageShaderMap;
33530ea8e24bc88f2d7973c35a703f18c1dafb56dchalcanary
342d171397f863699eb7804b814994d4c2fcb00cb7Hal Canary    SkPDFGradientShader::HashMap fGradientPatternMap;
35fb62b3d423fa34c672df42f47017dbef087d19e9halcanary
365c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    SkTHashMap<SkBitmapKey, sk_sp<SkPDFObject>> fPDFBitmapMap;
3766a82f3872abf4ebb98b3915b2a9ecc73ad352c5halcanary
38209e4b1b70a5e9c2f504de15f038999ed9ee4ae5Hal Canary    SkTHashMap<uint32_t, std::unique_ptr<SkAdvancedTypefaceMetrics>> fTypefaceMetrics;
395c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    SkTHashMap<uint32_t, sk_sp<SkPDFDict>> fFontDescriptors;
405c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    SkTHashMap<uint64_t, sk_sp<SkPDFFont>> fFontMap;
41712fdf7603c62820b21174da9b0a2071c174936bhalcanary
4280fa7cea93974b0480f35f7a5260ce78ba50420fHal Canary    SkTHashMap<SkPDFStrokeGraphicState, sk_sp<SkPDFDict>> fStrokeGSMap;
4380fa7cea93974b0480f35f7a5260ce78ba50420fHal Canary    SkTHashMap<SkPDFFillGraphicState, sk_sp<SkPDFDict>> fFillGSMap;
4480fa7cea93974b0480f35f7a5260ce78ba50420fHal Canary
455c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    sk_sp<SkPDFStream> fInvertFunction;
465c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    sk_sp<SkPDFDict> fNoSmaskGraphicState;
475c1b360a89f85accd7dc446670f6f062c73e7e77Hal Canary    sk_sp<SkPDFArray> fRangeObject;
489b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary
499b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    SK_BEGIN_REQUIRE_DENSE
509b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    struct BitmapGlyphKey {
519b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkFontID fFontID;      // uint32_t
529b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkScalar fTextSize;    // float32
539b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkScalar fTextScaleX;  // float32
549b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkScalar fTextSkewX;   // float32
559b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkGlyphID fGlyphID;    // uint16_t
569b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        uint16_t fPadding;
579b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    };
589b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    SK_END_REQUIRE_DENSE
599b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    struct BitmapGlyph {
609b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        sk_sp<SkImage> fImage;
619b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary        SkIPoint fOffset;
629b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    };
639b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary    SkTHashMap<BitmapGlyphKey, BitmapGlyph> fBitmapGlyphImages;
64fb62b3d423fa34c672df42f47017dbef087d19e9halcanary};
659b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary
669b9510a71182ab88cd82effd6728aaa0584b8dccHal Canaryinline bool operator==(const SkPDFCanon::BitmapGlyphKey& u, const SkPDFCanon::BitmapGlyphKey& v) {
671d746208a1335a192433923b4a818ded3978228dMike Klein    return memcmp(&u, &v, sizeof(SkPDFCanon::BitmapGlyphKey)) == 0;
689b9510a71182ab88cd82effd6728aaa0584b8dccHal Canary}
69fb62b3d423fa34c672df42f47017dbef087d19e9halcanary#endif  // SkPDFCanon_DEFINED
70