MCPcopy Create free account
hub / github.com/TeXworks/texworks / renderToImage

Method renderToImage

modules/QtPDF/src/backends/MuPDFBackend.cpp:888–947  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

886QSizeF Page::pageSizeF() const { QReadLocker pageLocker(_pageLock); return _size; }
887
888QImage Page::renderToImage(double xres, double yres, QRect render_box, bool cache) const
889{
890 QReadLocker docLocker(_docLock.data());
891 QReadLocker pageLocker(_pageLock);
892 if (!_parent)
893 return QImage();
894
895 // Set up the transformation matrix for the page. Really, we just start with
896 // an identity matrix and scale it using the xres, yres inputs.
897 fz_matrix render_trans = fz_identity;
898 render_trans = fz_concat(render_trans, fz_translate(0, -_bbox.y1));
899 render_trans = fz_concat(render_trans, fz_scale(xres/72.0, -yres/72.0));
900 render_trans = fz_concat(render_trans, fz_rotate(_rotate));
901
902#ifdef DEBUG
903 qDebug() << "Page bbox is: (" << _bbox.x0 << "," << _bbox.y0 << "|" << _bbox.x1 << "," << _bbox.y1 << ")";
904#endif
905
906 fz_bbox render_bbox;
907 if ( not render_box.isNull() ) {
908 render_bbox.x0 = render_box.left();
909 render_bbox.y0 = render_box.top();
910 render_bbox.x1 = render_box.right();
911 render_bbox.y1 = render_box.bottom();
912 } else {
913 render_bbox = fz_round_rect(fz_transform_rect(render_trans, _bbox));
914 }
915
916#ifdef DEBUG
917 qDebug() << "Render bbox is: (" << render_bbox.x0 << "," << render_bbox.y0 << "|" << render_bbox.x1 << "," << render_bbox.y1 << ")";
918#endif
919
920 // NOTE: Using fz_device_bgr or fz_device_rbg may depend on platform endianness.
921 fz_pixmap *mu_image = fz_new_pixmap_with_rect(fz_device_bgr, render_bbox);
922 // Flush to white.
923 fz_clear_pixmap_with_color(mu_image, 255);
924 fz_device *renderer = fz_new_draw_device(static_cast<Document *>(_parent)->_glyph_cache, mu_image);
925
926 // Actually render the page.
927 fz_execute_display_list(_mupdf_page, renderer, render_trans, render_bbox);
928
929 // Create a QImage that shares data with the fz_pixmap.
930 QImage tmp_image(mu_image->samples, mu_image->w, mu_image->h, QImage::Format_ARGB32);
931 // Now create a copy with its own data that can exist outside this function
932 // call.
933 QImage renderedPage = tmp_image.copy();
934
935 // Dispose of unneeded items.
936 fz_free_device(renderer);
937 fz_drop_pixmap(mu_image);
938
939 if( cache ) {
940 PDFPageTile key(xres, yres, render_box, _n);
941 QImage * img = new QImage(renderedPage.copy());
942 if (img != _parent->pageCache().setImage(key, img, PDFPageCache::CURRENT))
943 delete img;
944 }
945

Callers 1

executeMethod · 0.45

Calls 6

QImageClass · 0.85
isNullMethod · 0.80
leftMethod · 0.80
topMethod · 0.80
setImageMethod · 0.80
dataMethod · 0.45

Tested by

no test coverage detected