| 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 |