Index: gm/yuvtorgbeffect.cpp |
diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp |
index 7fc8ff411bbbed51f4cfc55866871964a1fc954e..a153c991fc548c1ff298f17a6edf299ab833f9ad 100644 |
--- a/gm/yuvtorgbeffect.cpp |
+++ b/gm/yuvtorgbeffect.cpp |
@@ -115,12 +115,9 @@ protected: |
for (int i = 0; i < 6; ++i) { |
GrPipelineBuilder pipelineBuilder; |
pipelineBuilder.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode)); |
- sk_sp<GrFragmentProcessor> fp( |
- GrYUVEffect::MakeYUVToRGB(texture[indices[i][0]], |
- texture[indices[i][1]], |
- texture[indices[i][2]], |
- sizes, |
- static_cast<SkYUVColorSpace>(space))); |
+ sk_sp<GrFragmentProcessor> fp(GrYUVEffect::MakeYUVToRGB( |
+ texture[indices[i][0]], texture[indices[i][1]], texture[indices[i][2]], sizes, |
+ static_cast<SkYUVColorSpace>(space), false)); |
if (fp) { |
SkMatrix viewMatrix; |
viewMatrix.setTranslate(x, y); |
@@ -142,6 +139,115 @@ private: |
}; |
DEF_GM(return new YUVtoRGBEffect;) |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+class YUVNV12toRGBEffect : public GM { |
+public: |
+ YUVNV12toRGBEffect() { |
+ this->setBGColor(0xFFFFFFFF); |
+ } |
+ |
+protected: |
+ SkString onShortName() override { |
+ return SkString("yuv_nv12_to_rgb_effect"); |
+ } |
+ |
+ SkISize onISize() override { |
+ return SkISize::Make(48, 120); |
+ } |
+ |
+ void onOnceBeforeDraw() override { |
+ SkImageInfo yinfo = SkImageInfo::MakeA8(YSIZE, YSIZE); |
+ fBmp[0].allocPixels(yinfo); |
+ SkImageInfo uvinfo = SkImageInfo::MakeN32Premul(USIZE, USIZE); |
+ fBmp[1].allocPixels(uvinfo); |
+ int color[] = {0, 85, 170}; |
+ const int limit[] = {255, 0, 255}; |
+ const int invl[] = {0, 255, 0}; |
+ const int inc[] = {1, -1, 1}; |
+ |
+ { |
+ unsigned char* pixels = (unsigned char*)fBmp[0].getPixels(); |
+ const size_t nbBytes = fBmp[0].rowBytes() * fBmp[0].height(); |
+ for (size_t j = 0; j < nbBytes; ++j) { |
+ pixels[j] = (unsigned char)color[0]; |
+ color[0] = (color[0] == limit[0]) ? invl[0] : color[0] + inc[0]; |
+ } |
+ } |
+ |
+ { |
+ for (int y = 0; y < fBmp[1].height(); ++y) { |
+ uint32_t* pixels = fBmp[1].getAddr32(0, y); |
+ for (int j = 0; j < fBmp[1].width(); ++j) { |
+ pixels[j] = SkColorSetARGB(0, color[1], color[2], 0); |
+ color[1] = (color[1] == limit[1]) ? invl[1] : color[1] + inc[1]; |
+ color[2] = (color[2] == limit[2]) ? invl[2] : color[2] + inc[2]; |
+ } |
+ } |
+ } |
+ } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); |
+ if (!drawContext) { |
+ skiagm::GM::DrawGpuOnlyMessage(canvas); |
+ return; |
+ } |
+ |
+ GrContext* context = canvas->getGrContext(); |
+ if (!context) { |
+ return; |
+ } |
+ |
+ SkAutoTUnref<GrTexture> texture[3]; |
+ texture[0].reset(GrRefCachedBitmapTexture(context, fBmp[0], GrTextureParams::ClampBilerp(), |
+ SkSourceGammaTreatment::kRespect)); |
+ texture[1].reset(GrRefCachedBitmapTexture(context, fBmp[1], GrTextureParams::ClampBilerp(), |
+ SkSourceGammaTreatment::kRespect)); |
+ texture[2].reset(GrRefCachedBitmapTexture(context, fBmp[1], GrTextureParams::ClampBilerp(), |
+ SkSourceGammaTreatment::kRespect)); |
+ |
+ if (!texture[0] || !texture[1] || !texture[2]) { |
+ return; |
+ } |
+ |
+ static const SkScalar kDrawPad = 10.f; |
+ static const SkScalar kTestPad = 10.f; |
+ static const SkScalar kColorSpaceOffset = 36.f; |
+ SkISize sizes[3] = {{YSIZE, YSIZE}, {USIZE, USIZE}, {VSIZE, VSIZE}}; |
+ |
+ for (int space = kJPEG_SkYUVColorSpace; space <= kLastEnum_SkYUVColorSpace; ++space) { |
+ SkRect renderRect = |
+ SkRect::MakeWH(SkIntToScalar(fBmp[0].width()), SkIntToScalar(fBmp[0].height())); |
+ renderRect.outset(kDrawPad, kDrawPad); |
+ |
+ SkScalar y = kDrawPad + kTestPad + space * kColorSpaceOffset; |
+ SkScalar x = kDrawPad + kTestPad; |
+ |
+ GrPipelineBuilder pipelineBuilder; |
+ pipelineBuilder.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode)); |
+ sk_sp<GrFragmentProcessor> fp( |
+ GrYUVEffect::MakeYUVToRGB(texture[0], texture[1], texture[2], sizes, |
+ static_cast<SkYUVColorSpace>(space), true)); |
+ if (fp) { |
+ SkMatrix viewMatrix; |
+ viewMatrix.setTranslate(x, y); |
+ pipelineBuilder.addColorFragmentProcessor(fp); |
+ SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill( |
+ GrColor_WHITE, viewMatrix, renderRect, nullptr, nullptr)); |
+ drawContext->drawContextPriv().testingOnly_drawBatch(pipelineBuilder, batch); |
+ } |
+ } |
+ } |
+ |
+private: |
+ SkBitmap fBmp[2]; |
+ |
+ typedef GM INHERITED; |
+}; |
+ |
+DEF_GM(return new YUVNV12toRGBEffect;) |
} |
#endif |