Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cpdf_docrenderdata.cpp
Go to the documentation of this file.
1// Copyright 2016 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "core/fpdfapi/render/cpdf_docrenderdata.h"
8
9#include <stdint.h>
10
11#include <algorithm>
12#include <array>
13#include <memory>
14#include <utility>
15
16#include "core/fpdfapi/font/cpdf_type3font.h"
17#include "core/fpdfapi/page/cpdf_dib.h"
18#include "core/fpdfapi/page/cpdf_function.h"
19#include "core/fpdfapi/page/cpdf_transferfunc.h"
20#include "core/fpdfapi/parser/cpdf_array.h"
21#include "core/fpdfapi/parser/cpdf_document.h"
22#include "core/fpdfapi/render/cpdf_type3cache.h"
23#include "core/fxcrt/compiler_specific.h"
24#include "core/fxcrt/fixed_size_data_vector.h"
25
26#if BUILDFLAG(IS_WIN)
27#include "core/fxge/win32/cfx_psfonttracker.h"
28#endif
29
30namespace {
31
32const int kMaxOutputs = 16;
33
34} // namespace
35
36// static
41
43
45
47 CPDF_Type3Font* font) {
48 CHECK(font);
49 auto it = m_Type3FaceMap.find(font);
50 if (it != m_Type3FaceMap.end() && it->second)
51 return pdfium::WrapRetain(it->second.Get());
52
53 auto cache = pdfium::MakeRetain<CPDF_Type3Cache>(font);
54 m_Type3FaceMap[font].Reset(cache.Get());
55 return cache;
56}
57
59 RetainPtr<const CPDF_Object> obj) {
60 CHECK(obj);
61 auto it = m_TransferFuncMap.find(obj);
62 if (it != m_TransferFuncMap.end() && it->second) {
63 return pdfium::WrapRetain(it->second.Get());
64 }
65
66 auto func = CreateTransferFunc(obj);
67 m_TransferFuncMap[obj].Reset(func.Get());
68 return func;
69}
70
71#if BUILDFLAG(IS_WIN)
72CFX_PSFontTracker* CPDF_DocRenderData::GetPSFontTracker() {
73 if (!m_PSFontTracker)
74 m_PSFontTracker = std::make_unique<CFX_PSFontTracker>();
75 return m_PSFontTracker.get();
76}
77#endif
78
80 RetainPtr<const CPDF_Object> pObj) const {
81 std::array<std::unique_ptr<CPDF_Function>, 3> pFuncs;
82 const CPDF_Array* pArray = pObj->AsArray();
83 if (pArray) {
84 if (pArray->size() < 3)
85 return nullptr;
86
87 for (uint32_t i = 0; i < 3; ++i) {
88 pFuncs[2 - i] = CPDF_Function::Load(pArray->GetDirectObjectAt(i));
89 if (!pFuncs[2 - i]) {
90 return nullptr;
91 }
92 }
93 } else {
94 pFuncs[0] = CPDF_Function::Load(pObj);
95 if (!pFuncs[0])
96 return nullptr;
97 }
98
99 float output[kMaxOutputs];
100 std::fill(std::begin(output), std::end(output), 0.0f);
101
102 bool bIdentity = true;
103 auto samples_r = FixedSizeDataVector<uint8_t>::Uninit(
104 CPDF_TransferFunc::kChannelSampleSize);
105 auto samples_g = FixedSizeDataVector<uint8_t>::Uninit(
106 CPDF_TransferFunc::kChannelSampleSize);
107 auto samples_b = FixedSizeDataVector<uint8_t>::Uninit(
108 CPDF_TransferFunc::kChannelSampleSize);
109
110 std::array<pdfium::span<uint8_t>, 3> samples = {
111 samples_r.span(), samples_g.span(), samples_b.span()};
112 if (pArray) {
113 for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
114 float input = static_cast<float>(v) / 255.0f;
115 for (int i = 0; i < 3; ++i) {
116 if (pFuncs[i]->OutputCount() > kMaxOutputs) {
117 samples[i][v] = v;
118 continue;
119 }
120 pFuncs[i]->Call(pdfium::span_from_ref(input), output);
121 size_t o = FXSYS_roundf(output[0] * 255);
122 if (o != v)
123 bIdentity = false;
124 samples[i][v] = o;
125 }
126 }
127 } else {
128 for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
129 float input = static_cast<float>(v) / 255.0f;
130 if (pFuncs[0]->OutputCount() <= kMaxOutputs) {
131 pFuncs[0]->Call(pdfium::span_from_ref(input), output);
132 }
133 size_t o = FXSYS_roundf(output[0] * 255);
134 if (o != v)
135 bIdentity = false;
136 for (auto& channel : samples)
137 channel[v] = o;
138 }
139 }
140
141 return pdfium::MakeRetain<CPDF_TransferFunc>(bIdentity, std::move(samples_r),
142 std::move(samples_g),
143 std::move(samples_b));
144}
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
Definition cpdf_array.h:29
RetainPtr< CPDF_TransferFunc > CreateTransferFunc(RetainPtr< const CPDF_Object > pObj) const
static CPDF_DocRenderData * FromDocument(const CPDF_Document *pDoc)
RetainPtr< CPDF_TransferFunc > GetTransferFunc(RetainPtr< const CPDF_Object > obj)
~CPDF_DocRenderData() override
RetainPtr< CPDF_Type3Cache > GetCachedType3(CPDF_Type3Font *font)
RenderDataIface * GetRenderData() const
int FXSYS_roundf(float f)
#define CHECK(cvref)