From f89acbcf5c652dc2eb3509568b3a5a57cb4c4c5e Mon Sep 17 00:00:00 2001 From: Wei Li Date: Mon, 14 Mar 2016 15:10:46 -0700 Subject: Re-enable warning 4201 for xfa and other clean up Re-enable the warning by naming the unnamed structs. Also clean up fx_graphics files. BUG=pdfium:29 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1784323006 . --- xfa.gyp | 2 - xfa/fxgraphics/fx_graphics.cpp | 1344 +++++++++++++++------------------- xfa/include/fxgraphics/fx_graphics.h | 241 +++--- 3 files changed, 698 insertions(+), 889 deletions(-) diff --git a/xfa.gyp b/xfa.gyp index 39de1be6ec..78593dfa6d 100644 --- a/xfa.gyp +++ b/xfa.gyp @@ -8,8 +8,6 @@ ], 'msvs_disabled_warnings': [ 4005, 4018, 4146, 4333, 4345, 4267, - # TODO(ochang): Investigate if this can be fixed properly. - 4201, # TODO(thestig): Fix all instances, remove this, pdfium:29 4245, 4310, 4389, 4701, 4702, 4706, 4800, ], diff --git a/xfa/fxgraphics/fx_graphics.cpp b/xfa/fxgraphics/fx_graphics.cpp index a3fb84dbb0..3247246c79 100644 --- a/xfa/fxgraphics/fx_graphics.cpp +++ b/xfa/fxgraphics/fx_graphics.cpp @@ -11,669 +11,473 @@ #include "xfa/fxgraphics/fx_path_generator.h" #include "xfa/fxgraphics/pre.h" -class CAGG_Graphics { - public: - CAGG_Graphics(); - FX_ERR Create(CFX_Graphics* owner, - int32_t width, - int32_t height, - FXDIB_Format format); - virtual ~CAGG_Graphics(); - - private: - CFX_Graphics* _owner; -}; -CFX_Graphics::CFX_Graphics() { - _type = FX_CONTEXT_None; - _info._graphState.SetDashCount(0); - _info._isAntialiasing = TRUE; - _info._strokeAlignment = FX_STROKEALIGNMENT_Center; - _info._CTM.SetIdentity(); - _info._isActOnDash = FALSE; - _info._strokeColor = NULL; - _info._fillColor = NULL; - _info._font = NULL; - _info._fontSize = 40.0; - _info._fontHScale = 1.0; - _info._fontSpacing = 0.0; - _renderDevice = NULL; - _aggGraphics = NULL; -} +CFX_Graphics::CFX_Graphics() + : m_renderDevice(nullptr), m_aggGraphics(nullptr) {} + FX_ERR CFX_Graphics::Create(CFX_RenderDevice* renderDevice, FX_BOOL isAntialiasing) { if (!renderDevice) return FX_ERR_Parameter_Invalid; - if (_type != FX_CONTEXT_None) { + if (m_type != FX_CONTEXT_None) return FX_ERR_Property_Invalid; - } - _type = FX_CONTEXT_Device; - _info._isAntialiasing = isAntialiasing; - _renderDevice = renderDevice; - if (_renderDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP) { + + m_type = FX_CONTEXT_Device; + m_info.isAntialiasing = isAntialiasing; + m_renderDevice = renderDevice; + if (m_renderDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP) return FX_ERR_Succeeded; - } return FX_ERR_Indefinite; } + FX_ERR CFX_Graphics::Create(int32_t width, int32_t height, FXDIB_Format format, FX_BOOL isNative, FX_BOOL isAntialiasing) { - if (_type != FX_CONTEXT_None) { + if (m_type != FX_CONTEXT_None) return FX_ERR_Property_Invalid; - } - _type = FX_CONTEXT_Device; - _info._isAntialiasing = isAntialiasing; - { - _aggGraphics = new CAGG_Graphics; - return _aggGraphics->Create(this, width, height, format); - } + + m_type = FX_CONTEXT_Device; + m_info.isAntialiasing = isAntialiasing; + m_aggGraphics = new CAGG_Graphics; + return m_aggGraphics->Create(this, width, height, format); } + CFX_Graphics::~CFX_Graphics() { - if (_aggGraphics) { - delete _aggGraphics; - _aggGraphics = NULL; - } - _renderDevice = NULL; - _info._graphState.SetDashCount(0); - _type = FX_CONTEXT_None; + delete m_aggGraphics; } + FX_ERR CFX_Graphics::GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - capVal = _renderDevice->GetDeviceCaps(capID); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + capVal = m_renderDevice->GetDeviceCaps(capID); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::IsPrinterDevice(FX_BOOL& isPrinter) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - int32_t deviceClass = _renderDevice->GetDeviceClass(); - if (deviceClass == FXDC_PRINTER) { - isPrinter = TRUE; - } else { - isPrinter = FALSE; - } - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + isPrinter = m_renderDevice->GetDeviceClass() == FXDC_PRINTER; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::EnableAntialiasing(FX_BOOL isAntialiasing) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._isAntialiasing = isAntialiasing; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.isAntialiasing = isAntialiasing; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SaveGraphState() { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _renderDevice->SaveState(); - TInfo* info = new TInfo; - info->_graphState.Copy(_info._graphState); - info->_isAntialiasing = _info._isAntialiasing; - info->_strokeAlignment = _info._strokeAlignment; - info->_CTM = _info._CTM; - info->_isActOnDash = _info._isActOnDash; - info->_strokeColor = _info._strokeColor; - info->_fillColor = _info._fillColor; - info->_font = _info._font; - info->_fontSize = _info._fontSize; - info->_fontHScale = _info._fontHScale; - info->_fontSpacing = _info._fontSpacing; - _infoStack.Add(info); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_renderDevice->SaveState(); + m_infoStack.Add(new TInfo(m_info)); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::RestoreGraphState() { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _renderDevice->RestoreState(); - int32_t size = _infoStack.GetSize(); - if (size <= 0) { - return FX_ERR_Intermediate_Value_Invalid; - } - int32_t topIndex = size - 1; - TInfo* info = (TInfo*)_infoStack.GetAt(topIndex); - if (!info) - return FX_ERR_Intermediate_Value_Invalid; - _info._graphState.Copy(info->_graphState); - _info._isAntialiasing = info->_isAntialiasing; - _info._strokeAlignment = info->_strokeAlignment; - _info._CTM = info->_CTM; - _info._isActOnDash = info->_isActOnDash; - _info._strokeColor = info->_strokeColor; - _info._fillColor = info->_fillColor; - _info._font = info->_font; - _info._fontSize = info->_fontSize; - _info._fontHScale = info->_fontHScale; - _info._fontSpacing = info->_fontSpacing; - delete info; - info = NULL; - _infoStack.RemoveAt(topIndex); - return FX_ERR_Succeeded; + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_renderDevice->RestoreState(); + int32_t size = m_infoStack.GetSize(); + if (size <= 0) { + return FX_ERR_Intermediate_Value_Invalid; } - default: { return FX_ERR_Property_Invalid; } + int32_t topIndex = size - 1; + std::unique_ptr info( + reinterpret_cast(m_infoStack.GetAt(topIndex))); + if (!info) + return FX_ERR_Intermediate_Value_Invalid; + m_info = *info; + m_infoStack.RemoveAt(topIndex); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetLineCap(CFX_GraphStateData::LineCap& lineCap) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - lineCap = _info._graphState.m_LineCap; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetLineCap(CFX_GraphStateData::LineCap& lineCap) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + lineCap = m_info.graphState.m_LineCap; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetLineCap(CFX_GraphStateData::LineCap lineCap) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._graphState.m_LineCap = lineCap; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.graphState.m_LineCap = lineCap; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetDashCount(int32_t& dashCount) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - dashCount = _info._graphState.m_DashCount; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetDashCount(int32_t& dashCount) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + dashCount = m_info.graphState.m_DashCount; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray) { + +FX_ERR CFX_Graphics::GetLineDash(FX_FLOAT& dashPhase, + FX_FLOAT* dashArray) const { if (!dashArray) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - dashPhase = _info._graphState.m_DashPhase; - FXSYS_memcpy(dashArray, _info._graphState.m_DashArray, - _info._graphState.m_DashCount * sizeof(FX_FLOAT)); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + dashPhase = m_info.graphState.m_DashPhase; + FXSYS_memcpy(dashArray, m_info.graphState.m_DashArray, + m_info.graphState.m_DashCount * sizeof(FX_FLOAT)); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetLineDash(FX_FLOAT dashPhase, FX_FLOAT* dashArray, int32_t dashCount) { - if (dashCount > 0 && !dashArray) { + if (dashCount > 0 && !dashArray) return FX_ERR_Parameter_Invalid; - } + dashCount = dashCount < 0 ? 0 : dashCount; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - FX_FLOAT scale = 1.0; - if (_info._isActOnDash) { - scale = _info._graphState.m_LineWidth; - } - _info._graphState.m_DashPhase = dashPhase; - _info._graphState.SetDashCount(dashCount); - for (int32_t i = 0; i < dashCount; i++) { - _info._graphState.m_DashArray[i] = dashArray[i] * scale; - } - return FX_ERR_Succeeded; + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + FX_FLOAT scale = 1.0; + if (m_info.isActOnDash) { + scale = m_info.graphState.m_LineWidth; } - default: { return FX_ERR_Property_Invalid; } + m_info.graphState.m_DashPhase = dashPhase; + m_info.graphState.SetDashCount(dashCount); + for (int32_t i = 0; i < dashCount; i++) { + m_info.graphState.m_DashArray[i] = dashArray[i] * scale; + } + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetLineDash(FX_DashStyle dashStyle) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceSetLineDash(dashStyle); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceSetLineDash(dashStyle); + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - lineJoin = _info._graphState.m_LineJoin; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + lineJoin = m_info.graphState.m_LineJoin; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetLineJoin(CFX_GraphStateData::LineJoin lineJoin) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._graphState.m_LineJoin = lineJoin; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.graphState.m_LineJoin = lineJoin; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetMiterLimit(FX_FLOAT& miterLimit) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - miterLimit = _info._graphState.m_MiterLimit; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetMiterLimit(FX_FLOAT& miterLimit) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + miterLimit = m_info.graphState.m_MiterLimit; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetMiterLimit(FX_FLOAT miterLimit) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._graphState.m_MiterLimit = miterLimit; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.graphState.m_MiterLimit = miterLimit; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetLineWidth(FX_FLOAT& lineWidth) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - lineWidth = _info._graphState.m_LineWidth; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetLineWidth(FX_FLOAT& lineWidth) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + lineWidth = m_info.graphState.m_LineWidth; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._graphState.m_LineWidth = lineWidth; - _info._isActOnDash = isActOnDash; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.graphState.m_LineWidth = lineWidth; + m_info.isActOnDash = isActOnDash; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } -FX_ERR CFX_Graphics::GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - strokeAlignment = _info._strokeAlignment; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetStrokeAlignment( + FX_StrokeAlignment& strokeAlignment) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + strokeAlignment = m_info.strokeAlignment; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetStrokeAlignment(FX_StrokeAlignment strokeAlignment) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._strokeAlignment = strokeAlignment; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.strokeAlignment = strokeAlignment; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetStrokeColor(CFX_Color* color) { if (!color) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._strokeColor = color; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.strokeColor = color; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetFillColor(CFX_Color* color) { if (!color) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._fillColor = color; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.fillColor = color; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::StrokePath(CFX_Path* path, CFX_Matrix* matrix) { if (!path) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceStrokePath(path, matrix); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceStrokePath(path, matrix); + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::FillPath(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { if (!path) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceFillPath(path, fillMode, matrix); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceFillPath(path, fillMode, matrix); + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::ClipPath(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { if (!path) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - FX_BOOL result = _renderDevice->SetClip_PathFill( - path->GetPathData(), (CFX_Matrix*)matrix, fillMode); - if (!result) - return FX_ERR_Indefinite; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + FX_BOOL result = m_renderDevice->SetClip_PathFill( + path->GetPathData(), (CFX_Matrix*)matrix, fillMode); + if (!result) + return FX_ERR_Indefinite; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::DrawImage(CFX_DIBSource* source, const CFX_PointF& point, CFX_Matrix* matrix) { if (!source) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceDrawImage(source, point, matrix); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceDrawImage(source, point, matrix); + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::StretchImage(CFX_DIBSource* source, const CFX_RectF& rect, CFX_Matrix* matrix) { if (!source) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceStretchImage(source, rect, matrix); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceStretchImage(source, rect, matrix); + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::ConcatMatrix(const CFX_Matrix* matrix) { if (!matrix) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._CTM.Concat(*matrix); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.CTM.Concat(*matrix); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + CFX_Matrix* CFX_Graphics::GetMatrix() { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return NULL; - return &_info._CTM; - } - default: { return NULL; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return &m_info.CTM; + return nullptr; } -FX_ERR CFX_Graphics::GetClipRect(CFX_RectF& rect) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - FX_RECT r = _renderDevice->GetClipBox(); - rect.left = (FX_FLOAT)r.left; - rect.top = (FX_FLOAT)r.top; - rect.width = (FX_FLOAT)r.Width(); - rect.height = (FX_FLOAT)r.Height(); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + +FX_ERR CFX_Graphics::GetClipRect(CFX_RectF& rect) const { + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + FX_RECT r = m_renderDevice->GetClipBox(); + rect.left = (FX_FLOAT)r.left; + rect.top = (FX_FLOAT)r.top; + rect.width = (FX_FLOAT)r.Width(); + rect.height = (FX_FLOAT)r.Height(); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetClipRect(const CFX_RectF& rect) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - if (!_renderDevice->SetClip_Rect( - FX_RECT(FXSYS_round(rect.left), FXSYS_round(rect.top), - FXSYS_round(rect.right()), FXSYS_round(rect.bottom())))) { - return FX_ERR_Method_Not_Supported; - } - return FX_ERR_Succeeded; + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + if (!m_renderDevice->SetClip_Rect( + FX_RECT(FXSYS_round(rect.left), FXSYS_round(rect.top), + FXSYS_round(rect.right()), FXSYS_round(rect.bottom())))) { + return FX_ERR_Method_Not_Supported; } - default: { return FX_ERR_Property_Invalid; } + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::ClearClip() { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return FX_ERR_Succeeded; + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetFont(CFX_Font* font) { if (!font) return FX_ERR_Parameter_Invalid; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._font = font; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.font = font; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetFontSize(const FX_FLOAT size) { - FX_FLOAT fontSize = size <= 0 ? 1.0f : size; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._fontSize = fontSize; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.fontSize = size <= 0 ? 1.0f : size; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetFontHScale(const FX_FLOAT scale) { - FX_FLOAT fontHScale = scale <= 0 ? 1.0f : scale; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._fontHScale = fontHScale; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.fontHScale = scale <= 0 ? 1.0f : scale; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetCharSpacing(const FX_FLOAT spacing) { - FX_FLOAT fontSpacing = spacing < 0 ? 0 : spacing; - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - _info._fontSpacing = fontSpacing; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + m_info.fontSpacing = spacing < 0 ? 0 : spacing; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::SetTextDrawingMode(const int32_t mode) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return FX_ERR_Succeeded; + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::ShowText(const CFX_PointF& point, const CFX_WideString& text, CFX_Matrix* matrix) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - return RenderDeviceShowText(point, text, matrix); - } - default: { return FX_ERR_Property_Invalid; } - } + if (m_type == FX_CONTEXT_Device && m_renderDevice) + return RenderDeviceShowText(point, text, matrix); + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::CalcTextRect(CFX_RectF& rect, const CFX_WideString& text, FX_BOOL isMultiline, CFX_Matrix* matrix) { - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - int32_t length = text.GetLength(); - FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length); - FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length); - CalcTextInfo(text, charCodes, charPos, rect); - FX_Free(charPos); - FX_Free(charCodes); - return FX_ERR_Succeeded; - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + int32_t length = text.GetLength(); + FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length); + FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length); + CalcTextInfo(text, charCodes, charPos, rect); + FX_Free(charPos); + FX_Free(charCodes); + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics, const CFX_Matrix* matrix) { - if (!graphics) + if (!graphics || !graphics->m_renderDevice) return FX_ERR_Parameter_Invalid; CFX_Matrix m; - m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m.Concat(*matrix); } - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - { - if (!graphics->_renderDevice) - return FX_ERR_Parameter_Invalid; - CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap(); - FX_BOOL result = _renderDevice->SetDIBits(bitmap, 0, 0); - if (!result) - return FX_ERR_Method_Not_Supported; - } - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + CFX_DIBitmap* bitmap = graphics->m_renderDevice->GetBitmap(); + FX_BOOL result = m_renderDevice->SetDIBits(bitmap, 0, 0); + if (!result) + return FX_ERR_Method_Not_Supported; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics, FX_FLOAT srcLeft, FX_FLOAT srcTop, const CFX_RectF& dstRect, const CFX_Matrix* matrix) { - if (!graphics) + if (!graphics || !graphics->m_renderDevice) return FX_ERR_Parameter_Invalid; CFX_Matrix m; - m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m.Concat(*matrix); } - switch (_type) { - case FX_CONTEXT_Device: { - if (!_renderDevice) - return FX_ERR_Property_Invalid; - { - if (!graphics->_renderDevice) - return FX_ERR_Parameter_Invalid; - CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap(); - CFX_DIBitmap bmp; - FX_BOOL result = - bmp.Create((int32_t)dstRect.width, (int32_t)dstRect.height, - bitmap->GetFormat()); - if (!result) - return FX_ERR_Intermediate_Value_Invalid; - result = graphics->_renderDevice->GetDIBits(&bmp, (int32_t)srcLeft, - (int32_t)srcTop); - if (!result) - return FX_ERR_Method_Not_Supported; - result = _renderDevice->SetDIBits(&bmp, (int32_t)dstRect.left, - (int32_t)dstRect.top); - if (!result) - return FX_ERR_Method_Not_Supported; - return FX_ERR_Succeeded; - } - } - default: { return FX_ERR_Property_Invalid; } + if (m_type == FX_CONTEXT_Device && m_renderDevice) { + CFX_DIBitmap bmp; + FX_BOOL result = + bmp.Create((int32_t)dstRect.width, (int32_t)dstRect.height, + graphics->m_renderDevice->GetBitmap()->GetFormat()); + if (!result) + return FX_ERR_Intermediate_Value_Invalid; + result = graphics->m_renderDevice->GetDIBits(&bmp, (int32_t)srcLeft, + (int32_t)srcTop); + if (!result) + return FX_ERR_Method_Not_Supported; + result = m_renderDevice->SetDIBits(&bmp, (int32_t)dstRect.left, + (int32_t)dstRect.top); + if (!result) + return FX_ERR_Method_Not_Supported; + return FX_ERR_Succeeded; } + return FX_ERR_Property_Invalid; } + CFX_RenderDevice* CFX_Graphics::GetRenderDevice() { - return _renderDevice; + return m_renderDevice; } + FX_ERR CFX_Graphics::InverseRect(const CFX_RectF& rect) { - if (!_renderDevice) + if (!m_renderDevice) return FX_ERR_Property_Invalid; - CFX_DIBitmap* bitmap = _renderDevice->GetBitmap(); + CFX_DIBitmap* bitmap = m_renderDevice->GetBitmap(); if (!bitmap) return FX_ERR_Property_Invalid; CFX_RectF temp(rect); - _info._CTM.TransformRect(temp); + m_info.CTM.TransformRect(temp); CFX_RectF r; r.Set(0, 0, (FX_FLOAT)bitmap->GetWidth(), (FX_FLOAT)bitmap->GetWidth()); r.Intersect(temp); @@ -694,15 +498,16 @@ FX_ERR CFX_Graphics::InverseRect(const CFX_RectF& rect) { } return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::XorDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect) { - if (!_renderDevice) + if (!m_renderDevice) return FX_ERR_Property_Invalid; - CFX_DIBitmap* dst = _renderDevice->GetBitmap(); + CFX_DIBitmap* dst = m_renderDevice->GetBitmap(); if (!dst) return FX_ERR_Property_Invalid; CFX_RectF temp(rect); - _info._CTM.TransformRect(temp); + m_info.CTM.TransformRect(temp); CFX_RectF r; r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth()); r.Intersect(temp); @@ -729,15 +534,16 @@ FX_ERR CFX_Graphics::XorDIBitmap(const CFX_DIBitmap* srcBitmap, } return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::EqvDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect) { - if (!_renderDevice) + if (!m_renderDevice) return FX_ERR_Property_Invalid; - CFX_DIBitmap* dst = _renderDevice->GetBitmap(); + CFX_DIBitmap* dst = m_renderDevice->GetBitmap(); if (!dst) return FX_ERR_Property_Invalid; CFX_RectF temp(rect); - _info._CTM.TransformRect(temp); + m_info.CTM.TransformRect(temp); CFX_RectF r; r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth()); r.Intersect(temp); @@ -764,10 +570,11 @@ FX_ERR CFX_Graphics::EqvDIBitmap(const CFX_DIBitmap* srcBitmap, } return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) { switch (dashStyle) { case FX_DASHSTYLE_Solid: { - _info._graphState.SetDashCount(0); + m_info.graphState.SetDashCount(0); return FX_ERR_Succeeded; } case FX_DASHSTYLE_Dash: { @@ -790,72 +597,74 @@ FX_ERR CFX_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) { SetLineDash(0, dashArray, 6); return FX_ERR_Succeeded; } - default: { return FX_ERR_Parameter_Invalid; } + default: + return FX_ERR_Parameter_Invalid; } } + FX_ERR CFX_Graphics::RenderDeviceStrokePath(CFX_Path* path, CFX_Matrix* matrix) { - if (!_info._strokeColor) + if (!m_info.strokeColor) return FX_ERR_Property_Invalid; CFX_Matrix m; - m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m.Concat(*matrix); } - switch (_info._strokeColor->_type) { + switch (m_info.strokeColor->m_type) { case FX_COLOR_Solid: { - FX_BOOL result = _renderDevice->DrawPath( - path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState, 0x0, - _info._strokeColor->_argb, 0); + FX_BOOL result = m_renderDevice->DrawPath( + path->GetPathData(), (CFX_Matrix*)&m, &m_info.graphState, 0x0, + m_info.strokeColor->m_info.argb, 0); if (!result) return FX_ERR_Indefinite; return FX_ERR_Succeeded; } - case FX_COLOR_Pattern: { + case FX_COLOR_Pattern: return StrokePathWithPattern(path, &m); - } - case FX_COLOR_Shading: { + case FX_COLOR_Shading: return StrokePathWithShading(path, &m); - } - default: { return FX_ERR_Property_Invalid; } + default: + return FX_ERR_Property_Invalid; } } + FX_ERR CFX_Graphics::RenderDeviceFillPath(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { - if (!_info._fillColor) + if (!m_info.fillColor) return FX_ERR_Property_Invalid; CFX_Matrix m; - m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m.Concat(*matrix); } - switch (_info._fillColor->_type) { + switch (m_info.fillColor->m_type) { case FX_COLOR_Solid: { - FX_BOOL result = _renderDevice->DrawPath( - path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState, - _info._fillColor->_argb, 0x0, fillMode); + FX_BOOL result = m_renderDevice->DrawPath( + path->GetPathData(), (CFX_Matrix*)&m, &m_info.graphState, + m_info.fillColor->m_info.argb, 0x0, fillMode); if (!result) return FX_ERR_Indefinite; return FX_ERR_Succeeded; } - case FX_COLOR_Pattern: { - { return FillPathWithPattern(path, fillMode, &m); } - } - case FX_COLOR_Shading: { - { return FillPathWithShading(path, fillMode, &m); } - } - default: { return FX_ERR_Property_Invalid; } + case FX_COLOR_Pattern: + return FillPathWithPattern(path, fillMode, &m); + case FX_COLOR_Shading: + return FillPathWithShading(path, fillMode, &m); + default: + return FX_ERR_Property_Invalid; } } + FX_ERR CFX_Graphics::RenderDeviceDrawImage(CFX_DIBSource* source, const CFX_PointF& point, CFX_Matrix* matrix) { CFX_Matrix m1; - m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m1.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m1.Concat(*matrix); } @@ -864,74 +673,55 @@ FX_ERR CFX_Graphics::RenderDeviceDrawImage(CFX_DIBSource* source, point.x, point.y); m2.Concat(m1); int32_t left, top; - CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE); - CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m2, left, top); + std::unique_ptr bmp1(source->FlipImage(FALSE, TRUE)); + std::unique_ptr bmp2( + bmp1->TransformTo((CFX_Matrix*)&m2, left, top)); CFX_RectF r; GetClipRect(r); - FX_ERR result = FX_ERR_Indefinite; - { - CFX_DIBitmap* bitmap = _renderDevice->GetBitmap(); - CFX_DIBitmap bmp; - bmp.Create(bitmap->GetWidth(), bitmap->GetHeight(), FXDIB_Argb); - _renderDevice->GetDIBits(&bmp, 0, 0); - bmp.TransferBitmap(FXSYS_round(r.left), FXSYS_round(r.top), - FXSYS_round(r.Width()), FXSYS_round(r.Height()), bmp2, - FXSYS_round(r.left - left), FXSYS_round(r.top - top)); - _renderDevice->SetDIBits(&bmp, 0, 0); - result = FX_ERR_Succeeded; - } - if (bmp2) { - delete bmp2; - bmp2 = NULL; - } - if (bmp1) { - delete bmp1; - bmp1 = NULL; + CFX_DIBitmap* bitmap = m_renderDevice->GetBitmap(); + CFX_DIBitmap bmp; + if (bmp.Create(bitmap->GetWidth(), bitmap->GetHeight(), FXDIB_Argb) && + m_renderDevice->GetDIBits(&bmp, 0, 0) && + bmp.TransferBitmap(FXSYS_round(r.left), FXSYS_round(r.top), + FXSYS_round(r.Width()), FXSYS_round(r.Height()), + bmp2.get(), FXSYS_round(r.left - left), + FXSYS_round(r.top - top)) && + m_renderDevice->SetDIBits(&bmp, 0, 0)) { + return FX_ERR_Succeeded; } - return result; + return FX_ERR_Indefinite; } + FX_ERR CFX_Graphics::RenderDeviceStretchImage(CFX_DIBSource* source, const CFX_RectF& rect, CFX_Matrix* matrix) { CFX_Matrix m1; - m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); + m1.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); if (matrix) { m1.Concat(*matrix); } - CFX_DIBitmap* bmp1 = - source->StretchTo((int32_t)rect.Width(), (int32_t)rect.Height()); + std::unique_ptr bmp1( + source->StretchTo((int32_t)rect.Width(), (int32_t)rect.Height())); CFX_Matrix m2; m2.Set(rect.Width(), 0.0, 0.0, rect.Height(), rect.left, rect.top); m2.Concat(m1); int32_t left, top; - CFX_DIBitmap* bmp2 = bmp1->FlipImage(FALSE, TRUE); - CFX_DIBitmap* bmp3 = bmp2->TransformTo((CFX_Matrix*)&m2, left, top); + std::unique_ptr bmp2(bmp1->FlipImage(FALSE, TRUE)); + std::unique_ptr bmp3( + bmp2->TransformTo((CFX_Matrix*)&m2, left, top)); CFX_RectF r; GetClipRect(r); - FX_ERR result = FX_ERR_Indefinite; - { - CFX_DIBitmap* bitmap = _renderDevice->GetBitmap(); - bitmap->CompositeBitmap(FXSYS_round(r.left), FXSYS_round(r.top), - FXSYS_round(r.Width()), FXSYS_round(r.Height()), - bmp3, FXSYS_round(r.left - left), - FXSYS_round(r.top - top)); - result = FX_ERR_Succeeded; - } - if (bmp3) { - delete bmp3; - bmp3 = NULL; - } - if (bmp2) { - delete bmp2; - bmp2 = NULL; - } - if (bmp1) { - delete bmp1; - bmp1 = NULL; + CFX_DIBitmap* bitmap = m_renderDevice->GetBitmap(); + if (bitmap->CompositeBitmap(FXSYS_round(r.left), FXSYS_round(r.top), + FXSYS_round(r.Width()), FXSYS_round(r.Height()), + bmp3.get(), FXSYS_round(r.left - left), + FXSYS_round(r.top - top))) { + return FX_ERR_Succeeded; } - return result; + return FX_ERR_Indefinite; } + FX_ERR CFX_Graphics::RenderDeviceShowText(const CFX_PointF& point, const CFX_WideString& text, CFX_Matrix* matrix) { @@ -942,54 +732,58 @@ FX_ERR CFX_Graphics::RenderDeviceShowText(const CFX_PointF& point, rect.Set(point.x, point.y, 0, 0); CalcTextInfo(text, charCodes, charPos, rect); CFX_Matrix m; - m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, - _info._CTM.f); - m.Translate(0, _info._fontSize * _info._fontHScale); + m.Set(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d, m_info.CTM.e, + m_info.CTM.f); + m.Translate(0, m_info.fontSize * m_info.fontHScale); if (matrix) { m.Concat(*matrix); } - FX_BOOL result = _renderDevice->DrawNormalText( - length, charPos, _info._font, CFX_GEModule::Get()->GetFontCache(), - -_info._fontSize * _info._fontHScale, (CFX_Matrix*)&m, - _info._fillColor->_argb, FXTEXT_CLEARTYPE); + FX_BOOL result = m_renderDevice->DrawNormalText( + length, charPos, m_info.font, CFX_GEModule::Get()->GetFontCache(), + -m_info.fontSize * m_info.fontHScale, (CFX_Matrix*)&m, + m_info.fillColor->m_info.argb, FXTEXT_CLEARTYPE); if (!result) return FX_ERR_Indefinite; FX_Free(charPos); FX_Free(charCodes); return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix) { return FX_ERR_Method_Not_Supported; } + FX_ERR CFX_Graphics::StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix) { return FX_ERR_Method_Not_Supported; } + FX_ERR CFX_Graphics::FillPathWithPattern(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { - CFX_Pattern* pattern = _info._fillColor->_pattern; - CFX_DIBitmap* bitmap = _renderDevice->GetBitmap(); + CFX_Pattern* pattern = m_info.fillColor->m_info.pattern; + CFX_DIBitmap* bitmap = m_renderDevice->GetBitmap(); int32_t width = bitmap->GetWidth(); int32_t height = bitmap->GetHeight(); CFX_DIBitmap bmp; bmp.Create(width, height, FXDIB_Argb); - _renderDevice->GetDIBits(&bmp, 0, 0); - switch (pattern->_type) { + m_renderDevice->GetDIBits(&bmp, 0, 0); + switch (pattern->m_type) { case FX_PATTERN_Bitmap: { - int32_t xStep = FXSYS_round(pattern->_x1Step); - int32_t yStep = FXSYS_round(pattern->_y1Step); + int32_t xStep = FXSYS_round(pattern->m_bitmapInfo.x1Step); + int32_t yStep = FXSYS_round(pattern->m_bitmapInfo.y1Step); int32_t xCount = width / xStep + 1; int32_t yCount = height / yStep + 1; for (int32_t i = 0; i <= yCount; i++) { for (int32_t j = 0; j <= xCount; j++) { bmp.TransferBitmap(j * xStep, i * yStep, xStep, yStep, - pattern->_bitmap, 0, 0); + pattern->m_bitmapInfo.bitmap, 0, 0); } } break; } case FX_PATTERN_Hatch: { - FX_HatchStyle hatchStyle = _info._fillColor->_pattern->_hatchStyle; + FX_HatchStyle hatchStyle = + m_info.fillColor->m_info.pattern->m_hatchInfo.hatchStyle; if (hatchStyle < FX_HATCHSTYLE_Horizontal || hatchStyle > FX_HATCHSTYLE_SolidDiamond) { return FX_ERR_Intermediate_Value_Invalid; @@ -1007,38 +801,42 @@ FX_ERR CFX_Graphics::FillPathWithPattern(CFX_Path* path, FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); CFX_FxgeDevice device; device.Attach(&bmp); - device.FillRect(&rect, _info._fillColor->_pattern->_backArgb); + device.FillRect(&rect, + m_info.fillColor->m_info.pattern->m_hatchInfo.backArgb); for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight()) { for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) { - device.SetBitMask(&mask, i, j, _info._fillColor->_pattern->_foreArgb); + device.SetBitMask( + &mask, i, j, + m_info.fillColor->m_info.pattern->m_hatchInfo.foreArgb); } } break; } } - _renderDevice->SaveState(); - _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix, - fillMode); - SetDIBitsWithMatrix(&bmp, &pattern->_matrix); - _renderDevice->RestoreState(); + m_renderDevice->SaveState(); + m_renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix, + fillMode); + SetDIBitsWithMatrix(&bmp, &pattern->m_matrix); + m_renderDevice->RestoreState(); return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { - CFX_DIBitmap* bitmap = _renderDevice->GetBitmap(); + CFX_DIBitmap* bitmap = m_renderDevice->GetBitmap(); int32_t width = bitmap->GetWidth(); int32_t height = bitmap->GetHeight(); - FX_FLOAT start_x = _info._fillColor->_shading->_beginPoint.x; - FX_FLOAT start_y = _info._fillColor->_shading->_beginPoint.y; - FX_FLOAT end_x = _info._fillColor->_shading->_endPoint.x; - FX_FLOAT end_y = _info._fillColor->_shading->_endPoint.y; + FX_FLOAT start_x = m_info.fillColor->m_shading->m_beginPoint.x; + FX_FLOAT start_y = m_info.fillColor->m_shading->m_beginPoint.y; + FX_FLOAT end_x = m_info.fillColor->m_shading->m_endPoint.x; + FX_FLOAT end_y = m_info.fillColor->m_shading->m_endPoint.y; CFX_DIBitmap bmp; bmp.Create(width, height, FXDIB_Argb); - _renderDevice->GetDIBits(&bmp, 0, 0); + m_renderDevice->GetDIBits(&bmp, 0, 0); int32_t pitch = bmp.GetPitch(); FX_BOOL result = FALSE; - switch (_info._fillColor->_shading->_type) { + switch (m_info.fillColor->m_shading->m_type) { case FX_SHADING_Axial: { FX_FLOAT x_span = end_x - start_x; FX_FLOAT y_span = end_y - start_y; @@ -1052,26 +850,26 @@ FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path, (((x - start_x) * x_span) + ((y - start_y) * y_span)) / axis_len_square; if (scale < 0) { - if (!_info._fillColor->_shading->_isExtendedBegin) { + if (!m_info.fillColor->m_shading->m_isExtendedBegin) { continue; } scale = 0; } else if (scale > 1.0f) { - if (!_info._fillColor->_shading->_isExtendedEnd) { + if (!m_info.fillColor->m_shading->m_isExtendedEnd) { continue; } scale = 1.0f; } int32_t index = (int32_t)(scale * (FX_SHADING_Steps - 1)); - dib_buf[column] = _info._fillColor->_shading->_argbArray[index]; + dib_buf[column] = m_info.fillColor->m_shading->m_argbArray[index]; } } result = TRUE; break; } case FX_SHADING_Radial: { - FX_FLOAT start_r = _info._fillColor->_shading->_beginRadius; - FX_FLOAT end_r = _info._fillColor->_shading->_endRadius; + FX_FLOAT start_r = m_info.fillColor->m_shading->m_beginRadius; + FX_FLOAT end_r = m_info.fillColor->m_shading->m_endRadius; FX_FLOAT a = ((start_x - end_x) * (start_x - end_x)) + ((start_y - end_y) * (start_y - end_y)) - ((start_r - end_r) * (start_r - end_r)); @@ -1102,7 +900,7 @@ FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path, s2 = (-b - root) / (2 * a); s1 = (-b + root) / (2 * a); } - if (s2 <= 1.0f || _info._fillColor->_shading->_isExtendedEnd) { + if (s2 <= 1.0f || m_info.fillColor->m_shading->m_isExtendedEnd) { s = (s2); } else { s = (s1); @@ -1112,19 +910,19 @@ FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path, } } if (s < 0) { - if (!_info._fillColor->_shading->_isExtendedBegin) { + if (!m_info.fillColor->m_shading->m_isExtendedBegin) { continue; } s = 0; } if (s > 1.0f) { - if (!_info._fillColor->_shading->_isExtendedEnd) { + if (!m_info.fillColor->m_shading->m_isExtendedEnd) { continue; } s = 1.0f; } int index = (int32_t)(s * (FX_SHADING_Steps - 1)); - dib_buf[column] = _info._fillColor->_shading->_argbArray[index]; + dib_buf[column] = m_info.fillColor->m_shading->m_argbArray[index]; } } result = TRUE; @@ -1133,44 +931,39 @@ FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path, default: { result = FALSE; } } if (result) { - _renderDevice->SaveState(); - _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix, - fillMode); + m_renderDevice->SaveState(); + m_renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix, + fillMode); SetDIBitsWithMatrix(&bmp, matrix); - _renderDevice->RestoreState(); + m_renderDevice->RestoreState(); } return result; } + FX_ERR CFX_Graphics::SetDIBitsWithMatrix(CFX_DIBSource* source, CFX_Matrix* matrix) { if (matrix->IsIdentity()) { - _renderDevice->SetDIBits(source, 0, 0); + m_renderDevice->SetDIBits(source, 0, 0); } else { CFX_Matrix m; m.Set((FX_FLOAT)source->GetWidth(), 0, 0, (FX_FLOAT)source->GetHeight(), 0, 0); m.Concat(*matrix); int32_t left, top; - CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE); - CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m, left, top); - _renderDevice->SetDIBits(bmp2, left, top); - if (bmp2) { - delete bmp2; - bmp2 = NULL; - } - if (bmp1) { - delete bmp1; - bmp1 = NULL; - } + std::unique_ptr bmp1(source->FlipImage(FALSE, TRUE)); + std::unique_ptr bmp2( + bmp1->TransformTo((CFX_Matrix*)&m, left, top)); + m_renderDevice->SetDIBits(bmp2.get(), left, top); } return FX_ERR_Succeeded; } + FX_ERR CFX_Graphics::CalcTextInfo(const CFX_WideString& text, FX_DWORD* charCodes, FXTEXT_CHARPOS* charPos, CFX_RectF& rect) { std::unique_ptr encoding( - new CFX_UnicodeEncoding(_info._font)); + new CFX_UnicodeEncoding(m_info.font)); int32_t length = text.GetLength(); FX_FLOAT penX = (FX_FLOAT)rect.left; FX_FLOAT penY = (FX_FLOAT)rect.top; @@ -1181,124 +974,160 @@ FX_ERR CFX_Graphics::CalcTextInfo(const CFX_WideString& text, charPos[0].m_OriginY = penY + top; charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[0]); charPos[0].m_FontCharWidth = FXSYS_round( - _info._font->GetGlyphWidth(charPos[0].m_GlyphIndex) * _info._fontHScale); + m_info.font->GetGlyphWidth(charPos[0].m_GlyphIndex) * m_info.fontHScale); charPos[0].m_bGlyphAdjust = TRUE; charPos[0].m_AdjustMatrix[0] = -1; charPos[0].m_AdjustMatrix[1] = 0; charPos[0].m_AdjustMatrix[2] = 0; charPos[0].m_AdjustMatrix[3] = 1; - penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * _info._fontSize / 1000 + - _info._fontSpacing; + penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * m_info.fontSize / 1000 + + m_info.fontSpacing; for (int32_t i = 1; i < length; i++) { charCodes[i] = text.GetAt(i); charPos[i].m_OriginX = penX + left; charPos[i].m_OriginY = penY + top; charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[i]); charPos[i].m_FontCharWidth = - FXSYS_round(_info._font->GetGlyphWidth(charPos[i].m_GlyphIndex) * - _info._fontHScale); + FXSYS_round(m_info.font->GetGlyphWidth(charPos[i].m_GlyphIndex) * + m_info.fontHScale); charPos[i].m_bGlyphAdjust = TRUE; charPos[i].m_AdjustMatrix[0] = -1; charPos[i].m_AdjustMatrix[1] = 0; charPos[i].m_AdjustMatrix[2] = 0; charPos[i].m_AdjustMatrix[3] = 1; - penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * _info._fontSize / 1000 + - _info._fontSpacing; + penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * m_info.fontSize / 1000 + + m_info.fontSpacing; } rect.width = (FX_FLOAT)penX - rect.left; - rect.height = rect.top + _info._fontSize * _info._fontHScale - rect.top; + rect.height = rect.top + m_info.fontSize * m_info.fontHScale - rect.top; return FX_ERR_Succeeded; } + +CFX_Graphics::TInfo::TInfo(const TInfo& info) + : graphState(info.graphState), + isAntialiasing(info.isAntialiasing), + strokeAlignment(info.strokeAlignment), + CTM(info.CTM), + isActOnDash(info.isActOnDash), + strokeColor(info.strokeColor), + fillColor(info.fillColor), + font(info.font), + fontSize(info.fontSize), + fontHScale(info.fontHScale), + fontSpacing(info.fontSpacing) {} + +CFX_Graphics::TInfo& CFX_Graphics::TInfo::operator=(const TInfo& other) { + graphState.Copy(other.graphState); + isAntialiasing = other.isAntialiasing; + strokeAlignment = other.strokeAlignment; + CTM = other.CTM; + isActOnDash = other.isActOnDash; + strokeColor = other.strokeColor; + fillColor = other.fillColor; + font = other.font; + fontSize = other.fontSize; + fontHScale = other.fontHScale; + fontSpacing = other.fontSpacing; + return *this; +} + CAGG_Graphics::CAGG_Graphics() { - _owner = NULL; + m_owner = nullptr; } + FX_ERR CAGG_Graphics::Create(CFX_Graphics* owner, int32_t width, int32_t height, FXDIB_Format format) { - if (owner->_renderDevice) { + if (owner->m_renderDevice) return FX_ERR_Parameter_Invalid; - } - if (_owner) { + if (m_owner) return FX_ERR_Property_Invalid; - } + CFX_FxgeDevice* device = new CFX_FxgeDevice; device->Create(width, height, format); - _owner = owner; - _owner->_renderDevice = device; - _owner->_renderDevice->GetBitmap()->Clear(0xFFFFFFFF); + m_owner = owner; + m_owner->m_renderDevice = device; + m_owner->m_renderDevice->GetBitmap()->Clear(0xFFFFFFFF); return FX_ERR_Succeeded; } + CAGG_Graphics::~CAGG_Graphics() { - if (_owner->_renderDevice) { - delete (CFX_FxgeDevice*)_owner->_renderDevice; - } - _owner = NULL; + if (m_owner->m_renderDevice) + delete (CFX_FxgeDevice*)m_owner->m_renderDevice; + m_owner = nullptr; } + CFX_Path::CFX_Path() { - _generator = NULL; + m_generator = nullptr; } + FX_ERR CFX_Path::Create() { - if (_generator) { + if (m_generator) return FX_ERR_Property_Invalid; - } - _generator = new CFX_PathGenerator; - _generator->Create(); + + m_generator = new CFX_PathGenerator; + m_generator->Create(); return FX_ERR_Succeeded; } + CFX_Path::~CFX_Path() { - if (_generator) { - delete _generator; - _generator = NULL; - } + delete m_generator; } + FX_ERR CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->MoveTo(x, y); + m_generator->MoveTo(x, y); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->LineTo(x, y); + m_generator->LineTo(x, y); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::BezierTo(FX_FLOAT ctrlX1, FX_FLOAT ctrlY1, FX_FLOAT ctrlX2, FX_FLOAT ctrlY2, FX_FLOAT toX, FX_FLOAT toY) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY); + m_generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::ArcTo(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2, - startAngle, sweepAngle); + m_generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2, + startAngle, sweepAngle); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::Close() { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->Close(); + m_generator->Close(); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddLine(x1, y1, x2, y2); + m_generator->AddLine(x1, y1, x2, y2); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddBezier(FX_FLOAT startX, FX_FLOAT startY, FX_FLOAT ctrlX1, @@ -1307,150 +1136,165 @@ FX_ERR CFX_Path::AddBezier(FX_FLOAT startX, FX_FLOAT ctrlY2, FX_FLOAT endX, FX_FLOAT endY) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX, - endY); + m_generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX, + endY); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddRectangle(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddRectangle(left, top, left + width, top + height); + m_generator->AddRectangle(left, top, left + width, top + height); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddEllipse(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddEllipse(left + width / 2, top + height / 2, width / 2, - height / 2); + m_generator->AddEllipse(left + width / 2, top + height / 2, width / 2, + height / 2); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddEllipse(const CFX_RectF& rect) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddEllipse(rect.left + rect.Width() / 2, - rect.top + rect.Height() / 2, rect.Width() / 2, - rect.Height() / 2); + m_generator->AddEllipse(rect.left + rect.Width() / 2, + rect.top + rect.Height() / 2, rect.Width() / 2, + rect.Height() / 2); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddArc(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2, - startAngle, sweepAngle); + m_generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2, + startAngle, sweepAngle); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddPie(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2, - startAngle, sweepAngle); + m_generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2, + startAngle, sweepAngle); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::AddSubpath(CFX_Path* path) { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->AddPathData(path->GetPathData()); + m_generator->AddPathData(path->GetPathData()); return FX_ERR_Succeeded; } + FX_ERR CFX_Path::Clear() { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - _generator->GetPathData()->SetPointCount(0); + m_generator->GetPathData()->SetPointCount(0); return FX_ERR_Succeeded; } + FX_BOOL CFX_Path::IsEmpty() { - if (!_generator) + if (!m_generator) return FX_ERR_Property_Invalid; - if (_generator->GetPathData()->GetPointCount() == 0) { + if (m_generator->GetPathData()->GetPointCount() == 0) { return TRUE; } return FALSE; } + CFX_PathData* CFX_Path::GetPathData() { - if (!_generator) - return NULL; - return _generator->GetPathData(); -} -CFX_Color::CFX_Color() { - _type = FX_COLOR_None; + if (!m_generator) + return nullptr; + return m_generator->GetPathData(); } + +CFX_Color::CFX_Color() : m_type(FX_COLOR_None) {} + CFX_Color::CFX_Color(const FX_ARGB argb) { - _type = FX_COLOR_None; Set(argb); } + CFX_Color::CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb) { - _type = FX_COLOR_None; Set(pattern, argb); } + CFX_Color::CFX_Color(CFX_Shading* shading) { - _type = FX_COLOR_None; Set(shading); } + CFX_Color::~CFX_Color() { - _type = FX_COLOR_None; + m_type = FX_COLOR_None; } + FX_ERR CFX_Color::Set(const FX_ARGB argb) { - _type = FX_COLOR_Solid; - _argb = argb; - _pattern = NULL; + m_type = FX_COLOR_Solid; + m_info.argb = argb; + m_info.pattern = nullptr; return FX_ERR_Succeeded; } + FX_ERR CFX_Color::Set(CFX_Pattern* pattern, const FX_ARGB argb) { if (!pattern) return FX_ERR_Parameter_Invalid; - _type = FX_COLOR_Pattern; - _argb = argb; - _pattern = pattern; + m_type = FX_COLOR_Pattern; + m_info.argb = argb; + m_info.pattern = pattern; return FX_ERR_Succeeded; } + FX_ERR CFX_Color::Set(CFX_Shading* shading) { if (!shading) return FX_ERR_Parameter_Invalid; - _type = FX_COLOR_Shading; - _shading = shading; + m_type = FX_COLOR_Shading; + m_shading = shading; return FX_ERR_Succeeded; } + CFX_Pattern::CFX_Pattern() { - _type = FX_PATTERN_None; - _matrix.SetIdentity(); + m_type = FX_PATTERN_None; + m_matrix.SetIdentity(); } + FX_ERR CFX_Pattern::Create(CFX_DIBitmap* bitmap, const FX_FLOAT xStep, const FX_FLOAT yStep, CFX_Matrix* matrix) { if (!bitmap) return FX_ERR_Parameter_Invalid; - if (_type != FX_PATTERN_None) { + if (m_type != FX_PATTERN_None) { return FX_ERR_Property_Invalid; } - _type = FX_PATTERN_Bitmap; - _bitmap = bitmap; - _x1Step = xStep; - _y1Step = yStep; + m_type = FX_PATTERN_Bitmap; + m_bitmapInfo.bitmap = bitmap; + m_bitmapInfo.x1Step = xStep; + m_bitmapInfo.y1Step = yStep; if (matrix) { - _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, - matrix->f); + m_matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, + matrix->f); } return FX_ERR_Succeeded; } + FX_ERR CFX_Pattern::Create(FX_HatchStyle hatchStyle, const FX_ARGB foreArgb, const FX_ARGB backArgb, @@ -1459,43 +1303,47 @@ FX_ERR CFX_Pattern::Create(FX_HatchStyle hatchStyle, hatchStyle > FX_HATCHSTYLE_SolidDiamond) { return FX_ERR_Parameter_Invalid; } - if (_type != FX_PATTERN_None) { + if (m_type != FX_PATTERN_None) { return FX_ERR_Property_Invalid; } - _type = FX_PATTERN_Hatch; - _hatchStyle = hatchStyle; - _foreArgb = foreArgb; - _backArgb = backArgb; + m_type = FX_PATTERN_Hatch; + m_hatchInfo.hatchStyle = hatchStyle; + m_hatchInfo.foreArgb = foreArgb; + m_hatchInfo.backArgb = backArgb; if (matrix) { - _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, - matrix->f); + m_matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, + matrix->f); } return FX_ERR_Succeeded; } + CFX_Pattern::~CFX_Pattern() { - _type = FX_PATTERN_None; + m_type = FX_PATTERN_None; } + CFX_Shading::CFX_Shading() { - _type = FX_SHADING_None; + m_type = FX_SHADING_None; } + FX_ERR CFX_Shading::CreateAxial(const CFX_PointF& beginPoint, const CFX_PointF& endPoint, FX_BOOL isExtendedBegin, FX_BOOL isExtendedEnd, const FX_ARGB beginArgb, const FX_ARGB endArgb) { - if (_type != FX_SHADING_None) { + if (m_type != FX_SHADING_None) { return FX_ERR_Property_Invalid; } - _type = FX_SHADING_Axial; - _beginPoint = beginPoint; - _endPoint = endPoint; - _isExtendedBegin = isExtendedBegin; - _isExtendedEnd = isExtendedEnd; - _beginArgb = beginArgb; - _endArgb = endArgb; + m_type = FX_SHADING_Axial; + m_beginPoint = beginPoint; + m_endPoint = endPoint; + m_isExtendedBegin = isExtendedBegin; + m_isExtendedEnd = isExtendedEnd; + m_beginArgb = beginArgb; + m_endArgb = endArgb; return InitArgbArray(); } + FX_ERR CFX_Shading::CreateRadial(const CFX_PointF& beginPoint, const CFX_PointF& endPoint, const FX_FLOAT beginRadius, @@ -1504,28 +1352,30 @@ FX_ERR CFX_Shading::CreateRadial(const CFX_PointF& beginPoint, FX_BOOL isExtendedEnd, const FX_ARGB beginArgb, const FX_ARGB endArgb) { - if (_type != FX_SHADING_None) { + if (m_type != FX_SHADING_None) { return FX_ERR_Property_Invalid; } - _type = FX_SHADING_Radial; - _beginPoint = beginPoint; - _endPoint = endPoint; - _beginRadius = beginRadius; - _endRadius = endRadius; - _isExtendedBegin = isExtendedBegin; - _isExtendedEnd = isExtendedEnd; - _beginArgb = beginArgb; - _endArgb = endArgb; + m_type = FX_SHADING_Radial; + m_beginPoint = beginPoint; + m_endPoint = endPoint; + m_beginRadius = beginRadius; + m_endRadius = endRadius; + m_isExtendedBegin = isExtendedBegin; + m_isExtendedEnd = isExtendedEnd; + m_beginArgb = beginArgb; + m_endArgb = endArgb; return InitArgbArray(); } + CFX_Shading::~CFX_Shading() { - _type = FX_SHADING_None; + m_type = FX_SHADING_None; } + FX_ERR CFX_Shading::InitArgbArray() { int32_t a1, r1, g1, b1; - ArgbDecode(_beginArgb, a1, r1, g1, b1); + ArgbDecode(m_beginArgb, a1, r1, g1, b1); int32_t a2, r2, g2, b2; - ArgbDecode(_endArgb, a2, r2, g2, b2); + ArgbDecode(m_endArgb, a2, r2, g2, b2); FX_FLOAT f = (FX_FLOAT)(FX_SHADING_Steps - 1); FX_FLOAT aScale = (FX_FLOAT)(1.0 * (a2 - a1) / f); FX_FLOAT rScale = (FX_FLOAT)(1.0 * (r2 - r1) / f); @@ -1537,12 +1387,8 @@ FX_ERR CFX_Shading::InitArgbArray() { r3 = (int32_t)(i * rScale); g3 = (int32_t)(i * gScale); b3 = (int32_t)(i * bScale); - _argbArray[i] = + m_argbArray[i] = FXARGB_TODIB(FXARGB_MAKE((a1 + a3), (r1 + r3), (g1 + g3), (b1 + b3))); } return FX_ERR_Succeeded; } -class CFX_Pause : public IFX_Pause { - public: - virtual FX_BOOL NeedToPauseNow() { return TRUE; } -}; diff --git a/xfa/include/fxgraphics/fx_graphics.h b/xfa/include/fxgraphics/fx_graphics.h index c22d00995e..c2d22719d9 100644 --- a/xfa/include/fxgraphics/fx_graphics.h +++ b/xfa/include/fxgraphics/fx_graphics.h @@ -101,115 +101,96 @@ class CFX_DIBitmap; class CFX_Font; class CFX_WideString; class CFX_PathGenerator; -class CAGG_Graphics; class CFX_Graphics; class CFX_Color; class CFX_Path; class CFX_Pattern; class CFX_Shading; + +class CAGG_Graphics { + public: + CAGG_Graphics(); + virtual ~CAGG_Graphics(); + + FX_ERR Create(CFX_Graphics* owner, + int32_t width, + int32_t height, + FXDIB_Format format); + + private: + CFX_Graphics* m_owner; +}; + class CFX_Graphics { public: CFX_Graphics(); + virtual ~CFX_Graphics(); FX_ERR Create(CFX_RenderDevice* renderDevice, FX_BOOL isAntialiasing = TRUE); - FX_ERR Create(int32_t width, int32_t height, FXDIB_Format format, FX_BOOL isNative = TRUE, FX_BOOL isAntialiasing = TRUE); - virtual ~CFX_Graphics(); - FX_ERR GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal); FX_ERR IsPrinterDevice(FX_BOOL& isPrinter); FX_ERR EnableAntialiasing(FX_BOOL isAntialiasing); FX_ERR SaveGraphState(); - FX_ERR RestoreGraphState(); - FX_ERR GetLineCap(CFX_GraphStateData::LineCap& lineCap); + FX_ERR GetLineCap(CFX_GraphStateData::LineCap& lineCap) const; + FX_ERR GetDashCount(int32_t& dashCount) const; + FX_ERR GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray) const; + FX_ERR GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) const; + FX_ERR GetMiterLimit(FX_FLOAT& miterLimit) const; + FX_ERR GetLineWidth(FX_FLOAT& lineWidth) const; + FX_ERR GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment) const; + FX_ERR GetClipRect(CFX_RectF& rect) const; + CFX_Matrix* GetMatrix(); + CFX_RenderDevice* GetRenderDevice(); FX_ERR SetLineCap(CFX_GraphStateData::LineCap lineCap); - - FX_ERR GetDashCount(int32_t& dashCount); - - FX_ERR GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray); - FX_ERR SetLineDash(FX_FLOAT dashPhase, FX_FLOAT* dashArray, int32_t dashCount); - FX_ERR SetLineDash(FX_DashStyle dashStyle); - - FX_ERR GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin); - FX_ERR SetLineJoin(CFX_GraphStateData::LineJoin lineJoin); - - FX_ERR GetMiterLimit(FX_FLOAT& miterLimit); - FX_ERR SetMiterLimit(FX_FLOAT miterLimit); - - FX_ERR GetLineWidth(FX_FLOAT& lineWidth); - FX_ERR SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash = FALSE); - - FX_ERR GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment); - FX_ERR SetStrokeAlignment(FX_StrokeAlignment strokeAlignment); - FX_ERR SetStrokeColor(CFX_Color* color); - FX_ERR SetFillColor(CFX_Color* color); + FX_ERR SetClipRect(const CFX_RectF& rect); + FX_ERR SetFont(CFX_Font* font); + FX_ERR SetFontSize(const FX_FLOAT size); + FX_ERR SetFontHScale(const FX_FLOAT scale); + FX_ERR SetCharSpacing(const FX_FLOAT spacing); + FX_ERR SetTextDrawingMode(const int32_t mode); FX_ERR StrokePath(CFX_Path* path, CFX_Matrix* matrix = NULL); - FX_ERR FillPath(CFX_Path* path, FX_FillMode fillMode = FXFILL_WINDING, CFX_Matrix* matrix = NULL); - FX_ERR ClipPath(CFX_Path* path, FX_FillMode fillMode = FXFILL_WINDING, CFX_Matrix* matrix = NULL); - FX_ERR DrawImage(CFX_DIBSource* source, const CFX_PointF& point, CFX_Matrix* matrix = NULL); - FX_ERR StretchImage(CFX_DIBSource* source, const CFX_RectF& rect, CFX_Matrix* matrix = NULL); - FX_ERR ConcatMatrix(const CFX_Matrix* matrix); - - CFX_Matrix* GetMatrix(); - - FX_ERR GetClipRect(CFX_RectF& rect); - - FX_ERR SetClipRect(const CFX_RectF& rect); - FX_ERR ClearClip(); - - FX_ERR SetFont(CFX_Font* font); - - FX_ERR SetFontSize(const FX_FLOAT size); - - FX_ERR SetFontHScale(const FX_FLOAT scale); - - FX_ERR SetCharSpacing(const FX_FLOAT spacing); - - FX_ERR SetTextDrawingMode(const int32_t mode); - FX_ERR ShowText(const CFX_PointF& point, const CFX_WideString& text, CFX_Matrix* matrix = NULL); - FX_ERR CalcTextRect(CFX_RectF& rect, const CFX_WideString& text, FX_BOOL isMultiline = FALSE, CFX_Matrix* matrix = NULL); - FX_ERR Transfer(CFX_Graphics* graphics, const CFX_Matrix* matrix); FX_ERR Transfer(CFX_Graphics* graphics, FX_FLOAT srcLeft, @@ -217,44 +198,36 @@ class CFX_Graphics { const CFX_RectF& dstRect, const CFX_Matrix* matrix); - CFX_RenderDevice* GetRenderDevice(); - FX_ERR InverseRect(const CFX_RectF& rect); FX_ERR XorDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect); FX_ERR EqvDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect); private: FX_ERR RenderDeviceSetLineDash(FX_DashStyle dashStyle); - FX_ERR RenderDeviceStrokePath(CFX_Path* path, CFX_Matrix* matrix); - FX_ERR RenderDeviceFillPath(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix); - FX_ERR RenderDeviceDrawImage(CFX_DIBSource* source, const CFX_PointF& point, CFX_Matrix* matrix); - FX_ERR RenderDeviceStretchImage(CFX_DIBSource* source, const CFX_RectF& rect, CFX_Matrix* matrix); - FX_ERR RenderDeviceShowText(const CFX_PointF& point, const CFX_WideString& text, CFX_Matrix* matrix); FX_ERR StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix); - FX_ERR StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix); FX_ERR FillPathWithPattern(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix); - FX_ERR FillPathWithShading(CFX_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix); + FX_ERR SetDIBitsWithMatrix(CFX_DIBSource* source, CFX_Matrix* matrix); FX_ERR CalcTextInfo(const CFX_WideString& text, FX_DWORD* charCodes, @@ -262,57 +235,64 @@ class CFX_Graphics { CFX_RectF& rect); protected: - int32_t _type; + int32_t m_type; private: struct TInfo { - CFX_GraphStateData _graphState; - FX_BOOL _isAntialiasing; - FX_StrokeAlignment _strokeAlignment; - CFX_Matrix _CTM; - FX_BOOL _isActOnDash; - CFX_Color* _strokeColor; - CFX_Color* _fillColor; - CFX_Font* _font; - FX_FLOAT _fontSize; - FX_FLOAT _fontHScale; - FX_FLOAT _fontSpacing; - } _info; - CFX_RenderDevice* _renderDevice; - CFX_PtrArray _infoStack; - CAGG_Graphics* _aggGraphics; + TInfo() + : isAntialiasing(TRUE), + strokeAlignment(FX_STROKEALIGNMENT_Center), + isActOnDash(FALSE), + strokeColor(nullptr), + fillColor(nullptr), + font(nullptr), + fontSize(40.0), + fontHScale(1.0), + fontSpacing(0.0) {} + explicit TInfo(const TInfo& info); + TInfo& operator=(const TInfo& other); + + CFX_GraphStateData graphState; + FX_BOOL isAntialiasing; + FX_StrokeAlignment strokeAlignment; + CFX_Matrix CTM; + FX_BOOL isActOnDash; + CFX_Color* strokeColor; + CFX_Color* fillColor; + CFX_Font* font; + FX_FLOAT fontSize; + FX_FLOAT fontHScale; + FX_FLOAT fontSpacing; + } m_info; + CFX_RenderDevice* m_renderDevice; + CFX_PtrArray m_infoStack; + CAGG_Graphics* m_aggGraphics; friend class CAGG_Graphics; }; + class CFX_Path { public: CFX_Path(); - - FX_ERR Create(); - virtual ~CFX_Path(); + FX_ERR Create(); FX_ERR MoveTo(FX_FLOAT x, FX_FLOAT y); - FX_ERR LineTo(FX_FLOAT x, FX_FLOAT y); - FX_ERR BezierTo(FX_FLOAT ctrlX1, FX_FLOAT ctrlY1, FX_FLOAT ctrlX2, FX_FLOAT ctrlY2, FX_FLOAT toX, FX_FLOAT toY); - FX_ERR ArcTo(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle); - FX_ERR Close(); FX_ERR AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2); - FX_ERR AddBezier(FX_FLOAT startX, FX_FLOAT startY, FX_FLOAT ctrlX1, @@ -321,116 +301,105 @@ class CFX_Path { FX_FLOAT ctrlY2, FX_FLOAT endX, FX_FLOAT endY); - FX_ERR AddRectangle(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height); - FX_ERR AddEllipse(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height); - FX_ERR AddEllipse(const CFX_RectF& rect); - FX_ERR AddArc(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle); - FX_ERR AddPie(FX_FLOAT left, FX_FLOAT top, FX_FLOAT width, FX_FLOAT height, FX_FLOAT startAngle, FX_FLOAT sweepAngle); - FX_ERR AddSubpath(CFX_Path* path); - FX_ERR Clear(); FX_BOOL IsEmpty(); - CFX_PathData* GetPathData(); private: - CFX_PathGenerator* _generator; + CFX_PathGenerator* m_generator; }; + class CFX_Color { public: CFX_Color(); - + // TODO(weili): Remove implicit conversions. Make this explicit. CFX_Color(const FX_ARGB argb); - - CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb = 0x0); - - CFX_Color(CFX_Shading* shading); - + explicit CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb = 0x0); + explicit CFX_Color(CFX_Shading* shading); virtual ~CFX_Color(); FX_ERR Set(const FX_ARGB argb); - FX_ERR Set(CFX_Pattern* pattern, const FX_ARGB argb = 0x0); - FX_ERR Set(CFX_Shading* shading); private: - int32_t _type; + int32_t m_type; union { struct { - FX_ARGB _argb; - CFX_Pattern* _pattern; - }; - CFX_Shading* _shading; + FX_ARGB argb; + CFX_Pattern* pattern; + } m_info; + CFX_Shading* m_shading; }; friend class CFX_Graphics; }; + class CFX_Pattern { public: CFX_Pattern(); + virtual ~CFX_Pattern(); FX_ERR Create(CFX_DIBitmap* bitmap, const FX_FLOAT xStep, const FX_FLOAT yStep, CFX_Matrix* matrix = NULL); - FX_ERR Create(FX_HatchStyle hatchStyle, const FX_ARGB foreArgb, const FX_ARGB backArgb, CFX_Matrix* matrix = NULL); - virtual ~CFX_Pattern(); - private: - int32_t _type; - CFX_Matrix _matrix; + int32_t m_type; + CFX_Matrix m_matrix; union { struct { - CFX_RectF _rect; - FX_FLOAT _xStep; - FX_FLOAT _yStep; - FX_BOOL _isColored; - }; + CFX_RectF rect; + FX_FLOAT xStep; + FX_FLOAT yStep; + FX_BOOL isColored; + } m_rectInfo; struct { - CFX_DIBitmap* _bitmap; - FX_FLOAT _x1Step; - FX_FLOAT _y1Step; - }; + CFX_DIBitmap* bitmap; + FX_FLOAT x1Step; + FX_FLOAT y1Step; + } m_bitmapInfo; struct { - FX_HatchStyle _hatchStyle; - FX_ARGB _foreArgb; - FX_ARGB _backArgb; - }; + FX_HatchStyle hatchStyle; + FX_ARGB foreArgb; + FX_ARGB backArgb; + } m_hatchInfo; }; friend class CFX_Graphics; }; + class CFX_Shading { public: CFX_Shading(); + virtual ~CFX_Shading(); FX_ERR CreateAxial(const CFX_PointF& beginPoint, const CFX_PointF& endPoint, @@ -438,7 +407,6 @@ class CFX_Shading { FX_BOOL isExtendedEnd, const FX_ARGB beginArgb, const FX_ARGB endArgb); - FX_ERR CreateRadial(const CFX_PointF& beginPoint, const CFX_PointF& endPoint, const FX_FLOAT beginRadius, @@ -448,22 +416,19 @@ class CFX_Shading { const FX_ARGB beginArgb, const FX_ARGB endArgb); - virtual ~CFX_Shading(); - private: FX_ERR InitArgbArray(); - private: - int32_t _type; - CFX_PointF _beginPoint; - CFX_PointF _endPoint; - FX_FLOAT _beginRadius; - FX_FLOAT _endRadius; - FX_BOOL _isExtendedBegin; - FX_BOOL _isExtendedEnd; - FX_ARGB _beginArgb; - FX_ARGB _endArgb; - FX_ARGB _argbArray[FX_SHADING_Steps]; + int32_t m_type; + CFX_PointF m_beginPoint; + CFX_PointF m_endPoint; + FX_FLOAT m_beginRadius; + FX_FLOAT m_endRadius; + FX_BOOL m_isExtendedBegin; + FX_BOOL m_isExtendedEnd; + FX_ARGB m_beginArgb; + FX_ARGB m_endArgb; + FX_ARGB m_argbArray[FX_SHADING_Steps]; friend class CFX_Graphics; }; -- cgit v1.2.3