80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz/**
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz * @file
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski * SVG <hatch> implementation
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz */
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz/*
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz * Authors:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski * Tomasz Boczkowski <penginsbacon@gmail.com>
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz * Jon A. Cruz <jon@joncruz.org>
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski *
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski * Copyright (C) 2014 Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski *
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski * Released under GNU GPL, read the file 'COPYING' for more information
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski */
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#ifndef SEEN_SP_HATCH_H
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#define SEEN_SP_HATCH_H
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include <list>
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include <stddef.h>
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include <glibmm/ustring.h>
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include <sigc++/connection.h>
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include "svg/svg-length.h"
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include "svg/svg-angle.h"
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include "sp-paint-server.h"
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#include "uri-references.h"
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass SPHatchReference;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass SPHatchPath;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass SPItem;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskinamespace Inkscape {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass Drawing;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass DrawingPattern;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskinamespace XML {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass Node;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski}
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski}
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass SPHatch : public SPPaintServer {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskipublic:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski enum HatchUnits {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski UNITS_USERSPACEONUSE,
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski UNITS_OBJECTBOUNDINGBOX
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski };
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz class RenderInfo {
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz public:
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz RenderInfo();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz ~RenderInfo();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Geom::Affine child_transform;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Geom::Affine pattern_to_user_transform;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Geom::Rect tile_rect;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski int overflow_steps;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Geom::Affine overflow_step_transform;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Geom::Affine overflow_initial_transform;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski };
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SPHatch();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual ~SPHatch();
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz // Reference (href)
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz Glib::ustring href;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SPHatchReference *ref;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski gdouble x() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski gdouble y() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski gdouble pitch() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski gdouble rotate() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski HatchUnits hatchUnits() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski HatchUnits hatchContentUnits() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski Geom::Affine const &hatchTransform() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SPHatch *rootHatch(); //TODO: const
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz std::vector<SPHatchPath *> hatchPaths();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz std::vector<SPHatchPath const *> hatchPaths() const;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski bool isValid() const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski Inkscape::DrawingPattern *show(Inkscape::Drawing &drawing, unsigned int key, Geom::OptRect bbox);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski void hide(unsigned int key);
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual cairo_pattern_t* pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz RenderInfo calculateRenderInfo(unsigned key) const;
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz Geom::Interval bounds() const;
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz void setBBox(unsigned int key, Geom::OptRect const &bbox);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiprotected:
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void release();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void set(unsigned int key, const gchar* value);
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void update(SPCtx* ctx, unsigned int flags);
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz virtual void modified(unsigned int flags);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiprivate:
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz class View {
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz public:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski View(Inkscape::DrawingPattern *arenaitem, int key);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski //Do not delete arenaitem in destructor.
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz ~View();
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski Inkscape::DrawingPattern *arenaitem;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski Geom::OptRect bbox;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski unsigned int key;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski };
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski typedef std::vector<SPHatchPath *>::iterator ChildIterator;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski typedef std::vector<SPHatchPath const *>::const_iterator ConstChildIterator;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski typedef std::list<View>::iterator ViewIterator;
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski typedef std::list<View>::const_iterator ConstViewIterator;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski static bool _hasHatchPatchChildren(SPHatch const* hatch);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski void _updateView(View &view);
b54fcbf691761f7356ee5239114b8a0adf292cc3Tomasz Boczkowski RenderInfo _calculateRenderInfo(View const &view) const;
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz Geom::OptInterval _calculateStripExtents(Geom::OptRect const &bbox) const;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz /**
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz * Gets called when the hatch is reattached to another <hatch>
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz */
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz void _onRefChanged(SPObject *old_ref, SPObject *ref);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz /**
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz * Gets called when the referenced <hatch> is changed
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz */
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz void _onRefModified(SPObject *ref, guint flags);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz // patternUnits and patternContentUnits attribute
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski HatchUnits _hatchUnits : 1;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski bool _hatchUnits_set : 1;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski HatchUnits _hatchContentUnits : 1;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski bool _hatchContentUnits_set : 1;
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz // hatchTransform attribute
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski Geom::Affine _hatchTransform;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski bool _hatchTransform_set : 1;
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz // Strip
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SVGLength _x;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SVGLength _y;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SVGLength _pitch;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SVGAngle _rotate;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski sigc::connection _modified_connection;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski std::list<View> _display;
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski};
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiclass SPHatchReference : public Inkscape::URIReference {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskipublic:
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz SPHatchReference (SPObject *obj)
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz : URIReference(obj)
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz {}
80d489090f48f0556f30213acdb05bf81d033dcbJon A. Cruz
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski SPHatch *getObject() const {
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski return reinterpret_cast<SPHatch *>(URIReference::getObject());
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski }
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowskiprotected:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski virtual bool _acceptObject(SPObject *obj) const {
901d2d4a59790c220c6589e17dbbf556d47dfe71Marc Jeanmougin return dynamic_cast<SPHatch *>(obj) != NULL && URIReference::_acceptObject(obj);
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski }
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski};
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski#endif // SEEN_SP_HATCH_H
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski/*
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski Local Variables:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski mode:c++
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski c-file-style:"stroustrup"
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski indent-tabs-mode:nil
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski fill-column:99
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski End:
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski*/
6f195ddf891afcc5029baa42fe2007ea923776c0Tomasz Boczkowski// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :