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