mozilla-bmo1504834-part2.patch
branchfirefox102
changeset 1175 4c6576f9cf04
parent 1174 90e3d0cf8567
child 1176 f871aac89885
--- a/mozilla-bmo1504834-part2.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-# HG changeset patch
-# Parent  9319844dca3133fa8bd7107079f1d1ddc5c0bf70
-Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
-has no interest in maintaining big endian.
-So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
-out again, we transform back to BE.
-
-diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
---- a/gfx/2d/ConvolutionFilter.cpp
-+++ b/gfx/2d/ConvolutionFilter.cpp
-@@ -29,32 +29,79 @@ bool ConvolutionFilter::GetFilterOffsetA
-                                                  int32_t* aResultLength) {
-   if (aRowIndex >= mFilter->numValues()) {
-     return false;
-   }
-   mFilter->FilterForValue(aRowIndex, aResultOffset, aResultLength);
-   return true;
- }
- 
-+static void ByteSwapArray(uint8_t *u8Array, int32_t size) {
-+    uint32_t *array = reinterpret_cast<uint32_t*>(u8Array);
-+    for (int pxl = 0; pxl < size; ++pxl) {
-+        // Use an endian swap to move the bytes, i.e. BGRA -> ARGB.
-+        uint32_t rgba = array[pxl];
-+        array[pxl] = NativeEndian::swapToLittleEndian(rgba);
-+    }
-+}
-+
- void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst,
-                                              bool aHasAlpha) {
-+#if MOZ_BIG_ENDIAN()
-+    int outputSize = mFilter->numValues();
-+
-+    // Input size isn't handed in, so we have to calculate it quickly
-+    int inputSize = 0;
-+    for (int xx = 0; xx < outputSize; ++xx) {
-+        // Get the filter that determines the current output pixel.
-+        int filterOffset, filterLength;
-+        mFilter->FilterForValue(xx, &filterOffset, &filterLength);
-+        inputSize = std::max(inputSize, filterOffset + filterLength);
-+    }
-+
-+    ByteSwapArray((uint8_t*)aSrc, inputSize);
-+#endif
-+
-   SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha);
-+
-+#if MOZ_BIG_ENDIAN()
-+    ByteSwapArray((uint8_t*)aSrc, inputSize);
-+    ByteSwapArray(aDst, outputSize);
-+#endif
- }
- 
- void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
-                                            int32_t aRowIndex, int32_t aRowSize,
-                                            bool aHasAlpha) {
-   MOZ_ASSERT(aRowIndex < mFilter->numValues());
- 
-   int32_t filterOffset;
-   int32_t filterLength;
-   auto filterValues =
-       mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
-+
-+#if MOZ_BIG_ENDIAN()
-+  for (int filterY = 0; filterY < filterLength; filterY++) {
-+      // Skia only knows LE, so we have to swizzle the input
-+    ByteSwapArray(aSrc[filterY], aRowSize);
-+  }
-+#endif
-+
-   SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst,
-                               aHasAlpha);
-+
-+#if MOZ_BIG_ENDIAN()
-+  // After skia is finished, we swizzle back to BE, in case
-+  // the input is used again somewhere else
-+  for (int filterY = 0; filterY < filterLength; filterY++) {
-+    ByteSwapArray(aSrc[filterY], aRowSize);
-+  }
-+  // The destination array as well
-+  ByteSwapArray(aDst, aRowSize);
-+#endif
- }
- 
- /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
-  * SkBitmapScaler/SkResizeFilter::computeFactors. It is governed by Skia's
-  * BSD-style license (see gfx/skia/LICENSE) and the following copyright:
-  * Copyright (c) 2015 Google Inc.
-  */
- bool ConvolutionFilter::ComputeResizeFilter(ResizeMethod aResizeMethod,
-diff --git a/gfx/skia/skia/include/core/SkPreConfig.h b/gfx/skia/skia/include/core/SkPreConfig.h
---- a/gfx/skia/skia/include/core/SkPreConfig.h
-+++ b/gfx/skia/skia/include/core/SkPreConfig.h
-@@ -68,17 +68,17 @@
-         #define SK_CPU_BENDIAN
-     #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-         #define SK_CPU_LENDIAN
-     #elif defined(__sparc) || defined(__sparc__) || \
-       defined(_POWER) || defined(__powerpc__) || \
-       defined(__ppc__) || defined(__hppa) || \
-       defined(__PPC__) || defined(__PPC64__) || \
-       defined(_MIPSEB) || defined(__ARMEB__) || \
--      defined(__s390__) || \
-+      defined(__s390__) || defined(__s390x__) || \
-       (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
-       (defined(__ia64) && defined(__BIG_ENDIAN__))
-          #define SK_CPU_BENDIAN
-     #else
-         #define SK_CPU_LENDIAN
-     #endif
- #endif
-