summaryrefslogtreecommitdiff
path: root/src/im_format_avi.cpp
diff options
context:
space:
mode:
authorscuri <scuri>2009-06-08 20:14:52 +0000
committerscuri <scuri>2009-06-08 20:14:52 +0000
commit01bb2586942d6dfcba290087f289fea28ea726eb (patch)
tree79e80fae485a3e8c3a5a2c0c3326fad80d00c1b2 /src/im_format_avi.cpp
parentf7498fef28dbb8f31a289fe6478fd609fda65af6 (diff)
*** empty log message ***
Diffstat (limited to 'src/im_format_avi.cpp')
-rw-r--r--src/im_format_avi.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/im_format_avi.cpp b/src/im_format_avi.cpp
index 632e45b..dcb4898 100644
--- a/src/im_format_avi.cpp
+++ b/src/im_format_avi.cpp
@@ -2,7 +2,7 @@
* \brief AVI - Windows Audio-Video Interleaved RIFF
*
* See Copyright Notice in im_lib.h
- * $Id: im_format_avi.cpp,v 1.2 2008/12/03 15:45:34 scuri Exp $
+ * $Id: im_format_avi.cpp,v 1.3 2009/06/08 20:14:53 scuri Exp $
*/
#include "im_format.h"
@@ -59,7 +59,7 @@ class imFileFormatAVI: public imFileFormatBase
void ReadPalette(unsigned char* bmp_colors);
void WritePalette(unsigned char* bmp_colors);
- void FixRGB(int bpp);
+ void FixRGBOrder(int bpp);
void InitMasks(imDib* dib);
public:
@@ -282,7 +282,19 @@ int imFileFormatAVI::ReadImageInfo(int index)
this->line_buffer_extra = 4; // room enough for padding
/* prepares to read data from the stream */
- frame = AVIStreamGetFrameOpen(stream, NULL);
+ if (bpp == 32)
+ {
+ BITMAPINFOHEADER info;
+ memset(&info, 0, sizeof(BITMAPINFOHEADER));
+ info.biSize = sizeof(BITMAPINFOHEADER);
+ info.biWidth = width;
+ info.biHeight = height;
+ info.biPlanes = 1;
+ info.biBitCount = (WORD)bpp;
+ frame = AVIStreamGetFrameOpen(stream, &info);
+ }
+ else
+ frame = AVIStreamGetFrameOpen(stream, NULL);
if (!frame)
return IM_ERR_ACCESS;
@@ -504,7 +516,7 @@ void imFileFormatAVI::InitMasks(imDib* dib)
}
}
-void imFileFormatAVI::FixRGB(int bpp)
+void imFileFormatAVI::FixRGBOrder(int bpp)
{
int x;
@@ -532,13 +544,17 @@ void imFileFormatAVI::FixRGB(int bpp)
break;
case 32:
{
+ /* inverts the DWORD values if not intel */
+ if (imBinCPUByteOrder() == IM_BIGENDIAN)
+ imBinSwapBytes4(this->line_buffer, this->width);
+
unsigned int* dword_data = (unsigned int*)this->line_buffer;
imbyte* byte_data = (imbyte*)this->line_buffer;
for (x = 0; x < this->width; x++)
{
unsigned int dword_value = dword_data[x];
- int c = x*3;
+ int c = x*4;
byte_data[c] = (imbyte)((rmask & dword_value) >> roff);
byte_data[c+1] = (imbyte)((gmask & dword_value) >> goff);
byte_data[c+2] = (imbyte)((bmask & dword_value) >> boff);
@@ -586,7 +602,7 @@ int imFileFormatAVI::ReadImageData(void* data)
bits += dib->line_size;
if (dib->bmih->biBitCount > 8)
- FixRGB(dib->bmih->biBitCount);
+ FixRGBOrder(dib->bmih->biBitCount);
imFileLineBufferRead(this, data, row, 0);
@@ -623,7 +639,7 @@ int imFileFormatAVI::WriteImageData(void* data)
imFileLineBufferWrite(this, data, row, 0);
if (dib->bmih->biBitCount > 8)
- FixRGB(dib->bmih->biBitCount);
+ FixRGBOrder(dib->bmih->biBitCount);
CopyMemory(bits, this->line_buffer, dib->line_size);
bits += dib->line_size;