1.先把图元画在bitmap上。
void
draw_ellipse (const db::DPoint &q1,
const db::DPoint &q2,
double length_u,
bool sel,
lay::CanvasPlane *bitmap,
lay::Renderer &renderer)
{
double sel_width = 2 / renderer.resolution ();
if (length_u < 1e-5 /*micron*/) {
if (sel) {
db::DBox b (q1 - db::DVector (sel_width * 0.5, sel_width * 0.5),
q2 + db::DVector (sel_width * 0.5, sel_width * 0.5));
renderer.draw (b, bitmap, bitmap, 0, 0); //画图元
} else {
renderer.draw (db::DEdge (q1, q1), 0, bitmap, 0, 0);
}
...
}
2.画布Canvas是一个widget,画布刷新时,会绘制bitmap。
//layLayoutCanvas.cc
void
LayoutCanvas::paintEvent (QPaintEvent *)
{
...
do_render (m_viewport_l, *this, false);
...
}
//layViewObject.cc
void
ViewObjectWidget::do_render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas, bool st)
{
if (st) {
m_needs_update_static = false;
}
for (object_iterator obj = begin_objects (); obj != end_objects (); ++obj) {
if (obj->m_static == st && obj->is_visible () && (! m_view_objects_dismissed || ! obj->get_dismissable ())) {
BEGIN_PROTECTED_SILENT
obj->render (vp, canvas); //画图元
END_PROTECTED_SILENT
}
}
canvas.sort_planes ();
}