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 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1605 | 1605 |
1606 void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, | 1606 void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode, |
1607 int vertexCount, const SkPoint vertices[], | 1607 int vertexCount, const SkPoint vertices[], |
1608 const SkPoint texs[], const SkColor colors[], | 1608 const SkPoint texs[], const SkColor colors[], |
1609 SkXfermode* xmode, | 1609 SkXfermode* xmode, |
1610 const uint16_t indices[], int indexCount, | 1610 const uint16_t indices[], int indexCount, |
1611 const SkPaint& paint) { | 1611 const SkPaint& paint) { |
1612 CHECK_SHOULD_DRAW(draw, false); | 1612 CHECK_SHOULD_DRAW(draw, false); |
1613 | 1613 |
1614 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawVertices", fContext); | 1614 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawVertices", fContext); |
| 1615 |
| 1616 const uint16_t* outIndices; |
| 1617 SkAutoTDeleteArray<uint16_t> outAlloc(NULL); |
| 1618 GrPrimitiveType primType; |
| 1619 GrPaint grPaint; |
| 1620 |
1615 // If both textures and vertex-colors are NULL, strokes hairlines with the p
aint's color. | 1621 // If both textures and vertex-colors are NULL, strokes hairlines with the p
aint's color. |
1616 if ((NULL == texs || NULL == paint.getShader()) && NULL == colors) { | 1622 if ((NULL == texs || NULL == paint.getShader()) && NULL == colors) { |
| 1623 |
1617 texs = NULL; | 1624 texs = NULL; |
| 1625 |
1618 SkPaint copy(paint); | 1626 SkPaint copy(paint); |
1619 copy.setStyle(SkPaint::kStroke_Style); | 1627 copy.setStyle(SkPaint::kStroke_Style); |
1620 copy.setStrokeWidth(0); | 1628 copy.setStrokeWidth(0); |
| 1629 |
| 1630 // we ignore the shader if texs is null. |
| 1631 SkPaint2GrPaintNoShader(this->context(), copy, SkColor2GrColor(copy.getC
olor()), |
| 1632 NULL == colors, &grPaint); |
1621 | 1633 |
| 1634 primType = kLines_GrPrimitiveType; |
| 1635 int triangleCount = 0; |
| 1636 switch (vmode) { |
| 1637 case SkCanvas::kTriangles_VertexMode: |
| 1638 triangleCount = indexCount / 3; |
| 1639 break; |
| 1640 case SkCanvas::kTriangleStrip_VertexMode: |
| 1641 case SkCanvas::kTriangleFan_VertexMode: |
| 1642 triangleCount = indexCount - 2; |
| 1643 break; |
| 1644 } |
| 1645 |
1622 VertState state(vertexCount, indices, indexCount); | 1646 VertState state(vertexCount, indices, indexCount); |
1623 VertState::Proc vertProc = state.chooseProc(vmode); | 1647 VertState::Proc vertProc = state.chooseProc(vmode); |
1624 | 1648 |
1625 SkPoint* pts = new SkPoint[vertexCount * 6]; | 1649 //number of indices for lines per triangle with kLines |
| 1650 indexCount = triangleCount * 6; |
| 1651 |
| 1652 outAlloc.reset(SkNEW_ARRAY(uint16_t, indexCount)); |
| 1653 outIndices = outAlloc.get(); |
| 1654 uint16_t* auxIndices = outAlloc.get(); |
1626 int i = 0; | 1655 int i = 0; |
1627 while (vertProc(&state)) { | 1656 while (vertProc(&state)) { |
1628 pts[i] = vertices[state.f0]; | 1657 auxIndices[i] = state.f0; |
1629 pts[i + 1] = vertices[state.f1]; | 1658 auxIndices[i + 1] = state.f1; |
1630 pts[i + 2] = vertices[state.f1]; | 1659 auxIndices[i + 2] = state.f1; |
1631 pts[i + 3] = vertices[state.f2]; | 1660 auxIndices[i + 3] = state.f2; |
1632 pts[i + 4] = vertices[state.f2]; | 1661 auxIndices[i + 4] = state.f2; |
1633 pts[i + 5] = vertices[state.f0]; | 1662 auxIndices[i + 5] = state.f0; |
1634 i += 6; | 1663 i += 6; |
1635 } | 1664 } |
1636 draw.drawPoints(SkCanvas::kLines_PointMode, i, pts, copy, true); | |
1637 return; | |
1638 } | |
1639 | |
1640 GrPaint grPaint; | |
1641 // we ignore the shader if texs is null. | |
1642 if (NULL == texs) { | |
1643 SkPaint2GrPaintNoShader(this->context(), paint, SkColor2GrColor(paint.ge
tColor()), | |
1644 NULL == colors, &grPaint); | |
1645 } else { | 1665 } else { |
1646 SkPaint2GrPaintShader(this->context(), paint, NULL == colors, &grPaint); | 1666 outIndices = indices; |
| 1667 primType = gVertexMode2PrimitiveType[vmode]; |
| 1668 |
| 1669 if (NULL == texs || NULL == paint.getShader()) { |
| 1670 SkPaint2GrPaintNoShader(this->context(), paint, SkColor2GrColor(pain
t.getColor()), |
| 1671 NULL == colors, &grPaint); |
| 1672 } else { |
| 1673 SkPaint2GrPaintShader(this->context(), paint, NULL == colors, &grPai
nt); |
| 1674 } |
1647 } | 1675 } |
1648 | 1676 |
1649 #if 0 | 1677 #if 0 |
1650 if (NULL != xmode && NULL != texs && NULL != colors) { | 1678 if (NULL != xmode && NULL != texs && NULL != colors) { |
1651 if (!SkXfermode::IsMode(xmode, SkXfermode::kModulate_Mode)) { | 1679 if (!SkXfermode::IsMode(xmode, SkXfermode::kModulate_Mode)) { |
1652 SkDebugf("Unsupported vertex-color/texture xfer mode.\n"); | 1680 SkDebugf("Unsupported vertex-color/texture xfer mode.\n"); |
1653 return; | 1681 return; |
1654 } | 1682 } |
1655 } | 1683 } |
1656 #endif | 1684 #endif |
1657 | 1685 |
1658 SkAutoSTMalloc<128, GrColor> convertedColors(0); | 1686 SkAutoSTMalloc<128, GrColor> convertedColors(0); |
1659 if (NULL != colors) { | 1687 if (NULL != colors) { |
1660 // need to convert byte order and from non-PM to PM | 1688 // need to convert byte order and from non-PM to PM |
1661 convertedColors.reset(vertexCount); | 1689 convertedColors.reset(vertexCount); |
1662 SkColor color; | 1690 SkColor color; |
1663 for (int i = 0; i < vertexCount; ++i) { | 1691 for (int i = 0; i < vertexCount; ++i) { |
1664 color = colors[i]; | 1692 color = colors[i]; |
1665 if (paint.getAlpha() != 255) { | 1693 if (paint.getAlpha() != 255) { |
1666 color = SkColorSetA(color, SkMulDiv255Round(SkColorGetA(color),
paint.getAlpha())); | 1694 color = SkColorSetA(color, SkMulDiv255Round(SkColorGetA(color),
paint.getAlpha())); |
1667 } | 1695 } |
1668 convertedColors[i] = SkColor2GrColor(color); | 1696 convertedColors[i] = SkColor2GrColor(color); |
1669 } | 1697 } |
1670 colors = convertedColors.get(); | 1698 colors = convertedColors.get(); |
1671 } | 1699 } |
1672 fContext->drawVertices(grPaint, | 1700 fContext->drawVertices(grPaint, |
1673 gVertexMode2PrimitiveType[vmode], | 1701 primType, |
1674 vertexCount, | 1702 vertexCount, |
1675 vertices, | 1703 vertices, |
1676 texs, | 1704 texs, |
1677 colors, | 1705 colors, |
1678 indices, | 1706 outIndices, |
1679 indexCount); | 1707 indexCount); |
1680 } | 1708 } |
1681 | 1709 |
1682 /////////////////////////////////////////////////////////////////////////////// | 1710 /////////////////////////////////////////////////////////////////////////////// |
1683 | 1711 |
1684 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, | 1712 void SkGpuDevice::drawText(const SkDraw& draw, const void* text, |
1685 size_t byteLength, SkScalar x, SkScalar y, | 1713 size_t byteLength, SkScalar x, SkScalar y, |
1686 const SkPaint& paint) { | 1714 const SkPaint& paint) { |
1687 CHECK_SHOULD_DRAW(draw, false); | 1715 CHECK_SHOULD_DRAW(draw, false); |
1688 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); | 1716 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext); |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2031 playback.draw(canvas, NULL); | 2059 playback.draw(canvas, NULL); |
2032 | 2060 |
2033 // unlock the layers | 2061 // unlock the layers |
2034 for (int i = 0; i < gpuData->numSaveLayers(); ++i) { | 2062 for (int i = 0; i < gpuData->numSaveLayers(); ++i) { |
2035 GrCachedLayer* layer = fContext->getLayerCache()->findLayer(picture, i); | 2063 GrCachedLayer* layer = fContext->getLayerCache()->findLayer(picture, i); |
2036 fContext->getLayerCache()->unlock(layer); | 2064 fContext->getLayerCache()->unlock(layer); |
2037 } | 2065 } |
2038 | 2066 |
2039 return true; | 2067 return true; |
2040 } | 2068 } |
OLD | NEW |