mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-22 14:15:40 -06:00
Developing new Draw (in uppdev)
git-svn-id: svn://ultimatepp.org/upp/trunk@1128 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
bf2493667e
commit
bc369fae03
84 changed files with 21322 additions and 10 deletions
178
uppdev/Draw/RasterEncoder.cpp
Normal file
178
uppdev/Draw/RasterEncoder.cpp
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
#include "Draw.h"
|
||||
|
||||
NAMESPACE_UPP
|
||||
|
||||
RasterEncoder::RasterEncoder()
|
||||
{
|
||||
size = Size(0, 0);
|
||||
dots = Size(0, 0);
|
||||
hotspot = Point(0, 0);
|
||||
format.SetRGBA();
|
||||
}
|
||||
|
||||
void RasterEncoder::SetLine(RGBA *_line)
|
||||
{
|
||||
line = _line;
|
||||
h.Clear();
|
||||
}
|
||||
|
||||
void RasterEncoder::WriteLine(const RGBA *s)
|
||||
{
|
||||
if(format.IsRGBA())
|
||||
WriteLineRaw((byte *)s);
|
||||
else {
|
||||
if(!scanline)
|
||||
scanline.Alloc(format.GetByteCount(size.cx));
|
||||
format.Write(scanline, s, size.cx, GetPaletteCv());
|
||||
WriteLineRaw(scanline);
|
||||
}
|
||||
}
|
||||
|
||||
void RasterEncoder::WriteLine()
|
||||
{
|
||||
WriteLine(line);
|
||||
}
|
||||
|
||||
void RasterEncoder::Create(Size sz)
|
||||
{
|
||||
size = sz;
|
||||
h.Alloc(sz.cx);
|
||||
line = h;
|
||||
Start(sz);
|
||||
scanline.Clear();
|
||||
line_bytes = format.GetByteCount(size.cx);
|
||||
}
|
||||
|
||||
RGBA *RasterEncoder::Pal()
|
||||
{
|
||||
if(!palette)
|
||||
palette.Alloc(256);
|
||||
return palette;
|
||||
}
|
||||
|
||||
const RGBA *RasterEncoder::GetPalette()
|
||||
{
|
||||
if(!palette) {
|
||||
palette.Alloc(256);
|
||||
RGBA *p = palette;
|
||||
int n = GetPaletteCount();
|
||||
for(int i = 0; i < n; i++)
|
||||
p[i].r = p[i].g = p[i].b = p[i].a = 255 * i * (n - 1) / (n - 1);
|
||||
}
|
||||
return palette;
|
||||
}
|
||||
|
||||
void RasterEncoder::SetPalette(const RGBA *pal)
|
||||
{
|
||||
int n = GetPaletteCount();
|
||||
if(n) {
|
||||
memcpy(Pal(), pal, n * sizeof(RGBA));
|
||||
palette_cv.Create();
|
||||
CreatePaletteCv(Pal(), n, *palette_cv);
|
||||
}
|
||||
}
|
||||
|
||||
void RasterEncoder::SetPalette(Raster& raster)
|
||||
{
|
||||
int n = GetPaletteCount();
|
||||
if(n) {
|
||||
if(raster.GetPaletteCount() == n)
|
||||
memcpy(Pal(), raster.GetPalette(), n * sizeof(RGBA));
|
||||
else
|
||||
CreatePalette(raster, Pal(), n);
|
||||
palette_cv.Create();
|
||||
CreatePaletteCv(Pal(), n, *palette_cv);
|
||||
}
|
||||
}
|
||||
|
||||
void RasterEncoder::Create(Size sz, const RGBA *palette)
|
||||
{
|
||||
SetPalette(palette);
|
||||
Create(sz);
|
||||
}
|
||||
|
||||
void RasterEncoder::Create(int cx, int cy, const RGBA *palette)
|
||||
{
|
||||
SetPalette(palette);
|
||||
Create(cx, cy);
|
||||
}
|
||||
|
||||
void RasterEncoder::Create(Size sz, Raster& pal_raster)
|
||||
{
|
||||
SetPalette(pal_raster);
|
||||
Create(sz);
|
||||
}
|
||||
|
||||
void RasterEncoder::Create(int cx, int cy, Raster& pal_raster)
|
||||
{
|
||||
SetPalette(pal_raster);
|
||||
Create(cx, cy);
|
||||
}
|
||||
|
||||
int RasterEncoder::GetPaletteCount()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
RasterEncoder::~RasterEncoder() {}
|
||||
|
||||
void ImageEncoder::Start(Size sz)
|
||||
{
|
||||
ii = 0;
|
||||
ib.Create(sz);
|
||||
if(sz.cy)
|
||||
SetLine(ib[0]);
|
||||
}
|
||||
|
||||
void ImageEncoder::WriteLineRaw(const byte *data)
|
||||
{
|
||||
if((RGBA *)data != ~*this)
|
||||
memcpy(~*this, data, GetSize().cx * sizeof(RGBA));
|
||||
if(++ii < GetHeight())
|
||||
SetLine(ib[ii]);
|
||||
}
|
||||
|
||||
void StreamRasterEncoder::Save(Stream& s, Raster& raster)
|
||||
{
|
||||
SetStream(s);
|
||||
Size sz = raster.GetSize();
|
||||
Create(sz, raster);
|
||||
SetDots(raster.GetInfo().dots);
|
||||
SetHotSpot(raster.GetInfo().hotspot);
|
||||
for(int i = 0; i < sz.cy; i++)
|
||||
WriteLine(raster[i]);
|
||||
}
|
||||
|
||||
bool StreamRasterEncoder::SaveFile(const char *fn, Raster& raster)
|
||||
{
|
||||
FileOut out(fn);
|
||||
Save(out, raster);
|
||||
return !out.IsError();
|
||||
}
|
||||
|
||||
String StreamRasterEncoder::SaveString(Raster& raster)
|
||||
{
|
||||
StringStream ss;
|
||||
Save(ss, raster);
|
||||
return ss;
|
||||
}
|
||||
|
||||
void StreamRasterEncoder::Save(Stream& s, const Image& img)
|
||||
{
|
||||
ImageRaster r(img);
|
||||
Save(s, r);
|
||||
}
|
||||
|
||||
bool StreamRasterEncoder::SaveFile(const char *fn, const Image& img)
|
||||
{
|
||||
ImageRaster r(img);
|
||||
return SaveFile(fn, r);
|
||||
}
|
||||
|
||||
String StreamRasterEncoder::SaveString(const Image& img)
|
||||
{
|
||||
ImageRaster r(img);
|
||||
return SaveString(r);
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
Loading…
Add table
Add a link
Reference in a new issue