OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 int size_y, | 530 int size_y, |
531 int rotate, | 531 int rotate, |
532 int flags) { | 532 int flags) { |
533 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); | 533 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); |
534 if (!pPage) | 534 if (!pPage) |
535 return; | 535 return; |
536 | 536 |
537 CRenderContext* pContext = new CRenderContext; | 537 CRenderContext* pContext = new CRenderContext; |
538 pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext)); | 538 pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext)); |
539 | 539 |
540 #if !defined(_WIN32_WCE) | |
541 CFX_DIBitmap* pBitmap = nullptr; | 540 CFX_DIBitmap* pBitmap = nullptr; |
542 FX_BOOL bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded(); | 541 FX_BOOL bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded(); |
543 FX_BOOL bHasImageMask = pPage->HasImageMask(); | 542 FX_BOOL bHasImageMask = pPage->HasImageMask(); |
544 if (bBackgroundAlphaNeeded || bHasImageMask) { | 543 if (bBackgroundAlphaNeeded || bHasImageMask) { |
545 pBitmap = new CFX_DIBitmap; | 544 pBitmap = new CFX_DIBitmap; |
546 pBitmap->Create(size_x, size_y, FXDIB_Argb); | 545 pBitmap->Create(size_x, size_y, FXDIB_Argb); |
547 pBitmap->Clear(0x00ffffff); | 546 pBitmap->Clear(0x00ffffff); |
548 pContext->m_pDevice = new CFX_FxgeDevice; | 547 pContext->m_pDevice = new CFX_FxgeDevice; |
549 ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap); | 548 ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap); |
550 } else { | 549 } else { |
(...skipping 14 matching lines...) Expand all Loading... |
565 FXSYS_memset(pDst->GetBuffer(), -1, pitch * size_y); | 564 FXSYS_memset(pDst->GetBuffer(), -1, pitch * size_y); |
566 pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, | 565 pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap, 0, 0, |
567 FXDIB_BLEND_NORMAL, NULL, FALSE, NULL); | 566 FXDIB_BLEND_NORMAL, NULL, FALSE, NULL); |
568 WinDC.StretchDIBits(pDst, 0, 0, size_x, size_y); | 567 WinDC.StretchDIBits(pDst, 0, 0, size_x, size_y); |
569 delete pDst; | 568 delete pDst; |
570 } else { | 569 } else { |
571 WinDC.SetDIBits(pBitmap, 0, 0); | 570 WinDC.SetDIBits(pBitmap, 0, 0); |
572 } | 571 } |
573 } | 572 } |
574 } | 573 } |
575 #else | |
576 // get clip region | |
577 RECT rect, cliprect; | |
578 rect.left = start_x; | |
579 rect.top = start_y; | |
580 rect.right = start_x + size_x; | |
581 rect.bottom = start_y + size_y; | |
582 GetClipBox(dc, &cliprect); | |
583 IntersectRect(&rect, &rect, &cliprect); | |
584 int width = rect.right - rect.left; | |
585 int height = rect.bottom - rect.top; | |
586 | |
587 // Create a DIB section | |
588 LPVOID pBuffer; | |
589 BITMAPINFOHEADER bmih; | |
590 FXSYS_memset(&bmih, 0, sizeof bmih); | |
591 bmih.biSize = sizeof bmih; | |
592 bmih.biBitCount = 24; | |
593 bmih.biHeight = -height; | |
594 bmih.biPlanes = 1; | |
595 bmih.biWidth = width; | |
596 pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, | |
597 &pBuffer, NULL, 0); | |
598 FXSYS_memset(pBuffer, 0xff, height * ((width * 3 + 3) / 4 * 4)); | |
599 | |
600 // Create a device with this external buffer | |
601 pContext->m_pBitmap = new CFX_DIBitmap; | |
602 pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (uint8_t*)pBuffer); | |
603 pContext->m_pDevice = new CPDF_FxgeDevice; | |
604 ((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap); | |
605 | |
606 // output to bitmap device | |
607 FPDF_RenderPage_Retail(pContext, page, start_x - rect.left, | |
608 start_y - rect.top, size_x, size_y, rotate, flags); | |
609 | |
610 // Now output to real device | |
611 HDC hMemDC = CreateCompatibleDC(dc); | |
612 HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap); | |
613 | |
614 BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY); | |
615 SelectObject(hMemDC, hOldBitmap); | |
616 DeleteDC(hMemDC); | |
617 | |
618 #endif // !defined(_WIN32_WCE) | |
619 if (bBackgroundAlphaNeeded || bHasImageMask) | 574 if (bBackgroundAlphaNeeded || bHasImageMask) |
620 delete pBitmap; | 575 delete pBitmap; |
621 | 576 |
622 pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>()); | 577 pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>()); |
623 } | 578 } |
624 #endif // defined(_WIN32) | 579 #endif // defined(_WIN32) |
625 | 580 |
626 DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, | 581 DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, |
627 FPDF_PAGE page, | 582 FPDF_PAGE page, |
628 int start_x, | 583 int start_x, |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1139 if (!buffer) { | 1094 if (!buffer) { |
1140 *buflen = len; | 1095 *buflen = len; |
1141 } else if (*buflen >= len) { | 1096 } else if (*buflen >= len) { |
1142 memcpy(buffer, utf16Name.c_str(), len); | 1097 memcpy(buffer, utf16Name.c_str(), len); |
1143 *buflen = len; | 1098 *buflen = len; |
1144 } else { | 1099 } else { |
1145 *buflen = -1; | 1100 *buflen = -1; |
1146 } | 1101 } |
1147 return (FPDF_DEST)pDestObj; | 1102 return (FPDF_DEST)pDestObj; |
1148 } | 1103 } |
OLD | NEW |