diff options
author | Robert Phillips <robertphillips@google.com> | 2017-11-01 09:26:06 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-01 15:34:50 +0000 |
commit | 206bda5b79311da9a6ea0ee112302bf8115c41c5 (patch) | |
tree | 798732f6c9fcd2c5057cf3df459df25f99468eb4 /gm/flippity.cpp | |
parent | 61b43daa858f3e68c95bf972d510c2d66461b386 (diff) |
Update the texture flip GM to include subsets & scales
Bug: skia:7075
Change-Id: Idfb7d4d5f348d07ba9b3793d576b469127e5198c
Reviewed-on: https://skia-review.googlesource.com/65841
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'gm/flippity.cpp')
-rw-r--r-- | gm/flippity.cpp | 98 |
1 files changed, 65 insertions, 33 deletions
diff --git a/gm/flippity.cpp b/gm/flippity.cpp index 369f98deb9..53dfd25fec 100644 --- a/gm/flippity.cpp +++ b/gm/flippity.cpp @@ -18,16 +18,17 @@ static const int kNumMatrices = 6; static const int kImageSize = 128; static const int kLabelSize = 32; static const int kNumLabels = 4; +static const int kInset = 16; static const int kCellSize = kImageSize+2*kLabelSize; static const int kGMWidth = kNumMatrices*kCellSize; -static const int kGMHeight = 2*kCellSize; +static const int kGMHeight = 4*kCellSize; static const SkPoint kPoints[kNumLabels] = { - { 0, kImageSize }, // kLL - { kImageSize, kImageSize }, // kLR - { 0, 0 }, // kUL - { kImageSize, 0 }, // kUR + { 0, kImageSize }, // LL + { kImageSize, kImageSize }, // LR + { 0, 0 }, // UL + { kImageSize, 0 }, // UR }; static const SkMatrix kUVMatrices[kNumMatrices] = { @@ -54,6 +55,7 @@ static const SkMatrix kUVMatrices[kNumMatrices] = { 0, 0, 1) }; + // Create a fixed size text label like "LL" or "LR". static sk_sp<SkImage> make_text_image(GrContext* context, const char* text, SkColor color) { SkPaint paint; @@ -86,8 +88,9 @@ static SkColor swap_red_and_blue(SkColor c) { // Create an image with each corner marked w/ "LL", "LR", etc., with the origin either bottom-left // or top-left. -static sk_sp<SkImage> make_image(GrContext* context, const SkTArray<sk_sp<SkImage>>& labels, - bool bottomLeftOrigin) { +static sk_sp<SkImage> make_reference_image(GrContext* context, + const SkTArray<sk_sp<SkImage>>& labels, + bool bottomLeftOrigin) { SkASSERT(kNumLabels == labels.count()); SkImageInfo ii = SkImageInfo::Make(kImageSize, kImageSize, @@ -99,8 +102,8 @@ static sk_sp<SkImage> make_image(GrContext* context, const SkTArray<sk_sp<SkImag canvas.clear(SK_ColorWHITE); for (int i = 0; i < kNumLabels; ++i) { canvas.drawImage(labels[i], - 0.0 != kPoints[i].fX ? kPoints[i].fX-kLabelSize : 0, - 0.0 != kPoints[i].fY ? kPoints[i].fY-kLabelSize : 0); + 0.0 != kPoints[i].fX ? kPoints[i].fX-kLabelSize-kInset : kInset, + 0.0 != kPoints[i].fY ? kPoints[i].fY-kLabelSize-kInset : kInset); } GrSurfaceDesc desc; @@ -141,8 +144,14 @@ static sk_sp<SkImage> make_image(GrContext* context, const SkTArray<sk_sp<SkImag // other but we also need a scale to map from the [0..1] uv range to the actual size of // image. static bool UVMatToGeomMatForImage(SkMatrix* geomMat, const SkMatrix& uvMat) { + + const SkMatrix yFlip = SkMatrix::MakeAll(1, 0, 0, 0, -1, 1, 0, 0, 1); + SkMatrix tmp = uvMat; + tmp.preConcat(yFlip); tmp.preScale(1.0f/kImageSize, 1.0f/kImageSize); + + tmp.postConcat(yFlip); tmp.postScale(kImageSize, kImageSize); return tmp.invert(geomMat); @@ -167,15 +176,32 @@ protected: } // Draw the reference image and the four corner labels in the matrix's coordinate space - void drawImageWithMatrixAndLabels(SkCanvas* canvas, SkImage* image, int matIndex) { + void drawImageWithMatrixAndLabels(SkCanvas* canvas, SkImage* image, int matIndex, + bool drawSubset, bool drawScaled) { + static const SkRect kSubsets[kNumMatrices] = { + SkRect::MakeXYWH(kInset, 0, kImageSize-kInset, kImageSize), + SkRect::MakeXYWH(0, kInset, kImageSize, kImageSize-kInset), + SkRect::MakeXYWH(0, 0, kImageSize-kInset, kImageSize), + SkRect::MakeXYWH(0, 0, kImageSize, kImageSize-kInset), + SkRect::MakeXYWH(kInset/2, kInset/2, kImageSize-kInset, kImageSize-kInset), + SkRect::MakeXYWH(kInset, kInset, kImageSize-2*kInset, kImageSize-2*kInset), + }; + SkMatrix imageGeomMat; SkAssertResult(UVMatToGeomMatForImage(&imageGeomMat, kUVMatrices[matIndex])); canvas->save(); - canvas->concat(imageGeomMat); // draw the reference image - canvas->drawImage(image, 0, 0); + canvas->concat(imageGeomMat); + if (drawSubset) { + canvas->drawImageRect(image, kSubsets[matIndex], + drawScaled ? SkRect::MakeWH(kImageSize, kImageSize) + : kSubsets[matIndex], + nullptr, SkCanvas::kFast_SrcRectConstraint); + } else { + canvas->drawImage(image, 0, 0); + } // draw the labels for (int i = 0; i < kNumLabels; ++i) { @@ -186,6 +212,22 @@ protected: canvas->restore(); } + void drawRow(GrContext* context, SkCanvas* canvas, + bool bottomLeftImage, bool drawSubset, bool drawScaled) { + + sk_sp<SkImage> referenceImage = make_reference_image(context, fLabels, bottomLeftImage); + + canvas->save(); + canvas->translate(kLabelSize, kLabelSize); + + for (int i = 0; i < kNumMatrices; ++i) { + this->drawImageWithMatrixAndLabels(canvas, referenceImage.get(), i, + drawSubset, drawScaled); + canvas->translate(kCellSize, 0); + } + canvas->restore(); + } + void makeLabels(GrContext* context) { static const char* kLabelText[kNumLabels] = { "LL", "LR", "UL", "UR" }; @@ -213,32 +255,22 @@ protected: this->makeLabels(context); // Top row gets TL image - { - sk_sp<SkImage> referenceImage = make_image(context, fLabels, false); + this->drawRow(context, canvas, false, false, false); - canvas->save(); - canvas->translate(kLabelSize, kLabelSize); - - for (int i = 0; i < kNumMatrices; ++i) { - this->drawImageWithMatrixAndLabels(canvas, referenceImage.get(), i); - canvas->translate(kImageSize+2*kLabelSize, 0); - } - canvas->restore(); - } + canvas->translate(0, kCellSize); // Bottom row gets BL image - { - sk_sp<SkImage> referenceImage = make_image(context, fLabels, true); + this->drawRow(context, canvas, true, false, false); - canvas->save(); - canvas->translate(kLabelSize, kImageSize+3*kLabelSize); + canvas->translate(0, kCellSize); - for (int i = 0; i < kNumMatrices; ++i) { - this->drawImageWithMatrixAndLabels(canvas, referenceImage.get(), i); - canvas->translate(kCellSize, 0); - } - canvas->restore(); - } + // Third row gets subsets of BL images + this->drawRow(context, canvas, true, true, false); + + canvas->translate(0, kCellSize); + + // Fourth row gets scaled subsets of BL images + this->drawRow(context, canvas, true, true, true); // separator grid canvas->drawLine(0, kCellSize, kGMWidth, kCellSize, SkPaint()); |