aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-10-25 10:37:30 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-25 16:56:08 +0000
commit7306bcd758fc35be2f4bf75063c4d50d0be8f853 (patch)
tree3b358d155c73f1d04cbcfeada5e441077a3867c6
parentf8e353d5eb97119f4dd44e65331f70d4a57ce7d9 (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.cpp41
-rw-r--r--src/core/SkPixmap.cpp75
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);
}