diff --git a/.gitattributes b/.gitattributes index e1c5b116803..d8e9b3ee3b0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1752,6 +1752,7 @@ Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Subdivision_1.h -text Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Subdivision_2.h -text Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/test/simple_models.h -text +Curved_kernel_via_analysis_2/include/CGAL/IO/Qt_widget_Curve_renderer_2.h -text Curved_kernel_via_analysis_2/package_info/Curved_kernel_via_analysis_2/maintainer -text Curved_kernel_via_analysis_2/test/Curved_kernel_via_analysis_2/makefile -text Curved_kernel_via_analysis_2/test/Curved_kernel_via_analysis_2/simple_models.C -text diff --git a/Curved_kernel_via_analysis_2/include/CGAL/IO/Qt_widget_Curve_renderer_2.h b/Curved_kernel_via_analysis_2/include/CGAL/IO/Qt_widget_Curve_renderer_2.h new file mode 100644 index 00000000000..cf506ffbcc9 --- /dev/null +++ b/Curved_kernel_via_analysis_2/include/CGAL/IO/Qt_widget_Curve_renderer_2.h @@ -0,0 +1,193 @@ +// TODO: Add licence +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL:$ +// $Id: $ +// +// +// Author(s) : Pavel Emeliyanenko +// +// ============================================================================ + +/*!\file CGAL/IO/Qt_widget_Curve_renderer_2.h + * \brief + * provides \c CGAL::Qt_widget interface for the curve renderer + */ + +#ifndef CGAL_QT_WIDGET_CURVE_RENDERER_2_H +#define CGAL_QT_WIDGET_CURVE_RENDERER_2_H + +#ifndef CGAL_CKVA_NO_QT_WIDGET_INTERFACE +#include +#include +#endif + +// #include +// #include +// #include +// #include + +#include + +CGAL_BEGIN_NAMESPACE + +namespace CGALi { + +/*!\brief + * represents a single curve renderer instance to speed up rendering of several + * objects using the same parameter set + * + * @warning not recommended to use for multi-threaded applications + */ +template +class Curve_renderer_singleton +{ + Curve_renderer_singleton() { // private constructor + } + +public: + typedef CGAL::Interval_nt Interval_double; + + typedef Curve_renderer_facade + Curve_renderer_inst; + + typedef typename Curve_renderer_inst::Coord_vec_2 Coord_vec_2; + + typedef typename Curve_renderer_inst::Coord_2 Coord_2; + + inline static void draw(const CGAL::Bbox_2& bbox, int res_w, int res_h, + const typename Curve_renderer_inst::Arc_2& arc, + std::list& points, + std::pair& endpoints) { + + _instance()._setup(bbox, res_w, res_h); + _instance().gfx_instance.draw(arc, points, endpoints); + } + + //! returns \c false if the point does not fall within drawing box + inline static bool draw(const CGAL::Bbox_2& bbox, int res_w, int res_h, + const typename Curve_renderer_inst::Point_2& pt, Coord_2& coord) { + + _instance()._setup(bbox, res_w, res_h); + return _instance().gfx_instance.draw(pt, coord); + } + +#ifndef CGAL_CKVA_NO_QT_WIDGET_INTERFACE + static void draw_qt(Qt_widget& ws, + const typename Curve_renderer_inst::Arc_2& arc) + { + std::list points; + std::pair end_points; + + draw(CGAL::Bbox_2(ws.x_min(), ws.y_min(), ws.x_max(), ws.y_max()), + ws.width(), ws.height(), arc, points, end_points); + if(points.empty()) + return; + + QPainter *ppnt = &ws.get_painter(); + int height = ws.height(); + + std::list::const_iterator lit = points.begin(); + while(lit != points.end()) { + + const Coord_vec_2& vec = *lit; + Coord_vec_2::const_iterator vit = vec.begin(); + + if(vec.size() == 2) { + ppnt->moveTo(vit->x, height - vit->y); + vit++; + ppnt->lineTo(vit->x, height - vit->y); + + } else { + ppnt->moveTo(vit->x, height - vit->y); + //std::cout << "(" << (*it).x << "; " << height - (*it).y << + //")\n"; + while(vit != vec.end()) { + ppnt->lineTo(vit->x, height - vit->y); + //std::cout << "(" << (*it).x << "; " << height - (*it).y << + //")\n"; + vit++; + } + } + lit++; + } + + QPen old_pen = ppnt->pen(); + ppnt->setPen(QPen(Qt::NoPen)); // avoid drawing outlines + // draw with the current brush attributes + ppnt->drawEllipse(end_points.first.x-3,height-end_points.first.y-3, + 6, 6); + ppnt->drawEllipse(end_points.second.x-3,height-end_points.second.y-3, + 6, 6); + ppnt->setPen(old_pen); + } + + static void draw_qt(Qt_widget& ws, + const typename Curve_renderer_inst::Point_2& pt) + { + Coord_2 coord; + if(!draw(CGAL::Bbox_2(ws.x_min(), ws.y_min(), ws.x_max(), ws.y_max()), + ws.width(), ws.height(), pt, coord)) + return; + + QPainter *ppnt = &ws.get_painter(); + int height = ws.height(); + + QPen old_pen = ppnt->pen(); + ppnt->setPen(QPen(Qt::NoPen)); + ppnt->drawEllipse(coord.x - 3, height - coord.y - 3, 6, 6); + ppnt->setPen(old_pen); + } +#endif // !CGAL_CKVA_NO_QT_WIDGET_INTERFACE + +private: + + static Curve_renderer_singleton& _instance() { + static Curve_renderer_singleton _this; + return _this; + } + + void _setup(const CGAL::Bbox_2& bbox, int res_w, int res_h) { + int _w, _h; + CGAL::Bbox_2 tmp; + gfx_instance.renderer().get_resolution(_w, _h); + gfx_instance.renderer().get_window(tmp); + + if(bbox != tmp || res_w != _w || res_h != _h) { + gfx_instance.setup(bbox, res_w, res_h); + } + } + + Curve_renderer_inst gfx_instance; +}; + +} // namespace CGALi + +#ifndef CGAL_CKVA_NO_QT_WIDGET_INTERFACE +/*! \brief + * outputs a curve arc to \c Qt_widget + */ +template +Qt_widget& operator << (Qt_widget& ws, const CGALi::Arc_2& arc) { + + CGALi::Curve_renderer_singleton::draw_qt(ws, arc); + return ws; +} + +/*! \brief + * outputs a curve point to \c Qt_widget + */ +template +Qt_widget& operator << (Qt_widget& ws, const CGALi::Point_2& pt) { + + CGALi::Curve_renderer_singleton::draw_qt(ws, pt); + return ws; +} +#endif // !CGAL_CKVA_NO_QT_WIDGET_INTERFACE + +CGAL_END_NAMESPACE + +#endif // CGAL_QT_WIDGET_CURVE_RENDERER_2_H +