Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.2
MozillaThunderbird
mozilla-bmo1504834-part2.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File mozilla-bmo1504834-part2.patch of Package MozillaThunderbird
# HG changeset patch # Parent 36563351309ddbc6c29559ba50a41d005f925abb 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 -r 36563351309d gfx/2d/ConvolutionFilter.cpp --- a/gfx/2d/ConvolutionFilter.cpp Mon Sep 09 17:59:28 2019 +0200 +++ b/gfx/2d/ConvolutionFilter.cpp Tue Sep 10 08:25:13 2019 +0200 @@ -35,9 +35,38 @@ 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, @@ -49,8 +78,26 @@ 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 diff -r 36563351309d gfx/skia/skia/include/core/SkPreConfig.h --- a/gfx/skia/skia/include/core/SkPreConfig.h Mon Sep 09 17:59:28 2019 +0200 +++ b/gfx/skia/skia/include/core/SkPreConfig.h Tue Sep 10 08:25:13 2019 +0200 @@ -73,7 +73,7 @@ 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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor