123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- %! SDL shapes for Graphviz/dot in PostScript output mode
- % FILE
- % sdl.ps - SDL shapes for Graphviz/dot in PostScript output mode
- %
- % USE
- % All procedures expect to be passed a rectangular bounding box in the
- % order [upper right, lower right, lower left, upper left, upper right].
- % All procedures expect to be used with "peripheries = 0".
- %
- % BUGS
- % The following shapes are currently not implemented:
- % - frame/system/block/process/procedure/service/procedure, and types thereof
- % - macro inlet/outlet/call
- % - exception handler/handle/raise
- % - decision (suggest use diamond)
- % - alternative (suggest use triangle)
- % - internal input/output (suggest stop using historical relics!)
- %
- % COPYRIGHT AND PERMISSION NOTICE
- % Copyright (C) 2005 Cambridge Silicon Radio Ltd.; all rights reserved.
- %
- % Permission is hereby granted, free of charge, to any person obtaining
- % a copy of this software and associated documentation files (the
- % "Software"), to deal in the Software without restriction, including
- % without limitation the rights to use, copy, modify, merge, publish,
- % distribute, sublicense, and/or sell copies of the Software, and to
- % permit persons to whom the Software is furnished to do so, subject to
- % the following conditions:
- %
- % The above copyright notice and this permission notice shall be
- % included in all copies or substantial portions of the Software.
- %
- % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- %
- % Except as contained in this notice, the name of a copyright holder
- % shall not be used in advertising or otherwise to promote the sale, use
- % or other dealings in the Software without prior written authorization
- % of the copyright holder.
- %
- % REVISION
- % #4
- /xdef {exch def} bind def
- % SDL task
- /sdl_task {
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- newpath
- moveto
- lineto
- lineto
- lineto
- pop pop
- closepath
- { fill } { stroke } ifelse
- } bind def
- % SDL input from right
- % The indent has lines at 45 degrees
- % There should be a few spaces at the end of this shape's label
- /sdl_input_from_right {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 ury lry sub 2 div def
- newpath
- moveto
- urx h2 sub ury h2 sub lineto
- lrx lry lineto
- llx lly lineto
- ulx uly lineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL input from left
- % Similar to SDL input from right
- % There should be a few spaces at the start of this shape's label
- /sdl_input_from_left {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 uly lly sub 2 div def
- newpath
- moveto
- lrx lry lineto
- llx lly lineto
- ulx h2 add ury h2 sub lineto
- ulx uly lineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL priority input from right
- % Similar to SDL input from right
- % The chevrons are displaced by an eighth of the shape height
- % The filled version is indistinguishable from a non-priority SDL input
- /sdl_priority_input_from_right {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 ury lry sub 2 div def
- newpath
- moveto
- urx h2 sub ury h2 sub lineto
- lrx lry lineto
- llx lly lineto
- ulx uly lineto
- closepath
- { fill } { stroke
- urx h2 4 div sub ury moveto
- urx h2 sub h2 4 div sub ury h2 sub lineto
- lrx h2 4 div sub lry lineto
- stroke } ifelse
- end
- } bind def
- % SDL priority input from left
- % Similar to SDL priority input from right
- /sdl_priority_input_from_left {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 uly lly sub 2 div def
- newpath
- moveto
- lrx lry lineto
- llx lly lineto
- ulx h2 add uly h2 sub lineto
- ulx uly lineto
- closepath
- { fill } { stroke
- llx h2 4 div add lly moveto
- ulx h2 add h2 4 div add uly h2 sub lineto
- ulx h2 4 div add uly lineto
- stroke } ifelse
- end
- } bind def
- % SDL start
- % The left and right sides are semicircles
- % This should be used with "label = " ""
- /sdl_start {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- pop pop
- /r ury lry sub 2 div def
- newpath
- urx r sub ury r sub r 90 -90 arcn
- ulx r add uly r sub r -90 90 arcn
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL procedure start
- % Similar to SDL start
- % The filled version is indistinguishable from an SDL start
- % This should be used with "label = " ""
- /sdl_procedure_start {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- pop pop
- /r ury lry sub 2 div def
- newpath
- urx r sub ury r sub r 90 -90 arcn
- ulx r add uly r sub r -90 90 arcn
- closepath
- { fill } { stroke
- lrx r sub lry moveto
- 0 r 2 mul rlineto
- llx r add lly moveto
- 0 r 2 mul rlineto
- stroke } ifelse
- end
- } bind def
- % SDL state/nextstate
- % The left and right sides are arcs
- /sdl_state {
- 12 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- pop pop
- /h2 ury lry sub 2 div def
- /w2 h2 1.5 mul def % was urx ulx sub 2 div def but this made curvature width-dependent
- /r w2 def
- /th h2 r dup mul h2 dup mul sub sqrt atan def
- newpath
- urx w2 sub ury h2 sub r th th neg arcn
- ulx w2 add uly h2 sub r -180 th add -180 th sub arcn
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL output to right
- % The outdent has lines at 45 degrees
- % There should be a few spaces at the end of this shape's label
- /sdl_output_to_right {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 ury lry sub 2 div def
- newpath
- exch h2 sub exch moveto
- urx ury h2 sub lineto
- lrx h2 sub lry lineto
- llx lly lineto
- ulx uly lineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL output to left
- % Similar to SDL output to right
- % There should be a few spaces at the start of this shape's label
- /sdl_output_to_left {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 ury lry sub 2 div def
- newpath
- moveto
- lrx lry lineto
- llx h2 add lly lineto
- ulx ury h2 sub lineto
- ulx h2 add uly lineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL continuous signal/enabling condition
- % The chevrons have lines at 45 degrees
- % There should be a few spaces at the start and end of this shape's label
- /sdl_condition {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h2 ury lry sub 2 div def
- newpath
- exch h2 sub exch moveto
- urx ury h2 sub lineto
- lrx h2 sub lry lineto
- dup llx h2 add lly 3 -1 roll { lineto } { moveto } ifelse
- ulx uly h2 sub lineto
- ulx h2 add uly lineto
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL save
- % The left and right edges are at about 60 degrees
- % There should be a few spaces at the start and end of this shape's label
- /sdl_save {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h3 ury lry sub 3 div def
- newpath
- moveto
- lrx h3 sub lry lineto
- llx lly lineto
- ulx h3 add uly lineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL stop
- % The width of the bounding box is ignored; the lines are set at 45 degrees
- % This shape cannot be filled
- % This should be used with "label = """ and "arrowhead = none, headclip = false"
- /sdl_stop {
- 7 dict begin
- { stop } if % make sure not asked to fill this
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- pop pop
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef pop
- /h2 uly lly sub 2 div def
- /mx llx lrx add 2 div def
- newpath
- mx h2 add exch moveto pop
- mx h2 sub lly lineto
- mx h2 sub uly moveto
- mx h2 add lry lineto
- closepath
- stroke
- end
- } bind def
- % SDL return
- % The width of the bounding box is ignored; the lines are set at 45 degrees
- % The filled version is indistinguishable from an SDL connection
- /sdl_return {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef pop
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef pop
- pop pop
- /h2 uly lly sub 2 div 2 sqrt div def
- /mx llx lrx add 2 div def
- /my lry ury add 2 div def
- newpath
- mx my uly lly sub 2 div 0 360 arc
- { fill } { stroke
- mx h2 add my h2 add moveto
- mx h2 sub my h2 sub lineto
- mx h2 sub my h2 add moveto
- mx h2 add my h2 sub lineto
- stroke } ifelse
- end
- } bind def
- % SDL create
- % The extra lines are displaced by an eighth of the shape height
- % The filled version is indistinguishable from an SDL task
- /sdl_create {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h8 ury lry sub 8 div def
- newpath
- moveto
- lrx lry lineto
- llx lly lineto
- ulx uly lineto
- closepath
- { fill } { stroke
- ulx uly h8 sub moveto
- urx ury h8 sub lineto
- llx lly h8 add moveto
- lrx lry h8 add lineto
- stroke } ifelse
- end
- } bind def
- % SDL call
- % The extra lines are displaced by an eighth of the shape height
- % The filled version is indistinguishable from an SDL task
- % There should be a few spaces at the start and end of this shape's label
- /sdl_call {
- 9 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h8 ury lry sub 8 div def
- newpath
- moveto
- lrx lry lineto
- llx lly lineto
- ulx uly lineto
- closepath
- { fill } { stroke
- urx h8 sub ury moveto
- lrx h8 sub lry lineto
- llx h8 add lly moveto
- ulx h8 add uly lineto
- stroke } ifelse
- end
- } bind def
- % SDL text symbol
- % The corner has a size of twice the H height
- /sdl_text {
- 10 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /h8 ury lry sub 8 div def
- newpath
- moveto
- /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop 2 mul def
- newpath
- urx ury d sub moveto
- lrx lry lineto
- llx lly lineto
- ulx uly lineto
- urx d sub ury lineto
- closepath
- { fill } { stroke } ifelse
- urx ury d sub moveto
- d neg 0 rlineto
- 0 d rlineto
- stroke
- end
- } bind def
- % SDL text extension from left
- % This should be used with "rank = same"
- /sdl_text_extension_from_left {
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- pop pop
- moveto
- lineto
- lineto
- lineto
- { fill } { stroke } ifelse
- } bind def
- % SDL text extension from right
- % This should be used with "rank = same"
- /sdl_text_extension_from_right {
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- pop pop
- 8 4 roll
- moveto
- lineto
- lineto
- lineto
- { fill } { stroke } ifelse
- } bind def
- % SDL comment from left
- % This should be used with "style = dashed" and "rank = same"
- /sdl_comment_from_left { sdl_text_extension_from_left } bind def
- % SDL comment from right
- % This should be used with "style = dashed" and "rank = same"
- /sdl_comment_from_right { sdl_text_extension_from_right } bind def
- % SDL connector
- % The width of the bounding box is ignored
- /sdl_connector {
- 7 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- pop pop
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef pop
- pop pop
- /h2 uly lly sub 2 div def
- /mx llx lrx add 2 div def
- newpath
- mx uly h2 sub h2 0 360 arc
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL set (extension)
- % The hourglass has a size of twice the H height
- % There should be a few spaces at the start of this shape's label
- /sdl_set {
- 10 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /my uly lly add 2 div def
- newpath
- moveto
- /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
- newpath
- llx d add my d add moveto
- ulx d add uly lineto
- urx ury lineto
- lrx lry lineto
- llx d add lly lineto
- llx d add my d sub lineto
- dup { closepath fill } { stroke } ifelse
- llx my d sub moveto
- d 2 mul dup rlineto
- d 2 mul neg 0 rlineto
- d 2 mul dup neg rlineto
- closepath
- { fill } { stroke } ifelse
- end
- } bind def
- % SDL reset (extension)
- % The cross has a size of twice the H height
- % There should be a few spaces at the start of this shape's label
- /sdl_reset {
- 10 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /my uly lly add 2 div def
- newpath
- moveto
- /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
- newpath
- urx ury moveto
- lrx lry lineto
- llx d add lly lineto
- ulx d add uly lineto
- closepath
- { fill } { stroke } ifelse
- llx my d sub moveto
- d 2 mul dup rlineto
- llx d 2 mul add my d sub moveto
- d 2 mul dup neg exch rlineto
- stroke
- end
- } bind def
- % SDL export (extension)
- % The store has a width of twice the H height
- % There should be a few spaces at the start of this shape's label
- /sdl_export {
- 10 dict begin
- 3 1 roll % put filled flag at end
- 4 ne { stop } if % sanity-check number of sides
- aload pop
- /ury xdef /urx xdef
- /lry xdef /lrx xdef
- /lly xdef /llx xdef
- /uly xdef /ulx xdef
- /my uly lly add 2 div def
- newpath
- moveto
- /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
- newpath
- llx d add my d 2 div add moveto
- ulx d add uly lineto
- urx ury lineto
- lrx lry lineto
- llx d add lly lineto
- llx d add my d 2 div sub lineto
- { closepath fill } { stroke } ifelse
- llx my d 2 div sub moveto
- d 2 mul 0 rlineto
- llx my d 2 div add moveto
- d 2 mul 0 rlineto
- stroke
- end
- } bind def
|