Create a helper CFX_RenderDevice::DrawZeroAreaPath().
Create CFX_RenderDevice::DrawZeroAreaPath() which calculates the zero
area formed by a path and draws it. A follow up CL will change this
helper to be only used on a sub path instead of a whole path.
Bug: pdfium:1638
Change-Id: If51d804b9fe6e3015dee38fb8078d6b99ef0be07
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77990
Commit-Queue: Hui Yingst <nigi@chromium.org>
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index ae9c723..7130649 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -693,33 +693,12 @@
}
if (fill && stroke_alpha == 0 && !fill_options.stroke &&
!fill_options.text_mode) {
- CFX_PathData newPath;
- bool bThin = false;
- bool setIdentity = false;
- // TODO(crbug.com/pdfium/1638): GetZeroAreaPath() should only process a sub
+ // TODO(crbug.com/pdfium/1638): Make DrawZeroAreaPath() only process a sub
// path instead the whole path.
- if (GetZeroAreaPath(pPathData->GetPoints(), pObject2Device,
- !!m_pDeviceDriver->GetDriverType(), &newPath, &bThin,
- &setIdentity)) {
- CFX_GraphStateData graphState;
- graphState.m_LineWidth = 0.0f;
-
- uint32_t strokecolor = fill_color;
- if (bThin)
- strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
-
- const CFX_Matrix* pMatrix = nullptr;
- if (pObject2Device && !pObject2Device->IsIdentity() && !setIdentity)
- pMatrix = pObject2Device;
-
- CFX_FillRenderOptions path_options;
- path_options.zero_area = true;
- if (fill_options.aliased_path)
- path_options.aliased_path = true;
-
- m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor,
- path_options, blend_type);
- }
+ DrawZeroAreaPath(pPathData->GetPoints(), pObject2Device,
+ !!m_pDeviceDriver->GetDriverType(),
+ fill_options.aliased_path, fill_color, fill_alpha,
+ blend_type);
}
if (fill && fill_alpha && stroke_alpha < 0xff && fill_options.stroke) {
@@ -838,6 +817,43 @@
fill_options, blend_type);
}
+void CFX_RenderDevice::DrawZeroAreaPath(const std::vector<FX_PATHPOINT>& path,
+ const CFX_Matrix* matrix,
+ bool adjust,
+ bool aliased_path,
+ uint32_t fill_color,
+ uint8_t fill_alpha,
+ BlendMode blend_type) {
+ if (path.empty())
+ return;
+
+ CFX_PathData new_path;
+ bool thin = false;
+ bool set_identity = false;
+
+ if (!GetZeroAreaPath(path, matrix, adjust, &new_path, &thin, &set_identity))
+ return;
+
+ CFX_GraphStateData graph_state;
+ graph_state.m_LineWidth = 0.0f;
+
+ uint32_t stroke_color = fill_color;
+ if (thin)
+ stroke_color = (((fill_alpha >> 2) << 24) | (stroke_color & 0x00ffffff));
+
+ const CFX_Matrix* new_matrix = nullptr;
+ if (matrix && !matrix->IsIdentity() && !set_identity)
+ new_matrix = matrix;
+
+ CFX_FillRenderOptions path_options;
+ path_options.zero_area = true;
+ if (aliased_path)
+ path_options.aliased_path = true;
+
+ m_pDeviceDriver->DrawPath(&new_path, new_matrix, &graph_state, 0,
+ stroke_color, path_options, blend_type);
+}
+
bool CFX_RenderDevice::GetDIBits(const RetainPtr<CFX_DIBitmap>& pBitmap,
int left,
int top) {
diff --git a/core/fxge/cfx_renderdevice.h b/core/fxge/cfx_renderdevice.h
index a880917..d24b0d2 100644
--- a/core/fxge/cfx_renderdevice.h
+++ b/core/fxge/cfx_renderdevice.h
@@ -23,6 +23,7 @@
class CFX_GraphStateData;
class CFX_ImageRenderer;
class CFX_PathData;
+class FX_PATHPOINT;
class PauseIndicatorIface;
class TextCharPos;
struct CFX_Color;
@@ -242,6 +243,13 @@
uint32_t color,
const CFX_FillRenderOptions& fill_options,
BlendMode blend_type);
+ void DrawZeroAreaPath(const std::vector<FX_PATHPOINT>& path,
+ const CFX_Matrix* matrix,
+ bool adjust,
+ bool aliased_path,
+ uint32_t fill_color,
+ uint8_t fill_alpha,
+ BlendMode blend_type);
bool FillRectWithBlend(const FX_RECT& rect,
uint32_t color,
BlendMode blend_type);