X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h new file mode 100644 index 0000000..dff27b0 --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h @@ -0,0 +1,181 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + +#ifndef __SCHEMA__ +#define __SCHEMA__ + + +#include "device.h" +#include +#include +#include + +using namespace std; + +const double dWire = 8; ///< distance between two wires +//const double dLetter = 6; ///< width of a letter +const double dLetter = 4.3; ///< width of a letter +const double dHorz = 4; ///< marge horizontale +const double dVert = 4; ///< marge verticale + + +struct point +{ + double x; + double y; + + point(double u, double v) : x(u), y(v) {} + point(const point& p) : x(p.x), y(p.y) {} + + bool operator<(const point& p) const { + if (x < p.x) return true; + else if (x > p.x) return false; + else if (y < p.y) return true; + else return false; + } +}; + +struct trait +{ + point start; + point end; + bool hasRealInput; + bool hasRealOutput; + + trait(const point& p1, const point& p2) : start(p1), end(p2) {} + void draw(device& dev) const { dev.trait(start.x, start.y, end.x, end.y); } + + bool operator<(const trait& t) const { + if (start < t.start) return true; + else if (t.start < start) return false; + else if (end < t.end) return true; + else return false; + } +}; + +struct collector +{ + set fOutputs; // collect real outputs + set fInputs; // collect real inputs + set fTraits; // collect traits to draw + set fWithInput; // collect traits with a real input + set fWithOutput; // collect traits with a real output + + void addOutput(const point& p) { fOutputs.insert(p); } + void addInput(const point& p) { fInputs.insert(p); } + void addTrait(const trait& t) { fTraits.insert(t); } + void computeVisibleTraits(); + bool isVisible(const trait& t); + void draw(device& dev); +}; + +enum { kLeftRight=1, kRightLeft=-1 }; + + + +/** + * An abstract block diagram schema + */ +class schema +{ + private: + const unsigned int fInputs; + const unsigned int fOutputs; + const double fWidth; + const double fHeight; + + // fields only defined after place() is called + bool fPlaced; ///< false until place() is called + double fX; + double fY; + int fOrientation; + + public: + + schema(unsigned int inputs, unsigned int outputs, double width, double height) + : fInputs(inputs), + fOutputs(outputs), + fWidth(width), + fHeight(height), + fPlaced(false), + fX(0), + fY(0), + fOrientation(0) + {} + virtual ~schema() {} + + // constant fields + double width() const { return fWidth; } + double height() const { return fHeight; } + unsigned int inputs() const { return fInputs; } + unsigned int outputs() const { return fOutputs; } + + // starts and end placement + void beginPlace (double x, double y, int orientation) + { fX = x; fY = y; fOrientation = orientation; } + void endPlace () { fPlaced = true; } + + // fields available after placement + bool placed() const { return fPlaced; } + double x() const { return fX; } + double y() const { return fY; } + int orientation() const { return fOrientation; } + + + // abstract interface for subclasses + virtual void place(double x, double y, int orientation) = 0; + virtual void draw(device& dev) = 0; + virtual void collectTraits(collector& c) = 0; + virtual point inputPoint(unsigned int i) const = 0; + virtual point outputPoint(unsigned int i)const = 0; +}; + +// various functions to create schemas + +schema* makeBlockSchema (unsigned int inputs, + unsigned int outputs, + const string& name, + const string& color, + const string& link); + +schema* makeCableSchema (unsigned int n=1); +schema* makeInverterSchema (const string& color); +schema* makeCutSchema (); +schema* makeEnlargedSchema (schema* s, double width); +schema* makeParSchema (schema* s1, schema* s2); +schema* makeSeqSchema (schema* s1, schema* s2); +schema* makeMergeSchema (schema* s1, schema* s2); +schema* makeSplitSchema (schema* s1, schema* s2); +schema* makeRecSchema (schema* s1, schema* s2); +schema* makeTopSchema (schema* s1, double margin, const string& text, const string& link); +schema* makeDecorateSchema (schema* s1, double margin, const string& text); + + + + + + + + + +#endif + +