Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

DODATEK C

=========

KNJIŽNICA UGPX

Knjižnica ugpx je mikro grafična knjižnica za računalnik Iskra Delta Partner. Podpira grafični zaslon z ločljivostjo 1024×256 ali 1024×512 točk. V program jo vključimo z direktivo:

#include <ugpx.h>

Knjižnica ponuja naslednje sklope funkcij:

  • inicializacija in preklapljanje grafičnega načina,
  • risanje točk, črt in pravokotnikov,
  • izpis besedila z lastnimi pisavami,
  • upravljanje strani za dvojno medpomnjenje (double buffering),
  • nadzor barve risanja.

C.1. PODATKOVNI TIPI

Knjižnica ugpx definira naslednje osnovne tipe:

typedef int     coord;    /* Tip za koordinato */
typedef uint8_t color;    /* Tip za barvo */

/* Dimenzije (širina in višina) */
typedef struct {
    coord w;
    coord h;
} dim_t;

/* Pravokotnik (dve nasprotni kotni točki) */
typedef struct {
    coord x0;
    coord y0;
    coord x1;
    coord y1;
} rect_t;

Tip coord se uporablja za vse koordinate na zaslonu. Tip color določa način risanja posameznih točk. Struktura dim_t hrani izmerjen obseg (širino in višino) besedila ali glifa. Struktura rect_t opisuje pravokotnik z dvema kotoma; pred uporabo jo je priporočljivo normalizirati s funkcijo gnormrect().

Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.2. INICIALIZACIJA IN ZAPIRANJE

ginit

#include <ugpx.h>

#define RES_1024x256  0x00
#define RES_1024x512  0x18

void ginit(uint8_t resolution);

Parametri:

  • resolution – zahtevana ločljivost: RES_1024x256 ali RES_1024x512.

Vrne: nič.

Opis: Funkcija preklopi računalnik Partner v grafični način delovanja. Nastavi grafični pomnilnik glede na izbrano ločljivost in pripravi strojno opremo za izris. Klic te funkcije je obvezen pred kakršno koli drugo funkcijo knjižnice ugpx. Po klicu je aktiven zaslon prazen.

Sorodne funkcije: gexit, gcls.

/* Vstop v grafični način z ločljivostjo 1024x256 */
ginit(RES_1024x256);

gexit

#include <ugpx.h>

void gexit(void);

Parametri: brez.

Vrne: nič.

Opis: Zapre grafični način in vrne računalnik Partner v besedilni način delovanja. Klic je priporočljiv ob koncu vsakega grafičnega programa, da se zaslon vrne v normalno stanje. Po klicu so grafični podatki v pomnilniku ohranjeni, zaslon pa prikazuje besedilni vmesnik.

Sorodne funkcije: ginit.

ginit(RES_1024x256);
/* ... grafično delo ... */
gexit();  /* Vrnitev v besedilni način */

gcls

#include <ugpx.h>

void gcls(void);

Parametri: brez.

Vrne: nič.

Opis: Pobriše celotno trenutno pisalno stran grafičnega zaslona. Vse točke se postavijo na vrednost ozadja. Pri dvojnem medpomnjenju pobriše le pisalno stran, ne pa tudi prikazovalne.

Sorodne funkcije: ginit, gsetpage.

ginit(RES_1024x256);
gcls();   /* Prazno platno, pripravljeno za risanje */
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.3. KAZALNIK IN TOČKE

gxy

#include <ugpx.h>

void gxy(coord x, coord y);

Parametri:

  • x – vodoravna koordinata grafičnega kazalnika (0 je levo).
  • y – navpična koordinata grafičnega kazalnika (0 je zgoraj).

Vrne: nič.

Opis: Premakne grafični kazalnik na koordinato (x, y) brez risanja. Grafični kazalnik je izhodišče za relativne risalne funkcije, kot je gdrawd(). Koordinate niso preverjene glede meja zaslona.

Sorodne funkcije: gdrawd, gdrawline.

gxy(512, 128);   /* Kazalnik na sredino zaslona 1024x256 */

gputpixel

#include <ugpx.h>

void gputpixel(coord x, coord y);

Parametri:

  • x – vodoravna koordinata točke.
  • y – navpična koordinata točke.

Vrne: nič.

Opis: Nariše eno točko na koordinati (x, y) z aktivno barvo, nastavljeno s gsetcolor(). Če je barva CO_FORE, se točka vklopi; če je CO_BACK, se izklopi. Grafični kazalnik se ne premakne.

