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

Side by Side Diff: src/gpu/GrAARectRenderer.cpp

Issue 683483004: aa rect renderer takes a gpu on construction (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: feedback inc Created 6 years, 1 month 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/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.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 2012 Google Inc. 2 * Copyright 2012 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 "GrAARectRenderer.h" 8 #include "GrAARectRenderer.h"
9 #include "GrGpu.h" 9 #include "GrGpu.h"
10 #include "gl/builders/GrGLProgramBuilder.h" 10 #include "gl/builders/GrGLProgramBuilder.h"
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, 384 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16,
385 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, 385 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16,
386 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, 386 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16,
387 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, 387 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16,
388 }; 388 };
389 389
390 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI dx); 390 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI dx);
391 static const int kVertsPerBevelStrokeRect = 24; 391 static const int kVertsPerBevelStrokeRect = 24;
392 static const int kNumBevelStrokeRectsInIndexBuffer = 256; 392 static const int kNumBevelStrokeRectsInIndexBuffer = 256;
393 393
394 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { 394 static int aa_stroke_rect_index_count(bool miterStroke) {
395 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : 395 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) :
396 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); 396 SK_ARRAY_COUNT(gBevelStrokeAARectIdx);
397 } 397 }
398 398
399 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS troke) { 399 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(bool miterStroke) {
400 if (miterStroke) { 400 if (miterStroke) {
401 if (NULL == fAAMiterStrokeRectIndexBuffer) { 401 if (NULL == fAAMiterStrokeRectIndexBuffer) {
402 fAAMiterStrokeRectIndexBuffer = 402 fAAMiterStrokeRectIndexBuffer =
403 gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, 403 fGpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx,
404 kIndicesPerMiterStrokeRect, 404 kIndicesPerMiterStrokeRect,
405 kNumMiterStrokeRectsInIndexB uffer, 405 kNumMiterStrokeRectsInIndex Buffer,
406 kVertsPerMiterStrokeRect); 406 kVertsPerMiterStrokeRect);
407 } 407 }
408 return fAAMiterStrokeRectIndexBuffer; 408 return fAAMiterStrokeRectIndexBuffer;
409 } else { 409 } else {
410 if (NULL == fAABevelStrokeRectIndexBuffer) { 410 if (NULL == fAABevelStrokeRectIndexBuffer) {
411 fAABevelStrokeRectIndexBuffer = 411 fAABevelStrokeRectIndexBuffer =
412 gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, 412 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
413 kIndicesPerBevelStrokeRect, 413 kIndicesPerBevelStrokeRect,
414 kNumBevelStrokeRectsInIndexB uffer, 414 kNumBevelStrokeRectsInIndex Buffer,
415 kVertsPerBevelStrokeRect); 415 kVertsPerBevelStrokeRect);
416 } 416 }
417 return fAABevelStrokeRectIndexBuffer; 417 return fAABevelStrokeRectIndexBuffer;
418 } 418 }
419 } 419 }
420 420
421 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, 421 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target,
422 GrDrawTarget* target,
423 const SkRect& rect, 422 const SkRect& rect,
424 const SkMatrix& combinedMatrix, 423 const SkMatrix& combinedMatrix,
425 const SkRect& devRect) { 424 const SkRect& devRect) {
426 GrDrawState* drawState = target->drawState(); 425 GrDrawState* drawState = target->drawState();
427 426
428 GrColor color = drawState->getColor(); 427 GrColor color = drawState->getColor();
429 428
430 CoverageAttribType covAttribType = set_rect_attribs(drawState); 429 CoverageAttribType covAttribType = set_rect_attribs(drawState);
431 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 430 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
432 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 431 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
433 } 432 }
434 433
435 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); 434 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0);
436 if (!geo.succeeded()) { 435 if (!geo.succeeded()) {
437 GrPrintf("Failed to get space for vertices!\n"); 436 GrPrintf("Failed to get space for vertices!\n");
438 return; 437 return;
439 } 438 }
440 439
441 if (NULL == fAAFillRectIndexBuffer) { 440 if (NULL == fAAFillRectIndexBuffer) {
442 fAAFillRectIndexBuffer = gpu->createInstancedIndexBuffer(gFillAARectIdx, 441 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx ,
443 kIndicesPerAAFi llRect, 442 kIndicesPerAAF illRect,
444 kNumAAFillRects InIndexBuffer, 443 kNumAAFillRect sInIndexBuffer,
445 kVertsPerAAFill Rect); 444 kVertsPerAAFil lRect);
446 } 445 }
447 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer; 446 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer;
448 if (NULL == indexBuffer) { 447 if (NULL == indexBuffer) {
449 GrPrintf("Failed to create index buffer!\n"); 448 GrPrintf("Failed to create index buffer!\n");
450 return; 449 return;
451 } 450 }
452 451
453 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); 452 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices());
454 size_t vstride = drawState->getVertexStride(); 453 size_t vstride = drawState->getVertexStride();
455 454
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 }; 574 };
576 575
577 // Axis Aligned 576 // Axis Aligned
578 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { 577 extern const GrVertexAttrib gAAAARectVertexAttribs[] = {
579 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing }, 578 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind ing },
580 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexA ttribBinding }, 579 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexA ttribBinding },
581 }; 580 };
582 581
583 }; 582 };
584 583
585 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu, 584 void GrAARectRenderer::shaderFillAARect(GrDrawTarget* target,
586 GrDrawTarget* target,
587 const SkRect& rect, 585 const SkRect& rect,
588 const SkMatrix& combinedMatrix) { 586 const SkMatrix& combinedMatrix) {
589 GrDrawState* drawState = target->drawState(); 587 GrDrawState* drawState = target->drawState();
590 588
591 SkPoint center = SkPoint::Make(rect.centerX(), rect.centerY()); 589 SkPoint center = SkPoint::Make(rect.centerX(), rect.centerY());
592 combinedMatrix.mapPoints(&center, 1); 590 combinedMatrix.mapPoints(&center, 1);
593 591
594 // compute transformed (0, 1) vector 592 // compute transformed (0, 1) vector
595 SkVector dir = { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix: :kMScaleY] }; 593 SkVector dir = { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix: :kMScaleY] };
596 dir.normalize(); 594 dir.normalize();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 devRect.fTop - SK_ScalarHalf, 630 devRect.fTop - SK_ScalarHalf,
633 devRect.fRight + SK_ScalarHalf, 631 devRect.fRight + SK_ScalarHalf,
634 devRect.fBottom + SK_ScalarHalf 632 devRect.fBottom + SK_ScalarHalf
635 }; 633 };
636 634
637 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); 635 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop);
638 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); 636 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom);
639 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); 637 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom);
640 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); 638 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop);
641 639
642 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); 640 target->setIndexSourceToBuffer(fGpu->getContext()->getQuadIndexBuffer());
643 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); 641 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6);
644 target->resetIndexSource(); 642 target->resetIndexSource();
645 } 643 }
646 644
647 void GrAARectRenderer::shaderFillAlignedAARect(GrGpu* gpu, 645 void GrAARectRenderer::shaderFillAlignedAARect(GrDrawTarget* target,
648 GrDrawTarget* target,
649 const SkRect& rect, 646 const SkRect& rect,
650 const SkMatrix& combinedMatrix) { 647 const SkMatrix& combinedMatrix) {
651 GrDrawState* drawState = target->drawState(); 648 GrDrawState* drawState = target->drawState();
652 SkASSERT(combinedMatrix.rectStaysRect()); 649 SkASSERT(combinedMatrix.rectStaysRect());
653 650
654 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect VertexAttribs), 651 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect VertexAttribs),
655 sizeof(AARectVertex)); 652 sizeof(AARectVertex));
656 653
657 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); 654 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
658 if (!geo.succeeded()) { 655 if (!geo.succeeded()) {
(...skipping 30 matching lines...) Expand all
689 verts[1].fWidthHeight = widthHeight; 686 verts[1].fWidthHeight = widthHeight;
690 687
691 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); 688 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom);
692 verts[2].fOffset = widthHeight; 689 verts[2].fOffset = widthHeight;
693 verts[2].fWidthHeight = widthHeight; 690 verts[2].fWidthHeight = widthHeight;
694 691
695 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); 692 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop);
696 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY); 693 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY);
697 verts[3].fWidthHeight = widthHeight; 694 verts[3].fWidthHeight = widthHeight;
698 695
699 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); 696 target->setIndexSourceToBuffer(fGpu->getContext()->getQuadIndexBuffer());
700 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); 697 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6);
701 target->resetIndexSource(); 698 target->resetIndexSource();
702 } 699 }
703 700
704 void GrAARectRenderer::strokeAARect(GrGpu* gpu, 701 void GrAARectRenderer::strokeAARect(GrDrawTarget* target,
705 GrDrawTarget* target,
706 const SkRect& rect, 702 const SkRect& rect,
707 const SkMatrix& combinedMatrix, 703 const SkMatrix& combinedMatrix,
708 const SkRect& devRect, 704 const SkRect& devRect,
709 const SkStrokeRec& stroke) { 705 const SkStrokeRec& stroke) {
710 SkVector devStrokeSize; 706 SkVector devStrokeSize;
711 SkScalar width = stroke.getWidth(); 707 SkScalar width = stroke.getWidth();
712 if (width > 0) { 708 if (width > 0) {
713 devStrokeSize.set(width, width); 709 devStrokeSize.set(width, width);
714 combinedMatrix.mapVectors(&devStrokeSize, 1); 710 combinedMatrix.mapVectors(&devStrokeSize, 1);
715 devStrokeSize.setAbs(devStrokeSize); 711 devStrokeSize.setAbs(devStrokeSize);
(...skipping 26 matching lines...) Expand all
742 738
743 bool miterStroke = true; 739 bool miterStroke = true;
744 // For hairlines, make bevel and round joins appear the same as mitered ones . 740 // For hairlines, make bevel and round joins appear the same as mitered ones .
745 // small miter limit means right angles show bevel... 741 // small miter limit means right angles show bevel...
746 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || 742 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join ||
747 stroke.getMiter() < SK_ScalarSqrt2)) { 743 stroke.getMiter() < SK_ScalarSqrt2)) {
748 miterStroke = false; 744 miterStroke = false;
749 } 745 }
750 746
751 if (spare <= 0 && miterStroke) { 747 if (spare <= 0 && miterStroke) {
752 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); 748 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside);
753 return; 749 return;
754 } 750 }
755 751
756 SkRect devInside(devRect); 752 SkRect devInside(devRect);
757 devInside.inset(rx, ry); 753 devInside.inset(rx, ry);
758 754
759 SkRect devOutsideAssist(devRect); 755 SkRect devOutsideAssist(devRect);
760 756
761 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) 757 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
762 // to draw the outer of the rect. Because there are 8 vertices on the outer 758 // to draw the outer of the rect. Because there are 8 vertices on the outer
763 // edge, while vertex number of inner edge is 4, the same as miter-stroke. 759 // edge, while vertex number of inner edge is 4, the same as miter-stroke.
764 if (!miterStroke) { 760 if (!miterStroke) {
765 devOutside.inset(0, ry); 761 devOutside.inset(0, ry);
766 devOutsideAssist.outset(0, ry); 762 devOutsideAssist.outset(0, ry);
767 } 763 }
768 764
769 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns ide, miterStroke); 765 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, miterStroke);
770 } 766 }
771 767
772 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, 768 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
773 GrDrawTarget* target,
774 const SkRect& devOutside, 769 const SkRect& devOutside,
775 const SkRect& devOutsideAssist, 770 const SkRect& devOutsideAssist,
776 const SkRect& devInside, 771 const SkRect& devInside,
777 bool miterStroke) { 772 bool miterStroke) {
778 GrDrawState* drawState = target->drawState(); 773 GrDrawState* drawState = target->drawState();
779 774
780 CoverageAttribType covAttribType = set_rect_attribs(drawState); 775 CoverageAttribType covAttribType = set_rect_attribs(drawState);
781 776
782 GrColor color = drawState->getColor(); 777 GrColor color = drawState->getColor();
783 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 778 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
784 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 779 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
785 } 780 }
786 781
787 int innerVertexNum = 4; 782 int innerVertexNum = 4;
788 int outerVertexNum = miterStroke ? 4 : 8; 783 int outerVertexNum = miterStroke ? 4 : 8;
789 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; 784 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2;
790 785
791 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); 786 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0);
792 if (!geo.succeeded()) { 787 if (!geo.succeeded()) {
793 GrPrintf("Failed to get space for vertices!\n"); 788 GrPrintf("Failed to get space for vertices!\n");
794 return; 789 return;
795 } 790 }
796 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; 791 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke);
797 if (NULL == indexBuffer) { 792 if (NULL == indexBuffer) {
798 GrPrintf("Failed to create index buffer!\n"); 793 GrPrintf("Failed to create index buffer!\n");
799 return; 794 return;
800 } 795 }
801 796
802 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); 797 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices());
803 size_t vstride = drawState->getVertexStride(); 798 size_t vstride = drawState->getVertexStride();
804 799
805 // We create vertices for four nested rectangles. There are two ramps from 0 to full 800 // We create vertices for four nested rectangles. There are two ramps from 0 to full
806 // coverage, one on the exterior of the stroke and the other on the interior . 801 // coverage, one on the exterior of the stroke and the other on the interior .
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 if (kUseCoverage_CoverageAttribType == covAttribType) { 888 if (kUseCoverage_CoverageAttribType == covAttribType) {
894 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; 889 *reinterpret_cast<GrColor*>(verts + i * vstride) = color;
895 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0; 890 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0;
896 } else { 891 } else {
897 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; 892 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0;
898 } 893 }
899 } 894 }
900 895
901 target->setIndexSourceToBuffer(indexBuffer); 896 target->setIndexSourceToBuffer(indexBuffer);
902 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 897 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1,
903 totalVertexNum, aaStrokeRectIndexCount(miterStr oke)); 898 totalVertexNum, aa_stroke_rect_index_count(mite rStroke));
904 target->resetIndexSource(); 899 target->resetIndexSource();
905 } 900 }
906 901
907 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, 902 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target,
908 GrDrawTarget* target,
909 const SkRect rects[2], 903 const SkRect rects[2],
910 const SkMatrix& combinedMatrix) { 904 const SkMatrix& combinedMatrix) {
911 SkASSERT(combinedMatrix.rectStaysRect()); 905 SkASSERT(combinedMatrix.rectStaysRect());
912 SkASSERT(!rects[1].isEmpty()); 906 SkASSERT(!rects[1].isEmpty());
913 907
914 SkRect devOutside, devOutsideAssist, devInside; 908 SkRect devOutside, devOutsideAssist, devInside;
915 combinedMatrix.mapRect(&devOutside, rects[0]); 909 combinedMatrix.mapRect(&devOutside, rects[0]);
916 // can't call mapRect for devInside since it calls sort 910 // can't call mapRect for devInside since it calls sort
917 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; 911 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ;
918 912
919 if (devInside.isEmpty()) { 913 if (devInside.isEmpty()) {
920 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); 914 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside);
921 return; 915 return;
922 } 916 }
923 917
924 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns ide, true); 918 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, true);
925 } 919 }
OLDNEW
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698