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