diff --git a/examples/PainterExamples/Arc.cpp b/examples/PainterExamples/Arc.cpp index 337278696..843749381 100644 --- a/examples/PainterExamples/Arc.cpp +++ b/examples/PainterExamples/Arc.cpp @@ -6,6 +6,20 @@ void Arc(Painter& sw) sw.Move(400, 400).Arc(400, 400, 100, 100, 0.0, M_PI / 3).Fill(LtCyan()).Stroke(2, Black()); } +void SvgArc(Painter& sw) +{ + sw.Path("M300,200 h-150 a150,150 0 1,0 150,-150 z").Fill(Red()).Stroke(5, Blue()); + sw.Path("M275,175 v-150 a150,150 0 0,0 -150,150 z").Fill(Yellow()).Stroke(5, Blue()); + sw.Path( + "M600,350 l 50,-25 " + "a25,25 -30 0,1 50,-25 l 50,-25 " + "a25,50 -30 0,1 50,-25 l 50,-25 " + "a25,75 -30 0,1 50,-25 l 50,-25 " + "a25,100 -30 0,1 50,-25 l 50,-25" + ).Stroke(5, Red()); +} + INITBLOCK { RegisterExample("Arc example", Arc); + RegisterExample("SvgArc example", SvgArc); } diff --git a/examples/PainterExamples/Big.cpp b/examples/PainterExamples/Big.cpp index 18590a42e..06cd3dd01 100644 --- a/examples/PainterExamples/Big.cpp +++ b/examples/PainterExamples/Big.cpp @@ -1,51 +1,51 @@ -#include "Examples.h" - -#ifndef _DEBUG - -void Big(Painter& sw) -{ - int n = 0; - double sgn = 1; - for(int r = 400; r > 5; r -= 3) { - for(int i = 0; i < 400; i++) { - Pointf p = Polar(sgn * i * M_2PI / 400) * (double)r + Pointf(400, 400); - if(i) - sw.Line(p); - else - sw.Move(p); - sw.Line(Polar(sgn * (i * M_2PI / 400 + M_2PI / 800)) * ((double)r - 6) + Pointf(400, 400)); - n += 2; - } - sw.Close(); - sgn = -sgn; - } - sw.Fill(Black()); - sw.Text(0, 0, "Elements: " + AsString(n), Arial(20)).Fill(Blue()); -} - -void BigStroke(Painter& sw) -{ - int n = 0; - double r = 400; - int i = 0; - while(r > 5) { - Pointf p = Polar(i * M_2PI / 400) * r + Pointf(400, 400); - if(i) - sw.Line(p); - else - sw.Move(p); - sw.Line(Polar((i * M_2PI / 400 + M_2PI / 800)) * (r - 3) + Pointf(400, 400)); - n += 2; - r = r - 0.01; - i++; - } - sw.Stroke(1, Black()); - sw.Text(0, 0, "Elements: " + AsString(n), Arial(20)).Fill(Blue()); -} - -INITBLOCK { - RegisterExample("Really Big Polygon", Big); - RegisterExample("Really Big Stroke", BigStroke); -} - -#endif +#include "Examples.h" + +#ifndef _DEBUG + +void Big(Painter& sw) +{ + int n = 0; + double sgn = 1; + for(int r = 400; r > 5; r -= 3) { + for(int i = 0; i < 400; i++) { + Pointf p = Polar(sgn * i * M_2PI / 400) * r + Pointf(400, 400); + if(i) + sw.Line(p); + else + sw.Move(p); + sw.Line(Polar(sgn * (i * M_2PI / 400 + M_2PI / 800)) * (r - 6) + Pointf(400, 400)); + n += 2; + } + sw.Close(); + sgn = -sgn; + } + sw.Fill(Black()); + sw.Text(0, 0, "Elements: " + AsString(n), Arial(20)).Fill(Blue()); +} + +void BigStroke(Painter& sw) +{ + int n = 0; + double r = 400; + int i = 0; + while(r > 5) { + Pointf p = Polar(i * M_2PI / 400) * r + Pointf(400, 400); + if(i) + sw.Line(p); + else + sw.Move(p); + sw.Line(Polar((i * M_2PI / 400 + M_2PI / 800)) * (r - 3) + Pointf(400, 400)); + n += 2; + r = r - 0.01; + i++; + } + sw.Stroke(1, Black()); + sw.Text(0, 0, "Elements: " + AsString(n), Arial(20)).Fill(Blue()); +} + +INITBLOCK { + RegisterExample("Really Big Polygon", Big); + RegisterExample("Really Big Stroke", BigStroke); +} + +#endif \ No newline at end of file diff --git a/examples/PainterExamples/Clipping.cpp b/examples/PainterExamples/Clipping.cpp index 70c35cf13..1d4219af8 100644 --- a/examples/PainterExamples/Clipping.cpp +++ b/examples/PainterExamples/Clipping.cpp @@ -10,7 +10,6 @@ void ClippingExample(Painter& sw) sw.Text(0, 0, txt, fnt).Fill(Green()); sw.End(); sw.Text(0, 0, txt, fnt).Stroke(0.5, Black()); - } void NoClippingExample(Painter& sw) diff --git a/examples/PainterExamples/Examples.lay b/examples/PainterExamples/Examples.lay index 57952e69c..9269b11aa 100644 --- a/examples/PainterExamples/Examples.lay +++ b/examples/PainterExamples/Examples.lay @@ -1,9 +1,9 @@ -LAYOUT(CtrlLayout, 196, 344) +LAYOUT(CtrlLayout, 212, 384) 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(EditDoubleSpin, translate_x, Min(0).Max(2000).LeftPosZ(4, 64).TopPosZ(24, 19)) ITEM(SliderCtrl, translate_x_slider, HSizePosZ(72, 4).TopPosZ(22, 24)) ITEM(Label, dv___3, SetLabel(t_("Translate Y")).LeftPosZ(4, 72).TopPosZ(48, 19)) - ITEM(EditDoubleSpin, translate_y, SetInc(1).Min(0).Max(2000).LeftPosZ(4, 64).TopPosZ(68, 19)) + ITEM(EditDoubleSpin, translate_y, Min(0).Max(2000).LeftPosZ(4, 64).TopPosZ(68, 19)) ITEM(SliderCtrl, translate_y_slider, HSizePosZ(72, 4).TopPosZ(66, 24)) ITEM(Label, dv___6, SetLabel(t_("Rotate")).LeftPosZ(4, 52).TopPosZ(92, 19)) ITEM(EditDoubleSpin, rotate, Min(0).Max(6.29).LeftPosZ(4, 64).TopPosZ(112, 19)) @@ -15,13 +15,15 @@ LAYOUT(CtrlLayout, 196, 344) ITEM(EditDoubleSpin, scale_x, Min(0).Max(2).LeftPosZ(4, 64).TopPosZ(200, 19)) ITEM(SliderCtrl, scale_x_slider, HSizePosZ(72, 4).TopPosZ(198, 24)) 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(EditDoubleSpin, opacity, SetInc(0.05).Min(0).Max(1).LeftPosZ(4, 64).TopPosZ(244, 19)) ITEM(SliderCtrl, opacity_slider, HSizePosZ(72, 4).TopPosZ(242, 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)) + ITEM(Option, painting, SetLabel(t_("Paint through Painting")).LeftPosZ(4, 128).TopPosZ(268, 20)) + ITEM(DropList, linejoin, LeftPosZ(4, 100).BottomPosZ(33, 19)) + ITEM(DropList, linecap, RightPosZ(4, 100).BottomPosZ(33, 19)) + ITEM(Button, reset, SetLabel(t_("Reset")).LeftPosZ(4, 64).BottomPosZ(4, 24)) + ITEM(Button, print, SetLabel(t_("Print")).HSizePosZ(72, 80).BottomPosZ(4, 24)) + ITEM(Button, benchmark, SetLabel(t_("Benchmark")).RightPosZ(4, 72).BottomPosZ(4, 24)) + ITEM(Switch, quality, SetLabel(t_("Antialiased\nNoAA\nSubpixel")).LeftPosZ(4, 204).TopPosZ(312, 16)) + ITEM(Option, transparent, SetLabel(t_("Transparent background")).LeftPosZ(4, 204).TopPosZ(288, 20)) END_LAYOUT diff --git a/examples/PainterExamples/Lion.cpp b/examples/PainterExamples/Lion.cpp index 99eb2f5ed..e75a2184e 100644 --- a/examples/PainterExamples/Lion.cpp +++ b/examples/PainterExamples/Lion.cpp @@ -189,18 +189,6 @@ void PaintLion(Painter& sw) } } -void PaintLionNoAA(Painter& sw) -{ - static Vector l = Lion(); - for(int i = 0; i < l.GetCount(); i++) { - Vector& p = l[i].point; - sw.Move(p[0].x, p[0].y); - for(int j = 1; j < p.GetCount(); j++) - sw.Line(p[j].x, p[j].y); - sw.NoAA().Fill(l[i].color); - } -} - void Demo(Painter& sw) { PaintLion(sw); @@ -224,6 +212,5 @@ void Demo(Painter& sw) INITBLOCK { RegisterExample("Lion", PaintLion); - RegisterExample("Lion NoAA", PaintLionNoAA); RegisterExample("U++ Painter", Demo); } diff --git a/examples/PainterExamples/PainterExamples.upp b/examples/PainterExamples/PainterExamples.upp index 0320a9ffa..d98aaae0b 100644 --- a/examples/PainterExamples/PainterExamples.upp +++ b/examples/PainterExamples/PainterExamples.upp @@ -34,5 +34,6 @@ file Test.iml; mainconfig - "" = "GUI"; + "" = "GUI", + "" = "GUI SSE2"; diff --git a/examples/PainterExamples/Radial.cpp b/examples/PainterExamples/Radial.cpp index d193e4b75..05ae0fa07 100644 --- a/examples/PainterExamples/Radial.cpp +++ b/examples/PainterExamples/Radial.cpp @@ -7,6 +7,14 @@ void Radial(Painter& sw) .Stroke(1, Black()); } +void FocusRadial(Painter& sw) +{ + sw.Circle(400.5, 400.5, 200) + .Fill(300, 300, Blue(), 400.5, 400.5, 200, LtRed()) + .Stroke(1, Black()); +} + INITBLOCK { RegisterExample("Radial gradient", Radial); + RegisterExample("Radial focus gradient", FocusRadial); } diff --git a/examples/PainterExamples/TextFillSolid.cpp b/examples/PainterExamples/TextFillSolid.cpp index 23ada2b68..5583285cf 100644 --- a/examples/PainterExamples/TextFillSolid.cpp +++ b/examples/PainterExamples/TextFillSolid.cpp @@ -6,6 +6,44 @@ void TextFillSolid(Painter& sw) .Fill(LtBlue()); } +const char *text = "Quick Brown Fox Jumps Over The Lazy Dog!"; + +void SomeTexts(Painter& sw) +{ + int face[] = { + Font::ARIAL, Font::ROMAN, Font::COURIER + }; + int height[] = { + 10, 16, 20 + }; + sw.Rectangle(600, 0, 1000, 1000).Fill(Blue()); + for(int x = 20; x < 1000; x += 600) { + double y = 20; + for(int h = 0; h < __countof(height); h++) + for(int italic = 0; italic < 2; italic++) + for(int bold = 0; bold < 2; bold++) + for(int c = 0; c < __countof(face); c++) { + sw.Text(x, y, text, Font().Face(face[c]).Height(height[h]).Italic(italic).Bold(bold)) + .Fill(x == 20 ? Black() : White()); + y += height[h] + 2; + } + } +} + +void ZBug(Painter& sw) +{ + sw.Text(100, 100, "z", Roman(25).Italic()).Fill(Black()); + sw.Text(130, 100, "z", Roman(70).Italic()).Fill(Black()); +} + +void WBug(Painter& sw) +{ + sw.Text(100, 100, "w", Roman(20).Bold()).Fill(Black()); +} + INITBLOCK { RegisterExample("Filling text with solid color", TextFillSolid); + RegisterExample("Various fonts", SomeTexts); + RegisterExample("ZBug", ZBug); + RegisterExample("WBug", WBug); } diff --git a/examples/PainterExamples/main.cpp b/examples/PainterExamples/main.cpp index 1f3551856..13396a613 100644 --- a/examples/PainterExamples/main.cpp +++ b/examples/PainterExamples/main.cpp @@ -31,9 +31,11 @@ void App::DoPaint0(Painter& sw) sw.LineCap(~ctrl.linecap); sw.LineJoin(~ctrl.linejoin); { PAINTER_TIMING("FILL"); - sw.Clear(White()); + if(ctrl.transparent) + sw.Clear(RGBAZero()); + else + sw.Clear(White()); } - PAINTER_TIMING("Paint"); if(list.IsCursor()) Examples()[list.GetCursor()].example(sw); } @@ -67,7 +69,8 @@ void App::Benchmark() time = GetTickCount(); if(time - time0 > 1000) break; ImageBuffer ib(800, 600); - BufferPainter sw(ib); + BufferPainter sw(ib, ctrl.quality); + PAINTER_TIMING("Paint"); DoPaint(sw); n++; } @@ -76,8 +79,14 @@ void App::Benchmark() void App::Paint(Draw& w) { - ImageBuffer ib(GetSize()); - BufferPainter sw(ib); + Size sz = GetSize(); + if(ctrl.transparent) { + for(int y = 0; y + 32 < sz.cy; y += 32) + for(int x = 0; x + 32 < sz.cx; x += 32) + w.DrawRect(x, y, 32, 32, (x ^ y) & 32 ? Color(254, 172, 120) : Color(124, 135, 253)); + } + ImageBuffer ib(sz); + BufferPainter sw(ib, ctrl.quality); DoPaint(sw); w.DrawImage(0, 0, ib); } @@ -123,6 +132,7 @@ 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.quality = MODE_ANTIALIASED; ctrl.linejoin <<= LINEJOIN_MITER; ctrl.linecap <<= LINECAP_BUTT; ToSlider(); @@ -137,7 +147,7 @@ void App::Serialize(Stream& s) % ctrl.translate_x % ctrl.translate_x_slider % ctrl.translate_y % ctrl.translate_y_slider % ctrl.opacity % ctrl.opacity_slider - % ctrl.painting + % ctrl.painting % ctrl.quality % ctrl.transparent ; } @@ -167,7 +177,7 @@ App::App() { 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.linecap <<= ctrl.linejoin <<= ctrl.painting <<= ctrl.quality <<= ctrl.transparent <<= THISBACK(Sync); ctrl.reset <<= THISBACK(Reset); ctrl.benchmark <<= THISBACK(Benchmark); ctrl.print <<= THISBACK(Print);