ultimatepp/uppsrc/Painter/Painting.cpp
mirek-fidler 2d0f19053a
Painter2 (#182)
Painter improvements: Multithreaded rendering improved, new image filter (like Lanczos 3) option, image mapping is now more precise
2023-12-24 15:21:23 +01:00

342 lines
6.4 KiB
C++

#include "Painter.h"
namespace Upp {
void PaintingPainter::ClearOp(const RGBA& color)
{
Put(PAINTING_CLEAR);
Put(color);
}
void PaintingPainter::MoveOp(const Pointf& p, bool rel)
{
Put(PAINTING_MOVE + rel);
Putf(p);
}
void PaintingPainter::LineOp(const Pointf& p, bool rel)
{
Put(PAINTING_LINE + rel);
Putf(p);
}
void PaintingPainter::QuadraticOp(const Pointf& p1, const Pointf& p, bool rel)
{
Put(PAINTING_QUADRATIC + rel);
Putf(p1);
Putf(p);
}
void PaintingPainter::QuadraticOp(const Pointf& p, bool rel)
{
Put(PAINTING_QUADRATIC_S + rel);
Putf(p);
}
void PaintingPainter::CubicOp(const Pointf& p1, const Pointf& p2, const Pointf& p, bool rel)
{
Put(PAINTING_CUBIC + rel);
Putf(p1);
Putf(p2);
Putf(p);
}
void PaintingPainter::CubicOp(const Pointf& p2, const Pointf& p, bool rel)
{
Put(PAINTING_CUBIC_S + rel);
Putf(p2);
Putf(p);
}
void PaintingPainter::ArcOp(const Pointf& c, const Pointf& r, double angle, double sweep, bool rel)
{
Put(PAINTING_ARC + rel);
Putf(c);
Putf(r);
Putf(angle);
Putf(sweep);
}
void PaintingPainter::SvgArcOp(const Pointf& r, double xangle, bool large, bool sweep, const Pointf& p, bool rel)
{
Put(PAINTING_SVGARC + rel);
Putf(r);
Putf(xangle);
Put(large);
Put(sweep);
Putf(p);
}
void PaintingPainter::CloseOp()
{
Put(PAINTING_CLOSE);
}
void PaintingPainter::DivOp()
{
Put(PAINTING_DIV);
}
void PaintingPainter::FillOp(const RGBA& color)
{
Put(PAINTING_FILL_SOLID);
Put(color);
}
void PaintingPainter::FillOp(const Image& image, const Xform2D& transsrc, dword flags)
{
Put(PAINTING_FILL_IMAGE);
Putf(transsrc);
Put(flags);
data.Add(image);
}
void PaintingPainter::FillOp(const Pointf& p1, const RGBA& color1, const Pointf& p2,
const RGBA& color2, int style)
{
Put(PAINTING_FILL_GRADIENT);
Putf(p1);
Put(color1);
Putf(p2);
Put(color2);
Put(style);
}
void PaintingPainter::FillOp(const RGBA& color1, const RGBA& color2, const Xform2D& transsrc, int style)
{
Put(PAINTING_FILL_GRADIENT_X);
Put(color1);
Put(color2);
Putf(transsrc);
Put(style);
}
void PaintingPainter::FillOp(const Pointf& f, const RGBA& color1, const RGBA& color2, const Xform2D& transsrc, int style)
{
Put(PAINTING_FILL_RADIAL_X);
Putf(f);
Put(color1);
Put(color2);
Putf(transsrc);
Put(style);
}
void PaintingPainter::StrokeOp(double width, const Pointf& f, const RGBA& color1,
const RGBA& color2, const Xform2D& transsrc, int style)
{
Put(PAINTING_FILL_RADIAL_X);
Putf(width);
Putf(f);
Put(color1);
Put(color2);
Putf(transsrc);
Put(style);
}
void PaintingPainter::FillOp(const Pointf& f, const RGBA& color1,
const Pointf& p, double r, const RGBA& color2, int style)
{
Put(PAINTING_FILL_RADIAL);
Putf(f);
Put(color1);
Putf(p);
Putf(r);
Put(color2);
Put(style);
}
void PaintingPainter::StrokeOp(double width, const RGBA& color)
{
Put(PAINTING_STROKE_SOLID);
Putf(width);
Put(color);
}
void PaintingPainter::StrokeOp(double width, const Image& image,
const Xform2D& transsrc, dword flags)
{
Put(PAINTING_STROKE_IMAGE);
Putf(width);
Putf(transsrc);
Put(flags);
data.Add(image);
}
void PaintingPainter::StrokeOp(double width, const Pointf& p1, const RGBA& color1,
const Pointf& p2, const RGBA& color2, int style)
{
Put(PAINTING_STROKE_GRADIENT);
Putf(width);
Putf(p1);
Put(color1);
Putf(p2);
Put(color2);
Put(style);
}
void PaintingPainter::StrokeOp(double width, const RGBA& color1, const RGBA& color2,
const Xform2D& transsrc, int style)
{
Put(PAINTING_STROKE_GRADIENT_X);
Putf(width);
Put(color1);
Put(color2);
Putf(transsrc);
Put(style);
}
void PaintingPainter::StrokeOp(double width, const Pointf& f,
const RGBA& color1, const Pointf& p, double r,
const RGBA& color2, int style)
{
Put(PAINTING_STROKE_RADIAL);
Putf(width);
Putf(f);
Put(color1);
Putf(p);
Putf(r);
Put(color2);
Put(style);
}
void PaintingPainter::ClipOp()
{
Put(PAINTING_CLIP);
}
void PaintingPainter::CharacterOp(const Pointf& p, int ch, Font fnt)
{
Put(PAINTING_CHARACTER);
Putf(p);
Put32(ch);
Put(fnt);
}
void PaintingPainter::TextOp(const Pointf& p, const wchar *text, Font fnt, int n, const double *dx)
{
Put(PAINTING_TEXT);
Putf(p);
Put32(n);
Put((bool)dx);
Put(fnt);
for(int i = 0; i < n; i++) {
Put32(text[i]);
if(dx)
Putf(dx[i]);
}
}
void PaintingPainter::ColorStopOp(double pos, const RGBA& color)
{
Put(PAINTING_COLORSTOP);
Putf(pos);
Put(color);
}
void PaintingPainter::ClearStopsOp()
{
Put(PAINTING_CLEARSTOPS);
}
void PaintingPainter::OpacityOp(double o)
{
Put(PAINTING_OPACITY);
Putf(o);
}
void PaintingPainter::LineCapOp(int linecap)
{
Put(PAINTING_LINECAP);
Put(linecap);
}
void PaintingPainter::LineJoinOp(int linejoin)
{
Put(PAINTING_LINEJOIN);
Put(linejoin);
}
void PaintingPainter::MiterLimitOp(double l)
{
Put(PAINTING_MITERLIMIT);
Putf(l);
}
void PaintingPainter::EvenOddOp(bool evenodd)
{
Put(PAINTING_EVENODD);
Put(evenodd);
}
void PaintingPainter::InvertOp(bool invert)
{
Put(PAINTING_INVERT);
Put(invert);
}
void PaintingPainter::ImageFilterOp(int filter)
{
Put(PAINTING_IMAGE_FILTER);
Put(filter);
}
void PaintingPainter::DashOp(const Vector<double>& dash, double start)
{
Put(PAINTING_DASH);
Put32(dash.GetCount());
for(int i = 0; i < dash.GetCount(); i++)
Putf(dash[i]);
Putf(start);
}
void PaintingPainter::TransformOp(const Xform2D& m)
{
Put(PAINTING_TRANSFORM);
Putf(m);
}
void PaintingPainter::BeginOp()
{
Put(PAINTING_BEGIN);
}
void PaintingPainter::EndOp()
{
Put(PAINTING_END);
}
void PaintingPainter::BeginMaskOp()
{
Put(PAINTING_BEGINMASK);
}
void PaintingPainter::BeginOnPathOp(double q, bool abs)
{
Put(PAINTING_BEGINONPATH);
Putf(q);
Put(abs);
}
Painting PaintingPainter::GetResult()
{
Painting p;
p.cmd = cmd.GetResult();
p.data = data;
p.size = size;
return p;
}
void PaintingPainter::Create(double cx, double cy)
{
cmd.Create();
size.cx = cx;
size.cy = cy;
}
void PaintingPainter::Create(Sizef sz)
{
Create(sz.cx, sz.cy);
}
}