@@ -584,47 +584,52 @@ vips_foreign_load_pdf_generate(VipsRegion *out_region,
584
584
585
585
top = r -> top ;
586
586
while (top < VIPS_RECT_BOTTOM (r )) {
587
- VipsRect rect ;
588
- FPDF_BITMAP bitmap ;
589
-
590
- vips_rect_intersectrect (r , & pdf -> pages [i ], & rect );
591
-
592
- if (vips_foreign_load_pdf_get_page (pdf , pdf -> page_no + i ))
593
- return -1 ;
594
-
595
- vips__worker_lock (& vips_pdfium_mutex );
596
-
597
- /* 4 means RGBA.
598
- */
599
- bitmap = FPDFBitmap_CreateEx (rect .width , rect .height , 4 ,
600
- VIPS_REGION_ADDR (out_region , rect .left , rect .top ),
601
- VIPS_REGION_LSKIP (out_region ));
602
-
603
- /* Only paint the background if there's no transparency.
604
- */
605
- if (!FPDFPage_HasTransparency (pdf -> page )) {
606
- FPDF_DWORD ink = * ((guint32 * ) pdf -> ink );
607
-
608
- FPDFBitmap_FillRect (bitmap ,
609
- 0 , 0 , rect .width , rect .height , ink );
610
- }
611
-
612
- // pdfium writes bgra by default, we need rgba
613
- FPDF_RenderPageBitmap (bitmap , pdf -> page ,
614
- pdf -> pages [i ].left - rect .left ,
615
- pdf -> pages [i ].top - rect .top ,
616
- pdf -> pages [i ].width , pdf -> pages [i ].height ,
617
- 0 , FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER );
618
-
619
- FPDF_FFLDraw (pdf -> form , bitmap , pdf -> page ,
620
- pdf -> pages [i ].left - rect .left ,
621
- pdf -> pages [i ].top - rect .top ,
622
- pdf -> pages [i ].width , pdf -> pages [i ].height ,
623
- 0 , FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER );
624
-
625
- FPDFBitmap_Destroy (bitmap );
626
-
627
- g_mutex_unlock (& vips_pdfium_mutex );
587
+ FPDF_BITMAP bitmap ;
588
+
589
+ /* Is the rect within this page? It might not be if the output is more
590
+ * than one tile wide and this page is narrower.
591
+ */
592
+ VipsRect rect ;
593
+ vips_rect_intersectrect (r , & pdf -> pages [i ], & rect );
594
+ if (rect .width > 0 && rect .height > 0 ) {
595
+
596
+ if (vips_foreign_load_pdf_get_page (pdf , pdf -> page_no + i ))
597
+ return -1 ;
598
+
599
+ vips__worker_lock (& vips_pdfium_mutex );
600
+
601
+ /* 4 means RGBA.
602
+ */
603
+ bitmap = FPDFBitmap_CreateEx (rect .width , rect .height , 4 ,
604
+ VIPS_REGION_ADDR (out_region , rect .left , rect .top ),
605
+ VIPS_REGION_LSKIP (out_region ));
606
+
607
+ /* Only paint the background if there's no transparency.
608
+ */
609
+ if (!FPDFPage_HasTransparency (pdf -> page )) {
610
+ FPDF_DWORD ink = * ((guint32 * ) pdf -> ink );
611
+
612
+ FPDFBitmap_FillRect (bitmap ,
613
+ 0 , 0 , rect .width , rect .height , ink );
614
+ }
615
+
616
+ // pdfium writes bgra by default, we need rgba
617
+ FPDF_RenderPageBitmap (bitmap , pdf -> page ,
618
+ pdf -> pages [i ].left - rect .left ,
619
+ pdf -> pages [i ].top - rect .top ,
620
+ pdf -> pages [i ].width , pdf -> pages [i ].height ,
621
+ 0 , FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER );
622
+
623
+ FPDF_FFLDraw (pdf -> form , bitmap , pdf -> page ,
624
+ pdf -> pages [i ].left - rect .left ,
625
+ pdf -> pages [i ].top - rect .top ,
626
+ pdf -> pages [i ].width , pdf -> pages [i ].height ,
627
+ 0 , FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER );
628
+
629
+ FPDFBitmap_Destroy (bitmap );
630
+
631
+ g_mutex_unlock (& vips_pdfium_mutex );
632
+ }
628
633
629
634
top += rect .height ;
630
635
i += 1 ;
0 commit comments