ultimatepp/uppsrc/plugin/ppm/ppm.cpp
2025-11-24 14:56:32 +01:00

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()
{
}
}