| 886 | QSizeF Page::pageSizeF() const { QReadLocker pageLocker(_pageLock); return _size; } |
| 887 | |
| 888 | QImage 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 | |