Skip to content

Commit b240d23

Browse files
mattco98awesomekling
authored andcommitted
LibPDF: Propagate errors in Renderer/PDFViewer
1 parent d82bd88 commit b240d23

File tree

4 files changed

+142
-74
lines changed

4 files changed

+142
-74
lines changed

Userland/Applications/PDFViewer/PDFViewer.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, Matthew Olsson <mattco@serenityos.org>
2+
* Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
33
* Copyright (c) 2022, the SerenityOS developers.
44
*
55
* SPDX-License-Identifier: BSD-2-Clause
@@ -8,6 +8,7 @@
88
#include "PDFViewer.h"
99
#include <AK/Array.h>
1010
#include <LibGUI/Action.h>
11+
#include <LibGUI/MessageBox.h>
1112
#include <LibGUI/Painter.h>
1213
#include <LibPDF/Renderer.h>
1314

@@ -56,15 +57,15 @@ void PDFViewer::set_document(RefPtr<PDF::Document> document)
5657
update();
5758
}
5859

59-
RefPtr<Gfx::Bitmap> PDFViewer::get_rendered_page(u32 index)
60+
PDF::PDFErrorOr<NonnullRefPtr<Gfx::Bitmap>> PDFViewer::get_rendered_page(u32 index)
6061
{
6162
auto& rendered_page_map = m_rendered_page_list[index];
6263
auto existing_rendered_page = rendered_page_map.get(m_zoom_level);
6364
if (existing_rendered_page.has_value() && existing_rendered_page.value().rotation == m_rotations)
6465
return existing_rendered_page.value().bitmap;
6566

66-
// FIXME: Propogate errors in the Renderer
67-
auto rendered_page = render_page(MUST(m_document->get_page(index)));
67+
auto page = TRY(m_document->get_page(index));
68+
auto rendered_page = TRY(render_page(page));
6869
rendered_page_map.set(m_zoom_level, { rendered_page, m_rotations });
6970
return rendered_page;
7071
}
@@ -81,7 +82,14 @@ void PDFViewer::paint_event(GUI::PaintEvent& event)
8182
if (!m_document)
8283
return;
8384

84-
auto page = get_rendered_page(m_current_page_index);
85+
auto maybe_page = get_rendered_page(m_current_page_index);
86+
if (maybe_page.is_error()) {
87+
auto error = maybe_page.release_error();
88+
GUI::MessageBox::show_error(nullptr, String::formatted("Error rendering page:\n{}", error.message()));
89+
return;
90+
}
91+
92+
auto page = maybe_page.release_value();
8593
set_content_size(page->size());
8694

8795
painter.translate(frame_thickness(), frame_thickness());
@@ -196,7 +204,7 @@ void PDFViewer::rotate(int degrees)
196204
update();
197205
}
198206

199-
RefPtr<Gfx::Bitmap> PDFViewer::render_page(const PDF::Page& page)
207+
PDF::PDFErrorOr<NonnullRefPtr<Gfx::Bitmap>> PDFViewer::render_page(const PDF::Page& page)
200208
{
201209
auto zoom_scale_factor = static_cast<float>(zoom_levels[m_zoom_level]) / 100.0f;
202210

@@ -208,7 +216,7 @@ RefPtr<Gfx::Bitmap> PDFViewer::render_page(const PDF::Page& page)
208216
auto width = height / page_scale_factor;
209217
auto bitmap = Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, { width, height }).release_value_but_fixme_should_propagate_errors();
210218

211-
PDF::Renderer::render(*m_document, page, bitmap);
219+
TRY(PDF::Renderer::render(*m_document, page, bitmap));
212220

213221
if (page.rotate + m_rotations != 0) {
214222
int rotation_count = ((page.rotate + m_rotations) / 90) % 4;

Userland/Applications/PDFViewer/PDFViewer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, Matthew Olsson <mattco@serenityos.org>
2+
* Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
33
* Copyright (c) 2022, the SerenityOS developers.
44
*
55
* SPDX-License-Identifier: BSD-2-Clause
@@ -45,12 +45,12 @@ class PDFViewer : public GUI::AbstractScrollableWidget {
4545

4646
private:
4747
struct RenderedPage {
48-
RefPtr<Gfx::Bitmap> bitmap;
48+
NonnullRefPtr<Gfx::Bitmap> bitmap;
4949
int rotation;
5050
};
5151

52-
RefPtr<Gfx::Bitmap> get_rendered_page(u32 index);
53-
RefPtr<Gfx::Bitmap> render_page(const PDF::Page&);
52+
PDF::PDFErrorOr<NonnullRefPtr<Gfx::Bitmap>> get_rendered_page(u32 index);
53+
PDF::PDFErrorOr<NonnullRefPtr<Gfx::Bitmap>> render_page(const PDF::Page&);
5454

5555
RefPtr<PDF::Document> m_document;
5656
u32 m_current_page_index { 0 };

0 commit comments

Comments
 (0)