02 SRGP - izlazrti.etf.bg.ac.rs/rti/ri5rg/materijali/predavanja/arhiva/02 SRGP... · 2 SRGP - izlaz...
Transcript of 02 SRGP - izlazrti.etf.bg.ac.rs/rti/ri5rg/materijali/predavanja/arhiva/02 SRGP... · 2 SRGP - izlaz...
Računarska grafika
SRGP - izlaz
04.03.2015.SRGP - izlaz2
Portabilnost softvera
� Softver za grafičke primene u prvo vreme bio je kompleksan i skup � Na početku:
– paketi niskog nivoa zavisni od uređaja, isporučuje proizvođač uz uređaj� Danas:
– paketi visokog nivoa nezavisni od uređaja� Glavna svrha korišćenja paketa je portabilnost aplikativnog programa� Portabilnost se obezbeđuje tako što se:
– program izoluje od većine mašinskih posebnosti– programu stavljaju na raspolaganje bibliotečke funkcije
koje se implementiraju na širokom skupu procesora i operativnih sistema� Na taj način se povećava i portabilnost programera:
– programeri se mogu lako seliti sa instalacije na instalaciju, gde nalaze softver za programiranje grafike, sa kojim su familijarni
� Opšta svest o potrebi standarda pojavila se sredinom 70-ih
04.03.2015.SRGP - izlaz3
Core specifikacija
� Kulminacija napora 70-ih – u specifikaciji Core � Pun naziv: 3D Core Graphics System
– proizveo je ACM SIGGRAPH Committee 1977. i doterao 1979.– specifikacija Core je ispunila svoju ulogu kao bazična specifikacija– imala je više implementacija– nije prošla postupak formalne standardizacije– korišćena samo kao ulaz za projekte standarda unutar organizacija:
� ANSI (American National Standards Institute) i � ISO (International Standards Organization)
� SIGGRAPH Core'79 je nestao zajedno sa vektorskim prikazivačima
04.03.2015.SRGP - izlaz4
GKS
� Prva grafička zvanično standardizovana specifikacija:GKS (Graphical Kernel System)
– standard: ISO IS 7942 iz 1985. godine– elaborirana, pročišćena verzija Core– za razliku od Core, GKS je bio ograničen na 2D grafiku
� GKS podržava grupisanje logički korelisanih primitiva(linije, poligoni i znakovne niske) i njihovih atributa
– kolekcije primitiva sa atributima se zovu segmenti
� GKS segmenti ne mogu biti ugnežđeni � GKS-3D (1988.), 3D ekstenzija GKS-a, zvanični standard
04.03.2015.SRGP - izlaz5
PHIGS
� PHIGS (Programmer's Hierarchycal Interactive Graphics System)– sofisticiraniji ali i znatno kompleksniji grafički paket– postao ANSI i ISO standard: ANSI X3.144-188, ISO 9592-1:1989 – podržava ugnežđena grupisanja 3D primitiva – hijerarhiju struktura– sve primitive i podstrukture – predmet geometrijskih transformacija – baza struktura (model) koju programer može da selektivno menja– sistem automatski ažurira ekran kad god se baza promeni – ne podržava mapiranje tekstura
� Implementacije PHIGS-a veliki paketi, zbog kompleksnosti specifikacije– implementacije teško postižu kompetitivne preformanse– potreban je HW koji podržava: prikaz, transformacije, isecanje
� PHIGS+: proširenje mogućnostima za pseudorealističan prikaz objekata– podržava osvetljavanje (senčenje), krive i površine (NURBS)
� Primenljivost – naučne/inženjerske aplikacije – geometrijska grafika u realnom vremenu
04.03.2015.SRGP - izlaz6
Aktuelni paketi/sistemi
� Danas su aktuelni de facto standardi u računarskoj grafici � 2D celobrojni rasterski grafički paketi:
– QuickDRAW (Apple) – Xlib (X Window System) – Java2D (multiplatformski)
� 3D grafički paketi:– OpenGL (multiplatformski)
� GL (Silicon Graphics), rane 90-te� open-source inicijativa, kontrolisana evolucija (ARB-Architecture Review Board:
jedan glas po kompaniji: Microsoft, SUN, SGI, nVidia, ATI)� podržava samo izlaz
– DirectX (Microsoft, Windows platforma)� OO grafički paket� podržava i ulaz podataka
– Java 3D (multiplatformski)
04.03.2015.SRGP - izlaz7
Grafički formati
� Razlikovati – grafičke pakete: biblioteke grafičkih funkcija ili klasa – grafičke formate: formati datoteka sa grafičkim sadržajem
� Grafički formati– rasterski: TIFF, JPG/JPG2, BMP(MS Win), ...– 2D vektorski: CGM(ISO), DXF(CAD), PS/EPS, CDR(Corel), ...– 3D vektorski: VRML/X3D, 3DS, MD2, ...– animacija: GIF, SWF(Flash), ...
� VRML (Virtual Reality Markup Language) – jezik za modeliranje virtuelne realnosti, 1994 – VRML interpreteri se ugrađuju u veb-čitače– X3D novija varijanta, standard ISO/IEC 19775-1
04.03.2015.SRGP - izlaz8
Grafički sistemi na kursu RG
� Simple Raster Graphics Package (SRGP)– jednostavan paket za 2D rastersku grafiku, nezavisan od uređaja
� Simple PHIGS (SPHIGS)– jednostavan paket za 3D grafiku
� SRGP i SPHIGS su edukativni paketi– u duhu osnovne linije standardnih grafičkih paketa– veći deo znanja dobijenog kroz SRGP i SPHIGS
je dirketno primenljiv na komercijalne pakete� Na kursu RG se studiraju najpre 2D grafički paketi:
– koncepti se proučavaju na primeru SRGP (Simple Raster Graphics Package) – za praktičan rad (vežbe i domaći zadatak) se koristi Java2D
� U drugom delu kursa se studiraju 3D grafički paketi:– koncepti se proučavaju na primeru SPHIGS-a, koji je podskup PHIGS-a:– za praktičan rad (vežbe i domaći zadatak) se koristi OpenGL
04.03.2015.SRGP - izlaz9
SRGP
� Repertoar primitiva SRGP-a: – linije, pravougaonici, poligoni, elipse i znakovne niske– repertoar primitiva sličan
� QuickDraw (Macintosh) � Xlib paketu za X Windows System
� Mogućnosti obrade interakcija su podskup onih iz SPHIGS� Teme koje se izučavaju koristeći SRGP su:
– operacije za crtanje – specifikacija primitiva i njihovih atributa– operacije za manipulacija pikselima (samo na rasterskim uređajima)– operacije za ulaz koje aplikacija koristi za interakciju sa korisnikom
� SRGP je projektovan tako da radi u prozorskim okruženjima� SRGP kontroliše unutrašnjost prozora – prozor je virtuelni ekran� Programer ne brine o detaljima pod kontrolom prozorskog sistema
04.03.2015.SRGP - izlaz10
Crtanje pomo ću SRGP
� Crtanje pomoću paketa SRGP – kao crtanje na grafičkom papiru sa veoma finom rešetkom– postoje operacije kojima se specificira crtanje grafičkih primitiva
� Rešetka (raster, matrica, grid)– od 70-120 tačaka po inču (dpi) za konvencionalne prikazivače – od 300 tačaka po inču za prikazivače sa visokom rezolucijom
� Slika prikazuje površinu prikazivača u celobrojnom desnom kartezijanskom koordinatnom sistemu
– prikazivač je širok 1024 piksela i visok 800 piksela– prikazani piksel se nalazi u tački (2,3)– pikseli se nalaze na preseku linija rešetke
� ponekad se smatra da su pikseli u centrima ćelija rešetke
x
y
799
10230
0
04.03.2015.SRGP - izlaz11
Primitive
� Na rasterskom uređaju linija se može crtati samo između tačaka koje leže na rešetci
� Sve tačke linije se aproksimiraju tako što se prikažu pikseli koji takođe leže na rešetci
� Popunjene površine se kreiraju prikazivanjem piksela koji leže u unutrašnjosti (ponekad i na granici)
� Bilo bi izuzetno naporno specificirati svaki piksel na liniji ili u oblasti� Grafički paketi dopuštaju programeru
da specificira primitive preko njihovih temena:– aplikacija šalje paketu koordinate koje definišu oblik primitive– grafički paket popunjava detalje koristeći algoritme za sken-konverziju
� SRGP poseduje procedure koji su generatori primitiva� Legalno je da se zada tačka izvan ekrana (prozora)
– samo delovi primitiva unutar ekrana (prozora) se prikazuju
04.03.2015.SRGP - izlaz12
Linija
� Linija u RG – pravolinijski segment između 2 tačke (duž)� Sledeća SRGP procedura crta liniju od (x1,y1) do (x2,y2):
void SRGP_lineCoord(int x1, int y1, int x2, int y2);
� Primer poziva za crtanje linije – linija se crta od koordinatnog početka do piksela (100,300):
SRGP_lineCoord(0,0,100,300);
� Drugi (prirodniji) način crtanja linije je:typedef struct{ int x,y; } point;
void SRGP_line(point pt1, point pt2);
04.03.2015.SRGP - izlaz13
Polilinija
� Polilinija – sekvenca linija čija su susedna temena povezana� SRGP ima dve procedure za crtanje polilinije
– analogija sa gornjim oblicima zadavanja linijevoid SRGP_polyLineCoord(int vertexCount,
int *xArray, int *yArray);void SRGP_polyLine(int vertexCount,
point *vertices);
� Prvi oblik je pogodan– kada su vrednosti x fiksirane, a vrednosti y se računaju
� Drugi oblik je pogodan – za crtanje proizvoljnih oblika specificiranih nizom tačaka
04.03.2015.SRGP - izlaz14
Primer linije i polilinije
� Ekonomska analiza - vrednosti trgovinskog prometa za svaki mesec– celobrojni vektor meseci reprezentuje 12 meseci x-vrednostima– celobrojni vektor promet sadrži sračunate y-vrednosti
// Crtanje osa
SRGP_lineCoord(175,200,320,200);
SRGP_lineCoord(200,140,200,280);
// Crtanje grafika
SRGP_polyLineCoord(12,meseci,promet);
(175,200)
(200,140)
(200,280)
(320,200)
04.03.2015.SRGP - izlaz15
Primer polilinije – drugi oblik
� Crtanje “leptir-mašne”– niz tačaka leptirMasna sadrži tačke sa koordinatama iz donje tabele
SRGP_polyLine(7,leptirMasna);
( 100,100 )
1001006
841205
1001404
601403
761202
601001
1001000
yx
04.03.2015.SRGP - izlaz16
Markeri i polimarkeri
� Markeri su simboli koji se pozicioniraju na grafik da nešto označe� Mogu biti: tačke, zvezdice, kružići, …� SRGP procedure za markere odgovaraju onima za linije i polilinije� Kreiranje simbola markera centriranog na (x,y):
void SRGP_markerCoord(int x, int y);void SRGP_marker(point pt);
� Stil i veličina markera se mogu menjati pomoću atributa� Kreiranje sekvence identičnih markera na skupu zadatih tačaka:
void SRGP_polyMarkerCoord(int vertexCount, int *xArray, int *yArray);
void SRGP_polyMarker(int vertexCount, point *vertices);
04.03.2015.SRGP - izlaz17
Primer polimarkera
� Sledeći poziv će dodati markere na graf sa prethodne slike:SRGP_polyMarkerCoord(12, meseci, promet);
04.03.2015.SRGP - izlaz18
Poligoni
� Mogući načini crtanja poligona:– specificira se polilinija koja se sama zatvara (kao na slici leptir-mašne)– koristiti se SRGP poziv koji sam zatvara figuru
void SRGP_polygon(int vertexCount, point *vertices);
� Na primer, prethodna leptir-mašna bi se crtala:SRGP_polygon(6, leptirMasna);
� Nije potrebno ponoviti prvo teme u nizu
( 100,100 )
04.03.2015.SRGP - izlaz19
Pravougaonici
� Pravougaonik bi se mogao crtati kao poligon sa 4 temena� Pravougaonik sa ivicama paralelnim ivicama ekrana
– predstavlja posebnu SRGP primitivu– može da se nacrta jednom od sledećih SRGP procedura:
void SRGP_rectangleCoord(int leftX, int bottomY, int rightX, int topY);
void SRGP_rectanglePt(point bottomLeft,point topRight);
void SRGP_rectangle(rectangle rect);– pri čemu je rectangle deklarisan na sledeći način:
typedef struct{ point bottomLeft, topRight; } rectangle;
04.03.2015.SRGP - izlaz20
Primer pravougaonika
� Pravouganik širine 101 piksel i visine 151 piksel:SRGP_rectangleCoord(50, 25, 150, 175);
� SRGP pruža sledeće uslužne funkcije za kreiranje pravougaonika i tačaka iz koordinatnih podataka:
point SRGP_defPoint(int x, int y);rectangle SRGP_defRectangle(int leftX,
int bottomY,int rightX,int topY);
� Prethodni primer crtanja pravougaonika bi sad izgledao:rectangle rect;rect = SRGP_defRectangle(50, 25, 150, 175);SRGP_rectangle(rect);
04.03.2015.SRGP - izlaz21
Krugovi i elipse
� Termin luk elipse se koristi za sve oblike: – kružne i eliptične – zatvorene i otvorene
� SRGP crta samo “standardne” elipse – elipse čije su ose paralelne sa koordinatnim osama
� Pogodno je da se luk elipse zadaje pravougaonikom u koji je elipsa upisana
– opisani pravougaonik se naziva granična kutija (bounding box) ili opseg (extents)
� Da li je luk elipse otvoren ili zatvoren zavisi od para uglova koji specificiraju početak i kraj luka
04.03.2015.SRGP - izlaz22
Procedura za crtanje elipse
� Generalna SRGP procedura za crtanje elipse:void SRGP_ellipseArc(rectangle extRect,
double startAng, double endAng);� Uglovi se mere:
– u stepenima nasuprot kretanja kazaljke– 0° odgovara pozitivnom smeru x-ose
� Primer: luk elipse definisan uglovima od 45° do 270°
04.03.2015.SRGP - izlaz23
Atributi
� Pojava primitive može biti kontrolisana specifikacijom njenih atributa� SRGP atributi:
– stil linije, debljina linije, boja i stil pera– primenjuju se na linije, polilinije, poligone, pravougaonike i lukove elipse
� Atributi se postavljaju “modalno”– oni su globalne promenljive stanja i menjaju se eksplicitno– pogodnost: štede trud navođenja brojnih parametara svake primitive
� Primitive se crtaju primenom aktuelnih vrednosti atributa u vreme crtanja� Promena vrednosti atributa ne utiče na do tada nacrtane primitive� Svaki atribut ima početnu vrednost � Preporuka dobrog stila programiranja:
– da se dodela vrednosti atributa vrši u svakoj proceduri – razlog – bolja modularnost
04.03.2015.SRGP - izlaz24
Stil i debljina linije
� Linija i druge linearne primitive imaju sledeće atribute:– stil – debljina
� Atributi linija se postavljaju sledećim pozivima:typedef enum {CONTINOUS, DASHED, DOTTED, ...}
lineStyle;void SRGP_setLineStyle(lineStyle line_style);void SRGP_setLineWidth(int width);
� Debljina linije se meri u jedinicama ekrana – u pikselima� Svaki atribut ima početno (default) stanje:
– stil linije: CONTINOUS – debljina linije: 1
04.03.2015.SRGP - izlaz25
Primer
� Tri linije različitih širina i stilova: SRGP_setLineWidth(4);SRGP_lineCoord(5,155,105,155); //SRGP_setLineStyle(DASHED);SRGP_setLineWidth(6);SRGP_lineCoord(5,105,105,105); //SRGP_setLineWidth(2);SRGP_setLineStyle(DOTTED);SRGP_lineCoord(5,55,105,55); //
04.03.2015.SRGP - izlaz26
Implementacija stila linije
� O stilu linije se može razmišljati kao o bitskoj masci– bitska maska se koristi za selektivno prikazivanje piksela duž linije
� Maska se koristi pri sken-konverziji primitive koju vrši SRGP� Nula u masci označava "transparentan piksel“
– na tom mestu se zadržava stara vrednost u video memoriji
� Na primer:– vrednost CONTINOUS odgovara svim jedinicama: 111111111111...– vrednost DASHED odgovara nizu: 111100111100...
� gornji primer je za slučaj da je dužina crtice dva puta veća od praznine
04.03.2015.SRGP - izlaz27
Stil i veli čina markera
� Markeri imaju sledeće atribute:– stil – veličina
� Atributi markera se postavljaju sledećim pozivima:typedef enum {MARKER_CIRCLE, MARKER_SQUARE,...} mark erStyle;void SRGP_setMarkerStyle(markerStyle marker_style);void SRGP_setMarkerSize(int markerSize);
� Veličina se zadaje u broju piksela stranice opisanog kvadrata� Početna vrednost za stil
– krug
04.03.2015.SRGP - izlaz28
Boja
� Za razliku od nekih specifičnih atributa primitiva, boja se odnosi na sve primitive
� Barem dve vrednosti "boje“ postoje na svakom sistemu– jedine vrednosti na dvonivoskim (binarno-monohromatskim) sistemima
– 1 je "aktivna" boja kojom se crta
– interpretacija 0 i 1 se razlikuje:� 0 je crno, a 1 belo na “belo-na-crnom” uređaju� 0 je belo, a 1 crno na “crno-na-belom” uređaju
– na sistemu koji prikazuje RGB (red, gree, blue) boju:� crno=(0,0,0) – odsustvo sve tri komponente� belo=(max,max,max) – maksimalno prisustvo sve tri komponente
04.03.2015.SRGP - izlaz29
SRGP tabela boja
� SRGP: celobrojni atribut boje ne određuje direktno boju: – on predstavlja indeks ulaza u tabeli boja (color/video look-up table)
� Svaki ulaz tabele definiše neku boju ili vrednost na skali sivog� Ako je d dubina bafera slike (broj bita po pikselu u video memoriji)
– tada postoji 2d ulaza tabele boja � SRGP programer
– ne treba da bude svesan načina na koji se implementira boja– on je svesan samo imena boja
� Imena boja su simboličke konstante – vrednosti indeksa– određuju ulaze tabele gde se podrazumevano nalaze vrednosti boje
� Vrednosti u tabeli zavise od uređaja � U nekim implementacijama aplikacija može da menja tabelu boja
– tada imena boja mogu da prevare – odgovornost programera
04.03.2015.SRGP - izlaz30
Crno i belo
� SRGP podržava barem dva imena za boje:COLOR_BLACKCOLOR_WHITE
� Implementacija za monohromatski uređaj “belo-na-crnom”:COLOR_BLACK=0(0 je vrednost indeksa, r.br. ulaza u tabeli boja)COLOR_WHITE=1(1 je vrednost indeksa)color_table[COLOR_BLACK]=0color_table[COLOR_WHITE]=1
� Implementacija za uređaj sa 8 bita po osnovnoj RGB boji:color_table[COLOR_BLACK]=RGB(0,0,0)color_table[COLOR_WHITE]=RGB(255,255,255)
04.03.2015.SRGP - izlaz31
SRGP postavljanje boja
� Boja kojom se crta (foreground) se postavlja pomoću:void SRGP_setColor(int colorIndex);
� Boja pozadine (background) se postavlja pomoću:void SRGP_setBackgroundColor(int colorIndex);
� Podrazumevane vrednosti indeksa u tabeli boja: – 0 – za pozadinu (background) – 1 – za boju crtanja (foreground)
04.03.2015.SRGP - izlaz32
Popunjene primitive i njihovi atributi
� Primitive koje obuhvataju neku površinu mogu biti crtane na dva načina:– oivičeno (outlined) – popunjeno (filled)
� Verzije SRGP primitiva sa popunjavanjem – crtaju piksele u unutrašnjosti bez kontrastne ivice
� Ako se želi popunjena i oivičena primitiva – mora se eksplicitno nacrtati pomoću dva poziva operacija SRGP-a
� Za crtanje popunjenih poligona: – SRGP_fillPolygon sa istom listom parametara kao za poligon
� I ostale primitive za popunjene površine se definišu na sličan način: – u imenu operacije - prefiks fill
� Način popunjavanja (prekrivanja unutrašnjosti) se definiše atributom stila
04.03.2015.SRGP - izlaz33
Definisanje s tila popunjavanja
� Atribut stila popunjavanja – definiše način popunjavanja zatvorene primitive
� Postoje četiri stila (načina, režima) popunjavanja:typedef enum {
SOLID, BITMAP_PATTERN_OPAQUE, BITMAP_PATTERN_TRANSPARENT,PIXMAP_PATTERN} drawStyle;
� Operacija za postavljanje atributa stila popunjavanja:void SRGP_setFillStyle(drawStyle draw_style);
04.03.2015.SRGP - izlaz34
Vrednosti stila popunjavanja
� SOLID– proizvodi ravnomerno popunjavanje tekućom vrednosti atributa boje
� BITMAP_PATTERN_OPAQUE– popunjava primitive binarnim uzorkom
prekrivajući sve piksele tekućom ili bojom pozadine� BITMAP_PATTERN_TRANSPARENT
– popunjava primitive binarnim uzorkom prekrivajući neke piksele tekućom bojom, a ostavljajući druge da se provide
� PIXMAP_PATTERN– popunjava primitive uzorkom sa pikeslima proizvoljnih vrednosti– uvek netransparentno
� Uzorak se regularno ponavlja pri popunjavanju – mozaički efekat (tiling)
04.03.2015.SRGP - izlaz35
Popunjavanje bit-mapom (1)
� Bit-mapirani uzorci popunjavanja – matrice jedinica i nula izabrane iz tabele raspoloživih uzoraka– svaki uzorak u tabeli je mala matrica (8x8) bitova
void SRGP_setFillBitmapPattern(int patternIndex);
� U netransparentnom režimu BITMAP_PATTERN_OPAQUE– 0 se crta u boji pozadine– 1 se crta u tekućoj boji
� U transparentnom režimu BITMAP_PATTERN_TRANSPARENTpopunjava se na sledeći način:
– na mestu gde je u uzorku 1, crta se tekuća boja (foreground color)– na mestu gde je u uzorku 0, ne crta se, providi se pozadina
04.03.2015.SRGP - izlaz36
Popunjavanje bit-mapom (2)
� U TRANSPARENTrežimu– bit mapa predstavlja masku za dozvoljen upis u memoriju – kao što je to i bit-maska stila linije za linije i oivičene primitive
� U OPAQUErežimu– tekuća i boja pozadine moraju da budu različite
� u protivnom se bitmapa ne vidi– na uređaju u boji – kombinacije osnovne boje i pozadine
� dvo-tonski efekti
� Prednost dvo-tonskih efekata preko bit-mapiranih uzoraka – boja nije specificirana eksplicitno već je određena aktuelnim atributima
� Nedostatak (i razlog za podršku uzorcima sa piksel-mapom) – samo dve boje prikazuju
04.03.2015.SRGP - izlaz37
Popunjavanje piksel-mapom
� Često je od interesa da se površina popuni uzorkom sa više boja� Za popunjavanje površine uzorkom u boji, stil je PIXMAP_PATTERN� Procedura za izbor uzorka:
void SRGP_setFillPixmapPattern(int patternIndex);
� Piks-mapa je matrica celobrojnih indeksa na tabelu boja– pošto je svaki piksel eksplicitno postavljen u piks-mapi, nema koncepta
rupa,pa nema ni razlike između transparentnog i netransparentnog režima
� Ako programer menja tabelu boja, boja popunjenih primitiva se menja� SRGP ne podržava, ali bi i piks-mapa mogla da se crta uz
transparenciju– jedna boja (na primer boja pozadine) bi mogla da bude transparentna
04.03.2015.SRGP - izlaz38
Stil i u zorak olovke
� Tehnika crtanja po uzorku se koristi i za uticaj na izgled linija� Postoje atribut stila i odgovarajući uzorci olovke za linije i oivičene primitive� Slično stilu popunjavanja:
– stil olovke se bira od iste 4 opcije koje ima i stil popunjavanja– uzorci olovke se biraju od istih uzoraka za stil popunjavanja
� koriste se iste tabele uzoraka (bit-mape, odnosno piksel-mape)
� Koriste se različiti indeksi (posebni atributi)– da se ne bi promenom stila olovke uticalo na stil popunjavanja
� SRGP procedure za stil olovke i uzorak olovke:void SRGP_setPenStyle(drawStyle draw_style);void SRGP_setPenBitmapPattern(int patternIndex);void SRGP_setPenPixMapPattern(int patternIndex);
� Koristeći atribute debljine linije, stila linije i stila olovke moguće je nacrtati– npr. 5 piksela debelu, crta-tačka-crta elipsu, čije crtice slede neki uzorak
04.03.2015.SRGP - izlaz39
Primer
� Potrebno je na tekućoj pozadini nacrtati 4 linije i to:– (a) kontinualna neprozirna linija– (b) isprekidana neprozirna linija– (c) isprekidana linija sa neprozirnim uzorkom– (d) isprekidana linija sa prozirnim uzorkom
� Program koji crta, je dat na sledećem slajdu� Ne preporučuje se korišćenje uzorka kod tankih linija (1-2 piksela)� Interakcija između stila linije i stila olovke je jednostavna:
– 0 u masci stila linije potpuno štite piksele na kojima se nalaze, – stil olovke utiče samo na one piksele za koje je maska stila linije jednaka 1
04.03.2015.SRGP - izlaz40
Primer - rešenje
� Primer se realizuje sledećim programom (pretpostavlja se da pozadina postoji):
SRGP_setLineWidth(4)SRGP_setLineStyle(CONTINUOUS);SRGP_setPenStyle(SOLID);SRGP_line(pta1,pta2); // a) kontinualna neprozirnaSRGP_setLineStyle(DASHED);SRGP_line(ptb1,ptb2); // b) isprekidana neprozirnaSRGP_setPenBitmapPattern(DIAGONAL_BIT_PATTERN);SRGP_setPenStyle(BITMAP_PATTERN_OPAQUE);SRGP_line(ptc1,ptc2); // c) isprekidana neprozirna sa uzorkomSRGP_setPenStyle(BITMAP_PATTERN_TRANSPARENT);SRGP_line(ptd1,ptd2); // d) isprekidana prozirna sa uzorkom
04.03.2015.SRGP - izlaz41
Pozadina ekrana aplikacije
� Korisnik očekuje da se na ekranu prikazuju primitive preko neke pozadine� SRGP inicijalizuje pozadinu ekrana na boju sa indeksom 0� Mnoge aplikacije crtaju po ekranu sa podrazumevanom pozadinom� Ponekad pozadina treba da je u drugoj boji
– tada je aplikacija odgovorna za postavljanje pozadine ekrana – pozadina ekrana se postavlja crtanjem pravougaonika
popunjenog željenim uzorkom preko celog ekrana� Jedna tehnika brisanja primitiva je njihovo crtanje
u boji uzorka pozadine ekrana aplikacije– ova "brza i prljava" tehnika daje oštećenu sliku
kada se brisana primitiva preklapa sa drugim primitivama– popravka oštećenja uključuje odlazak u bazu podataka aplikacije
i ponovo crtanje (svih ili samo nekih) primitiva
04.03.2015.SRGP - izlaz42
Čuvanje i restauracija atributa
� Individualni atributi se mogu sačuvati za kasniju restauraciju� Korisno za pisanje potprograma koji nemaju bočne efekte
(ne utiču na globalno stanje)� Za svaku proceduru koja postavlja neki atribut
postoji procedura koja vraća tekuću vrednost atributa� Na primer, za upit o tekućem stilu linije se koristi:
lineStyle SRGP_inquireLineStyle(void);
� SRGP omogućava upit i restauraciju celog skupa atributa: void SRGP_inquireAttributes(attributeGroup *group);
void SRGP_setAttributes(attributeGroup *group);
04.03.2015.SRGP - izlaz43
Struktura attributeGroup
� U implementaciji SRGP omogućen je pristup internim poljima strukture attributeGroup :
typedef struct {int write_mode;rectangle clip_rectangle;int font;lineStyle line_style;int line_width;int marker_size;markerStyle marker_style;int color, background_color;int plane_mask;drawStyle fill_style;int fill_pixmap_pattern_id;int fill_bitmap_pattern_id;drawStyle pen_style;int pen_pixmap_pattern_id;int pen_bitmap_pattern_id;
} attributeGroup;
04.03.2015.SRGP - izlaz44
Tekst
� Specificiranje i implementiranje crtanja teksta – uvek je kompleksno u grafičkim paketima
� Postoji veliki broj opcija i atributa teksta:– vrsta (font) znakova (Times Roman, Helvetica, Courier , ...)– stil (običan-normal, iskošen-italic, naglašen-bold , podvučen-underlined, ...)
– visina, tipično merena u broju tačaka: 10 12 14 16 18 20� tačka je jedinica u izdavaštvu, približno 1/72 inča
– širina – pozicija– prostor između susednih znakova (horizontal spacing)– prostor između susednih linija (vertical spacing)– ugao pod kojim se znaci ispisuju– efekat (npr. oivičeno: , urezbareno )
� PostScript standard nudi mnoge napredne mogućnosti za opis teksta (i drugih grafičkih primitiva)
ABC
04.03.2015.SRGP - izlaz45
SRGP tekst
� Najrudimentarnija podrška u grafičkim paketima: – karakteri jednake širine i jednaka rastojanja između njih
� Druga krajnost: – proporcionalni karakteri – varira širina znaka i rastojanje između njih
� SRGP:– tekst je horizontalno poravnat, širina karaktera varira, ali je razmak fiksan
� Tekst se generiše pomoću:void SRGP_text(point origin, char *text);
– lokaciju tekst primitive određuje origin, takođe poznat kao “tačka sidrenja”– osnovna linija (baseline) je hipotetička linija na kojoj leže karakteri– neki karakteri ("q") imaju rep (descender) ispod osnovne linije
quit Height
DescentBaseline
Text origin
Width
04.03.2015.SRGP - izlaz46
Implementacija teksta i operacije
� Pojava primitive teksta je određena sa samo dva atributa– tekućom bojom i fontom
� Font je samo jedan indeks u tabeli fontova različitih stilova i veličina– tabela je implementaciono zavisna
� Svaki znak u fontu je definisan kao pravougaona bit-mapavoid SRGP_setFont(int fontIndex);
� SRGP crta karakter popunjavajući pravougaonik koristeći bit-mapu kao uzorak u BITMAP_PATTERN_TRANSPARENTrežimu
� Jedinice definišu unutrašnjost karaktera, a nule "rupe"� Neki sofisticiraniji paketi definišu piksel-mape karaktera � Piksel-mapa omogućava da unutrašnjost karaktera ima šaren uzorak� SRGP obezbeđuje proceduru za upit o okviru sa tekstom:
void SRGP_inquireTextExtent(char *text, int *width, int *height, int *descent);
� SRGP ne podržava bit-mapirani netransparentni režim za ispis karaktera
04.03.2015.SRGP - izlaz47
Primer - formatiranje teksta
� Primer: crni tekst u tekućem fontu, centriran u belom okružujućem pravougaonikuvoid MakeQuitButton(rectangle buttonRect) {
point centerOfButton, textOrigin;int width, height, descent;SRGP_setFillStyle(SOLID);SRGP_setColor(COLOR_WHITE);SRGP_fillRectangle(buttonRect);SRGP_setColor(COLOR_BLACK);SRGP_setLineWidth(2);SRGP_Rectangle(buttonRect);SRGP_inquireTextExtent("quit", &width, &height, &de scent);centerOfButton.x=(buttonRect.bottomLeft.x+buttonRec t.topRight.x)/2;centerOfButton.y=(buttonRect.bottomLeft.y+buttonRec t.topRight.y)/2;textOrigin.x=centerOfButton.x-(width/2);textOrigin.y=centerOfButton.y-(height/2);SRGP_text(textOrigin,"quit");
}
04.03.2015.SRGP - izlaz48
Posebne mogu ćnosti rasterske grafike
� Tema:– mogućnosti izlaza koje posebno koriste prednosti rasterskog hardvera
� Problemi:– kreiranje kompleksnih slika koje treba da se brzo pojave na ekranu:
� priprema u memoriji � zatim kopiranje na ekran (u video memoriju)
– rad sa menijima: meni treba da se brzo pojavi, ali i da nestane sa ekrana� prilikom nestajanja, potrebno je brzo restaurirati sliku koja može biti složena� nema vremena da se tada slika crta – rešenje je u kopiranju na ekran
� Rešenje:– rad sa kanvasima (kanvas=“slikarsko platno”)– kanvasi omogućavaju smeštanje u memoriju i restauraciju delova ekrana
koji su privremeno preklopljeni drugim sadržajem (prozorima ili menijima)
04.03.2015.SRGP - izlaz49
Kanvasi
� Kanvasi su memorijski baferi za bit-mape ili piks-mape – u baferima se priprema deo slike
� Tehnika je efikasna zahvaljujući mogućnosti kopiranja blokova piksela� Kanvas je okarakterisan:
– strukturom podataka (2D matrica) za smeštanje piksela – vlastitim (kartezijanskim) koordinatnim sistemom i veličinom – atributima crtanja slike
� Sam ekran je takođe kanvas – specifičan je po tome što je jedini koji se prikazuje
� Da bi se slika iz nekog kanvasa privremeno prikazala, aplikacija:– kopira piksele iz dela ekrana na kojem treba da se pojavi slika
u neki privremeni kanvas – zatim kopira željeni ranije pripremljeni kanvas na deo ekranskog kanvasa– nakon završetka aktivnosti za koju je bio potreban privremeni sadržaj,
restaurira dati deo ekrana iz privremenog kanvasa
04.03.2015.SRGP - izlaz50
SRGP kanvas
� Aktivan kanvas – onaj u kojem se crtaju nove primitive i na koji se odnose promene atributa
� Aktivni kanvas može biti kanvas ekrana (do sada podrazumevano) ili neki koji se ne prikazuje
� Koordinate koje se šalju funkcijama sistema za crtanje primitivasu u koordinatnom sistemu aktivnog kanvasa
� Svaki kanvas ima vlastiti skup atributa koji su na podrazumevanim vrednostima kada se kanvas kreira
� SRGP kanvas je virtuelni ekran programski specificiranih dimenzija sa pridruženim svojstvima:
� piks-mapom� koordinatnim sistemom � grupom atributa
� Svojstva kanvasa se nazivaju i stanjem ili kontekstom kanvasa
04.03.2015.SRGP - izlaz51
Kreiranje i aktiviranje kanvasa
� Pri inicijalizaciji SRGP-a ekranski kanvas se:– kreira i postaje aktivni kanvas
� SRGP konstanta SCREEN_CANVASpredstavlja ID ekranskog kanvasa� Ostali kanvasi se kreiraju procedurom:
canvasID SRGP_createCanvas(int width, int height);� Novi kanvas automatski postaje aktivni, a pikseli se inicijalizuju na boju 0� Nakon kreiranja kanvasa
– veličina mu se ne može promeniti (neke implementacije to mogu da dopuste)� Programer ne može kontrolisati broj bita po pikselu kanvasa
– to definiše hardver� Atributi kanvasa se čuvaju kao lokalna informacija stanja� Aplikacija aktivira postojeći kanvas sledećim pozivom:
void SRGP_useCanvas(canvasID id);
04.03.2015.SRGP - izlaz52
Operacije sa kanvasima
� Nema načina da se aktivirani kanvas učini direktno vidljivim – njegova slika (ili samo njen deo) se kopira na ekranski kanvas
� Detekcija aktivnog kanvasa:canvasID SRGP_inquireActiveCanvas();
� Kanvas se uništava procedurom:void SRGP_deleteCanvas(canvasID id);
� Ne može se uništiti ekranski kanvas i aktivni kanvas� Sledeće procedure omogućavaju upit o dimenzijama kanvasa:
rectangle SRGP_inquireCanvasExtent(canvasID id);void SRGP_inquireCanvasSize(canvasID id,
int *width, int *height);
04.03.2015.SRGP - izlaz53
Odsecaju ći pravougaonik
� Često je poželjno ograničiti primitive na podoblast aktivnog kanvasa� SRGP podržava atribut pravougaonika za odsecanje (clip rectangle)
– odsecanje i isecanje su sinonimi u ovom kontekstu� Sve primitive se crtaju samo do granice pravougaonika za odsecanje� Atribut se može menjati, kao i drugi atributi
– njegova poslednja vrednost je zapamćena u grupi atributa kanvasa– podrazumevana vrednost atributa je ceo kanvas
� Pravougaonik se može smanjiti, ali ne i povećati izvan granica kanvasa� Funkcije za postavljanje i upit o pravougaoniku za odsecanje:
void SRGP_setClipRectangle(rectangle clipRect);rectangle SRGP_inquireClipRectangle(void);
� Aplikacije za crtanje i slikanje, treba da koriste ovaj atribut– da ograniče oblast za crtanje/slikanje i spreče da oblast menija bude oštećena
� PostScript nudi višestruke proizvoljne poligone za odsecanje
04.03.2015.SRGP - izlaz54
Operacija kopiranja piksela
� Operacija copyPixel()– još se naziva bitBlt (bit block transfer) ili pixBlt, kada je realizovana hardverski
� Prvi put se pojavila na ALTO bit-mapiranoj radnoj stanici u Xerox-u (1970)� Komanda se koristi za kopiranje niza piksela
– iz pravougaone oblasti izvornog kanvasa– u odredišnu oblast u tekuće aktivnom kanvasu
� SRGP podržava samo mogućnost da izvorni i odredišni pravougaonik oblasti budu iste veličine
� Napredniji paketi: – različite dimenzije izvornog i odredišnog pravougaonika uz automatsko skaliranje – selektivno maskiranje izvornih ili odredišnih piksela
04.03.2015.SRGP - izlaz55
SRGP funkcija za kopiranje piksela
� SRGP funkcija:void SRGP_copyPixel(canvasID sourceCanvas,
rectangle sourceRect, point destCorner);
Izvorni pravougaonik
Izvorni kanvas
Odredišni pravougaonik
Odredišno teme
Aktivni kanvas
04.03.2015.SRGP - izlaz56
Rezultat kopiranja piksela
� Rezultat operacije kopiranja piksela je u oblasti koja je presek: – pravougaonika aktivnog kanvasa,
– odredišnog pravougaonika i
– poligona (pravougaonika) za odsecanje
Izvorni kanvas
Izvorni pravougaonik
Odredišni pravougaonik
Aktivni kanvas
Pravougaonik za odsecanje
04.03.2015.SRGP - izlaz57
Primer operacija sa kanvasima (1)
� Problem: kopiranje slike tela menija na ekran
04.03.2015.SRGP - izlaz58
Primer operacija sa kanvasima (2)
� Rešenje: saveCanvasID=SRGP_inquireActiveCanvas();
SRGP_useCanvas(SCREEN_CANVAS);
saveClipRectangle=SRGP_inquireClipRectangle();
SRGP_setClipRectangle(SCREEN_EXTENT);
SRGP_copyPixel(menuCanvasID,menuBodyExtent,
menuBodyScreenExtent.bottomLeft);
SRGP_setClipRectangle(saveClipRectangle);
SRGP_useCanvas(saveCanvasID);
04.03.2015.SRGP - izlaz59
Režim upisa ili rasterski operator
� Funkcija SRGP_copyPixel() može da izvršava i logičku operaciju nad svakim korespondentnim parom piksela izvornog i odredišnog regiona
� Simbolički: D <-- S op D– op se naziva rasterski operator (RasterOp) ili režim upisa (write mode) – u opštem slučaju predstavlja jedan od 16 Bulovih operatora
� Najčešće korišćena 4 su: replace, or, xor i and – njih podržava SRGP
BLACK_COLOR=1WHITE_COLOR=0
op =
replace or xor and
S D
04.03.2015.SRGP - izlaz60
Postavljanje režima upisa
� Režim upisa utiče ne samo na SRGP_copyPixel() nego i na nove primitive koje se crtaju na kanvasu
� Atribut upisnog režima se postavlja sledećim pozivom:typedef enum {WRITE_REPLACE, WRITE_XOR,
WRITE_OR, WRITE_AND} writeMode;void SRGP_setWriteMode(writeMode write_mode);
� Podrazumevana vrednost atributa je WRITE_REPLACE� Rasterske operacije se vrše nad vrednostima piksela u kanvasu
– u SRGP-u vrednosti piksela su vrednosti indeksa u tabeli boja– na binivoskom sistemu
� postoje samo dve vrednosti indeksa (0 i 1), reprezentovane jednim bitom � interpretacija veoma prirodna
– na sistemu sa n bita po pikselu� RasterOp se obavlja bitskom širinom nad n-bitnim indeksima� rezultat može da bude neprirodan, jer rezultantni indeks daje novu boju
04.03.2015.SRGP - izlaz61
Interpretacija rasterOp
� Interpretacija pojedinih upisnih režima:– replace režim je destruktivan
i ima efekat crtanja preko postojećeg crteža� koristi se za crtanje primitiva i osvežavanje sadržaja prozora
– or režim na dvonivoskim sistemima predstavlja nedestruktivno dodavanje na postojeću sliku
� koristi se često za slikanje (četkica je S sa pikselima vrednosti 1)– xor režim na dvonivoskim sistemima invertuje odredišni region
na mestu gde izvorni region ima vrednost 1� koristi se često za invertovanje selektovanog ekranskog tastera,
za rubberband eho i eho kurzora– and režim selektivno resetuje piksele odredišta
koji odgovaraju pikselima izvorišta sa vrednošću 0� koristi se za brisanje gumicom (gumica je S sa pikselima vrednosti 0)
04.03.2015.SRGP - izlaz62
Primer koriš ćenja rasterskih operatora
� Formiranje kanvasa scene SC sastavljene od transparentnih slojeva � Pretpostavka:
– ne radi se sa VLU tabelom (paletom) kao u SRGP, vrednosti piksela su RGB boje
� Koraci za dodavanje novog sloja na scenu:– kreira se kanvas sloja LC (piks-mapa)
� LC se inicijalizuje RGB bojom 0 (000...02) (crna boja, pozadina)� svi objekti koji pripadaju sloju se iscrtaju u LC proizvoljnom bojom
– kreira se kanvas koji sadrži monohromatsku masku MC � MC se inicijalizuje belom (111...12)� svi objekti koji pripadaju datom sloju se iscrtaju crnom bojom (000...02) � u MC je dobijena bela slika sa crnim rupama na mestima objekata
– SC and MC --> SC => crne rupe na mestima objekata u novom sloju, a ostatak scene neizmenjen
– SC or LC --> SC => scena kojoj je dodat transparentni sloj
04.03.2015.SRGP - izlaz63
Ilustracija primera
SC
SC and MC SC or LC
SC SC
LC crno: 000...02
MCcrno: 000...02
belo: 111...12