mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-21 06:45:39 -06:00
DrawBench cairo optimization
git-svn-id: svn://ultimatepp.org/upp/trunk@765 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
e0966b540d
commit
888812b003
1 changed files with 83 additions and 81 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue