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 "effects/GrBicubicEffect.h" | 10 #include "effects/GrBicubicEffect.h" |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 SK_COMPILE_ASSERT(SkShader::kTwoPointRadial_BitmapType == 4, | 337 SK_COMPILE_ASSERT(SkShader::kTwoPointRadial_BitmapType == 4, |
338 shader_type_mismatch); | 338 shader_type_mismatch); |
339 SK_COMPILE_ASSERT(SkShader::kTwoPointConical_BitmapType == 5, | 339 SK_COMPILE_ASSERT(SkShader::kTwoPointConical_BitmapType == 5, |
340 shader_type_mismatch); | 340 shader_type_mismatch); |
341 SK_COMPILE_ASSERT(SkShader::kLinear_BitmapType == 6, shader_type_mismatch); | 341 SK_COMPILE_ASSERT(SkShader::kLinear_BitmapType == 6, shader_type_mismatch); |
342 SK_COMPILE_ASSERT(SkShader::kLast_BitmapType == 6, shader_type_mismatch); | 342 SK_COMPILE_ASSERT(SkShader::kLast_BitmapType == 6, shader_type_mismatch); |
343 | 343 |
344 /////////////////////////////////////////////////////////////////////////////// | 344 /////////////////////////////////////////////////////////////////////////////// |
345 | 345 |
346 void SkGpuDevice::clear(SkColor color) { | 346 void SkGpuDevice::clear(SkColor color) { |
| 347 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clear", fContext); |
347 SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); | 348 SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); |
348 fContext->clear(&rect, SkColor2GrColor(color), true, fRenderTarget); | 349 fContext->clear(&rect, SkColor2GrColor(color), true, fRenderTarget); |
349 fNeedClear = false; | 350 fNeedClear = false; |
350 } | 351 } |
351 | 352 |
352 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { | 353 void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { |
353 CHECK_SHOULD_DRAW(draw, false); | 354 CHECK_SHOULD_DRAW(draw, false); |
| 355 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext); |
354 | 356 |
355 GrPaint grPaint; | 357 GrPaint grPaint; |
356 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 358 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
357 | 359 |
358 fContext->drawPaint(grPaint); | 360 fContext->drawPaint(grPaint); |
359 } | 361 } |
360 | 362 |
361 // must be in SkCanvas::PointMode order | 363 // must be in SkCanvas::PointMode order |
362 static const GrPrimitiveType gPointMode2PrimtiveType[] = { | 364 static const GrPrimitiveType gPointMode2PrimtiveType[] = { |
363 kPoints_GrPrimitiveType, | 365 kPoints_GrPrimitiveType, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 GrPaint grPaint; | 466 GrPaint grPaint; |
465 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 467 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
466 | 468 |
467 fContext->drawRect(grPaint, rect, &strokeInfo); | 469 fContext->drawRect(grPaint, rect, &strokeInfo); |
468 } | 470 } |
469 | 471 |
470 /////////////////////////////////////////////////////////////////////////////// | 472 /////////////////////////////////////////////////////////////////////////////// |
471 | 473 |
472 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 474 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, |
473 const SkPaint& paint) { | 475 const SkPaint& paint) { |
| 476 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRRect", fContext); |
474 CHECK_FOR_ANNOTATION(paint); | 477 CHECK_FOR_ANNOTATION(paint); |
475 CHECK_SHOULD_DRAW(draw, false); | 478 CHECK_SHOULD_DRAW(draw, false); |
476 | 479 |
477 GrPaint grPaint; | 480 GrPaint grPaint; |
478 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 481 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
479 | 482 |
480 GrStrokeInfo strokeInfo(paint); | 483 GrStrokeInfo strokeInfo(paint); |
481 if (paint.getMaskFilter()) { | 484 if (paint.getMaskFilter()) { |
482 // try to hit the fast path for drawing filtered round rects | 485 // try to hit the fast path for drawing filtered round rects |
483 | 486 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 path.setFillType(SkPath::kEvenOdd_FillType); | 555 path.setFillType(SkPath::kEvenOdd_FillType); |
553 | 556 |
554 this->drawPath(draw, path, paint, NULL, true); | 557 this->drawPath(draw, path, paint, NULL, true); |
555 } | 558 } |
556 | 559 |
557 | 560 |
558 ///////////////////////////////////////////////////////////////////////////// | 561 ///////////////////////////////////////////////////////////////////////////// |
559 | 562 |
560 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, | 563 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, |
561 const SkPaint& paint) { | 564 const SkPaint& paint) { |
| 565 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawOval", fContext); |
562 CHECK_FOR_ANNOTATION(paint); | 566 CHECK_FOR_ANNOTATION(paint); |
563 CHECK_SHOULD_DRAW(draw, false); | 567 CHECK_SHOULD_DRAW(draw, false); |
564 | 568 |
565 GrStrokeInfo strokeInfo(paint); | 569 GrStrokeInfo strokeInfo(paint); |
566 | 570 |
567 bool usePath = false; | 571 bool usePath = false; |
568 // some basic reasons we might need to call drawPath... | 572 // some basic reasons we might need to call drawPath... |
569 if (paint.getMaskFilter()) { | 573 if (paint.getMaskFilter()) { |
570 usePath = true; | 574 usePath = true; |
571 } else { | 575 } else { |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 return result; | 721 return result; |
718 } | 722 } |
719 | 723 |
720 }; | 724 }; |
721 | 725 |
722 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, | 726 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
723 const SkPaint& paint, const SkMatrix* prePathMatrix, | 727 const SkPaint& paint, const SkMatrix* prePathMatrix, |
724 bool pathIsMutable) { | 728 bool pathIsMutable) { |
725 CHECK_FOR_ANNOTATION(paint); | 729 CHECK_FOR_ANNOTATION(paint); |
726 CHECK_SHOULD_DRAW(draw, false); | 730 CHECK_SHOULD_DRAW(draw, false); |
| 731 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPath", fContext); |
727 | 732 |
728 GrPaint grPaint; | 733 GrPaint grPaint; |
729 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 734 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
730 | 735 |
731 // If we have a prematrix, apply it to the path, optimizing for the case | 736 // If we have a prematrix, apply it to the path, optimizing for the case |
732 // where the original path can in fact be modified in place (even though | 737 // where the original path can in fact be modified in place (even though |
733 // its parameter type is const). | 738 // its parameter type is const). |
734 SkPath* pathPtr = const_cast<SkPath*>(&origSrcPath); | 739 SkPath* pathPtr = const_cast<SkPath*>(&origSrcPath); |
735 SkTLazy<SkPath> tmpPath; | 740 SkTLazy<SkPath> tmpPath; |
736 SkTLazy<SkPath> effectPath; | 741 SkTLazy<SkPath> effectPath; |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 SkSize dstSize; | 1498 SkSize dstSize; |
1494 dstSize.fWidth = tmpDst.width(); | 1499 dstSize.fWidth = tmpDst.width(); |
1495 dstSize.fHeight = tmpDst.height(); | 1500 dstSize.fHeight = tmpDst.height(); |
1496 | 1501 |
1497 this->drawBitmapCommon(*draw, bitmap, &tmpSrc, &dstSize, paint, flags); | 1502 this->drawBitmapCommon(*draw, bitmap, &tmpSrc, &dstSize, paint, flags); |
1498 } | 1503 } |
1499 | 1504 |
1500 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, | 1505 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, |
1501 int x, int y, const SkPaint& paint) { | 1506 int x, int y, const SkPaint& paint) { |
1502 // clear of the source device must occur before CHECK_SHOULD_DRAW | 1507 // clear of the source device must occur before CHECK_SHOULD_DRAW |
| 1508 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawDevice", fContext); |
1503 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); | 1509 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); |
1504 if (dev->fNeedClear) { | 1510 if (dev->fNeedClear) { |
1505 // TODO: could check here whether we really need to draw at all | 1511 // TODO: could check here whether we really need to draw at all |
1506 dev->clear(0x0); | 1512 dev->clear(0x0); |
1507 } | 1513 } |
1508 | 1514 |
1509 // drawDevice is defined to be in device coords. | 1515 // drawDevice is defined to be in device coords. |
1510 CHECK_SHOULD_DRAW(draw, true); | 1516 CHECK_SHOULD_DRAW(draw, true); |
1511 | 1517 |
1512 GrRenderTarget* devRT = dev->accessRenderTarget(); | 1518 GrRenderTarget* devRT = dev->accessRenderTarget(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1598 }; | 1604 }; |
1599 | 1605 |
1600 void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, | 1606 void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
1601 int vertexCount, const SkPoint vertices[], | 1607 int vertexCount, const SkPoint vertices[], |
1602 const SkPoint texs[], const SkColor colors[], | 1608 const SkPoint texs[], const SkColor colors[], |
1603 SkXfermode* xmode, | 1609 SkXfermode* xmode, |
1604 const uint16_t indices[], int indexCount, | 1610 const uint16_t indices[], int indexCount, |
1605 const SkPaint& paint) { | 1611 const SkPaint& paint) { |
1606 CHECK_SHOULD_DRAW(draw, false); | 1612 CHECK_SHOULD_DRAW(draw, false); |
1607 | 1613 |
| 1614 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawVertices", fContext); |
1608 // If both textures and vertex-colors are NULL, strokes hairlines with the p
aint's color. | 1615 // If both textures and vertex-colors are NULL, strokes hairlines with the p
aint's color. |
1609 if ((NULL == texs || NULL == paint.getShader()) && NULL == colors) { | 1616 if ((NULL == texs || NULL == paint.getShader()) && NULL == colors) { |
1610 texs = NULL; | 1617 texs = NULL; |
1611 SkPaint copy(paint); | 1618 SkPaint copy(paint); |
1612 copy.setStyle(SkPaint::kStroke_Style); | 1619 copy.setStyle(SkPaint::kStroke_Style); |
1613 copy.setStrokeWidth(0); | 1620 copy.setStrokeWidth(0); |
1614 | 1621 |
1615 VertState state(vertexCount, indices, indexCount); | 1622 VertState state(vertexCount, indices, indexCount); |
1616 VertState::Proc vertProc = state.chooseProc(vmode); | 1623 VertState::Proc vertProc = state.chooseProc(vmode); |
1617 | 1624 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1671 indices, | 1678 indices, |
1672 indexCount); | 1679 indexCount); |
1673 } | 1680 } |
1674 | 1681 |
1675 /////////////////////////////////////////////////////////////////////////////// | 1682 /////////////////////////////////////////////////////////////////////////////// |
1676 | 1683 |
1677 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, | 1684 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, |
1678 size_t byteLength, SkScalar x, SkScalar y, | 1685 size_t byteLength, SkScalar x, SkScalar y, |
1679 const SkPaint& paint) { | 1686 const SkPaint& paint) { |
1680 CHECK_SHOULD_DRAW(draw, false); | 1687 CHECK_SHOULD_DRAW(draw, false); |
| 1688 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); |
1681 | 1689 |
1682 if (fMainTextContext->canDraw(paint)) { | 1690 if (fMainTextContext->canDraw(paint)) { |
1683 GrPaint grPaint; | 1691 GrPaint grPaint; |
1684 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); | 1692 SkPaint2GrPaintShader(this->context(), paint, true, &grPaint); |
1685 | 1693 |
1686 SkDEBUGCODE(this->validate();) | 1694 SkDEBUGCODE(this->validate();) |
1687 | 1695 |
1688 fMainTextContext->drawText(grPaint, paint, (const char *)text, byteLengt
h, x, y); | 1696 fMainTextContext->drawText(grPaint, paint, (const char *)text, byteLengt
h, x, y); |
1689 } else if (fFallbackTextContext && fFallbackTextContext->canDraw(paint)) { | 1697 } else if (fFallbackTextContext && fFallbackTextContext->canDraw(paint)) { |
1690 GrPaint grPaint; | 1698 GrPaint grPaint; |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2028 playback.draw(canvas, NULL); | 2036 playback.draw(canvas, NULL); |
2029 | 2037 |
2030 // unlock the layers | 2038 // unlock the layers |
2031 for (int i = 0; i < gpuData->numSaveLayers(); ++i) { | 2039 for (int i = 0; i < gpuData->numSaveLayers(); ++i) { |
2032 GrCachedLayer* layer = fContext->getLayerCache()->findLayer(picture, i); | 2040 GrCachedLayer* layer = fContext->getLayerCache()->findLayer(picture, i); |
2033 fContext->getLayerCache()->unlock(layer); | 2041 fContext->getLayerCache()->unlock(layer); |
2034 } | 2042 } |
2035 | 2043 |
2036 return true; | 2044 return true; |
2037 } | 2045 } |
OLD | NEW |