1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "CImageWriterPCX.h"
7
#ifdef _IRR_COMPILE_WITH_PCX_WRITER_
9
#include "CImageLoaderPCX.h"
10
#include "IWriteFile.h"
11
#include "os.h" // for logging
12
#include "irrString.h"
19
IImageWriter* createImageWriterPCX()
21
return new CImageWriterPCX;
24
CImageWriterPCX::CImageWriterPCX()
27
setDebugName("CImageWriterPCX");
31
bool CImageWriterPCX::isAWriteableFileExtension(const io::path& filename) const
33
return core::hasFileExtension ( filename, "pcx" );
36
bool CImageWriterPCX::writeImage(io::IWriteFile *file, IImage *image,u32 param) const
45
d1 = 10; // Manufacturer
51
d1 = 8; // Bits per Pixel
53
d2 = 0; // pixel origin
56
d2 = image->getDimension().Width-1; // width
58
d2 = os::Byteswap::byteswap(d2);
61
d2 = image->getDimension().Height-1; // height
63
d2 = os::Byteswap::byteswap(d2);
68
d2 = os::Byteswap::byteswap(d2);
72
d2 = 0; // palette (not used)
81
d2 = image->getDimension().Width; // pitch
82
if (d2&0x0001) // must be even
85
d2 = os::Byteswap::byteswap(d2);
90
d2 = os::Byteswap::byteswap(d2);
93
d2 = 800; // screen width
95
d2 = os::Byteswap::byteswap(d2);
98
d2 = 600; // screen height
100
d2 = os::Byteswap::byteswap(d2);
103
d2 = 0; // filler (not used)
110
for (i=0; i<image->getDimension().Height; ++i)
114
for (u32 j=0; j<3; ++j) // color planes
116
for (u32 k=0; k<image->getDimension().Width; ++k)
118
const SColor pix = image->getPixel(k,i);
119
if ((cnt!=0) && (cnt<63) &&
120
(((j==0) && (value==pix.getRed())) ||
121
((j==1) && (value==pix.getGreen())) ||
122
((j==2) && (value==pix.getBlue()))))
130
if ((cnt>1) || ((value&0xc0)==0xc0))
133
file->write(&cnt, 1);
135
file->write(&value, 1);
139
value=(u8)pix.getRed();
141
value=(u8)pix.getGreen();
143
value=(u8)pix.getBlue();
147
if ((cnt>1) || ((value&0xc0)==0xc0))
150
file->write(&cnt, 1);
152
file->write(&value, 1);