aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkPixmap.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-10-17 18:04:32 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-17 18:04:43 +0000
commit437986946125823e674cf08270baa7964aae08f3 (patch)
treecf6b9f1729e76bee7240877bf161c2af1bc9657e /src/core/SkPixmap.cpp
parentfa2d604a7ded95a3ace905519b476129cd0fffcb (diff)
Revert[4] "apply codec origin in generator"
This reverts commit dd340146f1fe7414702d6fea251da989d425691e. Reason for revert: ios gn file fixed Original change's description: > Revert "Revert "Revert "apply codec origin in generator""" > > This reverts commit 82269abfec798621c8dbbc6bd48996c0b2686f41. > > Reason for revert: ios build needs include path for SkCodec.h > > Original change's description: > > Revert "Revert "apply codec origin in generator"" > > > > This reverts commit 363dd988a55c2ed3fa92e2368c1c889101425734. > > > > Reason for revert: pdfium fix landed > > > > Original change's description: > > > Revert "apply codec origin in generator" > > > > > > This reverts commit fa15877f487333bec876e7315cf584c0d598d098. > > > > > > Reason for revert: Appears to break PDFium. > > > > > > Original change's description: > > > > apply codec origin in generator > > > > > > > > Bug: skia: > > > > Change-Id: I383dacb49b1e3c88467ccdbf3288764bb1bbf01a > > > > Reviewed-on: https://skia-review.googlesource.com/58600 > > > > Reviewed-by: Leon Scroggins <scroggo@google.com> > > > > Commit-Queue: Mike Reed <reed@google.com> > > > > > > TBR=scroggo@google.com,reed@google.com > > > > > > Change-Id: Id97137d6ec39ca638c941928bae6510814b1c499 > > > No-Presubmit: true > > > No-Tree-Checks: true > > > No-Try: true > > > Bug: skia: > > > Reviewed-on: https://skia-review.googlesource.com/60041 > > > Reviewed-by: Ben Wagner <benjaminwagner@google.com> > > > Commit-Queue: Ben Wagner <benjaminwagner@google.com> > > > > TBR=benjaminwagner@google.com,scroggo@google.com,reed@google.com > > > > Change-Id: I1b54a6e6e6cbda07f346ffbbc4977f9db705abcd > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Bug: skia: > > Reviewed-on: https://skia-review.googlesource.com/60320 > > Reviewed-by: Mike Reed <reed@google.com> > > Commit-Queue: Mike Reed <reed@google.com> > > TBR=benjaminwagner@google.com,scroggo@google.com,reed@google.com > > Change-Id: I4c2d310521d1a678b407d30b9fe3c261c49d67bc > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia: > Reviewed-on: https://skia-review.googlesource.com/60560 > Reviewed-by: Mike Reed <reed@google.com> > Commit-Queue: Mike Reed <reed@google.com> TBR=benjaminwagner@google.com,scroggo@google.com,reed@google.com Change-Id: I5c1e53aff3ad174b0d4a806c35b7cdcd194479d7 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/60563 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkPixmap.cpp')
-rw-r--r--src/core/SkPixmap.cpp82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index 1cee0a9d02..7ce97d23f2 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -15,9 +15,10 @@
#include "SkMask.h"
#include "SkNx.h"
#include "SkPM4f.h"
-#include "SkPixmap.h"
+#include "SkPixmapPriv.h"
#include "SkReadPixelsRec.h"
#include "SkSurface.h"
+#include "SkTemplates.h"
#include "SkUtils.h"
/////////////////////////////////////////////////////////////////////////////////////////////////
@@ -381,3 +382,82 @@ bool SkPixmap::computeIsOpaque() const {
}
return false;
}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+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 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;
+ }
+ return true;
+}
+
+bool SkPixmapPriv::Orient(const SkPixmap& dst, const SkPixmap& src, OrientFlags flags) {
+ SkASSERT((flags & ~(kMirrorX | kMirrorY | kSwapXY)) == 0);
+ if (src.colorType() != dst.colorType()) {
+ return false;
+ }
+ // note: we just ignore alphaType and colorSpace for this transformation
+
+ int w = src.width();
+ int h = src.height();
+ if (flags & kSwapXY) {
+ SkTSwap(w, h);
+ }
+ if (dst.width() != w || dst.height() != h) {
+ return false;
+ }
+ if (w == 0 || h == 0) {
+ return true;
+ }
+
+ // check for aliasing to self
+ if (src.addr() == dst.addr()) {
+ return flags == 0;
+ }
+ return apply_orientation(dst, src, flags);
+}
+