Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Unified Diff: gm/yuvtorgbeffect.cpp

Issue 2016593002: Add NV12 texture conversion support. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | include/core/SkImage.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | include/core/SkImage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698