bool SavePartSprite::readSprite(const Surface &sprite) { // The sprite's dimensions have to fit if (((uint32)sprite.getWidth()) != _width) return false; if (((uint32)sprite.getHeight()) != _height) return false; if (_trueColor) { if (sprite.getBPP() <= 1) return false; Graphics::PixelFormat pixelFormat = g_system->getScreenFormat(); byte *data = _dataSprite; ConstPixel pixel = sprite.get(); for (uint32 i = 0; i < (_width * _height); i++, ++pixel, data += 3) pixelFormat.colorToRGB(pixel.get(), data[0], data[1], data[2]); } else { if (sprite.getBPP() != 1) return false; memcpy(_dataSprite, sprite.getData(), _width * _height); } return true; }
void Surface::blit(const Surface &from, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, int32 transp) { // Color depths have to fit assert(_bpp == from._bpp); // Clip if (!clipBlitRect(left, top, right, bottom, x, y, _width, _height, from._width, from._height)) return; // Area to actually copy uint16 width = right - left + 1; uint16 height = bottom - top + 1; if ((width == 0) || (height == 0)) // Nothing to do return; if ((left == 0) && (_width == from._width) && (_width == width) && (transp == -1)) { // If these conditions are met, we can directly use memmove // Pointers to the blit destination and source start points byte *dst = getData(x , y); const byte *src = from.getData(left, top); memmove(dst, src, width * height * _bpp); return; } if (transp == -1) { // We don't have to look for transparency => we can use memmove line-wise // Pointers to the blit destination and source start points byte *dst = getData(x , y); const byte *src = from.getData(left, top); while (height-- > 0) { memmove(dst, src, width * _bpp); dst += _width * _bpp; src += from._width * from._bpp; } return; } // Otherwise, we have to copy by pixel // Pointers to the blit destination and source start points Pixel dst = get(x , y); ConstPixel src = from.get(left, top); while (height-- > 0) { Pixel dstRow = dst; ConstPixel srcRow = src; for (uint16 i = 0; i < width; i++, dstRow++, srcRow++) if (srcRow.get() != ((uint32) transp)) dstRow.set(srcRow.get()); dst += _width; src += from._width; } }