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