1 // Copyright 2019 The Chromium Authors. All rights reserved.
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 "components/paint_preview/common/serial_utils.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/skia/include/core/SkPicture.h"
9 #include "third_party/skia/include/core/SkRefCnt.h"
10 #include "third_party/skia/include/core/SkSerialProcs.h"
11 #include "third_party/skia/include/core/SkTypeface.h"
12
13 namespace paint_preview {
14
TEST(PaintPreviewSerialUtils,TestMakeEmptyPicture)15 TEST(PaintPreviewSerialUtils, TestMakeEmptyPicture) {
16 sk_sp<SkPicture> pic = MakeEmptyPicture();
17 ASSERT_NE(pic, nullptr);
18 auto data = pic->serialize();
19 ASSERT_NE(data, nullptr);
20 EXPECT_GE(data->size(), 0U);
21 }
22
TEST(PaintPreviewSerialUtils,TestPictureProcs)23 TEST(PaintPreviewSerialUtils, TestPictureProcs) {
24 auto pic = MakeEmptyPicture();
25 uint32_t content_id = pic->uniqueID();
26 const base::UnguessableToken kFrameGuid = base::UnguessableToken::Create();
27 PictureSerializationContext picture_ctx;
28 EXPECT_TRUE(
29 picture_ctx.insert(std::make_pair(content_id, kFrameGuid)).second);
30
31 TypefaceUsageMap usage_map;
32 TypefaceSerializationContext typeface_ctx(&usage_map);
33
34 SkSerialProcs serial_procs = MakeSerialProcs(&picture_ctx, &typeface_ctx);
35 EXPECT_EQ(serial_procs.fPictureCtx, &picture_ctx);
36 EXPECT_EQ(serial_procs.fTypefaceCtx, &typeface_ctx);
37
38 DeserializationContext deserial_ctx;
39 SkDeserialProcs deserial_procs = MakeDeserialProcs(&deserial_ctx);
40 EXPECT_EQ(deserial_procs.fPictureCtx, &deserial_ctx);
41
42 // Check that serializing then deserialize the picture works produces a
43 // correct clip rect.
44 sk_sp<SkData> serial_pic_data =
45 serial_procs.fPictureProc(pic.get(), serial_procs.fPictureCtx);
46 sk_sp<SkPicture> deserial_pic = deserial_procs.fPictureProc(
47 serial_pic_data->data(), serial_pic_data->size(),
48 deserial_procs.fPictureCtx);
49 EXPECT_TRUE(deserial_ctx.count(content_id));
50 EXPECT_EQ(deserial_ctx[content_id].x(), pic->cullRect().x());
51 EXPECT_EQ(deserial_ctx[content_id].y(), pic->cullRect().y());
52 EXPECT_EQ(deserial_ctx[content_id].width(), pic->cullRect().width());
53 EXPECT_EQ(deserial_ctx[content_id].height(), pic->cullRect().height());
54 }
55
TEST(PaintPreviewSerialUtils,TestSerialPictureNotInMap)56 TEST(PaintPreviewSerialUtils, TestSerialPictureNotInMap) {
57 PictureSerializationContext picture_ctx;
58
59 TypefaceUsageMap usage_map;
60 TypefaceSerializationContext typeface_ctx(&usage_map);
61
62 SkSerialProcs serial_procs = MakeSerialProcs(&picture_ctx, &typeface_ctx);
63 EXPECT_EQ(serial_procs.fPictureCtx, &picture_ctx);
64 EXPECT_EQ(serial_procs.fTypefaceCtx, &typeface_ctx);
65
66 auto pic = MakeEmptyPicture();
67 EXPECT_EQ(serial_procs.fPictureProc(pic.get(), serial_procs.fPictureCtx),
68 nullptr);
69 }
70
TEST(PaintPreviewSerialUtils,TestSerialTypeface)71 TEST(PaintPreviewSerialUtils, TestSerialTypeface) {
72 PictureSerializationContext picture_ctx;
73
74 auto typeface = SkTypeface::MakeDefault();
75 TypefaceUsageMap usage_map;
76 std::unique_ptr<GlyphUsage> usage =
77 std::make_unique<SparseGlyphUsage>(typeface->countGlyphs());
78 usage->Set(0);
79 usage->Set('a');
80 usage->Set('b');
81 EXPECT_TRUE(
82 usage_map.insert(std::make_pair(typeface->uniqueID(), std::move(usage)))
83 .second);
84 TypefaceSerializationContext typeface_ctx(&usage_map);
85
86 SkSerialProcs serial_procs = MakeSerialProcs(&picture_ctx, &typeface_ctx);
87 EXPECT_EQ(serial_procs.fPictureCtx, &picture_ctx);
88 EXPECT_EQ(serial_procs.fTypefaceCtx, &typeface_ctx);
89
90 EXPECT_NE(
91 serial_procs.fTypefaceProc(typeface.get(), serial_procs.fTypefaceCtx),
92 nullptr);
93 EXPECT_GT(typeface_ctx.finished.count(typeface->uniqueID()), 0U);
94 }
95
TEST(PaintPreviewSerialUtils,TestSerialNoTypefaceInMap)96 TEST(PaintPreviewSerialUtils, TestSerialNoTypefaceInMap) {
97 PictureSerializationContext picture_ctx;
98
99 auto typeface = SkTypeface::MakeDefault();
100 TypefaceUsageMap usage_map;
101 TypefaceSerializationContext typeface_ctx(&usage_map);
102
103 SkSerialProcs serial_procs = MakeSerialProcs(&picture_ctx, &typeface_ctx);
104 EXPECT_EQ(serial_procs.fPictureCtx, &picture_ctx);
105 EXPECT_EQ(serial_procs.fTypefaceCtx, &typeface_ctx);
106
107 EXPECT_NE(
108 serial_procs.fTypefaceProc(typeface.get(), serial_procs.fTypefaceCtx),
109 nullptr);
110 EXPECT_GT(typeface_ctx.finished.count(typeface->uniqueID()), 0U);
111 // Still serialize font metadata for lookup if the font is serialized again.
112 EXPECT_NE(
113 serial_procs.fTypefaceProc(typeface.get(), serial_procs.fTypefaceCtx),
114 nullptr);
115 }
116
117 } // namespace paint_preview
118