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

Side by Side Diff: gm/beziereffects.cpp

Issue 2041113004: sk_sp for gpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Reserve correctly. Created 4 years, 6 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 | « experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp ('k') | gm/bigrrectaaeffect.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 2013 Google Inc. 2 * Copyright 2013 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 // This test only works with the GPU backend. 8 // This test only works with the GPU backend.
9 9
10 #include "gm.h" 10 #include "gm.h"
(...skipping 16 matching lines...) Expand all
27 } 27 }
28 28
29 namespace skiagm { 29 namespace skiagm {
30 30
31 class BezierCubicOrConicTestBatch : public GrTestBatch { 31 class BezierCubicOrConicTestBatch : public GrTestBatch {
32 public: 32 public:
33 DEFINE_BATCH_CLASS_ID 33 DEFINE_BATCH_CLASS_ID
34 34
35 const char* name() const override { return "BezierCubicOrConicTestBatch"; } 35 const char* name() const override { return "BezierCubicOrConicTestBatch"; }
36 36
37 BezierCubicOrConicTestBatch(const GrGeometryProcessor* gp, const SkRect& bou nds, 37 BezierCubicOrConicTestBatch(sk_sp<GrGeometryProcessor> gp, const SkRect& bou nds,
38 GrColor color, const SkScalar klmEqs[9], SkScala r sign) 38 GrColor color, const SkScalar klmEqs[9], SkScala r sign)
39 : INHERITED(ClassID(), bounds, color) 39 : INHERITED(ClassID(), bounds, color)
40 , fGeometryProcessor(SkRef(gp)) { 40 , fGeometryProcessor(std::move(gp)) {
41 for (int i = 0; i < 9; i++) { 41 for (int i = 0; i < 9; i++) {
42 fKlmEqs[i] = klmEqs[i]; 42 fKlmEqs[i] = klmEqs[i];
43 } 43 }
44 fSign = sign; 44 fSign = sign;
45 } 45 }
46 46
47 private: 47 private:
48 48
49 struct Vertex { 49 struct Vertex {
50 SkPoint fPosition; 50 SkPoint fPosition;
51 float fKLM[4]; // The last value is ignored. The effect expects a vec4 f. 51 float fKLM[4]; // The last value is ignored. The effect expects a vec4 f.
52 }; 52 };
53 53
54 void onPrepareDraws(Target* target) const override { 54 void onPrepareDraws(Target* target) const override {
55 QuadHelper helper; 55 QuadHelper helper;
56 size_t vertexStride = fGeometryProcessor->getVertexStride(); 56 size_t vertexStride = fGeometryProcessor->getVertexStride();
57 SkASSERT(vertexStride == sizeof(Vertex)); 57 SkASSERT(vertexStride == sizeof(Vertex));
58 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri de, 1)); 58 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri de, 1));
59 if (!verts) { 59 if (!verts) {
60 return; 60 return;
61 } 61 }
62 const SkRect& bounds = this->bounds(); 62 const SkRect& bounds = this->bounds();
63 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, 63 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom,
64 sizeof(Vertex)); 64 sizeof(Vertex));
65 for (int v = 0; v < 4; ++v) { 65 for (int v = 0; v < 4; ++v) {
66 verts[v].fKLM[0] = eval_line(verts[v].fPosition, fKlmEqs + 0, fSign) ; 66 verts[v].fKLM[0] = eval_line(verts[v].fPosition, fKlmEqs + 0, fSign) ;
67 verts[v].fKLM[1] = eval_line(verts[v].fPosition, fKlmEqs + 3, fSign) ; 67 verts[v].fKLM[1] = eval_line(verts[v].fPosition, fKlmEqs + 3, fSign) ;
68 verts[v].fKLM[2] = eval_line(verts[v].fPosition, fKlmEqs + 6, 1.f); 68 verts[v].fKLM[2] = eval_line(verts[v].fPosition, fKlmEqs + 6, 1.f);
69 } 69 }
70 helper.recordDraw(target, fGeometryProcessor); 70 helper.recordDraw(target, fGeometryProcessor.get());
71 } 71 }
72 72
73 SkScalar fKlmEqs[9]; 73 SkScalar fKlmEqs[9];
74 SkScalar fSign; 74 SkScalar fSign;
75 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; 75 sk_sp<GrGeometryProcessor> fGeometryProcessor;
76 76
77 static const int kVertsPerCubic = 4; 77 static const int kVertsPerCubic = 4;
78 static const int kIndicesPerCubic = 6; 78 static const int kIndicesPerCubic = 6;
79 79
80 typedef GrTestBatch INHERITED; 80 typedef GrTestBatch INHERITED;
81 }; 81 };
82 82
83 /** 83 /**
84 * This GM directly exercises effects that draw Bezier curves in the GPU backend . 84 * This GM directly exercises effects that draw Bezier curves in the GPU backend .
85 */ 85 */
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 static const GrColor color = 0xff000000; 128 static const GrColor color = 0xff000000;
129 129
130 for (int i = 0; i < kNumCubics; ++i) { 130 for (int i = 0; i < kNumCubics; ++i) {
131 SkPoint baseControlPts[] = { 131 SkPoint baseControlPts[] = {
132 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 132 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
133 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 133 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
134 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 134 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
135 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)} 135 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}
136 }; 136 };
137 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) { 137 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) {
138 SkAutoTUnref<GrGeometryProcessor> gp; 138 sk_sp<GrGeometryProcessor> gp;
139 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType; 139 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType;
140 gp.reset(GrCubicEffect::Create(color, SkMatrix::I(), et, 140 gp = GrCubicEffect::Make(color, SkMatrix::I(), et, *context->cap s());
141 *context->caps()));
142 if (!gp) { 141 if (!gp) {
143 continue; 142 continue;
144 } 143 }
145 SkScalar x = SkScalarMul(col, w); 144 SkScalar x = SkScalarMul(col, w);
146 SkScalar y = SkScalarMul(row, h); 145 SkScalar y = SkScalarMul(row, h);
147 SkPoint controlPts[] = { 146 SkPoint controlPts[] = {
148 {x + baseControlPts[0].fX, y + baseControlPts[0].fY}, 147 {x + baseControlPts[0].fX, y + baseControlPts[0].fY},
149 {x + baseControlPts[1].fX, y + baseControlPts[1].fY}, 148 {x + baseControlPts[1].fX, y + baseControlPts[1].fY},
150 {x + baseControlPts[2].fX, y + baseControlPts[2].fY}, 149 {x + baseControlPts[2].fX, y + baseControlPts[2].fY},
151 {x + baseControlPts[3].fX, y + baseControlPts[3].fY} 150 {x + baseControlPts[3].fX, y + baseControlPts[3].fY}
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 bounds.set(pts, 4); 183 bounds.set(pts, 4);
185 184
186 SkPaint boundsPaint; 185 SkPaint boundsPaint;
187 boundsPaint.setColor(0xff808080); 186 boundsPaint.setColor(0xff808080);
188 boundsPaint.setStrokeWidth(0); 187 boundsPaint.setStrokeWidth(0);
189 boundsPaint.setStyle(SkPaint::kStroke_Style); 188 boundsPaint.setStyle(SkPaint::kStroke_Style);
190 canvas->drawRect(bounds, boundsPaint); 189 canvas->drawRect(bounds, boundsPaint);
191 190
192 GrPipelineBuilder pipelineBuilder; 191 GrPipelineBuilder pipelineBuilder;
193 pipelineBuilder.setXPFactory( 192 pipelineBuilder.setXPFactory(
194 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u nref(); 193 GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
195 194
196 SkAutoTUnref<GrDrawBatch> batch( 195 SkAutoTUnref<GrDrawBatch> batch(
197 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq s, klmSigns[c])); 196 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq s, klmSigns[c]));
198 197
199 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch); 198 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch);
200 } 199 }
201 ++col; 200 ++col;
202 if (numCols == col) { 201 if (numCols == col) {
203 col = 0; 202 col = 0;
204 ++row; 203 ++row;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 static const GrColor color = 0xff000000; 261 static const GrColor color = 0xff000000;
263 262
264 for (int i = 0; i < kNumConics; ++i) { 263 for (int i = 0; i < kNumConics; ++i) {
265 SkPoint baseControlPts[] = { 264 SkPoint baseControlPts[] = {
266 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 265 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
267 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 266 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
268 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)} 267 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}
269 }; 268 };
270 SkScalar weight = rand.nextRangeF(0.f, 2.f); 269 SkScalar weight = rand.nextRangeF(0.f, 2.f);
271 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) { 270 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) {
272 SkAutoTUnref<GrGeometryProcessor> gp; 271 sk_sp<GrGeometryProcessor> gp;
273 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType; 272 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType;
274 gp.reset(GrConicEffect::Create(color, SkMatrix::I(), et, 273 gp = GrConicEffect::Make(color, SkMatrix::I(), et,
275 *context->caps(), SkMatrix::I(), false)); 274 *context->caps(), SkMatrix::I(), false) ;
276 if (!gp) { 275 if (!gp) {
277 continue; 276 continue;
278 } 277 }
279 278
280 SkScalar x = SkScalarMul(col, w); 279 SkScalar x = SkScalarMul(col, w);
281 SkScalar y = SkScalarMul(row, h); 280 SkScalar y = SkScalarMul(row, h);
282 SkPoint controlPts[] = { 281 SkPoint controlPts[] = {
283 {x + baseControlPts[0].fX, y + baseControlPts[0].fY}, 282 {x + baseControlPts[0].fX, y + baseControlPts[0].fY},
284 {x + baseControlPts[1].fX, y + baseControlPts[1].fY}, 283 {x + baseControlPts[1].fX, y + baseControlPts[1].fY},
285 {x + baseControlPts[2].fX, y + baseControlPts[2].fY} 284 {x + baseControlPts[2].fX, y + baseControlPts[2].fY}
(...skipping 30 matching lines...) Expand all
316 bounds.set(pts, 3); 315 bounds.set(pts, 3);
317 316
318 SkPaint boundsPaint; 317 SkPaint boundsPaint;
319 boundsPaint.setColor(0xff808080); 318 boundsPaint.setColor(0xff808080);
320 boundsPaint.setStrokeWidth(0); 319 boundsPaint.setStrokeWidth(0);
321 boundsPaint.setStyle(SkPaint::kStroke_Style); 320 boundsPaint.setStyle(SkPaint::kStroke_Style);
322 canvas->drawRect(bounds, boundsPaint); 321 canvas->drawRect(bounds, boundsPaint);
323 322
324 GrPipelineBuilder pipelineBuilder; 323 GrPipelineBuilder pipelineBuilder;
325 pipelineBuilder.setXPFactory( 324 pipelineBuilder.setXPFactory(
326 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u nref(); 325 GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
327 326
328 SkAutoTUnref<GrDrawBatch> batch( 327 SkAutoTUnref<GrDrawBatch> batch(
329 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq s, 1.f)); 328 new BezierCubicOrConicTestBatch(gp, bounds, color, klmEq s, 1.f));
330 329
331 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch); 330 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch);
332 } 331 }
333 ++col; 332 ++col;
334 if (numCols == col) { 333 if (numCols == col) {
335 col = 0; 334 col = 0;
336 ++row; 335 ++row;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 typedef GM INHERITED; 379 typedef GM INHERITED;
381 }; 380 };
382 381
383 ////////////////////////////////////////////////////////////////////////////// 382 //////////////////////////////////////////////////////////////////////////////
384 383
385 class BezierQuadTestBatch : public GrTestBatch { 384 class BezierQuadTestBatch : public GrTestBatch {
386 public: 385 public:
387 DEFINE_BATCH_CLASS_ID 386 DEFINE_BATCH_CLASS_ID
388 const char* name() const override { return "BezierQuadTestBatch"; } 387 const char* name() const override { return "BezierQuadTestBatch"; }
389 388
390 BezierQuadTestBatch(const GrGeometryProcessor* gp, const SkRect& bounds, GrC olor color, 389 BezierQuadTestBatch(sk_sp<GrGeometryProcessor> gp, const SkRect& bounds, GrC olor color,
391 const GrPathUtils::QuadUVMatrix& devToUV) 390 const GrPathUtils::QuadUVMatrix& devToUV)
392 : INHERITED(ClassID(), bounds, color) 391 : INHERITED(ClassID(), bounds, color)
393 , fDevToUV(devToUV) 392 , fDevToUV(devToUV)
394 , fGeometryProcessor(SkRef(gp)) { 393 , fGeometryProcessor(std::move(gp)) {
395 } 394 }
396 395
397 private: 396 private:
398 397
399 struct Vertex { 398 struct Vertex {
400 SkPoint fPosition; 399 SkPoint fPosition;
401 float fKLM[4]; // The last value is ignored. The effect expects a vec4 f. 400 float fKLM[4]; // The last value is ignored. The effect expects a vec4 f.
402 }; 401 };
403 402
404 void onPrepareDraws(Target* target) const override { 403 void onPrepareDraws(Target* target) const override {
405 QuadHelper helper; 404 QuadHelper helper;
406 size_t vertexStride = fGeometryProcessor->getVertexStride(); 405 size_t vertexStride = fGeometryProcessor->getVertexStride();
407 SkASSERT(vertexStride == sizeof(Vertex)); 406 SkASSERT(vertexStride == sizeof(Vertex));
408 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri de, 1)); 407 Vertex* verts = reinterpret_cast<Vertex*>(helper.init(target, vertexStri de, 1));
409 if (!verts) { 408 if (!verts) {
410 return; 409 return;
411 } 410 }
412 const SkRect& bounds = this->bounds(); 411 const SkRect& bounds = this->bounds();
413 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, 412 verts[0].fPosition.setRectFan(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom,
414 sizeof(Vertex)); 413 sizeof(Vertex));
415 fDevToUV.apply<4, sizeof(Vertex), sizeof(SkPoint)>(verts); 414 fDevToUV.apply<4, sizeof(Vertex), sizeof(SkPoint)>(verts);
416 helper.recordDraw(target, fGeometryProcessor); 415 helper.recordDraw(target, fGeometryProcessor.get());
417 } 416 }
418 417
419 GrPathUtils::QuadUVMatrix fDevToUV; 418 GrPathUtils::QuadUVMatrix fDevToUV;
420 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; 419 sk_sp<GrGeometryProcessor> fGeometryProcessor;
421 420
422 static const int kVertsPerCubic = 4; 421 static const int kVertsPerCubic = 4;
423 static const int kIndicesPerCubic = 6; 422 static const int kIndicesPerCubic = 6;
424 423
425 typedef GrTestBatch INHERITED; 424 typedef GrTestBatch INHERITED;
426 }; 425 };
427 426
428 /** 427 /**
429 * This GM directly exercises effects that draw Bezier quad curves in the GPU ba ckend. 428 * This GM directly exercises effects that draw Bezier quad curves in the GPU ba ckend.
430 */ 429 */
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 int col = 0; 471 int col = 0;
473 static const GrColor color = 0xff000000; 472 static const GrColor color = 0xff000000;
474 473
475 for (int i = 0; i < kNumQuads; ++i) { 474 for (int i = 0; i < kNumQuads; ++i) {
476 SkPoint baseControlPts[] = { 475 SkPoint baseControlPts[] = {
477 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 476 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
478 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}, 477 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)},
479 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)} 478 {rand.nextRangeF(0.f, w), rand.nextRangeF(0.f, h)}
480 }; 479 };
481 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) { 480 for(int edgeType = 0; edgeType < kGrProcessorEdgeTypeCnt; ++edgeType ) {
482 SkAutoTUnref<GrGeometryProcessor> gp; 481 sk_sp<GrGeometryProcessor> gp;
483 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType; 482 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)edgeType;
484 gp.reset(GrQuadEffect::Create(color, SkMatrix::I(), et, 483 gp = GrQuadEffect::Make(color, SkMatrix::I(), et,
485 *context->caps(), SkMatrix::I(), f alse)); 484 *context->caps(), SkMatrix::I(), false);
486 if (!gp) { 485 if (!gp) {
487 continue; 486 continue;
488 } 487 }
489 488
490 SkScalar x = SkScalarMul(col, w); 489 SkScalar x = SkScalarMul(col, w);
491 SkScalar y = SkScalarMul(row, h); 490 SkScalar y = SkScalarMul(row, h);
492 SkPoint controlPts[] = { 491 SkPoint controlPts[] = {
493 {x + baseControlPts[0].fX, y + baseControlPts[0].fY}, 492 {x + baseControlPts[0].fX, y + baseControlPts[0].fY},
494 {x + baseControlPts[1].fX, y + baseControlPts[1].fY}, 493 {x + baseControlPts[1].fX, y + baseControlPts[1].fY},
495 {x + baseControlPts[2].fX, y + baseControlPts[2].fY} 494 {x + baseControlPts[2].fX, y + baseControlPts[2].fY}
(...skipping 27 matching lines...) Expand all
523 bounds.set(pts, 3); 522 bounds.set(pts, 3);
524 523
525 SkPaint boundsPaint; 524 SkPaint boundsPaint;
526 boundsPaint.setColor(0xff808080); 525 boundsPaint.setColor(0xff808080);
527 boundsPaint.setStrokeWidth(0); 526 boundsPaint.setStrokeWidth(0);
528 boundsPaint.setStyle(SkPaint::kStroke_Style); 527 boundsPaint.setStyle(SkPaint::kStroke_Style);
529 canvas->drawRect(bounds, boundsPaint); 528 canvas->drawRect(bounds, boundsPaint);
530 529
531 GrPipelineBuilder pipelineBuilder; 530 GrPipelineBuilder pipelineBuilder;
532 pipelineBuilder.setXPFactory( 531 pipelineBuilder.setXPFactory(
533 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->u nref(); 532 GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
534 533
535 GrPathUtils::QuadUVMatrix DevToUV(pts); 534 GrPathUtils::QuadUVMatrix DevToUV(pts);
536 535
537 SkAutoTUnref<GrDrawBatch> batch( 536 SkAutoTUnref<GrDrawBatch> batch(
538 new BezierQuadTestBatch(gp, bounds, color, DevToUV)); 537 new BezierQuadTestBatch(gp, bounds, color, DevToUV));
539 538
540 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch); 539 drawContext->drawContextPriv().testingOnly_drawBatch(pipelin eBuilder, batch);
541 } 540 }
542 ++col; 541 ++col;
543 if (numCols == col) { 542 if (numCols == col) {
544 col = 0; 543 col = 0;
545 ++row; 544 ++row;
546 } 545 }
547 } 546 }
548 } 547 }
549 } 548 }
550 549
551 private: 550 private:
552 typedef GM INHERITED; 551 typedef GM INHERITED;
553 }; 552 };
554 553
555 DEF_GM(return new BezierCubicEffects;) 554 DEF_GM(return new BezierCubicEffects;)
556 DEF_GM(return new BezierConicEffects;) 555 DEF_GM(return new BezierConicEffects;)
557 DEF_GM(return new BezierQuadEffects;) 556 DEF_GM(return new BezierQuadEffects;)
558 } 557 }
559 558
560 #endif 559 #endif
OLDNEW
« no previous file with comments | « experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp ('k') | gm/bigrrectaaeffect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698