blob: beaa36e17d85b4a15dfa43d5c934824475b5e14f [file] [log] [blame]
Mike Reed41232232018-03-07 17:02:47 -05001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkPathMeasure.h"
9#include "SkTrimPathEffect.h"
10#include "SkTrimPE.h"
11#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
13
14SkTrimPE::SkTrimPE(SkScalar startT, SkScalar stopT) : fStartT(startT), fStopT(stopT) {
15 SkASSERT(startT >= 0 && startT <= 1);
16 SkASSERT(stopT >= 0 && stopT <= 1);
17 SkASSERT(startT != stopT);
18}
19
20bool SkTrimPE::filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec,
21 const SkRect* cullRect) const {
22 SkPathMeasure meas(src, false);
23 SkScalar length = meas.getLength();
24
25 if (fStartT < fStopT) {
26 meas.getSegment(fStartT * length, fStopT * length, dst, true);
27 } else {
28 meas.getSegment(0, fStopT * length, dst, true);
29 meas.getSegment(fStartT * length, length, dst, true);
30 }
31 return true;
32}
33
34void SkTrimPE::flatten(SkWriteBuffer& buffer) const {
35 buffer.writeScalar(fStartT);
36 buffer.writeScalar(fStopT);
37}
38
39sk_sp<SkFlattenable> SkTrimPE::CreateProc(SkReadBuffer& buffer) {
40 SkScalar start = buffer.readScalar();
41 SkScalar stop = buffer.readScalar();
42 return SkTrimPathEffect::Make(start, stop);
43}
44
45#ifndef SK_IGNORE_TO_STRING
46void SkTrimPE::toString(SkString* str) const {
47 str->appendf("SkTrimPathEffect: (%g %g)", fStartT, fStopT);
48}
49#endif
50
51//////////////////////////////////////////////////////////////////////////////////////////////////
52
53sk_sp<SkPathEffect> SkTrimPathEffect::Make(SkScalar startT, SkScalar stopT) {
54 if (!SkScalarsAreFinite(startT, stopT)) {
55 return nullptr;
56 }
57 startT = SkTPin(startT, 0.f, 1.f);
58 stopT = SkTPin(stopT, 0.f, 1.f);
59 if (startT == stopT) {
60 return nullptr;
61 }
62 return sk_sp<SkPathEffect>(new SkTrimPE(startT, stopT));
63}