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