diff --git a/bazaar/PainterSvg demo/Demo.svg b/bazaar/PainterSvg demo/Demo.svg
new file mode 100644
index 000000000..774707a53
--- /dev/null
+++ b/bazaar/PainterSvg demo/Demo.svg
@@ -0,0 +1,75 @@
+
+
+
+
diff --git a/bazaar/PainterSvg demo/Examples.h b/bazaar/PainterSvg demo/Examples.h
new file mode 100644
index 000000000..ca1ec63c2
--- /dev/null
+++ b/bazaar/PainterSvg demo/Examples.h
@@ -0,0 +1,39 @@
+#ifndef _PainterExamples_Examples_h_
+#define _PainterExamples_Examples_h_
+
+#include
+#include
+
+using namespace Upp;
+
+#define LAYOUTFILE
+#include
+
+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/bazaar/PainterSvg demo/Examples.lay b/bazaar/PainterSvg demo/Examples.lay
new file mode 100644
index 000000000..9269b11aa
--- /dev/null
+++ b/bazaar/PainterSvg demo/Examples.lay
@@ -0,0 +1,29 @@
+LAYOUT(CtrlLayout, 212, 384)
+ ITEM(Label, dv___0, SetLabel(t_("Translate X")).LeftPosZ(4, 72).TopPosZ(4, 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, 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))
+ 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(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))
+ 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).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, 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/bazaar/PainterSvg demo/Glacier.jpg b/bazaar/PainterSvg demo/Glacier.jpg
new file mode 100644
index 000000000..60881f67c
Binary files /dev/null and b/bazaar/PainterSvg demo/Glacier.jpg differ
diff --git a/bazaar/PainterSvg demo/PainterSvg demo.upp b/bazaar/PainterSvg demo/PainterSvg demo.upp
new file mode 100644
index 000000000..96ac8413c
--- /dev/null
+++ b/bazaar/PainterSvg demo/PainterSvg demo.upp
@@ -0,0 +1,16 @@
+description "Svg Painter demo";
+
+uses
+ CtrlLib,
+ PainterSvg;
+
+file
+ Examples.h,
+ SvgDemo.cpp,
+ main.cpp,
+ Examples.lay;
+
+mainconfig
+ "" = "GUI",
+ "" = "GUI SSE2";
+
diff --git a/bazaar/PainterSvg demo/Piechart.svg b/bazaar/PainterSvg demo/Piechart.svg
new file mode 100644
index 000000000..c4b197039
--- /dev/null
+++ b/bazaar/PainterSvg demo/Piechart.svg
@@ -0,0 +1,32 @@
+
+
+
diff --git a/bazaar/PainterSvg demo/SvgDemo.cpp b/bazaar/PainterSvg demo/SvgDemo.cpp
new file mode 100644
index 000000000..553080dba
--- /dev/null
+++ b/bazaar/PainterSvg demo/SvgDemo.cpp
@@ -0,0 +1,25 @@
+#include "Examples.h"
+
+String file = "C:\\Demo.svg";
+
+void SvgDemo(Painter& sw)
+{
+ try {
+ if (FileExists(file))
+ ParseSVG(sw, LoadFileBOM(file), GetFileDirectory(file));
+ else {
+ sw.Scale(1./20);
+ sw.Text(200, 200, "File '" + file + "' not found", Font(Font::ARIAL, 400));
+ sw.Opacity(1);
+ sw.Stroke(1, Black());
+ sw.Fill(Black());
+ }
+ }
+ catch(XmlError e) {
+ LOG("SVG XML error: " + e);
+ }
+}
+
+INITBLOCK {
+ RegisterExample("Svg demo", SvgDemo);
+}
diff --git a/bazaar/PainterSvg demo/init b/bazaar/PainterSvg demo/init
new file mode 100644
index 000000000..6a440b6ef
--- /dev/null
+++ b/bazaar/PainterSvg demo/init
@@ -0,0 +1,6 @@
+#ifndef _PainterSvg_demo_icpp_init_stub
+#define _PainterSvg_demo_icpp_init_stub
+#include "CtrlLib/init"
+#include "PainterSvg/init"
+#include "plugin\jpg/init"
+#endif
diff --git a/bazaar/PainterSvg demo/main.cpp b/bazaar/PainterSvg demo/main.cpp
new file mode 100644
index 000000000..626ccfeaf
--- /dev/null
+++ b/bazaar/PainterSvg demo/main.cpp
@@ -0,0 +1,206 @@
+#include "Examples.h"
+
+extern String file;
+
+struct Example {
+ void (*example)(Painter& pw);
+ String name;
+};
+
+Array& Examples()
+{
+ static Array x;
+ return x;
+};
+
+void RegisterExample(const char *name, void (*ex)(Painter& pw))
+{
+ Example& x = Examples().Add();
+ x.name = name;
+ x.example = ex;
+}
+
+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);
+ { PAINTER_TIMING("FILL");
+ if(ctrl.transparent)
+ sw.Clear(RGBAZero());
+ else
+ sw.Clear(White());
+ }
+ 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);
+ }
+ 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(800, 600);
+ BufferPainter sw(ib, ctrl.quality);
+ PAINTER_TIMING("Paint");
+ DoPaint(sw);
+ n++;
+ }
+ PromptOK("Benchmark: " + AsString(double(time - time0) / n) + " ms");
+}
+
+void App::Paint(Draw& w)
+{
+ 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);
+}
+
+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.quality = MODE_ANTIALIASED;
+ 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 % ctrl.quality % ctrl.transparent
+ ;
+}
+
+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 <<= ctrl.quality <<= ctrl.transparent <<= THISBACK(Sync);
+ ctrl.reset <<= THISBACK(Reset);
+ ctrl.benchmark <<= THISBACK(Benchmark);
+ ctrl.print <<= THISBACK(Print);
+ Reset();
+ LoadFromFile(*this);
+ Title("Painter 2.0");
+
+ if (!FileExists(file)) {
+ FileSel fsel;
+
+ fsel.Type("Svg file", "*.svg");
+ fsel <<= Nvl(file, GetHomeDirectory());
+ if(fsel.ExecuteOpen("Choose file"))
+ file <<= ~fsel;
+ }
+}
+
+App::~App()
+{
+ if(list.IsCursor())
+ SaveFile(ConfigFile("last"), list.GetKey());
+ StoreToFile(*this);
+}
+
+GUI_APP_MAIN
+{
+ App().Run();
+}