| Index: xfa/fxgraphics/fx_graphics.cpp
|
| diff --git a/xfa/fxgraphics/fx_graphics.cpp b/xfa/fxgraphics/fx_graphics.cpp
|
| index a3fb84dbb0a7c98799f4a55d092f25b073e6adfa..3247246c79b52ba284e35b6cfdaf6144def4da9b 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<TInfo> info(
|
| + reinterpret_cast<TInfo*>(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<CFX_DIBitmap> bmp1(source->FlipImage(FALSE, TRUE));
|
| + std::unique_ptr<CFX_DIBitmap> 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<CFX_DIBitmap> 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<CFX_DIBitmap> bmp2(bmp1->FlipImage(FALSE, TRUE));
|
| + std::unique_ptr<CFX_DIBitmap> 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<CFX_DIBitmap> bmp1(source->FlipImage(FALSE, TRUE));
|
| + std::unique_ptr<CFX_DIBitmap> 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<CFX_UnicodeEncoding> 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; }
|
| -};
|
|
|