ultimatepp/uppdev/DrawBench/pythagorasTree.cpp
cxl 251968a27b DrawBench cairo optimization
git-svn-id: svn://ultimatepp.org/upp/trunk@765 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-01-16 16:52:02 +00:00

84 lines
No EOL
1.3 KiB
C++

#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();
}
}