/src/harfbuzz/test/fuzzing/hb-gpu-fuzzer.cc
Line | Count | Source |
1 | | #include "hb-shape-input.hh" |
2 | | |
3 | | #include <hb-gpu.h> |
4 | | |
5 | | extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size) |
6 | 14.8k | { |
7 | 14.8k | alloc_state = _fuzzing_alloc_state (data, size); |
8 | | |
9 | 14.8k | _fuzzing_shape_input_t input; |
10 | 14.8k | if (_fuzzing_prepare_shape_input (data, size, 30, 30, &input) == HB_FUZZING_SHAPE_INPUT_MALFORMED) |
11 | 348 | return 0; |
12 | | |
13 | 14.5k | hb_gpu_draw_t *draw = hb_gpu_draw_create_or_fail (); |
14 | 14.5k | if (!draw) |
15 | 141 | return 0; |
16 | 14.3k | hb_gpu_paint_t *paint = hb_gpu_paint_create_or_fail (); |
17 | 14.3k | if (!paint) |
18 | 22 | { |
19 | 22 | hb_gpu_draw_destroy (draw); |
20 | 22 | return 0; |
21 | 22 | } |
22 | | |
23 | 14.3k | unsigned glyph_count = hb_face_get_glyph_count (input.face); |
24 | 14.3k | unsigned limit = glyph_count > 16 ? 16 : glyph_count; |
25 | | |
26 | 14.3k | volatile unsigned counter = !glyph_count; |
27 | | |
28 | 134k | for (unsigned gid = 0; gid < limit; gid++) |
29 | 119k | { |
30 | 119k | hb_gpu_draw_reset (draw); |
31 | 119k | hb_gpu_draw_glyph (draw, input.font, gid); |
32 | | |
33 | 119k | hb_glyph_extents_t extents; |
34 | 119k | hb_blob_t *blob = hb_gpu_draw_encode (draw, &extents); |
35 | 119k | counter += extents.width; |
36 | 119k | if (blob) |
37 | 117k | { |
38 | 117k | unsigned length = 0; |
39 | 117k | const char *blob_data = hb_blob_get_data (blob, &length); |
40 | 117k | counter += length; |
41 | 117k | if (blob_data && length) |
42 | 11.2k | counter += (unsigned char) blob_data[0]; |
43 | 117k | hb_gpu_draw_recycle_blob (draw, blob); |
44 | 117k | } |
45 | | |
46 | 119k | hb_gpu_paint_glyph (paint, input.font, gid); |
47 | 119k | hb_blob_t *paint_blob = hb_gpu_paint_encode (paint, &extents); |
48 | 119k | counter += extents.width; |
49 | 119k | if (paint_blob) |
50 | 114k | { |
51 | 114k | unsigned length = 0; |
52 | 114k | const char *blob_data = hb_blob_get_data (paint_blob, &length); |
53 | 114k | counter += length; |
54 | 114k | if (blob_data && length) |
55 | 72.2k | counter += (unsigned char) blob_data[0]; |
56 | 114k | hb_gpu_paint_recycle_blob (paint, paint_blob); |
57 | 114k | } |
58 | 119k | } |
59 | | |
60 | 14.3k | hb_gpu_paint_destroy (paint); |
61 | 14.3k | hb_gpu_draw_destroy (draw); |
62 | 14.3k | return counter ? 0 : 0; |
63 | 14.3k | } |