aboutsummaryrefslogtreecommitdiff
path: root/image/bmp.cpp
diff options
context:
space:
mode:
authorCameron Cawley2019-03-01 00:15:43 +0000
committerBastien Bouclet2019-03-02 07:29:22 +0100
commit8ae17b481a8f0a0c7d78e975a32e9e6df055b8df (patch)
tree0e3a67b44005735362c9f3a519b39be24813b075 /image/bmp.cpp
parentfd1162cb7106130d328f9d7d523a8e73c42a53a3 (diff)
downloadscummvm-rg350-8ae17b481a8f0a0c7d78e975a32e9e6df055b8df.tar.gz
scummvm-rg350-8ae17b481a8f0a0c7d78e975a32e9e6df055b8df.tar.bz2
scummvm-rg350-8ae17b481a8f0a0c7d78e975a32e9e6df055b8df.zip
IMAGE: Move bitmap writing code out of OpenGLGraphicsManager
Diffstat (limited to 'image/bmp.cpp')
-rw-r--r--image/bmp.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/image/bmp.cpp b/image/bmp.cpp
index 28eb049035..ce2b099797 100644
--- a/image/bmp.cpp
+++ b/image/bmp.cpp
@@ -132,4 +132,59 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) {
return true;
}
+bool writeBMP(Common::WriteStream &out, const Graphics::Surface &input, const bool bottomUp) {
+ const Graphics::PixelFormat requiredFormat_3byte(3, 8, 8, 8, 0, 0, 8, 16, 0);
+
+ Graphics::Surface *tmp = NULL;
+ const Graphics::Surface *surface;
+
+ if (input.format == requiredFormat_3byte) {
+ surface = &input;
+ } else {
+ surface = tmp = input.convertTo(requiredFormat_3byte);
+ }
+
+ int dstPitch = surface->w * 3;
+ int extraDataLength = (dstPitch % 4) ? 4 - (dstPitch % 4) : 0;
+ int padding = 0;
+
+ out.writeByte('B');
+ out.writeByte('M');
+ out.writeUint32LE(surface->h * dstPitch + 54);
+ out.writeUint32LE(0);
+ out.writeUint32LE(54);
+ out.writeUint32LE(40);
+ out.writeUint32LE(surface->w);
+ out.writeUint32LE(surface->h);
+ out.writeUint16LE(1);
+ out.writeUint16LE(24);
+ out.writeUint32LE(0);
+ out.writeUint32LE(0);
+ out.writeUint32LE(0);
+ out.writeUint32LE(0);
+ out.writeUint32LE(0);
+ out.writeUint32LE(0);
+
+
+ if (bottomUp) {
+ for (uint y = 0; y < surface->h; ++y) {
+ out.write((const void *)surface->getBasePtr(0, y), dstPitch);
+ out.write(&padding, extraDataLength);
+ }
+ } else {
+ for (uint y = surface->h; y-- > 0;) {
+ out.write((const void *)surface->getBasePtr(0, y), dstPitch);
+ out.write(&padding, extraDataLength);
+ }
+ }
+
+ // free tmp surface
+ if (tmp) {
+ tmp->free();
+ delete tmp;
+ }
+
+ return true;
+}
+
} // End of namespace Image