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_defaultappearance.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/fpdfdoc/cpdf_defaultappearance.h"
8
9#include <algorithm>
10#include <vector>
11
12#include "core/fpdfapi/parser/cpdf_simple_parser.h"
13#include "core/fpdfapi/parser/fpdf_parser_utility.h"
14#include "core/fxcrt/fx_string.h"
15#include "core/fxcrt/notreached.h"
16#include "core/fxge/cfx_color.h"
17
18namespace {
19
20// Find the token and its |nParams| parameters from the start of data,
21// and move the current position to the start of those parameters.
22bool FindTagParamFromStart(CPDF_SimpleParser* parser,
23 ByteStringView token,
24 int nParams) {
25 nParams++;
26
27 std::vector<uint32_t> pBuf(nParams);
28 int buf_index = 0;
29 int buf_count = 0;
30
32 while (true) {
33 pBuf[buf_index++] = parser->GetCurrentPosition();
34 if (buf_index == nParams)
35 buf_index = 0;
36
37 buf_count++;
38 if (buf_count > nParams)
39 buf_count = nParams;
40
41 ByteStringView word = parser->GetWord();
42 if (word.IsEmpty())
43 return false;
44
45 if (word == token) {
46 if (buf_count < nParams)
47 continue;
48
49 parser->SetCurrentPosition(pBuf[buf_index]);
50 return true;
51 }
52 }
53}
54
55} // namespace
56
59
61 const CPDF_DefaultAppearance& cDA) = default;
62
64
66 float* fFontSize) const {
67 *fFontSize = 0.0f;
68 if (m_csDA.IsEmpty())
69 return std::nullopt;
70
71 ByteString csFontNameTag;
72 CPDF_SimpleParser syntax(m_csDA.AsStringView().unsigned_span());
73 if (FindTagParamFromStart(&syntax, "Tf", 2)) {
74 csFontNameTag = ByteString(syntax.GetWord());
75 csFontNameTag.Delete(0, 1);
76 *fFontSize = StringToFloat(syntax.GetWord());
77 }
78 return PDF_NameDecode(csFontNameTag.AsStringView());
79}
80
82 if (m_csDA.IsEmpty())
83 return std::nullopt;
84
85 CPDF_SimpleParser syntax(m_csDA.AsStringView().unsigned_span());
86 if (FindTagParamFromStart(&syntax, "g", 1)) {
87 float gray = StringToFloat(syntax.GetWord());
89 }
90 if (FindTagParamFromStart(&syntax, "rg", 3)) {
91 float r = StringToFloat(syntax.GetWord());
92 float g = StringToFloat(syntax.GetWord());
93 float b = StringToFloat(syntax.GetWord());
95 }
96 if (FindTagParamFromStart(&syntax, "k", 4)) {
97 float c = StringToFloat(syntax.GetWord());
98 float m = StringToFloat(syntax.GetWord());
99 float y = StringToFloat(syntax.GetWord());
100 float k = StringToFloat(syntax.GetWord());
102 }
103 return std::nullopt;
104}
105
107 const {
108 std::optional<CFX_Color> maybe_color = GetColor();
109 if (!maybe_color.has_value())
110 return std::nullopt;
111
112 const CFX_Color& color = maybe_color.value();
114 int g = static_cast<int>(color.fColor1 * 255 + 0.5f);
116 ArgbEncode(255, g, g, g));
117 }
119 int r = static_cast<int>(color.fColor1 * 255 + 0.5f);
120 int g = static_cast<int>(color.fColor2 * 255 + 0.5f);
121 int b = static_cast<int>(color.fColor3 * 255 + 0.5f);
123 ArgbEncode(255, r, g, b));
124 }
126 float r = 1.0f - std::min(1.0f, color.fColor1 + color.fColor4);
127 float g = 1.0f - std::min(1.0f, color.fColor2 + color.fColor4);
128 float b = 1.0f - std::min(1.0f, color.fColor3 + color.fColor4);
131 ArgbEncode(255, static_cast<int>(r * 255 + 0.5f),
132 static_cast<int>(g * 255 + 0.5f),
133 static_cast<int>(b * 255 + 0.5f)));
134 }
136}
137
138// static
140 CPDF_SimpleParser* parser,
141 ByteStringView token,
142 int nParams) {
143 return FindTagParamFromStart(parser, token, nParams);
144}
fxcrt::ByteString ByteString
Definition bytestring.h:180
std::optional< ByteString > GetFont(float *fFontSize) const
CPDF_DefaultAppearance(const ByteString &csDA)
static bool FindTagParamFromStartForTesting(CPDF_SimpleParser *parser, ByteStringView token, int nParams)
std::optional< CFX_Color > GetColor() const
std::optional< CFX_Color::TypeAndARGB > GetColorARGB() const
CPDF_DefaultAppearance(const CPDF_DefaultAppearance &cDA)
uint32_t GetCurrentPosition() const
void SetCurrentPosition(uint32_t position)
ByteStringView GetWord()
ByteString & operator=(ByteString &&that) noexcept
constexpr FX_ARGB ArgbEncode(uint32_t a, uint32_t r, uint32_t g, uint32_t b)
Definition fx_dib.h:188
#define NOTREACHED_NORETURN()
Definition notreached.h:22
fxcrt::ByteStringView ByteStringView
TypeAndARGB(CFX_Color::Type type_in, FX_ARGB argb_in)
Definition cfx_color.h:17
float fColor4
Definition cfx_color.h:58
float fColor3
Definition cfx_color.h:57
Type nColorType
Definition cfx_color.h:54
constexpr CFX_Color(Type type=CFX_Color::Type::kTransparent, float color1=0.0f, float color2=0.0f, float color3=0.0f, float color4=0.0f)
Definition cfx_color.h:27
float fColor2
Definition cfx_color.h:56
float fColor1
Definition cfx_color.h:55