14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/ge/cfx_cliprgn.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ClipRgn::CFX_ClipRgn(int width, int height) 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_Type(RectI), m_Box(0, 0, width, height) {} 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src) { 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Type = src.m_Type; 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box = src.m_Box; 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Mask = src.m_Mask; 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ClipRgn::~CFX_ClipRgn() {} 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_ClipRgn::Reset(const FX_RECT& rect) { 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Type = RectI; 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box = rect; 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Mask.SetNull(); 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_ClipRgn::IntersectRect(const FX_RECT& rect) { 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Type == RectI) { 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box.Intersect(rect); 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Type == MaskF) { 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IntersectMaskRect(rect, m_Box, m_Mask); 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_RECT mask_rect, 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBitmapRef Mask) { 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_DIBitmap* mask_dib = Mask.GetObject(); 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Type = MaskF; 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box = rect; 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box.Intersect(mask_rect); 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Box.IsEmpty()) { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Type = RectI; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Box == mask_rect) { 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Mask = Mask; 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBitmap* new_dib = m_Mask.Emplace(); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask); 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int row = m_Box.top; row < m_Box.bottom; row++) { 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* dest_scan = 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top); 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* src_scan = 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top); 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int col = m_Box.left; col < m_Box.right; col++) 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left]; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask) { 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_DIBitmap* mask_dib = Mask.GetObject(); 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann top + mask_dib->GetHeight()); 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Type == RectI) { 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IntersectMaskRect(m_Box, mask_box, Mask); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Type == MaskF) { 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_RECT new_box = m_Box; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_box.Intersect(mask_box); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (new_box.IsEmpty()) { 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Type = RectI; 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Mask.SetNull(); 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box = new_box; 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBitmapRef new_mask; 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_DIBitmap* new_dib = new_mask.Emplace(); 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_DIBitmap* old_dib = m_Mask.GetObject(); 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int row = new_box.top; row < new_box.bottom; row++) { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* old_scan = 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch(); 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* mask_scan = 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch(); 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* new_scan = 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch(); 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int col = new_box.left; col < new_box.right; col++) { 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_scan[col - new_box.left] = 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann old_scan[col - m_Box.left] * mask_scan[col - left] / 255; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Box = new_box; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Mask = new_mask; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(false); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 104