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#include "SkStrokeRec.h"
95f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#include "SkPaintDefaults.h"
105f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
115f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com// must be < 0, since ==0 means hairline, and >0 means normal stroke
125f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#define kStrokeRec_FillStyleWidth     (-SK_Scalar1)
135f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
145f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comSkStrokeRec::SkStrokeRec(InitStyle s) {
155f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fWidth          = (kFill_InitStyle == s) ? kStrokeRec_FillStyleWidth : 0;
165f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fMiterLimit     = SkPaintDefaults_MiterLimit;
175f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fCap            = SkPaint::kDefault_Cap;
185f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fJoin           = SkPaint::kDefault_Join;
195f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fStrokeAndFill  = false;
205f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
215f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
225f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comSkStrokeRec::SkStrokeRec(const SkStrokeRec& src) {
235f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    memcpy(this, &src, sizeof(src));
245f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
255f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
265f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comSkStrokeRec::SkStrokeRec(const SkPaint& paint) {
27e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel    this->init(paint, paint.getStyle());
28e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel}
29e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel
30e61c411c1258a323a010558c08de3d9f8d170dcaegdanielSkStrokeRec::SkStrokeRec(const SkPaint& paint, SkPaint::Style styleOverride) {
31e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel    this->init(paint, styleOverride);
32e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel}
33e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel
34e61c411c1258a323a010558c08de3d9f8d170dcaegdanielvoid SkStrokeRec::init(const SkPaint& paint, SkPaint::Style style) {
35e61c411c1258a323a010558c08de3d9f8d170dcaegdaniel    switch (style) {
365f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        case SkPaint::kFill_Style:
375f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fWidth = kStrokeRec_FillStyleWidth;
385f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fStrokeAndFill = false;
395f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            break;
405f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        case SkPaint::kStroke_Style:
415f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fWidth = paint.getStrokeWidth();
425f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fStrokeAndFill = false;
435f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            break;
445f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        case SkPaint::kStrokeAndFill_Style:
455f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            if (0 == paint.getStrokeWidth()) {
465f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com                // hairline+fill == fill
475f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com                fWidth = kStrokeRec_FillStyleWidth;
485f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com                fStrokeAndFill = false;
495f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            } else {
505f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com                fWidth = paint.getStrokeWidth();
515f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com                fStrokeAndFill = true;
525f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            }
535f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            break;
545f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        default:
55330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com            SkDEBUGFAIL("unknown paint style");
565f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            // fall back on just fill
575f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fWidth = kStrokeRec_FillStyleWidth;
585f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            fStrokeAndFill = false;
595f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com            break;
605f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    }
615f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
625f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    // copy these from the paint, regardless of our "style"
635f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fMiterLimit = paint.getStrokeMiter();
645f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fCap        = paint.getStrokeCap();
655f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fJoin       = paint.getStrokeJoin();
665f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
675f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
685f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comSkStrokeRec::Style SkStrokeRec::getStyle() const {
695f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    if (fWidth < 0) {
705f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        return kFill_Style;
715f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    } else if (0 == fWidth) {
725f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        return kHairline_Style;
735f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    } else {
745f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        return fStrokeAndFill ? kStrokeAndFill_Style : kStroke_Style;
755f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    }
765f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
775f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
785f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comvoid SkStrokeRec::setFillStyle() {
795f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fWidth = kStrokeRec_FillStyleWidth;
805f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fStrokeAndFill = false;
815f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
825f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
835f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comvoid SkStrokeRec::setHairlineStyle() {
845f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fWidth = 0;
855f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    fStrokeAndFill = false;
865f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
875f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
885f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.comvoid SkStrokeRec::setStrokeStyle(SkScalar width, bool strokeAndFill) {
895f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    if (strokeAndFill && (0 == width)) {
905f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        // hairline+fill == fill
915f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        this->setFillStyle();
925f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    } else {
935f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        fWidth = width;
945f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        fStrokeAndFill = strokeAndFill;
955f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    }
965f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
975f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
985f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#include "SkStroke.h"
995f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
1005f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.combool SkStrokeRec::applyToPath(SkPath* dst, const SkPath& src) const {
1015f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    if (fWidth <= 0) {  // hairline or fill
1025f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com        return false;
1035f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    }
1045f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com
1055f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    SkStroke stroker;
1065f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.setCap(fCap);
1075f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.setJoin(fJoin);
1085f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.setMiterLimit(fMiterLimit);
1095f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.setWidth(fWidth);
1105f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.setDoFill(fStrokeAndFill);
1115f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    stroker.strokePath(src, dst);
1125f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com    return true;
1135f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com}
114