1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google, LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
18*c8dee2aaSAndroid Build Coastguard Worker
FuzzCOLRv1(const uint8_t * data,size_t size)19*c8dee2aaSAndroid Build Coastguard Worker void FuzzCOLRv1(const uint8_t* data, size_t size) {
20*c8dee2aaSAndroid Build Coastguard Worker // We do not want the portable fontmgr here, as it does not allow creation of fonts from bytes.
21*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkFontMgr> mgr = ToolUtils::TestFontMgr();
22*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkStreamAsset> stream = SkMemoryStream::MakeDirect(data, size);
23*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkTypeface> typeface = mgr->makeFromStream(std::move(stream), 0);
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker if (!typeface) {
26*c8dee2aaSAndroid Build Coastguard Worker return;
27*c8dee2aaSAndroid Build Coastguard Worker }
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker auto s = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(128, 128));
30*c8dee2aaSAndroid Build Coastguard Worker if (!s) {
31*c8dee2aaSAndroid Build Coastguard Worker return;
32*c8dee2aaSAndroid Build Coastguard Worker }
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker // Place at a baseline in the lower part of the canvas square, but canvas size and baseline
35*c8dee2aaSAndroid Build Coastguard Worker // placement are chosen arbitrarily and we just need to cover colrv1 rendering in this
36*c8dee2aaSAndroid Build Coastguard Worker // fuzz test.
37*c8dee2aaSAndroid Build Coastguard Worker SkFont colrv1Font = SkFont(typeface, 120);
38*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = s->getCanvas();
39*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
40*c8dee2aaSAndroid Build Coastguard Worker int numGlyphs = typeface->countGlyphs();
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < std::min(numGlyphs, 10); ++i) {
43*c8dee2aaSAndroid Build Coastguard Worker SkPoint origin = SkPoint::Make(10, 108);
44*c8dee2aaSAndroid Build Coastguard Worker SkPoint position = SkPoint::Make(0, 0);
45*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID glyphId = i;
46*c8dee2aaSAndroid Build Coastguard Worker canvas->drawGlyphs(1, &glyphId, &position, origin, colrv1Font, paint);
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker }
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_LIBFUZZER)
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)51*c8dee2aaSAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
52*c8dee2aaSAndroid Build Coastguard Worker // COLRv1 corpus file sizes range from 8k for a small test glyph file to about 80k covering
53*c8dee2aaSAndroid Build Coastguard Worker // most of the complex Noto Emoji glyphs, compare:
54*c8dee2aaSAndroid Build Coastguard Worker // See https://github.com/googlefonts/color-fonts/blob/main/rebuild_fuzzer_corpus.py
55*c8dee2aaSAndroid Build Coastguard Worker if (size > 80 * 1024) {
56*c8dee2aaSAndroid Build Coastguard Worker return 0;
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker FuzzCOLRv1(data, size);
59*c8dee2aaSAndroid Build Coastguard Worker return 0;
60*c8dee2aaSAndroid Build Coastguard Worker }
61*c8dee2aaSAndroid Build Coastguard Worker #endif
62