[SDK][INCLUDE] Implement Gdiplus::CustomLineCap (#2201)

Implement Gdiplus::CustomLineCap and Gdiplus::AdjustableArrowCap. CORE-16585
This commit is contained in:
Katayama Hirofumi MZ 2019-12-31 11:30:12 +09:00 committed by GitHub
parent f4f010ba50
commit 5cc4c9b24d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 147 additions and 33 deletions

View file

@ -1332,13 +1332,19 @@ class Region : public GdiplusBase
class CustomLineCap : public GdiplusBase class CustomLineCap : public GdiplusBase
{ {
public: public:
CustomLineCap(const GraphicsPath *fillPath, const GraphicsPath *strokePath, LineCap baseCap, REAL baseInset); CustomLineCap(const GraphicsPath *fillPath, const GraphicsPath *strokePath, LineCap baseCap, REAL baseInset = 0);
~CustomLineCap();
CustomLineCap * CustomLineCap *
Clone(); Clone();
LineCap LineCap
GetBaseCap(); GetBaseCap();
REAL REAL
GetBaseInset(); GetBaseInset();
Status Status
GetLastStatus(); GetLastStatus();
@ -1347,6 +1353,7 @@ class CustomLineCap : public GdiplusBase
LineJoin LineJoin
GetStrokeJoin(); GetStrokeJoin();
REAL REAL
GetWidthScale(); GetWidthScale();
@ -1369,7 +1376,38 @@ class CustomLineCap : public GdiplusBase
SetWidthScale(IN REAL widthScale); SetWidthScale(IN REAL widthScale);
protected: protected:
CustomLineCap(); GpCustomLineCap *nativeCap;
mutable Status lastStatus;
CustomLineCap() : nativeCap(NULL), lastStatus(Ok)
{
}
CustomLineCap(GpCustomLineCap *nativeCap, Status status)
{
lastStatus = status;
SetNativeCap(nativeCap);
}
void
SetNativeCap(GpCustomLineCap *cap)
{
nativeCap = cap;
}
Status
SetStatus(Status status) const
{
if (status == Ok)
lastStatus = status;
return status;
}
private:
// CustomLineCap is not copyable
CustomLineCap(const CustomLineCap &);
CustomLineCap &
operator=(const CustomLineCap &);
}; };
#endif /* _GDIPLUSHEADERS_H */ #endif /* _GDIPLUSHEADERS_H */

View file

@ -24,79 +24,118 @@ inline CustomLineCap::CustomLineCap(
const GraphicsPath *strokePath, const GraphicsPath *strokePath,
LineCap baseCap, LineCap baseCap,
REAL baseInset) REAL baseInset)
: nativeCap(NULL)
{ {
nativeCap = NULL;
GpPath *nativeFillPath = fillPath ? fillPath->nativePath : NULL;
GpPath *nativeStrokePath = strokePath ? strokePath->nativePath : NULL;
lastStatus = DllExports::GdipCreateCustomLineCap(nativeFillPath, nativeStrokePath, baseCap, baseInset, &nativeCap);
} }
inline CustomLineCap *CustomLineCap::Clone(VOID) inline CustomLineCap::~CustomLineCap()
{ {
return NULL; DllExports::GdipDeleteCustomLineCap(nativeCap);
} }
inline LineCap CustomLineCap::GetBaseCap(VOID) inline CustomLineCap *
CustomLineCap::Clone()
{ {
return LineCapFlat; GpCustomLineCap *cap = NULL;
SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &cap));
if (lastStatus != Ok)
return NULL;
CustomLineCap *newLineCap = new CustomLineCap(cap, lastStatus);
if (newLineCap == NULL)
{
SetStatus(DllExports::GdipDeleteCustomLineCap(cap));
}
return newLineCap;
} }
inline REAL CustomLineCap::GetBaseInset(VOID) inline LineCap
CustomLineCap::GetBaseCap()
{ {
return 0; LineCap baseCap;
SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
return baseCap;
} }
inline Status CustomLineCap::GetLastStatus(VOID) inline REAL
CustomLineCap::GetBaseInset()
{ {
return Ok; REAL inset;
SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
return inset;
}
inline Status
CustomLineCap::GetLastStatus()
{
return lastStatus;
} }
inline Status inline Status
CustomLineCap::GetStrokeCaps(LineCap *startCap, LineCap *endCap) CustomLineCap::GetStrokeCaps(LineCap *startCap, LineCap *endCap)
{ {
return Ok; #if 1
return SetStatus(NotImplemented);
#else
return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap, startCap, endCap));
#endif
} }
inline LineJoin CustomLineCap::GetStrokeJoin(VOID) inline LineJoin
CustomLineCap::GetStrokeJoin()
{ {
return LineJoinMiter; LineJoin lineJoin;
SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
return lineJoin;
} }
inline REAL CustomLineCap::GetWidthScale(VOID) inline REAL
CustomLineCap::GetWidthScale()
{ {
return 0; REAL widthScale;
SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
return widthScale;
} }
inline Status inline Status
CustomLineCap::SetBaseCap(LineCap baseCap) CustomLineCap::SetBaseCap(LineCap baseCap)
{ {
return Ok; return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
} }
inline Status inline Status
CustomLineCap::SetBaseInset(REAL inset) CustomLineCap::SetBaseInset(REAL inset)
{ {
return Ok; return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
} }
inline Status inline Status
CustomLineCap::SetStrokeCap(LineCap strokeCap) CustomLineCap::SetStrokeCap(LineCap strokeCap)
{ {
return Ok; return SetStrokeCaps(strokeCap, strokeCap);
} }
inline Status inline Status
CustomLineCap::SetStrokeCaps(LineCap startCap, LineCap endCap) CustomLineCap::SetStrokeCaps(LineCap startCap, LineCap endCap)
{ {
return Ok; return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap, startCap, endCap));
} }
inline Status inline Status
CustomLineCap::SetStrokeJoin(LineJoin lineJoin) CustomLineCap::SetStrokeJoin(LineJoin lineJoin)
{ {
return Ok; return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
} }
inline Status inline Status
CustomLineCap::SetWidthScale(IN REAL widthScale) CustomLineCap::SetWidthScale(IN REAL widthScale)
{ {
return Ok; return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
} }
class AdjustableArrowCap : public CustomLineCap class AdjustableArrowCap : public CustomLineCap
@ -104,51 +143,87 @@ class AdjustableArrowCap : public CustomLineCap
public: public:
AdjustableArrowCap(REAL height, REAL width, BOOL isFilled) AdjustableArrowCap(REAL height, REAL width, BOOL isFilled)
{ {
GpAdjustableArrowCap *cap = NULL;
lastStatus = DllExports::GdipCreateAdjustableArrowCap(height, width, isFilled, &cap);
SetNativeCap(cap);
} }
REAL GetHeight(VOID) REAL
GetHeight()
{ {
return 0; REAL height;
GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(cap, &height));
return height;
} }
REAL GetMiddleInset(VOID) REAL
GetMiddleInset()
{ {
return 0; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
REAL middleInset;
SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(cap, &middleInset));
return middleInset;
} }
REAL GetWidth(VOID) REAL
GetWidth()
{ {
return 0; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
REAL width;
SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(cap, &width));
return width;
} }
BOOL IsFilled(VOID) BOOL
IsFilled()
{ {
return FALSE; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
BOOL isFilled;
SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(cap, &isFilled));
return isFilled;
} }
Status Status
SetFillState(BOOL isFilled) SetFillState(BOOL isFilled)
{ {
return Ok; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(cap, isFilled));
} }
Status Status
SetHeight(REAL height) SetHeight(REAL height)
{ {
return Ok; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(cap, height));
} }
Status Status
SetMiddleInset(REAL middleInset) SetMiddleInset(REAL middleInset)
{ {
return Ok; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(cap, middleInset));
} }
Status Status
SetWidth(REAL width) SetWidth(REAL width)
{ {
return Ok; GpAdjustableArrowCap *cap = GetNativeAdjustableArrowCap();
return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(cap, width));
} }
protected:
GpAdjustableArrowCap *
GetNativeAdjustableArrowCap() const
{
return static_cast<GpAdjustableArrowCap *>(nativeCap);
}
private:
// AdjustableArrowCap is not copyable
AdjustableArrowCap(const AdjustableArrowCap &);
AdjustableArrowCap &
operator=(const AdjustableArrowCap &);
}; };
#endif /* _GDIPLUSLINECAPS_H */ #endif /* _GDIPLUSLINECAPS_H */

View file

@ -25,6 +25,7 @@ class Graphics;
class GraphicsPath : public GdiplusBase class GraphicsPath : public GdiplusBase
{ {
friend class Region; friend class Region;
friend class CustomLineCap;
public: public:
GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fillMode) : nativePath(NULL) GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fillMode) : nativePath(NULL)