Hello!
I am using Olaf's great PDFium Viewer.
I am trying to extract image objects, and it seems that one simply is too big for Cairo.
The line in question is
Code:Set GetCairoSurfaceFromImgObject = Cairo.CreateSurface(dx, DY)
I have tested it using this code:
How could I deal with the situation below?Code:Dim n As cCairoSurface Set n = Cairo.CreateSurface(2104, 3208)
Thank you!
Code:Public Function GetCairoSurfaceFromImgObject() As cCairoSurface If ObjType <> FPDF_PAGEOBJ_IMAGE Then Exit Function End If Const FPDFBitmap_Gray = 1, FPDFBitmap_BGR = 2, FPDFBitmap_BGRx = 3, FPDFBitmap_BGRA = 4 Dim hBM As Long, Fmt&, x&, y&, dx&, DY&, Stride&, i&, pData As Long, bl() As Byte, b() As Byte hBM = FPDFImageObj_GetBitmap(mPageObject) If hBM = 0 Then Debug.Print "couldn't create FPDF-Bitmap from PageObject" Exit Function End If dx = FPDFBitmap_GetWidth(hBM) DY = FPDFBitmap_GetHeight(hBM) Stride = FPDFBitmap_GetStride(hBM) pData = FPDFBitmap_GetBuffer(hBM) Fmt = FPDFBitmap_GetFormat(hBM) If pData = 0 Or dx <= 0 Or DY <= 0 Or Stride <= 0 Or Fmt = 0 Then FPDFBitmap_Destroy hBM Err.Raise vbObjectError, , "Unable to retrieve FPDF-Bitmap-Data" End If ' ' Debug.Print "pdata: " & pData ' Debug.Print "stride: " & Stride ' Debug.Print "dx: " & dx ' Debug.Print "dy: " & DY ' Debug.Print "fmt: " & Fmt ' ' Dim n As cCairoSurface ' Set n = Cairo.CreateSurface(2104, 3208) Set GetCairoSurfaceFromImgObject = Cairo.CreateSurface(dx, DY) ReDim bl(0 To Stride - 1) 'allocate a line-buffer GetCairoSurfaceFromImgObject.BindToArray b For y = 0 To DY - 1 i = 0: New_c.MemCopy VarPtr(bl(0)), pData, Stride Select Case Fmt Case FPDFBitmap_Gray For x = 0 To dx - 1 b(i, y) = bl(x): b(i + 1, y) = bl(x): b(i + 2, y) = bl(x): b(i + 3, y) = 255 i = i + 4 Next Case FPDFBitmap_BGR For x = 0 To dx * 3 - 1 Step 3 b(i, y) = bl(x): b(i + 1, y) = bl(x + 1): b(i + 2, y) = bl(x + 2): b(i + 3, y) = 255 i = i + 4 Next Case FPDFBitmap_BGRx: New_c.MemCopy VarPtr(b(0, y)), pData, dx * 4 For x = 3 To dx * 4 Step 4: b(x, y) = 255: Next Case FPDFBitmap_BGRA: New_c.MemCopy VarPtr(b(0, y)), pData, dx * 4 End Select pData = pData + Stride Next GetCairoSurfaceFromImgObject.ReleaseArray b Cairo.PreMultiplyAlpha GetCairoSurfaceFromImgObject.DataPtr, dx * DY * 4 FPDFBitmap_Destroy hBM End Function




Reply With Quote
