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>
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index 1cee0a9..7ce97d2 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 @@
     }
     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);
+}
+