| OLD | NEW | 
|---|
| 1 | 1 | 
| 2 /* | 2 /* | 
| 3  * Copyright 2011 Google Inc. | 3  * Copyright 2011 Google Inc. | 
| 4  * | 4  * | 
| 5  * Use of this source code is governed by a BSD-style license that can be | 5  * Use of this source code is governed by a BSD-style license that can be | 
| 6  * found in the LICENSE file. | 6  * found in the LICENSE file. | 
| 7  */ | 7  */ | 
| 8 | 8 | 
| 9 | 9 | 
| 10 #include "GrContext.h" | 10 #include "GrContext.h" | 
| 11 | 11 | 
| 12 #include "effects/GrSingleTextureEffect.h" | 12 #include "effects/GrSingleTextureEffect.h" | 
| 13 #include "effects/GrConfigConversionEffect.h" | 13 #include "effects/GrConfigConversionEffect.h" | 
| 14 | 14 | 
| 15 #include "GrAARectRenderer.h" | 15 #include "GrAARectRenderer.h" | 
| 16 #include "GrBufferAllocPool.h" | 16 #include "GrBufferAllocPool.h" | 
| 17 #include "GrGpu.h" | 17 #include "GrGpu.h" | 
| 18 #include "GrDrawTargetCaps.h" | 18 #include "GrDrawTargetCaps.h" | 
| 19 #include "GrIndexBuffer.h" | 19 #include "GrIndexBuffer.h" | 
| 20 #include "GrInOrderDrawBuffer.h" | 20 #include "GrInOrderDrawBuffer.h" | 
| 21 #include "GrOvalRenderer.h" | 21 #include "GrOvalRenderer.h" | 
| 22 #include "GrPathRenderer.h" | 22 #include "GrPathRenderer.h" | 
| 23 #include "GrPathUtils.h" | 23 #include "GrPathUtils.h" | 
| 24 #include "GrResourceCache.h" | 24 #include "GrResourceCache.h" | 
| 25 #include "GrSoftwarePathRenderer.h" | 25 #include "GrSoftwarePathRenderer.h" | 
| 26 #include "GrStencilBuffer.h" | 26 #include "GrStencilBuffer.h" | 
| 27 #include "GrTextStrike.h" | 27 #include "GrTextStrike.h" | 
| 28 #include "SkGr.h" |  | 
| 29 #include "SkRTConf.h" | 28 #include "SkRTConf.h" | 
| 30 #include "SkRRect.h" | 29 #include "SkRRect.h" | 
| 31 #include "SkStrokeRec.h" | 30 #include "SkStrokeRec.h" | 
| 32 #include "SkTLazy.h" | 31 #include "SkTLazy.h" | 
| 33 #include "SkTLS.h" | 32 #include "SkTLS.h" | 
| 34 #include "SkTraceEvent.h" | 33 #include "SkTraceEvent.h" | 
| 35 | 34 | 
| 36 // It can be useful to set this to false to test whether a bug is caused by usin
      g the | 35 // It can be useful to set this to false to test whether a bug is caused by usin
      g the | 
| 37 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe
      r, or to make | 36 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe
      r, or to make | 
