OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrGLPathRange.h" | 9 #include "GrGLPathRange.h" |
10 #include "GrGLPath.h" | 10 #include "GrGLPath.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 const GrStrokeInfo& stroke) | 27 const GrStrokeInfo& stroke) |
28 : INHERITED(gpu, numPaths), | 28 : INHERITED(gpu, numPaths), |
29 fStroke(stroke), | 29 fStroke(stroke), |
30 fBasePathID(basePathID), | 30 fBasePathID(basePathID), |
31 fGpuMemorySize(gpuMemorySize) { | 31 fGpuMemorySize(gpuMemorySize) { |
32 this->init(); | 32 this->init(); |
33 this->registerWithCache(); | 33 this->registerWithCache(); |
34 } | 34 } |
35 | 35 |
36 void GrGLPathRange::init() { | 36 void GrGLPathRange::init() { |
37 if (fStroke.isDashed()) { | 37 // Must force fill: |
| 38 // * dashing: NVPR stroke dashing is different to Skia. |
| 39 // * end caps: NVPR stroking degenerate contours with end caps is different
to Skia. |
| 40 bool forceFill = fStroke.isDashed() || |
| 41 (fStroke.needToApply() && fStroke.getCap() != SkPaint::kButt_Cap); |
| 42 |
| 43 if (forceFill) { |
38 fShouldStroke = false; | 44 fShouldStroke = false; |
39 fShouldFill = true; | 45 fShouldFill = true; |
40 } else { | 46 } else { |
41 fShouldStroke = fStroke.needToApply(); | 47 fShouldStroke = fStroke.needToApply(); |
42 fShouldFill = fStroke.isFillStyle() || | 48 fShouldFill = fStroke.isFillStyle() || |
43 fStroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; | 49 fStroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; |
44 } | 50 } |
45 } | 51 } |
46 | 52 |
47 void GrGLPathRange::onInitPath(int index, const SkPath& origSkPath) const { | 53 void GrGLPathRange::onInitPath(int index, const SkPath& origSkPath) const { |
48 GrGLGpu* gpu = static_cast<GrGLGpu*>(this->getGpu()); | 54 GrGLGpu* gpu = static_cast<GrGLGpu*>(this->getGpu()); |
49 if (nullptr == gpu) { | 55 if (nullptr == gpu) { |
50 return; | 56 return; |
51 } | 57 } |
52 | 58 |
53 // Make sure the path at this index hasn't been initted already. | 59 // Make sure the path at this index hasn't been initted already. |
54 SkDEBUGCODE( | 60 SkDEBUGCODE( |
55 GrGLboolean isPath; | 61 GrGLboolean isPath; |
56 GR_GL_CALL_RET(gpu->glInterface(), isPath, IsPath(fBasePathID + index)))
; | 62 GR_GL_CALL_RET(gpu->glInterface(), isPath, IsPath(fBasePathID + index)))
; |
57 SkASSERT(GR_GL_FALSE == isPath); | 63 SkASSERT(GR_GL_FALSE == isPath); |
58 | 64 |
59 const SkPath* skPath = &origSkPath; | 65 if (origSkPath.isEmpty()) { |
60 SkTLazy<SkPath> tmpPath; | 66 GrGLPath::InitPathObjectEmptyPath(gpu, fBasePathID + index); |
61 const GrStrokeInfo* stroke = &fStroke; | 67 } else if (fShouldStroke) { |
62 GrStrokeInfo tmpStroke(SkStrokeRec::kFill_InitStyle); | 68 GrGLPath::InitPathObjectPathData(gpu, fBasePathID + index, origSkPath); |
| 69 GrGLPath::InitPathObjectStroke(gpu, fBasePathID + index, fStroke); |
| 70 } else { |
| 71 const SkPath* skPath = &origSkPath; |
| 72 SkTLazy<SkPath> tmpPath; |
| 73 const GrStrokeInfo* stroke = &fStroke; |
| 74 GrStrokeInfo tmpStroke(SkStrokeRec::kFill_InitStyle); |
63 | 75 |
64 // Dashing must be applied to the path. However, if dashing is present, | 76 // Dashing must be applied to the path. However, if dashing is present, |
65 // we must convert all the paths to fills. The GrStrokeInfo::applyDash leave
s | 77 // we must convert all the paths to fills. The GrStrokeInfo::applyDash l
eaves |
66 // simple paths as strokes but converts other paths to fills. | 78 // simple paths as strokes but converts other paths to fills. |
67 // Thus we must stroke the strokes here, so that all paths in the | 79 // Thus we must stroke the strokes here, so that all paths in the |
68 // path range are using the same style. | 80 // path range are using the same style. |
69 if (fStroke.isDashed()) { | 81 if (fStroke.isDashed()) { |
70 if (!stroke->applyDashToPath(tmpPath.init(), &tmpStroke, *skPath)) { | 82 if (!stroke->applyDashToPath(tmpPath.init(), &tmpStroke, *skPath)) { |
71 return; | |
72 } | |
73 skPath = tmpPath.get(); | |
74 stroke = &tmpStroke; | |
75 if (tmpStroke.needToApply()) { | |
76 if (!tmpStroke.applyToPath(tmpPath.get(), *tmpPath.get())) { | |
77 return; | 83 return; |
78 } | 84 } |
79 tmpStroke.setFillStyle(); | 85 skPath = tmpPath.get(); |
| 86 stroke = &tmpStroke; |
80 } | 87 } |
| 88 if (stroke->needToApply()) { |
| 89 if (!tmpPath.isValid()) { |
| 90 tmpPath.init(); |
| 91 } |
| 92 if (!stroke->applyToPath(tmpPath.get(), *tmpPath.get())) { |
| 93 return; |
| 94 } |
| 95 } |
| 96 GrGLPath::InitPathObjectPathData(gpu, fBasePathID + index, *skPath); |
81 } | 97 } |
82 | |
83 GrGLPath::InitPathObject(gpu, fBasePathID + index, *skPath, *stroke); | |
84 | |
85 // TODO: Use a better approximation for the individual path sizes. | 98 // TODO: Use a better approximation for the individual path sizes. |
86 fGpuMemorySize += 100; | 99 fGpuMemorySize += 100; |
87 } | 100 } |
88 | 101 |
89 void GrGLPathRange::onRelease() { | 102 void GrGLPathRange::onRelease() { |
90 SkASSERT(this->getGpu()); | 103 SkASSERT(this->getGpu()); |
91 | 104 |
92 if (0 != fBasePathID && this->shouldFreeResources()) { | 105 if (0 != fBasePathID && this->shouldFreeResources()) { |
93 static_cast<GrGLGpu*>(this->getGpu())->glPathRendering()->deletePaths(fB
asePathID, | 106 static_cast<GrGLGpu*>(this->getGpu())->glPathRendering()->deletePaths(fB
asePathID, |
94 th
is->getNumPaths()); | 107 th
is->getNumPaths()); |
95 fBasePathID = 0; | 108 fBasePathID = 0; |
96 } | 109 } |
97 | 110 |
98 INHERITED::onRelease(); | 111 INHERITED::onRelease(); |
99 } | 112 } |
100 | 113 |
101 void GrGLPathRange::onAbandon() { | 114 void GrGLPathRange::onAbandon() { |
102 fBasePathID = 0; | 115 fBasePathID = 0; |
103 | 116 |
104 INHERITED::onAbandon(); | 117 INHERITED::onAbandon(); |
105 } | 118 } |
OLD | NEW |