summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fxge/skia/fx_skia_device.cpp2
-rw-r--r--core/fxge/skia/fx_skia_device.h2
-rw-r--r--core/fxge/win32/cfx_psrenderer.cpp18
-rw-r--r--core/fxge/win32/fx_win32_device.cpp35
-rw-r--r--core/fxge/win32/fx_win32_gdipext.cpp5
5 files changed, 27 insertions, 35 deletions
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index ab8efff72c..82758400be 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -1856,7 +1856,7 @@ bool CFX_SkiaDeviceDriver::SetClip_PathFill(
bool CFX_SkiaDeviceDriver::SetClip_PathStroke(
const CFX_PathData* pPathData, // path info
- const CFX_Matrix* pObject2Device, // optional transformation
+ const CFX_Matrix* pObject2Device, // required transformation
const CFX_GraphStateData* pGraphState // graphic state, for pen attributes
) {
bool cached = m_pCache->SetClipStroke(pPathData, pObject2Device, pGraphState);
diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h
index 7dfdef4de8..c2e6c013d9 100644
--- a/core/fxge/skia/fx_skia_device.h
+++ b/core/fxge/skia/fx_skia_device.h
@@ -50,7 +50,7 @@ class CFX_SkiaDeviceDriver : public IFX_RenderDeviceDriver {
/** Set clipping path using stroked region */
bool SetClip_PathStroke(
const CFX_PathData* pPathData, // path info
- const CFX_Matrix* pObject2Device, // optional transformation
+ const CFX_Matrix* pObject2Device, // required transformation
const CFX_GraphStateData*
pGraphState) // graphic state, for pen attributes
override;
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp
index 1513c07c68..417a1d7b85 100644
--- a/core/fxge/win32/cfx_psrenderer.cpp
+++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -234,23 +234,19 @@ void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,
const CFX_GraphStateData* pGraphState) {
StartRendering();
SetGraphState(pGraphState);
- if (pObject2Device) {
- std::ostringstream buf;
- buf << "mx Cm [" << pObject2Device->a << " " << pObject2Device->b << " "
- << pObject2Device->c << " " << pObject2Device->d << " "
- << pObject2Device->e << " " << pObject2Device->f << "]cm ";
- m_pStream->WriteBlock(buf.str().c_str(), buf.tellp());
- }
+
+ std::ostringstream buf;
+ buf << "mx Cm [" << pObject2Device->a << " " << pObject2Device->b << " "
+ << pObject2Device->c << " " << pObject2Device->d << " "
+ << pObject2Device->e << " " << pObject2Device->f << "]cm ";
+ m_pStream->WriteBlock(buf.str().c_str(), buf.tellp());
OutputPath(pPathData, nullptr);
CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth,
pGraphState->m_MiterLimit);
m_ClipBox.Intersect(pObject2Device->TransformRect(rect).GetOuterRect());
- m_pStream->WriteString("strokepath W n");
- if (pObject2Device)
- m_pStream->WriteString(" sm");
- m_pStream->WriteString("\n");
+ m_pStream->WriteString("strokepath W n sm\n");
}
bool CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index 492b0b57df..41dc22060b 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -91,28 +91,24 @@ bool IsGDIEnabled() {
return true;
}
-HPEN CreatePen(const CFX_GraphStateData* pGraphState,
- const CFX_Matrix* pMatrix,
- uint32_t argb) {
- float width;
- float scale = 1.f;
- if (pMatrix)
+HPEN CreateExtPen(const CFX_GraphStateData* pGraphState,
+ const CFX_Matrix* pMatrix,
+ uint32_t argb) {
+ ASSERT(pGraphState);
+
+ float scale = 1.0f;
+ if (pMatrix) {
scale = fabs(pMatrix->a) > fabs(pMatrix->b) ? fabs(pMatrix->a)
: fabs(pMatrix->b);
- if (pGraphState) {
- width = scale * pGraphState->m_LineWidth;
- } else {
- width = 1.0f;
}
+ float width = std::max(scale * pGraphState->m_LineWidth, 1.0f);
+
uint32_t PenStyle = PS_GEOMETRIC;
- if (width < 1) {
- width = 1;
- }
- if (pGraphState->m_DashCount) {
+ if (pGraphState->m_DashCount)
PenStyle |= PS_USERSTYLE;
- } else {
+ else
PenStyle |= PS_SOLID;
- }
+
switch (pGraphState->m_LineCap) {
case 0:
PenStyle |= PS_ENDCAP_FLAT;
@@ -135,6 +131,7 @@ HPEN CreatePen(const CFX_GraphStateData* pGraphState,
PenStyle |= PS_JOIN_BEVEL;
break;
}
+
int a;
FX_COLORREF rgb;
std::tie(a, rgb) = ArgbToColorRef(argb);
@@ -1005,7 +1002,7 @@ bool CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) ||
(pGraphState && pGraphState->m_DashCount))) {
if (!((!pMatrix || !pMatrix->WillScale()) && pGraphState &&
- pGraphState->m_LineWidth == 1.f &&
+ pGraphState->m_LineWidth == 1.0f &&
(pPathData->GetPoints().size() == 5 ||
pPathData->GetPoints().size() == 4) &&
pPathData->IsRect())) {
@@ -1023,7 +1020,7 @@ bool CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
HBRUSH hBrush = nullptr;
if (pGraphState && stroke_alpha) {
SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, nullptr);
- hPen = CreatePen(pGraphState, pMatrix, stroke_color);
+ hPen = CreateExtPen(pGraphState, pMatrix, stroke_color);
hPen = (HPEN)SelectObject(m_hDC, hPen);
}
if (fill_mode && fill_alpha) {
@@ -1111,7 +1108,7 @@ bool CGdiDeviceDriver::SetClip_PathStroke(
const CFX_PathData* pPathData,
const CFX_Matrix* pMatrix,
const CFX_GraphStateData* pGraphState) {
- HPEN hPen = CreatePen(pGraphState, pMatrix, 0xff000000);
+ HPEN hPen = CreateExtPen(pGraphState, pMatrix, 0xff000000);
hPen = (HPEN)SelectObject(m_hDC, hPen);
SetPathToDC(m_hDC, pPathData, pMatrix);
WidenPath(m_hDC);
diff --git a/core/fxge/win32/fx_win32_gdipext.cpp b/core/fxge/win32/fx_win32_gdipext.cpp
index d784a0fa37..64c8ea7408 100644
--- a/core/fxge/win32/fx_win32_gdipext.cpp
+++ b/core/fxge/win32/fx_win32_gdipext.cpp
@@ -730,13 +730,12 @@ GpPen* GdipCreatePenImpl(const CFX_GraphStateData* pGraphState,
bool bTextMode) {
CGdiplusExt& GdiplusExt =
((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- float width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
+ float width = pGraphState->m_LineWidth;
if (!bTextMode) {
float unit = pMatrix
? 1.0f / ((pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2)
: 1.0f;
- if (width < unit)
- width = unit;
+ width = std::max(width, unit);
}
GpPen* pPen = nullptr;
CallFunc(GdipCreatePen1)((Gdiplus::ARGB)argb, width, UnitWorld, &pPen);