// Copyright 2020 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { const int kMaxXResolution = 6000; const int kMaxYResolution = 6000; const int kMaxLineThickness = 10; const double kMaxFontScale = 10.0; FuzzedDataProvider fuzz_provider(data, size); int fuzz_font_face = fuzz_provider.PickValueInArray( {cv::FONT_HERSHEY_SIMPLEX, cv::FONT_HERSHEY_PLAIN, cv::FONT_HERSHEY_DUPLEX, cv::FONT_HERSHEY_COMPLEX, cv::FONT_HERSHEY_TRIPLEX, cv::FONT_HERSHEY_COMPLEX_SMALL, cv::FONT_HERSHEY_SCRIPT_SIMPLEX, cv::FONT_HERSHEY_SCRIPT_COMPLEX}); int fuzz_linetype = fuzz_provider.PickValueInArray({ cv::LINE_8, // 8-connected line cv::LINE_4, // 4-connected line cv::LINE_AA // anti-aliased line }); double fuzz_font_scale = fuzz_provider.ConsumeFloatingPointInRange(0.0, kMaxFontScale); int fuzz_width = fuzz_provider.ConsumeIntegralInRange(0, kMaxXResolution); int fuzz_height = fuzz_provider.ConsumeIntegralInRange(0, kMaxYResolution); int fuzz_x_pos = fuzz_provider.ConsumeIntegralInRange(0, kMaxXResolution); int fuzz_y_pos = fuzz_provider.ConsumeIntegralInRange(0, kMaxYResolution); int fuzz_thickness = fuzz_provider.ConsumeIntegralInRange(0, kMaxLineThickness); std::vector color_scalar_vals; std::vector canvas_fill_scalar_vals; // Ensure that all 3D vectors are fully populated, // even if fuzz_provider is exhausted. for (int i = 0; i < 3; i++) { color_scalar_vals.insert(color_scalar_vals.begin(), fuzz_provider.ConsumeIntegralInRange(0, 255)); canvas_fill_scalar_vals.insert( canvas_fill_scalar_vals.begin(), fuzz_provider.ConsumeIntegralInRange(0, 255)); } cv::Scalar fuzz_color(color_scalar_vals[0], color_scalar_vals[1], color_scalar_vals[2]); cv::Scalar fuzz_canvas_fill(canvas_fill_scalar_vals[0], canvas_fill_scalar_vals[1], canvas_fill_scalar_vals[2]); cv::Point fuzz_text_pos(fuzz_x_pos, fuzz_y_pos); cv::Mat fuzz_canvas(fuzz_height, fuzz_width, CV_8UC3, fuzz_canvas_fill); std::basic_string fuzz_annotation = fuzz_provider.ConsumeRemainingBytesAsString(); cv::putText(fuzz_canvas, fuzz_annotation, fuzz_text_pos, fuzz_font_face, fuzz_font_scale, fuzz_color, fuzz_thickness, fuzz_linetype); return 0; }