| 38 // debugging simpler. | 37 // debugging simpler. | 
| (...skipping 1214 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1253                                                 config, buffer, rowBytes, | 1252                                                 config, buffer, rowBytes, | 
| 1254                                                 flags); | 1253                                                 flags); | 
| 1255         } | 1254         } | 
| 1256 | 1255 | 
| 1257         return false; | 1256         return false; | 
| 1258     } | 1257     } | 
| 1259 } | 1258 } | 
| 1260 | 1259 | 
| 1261 #include "SkConfig8888.h" | 1260 #include "SkConfig8888.h" | 
| 1262 | 1261 | 
| 1263 // toggles between RGBA and BGRA | 1262 namespace { | 
| 1264 static SkColorType toggle_colortype32(SkColorType ct) { | 1263 /** | 
| 1265     if (kRGBA_8888_SkColorType == ct) { | 1264  * Converts a GrPixelConfig to a SkCanvas::Config8888. Only byte-per-channel | 
| 1266         return kBGRA_8888_SkColorType; | 1265  * formats are representable as Config8888 and so the function returns false | 
| 1267     } else { | 1266  * if the GrPixelConfig has no equivalent Config8888. | 
| 1268         SkASSERT(kBGRA_8888_SkColorType == ct); | 1267  */ | 
| 1269         return kRGBA_8888_SkColorType; | 1268 bool grconfig_to_config8888(GrPixelConfig config, | 
|  | 1269                             bool unpremul, | 
|  | 1270                             SkCanvas::Config8888* config8888) { | 
|  | 1271     switch (config) { | 
|  | 1272         case kRGBA_8888_GrPixelConfig: | 
|  | 1273             if (unpremul) { | 
|  | 1274                 *config8888 = SkCanvas::kRGBA_Unpremul_Config8888; | 
|  | 1275             } else { | 
|  | 1276                 *config8888 = SkCanvas::kRGBA_Premul_Config8888; | 
|  | 1277             } | 
|  | 1278             return true; | 
|  | 1279         case kBGRA_8888_GrPixelConfig: | 
|  | 1280             if (unpremul) { | 
|  | 1281                 *config8888 = SkCanvas::kBGRA_Unpremul_Config8888; | 
|  | 1282             } else { | 
|  | 1283                 *config8888 = SkCanvas::kBGRA_Premul_Config8888; | 
|  | 1284             } | 
|  | 1285             return true; | 
|  | 1286         default: | 
|  | 1287             return false; | 
| 1270     } | 1288     } | 
| 1271 } | 1289 } | 
| 1272 | 1290 | 
|  | 1291 // It returns a configuration with where the byte position of the R & B componen
      ts are swapped in | 
|  | 1292 // relation to the input config. This should only be called with the result of | 
|  | 1293 // grconfig_to_config8888 as it will fail for other configs. | 
|  | 1294 SkCanvas::Config8888 swap_config8888_red_and_blue(SkCanvas::Config8888 config888
      8) { | 
|  | 1295     switch (config8888) { | 
|  | 1296         case SkCanvas::kBGRA_Premul_Config8888: | 
|  | 1297             return SkCanvas::kRGBA_Premul_Config8888; | 
|  | 1298         case SkCanvas::kBGRA_Unpremul_Config8888: | 
|  | 1299             return SkCanvas::kRGBA_Unpremul_Config8888; | 
|  | 1300         case SkCanvas::kRGBA_Premul_Config8888: | 
|  | 1301             return SkCanvas::kBGRA_Premul_Config8888; | 
|  | 1302         case SkCanvas::kRGBA_Unpremul_Config8888: | 
|  | 1303             return SkCanvas::kBGRA_Unpremul_Config8888; | 
|  | 1304         default: | 
|  | 1305             GrCrash("Unexpected input"); | 
|  | 1306             return SkCanvas::kBGRA_Unpremul_Config8888;; | 
|  | 1307     } | 
|  | 1308 } | 
|  | 1309 } | 
|  | 1310 | 
| 1273 bool GrContext::readRenderTargetPixels(GrRenderTarget* target, | 1311 bool GrContext::readRenderTargetPixels(GrRenderTarget* target, | 
| 1274                                        int left, int top, int width, int height, | 1312                                        int left, int top, int width, int height, | 
| 1275                                        GrPixelConfig dstConfig, void* buffer, si
      ze_t rowBytes, | 1313                                        GrPixelConfig dstConfig, void* buffer, si
      ze_t rowBytes, | 
| 1276                                        uint32_t flags) { | 1314                                        uint32_t flags) { | 
| 1277     ASSERT_OWNED_RESOURCE(target); | 1315     ASSERT_OWNED_RESOURCE(target); | 
| 1278 | 1316 | 
| 1279     if (NULL == target) { | 1317     if (NULL == target) { | 
| 1280         target = fRenderTarget.get(); | 1318         target = fRenderTarget.get(); | 
| 1281         if (NULL == target) { | 1319         if (NULL == target) { | 
| 1282             return false; | 1320             return false; | 
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1387             } | 1425             } | 
| 1388         } | 1426         } | 
| 1389     } | 1427     } | 
| 1390     if (!fGpu->readPixels(target, | 1428     if (!fGpu->readPixels(target, | 
| 1391                           left, top, width, height, | 1429                           left, top, width, height, | 
| 1392                           readConfig, buffer, rowBytes)) { | 1430                           readConfig, buffer, rowBytes)) { | 
| 1393         return false; | 1431         return false; | 
| 1394     } | 1432     } | 
| 1395     // Perform any conversions we weren't able to perform using a scratch textur
      e. | 1433     // Perform any conversions we weren't able to perform using a scratch textur
      e. | 
