1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 22:48:11 +00:00

LibPDF/PDFViewer: Support rotated pages

This commit is contained in:
Matthew Olsson 2021-05-10 11:52:48 -07:00 committed by Andreas Kling
parent fbe712e265
commit d5f94aaa7b
3 changed files with 22 additions and 3 deletions

View file

@ -87,5 +87,16 @@ RefPtr<Gfx::Bitmap> PDFViewer::render_page(const PDF::Page& page)
auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, { width, height });
PDF::Renderer::render(*m_document, page, bitmap);
if (page.rotate != 0) {
int rotation_count = (page.rotate / 90) % 4;
if (rotation_count == 3) {
bitmap = bitmap->rotated(Gfx::RotationDirection::CounterClockwise);
} else {
for (int i = 0; i < rotation_count; i++)
bitmap = bitmap->rotated(Gfx::RotationDirection::Clockwise);
}
}
return bitmap;
}

View file

@ -88,7 +88,13 @@ Page Document::get_page(u32 index)
if (raw_page_object->contains("UserUnit"))
user_unit = raw_page_object->get_value("UserUnit").to_float();
Page page { move(resources), move(contents), media_box, crop_box, user_unit };
int rotate = 0;
if (raw_page_object->contains("Rotate")) {
rotate = raw_page_object->get_value("Rotate").as_int();
VERIFY(rotate % 90 == 0);
}
Page page { move(resources), move(contents), media_box, crop_box, user_unit, rotate };
m_pages.set(index, page);
return page;
}

View file

@ -28,6 +28,7 @@ struct Page {
Rectangle media_box;
Rectangle crop_box;
float user_unit;
int rotate;
};
class Document final : public RefCounted<Document> {
@ -121,13 +122,14 @@ template<>
struct Formatter<PDF::Page> : Formatter<StringView> {
void format(FormatBuilder& builder, const PDF::Page& page)
{
constexpr auto fmt_string = "Page {{\n resources={}\n contents={}\n media_box={}\n crop_box={}\n user_unit={}\n}}";
constexpr auto fmt_string = "Page {{\n resources={}\n contents={}\n media_box={}\n crop_box={}\n user_unit={}\n rotate={}\n}}";
auto str = String::formatted(fmt_string,
page.resources->to_string(1),
page.contents->to_string(1),
page.media_box,
page.crop_box,
page.user_unit);
page.user_unit,
page.rotate);
Formatter<StringView>::format(builder, str);
}
};