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