aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
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 /src
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>
Diffstat (limited to 'src')
-rw-r--r--src/core/SkPixmap.cpp75
1 files changed, 30 insertions, 45 deletions
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);
}