drawing-context.h revision d2e42b9425ccd4c2d4c20c2217455da177035e48
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg/**
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * @file
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * Cairo drawing context with Inkscape extensions.
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg *//*
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * Authors:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * Krzysztof Kosiński <tweenk.pl@gmail.com>
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg *
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * Copyright (C) 2011 Authors
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg * Released under GNU GPL, read the file 'COPYING' for more information
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg */
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#ifndef SEEN_INKSCAPE_DISPLAY_DRAWING_CONTEXT_H
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#define SEEN_INKSCAPE_DISPLAY_DRAWING_CONTEXT_H
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#include <2geom/affine.h>
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#include <2geom/angle.h>
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#include <2geom/rect.h>
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg#include <2geom/transforms.h>
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński#include <boost/utility.hpp>
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński#include <cairo.h>
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdgtypedef unsigned int guint32;
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdgnamespace Inkscape {
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdgclass DrawingSurface;
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosińskiclass DrawingContext
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński : boost::noncopyable
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński{
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskipublic:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg class Save {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg public:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg Save();
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg Save(DrawingContext &dc);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg ~Save();
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void save(DrawingContext &dc);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg private:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg DrawingContext *_dc;
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg };
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg DrawingContext(cairo_t *ct, Geom::Point const &origin);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg DrawingContext(cairo_surface_t *surface, Geom::Point const &origin);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg DrawingContext(DrawingSurface &s);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg ~DrawingContext();
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void save() { cairo_save(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void restore() { cairo_restore(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void pushGroup() { cairo_push_group(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void pushAlphaGroup() { cairo_push_group_with_content(_ct, CAIRO_CONTENT_ALPHA); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void popGroupToSource() { cairo_pop_group_to_source(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void transform(Geom::Affine const &trans);
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński void translate(Geom::Point const &t) { cairo_translate(_ct, t[Geom::X], t[Geom::Y]); } // todo: take Translate
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void translate(double dx, double dy) { cairo_translate(_ct, dx, dy); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void scale(Geom::Scale const &s) { cairo_scale(_ct, s[Geom::X], s[Geom::Y]); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void scale(double sx, double sy) { cairo_scale(_ct, sx, sy); }
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void moveTo(Geom::Point const &p) { cairo_move_to(_ct, p[Geom::X], p[Geom::Y]); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void lineTo(Geom::Point const &p) { cairo_line_to(_ct, p[Geom::X], p[Geom::Y]); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void curveTo(Geom::Point const &p1, Geom::Point const &p2, Geom::Point const &p3) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_curve_to(_ct, p1[Geom::X], p1[Geom::Y], p2[Geom::X], p2[Geom::Y], p3[Geom::X], p3[Geom::Y]);
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg }
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński void arc(Geom::Point const &center, double radius, Geom::AngleInterval const &angle);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void closePath() { cairo_close_path(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void rectangle(Geom::Rect const &r) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rectangle(_ct, r.left(), r.top(), r.width(), r.height());
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void rectangle(Geom::IntRect const &r) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rectangle(_ct, r.left(), r.top(), r.width(), r.height());
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg // Used in drawing-text.cpp to overwrite glyphs, which have the opposite path rotation as a regular rect
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński void revrectangle(Geom::Rect const &r) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_move_to ( _ct, r.left(), r.top() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, 0, r.height() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, r.width(), 0 );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, 0, -r.height() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_close_path ( _ct);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void revrectangle(Geom::IntRect const &r) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_move_to ( _ct, r.left(), r.top() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, 0, r.height() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, r.width(), 0 );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_rel_line_to (_ct, 0, -r.height() );
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_close_path ( _ct);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void newPath() { cairo_new_path(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void newSubpath() { cairo_new_sub_path(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void path(Geom::PathVector const &pv);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński void paint(double alpha = 1.0);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void fill() { cairo_fill(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void fillPreserve() { cairo_fill_preserve(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void stroke() { cairo_stroke(_ct); }
1bc4dd6dd6f59d7b59bc923ea565ebd1321684aejohanengelen void strokePreserve() { cairo_stroke_preserve(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void clip() { cairo_clip(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setLineWidth(double w) { cairo_set_line_width(_ct, w); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setLineCap(cairo_line_cap_t cap) { cairo_set_line_cap(_ct, cap); }
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg void setLineJoin(cairo_line_join_t join) { cairo_set_line_join(_ct, join); }
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg void setMiterLimit(double miter) { cairo_set_miter_limit(_ct, miter); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setFillRule(cairo_fill_rule_t rule) { cairo_set_fill_rule(_ct, rule); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setOperator(cairo_operator_t op) { cairo_set_operator(_ct, op); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setTolerance(double tol) { cairo_set_tolerance(_ct, tol); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSource(cairo_pattern_t *source) { cairo_set_source(_ct, source); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSource(cairo_surface_t *surface, double x, double y) {
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_set_source_surface(_ct, surface, x, y);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSource(double r, double g, double b, double a = 1.0) {
fe9eeff08e8901ae06ce3b24392a2ce3ec57c131jaspervdg cairo_set_source_rgba(_ct, r, g, b, a);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSource(guint32 rgba);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSource(DrawingSurface *s);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void setSourceCheckerboard();
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg void patternSetFilter(cairo_filter_t filter) {
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński cairo_pattern_set_filter(cairo_get_source(_ct), filter);
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński }
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński Geom::Rect targetLogicalBounds() const;
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_t *raw() { return _ct; }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg cairo_surface_t *rawTarget() { return cairo_get_group_target(_ct); }
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
29c9448f89266af28fee59a311378b94d562de45johanengelen DrawingSurface *surface() { return _surface; } // Needed to find scale in drawing-item.cpp
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdgprivate:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg DrawingContext(cairo_t *ct, DrawingSurface *surface, bool destroy);
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński cairo_t *_ct;
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński DrawingSurface *_surface;
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński bool _delete_surface;
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński bool _restore_context;
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg friend class DrawingSurface;
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg};
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
dc401b1fae917f8655e605efcd95904ebedd79e3Krzysztof Kosiński} // end namespace Inkscape
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg#endif // !SEEN_INKSCAPE_DISPLAY_DRAWING_ITEM_H
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg/*
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg Local Variables:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg mode:c++
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg c-file-style:"stroustrup"
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg indent-tabs-mode:nil
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg fill-column:99
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg End:
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg*/
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
f30a3d27abf3baff3c4cc30512d9dbf19224a65ajaspervdg