diff options
author | Andre Heider | 2009-01-20 15:21:47 +0000 |
---|---|---|
committer | Andre Heider | 2009-01-20 15:21:47 +0000 |
commit | 311b267863d6c0202e5723504e98aa78206763e2 (patch) | |
tree | 7d4f64ec01b72846705e40cb393b996e6d4b0de5 /graphics/surface.cpp | |
parent | b2a9393eeebb5b24f1d70cf163c21ef9c0ccd4c5 (diff) | |
download | scummvm-rg350-311b267863d6c0202e5723504e98aa78206763e2.tar.gz scummvm-rg350-311b267863d6c0202e5723504e98aa78206763e2.tar.bz2 scummvm-rg350-311b267863d6c0202e5723504e98aa78206763e2.zip |
merge SurfaceKeyColored into Surface
svn-id: r35951
Diffstat (limited to 'graphics/surface.cpp')
-rw-r--r-- | graphics/surface.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/graphics/surface.cpp b/graphics/surface.cpp index 263a4fd23b..df882bf4ff 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -225,4 +225,42 @@ void Surface::move(int dx, int dy, int height) { } } +void Surface::blit(Surface *surf_src, int16 x, int16 y, OverlayColor transparent) { + if (bytesPerPixel != sizeof(OverlayColor) || surf_src->bytesPerPixel != sizeof(OverlayColor)) return ; + + const OverlayColor *src = (const OverlayColor*)surf_src->pixels; + int blitW = surf_src->w; + int blitH = surf_src->h; + + // clip co-ordinates + if (x < 0) { + blitW += x; + src -= x; + x = 0; + } + if (y < 0) { + blitH += y; + src -= y * surf_src->w; + y = 0; + } + if (blitW > w - x) blitW = w - x; + if (blitH > h - y) blitH = h - y; + if (blitW <= 0 || blitH <= 0) + return; + + OverlayColor *dst = (OverlayColor*) getBasePtr(x, y); + int dstAdd = w - blitW; + int srcAdd = surf_src->w - blitW; + + for (int i = 0; i < blitH; ++i) { + for (int j = 0; j < blitW; ++j, ++dst, ++src) { + OverlayColor col = *src; + if (col != transparent) + *dst = col; + } + dst += dstAdd; + src += srcAdd; + } +} + } // End of namespace Graphics |