From 888812b00354eff38aee1f813791cf4c7c11c9b8 Mon Sep 17 00:00:00 2001 From: cxl Date: Fri, 16 Jan 2009 16:52:02 +0000 Subject: [PATCH] DrawBench cairo optimization git-svn-id: svn://ultimatepp.org/upp/trunk@765 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppdev/DrawBench/pythagorasTree.cpp | 164 ++++++++++++++-------------- 1 file changed, 83 insertions(+), 81 deletions(-) diff --git a/uppdev/DrawBench/pythagorasTree.cpp b/uppdev/DrawBench/pythagorasTree.cpp index 01a036a06..de0be483d 100644 --- a/uppdev/DrawBench/pythagorasTree.cpp +++ b/uppdev/DrawBench/pythagorasTree.cpp @@ -1,82 +1,84 @@ -#include "bench.h" - -//http://cgit.freedesktop.org/cairo/plain/perf/pythagoras-tree.c -void AddRect(Cairo &c, double size) -{ - if (size < 1) - return; - - Pointf p = c.GetCurrentPoint(); - - c.RelMoveTo(-size/2., -size/2.); - c.RelLineTo(size, 0); - c.RelLineTo(0, size); - c.RelLineTo(-size, 0); - c.ClosePath(); - - c.Save(); - c.Translate(-size/2., size); - c.MoveTo(p.x, p.y); - c.Rotate(M_PI/4.); - AddRect(c, size / M_SQRT2); - c.Restore(); - - c.Save(); - c.Translate(size/2., size); - c.MoveTo(p.x, p.y); - c.Rotate(-M_PI/4.); - AddRect(c, size / M_SQRT2); - c.Restore(); -} - -void DoRect(Painter &sw, double size) -{ - if(size < 1) - return; - - sw.Move(0, 0); - sw.Line(0, size); - sw.Line(size, size); - sw.Line(size, 0); - sw.Fill(Blue()); - - sw.Begin(); - sw.Translate(0, size); - sw.Rotate(M_PI/4.); - DoRect(sw, size / M_SQRT2); - sw.End(); - - sw.Begin(); - sw.Translate(size / 2, 1.5 * size); - sw.Rotate(-M_PI/4.); - DoRect(sw, size / M_SQRT2); - sw.End(); -} - -void DrawPythagorasTree(Size sz, Painter *sw, Cairo *ca) -{ - double size = 128; - - if (sw) - { - sw->Begin(); - sw->Translate(sz.cx / 2 - size / 2, sz.cy); - sw->Scale(1, -1); - - DoRect(*sw, size); - sw->End(); - } - - if (ca) - { - ca->Save(); - ca->Translate(0, sz.cy); - ca->Scale(1, -1); - - ca->MoveTo(sz.cx/2, size/2); - AddRect(*ca, size); - ca->SetSourceRGB(Black()); - ca->Fill(); - ca->Restore(); - } +#include "bench.h" + +//http://cgit.freedesktop.org/cairo/plain/perf/pythagoras-tree.c +void AddRect(Cairo &c, double size) +{ + if (size < 1) + return; + + Pointf p = c.GetCurrentPoint(); + + c.RelMoveTo(-size/2., -size/2.); + c.RelLineTo(size, 0); + c.RelLineTo(0, size); + c.RelLineTo(-size, 0); + c.ClosePath(); + + c.Save(); + c.Translate(-size/2., size); + c.MoveTo(p.x, p.y); + c.Rotate(M_PI/4.); + AddRect(c, size / M_SQRT2); + c.Restore(); + + c.Save(); + c.Translate(size/2., size); + c.MoveTo(p.x, p.y); + c.Rotate(-M_PI/4.); + AddRect(c, size / M_SQRT2); + c.Restore(); + + c.Fill(); + +} + +void DoRect(Painter &sw, double size) +{ + if(size < 1) + return; + + sw.Move(0, 0); + sw.Line(0, size); + sw.Line(size, size); + sw.Line(size, 0); + sw.Fill(Blue()); + + sw.Begin(); + sw.Translate(0, size); + sw.Rotate(M_PI/4.); + DoRect(sw, size / M_SQRT2); + sw.End(); + + sw.Begin(); + sw.Translate(size / 2, 1.5 * size); + sw.Rotate(-M_PI/4.); + DoRect(sw, size / M_SQRT2); + sw.End(); +} + +void DrawPythagorasTree(Size sz, Painter *sw, Cairo *ca) +{ + double size = 128; + + if (sw) + { + sw->Begin(); + sw->Translate(sz.cx / 2 - size / 2, sz.cy); + sw->Scale(1, -1); + + DoRect(*sw, size); + sw->End(); + } + + if (ca) + { + ca->Save(); + ca->Translate(0, sz.cy); + ca->Scale(1, -1); + + ca->MoveTo(sz.cx/2, size/2); + AddRect(*ca, size); + ca->SetSourceRGB(Black()); + ca->Restore(); + } } \ No newline at end of file