diff --git a/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp b/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp index acd4007bfa..17c2d3aa05 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp @@ -112,20 +112,25 @@ void OpenGLTexture::create (const int w, const int h, const void* pixels, GLenum template struct Flipper { - static void flip (HeapBlock& dataCopy, const uint8* srcData, const int lineStride, - const int w, const int h) + static void flip (HeapBlock& dataCopy, + const uint8* srcData, + const int lineStride, + const int pixelStride, + const int w, + const int h) { dataCopy.malloc (w * h); for (int y = 0; y < h; ++y) { - auto* src = (const PixelType*) srcData; - auto* dst = (PixelARGB*) (dataCopy + w * (h - 1 - y)); + auto* srcLine = srcData + lineStride * y; + auto* dstLine = dataCopy.get() + w * (h - 1 - y); for (int x = 0; x < w; ++x) - dst[x].set (src[x]); - - srcData += lineStride; + { + auto* srcPixel = srcLine + x * pixelStride; + dstLine[x].set (*unalignedPointerCast (srcPixel)); + } } } }; @@ -140,9 +145,9 @@ void OpenGLTexture::loadImage (const Image& image) switch (srcData.pixelFormat) { - case Image::ARGB: Flipper ::flip (dataCopy, srcData.data, srcData.lineStride, imageW, imageH); break; - case Image::RGB: Flipper ::flip (dataCopy, srcData.data, srcData.lineStride, imageW, imageH); break; - case Image::SingleChannel: Flipper::flip (dataCopy, srcData.data, srcData.lineStride, imageW, imageH); break; + case Image::ARGB: Flipper ::flip (dataCopy, srcData.data, srcData.lineStride, srcData.pixelStride, imageW, imageH); break; + case Image::RGB: Flipper ::flip (dataCopy, srcData.data, srcData.lineStride, srcData.pixelStride, imageW, imageH); break; + case Image::SingleChannel: Flipper::flip (dataCopy, srcData.data, srcData.lineStride, srcData.pixelStride, imageW, imageH); break; case Image::UnknownFormat: default: break; } @@ -163,7 +168,7 @@ void OpenGLTexture::loadAlpha (const uint8* pixels, int w, int h) void OpenGLTexture::loadARGBFlipped (const PixelARGB* pixels, int w, int h) { HeapBlock flippedCopy; - Flipper::flip (flippedCopy, (const uint8*) pixels, 4 * w, w, h); + Flipper::flip (flippedCopy, (const uint8*) pixels, 4 * w, 4, w, h); create (w, h, flippedCopy, JUCE_RGBA_FORMAT, true); }