1 /************************************************************************
2 ************************************************************************
4 Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
5 ---------------------------------------------------------------------
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 ************************************************************************
20 ************************************************************************/
23 #include "splitSchema.h"
30 * Creates a new split schema. Cables are enlarged to dWire.
31 * The horizontal gap between the two subschema is such that
32 * the connections are not too slopy.
34 schema
* makeSplitSchema (schema
* s1
, schema
* s2
)
36 // make sure a and b are at least dWire large
37 schema
* a
= makeEnlargedSchema(s1
, dWire
);
38 schema
* b
= makeEnlargedSchema(s2
, dWire
);
40 // horizontal gap to avaoid too slopy connections
41 double hgap
= (a
->height()+b
->height())/4;
43 return new splitSchema(a
,b
,hgap
);
48 * Constructor for a split schema s1 <: s2 where the outputs
49 * of s1 are distributed to the inputs of s2. The constructor is
50 * private in order to enforce the usage of makeSplitSchema
52 splitSchema::splitSchema (schema
* s1
, schema
* s2
, double hgap
)
53 : schema( s1
->inputs(),
55 s1
->width() + s2
->width() + hgap
,
56 max(s1
->height(), s2
->height()) ),
65 * Places the two subschema horizontaly, centered, with enough gap for
68 void splitSchema::place(double ox
, double oy
, int orientation
)
70 beginPlace(ox
, oy
, orientation
);
72 double dy1
= max(0.0, fSchema2
->height()-fSchema1
->height()) / 2.0;
73 double dy2
= max(0.0, fSchema1
->height()-fSchema2
->height()) / 2.0;
75 if (orientation
== kLeftRight
) {
76 fSchema1
->place(ox
, oy
+dy1
, orientation
);
77 fSchema2
->place(ox
+fSchema1
->width()+fHorzGap
, oy
+dy2
, orientation
);
79 fSchema2
->place(ox
, oy
+dy2
, orientation
);
80 fSchema1
->place(ox
+fSchema2
->width()+fHorzGap
, oy
+dy1
, orientation
);
87 * The inputs of s1 <: s2 are the inputs of s1
89 point
splitSchema::inputPoint(unsigned int i
) const
91 return fSchema1
->inputPoint(i
);
96 * The outputs of s1 <: s2 are the outputs of s2
98 point
splitSchema::outputPoint(unsigned int i
) const
100 return fSchema2
->outputPoint(i
);
105 * Draw the two sub schema and the connections between them
107 void splitSchema::draw(device
& dev
)
111 // draw the two subdiagrams
115 unsigned int r
= fSchema1
->outputs();
118 // draw the connections between them
119 for (unsigned int i
=0; i
<fSchema2
->inputs(); i
++) {
120 point p
= fSchema1
->outputPoint(i
%r
);
121 point q
= fSchema2
->inputPoint(i
);
123 dev
.trait(p
.x
, p
.y
, q
.x
, q
.y
);
131 * Draw the two sub schema and the connections between them
133 void splitSchema::collectTraits(collector
& c
)
137 // draw the two subdiagrams
138 fSchema1
->collectTraits(c
);
139 fSchema2
->collectTraits(c
);
141 unsigned int r
= fSchema1
->outputs();
144 // draw the connections between them
145 for (unsigned int i
=0; i
<fSchema2
->inputs(); i
++) {
146 point p
= fSchema1
->outputPoint(i
%r
);
147 point q
= fSchema2
->inputPoint(i
);
148 c
.addTrait(trait(point(p
.x
, p
.y
), point(q
.x
, q
.y
)));