| 1396     if (unpremul || swapRAndB) { | 1434     if (unpremul || swapRAndB) { | 
| 1397         SkDstPixelInfo dstPI; | 1435         // These are initialized to suppress a warning | 
| 1398         if (!GrPixelConfig2ColorType(dstConfig, &dstPI.fColorType)) { | 1436         SkCanvas::Config8888 srcC8888 = SkCanvas::kNative_Premul_Config8888; | 
| 1399             return false; | 1437         SkCanvas::Config8888 dstC8888 = SkCanvas::kNative_Premul_Config8888; | 
|  | 1438 | 
|  | 1439         SkDEBUGCODE(bool c8888IsValid =) grconfig_to_config8888(dstConfig, false
      , &srcC8888); | 
|  | 1440         grconfig_to_config8888(dstConfig, unpremul, &dstC8888); | 
|  | 1441 | 
|  | 1442         if (swapRAndB) { | 
|  | 1443             SkASSERT(c8888IsValid); // we should only do r/b swap on 8888 config
      s | 
|  | 1444             srcC8888 = swap_config8888_red_and_blue(srcC8888); | 
| 1400         } | 1445         } | 
| 1401         dstPI.fAlphaType = kUnpremul_SkAlphaType; | 1446         SkASSERT(c8888IsValid); | 
| 1402         dstPI.fPixels = buffer; | 1447         uint32_t* b32 = reinterpret_cast<uint32_t*>(buffer); | 
| 1403         dstPI.fRowBytes = rowBytes; | 1448         SkConvertConfig8888Pixels(b32, rowBytes, dstC8888, | 
| 1404 | 1449                                   b32, rowBytes, srcC8888, | 
| 1405         SkSrcPixelInfo srcPI; | 1450                                   width, height); | 
| 1406         srcPI.fColorType = swapRAndB ? toggle_colortype32(dstPI.fColorType) : ds
      tPI.fColorType; |  | 
| 1407         srcPI.fAlphaType = kPremul_SkAlphaType; |  | 
| 1408         srcPI.fPixels = buffer; |  | 
| 1409         srcPI.fRowBytes = rowBytes; |  | 
| 1410 |  | 
| 1411         return srcPI.convertPixelsTo(&dstPI, width, height); |  | 
| 1412     } | 1451     } | 
| 1413     return true; | 1452     return true; | 
| 1414 } | 1453 } | 
| 1415 | 1454 | 
| 1416 void GrContext::resolveRenderTarget(GrRenderTarget* target) { | 1455 void GrContext::resolveRenderTarget(GrRenderTarget* target) { | 
| 1417     SkASSERT(target); | 1456     SkASSERT(target); | 
| 1418     ASSERT_OWNED_RESOURCE(target); | 1457     ASSERT_OWNED_RESOURCE(target); | 
| 1419     // In the future we may track whether there are any pending draws to this | 1458     // In the future we may track whether there are any pending draws to this | 
| 1420     // target. We don't today so we always perform a flush. We don't promise | 1459     // target. We don't today so we always perform a flush. We don't promise | 
| 1421     // this to our clients, though. | 1460     // this to our clients, though. | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1521     // allocate a tmp buffer and sw convert the pixels to premul | 1560     // allocate a tmp buffer and sw convert the pixels to premul | 
| 1522     SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); | 1561     SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); | 
| 1523 | 1562 | 
| 1524     if (kUnpremul_PixelOpsFlag & flags) { | 1563     if (kUnpremul_PixelOpsFlag & flags) { | 
| 1525         if (!GrPixelConfigIs8888(srcConfig)) { | 1564         if (!GrPixelConfigIs8888(srcConfig)) { | 
| 1526             return false; | 1565             return false; | 
| 1527         } | 1566         } | 
| 1528         effect.reset(this->createUPMToPMEffect(texture, swapRAndB, textureMatrix
      )); | 1567         effect.reset(this->createUPMToPMEffect(texture, swapRAndB, textureMatrix
      )); | 
| 1529         // handle the unpremul step on the CPU if we couldn't create an effect t
      o do it. | 1568         // handle the unpremul step on the CPU if we couldn't create an effect t
      o do it. | 
| 1530         if (NULL == effect) { | 1569         if (NULL == effect) { | 
| 1531             SkSrcPixelInfo srcPI; | 1570             SkCanvas::Config8888 srcConfig8888, dstConfig8888; | 
| 1532             if (!GrPixelConfig2ColorType(srcConfig, &srcPI.fColorType)) { | 1571             SkDEBUGCODE(bool success = ) | 
| 1533                 return false; | 1572             grconfig_to_config8888(srcConfig, true, &srcConfig8888); | 
| 1534             } | 1573             SkASSERT(success); | 
| 1535             srcPI.fAlphaType = kUnpremul_SkAlphaType; | 1574             SkDEBUGCODE(success = ) | 
| 1536             srcPI.fPixels = buffer; | 1575             grconfig_to_config8888(srcConfig, false, &dstConfig8888); | 
| 1537             srcPI.fRowBytes = rowBytes; | 1576             SkASSERT(success); | 
| 1538 | 1577             const uint32_t* src = reinterpret_cast<const uint32_t*>(buffer); | 
| 1539             SkDstPixelInfo dstPI; | 1578             tmpPixels.reset(width * height); | 
| 1540             dstPI.fColorType = srcPI.fColorType; | 1579             SkConvertConfig8888Pixels(tmpPixels.get(), 4 * width, dstConfig8888, | 
| 1541             dstPI.fAlphaType = kPremul_SkAlphaType; | 1580                                       src, rowBytes, srcConfig8888, | 
| 1542             dstPI.fPixels = tmpPixels.get(); | 1581                                       width, height); | 
| 1543             dstPI.fRowBytes = 4 * width; |  | 
| 1544 |  | 
| 1545             if (!srcPI.convertPixelsTo(&dstPI, width, height)) { |  | 
| 1546                 return false; |  | 
| 1547             } |  | 
| 1548 |  | 
| 1549             buffer = tmpPixels.get(); | 1582             buffer = tmpPixels.get(); | 
| 1550             rowBytes = 4 * width; | 1583             rowBytes = 4 * width; | 
| 1551         } | 1584         } | 
| 1552     } | 1585     } | 
| 1553     if (NULL == effect) { | 1586     if (NULL == effect) { | 
| 1554         effect.reset(GrConfigConversionEffect::Create(texture, | 1587         effect.reset(GrConfigConversionEffect::Create(texture, | 
| 1555                                                       swapRAndB, | 1588                                                       swapRAndB, | 
| 1556                                                       GrConfigConversionEffect::
      kNone_PMConversion, | 1589                                                       GrConfigConversionEffect::
      kNone_PMConversion, | 
| 1557                                                       textureMatrix)); | 1590                                                       textureMatrix)); | 
| 1558     } | 1591     } | 
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1766     } | 1799     } | 
| 1767     return path; | 1800     return path; | 
| 1768 } | 1801 } | 
| 1769 | 1802 | 
| 1770 /////////////////////////////////////////////////////////////////////////////// | 1803 /////////////////////////////////////////////////////////////////////////////// | 
| 1771 #if GR_CACHE_STATS | 1804 #if GR_CACHE_STATS | 
| 1772 void GrContext::printCacheStats() const { | 1805 void GrContext::printCacheStats() const { | 
| 1773     fTextureCache->printStats(); | 1806     fTextureCache->printStats(); | 
| 1774 } | 1807 } | 
| 1775 #endif | 1808 #endif | 
| OLD | NEW | 
|---|