1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../../include/fxge/fx_ge.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_RenderDevice::CFX_RenderDevice() 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver = NULL; 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pBitmap = NULL; 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_RenderDevice::~CFX_RenderDevice() 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver) { 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_pDeviceDriver; 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver) 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver) { 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete m_pDeviceDriver; 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver = pDriver; 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov InitDeviceInfo(); 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::InitDeviceInfo() 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pDeviceDriver != NULL); 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH); 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT); 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL); 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS); 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS); 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) { 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.left = 0; 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.top = 0; 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.right = m_Width; 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.bottom = m_Height; 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::StartRendering() 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->StartRendering(); 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::EndRendering() 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->EndRendering(); 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::SaveState() 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->SaveState(); 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved) 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->RestoreState(bKeepSaved); 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateClipBox(); 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint CFX_RenderDevice::GetDeviceCaps(int caps_id) const 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->GetDeviceCaps(caps_id); 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_Matrix CFX_RenderDevice::GetCTM() const 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->GetCTM(); 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_RenderCaps & FXRC_CMYK_OUTPUT) { 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk); 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) { 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pDIB->Create(width, height, FXDIB_8bppMask); 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32); 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb); 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData, 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_AffineMatrix* pObject2Device, 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int fill_mode 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ) 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) { 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateClipBox(); 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData, 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_AffineMatrix* pObject2Device, 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_GraphStateData* pGraphState 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ) 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) { 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateClipBox(); 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect) 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_PathData path; 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top)); 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) { 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateClipBox(); 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::UpdateClipBox() 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) { 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.left = 0; 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.top = 0; 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.right = m_Width; 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_ClipBox.bottom = m_Height; 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData, 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_AffineMatrix* pObject2Device, 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_GraphStateData* pGraphState, 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode, 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int alpha_flag, void* pIccTransform, int blend_type) 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BYTE fill_alpha, stroke_alpha; 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (FXGETFLAG_COLORTYPE(alpha_flag)) { 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag); 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag); 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fill_alpha = FXARGB_A(fill_color); 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov stroke_alpha = FXARGB_A(stroke_color); 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((fill_mode & 3) == 0) { 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fill_alpha = 0; 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pGraphState == NULL) { 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov stroke_alpha = 0; 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) { 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_PATHPOINT* pPoints = pPathData->GetPoints(); 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT x1, x2, y1, y2; 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pObject2Device) { 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1); 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2); 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x1 = pPoints[0].m_PointX; 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y1 = pPoints[0].m_PointY; 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x2 = pPoints[1].m_PointX; 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y2 = pPoints[1].m_PointY; 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type); 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) { 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect_f; 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) { 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT rect_i = rect_f.GetOutterRect(); 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int width = (int)FXSYS_ceil(rect_f.right - rect_f.left); 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (width < 1) { 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = 1; 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_i.left == rect_i.right) { 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.right ++; 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom); 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (height < 1) { 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov height = 1; 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_i.bottom == rect_i.top) { 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.bottom ++; 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_i.Width() >= width + 1) { 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) { 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.left ++; 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.right --; 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_i.Height() >= height + 1) { 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) { 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.top ++; 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect_i.bottom --; 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) { 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) { 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_PathData newPath; 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bThin = FALSE; 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) { 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_GraphStateData graphState; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graphState.m_LineWidth = 0.0f; 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD strokecolor = fill_color; 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bThin) { 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (FXGETFLAG_COLORTYPE(alpha_flag)) { 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2); 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff)); 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_AffineMatrix* pMatrix = NULL; 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pObject2Device && !pObject2Device->IsIdentity()) { 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pMatrix = (CFX_AffineMatrix*)pObject2Device; 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int smooth_path = FX_ZEROAREA_FILL; 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (fill_mode & FXFILL_NOPATHSMOOTH) { 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov smooth_path |= FXFILL_NOPATHSMOOTH; 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type); 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) { 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(m_RenderCaps & FXRC_GET_BITS)) { 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect bbox; 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pGraphState) { 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit); 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bbox = pPathData->GetBoundingBox(); 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pObject2Device) { 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bbox.Transform(pObject2Device); 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_Matrix ctm = GetCTM(); 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fScaleX = FXSYS_fabs(ctm.a); 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fScaleY = FXSYS_fabs(ctm.d); 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT rect = bbox.GetOutterRect(); 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_DIBitmap bitmap, Backdrop; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) { 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bitmap.HasAlpha()) { 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bitmap.Clear(0); 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Backdrop.Copy(&bitmap); 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) { 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Backdrop.Copy(&bitmap); 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FxgeDevice bitmap_device; 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE); 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_AffineMatrix matrix; 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pObject2Device) { 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix = *pObject2Device; 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix.TranslateI(-rect.left, -rect.top); 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0); 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) { 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY)); 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL); 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type); 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform) 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) { 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT rect(x, y, x + 1, y + 1); 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FillRect(&rect, color, alpha_flag, pIccTransform); 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type) 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) { 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(m_RenderCaps & FXRC_GET_BITS)) { 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_DIBitmap bitmap; 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) { 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) { 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) { 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height()); 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL); 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color, 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int fill_mode, int alpha_flag, void* pIccTransform, int blend_type) 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (((m_RenderCaps & FXRC_ALPHA_PATH) && 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) || 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov color >= 0xff000000) 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) { 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_GraphStateData graph_state; 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_PathData path; 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov path.SetPointCount(2); 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov path.SetPoint(0, x1, y1, FXPT_MOVETO); 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov path.SetPoint(1, x2, y2, FXPT_LINETO); 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type); 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform) 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(m_RenderCaps & FXRC_GET_BITS)) { 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform); 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_DIBitmap* CFX_RenderDevice::GetBackDrop() 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->GetBackDrop(); 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode, 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov void* pIccTransform) 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(!pBitmap->IsAlphaMask()); 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_AffineMatrix ctm = GetCTM(); 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fScaleX = FXSYS_fabs(ctm.a); 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT fScaleY = FXSYS_fabs(ctm.d); 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY)); 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov dest_rect.Intersect(m_ClipBox); 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dest_rect.IsEmpty()) { 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top, 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height()); 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov src_rect.left = FXSYS_round(src_rect.left * fScaleX); 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov src_rect.top = FXSYS_round(src_rect.top * fScaleY); 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov src_rect.right = FXSYS_round(src_rect.right * fScaleX); 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY); 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) || 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) { 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(m_RenderCaps & FXRC_GET_BITS)) { 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX); 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY); 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_DIBitmap background; 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!background.Create(bg_pixel_width, bg_pixel_height, 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) { 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) { 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height, 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pBitmap, src_rect.left, src_rect.top, 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov blend_mode, NULL, FALSE, pIccTransform)) { 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height); 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL); 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform); 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top, 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int dest_width, int dest_height, FX_DWORD flags, 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov void* pIccTransform, int blend_mode) 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT dest_rect(left, top, left + dest_width, top + dest_height); 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT clip_box = m_ClipBox; 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov clip_box.Intersect(dest_rect); 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (clip_box.IsEmpty()) { 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode); 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb, 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int alpha_flag, void* pIccTransform) 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform); 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top, 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags, 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int alpha_flag, void* pIccTransform) 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT dest_rect(left, top, left + dest_width, top + dest_height); 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT clip_box = m_ClipBox; 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov clip_box.Intersect(dest_rect); 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform); 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb, 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle, 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int alpha_flag, void* pIccTransform, int blend_mode) 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode); 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause) 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pDeviceDriver->ContinueDIBits(handle, pPause); 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CFX_RenderDevice::CancelDIBits(FX_LPVOID handle) 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDeviceDriver->CancelDIBits(handle); 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 406