diff options
Diffstat (limited to 'xfa/fxgraphics/cxfa_graphics.cpp')
-rw-r--r-- | xfa/fxgraphics/cxfa_graphics.cpp | 95 |
1 files changed, 38 insertions, 57 deletions
diff --git a/xfa/fxgraphics/cxfa_graphics.cpp b/xfa/fxgraphics/cxfa_graphics.cpp index 8648abb81d..981c288b46 100644 --- a/xfa/fxgraphics/cxfa_graphics.cpp +++ b/xfa/fxgraphics/cxfa_graphics.cpp @@ -165,20 +165,14 @@ void CXFA_Graphics::SetLineWidth(float lineWidth, bool isActOnDash) { } } -void CXFA_Graphics::SetStrokeColor(CXFA_Color* color) { - if (!color) - return; - if (m_type == FX_CONTEXT_Device && m_renderDevice) { +void CXFA_Graphics::SetStrokeColor(const CXFA_Color& color) { + if (m_type == FX_CONTEXT_Device && m_renderDevice) m_info.strokeColor = color; - } } -void CXFA_Graphics::SetFillColor(CXFA_Color* color) { - if (!color) - return; - if (m_type == FX_CONTEXT_Device && m_renderDevice) { +void CXFA_Graphics::SetFillColor(const CXFA_Color& color) { + if (m_type == FX_CONTEXT_Device && m_renderDevice) m_info.fillColor = color; - } } void CXFA_Graphics::StrokePath(CXFA_Path* path, CFX_Matrix* matrix) { @@ -273,44 +267,33 @@ void CXFA_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) { void CXFA_Graphics::RenderDeviceStrokePath(CXFA_Path* path, CFX_Matrix* matrix) { - if (!m_info.strokeColor) + if (m_info.strokeColor.GetType() != CXFA_Color::Solid) return; - CFX_Matrix m(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) { + + CFX_Matrix m = m_info.CTM; + if (matrix) m.Concat(*matrix); - } - switch (m_info.strokeColor->m_type) { - case FX_COLOR_Solid: { - m_renderDevice->DrawPath(path->GetPathData(), &m, &m_info.graphState, 0x0, - m_info.strokeColor->m_info.argb, 0); - return; - } - default: - return; - } + + m_renderDevice->DrawPath(path->GetPathData(), &m, &m_info.graphState, 0x0, + m_info.strokeColor.GetArgb(), 0); } void CXFA_Graphics::RenderDeviceFillPath(CXFA_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { - if (!m_info.fillColor) - return; - CFX_Matrix m(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) { + CFX_Matrix m = m_info.CTM; + if (matrix) m.Concat(*matrix); - } - switch (m_info.fillColor->m_type) { - case FX_COLOR_Solid: { + + switch (m_info.fillColor.GetType()) { + case CXFA_Color::Solid: m_renderDevice->DrawPath(path->GetPathData(), &m, &m_info.graphState, - m_info.fillColor->m_info.argb, 0x0, fillMode); + m_info.fillColor.GetArgb(), 0x0, fillMode); return; - } - case FX_COLOR_Pattern: + case CXFA_Color::Pattern: FillPathWithPattern(path, fillMode, &m); return; - case FX_COLOR_Shading: + case CXFA_Color::Shading: FillPathWithShading(path, fillMode, &m); return; default: @@ -347,7 +330,7 @@ void CXFA_Graphics::RenderDeviceStretchImage( void CXFA_Graphics::FillPathWithPattern(CXFA_Path* path, FX_FillMode fillMode, CFX_Matrix* matrix) { - CXFA_Pattern* pattern = m_info.fillColor->m_info.pattern; + CXFA_Pattern* pattern = m_info.fillColor.GetPattern(); CFX_RetainPtr<CFX_DIBitmap> bitmap = m_renderDevice->GetBitmap(); int32_t width = bitmap->GetWidth(); int32_t height = bitmap->GetHeight(); @@ -355,7 +338,7 @@ void CXFA_Graphics::FillPathWithPattern(CXFA_Path* path, bmp->Create(width, height, FXDIB_Argb); m_renderDevice->GetDIBits(bmp, 0, 0); - FX_HatchStyle hatchStyle = m_info.fillColor->m_info.pattern->m_hatchStyle; + FX_HatchStyle hatchStyle = m_info.fillColor.GetPattern()->m_hatchStyle; const FX_HATCHDATA& data = hatchBitmapData[static_cast<int>(hatchStyle)]; auto mask = pdfium::MakeRetain<CFX_DIBitmap>(); @@ -369,12 +352,10 @@ void CXFA_Graphics::FillPathWithPattern(CXFA_Path* path, FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); CFX_DefaultRenderDevice device; device.Attach(bmp, false, nullptr, false); - device.FillRect(&rect, m_info.fillColor->m_info.pattern->m_backArgb); + device.FillRect(&rect, m_info.fillColor.GetPattern()->m_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, - m_info.fillColor->m_info.pattern->m_foreArgb); - } + for (int32_t i = rect.left; i < rect.right; i += mask->GetWidth()) + device.SetBitMask(mask, i, j, m_info.fillColor.GetPattern()->m_foreArgb); } CFX_RenderDevice::StateRestorer restorer(m_renderDevice); m_renderDevice->SetClip_PathFill(path->GetPathData(), matrix, fillMode); @@ -387,16 +368,16 @@ void CXFA_Graphics::FillPathWithShading(CXFA_Path* path, CFX_RetainPtr<CFX_DIBitmap> bitmap = m_renderDevice->GetBitmap(); int32_t width = bitmap->GetWidth(); int32_t height = bitmap->GetHeight(); - float start_x = m_info.fillColor->m_shading->m_beginPoint.x; - float start_y = m_info.fillColor->m_shading->m_beginPoint.y; - float end_x = m_info.fillColor->m_shading->m_endPoint.x; - float end_y = m_info.fillColor->m_shading->m_endPoint.y; + float start_x = m_info.fillColor.GetShading()->m_beginPoint.x; + float start_y = m_info.fillColor.GetShading()->m_beginPoint.y; + float end_x = m_info.fillColor.GetShading()->m_endPoint.x; + float end_y = m_info.fillColor.GetShading()->m_endPoint.y; auto bmp = pdfium::MakeRetain<CFX_DIBitmap>(); bmp->Create(width, height, FXDIB_Argb); m_renderDevice->GetDIBits(bmp, 0, 0); int32_t pitch = bmp->GetPitch(); bool result = false; - switch (m_info.fillColor->m_shading->m_type) { + switch (m_info.fillColor.GetShading()->m_type) { case FX_SHADING_Axial: { float x_span = end_x - start_x; float y_span = end_y - start_y; @@ -409,26 +390,26 @@ void CXFA_Graphics::FillPathWithShading(CXFA_Path* path, float scale = (((x - start_x) * x_span) + ((y - start_y) * y_span)) / axis_len_square; if (scale < 0) { - if (!m_info.fillColor->m_shading->m_isExtendedBegin) { + if (!m_info.fillColor.GetShading()->m_isExtendedBegin) { continue; } scale = 0; } else if (scale > 1.0f) { - if (!m_info.fillColor->m_shading->m_isExtendedEnd) { + if (!m_info.fillColor.GetShading()->m_isExtendedEnd) { continue; } scale = 1.0f; } int32_t index = (int32_t)(scale * (FX_SHADING_Steps - 1)); - dib_buf[column] = m_info.fillColor->m_shading->m_argbArray[index]; + dib_buf[column] = m_info.fillColor.GetShading()->m_argbArray[index]; } } result = true; break; } case FX_SHADING_Radial: { - float start_r = m_info.fillColor->m_shading->m_beginRadius; - float end_r = m_info.fillColor->m_shading->m_endRadius; + float start_r = m_info.fillColor.GetShading()->m_beginRadius; + float end_r = m_info.fillColor.GetShading()->m_endRadius; 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)); @@ -459,7 +440,7 @@ void CXFA_Graphics::FillPathWithShading(CXFA_Path* path, s2 = (-b - root) / (2 * a); s1 = (-b + root) / (2 * a); } - if (s2 <= 1.0f || m_info.fillColor->m_shading->m_isExtendedEnd) { + if (s2 <= 1.0f || m_info.fillColor.GetShading()->m_isExtendedEnd) { s = (s2); } else { s = (s1); @@ -469,19 +450,19 @@ void CXFA_Graphics::FillPathWithShading(CXFA_Path* path, } } if (s < 0) { - if (!m_info.fillColor->m_shading->m_isExtendedBegin) { + if (!m_info.fillColor.GetShading()->m_isExtendedBegin) { continue; } s = 0; } if (s > 1.0f) { - if (!m_info.fillColor->m_shading->m_isExtendedEnd) { + if (!m_info.fillColor.GetShading()->m_isExtendedEnd) { continue; } s = 1.0f; } int index = (int32_t)(s * (FX_SHADING_Steps - 1)); - dib_buf[column] = m_info.fillColor->m_shading->m_argbArray[index]; + dib_buf[column] = m_info.fillColor.GetShading()->m_argbArray[index]; } } result = true; |