ultimatepp/olddraw/Painter/PainterPath.cpp
cxl fa47b4615a developing new draw
git-svn-id: svn://ultimatepp.org/upp/trunk@1372 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-07-06 20:31:00 +00:00

107 lines
1.8 KiB
C++

#include "Painter.h"
NAMESPACE_UPP
bool Painter::ReadBool(CParser& p)
{
while(p.Char(','));
if(p.Char('1')) return true;
p.Char('0');
return false;
}
double Painter::ReadDouble(CParser& p)
{
while(p.Char(','));
return p.IsDouble() ? p.ReadDouble() : 0;
}
Pointf Painter::ReadPoint(CParser& p)
{
Pointf t;
t.x = ReadDouble(p);
t.y = ReadDouble(p);
return t;
}
Painter& Painter::Path(CParser& p)
{
while(!p.IsEof()) {
int c = p.GetChar();
p.Spaces();
bool rel = IsLower(c);
Pointf t, t1, t2;
switch(ToUpper(c)) {
case 'M':
t = ReadPoint(p);
Move(t, rel);
case 'L':
while(p.IsDouble()) {
t = ReadPoint(p);
Line(t, rel);
}
break;
case 'Z':
Close();
break;
case 'H':
while(p.IsDouble())
Line(p.ReadDouble(), Null, rel);
break;
case 'V':
while(p.IsDouble())
Line(Null, p.ReadDouble(), rel);
break;
case 'C':
while(p.IsDouble()) {
t1 = ReadPoint(p);
t2 = ReadPoint(p);
t = ReadPoint(p);
Cubic(t1, t2, t, rel);
}
break;
case 'S':
while(p.IsDouble()) {
t2 = ReadPoint(p);
t = ReadPoint(p);
Cubic(t2, t, rel);
}
break;
case 'Q':
while(p.IsDouble()) {
t1 = ReadPoint(p);
t = ReadPoint(p);
Quadratic(t1, t, rel);
}
break;
case 'T':
while(p.IsDouble()) {
t = ReadPoint(p);
Quadratic(t, rel);
}
break;
case 'A':
while(p.IsDouble()) {
t1 = ReadPoint(p);
double xangle = ReadDouble(p);
bool large = ReadBool(p);
bool sweep = ReadBool(p);
t = ReadPoint(p);
SvgArc(t1, xangle * M_PI / 180.0, large, sweep, t, rel);
}
break;
default:
return *this;
}
}
return *this;
}
Painter& Painter::Path(const char *path)
{
CParser p(path);
Path(p);
return *this;
}
END_UPP_NAMESPACE