* Copyright 2005, Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Simple BShape to agg::path_storage converter, implemented as BShapeIterator.
*
*/
#include "ShapeConverter.h"
ShapeConverter::ShapeConverter()
: BShapeIterator(),
Transformable(),
fPath(NULL)
{
}
ShapeConverter::ShapeConverter(agg::path_storage* path)
: BShapeIterator(),
Transformable(),
fPath(path)
{
}
void
ShapeConverter::SetPath(agg::path_storage* path)
{
fPath = path;
}
status_t
ShapeConverter::IterateMoveTo(BPoint* point)
{
double x = point->x;
double y = point->y;
Transform(&x, &y);
fPath->move_to(x, y);
return B_OK;
}
status_t
ShapeConverter::IterateLineTo(int32 lineCount, BPoint* linePts)
{
while (lineCount--) {
double x = linePts->x;
double y = linePts->y;
Transform(&x, &y);
fPath->line_to(x, y);
linePts++;
}
return B_OK;
}
status_t
ShapeConverter::IterateBezierTo(int32 bezierCount, BPoint* bezierPts)
{
bezierCount /= 3;
while (bezierCount--) {
double x1 = bezierPts[0].x;
double y1 = bezierPts[0].y;
double x2 = bezierPts[1].x;
double y2 = bezierPts[1].y;
double x3 = bezierPts[2].x;
double y3 = bezierPts[2].y;
Transform(&x1, &y1);
Transform(&x2, &y2);
Transform(&x3, &y3);
fPath->curve4(x1, y1, x2, y2, x3, y3);
bezierPts += 3;
}
return B_OK;
}
status_t
ShapeConverter::IterateClose()
{
fPath->close_polygon();
return B_OK;
}