/**************************************************************************\ * * Copyright (c) 2000 Microsoft Corporation * * Module Name: * * CustomLineCap.hpp * * Abstract: * * Class used for the custom line caps. * * Revision History: * * 02/21/00 ikkof * Created it. * \**************************************************************************/ #ifndef _CUSTOMLINECAP_HPP #define _CUSTOMLINECAP_HPP #define CLCAP_BUFFER_SIZE 16 class GpCustomLineCap : public DpCustomLineCap { friend class GpObject; protected: // This is used by the object factory GpCustomLineCap( ) : GpFillPath (NULL, 0, PointsBuffer1, TypesBuffer1, CLCAP_BUFFER_SIZE, FillModeWinding, DpPath::PossiblyNonConvex), GpStrokePath(NULL, 0, PointsBuffer2, TypesBuffer2, CLCAP_BUFFER_SIZE, FillModeWinding, DpPath::PossiblyNonConvex) { Initialize(); } public: GpCustomLineCap( const DpPath* fillPath, const DpPath* strokePath, GpLineCap baseCap = LineCapFlat, REAL baseInset = 0 ); virtual ObjectType GetObjectType() const; virtual UINT GetDataSize() const; virtual GpStatus GetData(IStream * stream) const; virtual GpStatus SetData(const BYTE * dataBuffer, UINT size); virtual CustomLineCapType GetType() const { return CustomLineCapTypeDefault; } GpStatus SetFillPath(const DpPath* path); GpStatus SetFillPath( const GpPointF* fillPoints, const BYTE* fillTypes, INT fillCount); GpStatus GetFillPath(GpPath* fillPath) const; GpStatus SetStrokePath(const DpPath* path); GpStatus SetStrokePath( const GpPointF* strokePoints, const BYTE* strokeTypes, INT strokeCount); GpStatus GetStrokePath(GpPath* strokePath) const; virtual BOOL IsEqual(const DpCustomLineCap* customLineCap) const; virtual INT GetTransformedFillCap( GpPointF* points, BYTE* types, INT count, const GpPointF& origin, const GpPointF& tangent, REAL lineWidth, REAL minimumWidth ) const; virtual INT GetTransformedStrokeCap( INT cCapacity, // In, initial pPoints & pTypes capacity GpPointF ** pPoints, // In/out, may be reallocated here BYTE ** pTypes, // In/out, may be reallocated here INT * pCount, // In/out, may change here if flattened const GpPointF& origin, const GpPointF& tangent, REAL lineWidth, REAL minimumWidth ) const; virtual REAL GetRadius( REAL lineWidth, REAL minimumWidth ) const; ~GpCustomLineCap(); virtual GpCustomLineCap* Clone() const { return new GpCustomLineCap(this); } // Get the lock object GpLockable *GetObjectLock() { return &Lockable; } VOID ReverseFillPath(); VOID ReverseStrokePath(); GpStatus GetCreationStatus() { return m_creationStatus; } protected: GpCustomLineCap(const GpCustomLineCap* customCap); VOID Initialize() { FillPath = &GpFillPath; StrokePath = &GpStrokePath; FillLength = 0.0f; StrokeLength = 0.0f; BaseCap = LineCapFlat; BaseInset = 0; StrokeStartCap = LineCapFlat; StrokeEndCap = LineCapFlat; StrokeJoin = LineJoinMiter; StrokeMiterLimit = 10; WidthScale = 1; FillHotSpot.X = 0; FillHotSpot.Y = 0; StrokeHotSpot.X = 0; StrokeHotSpot.Y = 0; m_creationStatus = Ok; SetValid(TRUE); } VOID Reset(); VOID ResetFillPath(); VOID ResetStrokePath(); GpStatus ComputeFillCapLength(); GpStatus ComputeStrokeCapLength(); protected: GpLockable Lockable; GpPath GpFillPath; GpPath GpStrokePath; GpPointF PointsBuffer1[CLCAP_BUFFER_SIZE]; GpPointF PointsBuffer2[CLCAP_BUFFER_SIZE]; BYTE TypesBuffer1[CLCAP_BUFFER_SIZE]; BYTE TypesBuffer2[CLCAP_BUFFER_SIZE]; GpStatus m_creationStatus; // check this if IsValid() == FALSE }; class GpAdjustableArrowCap : public GpCustomLineCap { friend class GpObject; private: // This is only used by the object factory GpAdjustableArrowCap() { SetDefaultValue(); Update(); } public: GpAdjustableArrowCap(REAL height, REAL width, BOOL isFilled = TRUE) { Height = height; Width = width; MiddleInset = 0; FillState = isFilled; Update(); } virtual UINT GetDataSize() const; virtual GpStatus GetData(IStream * stream) const; virtual GpStatus SetData(const BYTE * dataBuffer, UINT size); CustomLineCapType GetType() const { return CustomLineCapTypeAdjustableArrow; } GpStatus SetHeight(REAL height) { if(Height == height) return Ok; Height = height; return Update(); } REAL GetHeight() const { return Height; } GpStatus SetWidth(REAL width) { if(Width == width) return Ok; Width = width; return Update(); } REAL GetWidth() const { return Width; } GpStatus SetMiddleInset(REAL middleInset) { if(MiddleInset == middleInset) return Ok; MiddleInset = middleInset; return Update(); } REAL GetMiddleInset() const { return MiddleInset; } GpStatus SetFillState(BOOL isFilled) { if(FillState == isFilled) return Ok; FillState = isFilled; return Update(); } BOOL IsFilled() const {return FillState;} virtual GpCustomLineCap* Clone() const { return new GpAdjustableArrowCap(this); } protected: GpAdjustableArrowCap(const GpAdjustableArrowCap* customCap); VOID SetDefaultValue() { Height = 2; Width = 2; MiddleInset = 0; FillState = TRUE; } GpStatus GetPathData( GpPathData* pathData, REAL height, REAL width, REAL middleInset, BOOL isFilled ); GpStatus Update(); protected: REAL Width; REAL Height; REAL MiddleInset; BOOL FillState; }; #endif