mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
114 lines
1.8 KiB
C++
114 lines
1.8 KiB
C++
#include "ppm.h"
|
|
|
|
namespace Upp {
|
|
|
|
PPMRaster::PPMRaster()
|
|
{
|
|
size = Size(0, 0);
|
|
is16 = false;
|
|
}
|
|
|
|
bool PPMRaster::Create()
|
|
{
|
|
Stream& stream = GetStream();
|
|
size = Size(0, 0);
|
|
if(!stream.IsOpen()) {
|
|
SetError();
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
if(stream.Get(2) != "P6")
|
|
return false;
|
|
int ii = 0;
|
|
int num[3];
|
|
String line;
|
|
CParser p(line);
|
|
while(ii < 3) {
|
|
while(p.IsEof() || p.Char('#')) {
|
|
if(stream.IsEof())
|
|
return false;
|
|
line = stream.GetLine();
|
|
p.Set(line);
|
|
}
|
|
int n = p.ReadInt();
|
|
if(n <= 0 || n > 65535)
|
|
return false;
|
|
num[ii++] = n;
|
|
}
|
|
size.cx = num[0];
|
|
size.cy = num[1];
|
|
is16 = num[2] > 255;
|
|
pixel_pos = stream.GetPos();
|
|
return true;
|
|
}
|
|
catch(CParser::Error) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Raster::Info PPMRaster::GetInfo()
|
|
{
|
|
return Raster::Info();
|
|
}
|
|
|
|
Size PPMRaster::GetSize()
|
|
{
|
|
return size;
|
|
}
|
|
|
|
Raster::Line PPMRaster::GetLine(int ii)
|
|
{
|
|
Stream& stream = GetStream();
|
|
Line line;
|
|
int row_bytes = size.cx * 3;
|
|
byte *ptr = new byte[size.cx * 3];
|
|
if(!IsError()) {
|
|
Stream& stream = GetStream();
|
|
stream.Seek(pixel_pos + ii * row_bytes * (1 + is16));
|
|
if(is16) {
|
|
byte *t = ptr;
|
|
for(int n = size.cx; n-- >= 0;) {
|
|
int q = stream.Get();
|
|
if(q < 0) {
|
|
SetError();
|
|
break;
|
|
}
|
|
*t++ = q; stream.Get();
|
|
}
|
|
return Line(ptr, this, true);
|
|
}
|
|
else {
|
|
if(!stream.GetAll(ptr, row_bytes))
|
|
SetError();
|
|
}
|
|
}
|
|
if(IsError())
|
|
memset(ptr, 0, row_bytes);
|
|
return Line(ptr, this, true);
|
|
}
|
|
|
|
int PPMRaster::GetPaletteCount()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
RGBA * PPMRaster::GetPalette()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
const RasterFormat * PPMRaster::GetFormat()
|
|
{
|
|
static RasterFormat fmt;
|
|
ONCELOCK {
|
|
fmt.Set24be(0xff0000, 0x00ff00, 0x0000ff);
|
|
}
|
|
return &fmt;
|
|
}
|
|
|
|
PPMRaster::~PPMRaster()
|
|
{
|
|
}
|
|
|
|
}
|