15f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com/* 25f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Copyright 2012 Google Inc. 35f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * 45f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Use of this source code is governed by a BSD-style license that can be 55f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * found in the LICENSE file. 65f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 75f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 85f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#ifndef SkStrokeRec_DEFINED 95f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#define SkStrokeRec_DEFINED 105f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 115f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#include "SkPaint.h" 125f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 135f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comclass SkPath; 145f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 155f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comclass SkStrokeRec { 165f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.compublic: 175f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com enum InitStyle { 185f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kHairline_InitStyle, 195f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kFill_InitStyle 205f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com }; 215f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkStrokeRec(InitStyle style); 225f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 235f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkStrokeRec(const SkStrokeRec&); 2405d9044de4f1c6e791df66a425638752daac4c6breed SkStrokeRec(const SkPaint&, SkPaint::Style, SkScalar resScale = 1); 2505d9044de4f1c6e791df66a425638752daac4c6breed explicit SkStrokeRec(const SkPaint&, SkScalar resScale = 1); 265f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 275f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com enum Style { 285f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kHairline_Style, 295f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kFill_Style, 305f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kStroke_Style, 315f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com kStrokeAndFill_Style 325f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com }; 33b85a0aab6905af8b329539b7573a7555b727d5e5cdalton enum { 34b85a0aab6905af8b329539b7573a7555b727d5e5cdalton kStyleCount = kStrokeAndFill_Style + 1 35b85a0aab6905af8b329539b7573a7555b727d5e5cdalton }; 365f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 375f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com Style getStyle() const; 385f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar getWidth() const { return fWidth; } 395f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar getMiter() const { return fMiterLimit; } 405f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Cap getCap() const { return fCap; } 415f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Join getJoin() const { return fJoin; } 425f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 435f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool isHairlineStyle() const { 445f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return kHairline_Style == this->getStyle(); 455f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 465f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 475f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool isFillStyle() const { 485f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return kFill_Style == this->getStyle(); 495f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 505f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 515f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setFillStyle(); 525f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setHairlineStyle(); 535f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 545f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Specify the strokewidth, and optionally if you want stroke + fill. 555f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Note, if width==0, then this request is taken to mean: 565f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * strokeAndFill==true -> new style will be Fill 575f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * strokeAndFill==false -> new style will be Hairline 585f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 595f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setStrokeStyle(SkScalar width, bool strokeAndFill = false); 605f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 615f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setStrokeParams(SkPaint::Cap cap, SkPaint::Join join, SkScalar miterLimit) { 625f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fCap = cap; 635f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fJoin = join; 645f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fMiterLimit = miterLimit; 655f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 665f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 67f103cd85392e30d2a534a3a62a034e79abff2d4fegdaniel void setResScale(SkScalar rs) { 68f103cd85392e30d2a534a3a62a034e79abff2d4fegdaniel SkASSERT(rs > 0 && SkScalarIsFinite(rs)); 69f103cd85392e30d2a534a3a62a034e79abff2d4fegdaniel fResScale = rs; 70f103cd85392e30d2a534a3a62a034e79abff2d4fegdaniel } 71f103cd85392e30d2a534a3a62a034e79abff2d4fegdaniel 725f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 735f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Returns true if this specifes any thick stroking, i.e. applyToPath() 745f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * will return true. 755f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 765f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool needToApply() const { 775f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com Style style = this->getStyle(); 785f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return (kStroke_Style == style) || (kStrokeAndFill_Style == style); 795f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 805f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 815f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 825f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Apply these stroke parameters to the src path, returning the result 835f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * in dst. 845f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * 855f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * If there was no change (i.e. style == hairline or fill) this returns 865f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * false and dst is unchanged. Otherwise returns true and the result is 875f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * stored in dst. 885f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * 895f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * src and dst may be the same path. 905f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 915f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool applyToPath(SkPath* dst, const SkPath& src) const; 925f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 9320b373cf3116905fc5ca1928c9b504851335ca43cdalton /** 9420b373cf3116905fc5ca1928c9b504851335ca43cdalton * Apply these stroke parameters to a paint. 9520b373cf3116905fc5ca1928c9b504851335ca43cdalton */ 9620b373cf3116905fc5ca1928c9b504851335ca43cdalton void applyToPaint(SkPaint* paint) const; 9720b373cf3116905fc5ca1928c9b504851335ca43cdalton 988f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen /** 998f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen * Compare if two SkStrokeRecs have an equal effect on a path. 1008f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen * Equal SkStrokeRecs produce equal paths. Equality of produced 1018f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen * paths does not take the ResScale parameter into account. 1028f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen */ 1038f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen bool hasEqualEffect(const SkStrokeRec& other) const { 1048f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen if (!this->needToApply()) { 1058f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen return this->getStyle() == other.getStyle(); 1068f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen } 1078f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen return fWidth == other.fWidth && 1088f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen fMiterLimit == other.fMiterLimit && 1098f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen fCap == other.fCap && 1108f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen fJoin == other.fJoin && 1118f827fe44aad3c93638bc0f5dec32812c9ba2c98kkinnunen fStrokeAndFill == other.fStrokeAndFill; 1125c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org } 1135c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org 1145f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comprivate: 11505d9044de4f1c6e791df66a425638752daac4c6breed void init(const SkPaint&, SkPaint::Style, SkScalar resScale); 116e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel 11705d9044de4f1c6e791df66a425638752daac4c6breed SkScalar fResScale; 1185f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar fWidth; 1195f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar fMiterLimit; 1205f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Cap fCap; 1215f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Join fJoin; 1225f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool fStrokeAndFill; 1235f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}; 1245f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 1255f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#endif 126