Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: core/fpdfapi/fpdf_render/fpdf_render_image.cpp

Issue 2182763002: add native draw bitmap with alpha mask (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: address comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | core/fxge/ge/cfx_renderdevice.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "core/fpdfapi/fpdf_render/render_int.h" 7 #include "core/fpdfapi/fpdf_render/render_int.h"
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 } 639 }
640 } 640 }
641 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 641 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
642 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 642 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
643 bitmap_device1.GetBitmap()->MultiplyAlpha(255); 643 bitmap_device1.GetBitmap()->MultiplyAlpha(255);
644 } 644 }
645 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( 645 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend(
646 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); 646 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
647 return FALSE; 647 return FALSE;
648 } 648 }
649
649 FX_BOOL CPDF_ImageRenderer::DrawMaskedImage() { 650 FX_BOOL CPDF_ImageRenderer::DrawMaskedImage() {
650 if (m_pRenderStatus->m_bPrint && 651 if (m_pRenderStatus->m_bPrint &&
651 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 652 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
652 m_Result = FALSE; 653 m_Result = FALSE;
653 return FALSE; 654 return FALSE;
654 } 655 }
655 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect(); 656 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect();
656 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 657 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
657 if (rect.IsEmpty()) { 658 if (rect.IsEmpty()) {
658 return FALSE; 659 return FALSE;
659 } 660 }
660 CFX_Matrix new_matrix = m_ImageMatrix; 661 CFX_Matrix new_matrix = m_ImageMatrix;
661 new_matrix.TranslateI(-rect.left, -rect.top); 662 new_matrix.TranslateI(-rect.left, -rect.top);
662 int width = rect.Width(); 663 int width = rect.Width();
663 int height = rect.Height(); 664 int height = rect.Height();
664 CFX_FxgeDevice bitmap_device1; 665 CFX_FxgeDevice bitmap_device1;
665 if (!bitmap_device1.Create(width, height, FXDIB_Rgb32, nullptr)) 666 if (!bitmap_device1.Create(width, height, FXDIB_Rgb32, nullptr))
666 return TRUE; 667 return TRUE;
667 668
669 #if defined _SKIA_SUPPORT_
670 bitmap_device1.Clear(0xffffff);
671 #else
668 bitmap_device1.GetBitmap()->Clear(0xffffff); 672 bitmap_device1.GetBitmap()->Clear(0xffffff);
673 #endif
669 { 674 {
670 CPDF_RenderStatus bitmap_render; 675 CPDF_RenderStatus bitmap_render;
671 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, 676 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1,
672 nullptr, nullptr, nullptr, nullptr, nullptr, 0, 677 nullptr, nullptr, nullptr, nullptr, nullptr, 0,
673 m_pRenderStatus->m_bDropObjects, nullptr, TRUE); 678 m_pRenderStatus->m_bDropObjects, nullptr, TRUE);
674 CPDF_ImageRenderer image_render; 679 CPDF_ImageRenderer image_render;
675 if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, 680 if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix,
676 m_Flags, TRUE)) { 681 m_Flags, TRUE)) {
677 image_render.Continue(nullptr); 682 image_render.Continue(nullptr);
678 } 683 }
679 } 684 }
680 { 685 {
681 CFX_FxgeDevice bitmap_device2; 686 CFX_FxgeDevice bitmap_device2;
682 if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb, nullptr)) 687 if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb, nullptr))
683 return TRUE; 688 return TRUE;
684 689
690 #if defined _SKIA_SUPPORT_
691 bitmap_device2.Clear(0);
692 #else
685 bitmap_device2.GetBitmap()->Clear(0); 693 bitmap_device2.GetBitmap()->Clear(0);
694 #endif
686 CPDF_RenderStatus bitmap_render; 695 CPDF_RenderStatus bitmap_render;
687 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2, 696 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2,
688 nullptr, nullptr, nullptr, nullptr, nullptr, 0, 697 nullptr, nullptr, nullptr, nullptr, nullptr, 0,
689 m_pRenderStatus->m_bDropObjects, nullptr, TRUE); 698 m_pRenderStatus->m_bDropObjects, nullptr, TRUE);
690 CPDF_ImageRenderer image_render; 699 CPDF_ImageRenderer image_render;
691 if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, 700 if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255,
692 &new_matrix, m_Flags, TRUE)) { 701 &new_matrix, m_Flags, TRUE)) {
693 image_render.Continue(nullptr); 702 image_render.Continue(nullptr);
694 } 703 }
695 if (m_Loader.m_MatteColor != 0xffffffff) { 704 if (m_Loader.m_MatteColor != 0xffffffff) {
(...skipping 28 matching lines...) Expand all
724 orig = 255; 733 orig = 255;
725 } 734 }
726 *dest_scan++ = orig; 735 *dest_scan++ = orig;
727 dest_scan++; 736 dest_scan++;
728 } else { 737 } else {
729 dest_scan += 4; 738 dest_scan += 4;
730 } 739 }
731 } 740 }
732 } 741 }
733 } 742 }
743 #ifdef _SKIA_SUPPORT_
744 m_pRenderStatus->m_pDevice->SetBitsWithMask(
745 bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left,
746 rect.top, m_BitmapAlpha, m_BlendType);
747 }
748 #else
734 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 749 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
735 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 750 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
736 #ifdef _SKIA_SUPPORT_
737 CFX_SkiaDeviceDriver::PreMultiply(bitmap_device1.GetBitmap());
738 #endif
739 if (m_BitmapAlpha < 255) { 751 if (m_BitmapAlpha < 255) {
740 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); 752 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
741 } 753 }
742 } 754 }
743 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( 755 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend(
744 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); 756 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
757 #endif // _SKIA_SUPPORT_
745 return FALSE; 758 return FALSE;
746 } 759 }
747 760
748 FX_BOOL CPDF_ImageRenderer::StartDIBSource() { 761 FX_BOOL CPDF_ImageRenderer::StartDIBSource() {
749 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { 762 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
750 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * 763 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() *
751 m_pDIBSource->GetHeight(); 764 m_pDIBSource->GetHeight();
752 if (image_size > FPDF_HUGE_IMAGE_SIZE && 765 if (image_size > FPDF_HUGE_IMAGE_SIZE &&
753 !(m_Flags & RENDER_FORCE_HALFTONE)) { 766 !(m_Flags & RENDER_FORCE_HALFTONE)) {
754 m_Flags |= RENDER_FORCE_DOWNSAMPLE; 767 m_Flags |= RENDER_FORCE_DOWNSAMPLE;
755 } 768 }
756 } 769 }
757 #ifdef _SKIA_SUPPORT_ 770 #ifdef _SKIA_SUPPORT_
758 CFX_DIBitmap* premultiplied = m_pDIBSource->Clone(); 771 CFX_DIBitmap* premultiplied = m_pDIBSource->Clone();
759 CFX_SkiaDeviceDriver::PreMultiply(premultiplied); 772 if (m_pDIBSource->HasAlpha())
773 CFX_SkiaDeviceDriver::PreMultiply(premultiplied);
760 if (m_pRenderStatus->m_pDevice->StartDIBitsWithBlend( 774 if (m_pRenderStatus->m_pDevice->StartDIBitsWithBlend(
761 premultiplied, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, 775 premultiplied, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags,
762 m_DeviceHandle, m_BlendType)) { 776 m_DeviceHandle, m_BlendType)) {
763 if (m_DeviceHandle) { 777 if (m_DeviceHandle) {
764 m_Status = 3; 778 m_Status = 3;
765 return TRUE; 779 return TRUE;
766 } 780 }
767 return FALSE; 781 return FALSE;
768 } 782 }
769 #else 783 #else
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 } else if (pFunc) { 1068 } else if (pFunc) {
1055 int size = dest_pitch * height; 1069 int size = dest_pitch * height;
1056 for (int i = 0; i < size; i++) { 1070 for (int i = 0; i < size; i++) {
1057 dest_buf[i] = transfers[src_buf[i]]; 1071 dest_buf[i] = transfers[src_buf[i]];
1058 } 1072 }
1059 } else { 1073 } else {
1060 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); 1074 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height);
1061 } 1075 }
1062 return pMask.release(); 1076 return pMask.release();
1063 } 1077 }
OLDNEW
« no previous file with comments | « no previous file | core/fxge/ge/cfx_renderdevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698