| 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/GrTextureDomainEffect.h" | 10 #include "effects/GrTextureDomainEffect.h" |
| (...skipping 1354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); | 1365 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); |
| 1366 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { | 1366 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { |
| 1367 return; | 1367 return; |
| 1368 } | 1368 } |
| 1369 | 1369 |
| 1370 fContext->drawRectToRect(grPaint, dstRect, paintRect, &m); | 1370 fContext->drawRectToRect(grPaint, dstRect, paintRect, &m); |
| 1371 } | 1371 } |
| 1372 | 1372 |
| 1373 static bool filter_texture(SkDevice* device, GrContext* context, | 1373 static bool filter_texture(SkDevice* device, GrContext* context, |
| 1374 GrTexture* texture, SkImageFilter* filter, | 1374 GrTexture* texture, SkImageFilter* filter, |
| 1375 int w, int h, SkBitmap* result, SkIPoint* offset) { | 1375 int w, int h, const SkMatrix& ctm, SkBitmap* result, |
| 1376 SkIPoint* offset) { |
| 1376 GrAssert(filter); | 1377 GrAssert(filter); |
| 1377 SkDeviceImageFilterProxy proxy(device); | 1378 SkDeviceImageFilterProxy proxy(device); |
| 1378 | 1379 |
| 1379 if (filter->canFilterImageGPU()) { | 1380 if (filter->canFilterImageGPU()) { |
| 1380 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the | 1381 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the |
| 1381 // filter. Also set the clip wide open and the matrix to identity. | 1382 // filter. Also set the clip wide open and the matrix to identity. |
| 1382 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); | 1383 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); |
| 1383 return filter->filterImageGPU(&proxy, wrap_texture(texture), result, off
set); | 1384 return filter->filterImageGPU(&proxy, wrap_texture(texture), ctm, result
, offset); |
| 1384 } else { | 1385 } else { |
| 1385 return false; | 1386 return false; |
| 1386 } | 1387 } |
| 1387 } | 1388 } |
| 1388 | 1389 |
| 1389 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 1390 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
| 1390 int left, int top, const SkPaint& paint) { | 1391 int left, int top, const SkPaint& paint) { |
| 1391 // drawSprite is defined to be in device coords. | 1392 // drawSprite is defined to be in device coords. |
| 1392 CHECK_SHOULD_DRAW(draw, true); | 1393 CHECK_SHOULD_DRAW(draw, true); |
| 1393 | 1394 |
| 1394 SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); | 1395 SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); |
| 1395 if (!bitmap.getTexture() && !bitmap.readyToDraw()) { | 1396 if (!bitmap.getTexture() && !bitmap.readyToDraw()) { |
| 1396 return; | 1397 return; |
| 1397 } | 1398 } |
| 1398 | 1399 |
| 1399 int w = bitmap.width(); | 1400 int w = bitmap.width(); |
| 1400 int h = bitmap.height(); | 1401 int h = bitmap.height(); |
| 1401 | 1402 |
| 1402 GrTexture* texture; | 1403 GrTexture* texture; |
| 1403 // draw sprite uses the default texture params | 1404 // draw sprite uses the default texture params |
| 1404 SkAutoCachedTexture act(this, bitmap, NULL, &texture); | 1405 SkAutoCachedTexture act(this, bitmap, NULL, &texture); |
| 1405 | 1406 |
| 1406 SkImageFilter* filter = paint.getImageFilter(); | 1407 SkImageFilter* filter = paint.getImageFilter(); |
| 1407 SkIPoint offset = SkIPoint::Make(left, top); | 1408 SkIPoint offset = SkIPoint::Make(left, top); |
| 1408 // This bitmap will own the filtered result as a texture. | 1409 // This bitmap will own the filtered result as a texture. |
| 1409 SkBitmap filteredBitmap; | 1410 SkBitmap filteredBitmap; |
| 1410 | 1411 |
| 1411 if (NULL != filter) { | 1412 if (NULL != filter) { |
| 1412 if (filter_texture(this, fContext, texture, filter, w, h, &filteredBitma
p, &offset)) { | 1413 if (filter_texture(this, fContext, texture, filter, w, h, SkMatrix::I(),
&filteredBitmap, |
| 1414 &offset)) { |
| 1413 texture = (GrTexture*) filteredBitmap.getTexture(); | 1415 texture = (GrTexture*) filteredBitmap.getTexture(); |
| 1414 w = filteredBitmap.width(); | 1416 w = filteredBitmap.width(); |
| 1415 h = filteredBitmap.height(); | 1417 h = filteredBitmap.height(); |
| 1416 } else { | 1418 } else { |
| 1417 return; | 1419 return; |
| 1418 } | 1420 } |
| 1419 } | 1421 } |
| 1420 | 1422 |
| 1421 GrPaint grPaint; | 1423 GrPaint grPaint; |
| 1422 grPaint.addColorTextureEffect(texture, SkMatrix::I()); | 1424 grPaint.addColorTextureEffect(texture, SkMatrix::I()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1487 const SkBitmap& bm = dev->accessBitmap(false); | 1489 const SkBitmap& bm = dev->accessBitmap(false); |
| 1488 int w = bm.width(); | 1490 int w = bm.width(); |
| 1489 int h = bm.height(); | 1491 int h = bm.height(); |
| 1490 | 1492 |
| 1491 SkImageFilter* filter = paint.getImageFilter(); | 1493 SkImageFilter* filter = paint.getImageFilter(); |
| 1492 // This bitmap will own the filtered result as a texture. | 1494 // This bitmap will own the filtered result as a texture. |
| 1493 SkBitmap filteredBitmap; | 1495 SkBitmap filteredBitmap; |
| 1494 | 1496 |
| 1495 if (NULL != filter) { | 1497 if (NULL != filter) { |
| 1496 SkIPoint offset = SkIPoint::Make(0, 0); | 1498 SkIPoint offset = SkIPoint::Make(0, 0); |
| 1497 if (filter_texture(this, fContext, devTex, filter, w, h, &filteredBitmap
, &offset)) { | 1499 if (filter_texture(this, fContext, devTex, filter, w, h, SkMatrix::I(),
&filteredBitmap, |
| 1500 &offset)) { |
| 1498 devTex = filteredBitmap.getTexture(); | 1501 devTex = filteredBitmap.getTexture(); |
| 1499 w = filteredBitmap.width(); | 1502 w = filteredBitmap.width(); |
| 1500 h = filteredBitmap.height(); | 1503 h = filteredBitmap.height(); |
| 1501 x += offset.fX; | 1504 x += offset.fX; |
| 1502 y += offset.fY; | 1505 y += offset.fY; |
| 1503 } else { | 1506 } else { |
| 1504 return; | 1507 return; |
| 1505 } | 1508 } |
| 1506 } | 1509 } |
| 1507 | 1510 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1540 SkAutoLockPixels alp(src, !src.getTexture()); | 1543 SkAutoLockPixels alp(src, !src.getTexture()); |
| 1541 if (!src.getTexture() && !src.readyToDraw()) { | 1544 if (!src.getTexture() && !src.readyToDraw()) { |
| 1542 return false; | 1545 return false; |
| 1543 } | 1546 } |
| 1544 | 1547 |
| 1545 GrTexture* texture; | 1548 GrTexture* texture; |
| 1546 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup | 1549 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup |
| 1547 // must be pushed upstack. | 1550 // must be pushed upstack. |
| 1548 SkAutoCachedTexture act(this, src, NULL, &texture); | 1551 SkAutoCachedTexture act(this, src, NULL, &texture); |
| 1549 | 1552 |
| 1550 return filter_texture(this, fContext, texture, filter, src.width(), src.heig
ht(), result, offset); | 1553 return filter_texture(this, fContext, texture, filter, src.width(), src.heig
ht(), ctm, result, |
| 1554 offset); |
| 1551 } | 1555 } |
| 1552 | 1556 |
| 1553 /////////////////////////////////////////////////////////////////////////////// | 1557 /////////////////////////////////////////////////////////////////////////////// |
| 1554 | 1558 |
| 1555 // must be in SkCanvas::VertexMode order | 1559 // must be in SkCanvas::VertexMode order |
| 1556 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1560 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { |
| 1557 kTriangles_GrPrimitiveType, | 1561 kTriangles_GrPrimitiveType, |
| 1558 kTriangleStrip_GrPrimitiveType, | 1562 kTriangleStrip_GrPrimitiveType, |
| 1559 kTriangleFan_GrPrimitiveType, | 1563 kTriangleFan_GrPrimitiveType, |
| 1560 }; | 1564 }; |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1784 GrTexture* texture, | 1788 GrTexture* texture, |
| 1785 bool needClear) | 1789 bool needClear) |
| 1786 : SkDevice(make_bitmap(context, texture->asRenderTarget())) { | 1790 : SkDevice(make_bitmap(context, texture->asRenderTarget())) { |
| 1787 | 1791 |
| 1788 GrAssert(texture && texture->asRenderTarget()); | 1792 GrAssert(texture && texture->asRenderTarget()); |
| 1789 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture | 1793 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture |
| 1790 // cache. We pass true for the third argument so that it will get unlocked. | 1794 // cache. We pass true for the third argument so that it will get unlocked. |
| 1791 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 1795 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
| 1792 fNeedClear = needClear; | 1796 fNeedClear = needClear; |
| 1793 } | 1797 } |
| OLD | NEW |