home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1997 #2 / amigaacscoverdisc / amigascene / diskmagazines / izviestia / izviestia_10.lha / Izviestia_10 / Texts / 039 / 039
Text File  |  1996-08-12  |  8KB  |  264 lines

  1. B˜„Images w C
  2.  
  3.  
  4.  
  5. ƒ[LeMUr/Fire & blabla]
  6.  
  7. —   I  oto  kolejny  odcinek  kursu ƒ"System Amigi w C"‚. Tym razem o obrazach, a
  8. —ôciôlej mówiâc o images.
  9.  
  10.   „ Co  to  takiego te images?‚ Ano nic szczególnego! KAÛDY koder, który chociaû
  11. raz  bawiî  sië w  wyôwietlanie  obrazków  spotkaî sië z danymi w formacie RAW
  12. (czyli  same  dane  bitplane'ów).  Podobnie  jest  z  image'ami  (brrr - co za
  13. sîowo!).  Jest  jednak  pewna  róûnica.  Image jest pewnâ strukturâ w systemie
  14. Amigi,  która  opisuje  nasz  "obrazek". Zawiera ona dane dotyczâce wielkoôci,
  15. iloôci  biteplane'ów  i  kilku  innych  rzeczy [otrzebnych do peînego opisania
  16. obrazka. Oto ona:
  17.  
  18. —struct ƒImage
  19. —{
  20. —   WORD ƒLeftEdge
  21. —   WORD ƒTopEdge
  22. —   WORD ƒWidth
  23. —   WORD ƒHeight
  24. —   WORD ƒDepth
  25. —   UWORD *ƒImageData
  26. —   UBYTE ƒPlanePick
  27. —   UBYTE ƒPlaneOnOff
  28. —   struct Image *ƒNextImage
  29. —}
  30.  
  31.    Czas na objaônienia, a jest ich trochë...
  32.    ƒLeftEdge ‚ i ƒ TopEdge ‚ to  przesuniëcie  (z  lewej  i  z góry) od "poczâtku"
  33. obrazka.  O  co  chodzi?  Zaîóûmy,  ûe  chcemy "poîoûyê" nasz obrazek (funkcjâ
  34. DrawImage(),  ale  o  tym  póúniej) tak, aby jego górny lewy róg byî w punkcie
  35. (10;10),  ale  mamy  tam  gotowâ ramkë o szerokoôci 2 punktów. Aby zbytnio nie
  36. kombinowaê  moûemy  ustawiê to dwupunktowe przesuniëcie wîaônie w tych polach.
  37. Uûywajâc  DrawImag()  podamy  wspóîrzëdne (10;10), ale dziëki polom LeftEdge i
  38. TopEdge obrazek bëdzie w punktach (jego lewy-górny róg) np. (12;12).
  39.  ƒ  Width ‚ i ƒ Height  ‚okreôlajâ wielkoôê obrazka w punktach. Natomaist Depth to
  40. oczywiôcie iloôê uûytych plane'ów.
  41.  ƒ  ImageData‚  jest wskaúnikiem (adresem) na dane graficzne. Tutaj maîa uwaga -
  42. jeôli  zmieniacie  IFFa na RAWa i chcecie tych danych uûyê w Image, to dane te
  43. muszâ  byê  "wyrównane"  do  sîowa.  Korzystajâc z„ Pic-Con‚a mamy to zapewnione
  44. przez   ustawienie   "WORD-ALIGNED"  w  odpowiendniej  opcji  "Image  format".
  45. Oczywiôcie dane te muszâ byê w pamiëci CHIP!
  46. ƒ   PlanePick  ‚i ƒ PlaneOnOff‚  to  pola, które decydujâ o tym, które biteplane'y
  47. majâ  byê  brane pod uwagë przy rysowaniu obrazka i które trzeba "zablokowaê".
  48. Po wiëcej szczegóîów odsyîam do AutoDocs.
  49. ƒ   NextImage ‚ jest  wskaúnikiem  na  nastëpnâ  strukturë Image, wiëc moûemy za
  50. pomocâ jednego wywoîania DrawImage() narysowaê kilka obrazków.
  51.  
  52.  
  53.    Czas  na  opis funkcji „DrawImage() z intuition.library‚, która to pozwala na
  54. narysowanie "obrazka".
  55.  
  56. —   void DrawImage(RastPort, Image, LeftOffset, TopOffset)
  57. —                  A0        A1     D0          D1
  58.  
  59. ƒ   RastPort ‚ to  wskaúnik  (adres)  na  strukturë  RastPort  w której zostanie
  60. narysowany  nasz  obrazek.  Dobraê sië do niej najîatwiej przez "Okno->RPort",
  61. przy czym "Okno" jest wskaúnikiem na nasze okno otrzymanym z OpenWindow().
  62. ƒ   Image ‚to wskaúnik na opisanâ przed chwilâ strukturë Image.
  63. ƒ   LeftOffset‚  i ƒ TopOffset‚  to  wartoôci, jakie zostanâ dodane do pól Left- i
  64. TopEdge  w srtukturze Image i otrzymana suma bëdzie wspóîrzëdnâ lewego-górnego
  65. rogu naszego gotowego obrazka.
  66.  
  67.    DrawImage()  pobiera  dane z pola NextImage i jeôli nie jest ono równe NULL
  68. to rysowany jest kolejny obrazek.
  69.  
  70.  
  71.    Czas  na  przykîad,  który wyjaônie jeszcze kilka spraw. Plik DrawImage.c z
  72. katalogu "Bonus Stuff":
  73.  
  74. —„___cut_here___
  75.  
  76. /*
  77.    DrawImage.c
  78.    LeMUr/Fire & blabla
  79. */
  80. —#include <proto/dos.h>
  81. —#include <proto/exec.h>
  82. —#include <proto/intuition.h>
  83. —#include <proto/graphics.h>
  84. —#include <proto/powerpacker.h>
  85.  
  86. —#include <exec/memory.h>
  87. —#include <graphics/gfx.h>
  88. —#include <libraries/ppbase.h>
  89. —#include <intuition/intuition.h>
  90.  
  91. —#include <stdlib.h>
  92. —#inlcude <stdio.h>
  93.  
  94.  
  95. —struct IntuitionBase *IntuitionBase=NULL;
  96. —struct GfxBase *GfxBase=NULL;
  97. —struct PPBase *PPBase=NULL;
  98.  
  99.  
  100. —struct Screen *ekran=NULL;
  101. —struct Window *okno=NULL;
  102.  
  103. /* pamiëê i jej rozmiar */
  104. —UWORD *Bufor=NULL;
  105. —ULONG Size=NULL;
  106.  
  107. —struct NewWindow nokno=
  108. —{
  109. —   0, 0,
  110. —   320, 256,
  111. —   0, 0,
  112. —   RAWKEY,
  113. —   RMBTRAP | NOCAREREFRESH | ACTIVATE | BORDERLESS | BACKDROP,
  114. —   NULL, NULL,
  115. —   NULL, NULL,
  116. —   NULL,
  117. —   0, 0,
  118. —   0, 0,
  119. —   CUSTOMSCREEN
  120. —};
  121.  
  122. —struct NewScreen nekran =
  123. —{
  124. —   0, 0,
  125. —   320, 256,
  126. —   4,
  127. —   0, 0,
  128. —   NULL,
  129. —   CUSTOMSCREEN,
  130. —   NULL, NULL,
  131. —   NULL, NULL,
  132. —};
  133.  
  134. —struct Image myimage =
  135. —{
  136. —   0, 0,
  137. —   320, 256,
  138. —   4,
  139. —   NULL,
  140. —   0x0F, 0,
  141. —   NULL
  142. —};
  143.  
  144. —void gout(int kod)
  145. —{
  146. —   if(okno)
  147. —      CloseWindow(okno);
  148. —   if(ekran)
  149. —      CloseScreen(ekran);
  150.  
  151. —   if(Bufor && Size)
  152. —      FreeMem(Bufor, Size);
  153.  
  154. —   if(IntuitionBase)
  155. —      CloseLibrary((struct Library *)IntuitionBase);
  156. —   if(GfxBase)
  157. —      CloseLibrary((struct Library *)GfxBase);
  158. —   if(PPBase)
  159. —      CloseLibrary((struct Library *)PPBase);
  160.  
  161. —   exit(kod);
  162. —}
  163.  
  164. —void main(int argc, char *argv[])
  165. —{
  166. —   int err;
  167.  
  168. —   if(!(PPBase=(struct PPBase *)OpenLibrary("powerpacker.library", 0L)))
  169. —      gout(10);
  170. —   if(!(IntuitionBase=(struct IntuitionBase *)
  171. —            OpenLibrary("intuition.library", 34L)))
  172. —      gout(10);
  173. —   if(!(GfxBase=(struct GfxBase *)
  174. —            OpenLibrary("graphics.library", 34L)))
  175. —      gout(10);
  176.  
  177. —   if(err=ppLoadData(argv[1], DECR_NONE, MEMF_CHIP,
  178. —                     (UBYTE **)&Bufor, &Size, NULL))
  179. —   {
  180. —      printf("%s\n", ppErrorMessage(err));
  181. —      gout(50);
  182. —   }
  183.  
  184. —   if(!(ekran=OpenScreen(&nekran)))
  185. —      gout(30);
  186.  
  187. —   LoadRGB4(&ekran->ViewPort, Bufor, 16);
  188.  
  189. —   nokno.Screen=ekran;
  190. —   if(!(okno=OpenWindow(&nokno)))
  191. —      gout(40);
  192.  
  193. —   ShowTitle(ekran, FALSE);
  194.  
  195. —   myimage.ImageData=Bufor+16;
  196. —   DrawImage(okno->RPort, &myimage, 0L, 0L);
  197. —   RemakeDisplay();
  198.  
  199.    /* pëtla obsîugujâca komunikaty intuition */
  200. —   for(;;)
  201. —   {
  202. —      struct IntuiMessage *imsg=NULL;
  203.  
  204. —      WaitPort(okno->UserPort);
  205. —      if(imsg=(struct IntuiMessage *)GetMsg(okno->UserPort))
  206. —      {
  207. —         ULONG clas=imsg->Class;
  208. —         UBYTE code=imsg->Code;
  209.  
  210. —         ReplyMsg((struct Message *)imsg);
  211.          /* naciôniëcie ESC */
  212. —         if(clas==RAWKEY && code == 69)
  213. —            gout(0);
  214. —      }
  215. —   }
  216. —}
  217.  
  218. —„___cut_here___
  219.  
  220.  ƒ  Czas na objaônienia.‚ Na poczâtek standardowo full include'ów i definicji. W
  221. NewWindow  "kaûë"  informoawê  o naciôniëciu klawisza oraz ustawiam "olewanie"
  222. RMB i informacje o odôwieûaniu ekranu. Dodatkowo okno ma beê otwarte bez ramek
  223. i pod wszystkimi oknami na danym ekranie, co w tym wypadku nie jest konieczne.
  224. Okno  i  ekran  majâ  rozmiary „ 320x256 ‚i jest to„ w 16 kolorach‚. Takie obrazki
  225. bëdziemy wuôwietlaê.
  226.    Dalej  jest funkcja wychodzâca, która zwalnia i zamyka wszystko, co jest do
  227. zwolnienia.
  228.    W  gîównym  programie otwieramy takûe bibliotekë powerpacker, bo program ma
  229. moûliwoôê  wczytywania  danych  spakowanych w tym formacie. Moûna to pominâê i
  230. napisaê  (lub  uûyê  gotowâ,  np.  z poprzedniego odcinka) innâ procedurë, ale
  231. zaleûaîo  mi  na  w  miarë  krótkim listingu. Po zaîadowaniu obrazka otwieramy
  232. ekran,  ustawiamy  paletë  (o  tym  jescze  za  chwileczkë)  i otwieramy okno.
  233. Nastëpnie rysujemy nasz obrazek i "przemyôlamy wyôwietlanie" ;-)
  234.    W  pëtli  sprawdzamy  czy  aby  nie naciôniëto ESC, a jeôli tak to koïczymy
  235. program.
  236.  
  237.    Jeôli  natomiast  chodzi  o plik, który zostanie wyôwietlony to musi on byê
  238. odpowiednio przygotowany. Jak? Bardzo îatwo! Uruchamiamy Pic-Cona i wczytujemy
  239. dowolny  obrazek IFF w 320x256 i 16 kolorów. Teraz zapisujemy paletë (4 bit!),
  240. a  nastëpnie  dane (word-aligned). Oczywiôcie do 2 róûnych plików. Uruchamiamy
  241. nastëpnie  Cygnusa  (lub  w  inny  sposób  îâczymy  pliki) i wczytujemy plik z
  242. nagranâ paletâ. Skaczemy na koniec tekstu i doîâczamy ("Include file...") plik
  243. z  danymi  RAW.  Caîoôê  zgrywamy  na  dysk  jako jeszcze inny plik (w sumie z
  244. jednego obrazka bëdziemy mieê 4 pliki - sam obrazek, paletë, dane w RAW i plik
  245. dla  powyûszego  programu).  Uruchamiamy DrawImage podajâc jako parametr nazwë
  246. pliku  zgranego  z  Cygnusa.  Podziwiamy  obrazek  i naciskamy ESC gdy nam sië
  247. znudzi. Ot, caîy trick!
  248.  
  249. —   Dla   uîatwienia  w  katalogu  "Bonus  Stuff"  powinien  sië znaleúê  jakiô
  250. —przykîadowy obrazek, o ile starczy miejsca.
  251.  
  252.    Dodam  tylko,  ûe  powyûszy program jest fragmentem slide-showu, nad którym
  253. pracujemy  (zmienione  jest  tylko  kilka  funkcji  (na  AGA-thowe :) i dodane
  254. zmienianie  wielkoôci ekranu), a takûe w tym numerze Izviestii do wyôwietlania
  255. clip-artów.  Mam  nadziejë,  ûe  teraz  pokazywanie  obrazków i uûywanie ich w
  256. waszych programach nie bëdzie kîopotliwe!
  257.  
  258.    Czego sobie i Wam ûyczy
  259. ˜„       LeMUr/Fire & blabla
  260.  
  261.  
  262. P.S.
  263. ƒ   Thanks must go to Spirol/Clan for idea of article!
  264.