blob: a48f7fd1161bd8afd19d6b89bf2afe96e49c23eb [file] [edit]
#include "hb-shape-input.hh"
#include <hb-raster.h>
extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
{
alloc_state = _fuzzing_alloc_state (data, size);
_fuzzing_shape_input_t input;
if (_fuzzing_prepare_shape_input (data, size, 30, 30, &input) == HB_FUZZING_SHAPE_INPUT_MALFORMED)
return 0;
hb_raster_draw_t *draw = hb_raster_draw_create_or_fail ();
hb_raster_paint_t *paint = hb_raster_paint_create_or_fail ();
if (!draw || !paint)
{
hb_raster_draw_destroy (draw);
hb_raster_paint_destroy (paint);
return 0;
}
hb_raster_paint_set_foreground (paint, HB_COLOR (0, 0, 0, 255));
/* Cap font scale so malicious fonts don't produce huge surfaces. */
int x_scale, y_scale;
hb_font_get_scale (input.font, &x_scale, &y_scale);
if (x_scale > 1000 || x_scale < -1000) x_scale = 1000;
if (y_scale > 1000 || y_scale < -1000) y_scale = 1000;
hb_font_set_scale (input.font, x_scale, y_scale);
unsigned glyph_count = hb_face_get_glyph_count (input.face);
unsigned limit = glyph_count > 16 ? 16 : glyph_count;
volatile unsigned counter = !glyph_count;
for (unsigned gid = 0; gid < limit; gid++)
{
float x = (float) ((gid % 4) * 40);
float y = (float) ((gid / 4) * 40);
hb_raster_draw_set_transform (draw, 1.f, 0.f, 0.f, 1.f, x, y);
hb_raster_draw_glyph (draw, input.font, gid);
hb_raster_paint_set_transform (paint, 1.f, 0.f, 0.f, 1.f, x, y);
hb_raster_paint_glyph (paint, input.font, gid);
}
hb_raster_image_t *draw_image = hb_raster_draw_render (draw);
if (draw_image)
{
hb_raster_extents_t ext;
hb_raster_image_get_extents (draw_image, &ext);
counter += ext.width + ext.height + (unsigned) (ext.x_origin != 0) + (unsigned) (ext.y_origin != 0);
const uint8_t *buf = hb_raster_image_get_buffer (draw_image);
if (buf && ext.height && ext.stride)
counter += buf[0];
hb_raster_draw_recycle_image (draw, draw_image);
}
hb_raster_image_t *paint_image = hb_raster_paint_render (paint);
if (paint_image)
{
hb_raster_extents_t ext;
hb_raster_image_get_extents (paint_image, &ext);
counter += ext.width + ext.height + (unsigned) (ext.x_origin != 0) + (unsigned) (ext.y_origin != 0);
const uint8_t *buf = hb_raster_image_get_buffer (paint_image);
if (buf && ext.height && ext.stride)
counter += buf[0];
hb_raster_paint_recycle_image (paint, paint_image);
}
hb_raster_draw_destroy (draw);
hb_raster_paint_destroy (paint);
return counter ? 0 : 0;
}