home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 10 / ami031.txt < prev    next >
Text File  |  1997-04-07  |  6KB  |  152 lines

  1. Kurs jëzyka C (cz. 5.)
  2. ----------------------
  3.  
  4. MALOWANIE PO EKRANIE
  5.  
  6. <a>Kamil Iskra, Dariusz Ûbik
  7.  
  8. <txt>W dzisiejszej czëôci zajmiemy sië rysowaniem.
  9.  
  10. Wysokopoziomowe funkcje graficzne jako jednego z argumentów
  11. wymagajâ wskaúnika na RastPort (patrz "graphics/rastport.h").
  12. Jest to struktura zawierajâca informacje niezbëdne do prac
  13. graficznych, jednak nas interesuje tylko czëôê danych w niej
  14. zawartych. Kaûde otwarte okno ma wîasny RastPort. Jego adres
  15. moûna znaleúê w polu "RPort" struktury "Window".
  16.  
  17. RastPort moûna traktowaê jako "czarnâ skrzynkë", potrzebnâ do
  18. rysowania. Jest ona doôê wygodna. Uûywajâc róûnych funkcji
  19. graficznych, podajemy wspóîrzëdne punktów wzglëdem lewego górnego
  20. rogu RastPortu. Podanie wspóîrzëdnych "wystajâcych" poza RastPort
  21. nie powoduje ûadnych problemów -- funkcje graficzne narysujâ
  22. tylko tyle, ile sië zmieôci. W RastPorcie zapisane jest równieû
  23. poîoûenie kursora graficznego, tryb rysowania, aktualne kolory,
  24. wzór linii itp.
  25.  
  26. Poîoûenie kursora zapisane jest w polach "cp_x" i "cp_y", po
  27. inicjalizacji RastPortu (w naszym wypadku otwarciu okna) kursor
  28. znajduje sië w punkcie (0, 0), co zwykle wypada na górnej listwie
  29. okna. Po dodaniu w tagu "WA_Flags" flagi "WFLG_GIMMEZEROZERO"
  30. niedogodnoôê ta znika, punkt (0, 0) wypada w lewym górnym rogu
  31. wnëtrza okna, ale obsîuga okien jest wolniejsza, a takûe wiëksze
  32. jest zapotrzebowanie na pamiëê, wiëc nie radzimy uûywaê tego
  33. atrybutu. Przy opisywaniu gadûetów pokaûemy, jak moûna sië obejôê
  34. bez pomocy GZZ.
  35.  
  36. Kolor tîa jest odnotowany w polu "BgPen" (BPen), kolor
  37. "atramentu" w "FgPen" (APen). Nie wolno bezpoôrednio (instrukcjâ
  38. przypisania) zmieniaê kolorów, zapisanych w strukturze. Do tego
  39. celu przeznaczone sâ funkcje biblioteki "graphics.library":
  40.  
  41. <l>
  42. void SetAPen( struct RastPort *rp, unsigned long pen );
  43.  
  44. void SetBPen( struct RastPort *rp, unsigned long pen );
  45.  
  46. <txt>Pierwsza z nich zmienia kolor atramentu, druga kolor tîa.
  47. Obie funkcje wymagajâ jako argumentów wskaúnika na RastPort oraz
  48. numeru koloru.
  49.  
  50. Dane zawarte w polach "FgPen" i "BgPen" moûna byîo odczytywaê.
  51. Zapisana tam wartoôê to numer koloru. Jednak od systemu 3.0
  52. pojawiîy sië specjalne funkcje, zwracajâce numery kolorów jako
  53. wartoôê typu ULONG. Jest to przygotowane nieco na wyrost,
  54. poniewaû koôci AGA majâ oômiobitowy blitter, czyli 256 rejestrów
  55. kolorów, w zwiâzku z czym do zapisania koloru wystarczy jeden
  56. bajt. Polecam jednak stosowanie tych funkcji, poniewaû przy
  57. jeszcze nowszych koôciach moûe to byê konieczne (przy zaîoûeniu,
  58. ûe bëdâ jakieô "nowsze koôci" -- miejmy nadziejë, ûe Escom nas
  59. nie zawiedzie).
  60.  
  61. <l>
  62. ULONG GetAPen( struct RastPort *rp );
  63.  
  64. ULONG GetBPen( struct RastPort *rp );
  65.  
  66. <txt>Poniewaû nie wszystkie Amigi majâ powyûsze funkcje, naleûy
  67. sprawdzaê wersjë biblioteki (byîo to przerabiane w pierwszej
  68. czëôci), moûesz to równieû zobaczyê w listingu 9.: funkcje
  69. dajKolorA() i dajKolorB(). Jeûeli masz inkludy z systemu
  70. starszego niû 3.0, wystâpiâ problemy ze skompilowaniem tego
  71. listingu, poniewaû kompilator stwierdzi, ûe nie zadeklarowano
  72. niektórych funkcji. Sugerujë wiëc posiadaczom starszych inkludów
  73. zmodyfikowaê nieco program, usuwajâc wywoîania nieznanych
  74. kompilatorowi funkcji, a nastëpnie poszukaê nowszych plików
  75. nagîówkowych.
  76.  
  77. Tak samo ma sië sprawa z polem "DrawMode", w którym odnotowany
  78. jest sposób (tryb) rysowania po oknie. Do jego zmiany sîuûy
  79. funkcja:
  80.  
  81. <l>void SetDrMd( struct RastPort *rp, unsigned long drawMode );
  82.  
  83. <txt>Do jego odczytania zaô uûywamy:
  84.  
  85. <l>ULONG GetDrMd( struct RastPort *rp );
  86.  
  87. <txt>Pojawiîa sië ona wraz z opisanymi wczeôniej funkcjami
  88. GetAPen() i GetBPen() -- w wypadku starszych systemów naleûy po
  89. prostu odczytaê pole RastPortu "DrawMode".
  90.  
  91. Sâ zdefiniowane nastëpujâce tryby rysowania:
  92.  
  93. JAM1
  94.  
  95. Tylko kolor atramentu jest umieszczany na RastPorcie.
  96.  
  97. JAM2
  98.  
  99. Zarówno kolory atramentu, jak i tîa sâ umieszczane na RastPorcie.
  100. Tryb ten moûna odróûniê od JAM1 tylko w wypadku, gdy na
  101. RastPorcie umieszczane sâ napisy lub rysunki (o tym póúniej).
  102.  
  103. COMPLEMENT
  104.  
  105. Jest wykonywana róûnica symetryczna (XOR) obecnej zawartoôci
  106. RastPortu i tego, co ma byê narysowane.
  107.  
  108. INVERSVID
  109.  
  110. Wykonywana jest inwersja kolorów.
  111.  
  112. Powyûsze tryby moûna swobodnie mieszaê ze sobâ, jednak niektóre
  113. kombinacje nie majâ sensu. Podejrzewam, ûe znaczenie
  114. poszczególnych trybów nie jest jeszcze zrozumiaîe, myôlë jednak,
  115. ûe sië to nieco przejaôni po zapoznaniu sië z dziaîaniem
  116. przykîadu. Do testowania sugerujë uûyê rysowania napisów,
  117. poniewaû tylko w tym wypadku rysowany jest kolor tîa, co pozwala
  118. odróûniê tryb JAM1 od JAM2.
  119.  
  120. Proponujemy teraz zajrzeê do przykîadu: listing 9.
  121.  
  122. Przykîad ten to demonstracja uûycia najprostszych funkcji
  123. graficznych systemu operacyjnego. Przy uûyciu odpowiednich
  124. klawiszy (bâdú klikajâc jednokrotnie na gadûecie zamykania okna)
  125. moûna sië przeîâczaê pomiëdzy róûnymi trybami pracy programu,
  126. takimi jak: rysowanie elips, punktów, zmiana kolorów itp. Rodzaj
  127. trybu, w jakim program znajduje sië w danym momencie, jest
  128. wyôwietlany na listwie tytuîowej okna. Rysuje sië za pomocâ
  129. myszy, w sposób czësto niezbyt elegancki (moûna np. rysowaê po
  130. listwie tytuîowej) i nieintuicyjny (nie jest tak od razu
  131. oczywiste, co w danym trybie robi przycisk lewy, a co prawy), ale
  132. ma to byê tylko przykîad, a nie jakiô uûyteczny program. Gdyby
  133. chcieê zrobiê to elegancko, to naleûaîoby skorzystaê z gadûetów,
  134. a na razie nie umiemy z nich korzystaê.
  135.                      
  136. Szczegóîowy opis listingu zamieszczony zostanie w nastëpnym odcinku kursu.
  137.  
  138. <r>Oto najczëôciej powtarzajâce sië w listach do mnie pytania.
  139.  
  140. 1. Pytacie jak kompilowaê listingi. W kompilatorze SAS/C 6.x robi sië
  141. to z Shella piszâc "SC nazwa_listingu.c LINK". Nie polecamy osobnego
  142. wywoîywania linkera (slink), gdyû jest to bardziej skomplikowane.
  143.  
  144. 2. W czëôci 1, w listingu 3, w pëtli "for" znajduje sië instrukcja
  145. "licznik--". Powinno byê oczywiôcie "licznik- -" (sîownie: licznik minus
  146. minus).
  147.  
  148. 3. W czëôci 3, w listingu 5, zmienna "IntuitionBase" jest zmiennâ
  149. lokalnâ. Kompilator SAS/C skompiluje ten przykîad bez zarzutu, ale
  150. chyba wszystkie inne kompilatory sië "udîawiâ" - zmienna ta powinna
  151. byê globalna.
  152.