blob: a804d6b47b9240506550683737b79fcee6ae5d5f [file] [log] [blame]
halcanaryfb62b3d2015-01-21 09:59:14 -08001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
halcanary7a14b312015-10-01 07:28:13 -07008#include "SkImage.h"
halcanary1b5c6042015-02-18 11:29:56 -08009#include "SkPDFBitmap.h"
halcanaryfb62b3d2015-01-21 09:59:14 -080010#include "SkPDFCanon.h"
11#include "SkPDFFont.h"
halcanaryfb62b3d2015-01-21 09:59:14 -080012
13////////////////////////////////////////////////////////////////////////////////
14
halcanarycee13422016-08-18 09:52:48 -070015namespace {
16template <typename K, typename V> struct UnrefValue {
17 void operator()(K, V** v) { SkSafeUnref(*v); }
18};
19}
halcanarydabd4f02016-08-03 11:16:56 -070020
halcanarycee13422016-08-18 09:52:48 -070021SkPDFCanon::~SkPDFCanon() {
halcanarydabd4f02016-08-03 11:16:56 -070022 // TODO(halcanary): make SkTHashSet work nicely with sk_sp<>,
23 // or use std::unordered_set<>
halcanarybe27a112015-04-01 13:31:19 -070024 fGraphicStateRecords.foreach ([](WrapGS w) { w.fPtr->unref(); });
halcanarycee13422016-08-18 09:52:48 -070025 fPDFBitmapMap.foreach(UnrefValue<SkBitmapKey, SkPDFObject>());
26 fTypefaceMetrics.foreach(UnrefValue<uint32_t, SkAdvancedTypefaceMetrics>());
27 fFontDescriptors.foreach(UnrefValue<uint32_t, SkPDFDict>());
28 fFontMap.foreach(UnrefValue<uint64_t, SkPDFFont>());
halcanary2e3f9d82015-02-27 12:41:03 -080029}
halcanaryfb62b3d2015-01-21 09:59:14 -080030
halcanarycee13422016-08-18 09:52:48 -070031void SkPDFCanon::reset() {
32 this->~SkPDFCanon();
33 new (this)SkPDFCanon;
halcanaryfb62b3d2015-01-21 09:59:14 -080034}
35
halcanaryfb62b3d2015-01-21 09:59:14 -080036////////////////////////////////////////////////////////////////////////////////
37
halcanarydabd4f02016-08-03 11:16:56 -070038template <typename T>
39sk_sp<SkPDFObject> find_shader(const SkTArray<T>& records,
40 const SkPDFShader::State& state) {
41 for (const T& record : records) {
42 if (record.fShaderState == state) {
43 return record.fShaderObject;
44 }
45 }
46 return nullptr;
47}
48
49sk_sp<SkPDFObject> SkPDFCanon::findFunctionShader(
halcanary530ea8e2015-01-23 06:17:35 -080050 const SkPDFShader::State& state) const {
halcanarydabd4f02016-08-03 11:16:56 -070051 return find_shader(fFunctionShaderRecords, state);
halcanary530ea8e2015-01-23 06:17:35 -080052}
halcanarydabd4f02016-08-03 11:16:56 -070053void SkPDFCanon::addFunctionShader(sk_sp<SkPDFObject> pdfShader,
54 SkPDFShader::State state) {
55 fFunctionShaderRecords.emplace_back(std::move(state), std::move(pdfShader));
halcanaryfb62b3d2015-01-21 09:59:14 -080056}
57
halcanarydabd4f02016-08-03 11:16:56 -070058sk_sp<SkPDFObject> SkPDFCanon::findAlphaShader(
halcanary530ea8e2015-01-23 06:17:35 -080059 const SkPDFShader::State& state) const {
halcanarydabd4f02016-08-03 11:16:56 -070060 return find_shader(fAlphaShaderRecords, state);
halcanary530ea8e2015-01-23 06:17:35 -080061}
halcanarydabd4f02016-08-03 11:16:56 -070062void SkPDFCanon::addAlphaShader(sk_sp<SkPDFObject> pdfShader,
63 SkPDFShader::State state) {
64 fAlphaShaderRecords.emplace_back(std::move(state), std::move(pdfShader));
halcanaryfb62b3d2015-01-21 09:59:14 -080065}
66
halcanarydabd4f02016-08-03 11:16:56 -070067sk_sp<SkPDFObject> SkPDFCanon::findImageShader(
halcanary530ea8e2015-01-23 06:17:35 -080068 const SkPDFShader::State& state) const {
halcanarydabd4f02016-08-03 11:16:56 -070069 return find_shader(fImageShaderRecords, state);
halcanary530ea8e2015-01-23 06:17:35 -080070}
71
halcanarydabd4f02016-08-03 11:16:56 -070072void SkPDFCanon::addImageShader(sk_sp<SkPDFObject> pdfShader,
73 SkPDFShader::State state) {
74 fImageShaderRecords.emplace_back(std::move(state), std::move(pdfShader));
halcanaryfb62b3d2015-01-21 09:59:14 -080075}
76
77////////////////////////////////////////////////////////////////////////////////
78
halcanarybe27a112015-04-01 13:31:19 -070079const SkPDFGraphicState* SkPDFCanon::findGraphicState(
80 const SkPDFGraphicState& key) const {
81 const WrapGS* ptr = fGraphicStateRecords.find(WrapGS(&key));
halcanary96fcdcc2015-08-27 07:41:13 -070082 return ptr ? ptr->fPtr : nullptr;
halcanaryfb62b3d2015-01-21 09:59:14 -080083}
84
halcanarybe27a112015-04-01 13:31:19 -070085void SkPDFCanon::addGraphicState(const SkPDFGraphicState* state) {
86 SkASSERT(state);
87 WrapGS w(SkRef(state));
88 SkASSERT(!fGraphicStateRecords.contains(w));
89 fGraphicStateRecords.add(w);
halcanaryfb62b3d2015-01-21 09:59:14 -080090}
halcanary1b5c6042015-02-18 11:29:56 -080091
92////////////////////////////////////////////////////////////////////////////////
93
halcanarya50151d2016-03-25 11:57:49 -070094sk_sp<SkPDFObject> SkPDFCanon::findPDFBitmap(SkBitmapKey key) const {
95 SkPDFObject** ptr = fPDFBitmapMap.find(key);
96 return ptr ? sk_ref_sp(*ptr) : sk_sp<SkPDFObject>();
halcanary1b5c6042015-02-18 11:29:56 -080097}
98
halcanarya50151d2016-03-25 11:57:49 -070099void SkPDFCanon::addPDFBitmap(SkBitmapKey key, sk_sp<SkPDFObject> pdfBitmap) {
100 fPDFBitmapMap.set(key, pdfBitmap.release());
halcanary7a14b312015-10-01 07:28:13 -0700101}
102
halcanarya50151d2016-03-25 11:57:49 -0700103////////////////////////////////////////////////////////////////////////////////
halcanary1437c1e2016-03-13 18:30:24 -0700104
105sk_sp<SkPDFStream> SkPDFCanon::makeInvertFunction() {
106 if (fInvertFunction) {
107 return fInvertFunction;
108 }
109 fInvertFunction = SkPDFGraphicState::MakeInvertFunction();
110 return fInvertFunction;
111}
112sk_sp<SkPDFDict> SkPDFCanon::makeNoSmaskGraphicState() {
113 if (fNoSmaskGraphicState) {
114 return fNoSmaskGraphicState;
115 }
116 fNoSmaskGraphicState = SkPDFGraphicState::MakeNoSmaskGraphicState();
117 return fNoSmaskGraphicState;
118}
119sk_sp<SkPDFArray> SkPDFCanon::makeRangeObject() {
120 if (fRangeObject) {
121 return fRangeObject;
122 }
123 fRangeObject = SkPDFShader::MakeRangeObject();
124 return fRangeObject;
125}