From dbed4e043e24d35bd47b15a7fa7520a9ea8b0054 Mon Sep 17 00:00:00 2001 From: cxl Date: Sat, 24 Jan 2009 18:45:38 +0000 Subject: [PATCH] PainterExamples improvements git-svn-id: svn://ultimatepp.org/upp/trunk@799 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- examples/PainterExamples/Curves.cpp | 8 + examples/PainterExamples/Examples.h | 27 +++ examples/PainterExamples/Examples.lay | 13 +- examples/PainterExamples/Image.cpp | 10 + examples/PainterExamples/StrokeBug.cpp | 7 +- examples/PainterExamples/main.cpp | 271 ++++++++++++++----------- 6 files changed, 206 insertions(+), 130 deletions(-) diff --git a/examples/PainterExamples/Curves.cpp b/examples/PainterExamples/Curves.cpp index ef9390d5c..b85e3a68e 100644 --- a/examples/PainterExamples/Curves.cpp +++ b/examples/PainterExamples/Curves.cpp @@ -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); } diff --git a/examples/PainterExamples/Examples.h b/examples/PainterExamples/Examples.h index 32c2bd1f0..e2cfe9c42 100644 --- a/examples/PainterExamples/Examples.h +++ b/examples/PainterExamples/Examples.h @@ -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 > 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 diff --git a/examples/PainterExamples/Examples.lay b/examples/PainterExamples/Examples.lay index 03fce83a9..57952e69c 100644 --- a/examples/PainterExamples/Examples.lay +++ b/examples/PainterExamples/Examples.lay @@ -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 diff --git a/examples/PainterExamples/Image.cpp b/examples/PainterExamples/Image.cpp index e0984679e..1b65205ad 100644 --- a/examples/PainterExamples/Image.cpp +++ b/examples/PainterExamples/Image.cpp @@ -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); } diff --git a/examples/PainterExamples/StrokeBug.cpp b/examples/PainterExamples/StrokeBug.cpp index a4c122f79..b9ac595ed 100644 --- a/examples/PainterExamples/StrokeBug.cpp +++ b/examples/PainterExamples/StrokeBug.cpp @@ -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); } diff --git a/examples/PainterExamples/main.cpp b/examples/PainterExamples/main.cpp index 3805c2c65..a5102da3e 100644 --- a/examples/PainterExamples/main.cpp +++ b/examples/PainterExamples/main.cpp @@ -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 > 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(); } -