aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp
diff options
context:
space:
mode:
authorDavid Walter Seikel2013-01-13 18:54:10 +1000
committerDavid Walter Seikel2013-01-13 18:54:10 +1000
commit959831f4ef5a3e797f576c3de08cd65032c997ad (patch)
treee7351908be5995f0b325b2ebeaa02d5a34b82583 /libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp
parentAdd info about changes to Irrlicht. (diff)
downloadSledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.zip
SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.gz
SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.bz2
SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.xz
Remove damned ancient DOS line endings from Irrlicht. Hopefully I did not go overboard.
Diffstat (limited to '')
-rw-r--r--libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp280
1 files changed, 140 insertions, 140 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp
index 8a91c3a..863a8f2 100644
--- a/libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp
+++ b/libraries/irrlicht-1.8/source/Irrlicht/CImageWriterBMP.cpp
@@ -1,140 +1,140 @@
1// Copyright (C) 2002-2012 Nikolaus Gebhardt 1// Copyright (C) 2002-2012 Nikolaus Gebhardt
2// This file is part of the "Irrlicht Engine". 2// This file is part of the "Irrlicht Engine".
3// For conditions of distribution and use, see copyright notice in irrlicht.h 3// For conditions of distribution and use, see copyright notice in irrlicht.h
4 4
5#include "CImageWriterBMP.h" 5#include "CImageWriterBMP.h"
6 6
7#ifdef _IRR_COMPILE_WITH_BMP_WRITER_ 7#ifdef _IRR_COMPILE_WITH_BMP_WRITER_
8 8
9#include "CImageLoaderBMP.h" 9#include "CImageLoaderBMP.h"
10#include "IWriteFile.h" 10#include "IWriteFile.h"
11#include "CColorConverter.h" 11#include "CColorConverter.h"
12#include "irrString.h" 12#include "irrString.h"
13 13
14namespace irr 14namespace irr
15{ 15{
16namespace video 16namespace video
17{ 17{
18 18
19IImageWriter* createImageWriterBMP() 19IImageWriter* createImageWriterBMP()
20{ 20{
21 return new CImageWriterBMP; 21 return new CImageWriterBMP;
22} 22}
23 23
24CImageWriterBMP::CImageWriterBMP() 24CImageWriterBMP::CImageWriterBMP()
25{ 25{
26#ifdef _DEBUG 26#ifdef _DEBUG
27 setDebugName("CImageWriterBMP"); 27 setDebugName("CImageWriterBMP");
28#endif 28#endif
29} 29}
30 30
31bool CImageWriterBMP::isAWriteableFileExtension(const io::path& filename) const 31bool CImageWriterBMP::isAWriteableFileExtension(const io::path& filename) const
32{ 32{
33 return core::hasFileExtension ( filename, "bmp" ); 33 return core::hasFileExtension ( filename, "bmp" );
34} 34}
35 35
36bool CImageWriterBMP::writeImage(io::IWriteFile* file, IImage* image, u32 param) const 36bool CImageWriterBMP::writeImage(io::IWriteFile* file, IImage* image, u32 param) const
37{ 37{
38 // we always write 24-bit color because nothing really reads 32-bit 38 // we always write 24-bit color because nothing really reads 32-bit
39 39
40 SBMPHeader imageHeader; 40 SBMPHeader imageHeader;
41 imageHeader.Id = 0x4d42; 41 imageHeader.Id = 0x4d42;
42 imageHeader.Reserved = 0; 42 imageHeader.Reserved = 0;
43 imageHeader.BitmapDataOffset = sizeof(imageHeader); 43 imageHeader.BitmapDataOffset = sizeof(imageHeader);
44 imageHeader.BitmapHeaderSize = 0x28; 44 imageHeader.BitmapHeaderSize = 0x28;
45 imageHeader.Width = image->getDimension().Width; 45 imageHeader.Width = image->getDimension().Width;
46 imageHeader.Height = image->getDimension().Height; 46 imageHeader.Height = image->getDimension().Height;
47 imageHeader.Planes = 1; 47 imageHeader.Planes = 1;
48 imageHeader.BPP = 24; 48 imageHeader.BPP = 24;
49 imageHeader.Compression = 0; 49 imageHeader.Compression = 0;
50 imageHeader.PixelPerMeterX = 0; 50 imageHeader.PixelPerMeterX = 0;
51 imageHeader.PixelPerMeterY = 0; 51 imageHeader.PixelPerMeterY = 0;
52 imageHeader.Colors = 0; 52 imageHeader.Colors = 0;
53 imageHeader.ImportantColors = 0; 53 imageHeader.ImportantColors = 0;
54 54
55 // data size is rounded up to next larger 4 bytes boundary 55 // data size is rounded up to next larger 4 bytes boundary
56 imageHeader.BitmapDataSize = imageHeader.Width * imageHeader.BPP / 8; 56 imageHeader.BitmapDataSize = imageHeader.Width * imageHeader.BPP / 8;
57 imageHeader.BitmapDataSize = (imageHeader.BitmapDataSize + 3) & ~3; 57 imageHeader.BitmapDataSize = (imageHeader.BitmapDataSize + 3) & ~3;
58 imageHeader.BitmapDataSize *= imageHeader.Height; 58 imageHeader.BitmapDataSize *= imageHeader.Height;
59 59
60 // file size is data size plus offset to data 60 // file size is data size plus offset to data
61 imageHeader.FileSize = imageHeader.BitmapDataOffset + imageHeader.BitmapDataSize; 61 imageHeader.FileSize = imageHeader.BitmapDataOffset + imageHeader.BitmapDataSize;
62 62
63 // bitmaps are stored upside down and padded so we always do this 63 // bitmaps are stored upside down and padded so we always do this
64 void (*CColorConverter_convertFORMATtoFORMAT)(const void*, s32, void*) = 0; 64 void (*CColorConverter_convertFORMATtoFORMAT)(const void*, s32, void*) = 0;
65 switch(image->getColorFormat()) 65 switch(image->getColorFormat())
66 { 66 {
67 case ECF_R8G8B8: 67 case ECF_R8G8B8:
68 CColorConverter_convertFORMATtoFORMAT 68 CColorConverter_convertFORMATtoFORMAT
69 = CColorConverter::convert_R8G8B8toR8G8B8; 69 = CColorConverter::convert_R8G8B8toR8G8B8;
70 break; 70 break;
71 case ECF_A8R8G8B8: 71 case ECF_A8R8G8B8:
72 CColorConverter_convertFORMATtoFORMAT 72 CColorConverter_convertFORMATtoFORMAT
73 = CColorConverter::convert_A8R8G8B8toB8G8R8; 73 = CColorConverter::convert_A8R8G8B8toB8G8R8;
74 break; 74 break;
75 case ECF_A1R5G5B5: 75 case ECF_A1R5G5B5:
76 CColorConverter_convertFORMATtoFORMAT 76 CColorConverter_convertFORMATtoFORMAT
77 = CColorConverter::convert_A1R5G5B5toR8G8B8; 77 = CColorConverter::convert_A1R5G5B5toR8G8B8;
78 break; 78 break;
79 case ECF_R5G6B5: 79 case ECF_R5G6B5:
80 CColorConverter_convertFORMATtoFORMAT 80 CColorConverter_convertFORMATtoFORMAT
81 = CColorConverter::convert_R5G6B5toR8G8B8; 81 = CColorConverter::convert_R5G6B5toR8G8B8;
82 break; 82 break;
83#ifndef _DEBUG 83#ifndef _DEBUG
84 default: 84 default:
85 break; 85 break;
86#endif 86#endif
87 } 87 }
88 88
89 // couldn't find a color converter 89 // couldn't find a color converter
90 if (!CColorConverter_convertFORMATtoFORMAT) 90 if (!CColorConverter_convertFORMATtoFORMAT)
91 return false; 91 return false;
92 92
93 // write the bitmap header 93 // write the bitmap header
94 if (file->write(&imageHeader, sizeof(imageHeader)) != sizeof(imageHeader)) 94 if (file->write(&imageHeader, sizeof(imageHeader)) != sizeof(imageHeader))
95 return false; 95 return false;
96 96
97 u8* scan_lines = (u8*)image->lock(); 97 u8* scan_lines = (u8*)image->lock();
98 if (!scan_lines) 98 if (!scan_lines)
99 return false; 99 return false;
100 100
101 // size of one pixel in bytes 101 // size of one pixel in bytes
102 u32 pixel_size = image->getBytesPerPixel(); 102 u32 pixel_size = image->getBytesPerPixel();
103 103
104 // length of one row of the source image in bytes 104 // length of one row of the source image in bytes
105 u32 row_stride = (pixel_size * imageHeader.Width); 105 u32 row_stride = (pixel_size * imageHeader.Width);
106 106
107 // length of one row in bytes, rounded up to nearest 4-byte boundary 107 // length of one row in bytes, rounded up to nearest 4-byte boundary
108 s32 row_size = ((3 * imageHeader.Width) + 3) & ~3; 108 s32 row_size = ((3 * imageHeader.Width) + 3) & ~3;
109 109
110 // allocate and clear memory for our scan line 110 // allocate and clear memory for our scan line
111 u8* row_pointer = new u8[row_size]; 111 u8* row_pointer = new u8[row_size];
112 memset(row_pointer, 0, row_size); 112 memset(row_pointer, 0, row_size);
113 113
114 // convert the image to 24-bit BGR and flip it over 114 // convert the image to 24-bit BGR and flip it over
115 s32 y; 115 s32 y;
116 for (y = imageHeader.Height - 1; 0 <= y; --y) 116 for (y = imageHeader.Height - 1; 0 <= y; --y)
117 { 117 {
118 if (image->getColorFormat()==ECF_R8G8B8) 118 if (image->getColorFormat()==ECF_R8G8B8)
119 CColorConverter::convert24BitTo24Bit(&scan_lines[y * row_stride], row_pointer, imageHeader.Width, 1, 0, false, true); 119 CColorConverter::convert24BitTo24Bit(&scan_lines[y * row_stride], row_pointer, imageHeader.Width, 1, 0, false, true);
120 else 120 else
121 // source, length [pixels], destination 121 // source, length [pixels], destination
122 CColorConverter_convertFORMATtoFORMAT(&scan_lines[y * row_stride], imageHeader.Width, row_pointer); 122 CColorConverter_convertFORMATtoFORMAT(&scan_lines[y * row_stride], imageHeader.Width, row_pointer);
123 if (file->write(row_pointer, row_size) < row_size) 123 if (file->write(row_pointer, row_size) < row_size)
124 break; 124 break;
125 } 125 }
126 126
127 // clean up our scratch area 127 // clean up our scratch area
128 delete [] row_pointer; 128 delete [] row_pointer;
129 129
130 // give back image handle 130 // give back image handle
131 image->unlock(); 131 image->unlock();
132 132
133 return y < 0; 133 return y < 0;
134} 134}
135 135
136} // namespace video 136} // namespace video
137} // namespace irr 137} // namespace irr
138 138
139#endif 139#endif
140 140