Chromium Code Reviews| Index: src/gpu/GrContext.cpp |
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
| index c7e343393879798172444314c04534b29394bed1..9e51248b7b92bbbbffd4c2a0709e758b4ee7eee3 100644 |
| --- a/src/gpu/GrContext.cpp |
| +++ b/src/gpu/GrContext.cpp |
| @@ -25,6 +25,7 @@ |
| #include "GrSoftwarePathRenderer.h" |
| #include "GrStencilBuffer.h" |
| #include "GrTextStrike.h" |
| +#include "SkGr.h" |
| #include "SkRTConf.h" |
| #include "SkRRect.h" |
| #include "SkStrokeRec.h" |
| @@ -1264,54 +1265,14 @@ bool GrContext::readTexturePixels(GrTexture* texture, |
| #include "SkConfig8888.h" |
| -namespace { |
| -/** |
| - * Converts a GrPixelConfig to a SkCanvas::Config8888. Only byte-per-channel |
| - * formats are representable as Config8888 and so the function returns false |
| - * if the GrPixelConfig has no equivalent Config8888. |
| - */ |
| -bool grconfig_to_config8888(GrPixelConfig config, |
| - bool unpremul, |
| - SkCanvas::Config8888* config8888) { |
| - switch (config) { |
| - case kRGBA_8888_GrPixelConfig: |
| - if (unpremul) { |
| - *config8888 = SkCanvas::kRGBA_Unpremul_Config8888; |
| - } else { |
| - *config8888 = SkCanvas::kRGBA_Premul_Config8888; |
| - } |
| - return true; |
| - case kBGRA_8888_GrPixelConfig: |
| - if (unpremul) { |
| - *config8888 = SkCanvas::kBGRA_Unpremul_Config8888; |
| - } else { |
| - *config8888 = SkCanvas::kBGRA_Premul_Config8888; |
| - } |
| - return true; |
| - default: |
| - return false; |
| - } |
| -} |
| - |
| -// It returns a configuration with where the byte position of the R & B components are swapped in |
| -// relation to the input config. This should only be called with the result of |
| -// grconfig_to_config8888 as it will fail for other configs. |
| -SkCanvas::Config8888 swap_config8888_red_and_blue(SkCanvas::Config8888 config8888) { |
| - switch (config8888) { |
| - case SkCanvas::kBGRA_Premul_Config8888: |
| - return SkCanvas::kRGBA_Premul_Config8888; |
| - case SkCanvas::kBGRA_Unpremul_Config8888: |
| - return SkCanvas::kRGBA_Unpremul_Config8888; |
| - case SkCanvas::kRGBA_Premul_Config8888: |
| - return SkCanvas::kBGRA_Premul_Config8888; |
| - case SkCanvas::kRGBA_Unpremul_Config8888: |
| - return SkCanvas::kBGRA_Unpremul_Config8888; |
| - default: |
| - GrCrash("Unexpected input"); |
| - return SkCanvas::kBGRA_Unpremul_Config8888;; |
| +static SkColorType swapColorType32(SkColorType ct) { |
|
bsalomon
2014/03/19 12:36:48
In the Gr code we're mostly consistent about namin
reed1
2014/03/19 17:59:58
I think that's true in general everywhere, so I'll
|
| + if (kRGBA_8888_SkColorType == ct) { |
| + return kBGRA_8888_SkColorType; |
| + } else { |
| + SkASSERT(kBGRA_8888_SkColorType == ct); |
| + return kRGBA_8888_SkColorType; |
| } |
| } |
| -} |
| bool GrContext::readRenderTargetPixels(GrRenderTarget* target, |
| int left, int top, int width, int height, |
| @@ -1438,22 +1399,21 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target, |
| } |
| // Perform any conversions we weren't able to perform using a scratch texture. |
| if (unpremul || swapRAndB) { |
| - // These are initialized to suppress a warning |
| - SkCanvas::Config8888 srcC8888 = SkCanvas::kNative_Premul_Config8888; |
| - SkCanvas::Config8888 dstC8888 = SkCanvas::kNative_Premul_Config8888; |
| - |
| - SkDEBUGCODE(bool c8888IsValid =) grconfig_to_config8888(dstConfig, false, &srcC8888); |
| - grconfig_to_config8888(dstConfig, unpremul, &dstC8888); |
| - |
| - if (swapRAndB) { |
| - SkASSERT(c8888IsValid); // we should only do r/b swap on 8888 configs |
| - srcC8888 = swap_config8888_red_and_blue(srcC8888); |
| + SkPixelInfo dstPI; |
| + if (!GrPixelConfig2ColorType(dstConfig, &dstPI.fColorType)) { |
| + return false; |
| } |
| - SkASSERT(c8888IsValid); |
| - uint32_t* b32 = reinterpret_cast<uint32_t*>(buffer); |
| - SkConvertConfig8888Pixels(b32, rowBytes, dstC8888, |
| - b32, rowBytes, srcC8888, |
| - width, height); |
| + dstPI.fAlphaType = kUnpremul_SkAlphaType; |
| + dstPI.fPixels = buffer; |
| + dstPI.fRowBytes = rowBytes; |
| + |
| + SkPixelInfo srcPI; |
| + srcPI.fColorType = swapRAndB ? swapColorType32(dstPI.fColorType) : dstPI.fColorType; |
| + srcPI.fAlphaType = kPremul_SkAlphaType; |
| + dstPI.fPixels = buffer; |
| + dstPI.fRowBytes = rowBytes; |
| + |
| + return srcPI.convertPixelsTo(&dstPI, width, height); |
| } |
| return true; |
| } |
| @@ -1574,18 +1534,24 @@ bool GrContext::writeRenderTargetPixels(GrRenderTarget* target, |
| effect.reset(this->createUPMToPMEffect(texture, swapRAndB, textureMatrix)); |
| // handle the unpremul step on the CPU if we couldn't create an effect to do it. |
| if (NULL == effect) { |
| - SkCanvas::Config8888 srcConfig8888, dstConfig8888; |
| - SkDEBUGCODE(bool success = ) |
| - grconfig_to_config8888(srcConfig, true, &srcConfig8888); |
| - SkASSERT(success); |
| - SkDEBUGCODE(success = ) |
| - grconfig_to_config8888(srcConfig, false, &dstConfig8888); |
| - SkASSERT(success); |
| - const uint32_t* src = reinterpret_cast<const uint32_t*>(buffer); |
| - tmpPixels.reset(width * height); |
| - SkConvertConfig8888Pixels(tmpPixels.get(), 4 * width, dstConfig8888, |
| - src, rowBytes, srcConfig8888, |
| - width, height); |
| + SkPixelInfo srcPI; |
| + if (!GrPixelConfig2ColorType(srcConfig, &srcPI.fColorType)) { |
| + return false; |
| + } |
| + srcPI.fAlphaType = kUnpremul_SkAlphaType; |
| + srcPI.fPixels = const_cast<void*>(buffer); // we promist not to change this |
| + srcPI.fRowBytes = rowBytes; |
| + |
| + SkPixelInfo dstPI; |
| + dstPI.fColorType = srcPI.fColorType; |
| + dstPI.fAlphaType = kPremul_SkAlphaType; |
| + dstPI.fPixels = tmpPixels.get(); |
| + dstPI.fRowBytes = 4 * width; |
| + |
| + if (!srcPI.convertPixelsTo(&dstPI, width, height)) { |
| + return false; |
| + } |
| + |
| buffer = tmpPixels.get(); |
| rowBytes = 4 * width; |
| } |