Sorodne funkcije: gsetcolor, gdrawline.

gsetcolor(CO_FORE);
gputpixel(100, 50);   /* Svetla točka na zaslonu */

gputglyph

#include <ugpx.h>

void gputglyph(void *glyph, coord x, coord y);

Parametri:

  • glyph – kazalec na podatkovni blok glifa, ustvarjenega z orodjem snatch.
  • x – vodoravna koordinata levega zgornjega kota glifa.
  • y – navpična koordinata levega zgornjega kota glifa.

Vrne: nič.

Opis: Nariše enojni grafični gliph (majhno sliko) na koordinati (x, y) brez rezanja (unclipped). Glif je zunanji simbol, ustvarjen z orodjem snatch in deklariran kot extern void ime_glifa;. Kazalec se poda kot &ime_glifa. Funkcija ne preverja mej zaslona, zato mora biti gliph v celoti znotraj vidnega območja.

Sorodne funkcije: gputtext, gmegpy.

extern void moj_glyph;

ginit(RES_1024x256);
gsetcolor(CO_FORE);
gputglyph(&moj_glyph, 200, 100);
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.4. BESEDILO

gputtext

#include <ugpx.h>

void gputtext(void *font, char *text, coord x, coord y);

Parametri:

  • font – kazalec na pisavo, ustvarjeno z orodjem snatch.
  • text – niz znakov, ki se izpiše na zaslon.
  • x – vodoravna koordinata začetka besedila.
  • y – navpična koordinata začetka besedila.

Vrne: nič.

Opis: Izpiše besedilni niz text na zaslonu z izbrano pisavo font na položaju (x, y). Pisava je zunanji simbol, ustvarjen z orodjem snatch in deklariran kot extern void ime_pisave;; kazalec se poda kot &ime_pisave. Barva pisanja mora biti nastavljena s gsetcolor() pred klicem funkcije. Funkcija izriše vse znake niza zaporedoma od leve proti desni.

Sorodne funkcije: gmetext, gsetcolor, gputglyph.

extern void my_font;

ginit(RES_1024x256);
gsetcolor(CO_FORE);
gputtext(&my_font, "PARTNER", 100, 50);

gmetext

#include <ugpx.h>

void gmetext(void *font, char *text, dim_t *dim);

Parametri:

  • font – kazalec na pisavo.
  • text – niz znakov, katerega dimenzije merimo.
  • dim – kazalec na strukturo dim_t, v katero se shranjujeta izmerjena širina (w) in višina (h) besedila v pikslih.

Vrne: nič (rezultat je v *dim).

Opis: Izmeri prostorske dimenzije besedilnega niza text z dano pisavo, ne da bi karkoli izrisala na zaslon. Rezultat shrani v strukturo, na katero kaže dim. Funkcija je koristna za izračun položaja pred izrisovanjem, npr. za centriranje besedila.

Sorodne funkcije: gputtext, gmegpy.

extern void my_font;
dim_t d;

gmetext(&my_font, "PARTNER", &d);
/* Izpis na sredini zaslona */
gputtext(&my_font, "PARTNER", (1024 - d.w) / 2, 100);

gmegpy

#include <ugpx.h>

void gmegpy(void *glyph, dim_t *dim);

Parametri:

  • glyph – kazalec na gliph.
  • dim – kazalec na strukturo dim_t, v katero se shranjujeta širina (w) in višina (h) glifa.

Vrne: nič (rezultat je v *dim).

Opis: Prebere dimenzije glifa iz njegove podatkovne strukture in jih shrani v *dim. Funkcija ne izrisuje ničesar na zaslon. Koristna je za izračun položaja ali rezalnega okna pred klicem gputglyph().

Sorodne funkcije: gputglyph, gmetext.

extern void moj_glyph;
dim_t d;

gmegpy(&moj_glyph, &d);
/* Glyph je d.w pikslov širok in d.h pikslov visok */
gputglyph(&moj_glyph, (1024 - d.w) / 2, 10);
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.5. BARVA IN ČRTE

gsetcolor

#include <ugpx.h>

#define CO_NONE  0x00   /* Brez risanja */
#define CO_FORE  0x01   /* Ospredna barva (vklop točke) */
#define CO_BACK  0x02   /* Ozadna barva (izklop točke) */

void gsetcolor(color c);

Parametri:

  • c – barva risanja: CO_NONE, CO_FORE ali CO_BACK.

Vrne: nič.

