From 2bf5a049370fba86f289259405231ce096c315ac Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 21 Sep 2019 22:13:10 -0300 Subject: [PATCH] Use a generic slow path for ImageData:paste between formats when we don't already have a faster path for it, instead of erroring. --- src/modules/image/ImageData.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/modules/image/ImageData.cpp b/src/modules/image/ImageData.cpp index 70fa791a6..96f53d286 100644 --- a/src/modules/image/ImageData.cpp +++ b/src/modules/image/ImageData.cpp @@ -710,6 +710,9 @@ void ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, in uint8 *s = (uint8 *) src->getData(); uint8 *d = (uint8 *) getData(); + auto getfunction = src->pixelGetFunction; + auto setfunction = pixelSetFunction; + // If the dimensions match up, copy the entire memory stream in one go if (srcformat == dstformat && (sw == dstW && dstW == srcW && sh == dstH && dstH == srcH)) { @@ -755,7 +758,17 @@ void ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, in pasteRGBA32FtoRGBA16F(rowsrc, rowdst, sw); else - throw love::Exception("Unsupported pixel format combination in ImageData:paste."); + { + // Slow path: convert src -> Colorf -> dst. + Colorf c; + for (int x = 0; x < sw; x++) + { + auto srcp = (const Pixel *) (rowsrc.u8 + x * srcpixelsize); + auto dstp = (Pixel *) (rowdst.u8 + x * dstpixelsize); + getfunction(srcp, c); + setfunction(c, dstp); + } + } } } }