summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/image_util/copyimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/image_util/copyimage.cpp')
-rw-r--r--gfx/angle/checkout/src/image_util/copyimage.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/image_util/copyimage.cpp b/gfx/angle/checkout/src/image_util/copyimage.cpp
new file mode 100644
index 0000000000..b5c2773e21
--- /dev/null
+++ b/gfx/angle/checkout/src/image_util/copyimage.cpp
@@ -0,0 +1,74 @@
+//
+// Copyright 2013 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// copyimage.cpp: Defines image copying functions
+
+#include "image_util/copyimage.h"
+
+namespace angle
+{
+
+namespace
+{
+inline uint32_t SwizzleBGRAToRGBA(uint32_t argb)
+{
+ return ((argb & 0x000000FF) << 16) | // Move BGRA blue to RGBA blue
+ ((argb & 0x00FF0000) >> 16) | // Move BGRA red to RGBA red
+ ((argb & 0xFF00FF00)); // Keep alpha and green
+}
+
+void CopyBGRA8ToRGBA8Fast(const uint8_t *source,
+ int srcYAxisPitch,
+ uint8_t *dest,
+ int destYAxisPitch,
+ int destWidth,
+ int destHeight)
+{
+ for (int y = 0; y < destHeight; ++y)
+ {
+ const uint32_t *src32 = reinterpret_cast<const uint32_t *>(source + y * srcYAxisPitch);
+ uint32_t *dest32 = reinterpret_cast<uint32_t *>(dest + y * destYAxisPitch);
+ const uint32_t *end32 = src32 + destWidth;
+ while (src32 != end32)
+ {
+ *dest32++ = SwizzleBGRAToRGBA(*src32++);
+ }
+ }
+}
+} // namespace
+
+void CopyBGRA8ToRGBA8(const uint8_t *source,
+ int srcXAxisPitch,
+ int srcYAxisPitch,
+ uint8_t *dest,
+ int destXAxisPitch,
+ int destYAxisPitch,
+ int destWidth,
+ int destHeight)
+{
+ if (srcXAxisPitch == 4 && destXAxisPitch == 4)
+ {
+ CopyBGRA8ToRGBA8Fast(source, srcYAxisPitch, dest, destYAxisPitch, destWidth, destHeight);
+ return;
+ }
+
+ for (int y = 0; y < destHeight; ++y)
+ {
+ uint8_t *dst = dest + y * destYAxisPitch;
+ const uint8_t *src = source + y * srcYAxisPitch;
+ const uint8_t *end = src + destWidth * srcXAxisPitch;
+
+ while (src != end)
+ {
+ *reinterpret_cast<uint32_t *>(dst) =
+ SwizzleBGRAToRGBA(*reinterpret_cast<const uint32_t *>(src));
+ src += srcXAxisPitch;
+ dst += destXAxisPitch;
+ }
+ }
+}
+
+} // namespace angle