1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "color_filter_fuzzer.h"
17 #include <cstddef>
18 #include <cstdint>
19 #include "get_object.h"
20 #include "effect/color_filter.h"
21
22 namespace OHOS {
23 namespace Rosen {
24 namespace {
25 constexpr size_t BLENDMODE_SIZE = 29;
26 constexpr size_t FILTERTYPE_SIZE = 8;
27 constexpr size_t MATRIX_SIZE = 20;
28 constexpr size_t OVER_DRAW_COLOR_NUM = 6;
29 } // namespace
30 namespace Drawing {
ColorFilterFuzzTest001(const uint8_t * data,size_t size)31 bool ColorFilterFuzzTest001(const uint8_t* data, size_t size)
32 {
33 if (data == nullptr) {
34 return false;
35 }
36 // initialize
37 g_data = data;
38 g_size = size;
39 g_pos = 0;
40
41 std::shared_ptr<ColorFilter> colorFilter = ColorFilter::CreateLinearToSrgbGamma();
42 colorFilter->Deserialize(nullptr);
43 colorFilter->Serialize();
44 colorFilter->GetType();
45 colorFilter->GetDrawingType();
46 const size_t MATRIX_SIZE = 20;
47 float matrix[MATRIX_SIZE];
48 colorFilter->AsAColorMatrix(matrix);
49 float f1[MATRIX_SIZE];
50 float f2[MATRIX_SIZE];
51 colorFilter->InitWithCompose(f1, f2);
52
53 return true;
54 }
55
ColorFilterFuzzTest002(const uint8_t * data,size_t size)56 bool ColorFilterFuzzTest002(const uint8_t* data, size_t size)
57 {
58 if (data == nullptr) {
59 return false;
60 }
61 // initialize
62 g_data = data;
63 g_size = size;
64 g_pos = 0;
65 ColorQuad colorQuad = GetObject<ColorQuad>();
66 uint32_t mode = GetObject<uint32_t>();
67 uint32_t type = GetObject<uint32_t>();
68 ColorFilter colorFilter = ColorFilter(static_cast<ColorFilter::FilterType>(type % FILTERTYPE_SIZE), colorQuad,
69 static_cast<BlendMode>(mode % BLENDMODE_SIZE));
70 ColorMatrix matrix;
71 ColorFilter colorFilterOne = ColorFilter(static_cast<ColorFilter::FilterType>(type % FILTERTYPE_SIZE), matrix);
72 std::shared_ptr<ColorFilter> colorFilterTwo = ColorFilter::CreateBlendModeColorFilter(colorQuad,
73 static_cast<BlendMode>(mode % BLENDMODE_SIZE));
74 std::shared_ptr<ColorFilter> colorFilterThree = ColorFilter::CreateComposeColorFilter(colorFilter, colorFilterOne);
75 float fOne[MATRIX_SIZE];
76 for (size_t i = 0; i < MATRIX_SIZE; i++) {
77 fOne[i] = GetObject<float>();
78 }
79 float fTwo[MATRIX_SIZE];
80 for (size_t i = 0; i < MATRIX_SIZE; i++) {
81 fTwo[i] = GetObject<float>();
82 }
83 std::shared_ptr<ColorFilter> colorFilterFour = ColorFilter::CreateComposeColorFilter(fOne, fTwo);
84 std::shared_ptr<ColorFilter> colorFilterFive = ColorFilter::CreateMatrixColorFilter(matrix);
85 std::shared_ptr<ColorFilter> colorFilterSix = ColorFilter::CreateFloatColorFilter(fOne);
86 std::shared_ptr<ColorFilter> colorFilterSeven = ColorFilter::CreateSrgbGammaToLinear();
87 ColorQuad colors[OVER_DRAW_COLOR_NUM];
88 for (size_t i = 0; i < OVER_DRAW_COLOR_NUM; i++) {
89 colors[i] = GetObject<ColorQuad>();
90 }
91 std::shared_ptr<ColorFilter> colorFilterEight = ColorFilter::CreateOverDrawColorFilter(colors);
92 std::shared_ptr<ColorFilter> colorFilterNine = ColorFilter::CreateLumaColorFilter();
93 return true;
94 }
95
96 } // namespace Drawing
97 } // namespace Rosen
98 } // namespace OHOS
99
100 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)101 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
102 {
103 /* Run your code on data */
104 OHOS::Rosen::Drawing::ColorFilterFuzzTest001(data, size);
105 OHOS::Rosen::Drawing::ColorFilterFuzzTest002(data, size);
106 return 0;
107 }
108