[DEV] add generation of circle (easy after ellipse)
This commit is contained in:
parent
4b38dfcd5a
commit
be10ea356c
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include <esvg/debug.h>
|
#include <esvg/debug.h>
|
||||||
#include <esvg/Circle.h>
|
#include <esvg/Circle.h>
|
||||||
|
#include <esvg/render/Path.h>
|
||||||
|
#include <esvg/render/Weight.h>
|
||||||
|
|
||||||
#undef __class__
|
#undef __class__
|
||||||
#define __class__ "Circle"
|
#define __class__ "Circle"
|
||||||
@ -63,35 +65,68 @@ void esvg::Circle::display(int32_t _spacing) {
|
|||||||
|
|
||||||
void esvg::Circle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) {
|
void esvg::Circle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _level) {
|
||||||
SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Circle");
|
SVG_VERBOSE(spacingDist(_level) << "DRAW esvg::Circle");
|
||||||
/*
|
if (m_radius <= 0.0f) {
|
||||||
_myRenderer.m_renderArea->color(agg::rgba8(m_paint.fill.r, m_paint.fill.g, m_paint.fill.b, m_paint.fill.a));
|
SVG_VERBOSE(spacingDist(_level+1) << "Too small radius" << m_radius);
|
||||||
// Creating an ellipse
|
return;
|
||||||
agg::ellipse myCircle(m_position.x(), m_position.y(), m_radius, m_radius, 0);
|
}
|
||||||
|
esvg::render::Path listElement;
|
||||||
|
listElement.clear();
|
||||||
|
listElement.moveTo(false, m_position + vec2(m_radius, 0.0f));
|
||||||
|
listElement.curveTo(false,
|
||||||
|
m_position + vec2(m_radius, m_radius*esvg::kappa90),
|
||||||
|
m_position + vec2(m_radius*esvg::kappa90, m_radius),
|
||||||
|
m_position + vec2(0.0f, m_radius));
|
||||||
|
listElement.curveTo(false,
|
||||||
|
m_position + vec2(-m_radius*esvg::kappa90, m_radius),
|
||||||
|
m_position + vec2(-m_radius, m_radius*esvg::kappa90),
|
||||||
|
m_position + vec2(-m_radius, 0.0f));
|
||||||
|
listElement.curveTo(false,
|
||||||
|
m_position + vec2(-m_radius, -m_radius*esvg::kappa90),
|
||||||
|
m_position + vec2(-m_radius*esvg::kappa90, -m_radius),
|
||||||
|
m_position + vec2(0.0f, -m_radius));
|
||||||
|
listElement.curveTo(false,
|
||||||
|
m_position + vec2(m_radius*esvg::kappa90, -m_radius),
|
||||||
|
m_position + vec2(m_radius, -m_radius*esvg::kappa90),
|
||||||
|
m_position + vec2(m_radius, 0.0f));
|
||||||
|
listElement.close();
|
||||||
|
|
||||||
// Calculate transformation matrix ...
|
mat2 mtx = m_transformMatrix;
|
||||||
mat2 mtx = m_transformMatrix;
|
|
||||||
mtx *= _basicTrans;
|
mtx *= _basicTrans;
|
||||||
|
|
||||||
// set the filling mode :
|
esvg::render::PointList listPoints;
|
||||||
_myRenderer.m_rasterizer.filling_rule((m_paint.flagEvenOdd)?agg::fill_even_odd:agg::fill_non_zero);
|
listPoints = listElement.generateListPoints(_level,
|
||||||
|
_myRenderer.getInterpolationRecurtionMax(),
|
||||||
if (m_paint.fill.a != 0x00) {
|
_myRenderer.getInterpolationThreshold());
|
||||||
agg::conv_transform<agg::ellipse, mat2> trans(myCircle, mtx);
|
esvg::render::SegmentList listSegmentFill;
|
||||||
_myRenderer.m_rasterizer.add_path(trans);
|
esvg::render::SegmentList listSegmentStroke;
|
||||||
agg::render_scanlines(_myRenderer.m_rasterizer, _myRenderer.m_scanLine, *_myRenderer.m_renderArea);
|
esvg::render::Weight tmpFill;
|
||||||
|
esvg::render::Weight tmpStroke;
|
||||||
|
// Check if we need to display background
|
||||||
|
if (m_paint.fill.a() != 0x00) {
|
||||||
|
listSegmentFill.createSegmentList(listPoints);
|
||||||
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
|
tmpFill.generate(_myRenderer.getSize(),
|
||||||
|
_myRenderer.getNumberSubScanLine(),
|
||||||
|
listSegmentFill);
|
||||||
}
|
}
|
||||||
|
// check if we need to display stroke:
|
||||||
if (m_paint.strokeWidth > 0 && m_paint.stroke.a!=0x00 ) {
|
if ( m_paint.strokeWidth > 0
|
||||||
_myRenderer.m_renderArea->color(agg::rgba8(m_paint.stroke.r, m_paint.stroke.g, m_paint.stroke.b, m_paint.stroke.a));
|
&& m_paint.stroke.a() != 0x00) {
|
||||||
// drawing as an outline
|
listSegmentStroke.createSegmentListStroke(listPoints);
|
||||||
agg::conv_stroke<agg::ellipse> myCircleStroke(myCircle);
|
// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
|
||||||
myCircleStroke.width(m_paint.strokeWidth);
|
tmpStroke.generate(_myRenderer.getSize(),
|
||||||
agg::conv_transform<agg::conv_stroke<agg::ellipse>, mat2> transStroke(myCircleStroke, mtx);
|
_myRenderer.getNumberSubScanLine(),
|
||||||
// set the filling mode :
|
listSegmentStroke);
|
||||||
_myRenderer.m_rasterizer.filling_rule(agg::fill_non_zero);
|
|
||||||
_myRenderer.m_rasterizer.add_path(transStroke);
|
|
||||||
agg::render_scanlines(_myRenderer.m_rasterizer, _myRenderer.m_scanLine, *_myRenderer.m_renderArea);
|
|
||||||
}
|
}
|
||||||
*/
|
// add on images:
|
||||||
|
_myRenderer.print(tmpFill,
|
||||||
|
m_paint.fill,
|
||||||
|
tmpStroke,
|
||||||
|
m_paint.stroke,
|
||||||
|
m_paint.opacity);
|
||||||
|
#ifdef DEBUG
|
||||||
|
_myRenderer.addDebugSegment(listSegmentFill);
|
||||||
|
_myRenderer.addDebugSegment(listSegmentStroke);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user