Opis: Nastavi globalno barvo risanja, ki jo uporabljajo vse nadaljnje risalne funkcije. Vrednost CO_FORE vklopi točke (svetlo), CO_BACK jih izklopi (temno), CO_NONE pa onemogoči risanje. Nastavitev velja do naslednjega klica gsetcolor().

Sorodne funkcije: gputpixel, gdrawline, gfillrect.

gsetcolor(CO_FORE);   /* Risanje svetlih črt */
gdrawline(0, 0, 100, 100);
gsetcolor(CO_BACK);   /* Brisanje z ozadjem */
gfillrect(&r);

gdrawline

#include <ugpx.h>

void gdrawline(coord x0, coord y0, coord x1, coord y1);

Parametri:

  • x0, y0 – koordinata začetne točke.
  • x1, y1 – koordinata končne točke.

Vrne: nič.

Opis: Nariše ravno črto od točke (x0, y0) do točke (x1, y1) z aktivno barvo. Uporablja Bresenhamov algoritem za enakomerno razporeditev točk vzdolž črte. Po klicu se grafični kazalnik premakne na končno točko (x1, y1).

Sorodne funkcije: gdrawd, gxy, gsetcolor.

gsetcolor(CO_FORE);
gdrawline(0, 0, 1023, 255);   /* Diagonala čez celoten zaslon */

gdrawd

#include <ugpx.h>

void gdrawd(coord dx, coord dy);

Parametri:

  • dx – premik v vodoravni smeri (pozitivno = desno, negativno = levo).
  • dy – premik v navpični smeri (pozitivno = dol, negativno = gor).

Vrne: nič.

Opis: Nariše črto od trenutnega grafičnega kazalnika za relativni premik (dx, dy). Deluje enako kot gdrawline(), le da je ciljna točka podana relativno glede na trenutni položaj kazalnika. Po klicu se kazalnik premakne na novo točko. Primerna za risanje verižnih črt.

Sorodne funkcije: gdrawline, gxy.

gsetcolor(CO_FORE);
gxy(100, 100);        /* Postavi kazalnik */
gdrawd(200, 0);       /* Vodoravna črta dolžine 200 */
gdrawd(0, 100);       /* Navpična črta navzdol za 100 */
gdrawd(-200, 0);      /* Nazaj levo */
gdrawd(0, -100);      /* Nazaj gor – zaprt pravokotnik */
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.6. PRAVOKOTNIKI

gnormrect

#include <ugpx.h>

rect_t *gnormrect(rect_t *r);

Parametri:

  • r – kazalec na strukturo rect_t, ki jo normaliziramo na mestu.

Vrne: kazalec na normaliziran pravokotnik r.

Opis: Zagotovi, da velja x0 <= x1 in y0 <= y1 v podanem pravokotniku. Če kateri par koordinat ni urejen, ju funkcija zamenja. Funkcija deluje na mestu in vrne isti kazalec, kar omogoča veriženje klicev. Priporočena je pred klicem gdrawrect() ali gfillrect().

Sorodne funkcije: gdrawrect, gfillrect.

rect_t r = { 300, 200, 100, 50 };  /* Nenormaliziran pravokotnik */
gnormrect(&r);                      /* Zdaj: x0=100, y0=50, x1=300, y1=200 */
gdrawrect(&r);

gdrawrect

#include <ugpx.h>

void gdrawrect(rect_t *r);

Parametri:

  • r – kazalec na normaliziran pravokotnik rect_t.

Vrne: nič.

Opis: Nariše obrobo pravokotnika, opisanega s strukturo *r, z aktivno barvo. Nariše se samo zunanji rob, notranjost ostane nespremenjena. Pravokotnik mora biti normaliziran (x0 <= x1, y0 <= y1); priporočena je predhodna uporaba gnormrect().

Sorodne funkcije: gfillrect, gnormrect, gsetcolor.

rect_t r = { 50, 30, 400, 180 };
gsetcolor(CO_FORE);
gnormrect(&r);
gdrawrect(&r);   /* Nariše okvir pravokotnika */

gfillrect

#include <ugpx.h>

void gfillrect(rect_t *r);

Parametri:

  • r – kazalec na normaliziran pravokotnik rect_t.

Vrne: nič.

Opis: Zapolni celotno območje pravokotnika, opisanega s strukturo *r, z aktivno barvo. Za razliko od gdrawrect() zapolni vse točke znotraj mej in ne le obrobe. Z barvo CO_BACK je mogoče s to funkcijo izbrisati pravokotno področje zaslona.

Sorodne funkcije: gdrawrect, gnormrect, gsetcolor.

