Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: src/utils/SkPatchUtils.cpp

Issue 1842753002: Style bikeshed - remove extraneous whitespace (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/utils/SkPatchUtils.h ('k') | src/utils/SkTextBox.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkPatchUtils.h" 8 #include "SkPatchUtils.h"
9 9
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 10 matching lines...) Expand all
21 * to compute the next one. 21 * to compute the next one.
22 * 22 *
23 * For the cubic case the first difference gives as a result a quadratic polynom ial to which we can 23 * For the cubic case the first difference gives as a result a quadratic polynom ial to which we can
24 * apply again forward differences and get linear function to which we can apply again forward 24 * apply again forward differences and get linear function to which we can apply again forward
25 * differences to get a constant difference. This is why we keep an array of siz e 4, the 0th 25 * differences to get a constant difference. This is why we keep an array of siz e 4, the 0th
26 * position keeps the sampled value while the next ones keep the quadratic, line ar and constant 26 * position keeps the sampled value while the next ones keep the quadratic, line ar and constant
27 * difference values. 27 * difference values.
28 */ 28 */
29 29
30 class FwDCubicEvaluator { 30 class FwDCubicEvaluator {
31 31
32 public: 32 public:
33 33
34 /** 34 /**
35 * Receives the 4 control points of the cubic bezier. 35 * Receives the 4 control points of the cubic bezier.
36 */ 36 */
37 37
38 explicit FwDCubicEvaluator(const SkPoint points[4]) 38 explicit FwDCubicEvaluator(const SkPoint points[4])
39 : fCoefs(points) { 39 : fCoefs(points) {
40 memcpy(fPoints, points, 4 * sizeof(SkPoint)); 40 memcpy(fPoints, points, 4 * sizeof(SkPoint));
41 41
42 this->restart(1); 42 this->restart(1);
43 } 43 }
44 44
45 /** 45 /**
46 * Restarts the forward differences evaluator to the first value of t = 0. 46 * Restarts the forward differences evaluator to the first value of t = 0.
47 */ 47 */
48 void restart(int divisions) { 48 void restart(int divisions) {
49 fDivisions = divisions; 49 fDivisions = divisions;
50 fCurrent = 0; 50 fCurrent = 0;
51 fMax = fDivisions + 1; 51 fMax = fDivisions + 1;
52 Sk2s h = Sk2s(1.f / fDivisions); 52 Sk2s h = Sk2s(1.f / fDivisions);
53 Sk2s h2 = h * h; 53 Sk2s h2 = h * h;
54 Sk2s h3 = h2 * h; 54 Sk2s h3 = h2 * h;
55 Sk2s fwDiff3 = Sk2s(6) * fCoefs.fA * h3; 55 Sk2s fwDiff3 = Sk2s(6) * fCoefs.fA * h3;
56 fFwDiff[3] = to_point(fwDiff3); 56 fFwDiff[3] = to_point(fwDiff3);
57 fFwDiff[2] = to_point(fwDiff3 + times_2(fCoefs.fB) * h2); 57 fFwDiff[2] = to_point(fwDiff3 + times_2(fCoefs.fB) * h2);
58 fFwDiff[1] = to_point(fCoefs.fA * h3 + fCoefs.fB * h2 + fCoefs.fC * h); 58 fFwDiff[1] = to_point(fCoefs.fA * h3 + fCoefs.fB * h2 + fCoefs.fC * h);
59 fFwDiff[0] = to_point(fCoefs.fD); 59 fFwDiff[0] = to_point(fCoefs.fD);
60 } 60 }
61 61
62 /** 62 /**
63 * Check if the evaluator is still within the range of 0<=t<=1 63 * Check if the evaluator is still within the range of 0<=t<=1
64 */ 64 */
65 bool done() const { 65 bool done() const {
66 return fCurrent > fMax; 66 return fCurrent > fMax;
67 } 67 }
68 68
69 /** 69 /**
70 * Call next to obtain the SkPoint sampled and move to the next one. 70 * Call next to obtain the SkPoint sampled and move to the next one.
71 */ 71 */
72 SkPoint next() { 72 SkPoint next() {
73 SkPoint point = fFwDiff[0]; 73 SkPoint point = fFwDiff[0];
74 fFwDiff[0] += fFwDiff[1]; 74 fFwDiff[0] += fFwDiff[1];
75 fFwDiff[1] += fFwDiff[2]; 75 fFwDiff[1] += fFwDiff[2];
76 fFwDiff[2] += fFwDiff[3]; 76 fFwDiff[2] += fFwDiff[3];
77 fCurrent++; 77 fCurrent++;
78 return point; 78 return point;
79 } 79 }
80 80
81 const SkPoint* getCtrlPoints() const { 81 const SkPoint* getCtrlPoints() const {
82 return fPoints; 82 return fPoints;
83 } 83 }
84 84
85 private: 85 private:
86 SkCubicCoeff fCoefs; 86 SkCubicCoeff fCoefs;
87 int fMax, fCurrent, fDivisions; 87 int fMax, fCurrent, fDivisions;
88 SkPoint fFwDiff[4], fPoints[4]; 88 SkPoint fFwDiff[4], fPoints[4];
89 }; 89 };
90 90
91 //////////////////////////////////////////////////////////////////////////////// 91 ////////////////////////////////////////////////////////////////////////////////
92 92
93 // size in pixels of each partition per axis, adjust this knob 93 // size in pixels of each partition per axis, adjust this knob
94 static const int kPartitionSize = 10; 94 static const int kPartitionSize = 10;
(...skipping 13 matching lines...) Expand all
108 } 108 }
109 109
110 static SkScalar bilerp(SkScalar tx, SkScalar ty, SkScalar c00, SkScalar c10, SkS calar c01, 110 static SkScalar bilerp(SkScalar tx, SkScalar ty, SkScalar c00, SkScalar c10, SkS calar c01,
111 SkScalar c11) { 111 SkScalar c11) {
112 SkScalar a = c00 * (1.f - tx) + c10 * tx; 112 SkScalar a = c00 * (1.f - tx) + c10 * tx;
113 SkScalar b = c01 * (1.f - tx) + c11 * tx; 113 SkScalar b = c01 * (1.f - tx) + c11 * tx;
114 return a * (1.f - ty) + b * ty; 114 return a * (1.f - ty) + b * ty;
115 } 115 }
116 116
117 SkISize SkPatchUtils::GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix) { 117 SkISize SkPatchUtils::GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix) {
118 118
119 // Approximate length of each cubic. 119 // Approximate length of each cubic.
120 SkPoint pts[kNumPtsCubic]; 120 SkPoint pts[kNumPtsCubic];
121 SkPatchUtils::getTopCubic(cubics, pts); 121 SkPatchUtils::getTopCubic(cubics, pts);
122 matrix->mapPoints(pts, kNumPtsCubic); 122 matrix->mapPoints(pts, kNumPtsCubic);
123 SkScalar topLength = approx_arc_length(pts, kNumPtsCubic); 123 SkScalar topLength = approx_arc_length(pts, kNumPtsCubic);
124 124
125 SkPatchUtils::getBottomCubic(cubics, pts); 125 SkPatchUtils::getBottomCubic(cubics, pts);
126 matrix->mapPoints(pts, kNumPtsCubic); 126 matrix->mapPoints(pts, kNumPtsCubic);
127 SkScalar bottomLength = approx_arc_length(pts, kNumPtsCubic); 127 SkScalar bottomLength = approx_arc_length(pts, kNumPtsCubic);
128 128
129 SkPatchUtils::getLeftCubic(cubics, pts); 129 SkPatchUtils::getLeftCubic(cubics, pts);
130 matrix->mapPoints(pts, kNumPtsCubic); 130 matrix->mapPoints(pts, kNumPtsCubic);
131 SkScalar leftLength = approx_arc_length(pts, kNumPtsCubic); 131 SkScalar leftLength = approx_arc_length(pts, kNumPtsCubic);
132 132
133 SkPatchUtils::getRightCubic(cubics, pts); 133 SkPatchUtils::getRightCubic(cubics, pts);
134 matrix->mapPoints(pts, kNumPtsCubic); 134 matrix->mapPoints(pts, kNumPtsCubic);
135 SkScalar rightLength = approx_arc_length(pts, kNumPtsCubic); 135 SkScalar rightLength = approx_arc_length(pts, kNumPtsCubic);
136 136
137 // Level of detail per axis, based on the larger side between top and bottom or left and right 137 // Level of detail per axis, based on the larger side between top and bottom or left and right
138 int lodX = static_cast<int>(SkMaxScalar(topLength, bottomLength) / kPartitio nSize); 138 int lodX = static_cast<int>(SkMaxScalar(topLength, bottomLength) / kPartitio nSize);
139 int lodY = static_cast<int>(SkMaxScalar(leftLength, rightLength) / kPartitio nSize); 139 int lodY = static_cast<int>(SkMaxScalar(leftLength, rightLength) / kPartitio nSize);
140 140
141 return SkISize::Make(SkMax32(8, lodX), SkMax32(8, lodY)); 141 return SkISize::Make(SkMax32(8, lodX), SkMax32(8, lodY));
142 } 142 }
143 143
144 void SkPatchUtils::getTopCubic(const SkPoint cubics[12], SkPoint points[4]) { 144 void SkPatchUtils::getTopCubic(const SkPoint cubics[12], SkPoint points[4]) {
145 points[0] = cubics[kTopP0_CubicCtrlPts]; 145 points[0] = cubics[kTopP0_CubicCtrlPts];
146 points[1] = cubics[kTopP1_CubicCtrlPts]; 146 points[1] = cubics[kTopP1_CubicCtrlPts];
147 points[2] = cubics[kTopP2_CubicCtrlPts]; 147 points[2] = cubics[kTopP2_CubicCtrlPts];
148 points[3] = cubics[kTopP3_CubicCtrlPts]; 148 points[3] = cubics[kTopP3_CubicCtrlPts];
149 } 149 }
150 150
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 203
204 // if colors is not null then create array for colors 204 // if colors is not null then create array for colors
205 SkPMColor colorsPM[kNumCorners]; 205 SkPMColor colorsPM[kNumCorners];
206 if (colors) { 206 if (colors) {
207 // premultiply colors to avoid color bleeding. 207 // premultiply colors to avoid color bleeding.
208 for (int i = 0; i < kNumCorners; i++) { 208 for (int i = 0; i < kNumCorners; i++) {
209 colorsPM[i] = SkPreMultiplyColor(colors[i]); 209 colorsPM[i] = SkPreMultiplyColor(colors[i]);
210 } 210 }
211 data->fColors = new uint32_t[data->fVertexCount]; 211 data->fColors = new uint32_t[data->fVertexCount];
212 } 212 }
213 213
214 // if texture coordinates are not null then create array for them 214 // if texture coordinates are not null then create array for them
215 if (texCoords) { 215 if (texCoords) {
216 data->fTexCoords = new SkPoint[data->fVertexCount]; 216 data->fTexCoords = new SkPoint[data->fVertexCount];
217 } 217 }
218 218
219 SkPoint pts[kNumPtsCubic]; 219 SkPoint pts[kNumPtsCubic];
220 SkPatchUtils::getBottomCubic(cubics, pts); 220 SkPatchUtils::getBottomCubic(cubics, pts);
221 FwDCubicEvaluator fBottom(pts); 221 FwDCubicEvaluator fBottom(pts);
222 SkPatchUtils::getTopCubic(cubics, pts); 222 SkPatchUtils::getTopCubic(cubics, pts);
223 FwDCubicEvaluator fTop(pts); 223 FwDCubicEvaluator fTop(pts);
224 SkPatchUtils::getLeftCubic(cubics, pts); 224 SkPatchUtils::getLeftCubic(cubics, pts);
225 FwDCubicEvaluator fLeft(pts); 225 FwDCubicEvaluator fLeft(pts);
226 SkPatchUtils::getRightCubic(cubics, pts); 226 SkPatchUtils::getRightCubic(cubics, pts);
227 FwDCubicEvaluator fRight(pts); 227 FwDCubicEvaluator fRight(pts);
228 228
229 fBottom.restart(lodX); 229 fBottom.restart(lodX);
230 fTop.restart(lodX); 230 fTop.restart(lodX);
231 231
232 SkScalar u = 0.0f; 232 SkScalar u = 0.0f;
233 int stride = lodY + 1; 233 int stride = lodY + 1;
234 for (int x = 0; x <= lodX; x++) { 234 for (int x = 0; x <= lodX; x++) {
235 SkPoint bottom = fBottom.next(), top = fTop.next(); 235 SkPoint bottom = fBottom.next(), top = fTop.next();
236 fLeft.restart(lodY); 236 fLeft.restart(lodY);
237 fRight.restart(lodY); 237 fRight.restart(lodY);
238 SkScalar v = 0.f; 238 SkScalar v = 0.f;
239 for (int y = 0; y <= lodY; y++) { 239 for (int y = 0; y <= lodY; y++) {
240 int dataIndex = x * (lodY + 1) + y; 240 int dataIndex = x * (lodY + 1) + y;
241 241
242 SkPoint left = fLeft.next(), right = fRight.next(); 242 SkPoint left = fLeft.next(), right = fRight.next();
243 243
244 SkPoint s0 = SkPoint::Make((1.0f - v) * top.x() + v * bottom.x(), 244 SkPoint s0 = SkPoint::Make((1.0f - v) * top.x() + v * bottom.x(),
245 (1.0f - v) * top.y() + v * bottom.y()); 245 (1.0f - v) * top.y() + v * bottom.y());
246 SkPoint s1 = SkPoint::Make((1.0f - u) * left.x() + u * right.x(), 246 SkPoint s1 = SkPoint::Make((1.0f - u) * left.x() + u * right.x(),
247 (1.0f - u) * left.y() + u * right.y()); 247 (1.0f - u) * left.y() + u * right.y());
248 SkPoint s2 = SkPoint::Make( 248 SkPoint s2 = SkPoint::Make(
249 (1.0f - v) * ((1.0f - u) * fTop.getCtrlPo ints()[0].x() 249 (1.0f - v) * ((1.0f - u) * fTop.getCtrlPo ints()[0].x()
250 + u * fTop.getCtrlPoints()[ 3].x()) 250 + u * fTop.getCtrlPoints()[ 3].x())
251 + v * ((1.0f - u) * fBottom.getCtrlPoints ()[0].x() 251 + v * ((1.0f - u) * fBottom.getCtrlPoints ()[0].x()
252 + u * fBottom.getCtrlPoints()[3].x ()), 252 + u * fBottom.getCtrlPoints()[3].x ()),
253 (1.0f - v) * ((1.0f - u) * fTop.getCtrlPo ints()[0].y() 253 (1.0f - v) * ((1.0f - u) * fTop.getCtrlPo ints()[0].y()
254 + u * fTop.getCtrlPoints()[ 3].y()) 254 + u * fTop.getCtrlPoints()[ 3].y())
255 + v * ((1.0f - u) * fBottom.getCtrlPoints ()[0].y() 255 + v * ((1.0f - u) * fBottom.getCtrlPoints ()[0].y()
256 + u * fBottom.getCtrlPoints()[3].y ())); 256 + u * fBottom.getCtrlPoints()[3].y ()));
257 data->fPoints[dataIndex] = s0 + s1 - s2; 257 data->fPoints[dataIndex] = s0 + s1 - s2;
258 258
259 if (colors) { 259 if (colors) {
260 uint8_t a = uint8_t(bilerp(u, v, 260 uint8_t a = uint8_t(bilerp(u, v,
261 SkScalar(SkColorGetA(colorsPM[kTopLeft_Corner ])), 261 SkScalar(SkColorGetA(colorsPM[kTopLeft_Corner ])),
262 SkScalar(SkColorGetA(colorsPM[kTopRight_Corne r])), 262 SkScalar(SkColorGetA(colorsPM[kTopRight_Corne r])),
263 SkScalar(SkColorGetA(colorsPM[kBottomLeft_Cor ner])), 263 SkScalar(SkColorGetA(colorsPM[kBottomLeft_Cor ner])),
264 SkScalar(SkColorGetA(colorsPM[kBottomRight_Co rner])))); 264 SkScalar(SkColorGetA(colorsPM[kBottomRight_Co rner]))));
265 uint8_t r = uint8_t(bilerp(u, v, 265 uint8_t r = uint8_t(bilerp(u, v,
266 SkScalar(SkColorGetR(colorsPM[kTopLeft_Corner ])), 266 SkScalar(SkColorGetR(colorsPM[kTopLeft_Corner ])),
267 SkScalar(SkColorGetR(colorsPM[kTopRight_Corne r])), 267 SkScalar(SkColorGetR(colorsPM[kTopRight_Corne r])),
268 SkScalar(SkColorGetR(colorsPM[kBottomLeft_Cor ner])), 268 SkScalar(SkColorGetR(colorsPM[kBottomLeft_Cor ner])),
269 SkScalar(SkColorGetR(colorsPM[kBottomRight_Co rner])))); 269 SkScalar(SkColorGetR(colorsPM[kBottomRight_Co rner]))));
270 uint8_t g = uint8_t(bilerp(u, v, 270 uint8_t g = uint8_t(bilerp(u, v,
271 SkScalar(SkColorGetG(colorsPM[kTopLeft_Corner ])), 271 SkScalar(SkColorGetG(colorsPM[kTopLeft_Corner ])),
272 SkScalar(SkColorGetG(colorsPM[kTopRight_Corne r])), 272 SkScalar(SkColorGetG(colorsPM[kTopRight_Corne r])),
273 SkScalar(SkColorGetG(colorsPM[kBottomLeft_Cor ner])), 273 SkScalar(SkColorGetG(colorsPM[kBottomLeft_Cor ner])),
274 SkScalar(SkColorGetG(colorsPM[kBottomRight_Co rner])))); 274 SkScalar(SkColorGetG(colorsPM[kBottomRight_Co rner]))));
275 uint8_t b = uint8_t(bilerp(u, v, 275 uint8_t b = uint8_t(bilerp(u, v,
276 SkScalar(SkColorGetB(colorsPM[kTopLeft_Corner ])), 276 SkScalar(SkColorGetB(colorsPM[kTopLeft_Corner ])),
277 SkScalar(SkColorGetB(colorsPM[kTopRight_Corne r])), 277 SkScalar(SkColorGetB(colorsPM[kTopRight_Corne r])),
278 SkScalar(SkColorGetB(colorsPM[kBottomLeft_Cor ner])), 278 SkScalar(SkColorGetB(colorsPM[kBottomLeft_Cor ner])),
279 SkScalar(SkColorGetB(colorsPM[kBottomRight_Co rner])))); 279 SkScalar(SkColorGetB(colorsPM[kBottomRight_Co rner]))));
280 data->fColors[dataIndex] = SkPackARGB32(a,r,g,b); 280 data->fColors[dataIndex] = SkPackARGB32(a,r,g,b);
281 } 281 }
282 282
283 if (texCoords) { 283 if (texCoords) {
284 data->fTexCoords[dataIndex] = SkPoint::Make( 284 data->fTexCoords[dataIndex] = SkPoint::Make(
285 bilerp(u, v, texCoords[kTopLeft_Corn er].x(), 285 bilerp(u, v, texCoords[kTopLeft_Corn er].x(),
286 texCoords[kTopRight_Corner].x (), 286 texCoords[kTopRight_Corner].x (),
287 texCoords[kBottomLeft_Corner] .x(), 287 texCoords[kBottomLeft_Corner] .x(),
288 texCoords[kBottomRight_Corner ].x()), 288 texCoords[kBottomRight_Corner ].x()),
289 bilerp(u, v, texCoords[kTopLeft_Corn er].y(), 289 bilerp(u, v, texCoords[kTopLeft_Corn er].y(),
290 texCoords[kTopRight_Corner].y (), 290 texCoords[kTopRight_Corner].y (),
291 texCoords[kBottomLeft_Corner] .y(), 291 texCoords[kBottomLeft_Corner] .y(),
292 texCoords[kBottomRight_Corner ].y())); 292 texCoords[kBottomRight_Corner ].y()));
293 293
294 } 294 }
295 295
296 if(x < lodX && y < lodY) { 296 if(x < lodX && y < lodY) {
297 int i = 6 * (x * lodY + y); 297 int i = 6 * (x * lodY + y);
298 data->fIndices[i] = x * stride + y; 298 data->fIndices[i] = x * stride + y;
299 data->fIndices[i + 1] = x * stride + 1 + y; 299 data->fIndices[i + 1] = x * stride + 1 + y;
300 data->fIndices[i + 2] = (x + 1) * stride + 1 + y; 300 data->fIndices[i + 2] = (x + 1) * stride + 1 + y;
301 data->fIndices[i + 3] = data->fIndices[i]; 301 data->fIndices[i + 3] = data->fIndices[i];
302 data->fIndices[i + 4] = data->fIndices[i + 2]; 302 data->fIndices[i + 4] = data->fIndices[i + 2];
303 data->fIndices[i + 5] = (x + 1) * stride + y; 303 data->fIndices[i + 5] = (x + 1) * stride + y;
304 } 304 }
305 v = SkScalarClampMax(v + 1.f / lodY, 1); 305 v = SkScalarClampMax(v + 1.f / lodY, 1);
306 } 306 }
307 u = SkScalarClampMax(u + 1.f / lodX, 1); 307 u = SkScalarClampMax(u + 1.f / lodX, 1);
308 } 308 }
309 return true; 309 return true;
310 310
311 } 311 }
OLDNEW
« no previous file with comments | « src/utils/SkPatchUtils.h ('k') | src/utils/SkTextBox.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698