Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
8.3 KiB

  1. /**************************************************************************\
  2. *
  3. * Copyright (c) 2000 Microsoft Corporation
  4. *
  5. * Module Name:
  6. *
  7. * CustomLineCap.hpp
  8. *
  9. * Abstract:
  10. *
  11. * Class used for the custom line caps.
  12. *
  13. * Revision History:
  14. *
  15. * 02/21/00 ikkof
  16. * Created it.
  17. *
  18. \**************************************************************************/
  19. #ifndef _DPCUSTOMLINECAP_HPP
  20. #define _DPCUSTOMLINECAP_HPP
  21. class DpCustomLineCap : public GpObject
  22. {
  23. protected:
  24. VOID SetValid(BOOL valid)
  25. {
  26. GpObject::SetValid(valid ? ObjectTagCustomLineCap : ObjectTagInvalid);
  27. }
  28. public:
  29. DpCustomLineCap() {}
  30. virtual BOOL IsValid() const
  31. {
  32. // If the line cap came from a different version of GDI+, its tag
  33. // will not match, and it won't be considered valid.
  34. return GpObject::IsValid(ObjectTagCustomLineCap);
  35. }
  36. INT GetFillPointCount() const
  37. {
  38. ASSERT(IsValid());
  39. ASSERT((FillPath != NULL) && FillPath->IsValid());
  40. return FillPath->GetPointCount();
  41. }
  42. INT GetStrokePointCount() const
  43. {
  44. ASSERT(IsValid());
  45. ASSERT((StrokePath != NULL) && StrokePath->IsValid());
  46. return StrokePath->GetPointCount();
  47. }
  48. const GpPointF * GetFillPoints() const
  49. {
  50. ASSERT(IsValid());
  51. ASSERT((FillPath != NULL) && FillPath->IsValid());
  52. return FillPath->GetPathPoints();
  53. }
  54. const GpPointF * GetStrokePoints() const
  55. {
  56. ASSERT(IsValid());
  57. ASSERT((StrokePath != NULL) && StrokePath->IsValid());
  58. return StrokePath->GetPathPoints();
  59. }
  60. const BYTE * GetFillTypes() const
  61. {
  62. ASSERT(IsValid());
  63. ASSERT((FillPath != NULL) && FillPath->IsValid());
  64. return FillPath->GetPathTypes();
  65. }
  66. const BYTE * GetStrokeTypes() const
  67. {
  68. ASSERT(IsValid());
  69. ASSERT((StrokePath != NULL) && StrokePath->IsValid());
  70. return StrokePath->GetPathTypes();
  71. }
  72. GpStatus SetStrokeCaps(GpLineCap lineCap)
  73. {
  74. ASSERT(IsValid());
  75. return SetStrokeCaps(lineCap, lineCap);
  76. }
  77. GpStatus SetStrokeCaps(GpLineCap startCap, GpLineCap endCap)
  78. {
  79. ASSERT(IsValid());
  80. // Allow only non-anchor types of caps.
  81. GpStatus status = Ok;
  82. GpLineCap savedStartCap = StrokeStartCap;
  83. GpLineCap savedEndCap = StrokeEndCap;
  84. switch(startCap)
  85. {
  86. case LineCapFlat:
  87. case LineCapSquare:
  88. case LineCapRound:
  89. case LineCapTriangle:
  90. StrokeStartCap = startCap;
  91. break;
  92. default:
  93. status = InvalidParameter;
  94. break;
  95. }
  96. if(status == Ok)
  97. {
  98. switch(endCap)
  99. {
  100. case LineCapFlat:
  101. case LineCapSquare:
  102. case LineCapRound:
  103. case LineCapTriangle:
  104. StrokeEndCap = endCap;
  105. break;
  106. default:
  107. status = InvalidParameter;
  108. break;
  109. }
  110. }
  111. if(status != Ok)
  112. {
  113. // Go back to the original caps.
  114. StrokeStartCap = savedStartCap;
  115. StrokeEndCap = savedEndCap;
  116. }
  117. return status;
  118. }
  119. GpStatus GetStrokeCaps(GpLineCap* startCap, GpLineCap* endCap) const
  120. {
  121. ASSERT(IsValid());
  122. if(startCap)
  123. *startCap = StrokeStartCap;
  124. if(endCap)
  125. *endCap = StrokeEndCap;
  126. return Ok;
  127. }
  128. GpStatus SetBaseCap(GpLineCap lineCap)
  129. {
  130. ASSERT(IsValid());
  131. // Allow only non-anchor types of caps.
  132. GpStatus status = Ok;
  133. switch(lineCap)
  134. {
  135. case LineCapFlat:
  136. case LineCapSquare:
  137. case LineCapRound:
  138. case LineCapTriangle:
  139. BaseCap = lineCap;
  140. break;
  141. default:
  142. status = InvalidParameter;
  143. break;
  144. }
  145. return status;
  146. }
  147. GpStatus GetBaseCap(GpLineCap* baseCap) const
  148. {
  149. ASSERT(IsValid());
  150. if(baseCap)
  151. *baseCap = BaseCap;
  152. return Ok;
  153. }
  154. GpStatus SetBaseInset(REAL inset)
  155. {
  156. ASSERT(IsValid());
  157. BaseInset = inset;
  158. return Ok;
  159. }
  160. GpStatus GetBaseInset(REAL* inset) const
  161. {
  162. ASSERT(IsValid());
  163. if(inset)
  164. *inset = BaseInset;
  165. return Ok;
  166. }
  167. GpStatus SetStrokeJoin(GpLineJoin lineJoin)
  168. {
  169. ASSERT(IsValid());
  170. StrokeJoin = lineJoin;
  171. return Ok;
  172. }
  173. GpStatus GetStrokeJoin(GpLineJoin* lineJoin) const
  174. {
  175. ASSERT(IsValid());
  176. if(lineJoin)
  177. {
  178. *lineJoin = StrokeJoin;
  179. return Ok;
  180. }
  181. else
  182. return InvalidParameter;
  183. }
  184. GpStatus SetStrokeMiterLimit(REAL miterLimit)
  185. {
  186. ASSERT(IsValid());
  187. if(miterLimit > 1)
  188. {
  189. StrokeMiterLimit = miterLimit;
  190. return Ok;
  191. }
  192. else
  193. return InvalidParameter;
  194. }
  195. REAL GetStrokeMiterLimit() const
  196. {
  197. ASSERT(IsValid());
  198. return StrokeMiterLimit;
  199. }
  200. REAL GetStrokeLength() const
  201. {
  202. ASSERT(IsValid());
  203. return StrokeLength;
  204. }
  205. REAL GetFillLength() const
  206. {
  207. ASSERT(IsValid());
  208. return FillLength;
  209. }
  210. GpStatus SetWidthScale(REAL widthScale)
  211. {
  212. ASSERT(IsValid());
  213. WidthScale = widthScale;
  214. return Ok;
  215. }
  216. GpStatus GetWidthScale(REAL* widthScale) const
  217. {
  218. ASSERT(IsValid());
  219. if(widthScale)
  220. *widthScale = WidthScale;
  221. return Ok;
  222. }
  223. GpStatus SetFillHotSpot(const GpPointF& hotSpot)
  224. {
  225. ASSERT(IsValid());
  226. FillHotSpot = hotSpot;
  227. return Ok;
  228. }
  229. GpStatus GetFillHotSpot(GpPointF* hotSpot)
  230. {
  231. ASSERT(IsValid());
  232. if(!hotSpot)
  233. return InvalidParameter;
  234. *hotSpot = FillHotSpot;
  235. return Ok;
  236. }
  237. GpStatus SetStrokeHotSpot(const GpPointF& hotSpot)
  238. {
  239. ASSERT(IsValid());
  240. StrokeHotSpot = hotSpot;
  241. return Ok;
  242. }
  243. GpStatus GetStrokeHotSpot(GpPointF* hotSpot)
  244. {
  245. ASSERT(IsValid());
  246. if(!hotSpot)
  247. return InvalidParameter;
  248. *hotSpot = StrokeHotSpot;
  249. return Ok;
  250. }
  251. virtual BOOL IsEqual(const DpCustomLineCap* customLineCap) const = 0;
  252. virtual INT GetTransformedFillCap(
  253. GpPointF* points,
  254. BYTE* types,
  255. INT count,
  256. const GpPointF& origin,
  257. const GpPointF& tangent,
  258. REAL lineWidth,
  259. REAL mimimumWidth
  260. ) const = 0;
  261. virtual INT GetTransformedStrokeCap(
  262. INT cCapacity, // In, initial pPoints & pTypes capacity
  263. GpPointF ** pPoints, // In/out, may be reallocated here
  264. BYTE ** pTypes, // In/out, may be reallocated here
  265. INT * pCount, // In/out, may change here if flattened
  266. const GpPointF& origin,
  267. const GpPointF& tangent,
  268. REAL lineWidth,
  269. REAL minimumWidth
  270. ) const = 0;
  271. virtual REAL GetRadius(
  272. REAL lineWidth,
  273. REAL minimumWidth
  274. ) const = 0;
  275. protected:
  276. GpLineCap BaseCap;
  277. REAL BaseInset;
  278. GpPointF FillHotSpot;
  279. GpPointF StrokeHotSpot;
  280. GpLineCap StrokeStartCap;
  281. GpLineCap StrokeEndCap;
  282. GpLineJoin StrokeJoin;
  283. REAL StrokeMiterLimit;
  284. REAL WidthScale;
  285. REAL FillLength; // Length of the FillCap/StrokeCap from
  286. REAL StrokeLength; // zero along the positive y axis.
  287. // Used for computing the direction of
  288. // the cap.
  289. DpPath * FillPath;
  290. DpPath * StrokePath;
  291. };
  292. #endif