diff options
author | Mike Reed <reed@google.com> | 2017-10-25 10:37:30 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-25 16:56:08 +0000 |
commit | 7306bcd758fc35be2f4bf75063c4d50d0be8f853 (patch) | |
tree | 3b358d155c73f1d04cbcfeada5e441077a3867c6 | |
parent | f8e353d5eb97119f4dd44e65331f70d4a57ce7d9 (diff) |
- add bench for pixmap orient
- reduce code size by using a draw instead of custom blits
Bug: skia:
Change-Id: I90f9fb2abf40496e771f1f725556c178d730b590
Reviewed-on: https://skia-review.googlesource.com/62860
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
-rw-r--r-- | bench/ReadPixBench.cpp | 41 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 75 |
2 files changed, 70 insertions, 46 deletions
diff --git a/bench/ReadPixBench.cpp b/bench/ReadPixBench.cpp index 2a8e9c4df3..55078d96b6 100644 --- a/bench/ReadPixBench.cpp +++ b/bench/ReadPixBench.cpp @@ -62,7 +62,46 @@ private: typedef Benchmark INHERITED; }; +DEF_BENCH( return new ReadPixBench(); ) //////////////////////////////////////////////////////////////////////////////// +#include "SkBitmap.h" +#include "SkPixmapPriv.h" -DEF_BENCH( return new ReadPixBench(); ) +class PixmapOrientBench : public Benchmark { +public: + PixmapOrientBench() {} + +protected: + void onDelayedSetup() override { + const SkImageInfo info = SkImageInfo::MakeN32Premul(2048, 1024); + fSrc.allocPixels(info); + fSrc.eraseColor(SK_ColorBLACK); + fDst.allocPixels(info.makeWH(info.height(), info.width())); + } + + const char* onGetName() override { + return "orient_pixmap"; + } + + bool isSuitableFor(Backend backend) override { + return backend == kNonRendering_Backend; + } + + void onDraw(int loops, SkCanvas*) override { + const SkPixmapPriv::OrientFlags flags = SkPixmapPriv::kSwapXY; + + SkPixmap src, dst; + fSrc.peekPixels(&src); + fDst.peekPixels(&dst); + for (int i = 0; i < loops; ++i) { + SkPixmapPriv::Orient(dst, src, flags); + } + } + +private: + SkBitmap fSrc, fDst; + + typedef Benchmark INHERITED; +}; +DEF_BENCH( return new PixmapOrientBench(); ) diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index 7ce97d23f2..7e394b468f 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -385,53 +385,38 @@ bool SkPixmap::computeIsOpaque() const { ////////////////////////////////////////////////////////////////////////////////////////////////// -template <typename T, typename F> -void apply(const SkPixmap& dst, const SkPixmap& src, unsigned flags, F getAddr) { - const int maxX = dst.width() - 1; - const int maxY = dst.height() - 1; - T* dstRow = (T*)dst.writable_addr(); - for (int dy = 0; dy < dst.height(); ++dy) { - for (int dx = 0; dx < dst.width(); ++dx) { - int sx = dx; - int sy = dy; - if (flags & SkPixmapPriv::kMirrorX) { - sx = maxX - sx; - } - if (flags & SkPixmapPriv::kMirrorY) { - sy = maxY - sy; - } - if (flags & SkPixmapPriv::kSwapXY) { - SkTSwap<int>(sx, sy); - } - dstRow[dx] = getAddr(src, sx, sy); - } - dstRow = SkTAddOffset<T>(dstRow, dst.rowBytes()); +static bool draw_orientation(const SkPixmap& dst, const SkPixmap& src, unsigned flags) { + auto surf = SkSurface::MakeRasterDirect(dst.info(), dst.writable_addr(), dst.rowBytes()); + if (!surf) { + return false; } -} -static bool apply_orientation(const SkPixmap& dst, const SkPixmap& src, unsigned flags) { - SkASSERT(dst.colorType() == src.colorType()); - - switch (dst.info().bytesPerPixel()) { - case 1: - apply<uint8_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr8(x, y); - }); break; - case 2: - apply<uint16_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr16(x, y); - }); break; - case 4: - apply<uint32_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr32(x, y); - }); break; - case 8: - apply<uint64_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr64(x, y); - }); break; - default: - return false; + SkBitmap bm; + bm.installPixels(src); + + SkMatrix m; + m.setIdentity(); + + SkScalar W = SkIntToScalar(src.width()); + SkScalar H = SkIntToScalar(src.height()); + if (flags & SkPixmapPriv::kSwapXY) { + SkMatrix s; + s.setAll(0, 1, 0, 1, 0, 0, 0, 0, 1); + m.postConcat(s); + SkTSwap(W, H); + } + if (flags & SkPixmapPriv::kMirrorX) { + m.postScale(-1, 1); + m.postTranslate(W, 0); + } + if (flags & SkPixmapPriv::kMirrorY) { + m.postScale(1, -1); + m.postTranslate(0, H); } + SkPaint p; + p.setBlendMode(SkBlendMode::kSrc); + surf->getCanvas()->concat(m); + surf->getCanvas()->drawBitmap(bm, 0, 0, &p); return true; } @@ -458,6 +443,6 @@ bool SkPixmapPriv::Orient(const SkPixmap& dst, const SkPixmap& src, OrientFlags if (src.addr() == dst.addr()) { return flags == 0; } - return apply_orientation(dst, src, flags); + return draw_orientation(dst, src, flags); } |