From c4f3c0f183c9ce472cd22e831075c3897e14c3af Mon Sep 17 00:00:00 2001 From: caryclark Date: Mon, 15 Aug 2016 10:09:46 -0700 Subject: add native draw bitmap with alpha mask PDFs draw bitmaps with alpha by supplying an image alpha mask along side the image color data. The alpha mask may not be the same scale as the image data. Skia doesn't have a direct mapping for this draw call, but can come close by using the internal SkCompositeShader class. This scales the alpha mask to match the size of the image data, then puts both in the composite shader to draw. There are more things to do: - Allow Alpha8 or Gray8 to draw scaled to a matching device (blit doesn't work today) Temporary code marked with a TODO implements this functionality. - Refactor PDFium to allow SkComposeShader's components to take a matrix. The latter goal will defer drawing so that PDFium doesn't resize the mask, discarding resolution, before Skia has a chance to record it. Additionally fix drawing text with a negative font size. R=reed@google.com,dsinclair@chromium.org,herb@chromium.org Review-Url: https://codereview.chromium.org/2182763002 --- core/fxge/include/cfx_fxgedevice.h | 7 +++++++ core/fxge/include/cfx_renderdevice.h | 6 ++++++ core/fxge/include/ifx_renderdevicedriver.h | 6 ++++++ 3 files changed, 19 insertions(+) (limited to 'core/fxge/include') diff --git a/core/fxge/include/cfx_fxgedevice.h b/core/fxge/include/cfx_fxgedevice.h index a5dba37c3e..7f34f1ca4a 100644 --- a/core/fxge/include/cfx_fxgedevice.h +++ b/core/fxge/include/cfx_fxgedevice.h @@ -28,8 +28,15 @@ class CFX_FxgeDevice : public CFX_RenderDevice { #ifdef _SKIA_SUPPORT_ bool AttachRecorder(SkPictureRecorder* recorder); + void Clear(uint32_t color); SkPictureRecorder* CreateRecorder(int size_x, int size_y); void DebugVerifyBitmapIsPreMultiplied() const override; + bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type) override; #endif private: diff --git a/core/fxge/include/cfx_renderdevice.h b/core/fxge/include/cfx_renderdevice.h index fafa6260e1..390d39b69d 100644 --- a/core/fxge/include/cfx_renderdevice.h +++ b/core/fxge/include/cfx_renderdevice.h @@ -253,6 +253,12 @@ class CFX_RenderDevice { #ifdef _SKIA_SUPPORT_ virtual void DebugVerifyBitmapIsPreMultiplied() const; + virtual bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type); void Flush(); #endif diff --git a/core/fxge/include/ifx_renderdevicedriver.h b/core/fxge/include/ifx_renderdevicedriver.h index 572469b8c0..8b20cf0838 100644 --- a/core/fxge/include/ifx_renderdevicedriver.h +++ b/core/fxge/include/ifx_renderdevicedriver.h @@ -99,6 +99,12 @@ class IFX_RenderDeviceDriver { const FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode); + virtual bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type); }; #endif // CORE_FXGE_INCLUDE_IFX_RENDERDEVICEDRIVER_H_ -- cgit v1.2.3