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
cfde_textout_unittest.cpp
Go to the documentation of this file.
1// Copyright 2022 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#include "xfa/fde/cfde_textout.h"
6
7#include <memory>
8
9#include "build/build_config.h"
10#include "core/fdrm/fx_crypt.h"
11#include "core/fxcrt/bytestring.h"
12#include "core/fxcrt/fx_codepage.h"
13#include "core/fxcrt/fx_coordinates.h"
14#include "core/fxcrt/retain_ptr.h"
15#include "core/fxge/cfx_defaultrenderdevice.h"
16#include "core/fxge/cfx_glyphcache.h"
17#include "core/fxge/dib/cfx_dibitmap.h"
18#include "testing/gtest/include/gtest/gtest.h"
19#include "testing/utils/hash.h"
20#include "xfa/fgas/font/cfgas_fontmgr.h"
21#include "xfa/fgas/font/cfgas_gefont.h"
22#include "xfa/fgas/font/cfgas_gemodule.h"
23
24class CFDETextOutTest : public testing::Test {
25 public:
26 CFDETextOutTest() = default;
28
29 void SetUp() override {
30#if defined(PDF_USE_SKIA)
31 CFX_GlyphCache::InitializeGlobals();
32#endif
33 CFX_Size bitmap_size = GetBitmapSize();
34 bitmap_ = pdfium::MakeRetain<CFX_DIBitmap>();
35 ASSERT_TRUE(bitmap_->Create(bitmap_size.width, bitmap_size.height,
36 FXDIB_Format::kArgb));
37
38 device_ = std::make_unique<CFX_DefaultRenderDevice>();
39 device_->Attach(bitmap_);
40
41 font_ = LoadFont();
42 ASSERT_TRUE(font_);
43
44 text_out_ = std::make_unique<CFDE_TextOut>();
45 text_out_->SetFont(font_);
46 text_out_->SetFontSize(12.0f);
47
49 }
50
52 // reverse order form SetUp()
53 text_out_.reset();
54 font_.Reset();
55 device_.reset();
56 bitmap_.Reset();
57#if defined(PDF_USE_SKIA)
58 CFX_GlyphCache::DestroyGlobals();
59#endif
60 }
61
62 virtual RetainPtr<CFGAS_GEFont> LoadFont() {
63 const wchar_t kFontFamily[] = L"Arimo Bold";
64 return CFGAS_GEFont::LoadFont(kFontFamily, /*dwFontStyles=*/0,
66 }
67
68 virtual CFX_Size GetBitmapSize() { return CFX_Size(200, 100); }
69
70 virtual const char* GetEmptyBitmapChecksum() {
71 static const char kEmptyBitmapChecksum[] =
72 "a042237c5493fdb9656b94a83608d11a";
73 return kEmptyBitmapChecksum;
74 }
75
76 CFX_DefaultRenderDevice* device() { return device_.get(); }
77 CFDE_TextOut& text_out() { return *text_out_; }
78
79 ByteString GetBitmapChecksum() {
81 for (int i = 0; i < bitmap_->GetHeight(); ++i)
82 CRYPT_MD5Update(&context, bitmap_->GetScanline(i));
83 uint8_t digest[16];
84 CRYPT_MD5Finish(&context, digest);
85 return ByteString(CryptToBase16(digest).c_str());
86 }
87
88 private:
89 RetainPtr<CFX_DIBitmap> bitmap_;
90 std::unique_ptr<CFX_DefaultRenderDevice> device_;
91 RetainPtr<CFGAS_GEFont> font_;
92 std::unique_ptr<CFDE_TextOut> text_out_;
93};
94
96 text_out().DrawLogicText(device(), L"foo", CFX_RectF(0, 0, 2100, 100));
97 const char* checksum = []() {
98#if BUILDFLAG(IS_WIN)
99 if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
100 return "cdd8f00144e421bf18f22d09896838b0";
101 }
102#endif
103 return "b26f1c171fcdbf185823364185adacf0";
104 }();
105 EXPECT_STREQ(checksum, GetBitmapChecksum().c_str());
106}
107
109 text_out().DrawLogicText(device(), L"foo", CFX_RectF());
110 EXPECT_STREQ(GetEmptyBitmapChecksum(), GetBitmapChecksum().c_str());
111}
112
113#if !BUILDFLAG(IS_WIN)
114// This test depends on a particular font being present.
115class CFDETextOutLargeBitmapTest : public CFDETextOutTest {
116 public:
117 CFDETextOutLargeBitmapTest() = default;
118 ~CFDETextOutLargeBitmapTest() override = default;
119
120 RetainPtr<CFGAS_GEFont> LoadFont() override {
121 const wchar_t kFontFamily[] = L"DejaVu Sans";
122 auto* font_manager = CFGAS_GEModule::Get()->GetFontMgr();
123 return font_manager->LoadFont(kFontFamily, /*dwFontStyles=*/0,
124 FX_CodePage::kFailure);
125 }
126
127 CFX_Size GetBitmapSize() override { return CFX_Size(2100, 20); }
128
129 const char* GetEmptyBitmapChecksum() override {
130 static const char kEmptyLargeBitmapChecksum[] =
131 "101745f76351fd5d916bf3817b71563c";
132 return kEmptyLargeBitmapChecksum;
133 }
134
135 const char* GetLargeTextBlobChecksum() {
136 if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
137 return "cd357c6afbf17bb2ac48817df5d9eaad";
138 }
139 return "268b71a8660b51e31c6bf30fc7ff1e08";
140 }
141};
142
143TEST_F(CFDETextOutLargeBitmapTest, DrawLogicTextBug953881) {
144 FDE_TextStyle styles;
145 styles.single_line_ = true;
146 text_out().SetStyles(styles);
147 text_out().SetAlignment(FDE_TextAlignment::kCenterLeft);
148 text_out().SetFontSize(10.0f);
149
150 static const wchar_t kText[] =
151 L"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"
152 L"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSssssssssss"
153 L"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
154 L"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
155 L"sssssssssssssssssssssssssssssssssssssssssssssssssnnnnnnnnnnn"
156 "\xfeba"
157 L"Sssssssssssssssssss"
158 "\xfeba"
159 L"iiiiisssss";
160 text_out().DrawLogicText(device(), WideString(kText),
161 CFX_RectF(3, 3, 2048, 10));
162 EXPECT_STREQ(GetLargeTextBlobChecksum(), GetBitmapChecksum().c_str());
163}
164
165TEST_F(CFDETextOutLargeBitmapTest, DrawLogicTextBug1342078) {
166 FDE_TextStyle styles;
167 styles.single_line_ = true;
168 text_out().SetStyles(styles);
169 text_out().SetAlignment(FDE_TextAlignment::kCenterLeft);
170 text_out().SetFontSize(10.0f);
171
172 static const wchar_t kText[] =
173 L"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"
174 L"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSssssssssss"
175 L"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
176 L"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
177 L"sssssssssssssssssssssssssssssssssssssssssssssssssnnnnnnnnnnn"
178 "\xfeba"
179 L"Sssssssssssssssssss"
180 "\xfeba"
181 L"iiiiiiiiiisssss";
182 text_out().DrawLogicText(device(), WideString(kText),
183 CFX_RectF(3, 3, 2048, 10));
184 EXPECT_STREQ(GetLargeTextBlobChecksum(), GetBitmapChecksum().c_str());
185}
186#endif // !BUILDFLAG(IS_WIN)
TEST_F(CFDETextOutTest, DrawLogicTextBasic)
CFDE_TextOut & text_out()
virtual RetainPtr< CFGAS_GEFont > LoadFont()
CFDETextOutTest()=default
virtual CFX_Size GetBitmapSize()
~CFDETextOutTest() override=default
virtual const char * GetEmptyBitmapChecksum()
CFX_DefaultRenderDevice * device()
constexpr CFX_RectF()=default
constexpr CFX_RectF(float dst_left, float dst_top, float dst_width, float dst_height)
const char * c_str() const
Definition bytestring.h:76
FX_CodePage
Definition fx_codepage.h:18
void CRYPT_MD5Finish(CRYPT_md5_context *context, uint8_t digest[16])
Definition fx_crypt.cpp:214
CRYPT_md5_context CRYPT_MD5Start()
Definition fx_crypt.cpp:176
std::string CryptToBase16(const uint8_t *digest)
Definition hash.cpp:9