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