1 // Copyright 2019 The PDFium 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 "core/fxge/cfx_cliprgn.h"
6 #include "core/fxge/dib/cfx_dibitmap.h"
7 #include "core/fxge/fx_dib.h"
8 #include "testing/fuzzers/pdfium_fuzzer_util.h"
9 #include "third_party/base/ptr_util.h"
10 
11 namespace {
12 
13 constexpr FXDIB_Format kFormat[] = {
14     FXDIB_Invalid, FXDIB_1bppRgb,   FXDIB_8bppRgb,  FXDIB_Rgb,
15     FXDIB_Rgb32,   FXDIB_1bppMask,  FXDIB_8bppMask, FXDIB_8bppRgba,
16     FXDIB_Rgba,    FXDIB_Argb,      FXDIB_1bppCmyk, FXDIB_8bppCmyk,
17     FXDIB_Cmyk,    FXDIB_8bppCmyka, FXDIB_Cmyka};
18 
19 }  // namespace
20 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)21 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
22   constexpr size_t kParameterSize = 33;
23   if (size < kParameterSize)
24     return 0;
25 
26   int width = GetInteger(data);
27   int height = GetInteger(data + 4);
28   uint32_t argb = GetInteger(data + 8);
29   int src_left = GetInteger(data + 12);
30   int src_top = GetInteger(data + 16);
31   int dest_left = GetInteger(data + 20);
32   int dest_top = GetInteger(data + 24);
33 
34   BlendMode blend_mode = static_cast<BlendMode>(
35       data[28] % (static_cast<int>(BlendMode::kLast) + 1));
36   FXDIB_Format dest_format = kFormat[data[29] % FX_ArraySize(kFormat)];
37   FXDIB_Format src_format = kFormat[data[30] % FX_ArraySize(kFormat)];
38   bool is_clip = !(data[31] % 2);
39   bool is_rgb_byte_order = !(data[32] % 2);
40   size -= kParameterSize;
41   data += kParameterSize;
42 
43   auto src_bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
44   auto dest_bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
45   if (!src_bitmap->Create(width, height, src_format) ||
46       !dest_bitmap->Create(width, height, dest_format)) {
47     return 0;
48   }
49   if (!src_bitmap->GetBuffer() || !dest_bitmap->GetBuffer()) {
50     return 0;
51   }
52 
53   std::unique_ptr<CFX_ClipRgn> clip_rgn;
54   if (is_clip)
55     clip_rgn = pdfium::MakeUnique<CFX_ClipRgn>(width, height);
56   if (src_bitmap->IsAlphaMask()) {
57     dest_bitmap->CompositeMask(dest_left, dest_top, width, height, src_bitmap,
58                                argb, src_left, src_top, blend_mode,
59                                clip_rgn.get(), is_rgb_byte_order);
60   } else {
61     dest_bitmap->CompositeBitmap(dest_left, dest_top, width, height, src_bitmap,
62                                  src_left, src_top, blend_mode, clip_rgn.get(),
63                                  is_rgb_byte_order);
64   }
65   return 0;
66 }
67