| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
| 9 | 9 |
| 10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 } | 389 } |
| 390 | 390 |
| 391 /////////////////////////////////////////////////////////////////////////////// | 391 /////////////////////////////////////////////////////////////////////////////// |
| 392 | 392 |
| 393 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 393 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
| 394 ASSERT_SINGLE_OWNER | 394 ASSERT_SINGLE_OWNER |
| 395 CHECK_SHOULD_DRAW(draw); | 395 CHECK_SHOULD_DRAW(draw); |
| 396 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPaint", fContext); | 396 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPaint", fContext); |
| 397 | 397 |
| 398 GrPaint grPaint; | 398 GrPaint grPaint; |
| 399 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 399 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 400 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 400 return; | 401 return; |
| 401 } | 402 } |
| 402 | 403 |
| 403 fDrawContext->drawPaint(fClip, grPaint, *draw.fMatrix); | 404 fDrawContext->drawPaint(fClip, grPaint, *draw.fMatrix); |
| 404 } | 405 } |
| 405 | 406 |
| 406 // must be in SkCanvas::PointMode order | 407 // must be in SkCanvas::PointMode order |
| 407 static const GrPrimitiveType gPointMode2PrimtiveType[] = { | 408 static const GrPrimitiveType gPointMode2PrimtiveType[] = { |
| 408 kPoints_GrPrimitiveType, | 409 kPoints_GrPrimitiveType, |
| 409 kLines_GrPrimitiveType, | 410 kLines_GrPrimitiveType, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 439 CHECK_SHOULD_DRAW(draw); | 440 CHECK_SHOULD_DRAW(draw); |
| 440 | 441 |
| 441 SkScalar width = paint.getStrokeWidth(); | 442 SkScalar width = paint.getStrokeWidth(); |
| 442 if (width < 0) { | 443 if (width < 0) { |
| 443 return; | 444 return; |
| 444 } | 445 } |
| 445 | 446 |
| 446 if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mod
e) { | 447 if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mod
e) { |
| 447 GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style); | 448 GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style); |
| 448 GrPaint grPaint; | 449 GrPaint grPaint; |
| 449 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint))
{ | 450 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 451 this->surfaceProps().allowSRGBInputs(), &grPaint))
{ |
| 450 return; | 452 return; |
| 451 } | 453 } |
| 452 SkPath path; | 454 SkPath path; |
| 453 path.setIsVolatile(true); | 455 path.setIsVolatile(true); |
| 454 path.moveTo(pts[0]); | 456 path.moveTo(pts[0]); |
| 455 path.lineTo(pts[1]); | 457 path.lineTo(pts[1]); |
| 456 fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); | 458 fDrawContext->drawPath(fClip, grPaint, *draw.fMatrix, path, strokeInfo); |
| 457 return; | 459 return; |
| 458 } | 460 } |
| 459 | 461 |
| 460 // we only handle non-antialiased hairlines and paints without path effects
or mask filters, | 462 // we only handle non-antialiased hairlines and paints without path effects
or mask filters, |
| 461 // else we let the SkDraw call our drawPath() | 463 // else we let the SkDraw call our drawPath() |
| 462 if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || | 464 if (width > 0 || paint.getPathEffect() || paint.getMaskFilter() || |
| 463 (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { | 465 (paint.isAntiAlias() && needs_antialiasing(mode, count, pts))) { |
| 464 draw.drawPoints(mode, count, pts, paint, true); | 466 draw.drawPoints(mode, count, pts, paint, true); |
| 465 return; | 467 return; |
| 466 } | 468 } |
| 467 | 469 |
| 468 GrPaint grPaint; | 470 GrPaint grPaint; |
| 469 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 471 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 472 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 470 return; | 473 return; |
| 471 } | 474 } |
| 472 | 475 |
| 473 fDrawContext->drawVertices(fClip, | 476 fDrawContext->drawVertices(fClip, |
| 474 grPaint, | 477 grPaint, |
| 475 *draw.fMatrix, | 478 *draw.fMatrix, |
| 476 gPointMode2PrimtiveType[mode], | 479 gPointMode2PrimtiveType[mode], |
| 477 SkToS32(count), | 480 SkToS32(count), |
| 478 (SkPoint*)pts, | 481 (SkPoint*)pts, |
| 479 nullptr, | 482 nullptr, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 path.setIsVolatile(true); | 514 path.setIsVolatile(true); |
| 512 path.addRect(rect); | 515 path.addRect(rect); |
| 513 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, | 516 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, |
| 514 fClip, path, paint, | 517 fClip, path, paint, |
| 515 *draw.fMatrix, nullptr, | 518 *draw.fMatrix, nullptr, |
| 516 draw.fClip->getBounds(), true); | 519 draw.fClip->getBounds(), true); |
| 517 return; | 520 return; |
| 518 } | 521 } |
| 519 | 522 |
| 520 GrPaint grPaint; | 523 GrPaint grPaint; |
| 521 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 524 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 525 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 522 return; | 526 return; |
| 523 } | 527 } |
| 524 | 528 |
| 525 GrStrokeInfo strokeInfo(paint); | 529 GrStrokeInfo strokeInfo(paint); |
| 526 | 530 |
| 527 fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); | 531 fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); |
| 528 } | 532 } |
| 529 | 533 |
| 530 /////////////////////////////////////////////////////////////////////////////// | 534 /////////////////////////////////////////////////////////////////////////////// |
| 531 | 535 |
| 532 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 536 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, |
| 533 const SkPaint& paint) { | 537 const SkPaint& paint) { |
| 534 ASSERT_SINGLE_OWNER | 538 ASSERT_SINGLE_OWNER |
| 535 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawRRect", fContext); | 539 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawRRect", fContext); |
| 536 CHECK_SHOULD_DRAW(draw); | 540 CHECK_SHOULD_DRAW(draw); |
| 537 | 541 |
| 538 GrPaint grPaint; | 542 GrPaint grPaint; |
| 539 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 543 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 544 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 540 return; | 545 return; |
| 541 } | 546 } |
| 542 | 547 |
| 543 GrStrokeInfo strokeInfo(paint); | 548 GrStrokeInfo strokeInfo(paint); |
| 544 if (paint.getMaskFilter()) { | 549 if (paint.getMaskFilter()) { |
| 545 // try to hit the fast path for drawing filtered round rects | 550 // try to hit the fast path for drawing filtered round rects |
| 546 | 551 |
| 547 SkRRect devRRect; | 552 SkRRect devRRect; |
| 548 if (rect.transform(*draw.fMatrix, &devRRect)) { | 553 if (rect.transform(*draw.fMatrix, &devRRect)) { |
| 549 if (devRRect.allCornersCircular()) { | 554 if (devRRect.allCornersCircular()) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 } | 609 } |
| 605 | 610 |
| 606 if (inner.isEmpty()) { | 611 if (inner.isEmpty()) { |
| 607 return this->drawRRect(draw, outer, paint); | 612 return this->drawRRect(draw, outer, paint); |
| 608 } | 613 } |
| 609 | 614 |
| 610 SkStrokeRec stroke(paint); | 615 SkStrokeRec stroke(paint); |
| 611 | 616 |
| 612 if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()
) { | 617 if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()
) { |
| 613 GrPaint grPaint; | 618 GrPaint grPaint; |
| 614 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint))
{ | 619 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 620 this->surfaceProps().allowSRGBInputs(), &grPaint))
{ |
| 615 return; | 621 return; |
| 616 } | 622 } |
| 617 | 623 |
| 618 fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner); | 624 fDrawContext->drawDRRect(fClip, grPaint, *draw.fMatrix, outer, inner); |
| 619 return; | 625 return; |
| 620 } | 626 } |
| 621 | 627 |
| 622 SkPath path; | 628 SkPath path; |
| 623 path.setIsVolatile(true); | 629 path.setIsVolatile(true); |
| 624 path.addRRect(outer); | 630 path.addRRect(outer); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 648 return; | 654 return; |
| 649 } | 655 } |
| 650 | 656 |
| 651 if (paint.getMaskFilter()) { | 657 if (paint.getMaskFilter()) { |
| 652 // The RRect path can handle special case blurring | 658 // The RRect path can handle special case blurring |
| 653 SkRRect rr = SkRRect::MakeOval(oval); | 659 SkRRect rr = SkRRect::MakeOval(oval); |
| 654 return this->drawRRect(draw, rr, paint); | 660 return this->drawRRect(draw, rr, paint); |
| 655 } | 661 } |
| 656 | 662 |
| 657 GrPaint grPaint; | 663 GrPaint grPaint; |
| 658 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 664 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 665 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 659 return; | 666 return; |
| 660 } | 667 } |
| 661 | 668 |
| 662 GrStrokeInfo strokeInfo(paint); | 669 GrStrokeInfo strokeInfo(paint); |
| 663 SkASSERT(!strokeInfo.isDashed()); | 670 SkASSERT(!strokeInfo.isDashed()); |
| 664 | 671 |
| 665 fDrawContext->drawOval(fClip, grPaint, *draw.fMatrix, oval, strokeInfo); | 672 fDrawContext->drawOval(fClip, grPaint, *draw.fMatrix, oval, strokeInfo); |
| 666 } | 673 } |
| 667 | 674 |
| 668 #include "SkMaskFilter.h" | 675 #include "SkMaskFilter.h" |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1132 } else if (bicubic) { | 1139 } else if (bicubic) { |
| 1133 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); | 1140 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); |
| 1134 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil
eModeY() }; | 1141 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil
eModeY() }; |
| 1135 fp.reset(GrBicubicEffect::Create(texture, texMatrix, tileModes)); | 1142 fp.reset(GrBicubicEffect::Create(texture, texMatrix, tileModes)); |
| 1136 } else { | 1143 } else { |
| 1137 fp.reset(GrSimpleTextureEffect::Create(texture, texMatrix, params)); | 1144 fp.reset(GrSimpleTextureEffect::Create(texture, texMatrix, params)); |
| 1138 } | 1145 } |
| 1139 | 1146 |
| 1140 GrPaint grPaint; | 1147 GrPaint grPaint; |
| 1141 if (!SkPaintToGrPaintWithTexture(this->context(), paint, viewMatrix, fp, | 1148 if (!SkPaintToGrPaintWithTexture(this->context(), paint, viewMatrix, fp, |
| 1142 kAlpha_8_SkColorType == bitmap.colorType(),
&grPaint)) { | 1149 kAlpha_8_SkColorType == bitmap.colorType(), |
| 1150 this->surfaceProps().allowSRGBInputs(), &gr
Paint)) { |
| 1143 return; | 1151 return; |
| 1144 } | 1152 } |
| 1145 | 1153 |
| 1146 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { | 1154 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { |
| 1147 // We don't have local coords in this case and have previously set the t
ransform | 1155 // We don't have local coords in this case and have previously set the t
ransform |
| 1148 // matrices directly on the texture processor. | 1156 // matrices directly on the texture processor. |
| 1149 fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); | 1157 fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); |
| 1150 } else { | 1158 } else { |
| 1151 fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR
ect); | 1159 fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR
ect); |
| 1152 } | 1160 } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 } | 1234 } |
| 1227 | 1235 |
| 1228 GrPaint grPaint; | 1236 GrPaint grPaint; |
| 1229 SkAutoTUnref<const GrFragmentProcessor> fp( | 1237 SkAutoTUnref<const GrFragmentProcessor> fp( |
| 1230 GrSimpleTextureEffect::Create(texture, SkMatrix::I())); | 1238 GrSimpleTextureEffect::Create(texture, SkMatrix::I())); |
| 1231 if (alphaOnly) { | 1239 if (alphaOnly) { |
| 1232 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1240 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
| 1233 } else { | 1241 } else { |
| 1234 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1242 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| 1235 } | 1243 } |
| 1236 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { | 1244 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, |
| 1245 this->surfaceProps().allowSRGBInputs(), &
grPaint)) { |
| 1237 return; | 1246 return; |
| 1238 } | 1247 } |
| 1239 | 1248 |
| 1240 fDrawContext->fillRectToRect(fClip, | 1249 fDrawContext->fillRectToRect(fClip, |
| 1241 grPaint, | 1250 grPaint, |
| 1242 SkMatrix::I(), | 1251 SkMatrix::I(), |
| 1243 SkRect::MakeXYWH(SkIntToScalar(left), | 1252 SkRect::MakeXYWH(SkIntToScalar(left), |
| 1244 SkIntToScalar(top), | 1253 SkIntToScalar(top), |
| 1245 SkIntToScalar(w), | 1254 SkIntToScalar(w), |
| 1246 SkIntToScalar(h)), | 1255 SkIntToScalar(h)), |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1386 GrPaint grPaint; | 1395 GrPaint grPaint; |
| 1387 SkAutoTUnref<const GrFragmentProcessor> fp( | 1396 SkAutoTUnref<const GrFragmentProcessor> fp( |
| 1388 GrSimpleTextureEffect::Create(devTex, SkMatrix::I())); | 1397 GrSimpleTextureEffect::Create(devTex, SkMatrix::I())); |
| 1389 if (GrPixelConfigIsAlphaOnly(devTex->config())) { | 1398 if (GrPixelConfigIsAlphaOnly(devTex->config())) { |
| 1390 // Can this happen? | 1399 // Can this happen? |
| 1391 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); | 1400 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
| 1392 } else { | 1401 } else { |
| 1393 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 1402 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| 1394 } | 1403 } |
| 1395 | 1404 |
| 1396 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { | 1405 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, |
| 1406 this->surfaceProps().allowSRGBInputs(), &
grPaint)) { |
| 1397 return; | 1407 return; |
| 1398 } | 1408 } |
| 1399 | 1409 |
| 1400 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(x), | 1410 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(x), |
| 1401 SkIntToScalar(y), | 1411 SkIntToScalar(y), |
| 1402 SkIntToScalar(w), | 1412 SkIntToScalar(w), |
| 1403 SkIntToScalar(h)); | 1413 SkIntToScalar(h)); |
| 1404 | 1414 |
| 1405 // The device being drawn may not fill up its texture (e.g. saveLayer uses a
pproximate | 1415 // The device being drawn may not fill up its texture (e.g. saveLayer uses a
pproximate |
| 1406 // scratch texture). | 1416 // scratch texture). |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 } | 1535 } |
| 1526 | 1536 |
| 1527 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; | 1537 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; |
| 1528 SkAutoTUnref<const GrFragmentProcessor> fp( | 1538 SkAutoTUnref<const GrFragmentProcessor> fp( |
| 1529 producer->createFragmentProcessor(SkMatrix::I(), | 1539 producer->createFragmentProcessor(SkMatrix::I(), |
| 1530 SkRect::MakeIWH(producer->width(), pro
ducer->height()), | 1540 SkRect::MakeIWH(producer->width(), pro
ducer->height()), |
| 1531 GrTextureProducer::kNo_FilterConstrain
t, true, | 1541 GrTextureProducer::kNo_FilterConstrain
t, true, |
| 1532 &kMode)); | 1542 &kMode)); |
| 1533 GrPaint grPaint; | 1543 GrPaint grPaint; |
| 1534 if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, | 1544 if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, |
| 1535 producer->isAlphaOnly(), &grPaint)) { | 1545 producer->isAlphaOnly(), |
| 1546 this->surfaceProps().allowSRGBInputs(), &gr
Paint)) { |
| 1536 return; | 1547 return; |
| 1537 } | 1548 } |
| 1538 | 1549 |
| 1539 fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width()
, | 1550 fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width()
, |
| 1540 producer->height(), center, dst); | 1551 producer->height(), center, dst); |
| 1541 } | 1552 } |
| 1542 | 1553 |
| 1543 void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, | 1554 void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, |
| 1544 const SkIRect& center, const SkRect& dst, const
SkPaint& paint) { | 1555 const SkIRect& center, const SkRect& dst, const
SkPaint& paint) { |
| 1545 ASSERT_SINGLE_OWNER | 1556 ASSERT_SINGLE_OWNER |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1592 if ((nullptr == texs || nullptr == paint.getShader()) && nullptr == colors)
{ | 1603 if ((nullptr == texs || nullptr == paint.getShader()) && nullptr == colors)
{ |
| 1593 | 1604 |
| 1594 texs = nullptr; | 1605 texs = nullptr; |
| 1595 | 1606 |
| 1596 SkPaint copy(paint); | 1607 SkPaint copy(paint); |
| 1597 copy.setStyle(SkPaint::kStroke_Style); | 1608 copy.setStyle(SkPaint::kStroke_Style); |
| 1598 copy.setStrokeWidth(0); | 1609 copy.setStrokeWidth(0); |
| 1599 | 1610 |
| 1600 GrPaint grPaint; | 1611 GrPaint grPaint; |
| 1601 // we ignore the shader if texs is null. | 1612 // we ignore the shader if texs is null. |
| 1602 if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint)) { | 1613 if (!SkPaintToGrPaintNoShader(this->context(), copy, |
| 1614 this->surfaceProps().allowSRGBInputs(), &g
rPaint)) { |
| 1603 return; | 1615 return; |
| 1604 } | 1616 } |
| 1605 | 1617 |
| 1606 int triangleCount = 0; | 1618 int triangleCount = 0; |
| 1607 int n = (nullptr == indices) ? vertexCount : indexCount; | 1619 int n = (nullptr == indices) ? vertexCount : indexCount; |
| 1608 switch (vmode) { | 1620 switch (vmode) { |
| 1609 case SkCanvas::kTriangles_VertexMode: | 1621 case SkCanvas::kTriangles_VertexMode: |
| 1610 triangleCount = n / 3; | 1622 triangleCount = n / 3; |
| 1611 break; | 1623 break; |
| 1612 case SkCanvas::kTriangleStrip_VertexMode: | 1624 case SkCanvas::kTriangleStrip_VertexMode: |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 // xmode is defined to mean modulate. | 1676 // xmode is defined to mean modulate. |
| 1665 SkXfermode::Mode colorMode; | 1677 SkXfermode::Mode colorMode; |
| 1666 if (xmode) { | 1678 if (xmode) { |
| 1667 if (!xmode->asMode(&colorMode)) { | 1679 if (!xmode->asMode(&colorMode)) { |
| 1668 return; | 1680 return; |
| 1669 } | 1681 } |
| 1670 } else { | 1682 } else { |
| 1671 colorMode = SkXfermode::kModulate_Mode; | 1683 colorMode = SkXfermode::kModulate_Mode; |
| 1672 } | 1684 } |
| 1673 if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMat
rix, colorMode, | 1685 if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMat
rix, colorMode, |
| 1674 false, &grPaint)) { | 1686 false, this->surfaceProps().allowS
RGBInputs(), |
| 1687 &grPaint)) { |
| 1675 return; | 1688 return; |
| 1676 } | 1689 } |
| 1677 } else { | 1690 } else { |
| 1678 // We have a shader, but no colors to blend it against. | 1691 // We have a shader, but no colors to blend it against. |
| 1679 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPain
t)) { | 1692 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 1693 this->surfaceProps().allowSRGBInputs(), &grPai
nt)) { |
| 1680 return; | 1694 return; |
| 1681 } | 1695 } |
| 1682 } | 1696 } |
| 1683 } else { | 1697 } else { |
| 1684 if (colors) { | 1698 if (colors) { |
| 1685 // We have colors, but either have no shader or no texture coords (w
hich implies that | 1699 // We have colors, but either have no shader or no texture coords (w
hich implies that |
| 1686 // we should ignore the shader). | 1700 // we should ignore the shader). |
| 1687 if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, &grP
aint)) { | 1701 if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, |
| 1702 this->surfaceProps().allowSR
GBInputs(), |
| 1703 &grPaint)) { |
| 1688 return; | 1704 return; |
| 1689 } | 1705 } |
| 1690 } else { | 1706 } else { |
| 1691 // No colors and no shaders. Just draw with the paint color. | 1707 // No colors and no shaders. Just draw with the paint color. |
| 1692 if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint)) { | 1708 if (!SkPaintToGrPaintNoShader(this->context(), paint, |
| 1709 this->surfaceProps().allowSRGBInputs()
, &grPaint)) { |
| 1693 return; | 1710 return; |
| 1694 } | 1711 } |
| 1695 } | 1712 } |
| 1696 } | 1713 } |
| 1697 | 1714 |
| 1698 fDrawContext->drawVertices(fClip, | 1715 fDrawContext->drawVertices(fClip, |
| 1699 grPaint, | 1716 grPaint, |
| 1700 *draw.fMatrix, | 1717 *draw.fMatrix, |
| 1701 primType, | 1718 primType, |
| 1702 vertexCount, | 1719 vertexCount, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1720 | 1737 |
| 1721 CHECK_SHOULD_DRAW(draw); | 1738 CHECK_SHOULD_DRAW(draw); |
| 1722 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawText", fContext); | 1739 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawText", fContext); |
| 1723 | 1740 |
| 1724 SkPaint p(paint); | 1741 SkPaint p(paint); |
| 1725 p.setShader(atlas->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_Ti
leMode)); | 1742 p.setShader(atlas->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_Ti
leMode)); |
| 1726 | 1743 |
| 1727 GrPaint grPaint; | 1744 GrPaint grPaint; |
| 1728 if (colors) { | 1745 if (colors) { |
| 1729 if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
e, true, | 1746 if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mod
e, true, |
| 1730 &grPaint)) { | 1747 this->surfaceProps().allowSRGBInputs()
, &grPaint)) { |
| 1731 return; | 1748 return; |
| 1732 } | 1749 } |
| 1733 } else { | 1750 } else { |
| 1734 if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint)) { | 1751 if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, |
| 1752 this->surfaceProps().allowSRGBInputs(), &grPaint))
{ |
| 1735 return; | 1753 return; |
| 1736 } | 1754 } |
| 1737 } | 1755 } |
| 1738 | 1756 |
| 1739 SkDEBUGCODE(this->validate();) | 1757 SkDEBUGCODE(this->validate();) |
| 1740 fDrawContext->drawAtlas(fClip, grPaint, *draw.fMatrix, count, xform, texRect
, colors); | 1758 fDrawContext->drawAtlas(fClip, grPaint, *draw.fMatrix, count, xform, texRect
, colors); |
| 1741 } | 1759 } |
| 1742 | 1760 |
| 1743 /////////////////////////////////////////////////////////////////////////////// | 1761 /////////////////////////////////////////////////////////////////////////////// |
| 1744 | 1762 |
| 1745 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, | 1763 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, |
| 1746 size_t byteLength, SkScalar x, SkScalar y, | 1764 size_t byteLength, SkScalar x, SkScalar y, |
| 1747 const SkPaint& paint) { | 1765 const SkPaint& paint) { |
| 1748 ASSERT_SINGLE_OWNER | 1766 ASSERT_SINGLE_OWNER |
| 1749 CHECK_SHOULD_DRAW(draw); | 1767 CHECK_SHOULD_DRAW(draw); |
| 1750 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawText", fContext); | 1768 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawText", fContext); |
| 1751 | 1769 |
| 1752 GrPaint grPaint; | 1770 GrPaint grPaint; |
| 1753 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 1771 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 1772 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 1754 return; | 1773 return; |
| 1755 } | 1774 } |
| 1756 | 1775 |
| 1757 SkDEBUGCODE(this->validate();) | 1776 SkDEBUGCODE(this->validate();) |
| 1758 | 1777 |
| 1759 fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, | 1778 fDrawContext->drawText(fClip, grPaint, paint, *draw.fMatrix, |
| 1760 (const char *)text, byteLength, x, y, draw.fClip->get
Bounds()); | 1779 (const char *)text, byteLength, x, y, draw.fClip->get
Bounds()); |
| 1761 } | 1780 } |
| 1762 | 1781 |
| 1763 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
ength, | 1782 void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
ength, |
| 1764 const SkScalar pos[], int scalarsPerPos, | 1783 const SkScalar pos[], int scalarsPerPos, |
| 1765 const SkPoint& offset, const SkPaint& paint) { | 1784 const SkPoint& offset, const SkPaint& paint) { |
| 1766 ASSERT_SINGLE_OWNER | 1785 ASSERT_SINGLE_OWNER |
| 1767 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPosText", fContext); | 1786 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPosText", fContext); |
| 1768 CHECK_SHOULD_DRAW(draw); | 1787 CHECK_SHOULD_DRAW(draw); |
| 1769 | 1788 |
| 1770 GrPaint grPaint; | 1789 GrPaint grPaint; |
| 1771 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 1790 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, |
| 1791 this->surfaceProps().allowSRGBInputs(), &grPaint)) { |
| 1772 return; | 1792 return; |
| 1773 } | 1793 } |
| 1774 | 1794 |
| 1775 SkDEBUGCODE(this->validate();) | 1795 SkDEBUGCODE(this->validate();) |
| 1776 | 1796 |
| 1777 fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, | 1797 fDrawContext->drawPosText(fClip, grPaint, paint, *draw.fMatrix, |
| 1778 (const char *)text, byteLength, pos, scalarsPerPos
, offset, | 1798 (const char *)text, byteLength, pos, scalarsPerPos
, offset, |
| 1779 draw.fClip->getBounds()); | 1799 draw.fClip->getBounds()); |
| 1780 } | 1800 } |
| 1781 | 1801 |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1922 } | 1942 } |
| 1923 | 1943 |
| 1924 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1944 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1925 ASSERT_SINGLE_OWNER | 1945 ASSERT_SINGLE_OWNER |
| 1926 // We always return a transient cache, so it is freed after each | 1946 // We always return a transient cache, so it is freed after each |
| 1927 // filter traversal. | 1947 // filter traversal. |
| 1928 return SkGpuDevice::NewImageFilterCache(); | 1948 return SkGpuDevice::NewImageFilterCache(); |
| 1929 } | 1949 } |
| 1930 | 1950 |
| 1931 #endif | 1951 #endif |
| OLD | NEW |