Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
30
namespace
{
31
32
const
int
kMaxOutputs = 16;
33
34
}
// namespace
35
36
// static
37
CPDF_DocRenderData
*
CPDF_DocRenderData
::
FromDocument
(
38
const
CPDF_Document
* pDoc) {
39
return
static_cast
<CPDF_DocRenderData*>(pDoc->GetRenderData());
40
}
41
42
CPDF_DocRenderData
::
CPDF_DocRenderData
() =
default
;
43
44
CPDF_DocRenderData
::~
CPDF_DocRenderData
() =
default
;
45
46
RetainPtr
<CPDF_Type3Cache>
CPDF_DocRenderData
::
GetCachedType3
(
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
58
RetainPtr
<CPDF_TransferFunc>
CPDF_DocRenderData
::
GetTransferFunc
(
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
)
72
CFX_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
79
RetainPtr
<CPDF_TransferFunc>
CPDF_DocRenderData
::
CreateTransferFunc
(
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
}
CPDF_Array::const_iterator
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
Definition
cpdf_array.h:29
CPDF_DocRenderData
Definition
cpdf_docrenderdata.h:32
CPDF_DocRenderData::CreateTransferFunc
RetainPtr< CPDF_TransferFunc > CreateTransferFunc(RetainPtr< const CPDF_Object > pObj) const
Definition
cpdf_docrenderdata.cpp:79
CPDF_DocRenderData::FromDocument
static CPDF_DocRenderData * FromDocument(const CPDF_Document *pDoc)
Definition
cpdf_docrenderdata.cpp:37
CPDF_DocRenderData::GetTransferFunc
RetainPtr< CPDF_TransferFunc > GetTransferFunc(RetainPtr< const CPDF_Object > obj)
Definition
cpdf_docrenderdata.cpp:58
CPDF_DocRenderData::CPDF_DocRenderData
CPDF_DocRenderData()
CPDF_DocRenderData::~CPDF_DocRenderData
~CPDF_DocRenderData() override
CPDF_DocRenderData::GetCachedType3
RetainPtr< CPDF_Type3Cache > GetCachedType3(CPDF_Type3Font *font)
Definition
cpdf_docrenderdata.cpp:46
CPDF_Document
Definition
cpdf_document.h:29
CPDF_Object
Definition
cpdf_object.h:50
fxcrt::RetainPtr
Definition
retain_ptr.h:28
pdfium::CFDETextOutLargeBitmapTest
Definition
cfde_textout_unittest.cpp:117
FXSYS_roundf
int FXSYS_roundf(float f)
Definition
fx_system.cpp:100
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
CHECK
#define CHECK(cvref)
Definition
q23utility.cpp:15
qtwebengine
src
3rdparty
chromium
third_party
pdfium
core
fpdfapi
render
cpdf_docrenderdata.cpp
Generated on
for Qt by
1.18.0