Пример #1
0
        /// <summary>
        /// <inheritdoc/>
        /// </summary>
        public void RenderPageBitmap(double zoomFactor, int startX, int startY, int sizeX, int sizeY, int width, int height, BitmapFormat format, IntPtr buffer, int stride)
        {
            var bmp = new PDFBitmap(_mainComponent);

            bmp.Create(width, height, format, buffer, stride);

            var pageHandle = _mainComponent.PDFiumBridge.FPDF_LoadPage(_mainComponent.PDFiumDocument, PageIndex);

            bmp.RenderWithTransformation(
                pageHandle,
                zoomFactor,
                startX,
                startY,
                sizeX,
                sizeY,
                _mainComponent.PageComponent.IsAnnotationToRender ? FPDF_RENDERING_FLAGS.FPDF_ANNOT : FPDF_RENDERING_FLAGS.FPDF_NONE);
            _mainComponent.PDFiumBridge.FPDF_ClosePage(pageHandle);

            if (_mainComponent.PageComponent is PDFPageComponent pageComponent &&
                pageComponent.PageIndexWithSelections == PageIndex &&
                pageComponent.SelectionRectangles.Count != 0)
            {
                foreach (var rect in pageComponent.SelectionRectangles)
                {
                    bmp.RenderSelectionRectangle(zoomFactor, startX, startY, sizeY, rect.Left, rect.Top, rect.Width, rect.Height);
                }
            }

            bmp.Destroy();
        }
Пример #2
0
        protected virtual void Dispose(bool disposing)
        {
            if (!m_Disposed)
            {
                if (disposing)
                {
#if !UNITY_WEBGL || UNITY_EDITOR
                    m_Bitmap.Dispose();
                    m_Bitmap = null;
#endif
                }

                PDFLibrary.RemoveRef("PDFRenderer");

                m_Disposed = true;
            }
        }
Пример #3
0
        /// <summary>
        /// <inheritdoc/>
        /// </summary>
        public void RenderThumbnailBitmap(BitmapFormat format, IntPtr buffer, int stride)
        {
            var bmp = new PDFBitmap(_mainComponent);

            bmp.Create((int)ThumbnailWidth, (int)ThumbnailHeight, format, buffer, stride);

            var pageHandle = _mainComponent.PDFiumBridge.FPDF_LoadPage(_mainComponent.PDFiumDocument, PageIndex);

            bmp.RenderWithoutTransformation(
                pageHandle,
                0,
                0,
                (int)ThumbnailWidth,
                (int)ThumbnailHeight,
                FPDF_RENDERING_FLAGS.FPDF_NONE);
            _mainComponent.PDFiumBridge.FPDF_ClosePage(pageHandle);

            bmp.Destroy();
        }
Пример #4
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);
        }