Exemple #1
0
        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();
                }
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 void RenderPageToExistingTexture(PDFPage page, Texture2D texture,
                                  IPDFColoredRectListProvider rectsProvider)
 {
     RenderPageToExistingTexture(page, texture, rectsProvider, RenderSettings.defaultRenderSettings);
 }
Exemple #4
0
 Texture2D RenderPageToTexture(PDFPage page, int width, int height,
                               IPDFColoredRectListProvider rectsProvider)
 {
     return(RenderPageToTexture(page, width, height, rectsProvider, RenderSettings.defaultRenderSettings));
 }
Exemple #5
0
        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);
        }
Exemple #6
0
 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();
        }