diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 643c19afa6..9d96f67a2c 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -1226,11 +1226,18 @@ void Renderer::show_empty_image(Gfx::IntSize size) m_painter.stroke_path(rect_path(image_border), Color::Black, 1); } -static ErrorOr apply_alpha_channel(NonnullRefPtr image_bitmap, NonnullRefPtr mask_bitmap) +static ErrorOr> apply_alpha_channel(NonnullRefPtr image_bitmap, NonnullRefPtr mask_bitmap) { // Make alpha mask same size as image. - if (mask_bitmap->size() != image_bitmap->size()) - mask_bitmap = TRY(mask_bitmap->scaled_to_size(image_bitmap->size())); + if (mask_bitmap->size() != image_bitmap->size()) { + // Some files have 2x2 images for color and huge masks that contain rendered text outlines. + // So resize to the larger of the two. + auto new_size = Gfx::IntSize { max(image_bitmap->width(), mask_bitmap->width()), max(image_bitmap->height(), mask_bitmap->height()) }; + if (image_bitmap->size() != new_size) + image_bitmap = TRY(image_bitmap->scaled_to_size(new_size)); + if (mask_bitmap->size() != new_size) + mask_bitmap = TRY(mask_bitmap->scaled_to_size(new_size)); + } image_bitmap->add_alpha_channel(); for (int j = 0; j < image_bitmap->height(); ++j) { @@ -1241,7 +1248,7 @@ static ErrorOr apply_alpha_channel(NonnullRefPtr image_bitmap image_bitmap->set_pixel(i, j, image_color); } } - return {}; + return image_bitmap; } PDFErrorOr Renderer::show_image(NonnullRefPtr image) @@ -1274,12 +1281,12 @@ PDFErrorOr Renderer::show_image(NonnullRefPtr image) } } else if (image_dict->contains(CommonNames::SMask)) { auto smask_bitmap = TRY(load_image(TRY(image_dict->get_stream(m_document, CommonNames::SMask)))); - TRY(apply_alpha_channel(image_bitmap.bitmap, smask_bitmap.bitmap)); + image_bitmap.bitmap = TRY(apply_alpha_channel(image_bitmap.bitmap, smask_bitmap.bitmap)); } else if (image_dict->contains(CommonNames::Mask)) { auto mask_object = TRY(image_dict->get_object(m_document, CommonNames::Mask)); if (mask_object->is()) { auto mask_bitmap = TRY(load_image(mask_object->cast())); - TRY(apply_alpha_channel(image_bitmap.bitmap, mask_bitmap.bitmap)); + image_bitmap.bitmap = TRY(apply_alpha_channel(image_bitmap.bitmap, mask_bitmap.bitmap)); } else if (mask_object->is()) { return Error::rendering_unsupported_error("/Mask array objects not yet implemented"); }