[Scummvm-git-logs] scummvm master -> 05104adbf3a74899b182862acb7e7254d5d5fa57
bluegr
noreply at scummvm.org
Sun Jan 5 14:38:38 UTC 2025
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
05104adbf3 GRAPHICS: Add simplified mask blitting routines to ManagedSurface
Commit: 05104adbf3a74899b182862acb7e7254d5d5fa57
https://github.com/scummvm/scummvm/commit/05104adbf3a74899b182862acb7e7254d5d5fa57
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-01-05T16:38:34+02:00
Commit Message:
GRAPHICS: Add simplified mask blitting routines to ManagedSurface
Changed paths:
graphics/managed_surface.cpp
graphics/managed_surface.h
diff --git a/graphics/managed_surface.cpp b/graphics/managed_surface.cpp
index 39b5659c7b7..f238901be1f 100644
--- a/graphics/managed_surface.cpp
+++ b/graphics/managed_surface.cpp
@@ -431,6 +431,68 @@ void ManagedSurface::simpleBlitFromInner(const Surface &src, const Common::Rect
addDirtyRect(dstRectC);
}
+void ManagedSurface::maskBlitFrom(const Surface &src, const Surface &mask, const Palette *srcPalette) {
+ maskBlitFrom(src, mask, Common::Rect(0, 0, src.w, src.h), Common::Point(0, 0), srcPalette);
+}
+
+void ManagedSurface::maskBlitFrom(const Surface &src, const Surface &mask, const Common::Point &destPos, const Palette *srcPalette) {
+ maskBlitFrom(src, mask, Common::Rect(0, 0, src.w, src.h), destPos, srcPalette);
+}
+
+void ManagedSurface::maskBlitFrom(const Surface &src, const Surface &mask, const Common::Rect &srcRect,
+ const Common::Point &destPos, const Palette *srcPalette) {
+ maskBlitFromInner(src, mask, srcRect, destPos, srcPalette);
+}
+
+void ManagedSurface::maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask) {
+ maskBlitFrom(src, mask, Common::Rect(0, 0, src.w, src.h), Common::Point(0, 0));
+}
+
+void ManagedSurface::maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask, const Common::Point &destPos) {
+ maskBlitFrom(src, mask, Common::Rect(0, 0, src.w, src.h), destPos);
+}
+
+void ManagedSurface::maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask,
+ const Common::Rect &srcRect, const Common::Point &destPos) {
+ maskBlitFromInner(src._innerSurface, mask._innerSurface, srcRect, destPos, src._palette);
+}
+
+void ManagedSurface::maskBlitFromInner(const Surface &src, const Surface &mask,
+ const Common::Rect &srcRect, const Common::Point &destPos,
+ const Palette *srcPalette) {
+
+ if (mask.w != src.w || mask.h != src.h)
+ error("Surface::maskBlitFrom: mask dimensions do not match src");
+
+ Common::Rect srcRectC = srcRect;
+ Common::Rect dstRectC = srcRect;
+
+ dstRectC.moveTo(destPos.x, destPos.y);
+ clip(srcRectC, dstRectC);
+
+ const byte *srcPtr = (const byte *)src.getBasePtr(srcRectC.left, srcRectC.top);
+ const byte *maskPtr = (const byte *)mask.getBasePtr(srcRectC.left, srcRectC.top);
+ byte *dstPtr = (byte *)getBasePtr(dstRectC.left, dstRectC.top);
+
+ if (format == src.format) {
+ maskBlit(dstPtr, srcPtr, maskPtr, pitch, src.pitch, mask.pitch, srcRectC.width(), srcRectC.height(),
+ format.bytesPerPixel);
+ } else if (src.format.isCLUT8()) {
+ assert(srcPalette);
+ assert(!format.isCLUT8());
+
+ uint32 map[256];
+ convertPaletteToMap(map, srcPalette->data(), srcPalette->size(), format);
+ crossMaskBlitMap(dstPtr, srcPtr, maskPtr, pitch, src.pitch, mask.pitch, srcRectC.width(), srcRectC.height(),
+ format.bytesPerPixel, map);
+ } else {
+ crossMaskBlit(dstPtr, srcPtr, maskPtr, pitch, src.pitch, mask.pitch, srcRectC.width(), srcRectC.height(),
+ format, src.format);
+ }
+
+ addDirtyRect(dstRectC);
+}
+
void ManagedSurface::blitFrom(const Surface &src, const Palette *srcPalette) {
blitFrom(src, Common::Rect(0, 0, src.w, src.h), Common::Point(0, 0), srcPalette);
}
diff --git a/graphics/managed_surface.h b/graphics/managed_surface.h
index 3f47d95d1ae..fa76f7b6987 100644
--- a/graphics/managed_surface.h
+++ b/graphics/managed_surface.h
@@ -92,6 +92,13 @@ protected:
const Common::Point &destPos, const Palette *srcPalette,
bool transparentColorSet, uint transparentColor);
+ /**
+ * Inner method for blitting with a transparent mask.
+ */
+ void maskBlitFromInner(const Surface &src, const Surface &mask,
+ const Common::Rect &srcRect, const Common::Point &destPos,
+ const Palette *srcPalette);
+
/**
* Inner method for blitting.
*/
@@ -359,6 +366,38 @@ public:
void simpleBlitFrom(const ManagedSurface &src, const Common::Rect &srcRect,
const Common::Point &destPos);
+ /**
+ * Copy another surface into this one using a transparency mask.
+ */
+ void maskBlitFrom(const Surface &src, const Surface &mask, const Palette *srcPalette = nullptr);
+
+ /**
+ * Copy another surface into this one at a given destination position using a transparency mask.
+ */
+ void maskBlitFrom(const Surface &src, const Surface &mask, const Common::Point &destPos, const Palette *srcPalette = nullptr);
+
+ /**
+ * Copy another surface into this one at a given destination position using a transparency mask.
+ */
+ void maskBlitFrom(const Surface &src, const Surface &mask, const Common::Rect &srcRect,
+ const Common::Point &destPos, const Palette *srcPalette = nullptr);
+
+ /**
+ * Copy another surface into this one using a transparency mask.
+ */
+ void maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask);
+
+ /**
+ * Copy another surface into this one at a given destination position using a transparency mask.
+ */
+ void maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask, const Common::Point &destPos);
+
+ /**
+ * Copy another surface into this one at a given destination position using a transparency mask.
+ */
+ void maskBlitFrom(const ManagedSurface &src, const ManagedSurface &mask,
+ const Common::Rect &srcRect, const Common::Point &destPos);
+
/**
* Copy another surface into this one.
*/
More information about the Scummvm-git-logs
mailing list