summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUILD.gn2
-rw-r--r--core/fxge/cfx_pathdata.cpp28
-rw-r--r--core/fxge/cfx_pathdata.h1
-rw-r--r--xfa/fde/cfde_path.cpp221
-rw-r--r--xfa/fde/cfde_path.h52
-rw-r--r--xfa/fde/cfde_renderdevice.cpp11
-rw-r--r--xfa/fde/cfde_renderdevice.h4
-rw-r--r--xfa/fde/cfde_textout.cpp12
-rw-r--r--xfa/fde/ifde_visualset.h1
-rw-r--r--xfa/fxfa/cxfa_textlayout.cpp16
10 files changed, 38 insertions, 310 deletions
diff --git a/BUILD.gn b/BUILD.gn
index e081bf07dc..9dc2362aa6 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1451,8 +1451,6 @@ if (pdf_enable_xfa) {
static_library("xfa") {
sources = [
- "xfa/fde/cfde_path.cpp",
- "xfa/fde/cfde_path.h",
"xfa/fde/cfde_rendercontext.cpp",
"xfa/fde/cfde_rendercontext.h",
"xfa/fde/cfde_renderdevice.cpp",
diff --git a/core/fxge/cfx_pathdata.cpp b/core/fxge/cfx_pathdata.cpp
index fe3c6778d5..1dbb44638c 100644
--- a/core/fxge/cfx_pathdata.cpp
+++ b/core/fxge/cfx_pathdata.cpp
@@ -202,20 +202,28 @@ void CFX_PathData::AppendPoint(const CFX_PointF& point,
m_Points.push_back(FX_PATHPOINT(point, type, closeFigure));
}
+void CFX_PathData::AppendLine(const CFX_PointF& pt1, const CFX_PointF& pt2) {
+ if (m_Points.empty() || fabs(m_Points.back().m_Point.x - pt1.x) > 0.001 ||
+ fabs(m_Points.back().m_Point.y - pt1.y) > 0.001) {
+ AppendPoint(pt1, FXPT_TYPE::MoveTo, false);
+ }
+ AppendPoint(pt2, FXPT_TYPE::LineTo, false);
+}
+
void CFX_PathData::AppendRect(float left,
float bottom,
float right,
float top) {
- m_Points.push_back(
- FX_PATHPOINT(CFX_PointF(left, bottom), FXPT_TYPE::MoveTo, false));
- m_Points.push_back(
- FX_PATHPOINT(CFX_PointF(left, top), FXPT_TYPE::LineTo, false));
- m_Points.push_back(
- FX_PATHPOINT(CFX_PointF(right, top), FXPT_TYPE::LineTo, false));
- m_Points.push_back(
- FX_PATHPOINT(CFX_PointF(right, bottom), FXPT_TYPE::LineTo, false));
- m_Points.push_back(
- FX_PATHPOINT(CFX_PointF(left, bottom), FXPT_TYPE::LineTo, true));
+ CFX_PointF left_bottom(left, bottom);
+ CFX_PointF left_top(left, top);
+ CFX_PointF right_top(right, top);
+ CFX_PointF right_bottom(right, bottom);
+
+ AppendLine(left_bottom, left_top);
+ AppendLine(left_top, right_top);
+ AppendLine(right_top, right_bottom);
+ AppendLine(right_bottom, left_bottom);
+ ClosePath();
}
CFX_FloatRect CFX_PathData::GetBoundingBox() const {
diff --git a/core/fxge/cfx_pathdata.h b/core/fxge/cfx_pathdata.h
index bcb2b7aadf..0e2bb89f9f 100644
--- a/core/fxge/cfx_pathdata.h
+++ b/core/fxge/cfx_pathdata.h
@@ -60,6 +60,7 @@ class CFX_PathData {
void Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix);
void AppendRect(float left, float bottom, float right, float top);
+ void AppendLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
void AppendPoint(const CFX_PointF& pos, FXPT_TYPE type, bool closeFigure);
void ClosePath();
diff --git a/xfa/fde/cfde_path.cpp b/xfa/fde/cfde_path.cpp
deleted file mode 100644
index a7d2e47ac1..0000000000
--- a/xfa/fde/cfde_path.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fde/cfde_path.h"
-
-#include "third_party/base/stl_util.h"
-
-void CFDE_Path::CloseFigure() {
- m_Path.ClosePath();
-}
-
-bool CFDE_Path::FigureClosed() const {
- const std::vector<FX_PATHPOINT>& points = m_Path.GetPoints();
- return points.empty() ? true : points.back().m_CloseFigure;
-}
-
-void CFDE_Path::MoveTo(const CFX_PointF& point) {
- m_Path.AppendPoint(point, FXPT_TYPE::MoveTo, false);
-}
-
-void CFDE_Path::LineTo(const CFX_PointF& point) {
- m_Path.AppendPoint(point, FXPT_TYPE::LineTo, false);
-}
-
-void CFDE_Path::BezierTo(const CFX_PointF& p1,
- const CFX_PointF& p2,
- const CFX_PointF& p3) {
- m_Path.AppendPoint(p1, FXPT_TYPE::BezierTo, false);
- m_Path.AppendPoint(p2, FXPT_TYPE::BezierTo, false);
- m_Path.AppendPoint(p3, FXPT_TYPE::BezierTo, false);
-}
-
-void CFDE_Path::ArcTo(bool bStart,
- const CFX_RectF& rect,
- float startAngle,
- float endAngle) {
- float rx = rect.width / 2;
- float ry = rect.height / 2;
- float cx = rect.left + rx;
- float cy = rect.top + ry;
- float alpha = atan2(rx * sin(startAngle), ry * cos(startAngle));
- float beta = atan2(rx * sin(endAngle), ry * cos(endAngle));
- if (fabs(beta - alpha) > FX_PI) {
- if (beta > alpha)
- beta -= 2 * FX_PI;
- else
- alpha -= 2 * FX_PI;
- }
-
- float half_delta = (beta - alpha) / 2;
- float bcp = 4.0f / 3 * (1 - cos(half_delta)) / sin(half_delta);
- float sin_alpha = sin(alpha);
- float sin_beta = sin(beta);
- float cos_alpha = cos(alpha);
- float cos_beta = cos(beta);
- if (bStart)
- MoveTo(CFX_PointF(cx + rx * cos_alpha, cy + ry * sin_alpha));
-
- BezierTo(CFX_PointF(cx + rx * (cos_alpha - bcp * sin_alpha),
- cy + ry * (sin_alpha + bcp * cos_alpha)),
- CFX_PointF(cx + rx * (cos_beta + bcp * sin_beta),
- cy + ry * (sin_beta - bcp * cos_beta)),
- CFX_PointF(cx + rx * cos_beta, cy + ry * sin_beta));
-}
-
-void CFDE_Path::AddBezier(const std::vector<CFX_PointF>& points) {
- if (points.size() != 4)
- return;
-
- MoveTo(points[0]);
- BezierTo(points[1], points[2], points[3]);
-}
-
-void CFDE_Path::AddBeziers(const std::vector<CFX_PointF>& points) {
- int32_t iCount = points.size();
- if (iCount < 4)
- return;
-
- const CFX_PointF* p = points.data();
- const CFX_PointF* pEnd = p + iCount;
- MoveTo(p[0]);
- for (++p; p <= pEnd - 3; p += 3)
- BezierTo(p[0], p[1], p[2]);
-}
-
-void CFDE_Path::GetCurveTangents(const std::vector<CFX_PointF>& points,
- std::vector<CFX_PointF>* tangents,
- bool bClosed,
- float fTension) const {
- int32_t iCount = pdfium::CollectionSize<int32_t>(points);
- tangents->resize(iCount);
- if (iCount < 3)
- return;
-
- float fCoefficient = fTension / 3.0f;
- const CFX_PointF* pPoints = points.data();
- CFX_PointF* pTangents = tangents->data();
- for (int32_t i = 0; i < iCount; ++i) {
- int32_t r = i + 1;
- int32_t s = i - 1;
- if (r >= iCount)
- r = bClosed ? (r - iCount) : (iCount - 1);
- if (s < 0)
- s = bClosed ? (s + iCount) : 0;
-
- pTangents[i].x += (fCoefficient * (pPoints[r].x - pPoints[s].x));
- pTangents[i].y += (fCoefficient * (pPoints[r].y - pPoints[s].y));
- }
-}
-
-void CFDE_Path::AddCurve(const std::vector<CFX_PointF>& points,
- bool bClosed,
- float fTension) {
- int32_t iLast = pdfium::CollectionSize<int32_t>(points) - 1;
- if (iLast < 1)
- return;
-
- std::vector<CFX_PointF> tangents;
- GetCurveTangents(points, &tangents, bClosed, fTension);
- const CFX_PointF* pPoints = points.data();
- CFX_PointF* pTangents = tangents.data();
- MoveTo(pPoints[0]);
- for (int32_t i = 0; i < iLast; ++i) {
- BezierTo(CFX_PointF(pPoints[i].x + pTangents[i].x,
- pPoints[i].y + pTangents[i].y),
- CFX_PointF(pPoints[i + 1].x - pTangents[i + 1].x,
- pPoints[i + 1].y - pTangents[i + 1].y),
- CFX_PointF(pPoints[i + 1].x, pPoints[i + 1].y));
- }
- if (bClosed) {
- BezierTo(CFX_PointF(pPoints[iLast].x + pTangents[iLast].x,
- pPoints[iLast].y + pTangents[iLast].y),
- CFX_PointF(pPoints[0].x - pTangents[0].x,
- pPoints[0].y - pTangents[0].y),
- CFX_PointF(pPoints[0].x, pPoints[0].y));
- CloseFigure();
- }
-}
-
-void CFDE_Path::AddEllipse(const CFX_RectF& rect) {
- float fStartAngle = 0;
- float fEndAngle = FX_PI / 2;
- for (int32_t i = 0; i < 4; ++i) {
- ArcTo(i == 0, rect, fStartAngle, fEndAngle);
- fStartAngle += FX_PI / 2;
- fEndAngle += FX_PI / 2;
- }
- CloseFigure();
-}
-
-void CFDE_Path::AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) {
- std::vector<FX_PATHPOINT>& points = m_Path.GetPoints();
- if (points.empty() || fabs(points.back().m_Point.x - pt1.x) > 0.001 ||
- fabs(points.back().m_Point.y - pt1.y) > 0.001) {
- MoveTo(pt1);
- }
- LineTo(pt2);
-}
-
-void CFDE_Path::AddPath(const CFDE_Path* pSrc, bool bConnect) {
- if (!pSrc)
- return;
-
- if (pSrc->m_Path.GetPoints().empty())
- return;
- if (bConnect)
- LineTo(pSrc->m_Path.GetPoint(0));
-
- m_Path.Append(&pSrc->m_Path, nullptr);
-}
-
-void CFDE_Path::AddPolygon(const std::vector<CFX_PointF>& points) {
- size_t iCount = points.size();
- if (iCount < 2)
- return;
-
- AddLines(points);
- const CFX_PointF* p = points.data();
- if (fabs(p[0].x - p[iCount - 1].x) < 0.01f ||
- fabs(p[0].y - p[iCount - 1].y) < 0.01f) {
- LineTo(p[0]);
- }
- CloseFigure();
-}
-
-void CFDE_Path::AddLines(const std::vector<CFX_PointF>& points) {
- size_t iCount = points.size();
- if (iCount < 2)
- return;
-
- const CFX_PointF* p = points.data();
- const CFX_PointF* pEnd = p + iCount;
- MoveTo(p[0]);
- for (++p; p < pEnd; ++p)
- LineTo(*p);
-}
-
-void CFDE_Path::AddRectangle(const CFX_RectF& rect) {
- MoveTo(rect.TopLeft());
- LineTo(rect.TopRight());
- LineTo(rect.BottomRight());
- LineTo(rect.BottomLeft());
- CloseFigure();
-}
-
-CFX_RectF CFDE_Path::GetBBox() const {
- CFX_FloatRect rect = m_Path.GetBoundingBox();
- CFX_RectF bbox = CFX_RectF(rect.left, rect.top, rect.Width(), rect.Height());
- bbox.Normalize();
- return bbox;
-}
-
-CFX_RectF CFDE_Path::GetBBox(float fLineWidth, float fMiterLimit) const {
- CFX_FloatRect rect = m_Path.GetBoundingBox(fLineWidth, fMiterLimit);
- CFX_RectF bbox = CFX_RectF(rect.left, rect.top, rect.Width(), rect.Height());
- bbox.Normalize();
- return bbox;
-}
diff --git a/xfa/fde/cfde_path.h b/xfa/fde/cfde_path.h
deleted file mode 100644
index b0a229f172..0000000000
--- a/xfa/fde/cfde_path.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FDE_CFDE_PATH_H_
-#define XFA_FDE_CFDE_PATH_H_
-
-#include <vector>
-
-#include "core/fxge/cfx_pathdata.h"
-#include "core/fxge/cfx_renderdevice.h"
-
-class CFDE_Path {
- public:
- void CloseFigure();
-
- void AddBezier(const std::vector<CFX_PointF>& points);
- void AddBeziers(const std::vector<CFX_PointF>& points);
- void AddCurve(const std::vector<CFX_PointF>& points,
- bool bClosed,
- float fTension = 0.5f);
- void AddEllipse(const CFX_RectF& rect);
- void AddLines(const std::vector<CFX_PointF>& points);
- void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
- void AddPath(const CFDE_Path* pSrc, bool bConnect);
- void AddPolygon(const std::vector<CFX_PointF>& points);
- void AddRectangle(const CFX_RectF& rect);
-
- CFX_RectF GetBBox() const;
- CFX_RectF GetBBox(float fLineWidth, float fMiterLimit) const;
-
- bool FigureClosed() const;
- void BezierTo(const CFX_PointF& p1,
- const CFX_PointF& p2,
- const CFX_PointF& p3);
- void ArcTo(bool bStart,
- const CFX_RectF& rect,
- float startAngle,
- float endAngle);
- void MoveTo(const CFX_PointF& p);
- void LineTo(const CFX_PointF& p);
-
- void GetCurveTangents(const std::vector<CFX_PointF>& points,
- std::vector<CFX_PointF>* tangents,
- bool bClosed,
- float fTension) const;
- CFX_PathData m_Path;
-};
-
-#endif // XFA_FDE_CFDE_PATH_H_
diff --git a/xfa/fde/cfde_renderdevice.cpp b/xfa/fde/cfde_renderdevice.cpp
index 65a81b5ea7..e9457f4c5e 100644
--- a/xfa/fde/cfde_renderdevice.cpp
+++ b/xfa/fde/cfde_renderdevice.cpp
@@ -11,11 +11,11 @@
#include <utility>
#include "core/fxge/cfx_graphstatedata.h"
+#include "core/fxge/cfx_pathdata.h"
#include "core/fxge/cfx_renderdevice.h"
#include "core/fxge/cfx_substfont.h"
#include "core/fxge/dib/cfx_imagerenderer.h"
#include "third_party/base/ptr_util.h"
-#include "xfa/fde/cfde_path.h"
#include "xfa/fgas/font/cfgas_fontmgr.h"
#include "xfa/fgas/font/cfgas_gefont.h"
@@ -147,18 +147,13 @@ bool CFDE_RenderDevice::DrawString(FX_ARGB color,
bool CFDE_RenderDevice::DrawPath(FX_ARGB color,
float fPenWidth,
- const CFDE_Path* pPath,
+ const CFX_PathData& pPath,
const CFX_Matrix* pMatrix) {
- CFDE_Path* pGePath = (CFDE_Path*)pPath;
- if (!pGePath)
- return false;
-
CFX_GraphStateData graphState;
graphState.m_LineCap = CFX_GraphStateData::LineCapButt;
graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter;
graphState.m_LineWidth = fPenWidth;
graphState.m_MiterLimit = 10;
graphState.m_DashPhase = 0;
- return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix,
- &graphState, 0, color, 0);
+ return m_pDevice->DrawPath(&pPath, pMatrix, &graphState, 0, color, 0);
}
diff --git a/xfa/fde/cfde_renderdevice.h b/xfa/fde/cfde_renderdevice.h
index f1082fb39a..ccc2ef281e 100644
--- a/xfa/fde/cfde_renderdevice.h
+++ b/xfa/fde/cfde_renderdevice.h
@@ -12,7 +12,7 @@
#include "core/fxge/cfx_renderdevice.h"
#include "xfa/fgas/font/cfgas_gefont.h"
-class CFDE_Path;
+class CFX_PathData;
class CFX_GraphStateData;
class CFDE_RenderDevice {
@@ -37,7 +37,7 @@ class CFDE_RenderDevice {
const CFX_Matrix* pMatrix);
bool DrawPath(FX_ARGB color,
float fPenWidth,
- const CFDE_Path* pPath,
+ const CFX_PathData& pPath,
const CFX_Matrix* pMatrix);
private:
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 202074bdc4..e796bdcdb3 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -11,9 +11,9 @@
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_system.h"
+#include "core/fxge/cfx_pathdata.h"
#include "third_party/base/ptr_util.h"
#include "third_party/base/stl_util.h"
-#include "xfa/fde/cfde_path.h"
#include "xfa/fde/cfde_renderdevice.h"
#include "xfa/fgas/layout/cfx_txtbreak.h"
@@ -704,7 +704,7 @@ void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, FX_ARGB color) {
if (!bUnderLine && !bStrikeOut && !bHotKey)
return;
- auto pPath = pdfium::MakeUnique<CFDE_Path>();
+ CFX_PathData path;
int32_t iLineCount = 0;
CFX_RectF rtText = pPiece->rtPiece;
CFX_PointF pt1, pt2;
@@ -713,7 +713,7 @@ void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, FX_ARGB color) {
pt1.y = rtText.bottom();
pt2.x = rtText.right();
pt2.y = rtText.bottom();
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
iLineCount++;
}
if (bStrikeOut) {
@@ -721,7 +721,7 @@ void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, FX_ARGB color) {
pt1.y = rtText.bottom() - rtText.height * 2.0f / 5.0f;
pt2.x = rtText.right();
pt2.y = pt1.y;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
iLineCount++;
}
if (bHotKey) {
@@ -734,14 +734,14 @@ void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, FX_ARGB color) {
pt1.y = rect.bottom();
pt2.x = rect.right();
pt2.y = rect.bottom();
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
iLineCount++;
}
}
}
}
if (iLineCount > 0)
- m_pRenderDevice->DrawPath(color, 1, pPath.get(), &m_Matrix);
+ m_pRenderDevice->DrawPath(color, 1, path, &m_Matrix);
}
CFDE_TTOLine::CFDE_TTOLine() : m_bNewReload(false) {}
diff --git a/xfa/fde/ifde_visualset.h b/xfa/fde/ifde_visualset.h
index 144475f047..b5babd2c46 100644
--- a/xfa/fde/ifde_visualset.h
+++ b/xfa/fde/ifde_visualset.h
@@ -13,7 +13,6 @@
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_system.h"
#include "core/fxge/fx_dib.h"
-#include "xfa/fde/cfde_path.h"
#include "xfa/fgas/font/cfgas_fontmgr.h"
class FXTEXT_CHARPOS;
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 05cc165d52..d22bee2a79 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -14,9 +14,9 @@
#include "core/fxcrt/xml/cfx_xmlelement.h"
#include "core/fxcrt/xml/cfx_xmlnode.h"
#include "core/fxcrt/xml/cfx_xmltext.h"
+#include "core/fxge/cfx_pathdata.h"
#include "third_party/base/ptr_util.h"
#include "third_party/base/stl_util.h"
-#include "xfa/fde/cfde_path.h"
#include "xfa/fde/cfde_renderdevice.h"
#include "xfa/fxfa/cxfa_linkuserdata.h"
#include "xfa/fxfa/cxfa_loadercontext.h"
@@ -1162,7 +1162,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
if (bNoUnderline && bNoLineThrough)
return;
- auto pPath = pdfium::MakeUnique<CFDE_Path>();
+ CFX_PathData path;
int32_t iChars = GetDisplayPos(pPiece, pCharPos);
if (iChars > 0) {
CFX_PointF pt1, pt2;
@@ -1174,7 +1174,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
pt2.x =
pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
pt1.y = pt2.y = fEndY;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
}
fEndY += 2.0f;
}
@@ -1185,7 +1185,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
for (int32_t i = 0; i < pPiece->iUnderline; i++) {
pt1.y = pt2.y = fEndY;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
fEndY += 2.0f;
}
}
@@ -1195,7 +1195,7 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
for (int32_t i = 0; i < pPiece->iLineThrough; i++) {
pt1.y = pt2.y = fEndY;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
fEndY += 2.0f;
}
} else {
@@ -1249,18 +1249,18 @@ void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
for (int32_t i = 0; i < pPiece->iUnderline; i++) {
pt1.y = fEndY;
pt2.y = fEndY;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
fEndY += 2.0f;
}
fEndY = pCharPos[0].m_Origin.y - pPiece->rtPiece.height * 0.25f;
for (int32_t i = 0; i < pPiece->iLineThrough; i++) {
pt1.y = fEndY;
pt2.y = fEndY;
- pPath->AddLine(pt1, pt2);
+ path.AppendLine(pt1, pt2);
fEndY += 2.0f;
}
}
- pDevice->DrawPath(pPiece->dwColor, 1, pPath.get(), &tmDoc2Device);
+ pDevice->DrawPath(pPiece->dwColor, 1, path, &tmDoc2Device);
}
int32_t CXFA_TextLayout::GetDisplayPos(const CXFA_TextPiece* pPiece,