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&); 24e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel SkStrokeRec(const SkPaint&, SkPaint::Style); 255f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com explicit SkStrokeRec(const SkPaint&); 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 }; 335f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 345f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com Style getStyle() const; 355f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar getWidth() const { return fWidth; } 365f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar getMiter() const { return fMiterLimit; } 375f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Cap getCap() const { return fCap; } 385f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Join getJoin() const { return fJoin; } 395f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 405f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool isHairlineStyle() const { 415f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return kHairline_Style == this->getStyle(); 425f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 435f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 445f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool isFillStyle() const { 455f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return kFill_Style == this->getStyle(); 465f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 475f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 485f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setFillStyle(); 495f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setHairlineStyle(); 505f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 515f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Specify the strokewidth, and optionally if you want stroke + fill. 525f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Note, if width==0, then this request is taken to mean: 535f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * strokeAndFill==true -> new style will be Fill 545f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * strokeAndFill==false -> new style will be Hairline 555f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 565f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setStrokeStyle(SkScalar width, bool strokeAndFill = false); 575f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 585f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com void setStrokeParams(SkPaint::Cap cap, SkPaint::Join join, SkScalar miterLimit) { 595f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fCap = cap; 605f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fJoin = join; 615f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com fMiterLimit = miterLimit; 625f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 635f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 645f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 655f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Returns true if this specifes any thick stroking, i.e. applyToPath() 665f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * will return true. 675f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 685f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool needToApply() const { 695f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com Style style = this->getStyle(); 705f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com return (kStroke_Style == style) || (kStrokeAndFill_Style == style); 715f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com } 725f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 735f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com /** 745f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * Apply these stroke parameters to the src path, returning the result 755f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * in dst. 765f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * 775f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * If there was no change (i.e. style == hairline or fill) this returns 785f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * false and dst is unchanged. Otherwise returns true and the result is 795f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * stored in dst. 805f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * 815f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com * src and dst may be the same path. 825f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com */ 835f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool applyToPath(SkPath* dst, const SkPath& src) const; 845f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 855c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org bool operator==(const SkStrokeRec& other) const { 865c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org return fWidth == other.fWidth && 875c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org fMiterLimit == other.fMiterLimit && 885c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org fCap == other.fCap && 895c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org fJoin == other.fJoin && 905c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org fStrokeAndFill == other.fStrokeAndFill; 915c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org } 925c8ee2539b9316b22416a991a1f560ef5cec7957commit-bot@chromium.org 935f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comprivate: 94e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel void init(const SkPaint& paint, SkPaint::Style style); 95e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel 96e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel 975f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar fWidth; 985f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkScalar fMiterLimit; 995f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Cap fCap; 1005f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com SkPaint::Join fJoin; 1015f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com bool fStrokeAndFill; 1025f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}; 1035f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 1045f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#endif 105