Library was made in Fortran programming language for simpler and faster picture drawing in PostScript.
Postscript ima določene grafične in jezikovne značilnosti.
Med grafičnimi je pomemben prostor, ki je odvisen od tiskalnika (device
space), uporabniški prostor, trenutna transformacijska matrika, pot,
trenutna pot, ...
V programu lahko zapisujemo komentarje, številčne vrednosti, nize vrednosti, znakovne vrednosti, operatorje, transliramo, rotiramo, transliramo,....
Postscript omogoča tudi oblikovanje posameznih strani tako, da lahko poleg slik pišemo tudi tekst, določamo obseg strani...
Za branje postscript dokumenta na nakaterih tiskalnikih je potrebno sam dokument oblikovati po DSF standardu (Document Structuring convention), ki predpisuje določeno obliko dokumenta. Pri tej obliki je pomembna 'glava dokumenta' katera vsebuje podatke o dokumentu (o kreatorju, ime dokumenta, dimenzije izrisa, število strani...)
Kordinate, ki jih vnašamo so v milimetrih in ne v točkah, kar je osnovna enota postscripta. Knjižnica tudi omogoča premikanje objekta, rotacijo objekta okoli izhodišča koordinatnega sistema in povečevanje oz. zmanjševanje objkta.
Zadnjo in prvo točko narisanega lika je mogoče tudi skleniti, sklenjen lik pa je mogoče zapolniti tako, da ni izris narejen iz črt in krogov ampak kot poln objekt.
Za sam črten izris je mogoče nastaviti debelino, ter barvo. Kot barvo določamo odtenke sive barve od črne pa do bele.
Knjižnica je narejena tako, da definiramo objekte, ki pa lahko vsebujejo po en ali več elementov. Ta lastnost je velikega pomena pri translaciji, rotaciji in skalaciji objektov, ker bi morali sicer geometrijske transformacije izvajati na vsakem elementu posebej.
Objekt je mogoče pred izvajanjem geometrijskih transformacij shraniti in ga po izvedbi le teh zopet izrisati v prvotni obliki. Vnasprotnem primeru bi morali izvesti obratne transformacije za ponoven izris in nadalnjo manipulacijo osnovnega objekta.
Na voljo nam je tudi pisanje teksta, katerega pa lahko kot vse objekte tudi transliramo, skaliramo in rotiramo. Na voljo nam je pisava Tmes-Roman, vendar pa jo lahko z enostavno spremembo knjižnice nadomestimo z drugo.
Vedno se glavni program prične z klicanjem podprograma, ki priredi velikost izrisanega objekta dejanski vrednosti na zaslonu ali listu, ter poskrbi ta potrebno rotacijo le tega. Izvede se tudi sprememba poscript dolžinskih enot v milimetre.
Vsak od ostalih podprogramov ima ravno tako nalogo da izpiše del kode ki pa v celoti pomeni postscript datoteko, katero lahko kot sliko ali tekst predstavimo na zaslonu ali tiskalniku.
V glavnem programu je potrebno pred vsakim začetkom definiranja novega objekta izpisati njegovo ime. V nadaljevanju pisanja programa ni več potrebno za izvajanje določenih operacij na tem objektu pisati vseh elementov, ki ga sestavlljajo ampak zapišemo samo ime objekta. Velika prednost takega definiranja se pokaže predvsem pri kompliciranih objektih, ki so sestavljeni iz veliko elementov.
Pravilno podajanje točk slike na izhodnem formatu je bistvenega pomena za pravilno lego slike.
Znakovna spremenljivka i, ki sledi koordinatam slike je ime datoteke v katero se zapisuje programska koda.
Naloga navedenega ukaza je tudi ta, da spreminja postscript dolžinske enote v milimetre. tako so vse koordinate navedene v milimetrih.
Pomembna naloga ukaza pa je izpis glave postscript datoteke v DSC formatu.
SUBROUTINE Sklenitev_lika() Write(1,*)' closepath' END SUBROUTINE Zapolnitev() Write(1,*)'fill' END SUBROUTINE Sivina_izrisa(b) REAL b Write(1,1)b 1 FORMAT(F14.2,' setgray') END SUBROUTINE Debelina_izrisa(c) INTEGER c Write(1,*)c,' setlinewidth' END SUBROUTINE Definiranje_objekta(e) character e*20 Write(1,2)e 2 FORMAT('/',A20) WRITE(1,*)' { newpath' END SUBROUTINE Konec_objekta() Write(1,*)'} def' END SUBROUTINE Risanje_objekta(e) character e*20 Write(1,2)e 2 FORMAT(A20) END SUBROUTINE Izris_Objekta() Write(1,*)'stroke' END SUBROUTINE Prikaz_strani() Write(1,*)'showpage' END SUBROUTINE Nastavitev_formata(x1,y1,x2,y2,x3,y3,x4,y4,i) Integer x1,y1,x2,y2,x3,y3,x4,y4,x11,y11,x12,y12,x13,y13 REAL dx1,dy1,dx2,dy2,xs,ys,tx,ty CHARACTER i*20 OPEN(1,file=i) Write(1,200) 200 FORMAT('%!PS-Adobe-2.0 EPSF-2.0') Write(1,300) 300 FORMAT('%%Creator: psdraw - by Leon Kos') Write(1,400)i 400 FORMAT('%%DocumentFonts: ',A20) Write(1,500)x3,y3,x4,y4 500 FORMAT('%%BoundingBox:',I6,I6,I5,I5) Write(1,600) 600 FORMAT('%%Pages: (atend)') Write(1,700) 700 FORMAT('%%EndComments\n%%EndProlog\n%%Page: 1 1\ngsave') Write(1,800) 800 FORMAT('% Program izpisuje like, daljice in tekst') Write(1,900) 900 FORMAT('% v PostScript kodi.') Write(1,*)'/mm { 72 25.4 div mul } def' IF((x3.le.x4).and.(y3.le.y4))then goto 50 ELSEIF((x3.ge.x4).and.(y3.le.y4))then goto 51 ELSEIF((x3.ge.x4).and.(y3.ge.y4))then goto 52 ELSEIF((x3.le.x4).and.(y3.ge.y4))then goto 53 ENDIF 53 dx1=x2-x1 dy1=y2-y1 dx2=x4-x3 dy2=y3-y4 xs=(dx2)/(dx1) ys=(dy2)/(dy1) IF (xs.gt.ys)then goto 13 else goto 23 ENDIF 13 Write(1,27)ys,ys 27 FORMAT(F7.3,F7.3,' scale') goto 33 23 Write(1,28)xs,xs 28 FORMAT(F7.3,F7.3,' scale') 33 continue x11=-x1 y11=-y1 Write(1,211)x11,y11 211 FORMAT(I6,' mm',I6,' mm translate') Write(1,210) 210 FORMAT('270 rotate') x12=-y1-x1 y12=x1-y1 Write(1,212)x12,y12 212 FORMAT(I6,' mm',I6,' mm translate') IF(dx1.ge.dy1)then y13=dx1/2-dy1/2 goto 47 else y13=-dx1/2+dy1/2 endif 47 continue x13=-dy1/2-dx1/2 Write(1,213)x13,y13 213 FORMAT(I6,' mm',I6,' mm translate') ty=(x4/xs)-(dx2/xs) tx=-(y4/ys) Write(1,29)tx,ty 29 FORMAT(F9.3,' mm',F9.3,' mm translate') GOTO 100 52 dx1=x2-x1 dy1=y2-y1 dx2=x3-x4 dy2=y3-y4 xs=(dx2)/(dx1) ys=(dy2)/(dy1) IF (xs.gt.ys)then goto 12 else goto 22 ENDIF 12 Write(1,9)ys,ys 9 FORMAT(F7.3,F7.3,' scale') goto 32 22 Write(1,18)xs,xs 18 FORMAT(F7.3,F7.3,' scale') 32 continue x11=-x1 y11=-y1 Write(1,215)x11,y11 215 FORMAT(I6,' mm',I6,' mm translate') Write(1,214) 214 FORMAT('180 rotate') x12=-2*x1 y12=-2*y1 Write(1,216)x12,y12 216 FORMAT(I6,' mm',I6,' mm translate') x13=-dx1 y13=-dy1 Write(1,217)x13,y13 217 FORMAT(I6,' mm',I6,' mm translate') ty=-(x4/xs) tx=-(y4/ys) Write(1,19)tx,ty 19 FORMAT(F9.3,' mm',F9.3,' mm translate') GOTO 100 51 dx1=x2-x1 dy1=y2-y1 dx2=x3-x4 dy2=y4-y3 xs=(dx2)/(dx1) ys=(dy2)/(dy1) IF (xs.gt.ys)then goto 11 else goto 21 ENDIF 11 Write(1,6)ys,ys 6 FORMAT(F7.3,F7.3,' scale') goto 31 21 Write(1,7)xs,xs 7 FORMAT(F7.3,F7.3,' scale') 31 continue x11=-x1 y11=-y1 Write(1,218)x11,y11 218 FORMAT(I6,' mm',I6,' mm translate') Write(1,221) 221 FORMAT('90 rotate') x12=y1-x1 y12=-x1-y1 Write(1,219)x12,y12 219 FORMAT(I6,' mm',I6,' mm translate') IF(dx1.ge.dy1)then x13=dx1/2-dy1/2 goto 48 else x13=-dx1/2+dy1/2 endif 48 continue y13=-dy1/2-dx1/2 Write(1,220)x13,y13 220 FORMAT(I6,' mm',I6,' mm translate') ty=-(x4/xs) tx=(y4/ys)-(dy2/ys) Write(1,8)tx,ty 8 FORMAT(F9.3,' mm',F9.3,' mm translate') GOTO 100 50 dx1=x2-x1 dy1=y2-y1 dx2=x4-x3 dy2=y4-y3 xs=(dx2)/(dx1) ys=(dy2)/(dy1) IF (xs.gt.ys)then goto 10 else goto 20 ENDIF 10 Write(1,2)ys,ys 2 FORMAT(F7.3,F7.3,' scale') goto 30 20 Write(1,3)xs,xs 3 FORMAT(F7.3,F7.3,' scale') 30 continue x11=-x1 y11=-y1 Write(1,223)x11,y11 223 FORMAT(I6,' mm',I6,' mm translate') tx=(x4/xs)-(dx2/xs) ty=(y4/ys)-(dy2/ys) Write(1,4)tx,ty 4 FORMAT(F9.3,' mm',F9.3,' mm translate') 100 continue end SUBROUTINE Rotacija_Objekta(a,e) INTEGER a character e*20 Write(1,3)a 3 FORMAT(I5,' rotate') Write(1,2)e 2 FORMAT('0 0 ',A20) END SUBROUTINE Translacija_Objekta(x,y,e) INTEGER x,y character*100 e Write(1,3)x,y 3 FORMAT(I5,' mm',I5,' mm translate') Write(1,2)e 2 FORMAT('0 0 ',A20) END SUBROUTINE Save() Write(1,*)'gsave' END SUBROUTINE Restore() Write(1,*)'grestore' END SUBROUTINE Skalacija_Objekta(x,y,e) REAL x,y character*100 e Write(1,4)x,y 4 FORMAT(F7.3,/,F7.3,' scale') Write(1,2)e 2 FORMAT('0 0 ',A20) end SUBROUTINE Daljica(x1,y1,x2,y2) Integer x1,y1,x2,y2 Write(1,2)x1,y1 2 FORMAT(I5,' mm',I5,' mm moveto') Write(1,3)x2,y2 3 FORMAT(I5,' mm',I5,' mm lineto') END SUBROUTINE Krog(x,y,r) INTEGER x,y,r,a1,a2 a1=0 a2=360 Write(1,2)x,y,r,a1,a2 2 FORMAT(I5,' mm ',I5,' mm ',I4,' mm ',I4,I4,' arc') END SUBROUTINE Lok(x,y,r,a1,a2) INTEGER x,y,a1,a2,r Write(1,2)x,y,r,a1,a2 2 FORMAT(I5,' mm ',I5,' mm ',I4,' mm ',I4,I4,' arc') END SUBROUTINE Tekst(w,x,y,g) INTEGER x,y,w character g*100 Write(1,2) 2 FORMAT('/Times-Roman findfont') Write(1,3)w 3 FORMAT(I5,' scalefont') Write(1,4) 4 FORMAT('setfont') Write(1,5) 5 FORMAT('newpath') Write(1,6)x,y 6 FORMAT(I5,' mm',I5,' mm moveto') Write(1,7)g 7 FORMAT('(',A100,') show') END
Program KVADRAT1 Character*100 e Character*20 i i='kvadrat.ps' CALL Nastavitev_formata(0,0,600,800,150,290,210,200,i) e='kvadrat' CALL Definiranje_Objekta(e) CALL Daljica(100,100,400,100) CALL Daljica(400,100,400,400) CALL Daljica(400,400,100,400) CALL Daljica(100,400,100,100) CALL Konec_Objekta() CALL Risanje_Objekta(e) CALL Izris_Objekta() CALL Prikaz_strani() endProgram KVADRAT1.FOR Pomanjša format risanja ter sliko pzicionira na predvideno mesto (rotacija za 270 stopinj). V programu je definiran objekt, ki je sestavljen iz štirih daljic.
PROGRAM Krog1 Character*100 e Character*20 i i='krog.ps' CALL Nastavitev_formata(0,0,50,80,10,20,100,120,i) e='krog' CALL Definiranje_Objekta(e) CALL Krog(30,20,15) CALL Konec_Objekta() CALL Risanje_Objekta(e) CALL Zapolnitev() CALL Izris_Objekta() CALL Save() CALL Skalacija_Objekta(1.5,1.2,e) CALL Izris_Objekta() CALL Restore() CALL Prikaz_strani() endProgram KROG1.FOR Riše sliko formata 50x80 in jo pozicionira na izhodni format. Na sliki jepredstavljen izris kroga, ter njegova skalacija. Ocitno le da nastane zaradi razlicne povecave v x in y smeri do elipticnega izrisa kroga.Predstavljen je tudi ukaz za zapolnjevanje objektov.
PROGRAM Lok1 Character*100 e Character*20 i i='lok.ps' CALL Nastavitev_formata(0,0,50,80,10,20,100,120,i) e='loki' CALL Definiranje_Objekta(e) CALL Lok(30,20,15,0,90) CALL Konec_Objekta() CALL Risanje_Objekta(e) CALL Sivina_Izrisa(0.0) CALL Debelina_izrisa(4) CALL Izris_Objekta() CALL Save() CALL Rotacija_Objekta(25,e) CALL Izris_Objekta() CALL Restore() CALL Prikaz_strani() endProgram LOK1.FOR predstavlja izris loka ter negovo rotacijo. Viden je tudi vpliv debeline izpisa.
Program Tekst1 Character*100 g Character*20 i,e i='tekst.ps' CALL Nastavitev_formata(100,100,400,600,50,290,210,50,i) g='pa je konec' e='tekst' CALL Definiranje_Objekta(e) CALL Tekst(50,200,200,g) CALL Konec_Objekta() !pisanje teksta CALL Risanje_Objekta(e) CALL Sivina_Izrisa(0.0) CALL Debelina_izrisa(1) CALL Izris_Objekta() CALL Save() CALL Translacija_Objekta(-50,-80,e) CALL Restore() CALL Izris_Objekta() CALL Prikaz_strani() endProgram TEKST1.FOR rotira sliko za 270 stopinj in izpiše tekst, ter ga nato še translira.
Telephone: +386 (061) 1 77 14 36