void RenderPageToExistingTexture(PDFPage page, Texture2D texture, IPDFColoredRectListProvider rectsProvider, RenderSettings settings) { byte[] byteArray = RenderPageToByteArray(page, texture.width, texture.height, rectsProvider, settings); if (byteArray != null) { if ((texture.format != TextureFormat.RGBA32 && texture.format != TextureFormat.ARGB32 && texture.format != TextureFormat.BGRA32 && texture.format != (TextureFormat)37) || texture.mipmapCount > 1) { Color32[] pixels = new Color32[texture.width * texture.height]; for (int i = 0; i < pixels.Length; ++i) { pixels[i] = new Color32( byteArray[i * 4], byteArray[i * 4 + 1], byteArray[i * 4 + 2], byteArray[i * 4 + 3]); } texture.SetPixels32(pixels); texture.Apply(); } else { texture.LoadRawTextureData(byteArray); texture.Apply(); } } }
Texture2D RenderPageToTexture(PDFPage page, int width, int height, IPDFColoredRectListProvider rectsProvider, RenderSettings settings) { Texture2D newTex = new Texture2D(width, height, TextureFormat.RGBA32, false); RenderPageToExistingTexture(page, newTex, rectsProvider, settings); return(newTex); }
void RenderPageToExistingTexture(PDFPage page, Texture2D texture, IPDFColoredRectListProvider rectsProvider) { RenderPageToExistingTexture(page, texture, rectsProvider, RenderSettings.defaultRenderSettings); }
Texture2D RenderPageToTexture(PDFPage page, int width, int height, IPDFColoredRectListProvider rectsProvider) { return(RenderPageToTexture(page, width, height, rectsProvider, RenderSettings.defaultRenderSettings)); }
byte[] RenderPageToByteArray(PDFPage page, int width, int height, IPDFColoredRectListProvider rectsProvider, RenderSettings settings) { if (m_Bitmap == null || !m_Bitmap.HasSameSize(width, height)) { if (m_Bitmap != null) { m_Bitmap.Dispose(); } m_Bitmap = new PDFBitmap(width, height, false); } m_Bitmap.FillRect(0, 0, width, height, int.MaxValue); int flags = settings == null ? RenderSettings.defaultRenderSettings.ComputeRenderingFlags() : settings.ComputeRenderingFlags(); FPDF_RenderPageBitmap(m_Bitmap.NativePointer, page.NativePointer, 0, 0, width, height, 0, flags); IntPtr bufferPtr = m_Bitmap.GetBuffer(); if (bufferPtr == IntPtr.Zero) { return(null); } int length = width * height * 4; if (m_IntermediateBuffer == null || m_IntermediateBuffer.Length < length) { m_IntermediateBuffer = new byte[width * height * 4]; } Marshal.Copy(bufferPtr, m_IntermediateBuffer, 0, width * height * 4); #if !UNITY_WEBGL IList <PDFColoredRect> coloredRects = rectsProvider != null ? rectsProvider.GetBackgroundColoredRectList(page) : null; if (coloredRects != null && coloredRects.Count > 0) { foreach (PDFColoredRect coloredRect in coloredRects) { var r = (int)(coloredRect.color.r * 255) & 0xFF; var g = (int)(coloredRect.color.g * 255) & 0xFF; var b = (int)(coloredRect.color.b * 255) & 0xFF; var a = (int)(coloredRect.color.a * 255) & 0xFF; float alpha = (a / (float)255); float reverseAlpha = 1.0f - alpha; Rect deviceRect = page.ConvertPageRectToDeviceRect(coloredRect.pageRect, new Vector2(width, height)); for (int y = 0; y < -(int)deviceRect.height; ++y) { for (int x = 0; x < (int)deviceRect.width; ++x) { int s = (((int)deviceRect.y + y + (int)deviceRect.height) * width + (int)deviceRect.x + x) * 4; var sr = m_IntermediateBuffer[s]; var sg = m_IntermediateBuffer[s + 1]; var sb = m_IntermediateBuffer[s + 2]; m_IntermediateBuffer[s] = (byte)Mathf.Clamp(alpha * r + (reverseAlpha * sr), 0, 255); m_IntermediateBuffer[s + 1] = (byte)Mathf.Clamp(alpha * g + (reverseAlpha * sg), 0, 255); m_IntermediateBuffer[s + 2] = (byte)Mathf.Clamp(alpha * b + (reverseAlpha * sb), 0, 255); m_IntermediateBuffer[s + 3] = 0xFF; } } } } #endif return(m_IntermediateBuffer); }
byte[] RenderPageToByteArray(PDFPage page, int width, int height, IPDFColoredRectListProvider rectsProvider) { return(RenderPageToByteArray(page, width, height, rectsProvider, RenderSettings.defaultRenderSettings)); }
public static void UpdatePageAgainstRanges(PDFPageRange fromRange, PDFPageRange toRange, PDFDocument pdfDocument, PDFPageTextureHolder[] pageTextureHolderList, PDFRenderer.RenderSettings renderSettings, float scale, IPDFColoredRectListProvider rectsProvider, Vector2[] pageSizes) { int[] pagesToLoad = GetPagesToload(fromRange, toRange); int[] pagesToUnLoad = GetPagesToUnload(fromRange, toRange); List <Texture2D> recyclableTextures = new List <Texture2D>(); for (int i = 0; i < pagesToUnLoad.Length; ++i) { #if UNITY_WEBGL pageTextureHolderList[pagesToUnLoad[i]].m_Visible = false; if (pageTextureHolderList[pagesToUnLoad[i]].m_RenderingPromise != null) { PDFJS_Library.Instance.TryTerminateRenderingWorker(pageTextureHolderList[pagesToUnLoad[i]].m_RenderingPromise.PromiseHandle); pageTextureHolderList[pagesToUnLoad[i]].m_RenderingPromise = null; } Texture2D tex = pageTextureHolderList[pagesToUnLoad[i]].Texture; if (tex != null) { recyclableTextures.Add(tex); pageTextureHolderList[pagesToUnLoad[i]].Texture = null; } #else Texture2D tex = pageTextureHolderList[pagesToUnLoad[i]].Texture; if (tex != null) { recyclableTextures.Add(tex); pageTextureHolderList[pagesToUnLoad[i]].Texture = null; } #endif } for (int i = 0; i < pagesToLoad.Length; ++i) { #if UNITY_WEBGL pageTextureHolderList[pagesToLoad[i]].m_Visible = true; if (pageTextureHolderList[pagesToLoad[i]].m_RenderingStarted) { continue; } #endif int w = (int)(pageSizes[pagesToLoad[i]].x * scale); int h = (int)(pageSizes[pagesToLoad[i]].y * scale); Texture2D tex = null; foreach (Texture2D texture in recyclableTextures) { if (texture.width == w && texture.height == h) { tex = texture; break; } } #if UNITY_WEBGL if (tex != null) { recyclableTextures.Remove(tex); //pdfDocument.Renderer.RenderPageToExistingTexture(pdfDocument.GetPage(pagesToLoad[i]), tex, rectsProvider, renderSettings); pageTextureHolderList[pagesToLoad[i]].m_RenderingStarted = true; PDFJS_Library.Instance.StartCoroutine(UpdatePageWithExistingTexture(pdfDocument, pagesToLoad[i], tex, pageTextureHolderList)); } else { //tex = pdfDocument.Renderer.RenderPageToTexture(pdfDocument.GetPage(pagesToLoad[i]), w, h, rectsProvider, renderSettings); pageTextureHolderList[pagesToLoad[i]].m_RenderingStarted = true; PDFJS_Library.Instance.StartCoroutine(UpdatePageWithNewTexture(pdfDocument, pagesToLoad[i], pageTextureHolderList, w, h)); } #else if (tex != null) { recyclableTextures.Remove(tex); pdfDocument.Renderer.RenderPageToExistingTexture(pdfDocument.GetPage(pagesToLoad[i]), tex, rectsProvider, renderSettings); } else { tex = pdfDocument.Renderer.RenderPageToTexture(pdfDocument.GetPage(pagesToLoad[i]), w, h, rectsProvider, renderSettings); } pageTextureHolderList[pagesToLoad[i]].Texture = tex; #endif } foreach (Texture2D unusedTexture in recyclableTextures) { UnityEngine.Object.DestroyImmediate(unusedTexture); Resources.UnloadAsset(unusedTexture); } recyclableTextures.Clear(); //GC.Collect(); //GC.WaitForPendingFinalizers(); }