rect_t r = { 50, 30, 400, 180 };
gsetcolor(CO_FORE);
gnormrect(&r);
gfillrect(&r);   /* Zapolnjen pravokotnik */

/* Brisanje istega področja */
gsetcolor(CO_BACK);
gfillrect(&r);
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.7. UPRAVLJANJE STRANI

gsetpage

#include <ugpx.h>

#define PG_DISPLAY  1   /* Nastavi prikazovalno stran */
#define PG_WRITE    2   /* Nastavi pisalno stran */

void gsetpage(uint8_t op, uint8_t page);

Parametri:

  • op – operacija: PG_DISPLAY, PG_WRITE, ali PG_DISPLAY|PG_WRITE.
  • page – številka strani: 0 ali 1.

Vrne: nič.

Opis: Nastavi prikazovalno in/ali pisalno stran grafičnega pomnilnika. Grafični pomnilnik Partnerja podpira dve strani (0 in 1), kar omogoča tehniko dvojnega medpomnjenja (double buffering). Z vrednostjo PG_DISPLAY izberemo, katera stran je vidna na zaslonu; z PG_WRITE določimo, na katero stran pišejo risalne funkcije. Risamo na skrito stran, nato strani zamenjamo – s tem dobimo gladke animacije brez utripanja. Z vrednostjo PG_DISPLAY|PG_WRITE nastavimo obe strani hkrati.

Sorodne funkcije: gcls, ginit.

extern void font;

ginit(RES_1024x256);
gsetcolor(CO_FORE);

/* Prikazujemo stran 0, rišemo na stran 1 */
gsetpage(PG_DISPLAY, 0);
gsetpage(PG_WRITE, 1);
gcls();
gputtext(&font, "Nova slika", 10, 10);

/* Zamenjava: prikažemo stran 1 */
gsetpage(PG_DISPLAY, 1);

/* Zdaj rišemo na stran 0 (prej prikazano) */
gsetpage(PG_WRITE, 0);
gcls();
gputtext(&font, "Naslednji okvir", 10, 10);

/* Zamenjava nazaj */
gsetpage(PG_DISPLAY, 0);
Partner WFG, 2FG, 1FG – PRIROČNIK ZA PROGRAMIRANJE

C.8. PISAVE IN GLIFI

Knjižnica ugpx ne vsebuje vgrajenih pisav. Pisave in glifi so zunanji podatkovni bloki, ki jih ustvari orodje snatch. Orodje pretvori slikovne datoteke ali opise znakov v podatkovne strukture, ki jih ugpx razume.

Deklaracija pisave

Vsaka pisava ali gliph se v programu deklarira kot zunanji simbol tipa void:

extern void moja_pisava;   /* Pisava (celoten nabor znakov) */
extern void moj_glyph;    /* Gliph (en sam grafični element) */

Kazalec na pisavo oziroma gliph se poda z operatorjem &:

gputtext(&moja_pisava, "Pozdrav!", 0, 0);
gputglyph(&moj_glyph, 50, 50);

Ustvarjanje pisav z orodjem snatch

Orodje snatch prebere vhodno sliko ali opis pisave in ustvari objektno datoteko (.o) ter ustrezno glavo (.h). Objektno datoteko povežemo s programom pri povezovanju (linking). Natančnejša navodila za uporabo orodja snatch so v posebni dokumentaciji tega orodja.

Celoten primer

Spodnji primer prikazuje tipičen potek dela z grafično knjižnico ugpx: inicializacijo, nastavitev barve, izpis besedila in izhod iz grafičnega načina.

#include <ugpx.h>

extern void moja_pisava;

int main(void)
{
    dim_t d;

    /* Vstop v grafični način */
    ginit(RES_1024x256);
    gcls();

    /* Nastavimo barvo in izpišemo napis na sredini */
    gsetcolor(CO_FORE);
    gmetext(&moja_pisava, "ISKRA DELTA PARTNER", &d);
    gputtext(&moja_pisava, "ISKRA DELTA PARTNER",
             (1024 - d.w) / 2, (256 - d.h) / 2);

    /* Narišemo okvir okoli napisa */
    rect_t r = {
        (1024 - d.w) / 2 - 10,
        (256 - d.h) / 2 - 5,
        (1024 + d.w) / 2 + 10,
        (256 + d.h) / 2 + 5
    };
    gnormrect(&r);
    gdrawrect(&r);

    /* Počakamo in zapustimo grafični način */
    gexit();
    return 0;
}