diff options
author | Matt Sarett <msarett@google.com> | 2017-01-17 10:48:53 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-17 16:23:47 +0000 |
commit | cb6266b5aa5bbfd880532f08eec83b0c585e873f (patch) | |
tree | ed7f02bf09e3ac603ab6b9b579b76fb1f3f85f68 /gm/showmiplevels.cpp | |
parent | aab259ea9ecabb3addcade3fba72d777bc7673e8 (diff) |
Reland "Add SkImageInfoValidConversion() and SkImageInfoIsValid"
The original is at:
https://skia-review.googlesource.com/c/6887/
The only change to the original is to temporarily comment out
a check in SkImageInfoPriv.h until a Chrome unit test can
be fixed.
The idea is share these standards for the following:
SkImage::readPixels()
SkCanvas::readPixels()
SkCanvas::writePixels()
SkBitmap::readPixels()
SkPixmap::readPixels()
On the raster side, SkPixmap::readPixels() is the right
place to check, because all raster calls go through
there eventually. Then at lower levels (ex: SkPixelInfo),
we can assert.
There's not really a unifying location for gpu calls,
so I've added this in multiple places. I haven't really
dug into the gpu code to SkASSERT() on invalid cases
that we will have already caught.
Follow-up work:
Similar refactor for SkReadPixelRec::trim().
Code cleanup in SkPixelInfo::CopyPixels()
BUG=skia:6021
Change-Id: I6a16f9479bc09e3c87e10c72b0378579f1a70866
Reviewed-on: https://skia-review.googlesource.com/7104
Reviewed-by: Matt Sarett <msarett@google.com>
Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'gm/showmiplevels.cpp')
-rw-r--r-- | gm/showmiplevels.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/gm/showmiplevels.cpp b/gm/showmiplevels.cpp index a4fd16404f..0394b57318 100644 --- a/gm/showmiplevels.cpp +++ b/gm/showmiplevels.cpp @@ -216,6 +216,46 @@ DEF_GM( return new ShowMipLevels(256); ) /////////////////////////////////////////////////////////////////////////////////////////////////// +static void copy_32_to_g8(void* dst, size_t dstRB, const void* src, const SkImageInfo& srcInfo, + size_t srcRB) { + uint8_t* dst8 = (uint8_t*)dst; + const uint32_t* src32 = (const uint32_t*)src; + + const int w = srcInfo.width(); + const int h = srcInfo.height(); + const bool isBGRA = (kBGRA_8888_SkColorType == srcInfo.colorType()); + + for (int y = 0; y < h; ++y) { + if (isBGRA) { + // BGRA + for (int x = 0; x < w; ++x) { + uint32_t s = src32[x]; + dst8[x] = SkComputeLuminance((s >> 16) & 0xFF, (s >> 8) & 0xFF, s & 0xFF); + } + } else { + // RGBA + for (int x = 0; x < w; ++x) { + uint32_t s = src32[x]; + dst8[x] = SkComputeLuminance(s & 0xFF, (s >> 8) & 0xFF, (s >> 16) & 0xFF); + } + } + src32 = (const uint32_t*)((const char*)src32 + srcRB); + dst8 += dstRB; + } +} + +void copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) { + if (kGray_8_SkColorType == dstColorType) { + SkImageInfo grayInfo = src.info().makeColorType(kGray_8_SkColorType); + dst->allocPixels(grayInfo); + copy_32_to_g8(dst->getPixels(), dst->rowBytes(), src.getPixels(), src.info(), + src.rowBytes()); + return; + } + + src.copyTo(dst, dstColorType); +} + /** * Show mip levels that were built, for all supported colortypes */ @@ -283,7 +323,7 @@ protected: for (auto ctype : ctypes) { SkBitmap bm; - orig.copyTo(&bm, ctype); + copy_to(&bm, ctype, orig); drawLevels(canvas, bm); canvas->translate(orig.width()/2 + 8.0f, 0); } |