mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-09-09 03:24:59 -06:00
PainterExamples improvements
git-svn-id: svn://ultimatepp.org/upp/trunk@799 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
34cce65e1d
commit
dbed4e043e
6 changed files with 206 additions and 130 deletions
|
|
@ -11,6 +11,13 @@ void Cubic(Painter& sw)
|
|||
.Stroke(2, Red());
|
||||
}
|
||||
|
||||
void CubicDashed(Painter& sw)
|
||||
{
|
||||
sw.Move(100, 200).Cubic(100, 100, 250, 100, 250, 200).Cubic(400, 300, 400, 200)
|
||||
.Dash("4")
|
||||
.Stroke(2, Red());
|
||||
}
|
||||
|
||||
void Cubics(Painter& sw)
|
||||
{
|
||||
sw.Begin();
|
||||
|
|
@ -32,6 +39,7 @@ void Quadratic(Painter& sw)
|
|||
INITBLOCK {
|
||||
RegisterExample("Path: Move, Line, Fill, Stroke", Triangle);
|
||||
RegisterExample("Path: Cubic", Cubic);
|
||||
RegisterExample("Path: Cubic, Dashed stroke", CubicDashed);
|
||||
RegisterExample("Path: Cubics, using Path", Cubics);
|
||||
RegisterExample("Path: Quadratic", Quadratic);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,4 +15,31 @@ using namespace Upp;
|
|||
|
||||
void RegisterExample(const char *name, void (*ex)(Painter& pw));
|
||||
|
||||
struct App : TopWindow {
|
||||
virtual void Paint(Draw& w);
|
||||
|
||||
SplitterFrame split;
|
||||
ArrayCtrl list;
|
||||
FrameBottom< WithCtrlLayout<StaticRect> > ctrl;
|
||||
|
||||
typedef App CLASSNAME;
|
||||
|
||||
void DoPaint0(Painter& sw);
|
||||
void DoPaint(Painter& sw);
|
||||
void Print();
|
||||
void Benchmark();
|
||||
void Sync();
|
||||
void ToSlider(EditDouble *e, SliderCtrl *slider);
|
||||
void ToEdit(EditDouble *e, SliderCtrl *slider);
|
||||
void Pair(EditDouble& e, SliderCtrl& slider);
|
||||
void ToSlider();
|
||||
void Reset();
|
||||
void Serialize(Stream& s);
|
||||
|
||||
App();
|
||||
~App();
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
LAYOUT(CtrlLayout, 196, 304)
|
||||
LAYOUT(CtrlLayout, 196, 344)
|
||||
ITEM(Label, dv___0, SetLabel(t_("Translate X")).LeftPosZ(4, 72).TopPosZ(4, 19))
|
||||
ITEM(EditDoubleSpin, translate_x, SetInc(1).Min(0).Max(2000).LeftPosZ(4, 64).TopPosZ(24, 19))
|
||||
ITEM(SliderCtrl, translate_x_slider, HSizePosZ(72, 4).TopPosZ(22, 24))
|
||||
|
|
@ -9,7 +9,7 @@ LAYOUT(CtrlLayout, 196, 304)
|
|||
ITEM(EditDoubleSpin, rotate, Min(0).Max(6.29).LeftPosZ(4, 64).TopPosZ(112, 19))
|
||||
ITEM(SliderCtrl, rotate_slider, HSizePosZ(72, 4).TopPosZ(110, 24))
|
||||
ITEM(Label, dv___9, SetLabel(t_("Scale")).LeftPosZ(4, 52).TopPosZ(136, 19))
|
||||
ITEM(EditDoubleSpin, scale, Min(0).Max(10).LeftPosZ(4, 64).TopPosZ(156, 19))
|
||||
ITEM(EditDoubleSpin, scale, Min(0).Max(3).LeftPosZ(4, 64).TopPosZ(156, 19))
|
||||
ITEM(SliderCtrl, scale_slider, HSizePosZ(72, 4).TopPosZ(154, 24))
|
||||
ITEM(Label, dv___12, SetLabel(t_("Scale X")).LeftPosZ(4, 52).TopPosZ(180, 19))
|
||||
ITEM(EditDoubleSpin, scale_x, Min(0).Max(2).LeftPosZ(4, 64).TopPosZ(200, 19))
|
||||
|
|
@ -17,8 +17,11 @@ LAYOUT(CtrlLayout, 196, 304)
|
|||
ITEM(Label, dv___15, SetLabel(t_("Opacity")).LeftPosZ(4, 52).TopPosZ(224, 19))
|
||||
ITEM(EditDoubleSpin, opacity, SetInc(0.05).Min(0).Max(1).HSizePosZ(4, 128).TopPosZ(244, 19))
|
||||
ITEM(SliderCtrl, opacity_slider, HSizePosZ(72, 4).TopPosZ(242, 24))
|
||||
ITEM(Button, reset, SetLabel(t_("Reset")).HSizePosZ(4, 132).TopPosZ(272, 24))
|
||||
ITEM(Button, print, SetLabel(t_("Print")).HSizePosZ(68, 68).TopPosZ(272, 24))
|
||||
ITEM(Button, benchmark, SetLabel(t_("Benchmark")).HSizePosZ(132, 4).TopPosZ(272, 24))
|
||||
ITEM(Option, painting, SetLabel(t_("Paint through Painting")).LeftPosZ(4, 188).TopPosZ(268, 16))
|
||||
ITEM(DropList, linejoin, LeftPosZ(4, 92).TopPosZ(288, 19))
|
||||
ITEM(DropList, linecap, LeftPosZ(104, 88).TopPosZ(288, 19))
|
||||
ITEM(Button, reset, SetLabel(t_("Reset")).HSizePosZ(4, 132).TopPosZ(316, 24))
|
||||
ITEM(Button, print, SetLabel(t_("Print")).HSizePosZ(68, 68).TopPosZ(316, 24))
|
||||
ITEM(Button, benchmark, SetLabel(t_("Benchmark")).HSizePosZ(132, 4).TopPosZ(316, 24))
|
||||
END_LAYOUT
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
void ImageExact(Painter& sw)
|
||||
{
|
||||
sw.Rectangle(10, 10, 1000, 600)
|
||||
// .Fill(TestImg::test(), 200, 100, 300, 300) _DBG_
|
||||
.Fill(TestImg::test(), 100, 100, 500, 100)
|
||||
.Stroke(2, Black());
|
||||
}
|
||||
|
|
@ -11,10 +12,18 @@ void ImageExact(Painter& sw)
|
|||
void ImageReflect(Painter& sw)
|
||||
{
|
||||
sw.Rectangle(10, 10, 1000, 600)
|
||||
// .Fill(TestImg::test(), 200, 100, 300, 300, GRADIENT_REFLECT) _DBG_
|
||||
.Fill(TestImg::test(), 100, 100, 500, 100, FILL_REFLECT)
|
||||
.Stroke(2, Black());
|
||||
}
|
||||
|
||||
void ImageVPadHReflect(Painter& sw)
|
||||
{
|
||||
sw.Rectangle(10, 10, 1000, 600)
|
||||
.Fill(TestImg::test(), 100, 100, 500, 100, FILL_HREFLECT|FILL_VPAD)
|
||||
.Stroke(2, Black());
|
||||
}
|
||||
|
||||
void ImagePad(Painter& sw)
|
||||
{
|
||||
sw.Rectangle(10, 10, 1000, 600)
|
||||
|
|
@ -34,4 +43,5 @@ INITBLOCK {
|
|||
RegisterExample("Image fill reflect", ImageReflect);
|
||||
RegisterExample("Image fill pad", ImagePad);
|
||||
RegisterExample("Image fill repeat", ImageRepeat);
|
||||
RegisterExample("Image vpad&hreflect", ImageVPadHReflect);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,21 +1,18 @@
|
|||
#include "Examples.h"
|
||||
|
||||
void StrokeBug(Painter& sw)
|
||||
void Stroke(Painter& sw)
|
||||
{
|
||||
const char *txt = "GRM";//ADIENT TEXT";
|
||||
Font fnt = Arial(100).Bold();
|
||||
Size tsz = GetTextSize(txt, fnt);
|
||||
sw.Scale(3, 3);
|
||||
// sw.Translate(-300, 0);
|
||||
sw.Text(100, 100, txt, fnt)
|
||||
.Stroke(10, 100, 100, Blue(), 100 + tsz.cx, 100, LtRed())
|
||||
.Stroke(0.25, White());
|
||||
sw.Opacity(0.7);
|
||||
sw.Path("M 100 100 L 200 100 L 210 90 L 220 40 L 230 90 L 240 100 L 400 100")
|
||||
.EvenOdd(true)
|
||||
.Stroke(24, Blue());
|
||||
}
|
||||
|
||||
INITBLOCK {
|
||||
RegisterExample("Stroke bug (fixed)", StrokeBug);
|
||||
RegisterExample("Stroke", Stroke);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,134 +22,165 @@ void RegisterExample(const char *name, void (*ex)(Painter& pw))
|
|||
x.example = ex;
|
||||
}
|
||||
|
||||
struct App : TopWindow {
|
||||
SplitterFrame split;
|
||||
ArrayCtrl list;
|
||||
FrameBottom< WithCtrlLayout<StaticRect> > ctrl;
|
||||
|
||||
void DoPaint(Painter& sw)
|
||||
{
|
||||
sw.Translate(~ctrl.translate_x, ~ctrl.translate_y);
|
||||
sw.Rotate(~ctrl.rotate);
|
||||
sw.Scale(~ctrl.scale, (double)~ctrl.scale * (double)~ctrl.scale_x);
|
||||
sw.Opacity(~ctrl.opacity);
|
||||
sw.Clear(White());
|
||||
if(list.IsCursor())
|
||||
Examples()[list.GetCursor()].example(sw);
|
||||
void App::DoPaint0(Painter& sw)
|
||||
{
|
||||
sw.Translate(~ctrl.translate_x, ~ctrl.translate_y);
|
||||
sw.Rotate(~ctrl.rotate);
|
||||
sw.Scale(~ctrl.scale, (double)~ctrl.scale * (double)~ctrl.scale_x);
|
||||
sw.Opacity(~ctrl.opacity);
|
||||
sw.LineCap(~ctrl.linecap);
|
||||
sw.LineJoin(~ctrl.linejoin);
|
||||
sw.Clear(White());
|
||||
PAINTER_TIMING("Paint");
|
||||
if(list.IsCursor())
|
||||
Examples()[list.GetCursor()].example(sw);
|
||||
}
|
||||
|
||||
void App::DoPaint(Painter& sw)
|
||||
{
|
||||
if(ctrl.painting) {
|
||||
PaintingPainter h(2000, 2000);
|
||||
DoPaint0(h);
|
||||
sw.Paint(h);
|
||||
}
|
||||
|
||||
void Print()
|
||||
{
|
||||
PaintingPainter sw(1000, 1000);
|
||||
DoPaint(sw);
|
||||
PrinterJob pb;
|
||||
if(pb.Execute())
|
||||
pb.GetDraw().DrawPainting(0, 0, 4000, 4000, sw);
|
||||
}
|
||||
|
||||
void Benchmark()
|
||||
{
|
||||
int time;
|
||||
int time0 = GetTickCount();
|
||||
int n = 0;
|
||||
for(;;) {
|
||||
time = GetTickCount();
|
||||
if(time - time0 > 1000) break;
|
||||
ImageBuffer ib(GetSize());
|
||||
BufferPainter sw(ib);
|
||||
DoPaint(sw);
|
||||
n++;
|
||||
}
|
||||
PromptOK("Benchmark: " + AsString(double(time - time0) / n) + " ms");
|
||||
}
|
||||
|
||||
virtual void Paint(Draw& w)
|
||||
{
|
||||
else
|
||||
DoPaint0(sw);
|
||||
}
|
||||
|
||||
void App::Print()
|
||||
{
|
||||
PaintingPainter sw(1000, 1000);
|
||||
DoPaint(sw);
|
||||
PrinterJob pb;
|
||||
if(pb.Execute())
|
||||
pb.GetDraw().DrawPainting(0, 0, 4000, 4000, sw);
|
||||
}
|
||||
|
||||
void App::Benchmark()
|
||||
{
|
||||
int time;
|
||||
int time0 = GetTickCount();
|
||||
int n = 0;
|
||||
for(;;) {
|
||||
time = GetTickCount();
|
||||
if(time - time0 > 1000) break;
|
||||
ImageBuffer ib(GetSize());
|
||||
BufferPainter sw(ib);
|
||||
DoPaint(sw);
|
||||
w.DrawImage(0, 0, ib);
|
||||
}
|
||||
|
||||
void Sync()
|
||||
{
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void ToSlider(EditDouble *e, SliderCtrl *slider)
|
||||
{
|
||||
double v = ~*e;
|
||||
*slider <<= fround(1000.0 * (v - e->GetMin()) / (e->GetMax() - e->GetMin()));
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void ToEdit(EditDouble *e, SliderCtrl *slider)
|
||||
{
|
||||
int x = ~*slider;
|
||||
*e <<= x * (e->GetMax() - e->GetMin()) / 1000.0 + e->GetMin();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void Pair(EditDouble& e, SliderCtrl& slider)
|
||||
{
|
||||
e <<= THISBACK2(ToSlider, &e, &slider);
|
||||
slider <<= THISBACK2(ToEdit, &e, &slider);
|
||||
slider.MinMax(0, 1000);
|
||||
n++;
|
||||
}
|
||||
PromptOK("Benchmark: " + AsString(double(time - time0) / n) + " ms");
|
||||
}
|
||||
|
||||
void ToSlider()
|
||||
{
|
||||
ToSlider(&ctrl.rotate, &ctrl.rotate_slider);
|
||||
ToSlider(&ctrl.scale, &ctrl.scale_slider);
|
||||
ToSlider(&ctrl.scale_x, &ctrl.scale_x_slider);
|
||||
ToSlider(&ctrl.translate_x, &ctrl.translate_x_slider);
|
||||
ToSlider(&ctrl.translate_y, &ctrl.translate_y_slider);
|
||||
ToSlider(&ctrl.opacity, &ctrl.opacity_slider);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ctrl.rotate <<= ctrl.translate_x <<= ctrl.translate_y <<= 0;
|
||||
ctrl.scale <<= ctrl.scale_x <<= ctrl.opacity <<= 1.0;
|
||||
ToSlider();
|
||||
}
|
||||
|
||||
typedef App CLASSNAME;
|
||||
|
||||
App() {
|
||||
AddFrame(split);
|
||||
split.Left(list, HorzLayoutZoom(200));
|
||||
list.WhenSel = THISBACK(Sync);
|
||||
list.AddColumn();
|
||||
list.NoHeader();
|
||||
for(int i = 0; i < Examples().GetCount(); i++)
|
||||
list.Add(Examples()[i].name);
|
||||
list.FindSetCursor(LoadFile(ConfigFile("last")));
|
||||
Sync();
|
||||
Sizeable().Zoomable();
|
||||
ctrl.Height(ctrl.GetLayoutSize().cy);
|
||||
CtrlLayout(ctrl);
|
||||
list.InsertFrame(0, ctrl);
|
||||
Reset();
|
||||
Pair(ctrl.rotate, ctrl.rotate_slider);
|
||||
Pair(ctrl.scale, ctrl.scale_slider);
|
||||
Pair(ctrl.scale_x, ctrl.scale_x_slider);
|
||||
Pair(ctrl.translate_x, ctrl.translate_x_slider);
|
||||
Pair(ctrl.translate_y, ctrl.translate_y_slider);
|
||||
Pair(ctrl.opacity, ctrl.opacity_slider);
|
||||
ctrl.reset <<= THISBACK(Reset);
|
||||
ctrl.benchmark <<= THISBACK(Benchmark);
|
||||
ctrl.print <<= THISBACK(Print);
|
||||
}
|
||||
~App()
|
||||
{
|
||||
if(list.IsCursor())
|
||||
SaveFile(ConfigFile("last"), list.GetKey());
|
||||
}
|
||||
};
|
||||
void App::Paint(Draw& w)
|
||||
{
|
||||
ImageBuffer ib(GetSize());
|
||||
BufferPainter sw(ib);
|
||||
DoPaint(sw);
|
||||
w.DrawImage(0, 0, ib);
|
||||
}
|
||||
|
||||
void App::Sync()
|
||||
{
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void App::ToSlider(EditDouble *e, SliderCtrl *slider)
|
||||
{
|
||||
double v = ~*e;
|
||||
*slider <<= fround(1000.0 * (v - e->GetMin()) / (e->GetMax() - e->GetMin()));
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void App::ToEdit(EditDouble *e, SliderCtrl *slider)
|
||||
{
|
||||
int x = ~*slider;
|
||||
*e <<= x * (e->GetMax() - e->GetMin()) / 1000.0 + e->GetMin();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void App::Pair(EditDouble& e, SliderCtrl& slider)
|
||||
{
|
||||
e <<= THISBACK2(ToSlider, &e, &slider);
|
||||
slider <<= THISBACK2(ToEdit, &e, &slider);
|
||||
slider.MinMax(0, 1000);
|
||||
}
|
||||
|
||||
void App::ToSlider()
|
||||
{
|
||||
ToSlider(&ctrl.rotate, &ctrl.rotate_slider);
|
||||
ToSlider(&ctrl.scale, &ctrl.scale_slider);
|
||||
ToSlider(&ctrl.scale_x, &ctrl.scale_x_slider);
|
||||
ToSlider(&ctrl.translate_x, &ctrl.translate_x_slider);
|
||||
ToSlider(&ctrl.translate_y, &ctrl.translate_y_slider);
|
||||
ToSlider(&ctrl.opacity, &ctrl.opacity_slider);
|
||||
}
|
||||
|
||||
void App::Reset()
|
||||
{
|
||||
ctrl.rotate <<= ctrl.translate_x <<= ctrl.translate_y <<= 0;
|
||||
ctrl.scale <<= ctrl.scale_x <<= ctrl.opacity <<= 1.0;
|
||||
ctrl.painting = false;
|
||||
ctrl.linejoin <<= LINEJOIN_MITER;
|
||||
ctrl.linecap <<= LINECAP_BUTT;
|
||||
ToSlider();
|
||||
}
|
||||
|
||||
void App::Serialize(Stream& s)
|
||||
{
|
||||
s
|
||||
% ctrl.rotate % ctrl.rotate_slider
|
||||
% ctrl.scale % ctrl.scale_slider
|
||||
% ctrl.scale_x % ctrl.scale_x_slider
|
||||
% ctrl.translate_x % ctrl.translate_x_slider
|
||||
% ctrl.translate_y % ctrl.translate_y_slider
|
||||
% ctrl.opacity % ctrl.opacity_slider
|
||||
% ctrl.painting
|
||||
;
|
||||
}
|
||||
|
||||
App::App() {
|
||||
AddFrame(split);
|
||||
split.Left(list, HorzLayoutZoom(200));
|
||||
list.WhenSel = THISBACK(Sync);
|
||||
list.AddColumn();
|
||||
list.NoHeader();
|
||||
for(int i = 0; i < Examples().GetCount(); i++)
|
||||
list.Add(Examples()[i].name);
|
||||
list.FindSetCursor(LoadFile(ConfigFile("last")));
|
||||
Sync();
|
||||
Sizeable().Zoomable();
|
||||
ctrl.Height(ctrl.GetLayoutSize().cy);
|
||||
CtrlLayout(ctrl);
|
||||
list.InsertFrame(0, ctrl);
|
||||
Pair(ctrl.rotate, ctrl.rotate_slider);
|
||||
Pair(ctrl.scale, ctrl.scale_slider);
|
||||
Pair(ctrl.scale_x, ctrl.scale_x_slider);
|
||||
Pair(ctrl.translate_x, ctrl.translate_x_slider);
|
||||
Pair(ctrl.translate_y, ctrl.translate_y_slider);
|
||||
Pair(ctrl.opacity, ctrl.opacity_slider);
|
||||
ctrl.linecap.Add(LINECAP_BUTT, "Butt caps");
|
||||
ctrl.linecap.Add(LINECAP_SQUARE, "Square caps");
|
||||
ctrl.linecap.Add(LINECAP_ROUND, "Round caps");
|
||||
ctrl.linejoin.Add(LINEJOIN_MITER, "Miter joins");
|
||||
ctrl.linejoin.Add(LINEJOIN_ROUND, "Round joins");
|
||||
ctrl.linejoin.Add(LINEJOIN_BEVEL, "Bevel joins");
|
||||
ctrl.linecap <<= ctrl.linejoin <<= ctrl.painting <<= THISBACK(Sync);
|
||||
ctrl.reset <<= THISBACK(Reset);
|
||||
ctrl.benchmark <<= THISBACK(Benchmark);
|
||||
ctrl.print <<= THISBACK(Print);
|
||||
Reset();
|
||||
LoadFromFile(*this);
|
||||
}
|
||||
|
||||
App::~App()
|
||||
{
|
||||
if(list.IsCursor())
|
||||
SaveFile(ConfigFile("last"), list.GetKey());
|
||||
StoreToFile(*this);
|
||||
}
|
||||
|
||||
GUI_APP_MAIN
|
||||
{
|
||||
App().Run();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue