mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 12:07:44 +00:00
LibPDF/PDFViewer: Support rotated pages
This commit is contained in:
parent
fbe712e265
commit
d5f94aaa7b
3 changed files with 22 additions and 3 deletions
|
@ -87,5 +87,16 @@ RefPtr<Gfx::Bitmap> PDFViewer::render_page(const PDF::Page& page)
|
||||||
auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, { width, height });
|
auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, { width, height });
|
||||||
|
|
||||||
PDF::Renderer::render(*m_document, page, bitmap);
|
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;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,13 @@ Page Document::get_page(u32 index)
|
||||||
if (raw_page_object->contains("UserUnit"))
|
if (raw_page_object->contains("UserUnit"))
|
||||||
user_unit = raw_page_object->get_value("UserUnit").to_float();
|
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);
|
m_pages.set(index, page);
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ struct Page {
|
||||||
Rectangle media_box;
|
Rectangle media_box;
|
||||||
Rectangle crop_box;
|
Rectangle crop_box;
|
||||||
float user_unit;
|
float user_unit;
|
||||||
|
int rotate;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Document final : public RefCounted<Document> {
|
class Document final : public RefCounted<Document> {
|
||||||
|
@ -121,13 +122,14 @@ template<>
|
||||||
struct Formatter<PDF::Page> : Formatter<StringView> {
|
struct Formatter<PDF::Page> : Formatter<StringView> {
|
||||||
void format(FormatBuilder& builder, const PDF::Page& page)
|
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,
|
auto str = String::formatted(fmt_string,
|
||||||
page.resources->to_string(1),
|
page.resources->to_string(1),
|
||||||
page.contents->to_string(1),
|
page.contents->to_string(1),
|
||||||
page.media_box,
|
page.media_box,
|
||||||
page.crop_box,
|
page.crop_box,
|
||||||
page.user_unit);
|
page.user_unit,
|
||||||
|
page.rotate);
|
||||||
Formatter<StringView>::format(builder, str);
|
Formatter<StringView>::format(builder, str);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue