P R O G R A M U J E M Ement funkcie Stop je èas, ktorý má uplynú v prehrávaní videa, aby sa <strong>sk</strong>ryl text danéhoprvku div. Vlastná funkcia Stop je jednoduchá:function Stop (Co, Kedy){if (Medium.currTimeState.activeTime>Kedy) Co.endElement();}Skontroluje èas aktivity objektu Medium (náš prvok media). Ak jeho èas prekroèil hod−notu v argumente Kedy, aktivita prvku div je ukonèená metódou endElement.SYNCHRONIZÁCIA. Opísané riešenie funguje, ale urèite tušíme, e takáto synchro−nizácia výpisu textu s videom je nešikovná. V názve odporúèania SMIL je slovo Synchro−nized. To dáva nádej, e jedným z cie¾ov normotvorcov bolo zabezpeèi synchronizáciumultimédií. Je to <strong>sk</strong>utoène tak. Prvok media môeme poui takto:Hodnotou true atribútu syncMaster urèujeme, e prvok media bude vystupova v rolemaster – hlavného prvku synchronizácie. Hodnotou locked atribútu syncBehavior urèuje−me, e sa má èaka <strong>na</strong> prípadné pozastavenie.Ak pouijeme tieto dva atribúty, vyhneme sa potrebe zamýš¾a sa <strong>na</strong>d svojimi vlastnými syn−chronizaènými funkciami, ako je uvedená funkcia Stop. Prvok seq a jeho det<strong>sk</strong>é prvky div sosprievodným textom môu by potom vo svojej pôvodnej podobe. Na zabezpeèenie synchro−nizácie je potrebné, aby náš prvok t:media a prvok t:seq so sprievodným textom mali spoloè−ného „èasovacieho“ rodièa. Môe ním by prvok t:par – zdruuje prvky s paralelne beiacimèasom. Kód cie¾ového riešenia nájdete <strong>na</strong> CD v súbore media9.html.INÉ MÉDIÁ. V <strong>na</strong>šom príklade sme riešili prehrávanie videa. Pouili sme prvok t:media.Rozpoz<strong>na</strong>nie druhu média sa u<strong>sk</strong>utoènilo pod¾a prípony wmv pouitého zdrojového súboru. VTIME sú definované viaceré synonymá pre prvok t:media. Mono poui aj názvy t:animation,t:audio, t:img, t:ref a t:video. Všetky tieto prvky majú rov<strong>na</strong>kú implementáciu. Ich pouitie saodporúèa pre lepšiu èitate¾nos programu. Tak aj v <strong>na</strong>šich príkladoch by sme <strong>na</strong>miesto t:mediamohli poui t:video.Imrich Buran<strong>sk</strong>ýProgramujeme v PHP / 10. èas: Grafika v PHP II.Na CD REVUE nájdete:zdrojové kódyPredošlá èas bola úvodom do pouívania kninice GD, vytvorenej <strong>na</strong> dy<strong>na</strong>mické ge−nerovanie grafiky priamo v <strong>sk</strong>ripte PHP. V tejto èasti si ukáeme, ako pracova s farbami.Ani v tomto smere nás kninica GD ne<strong>sk</strong>lame. Farby sa v HTML zadávajú v tvare RGB akoèasti troch základných farieb (èervenej, zelenej a modrej). Najvyššia povolená hodnotakadej z týchto troch farieb je 255 a <strong>na</strong>jnišia 0.ImageColorAllocate je <strong>na</strong>jdôleitejšia funkcia práce s farbami. Pouíva sa <strong>na</strong> priraïovaniefarieb jednotlivým objektom, obrázkom. Vyh¾adá prvý dostupný index farby v zadanom obráz−ku, <strong>na</strong>staví hodnoty èervenej, zelenej a modrej farby pod¾a zadania a vráti index poloky novejfarby v tabu¾ke. Pri vytváraní nového obrázka, respektíve pri prvom pouití tejto funkcie <strong>na</strong>sta−vujeme pozadie daného obrázka. Vracia sa identifikátor farby predstavujúci farbu <strong>sk</strong>ladajúcusa zo zloiek RGB. Argument obrazok sa vracia z funkcie ImageCreate(). FunkciuImageColorAllocate treba zavola pre kadú pouívanú farbu v danom obrázku.Int ImageColorAllocate(int obrazok, int cerve<strong>na</strong>, int zele<strong>na</strong>, int modra);ImageColorAt nám zistí farbu akéhoko¾vek bodu v danom, u existujúcom obrázku. Tátofunkcia vracia index farby pixla <strong>na</strong> mieste urèenom súradnicami x a y v obrázku obrazok.Int ImageColorAt(int obrazok, int x, int y);Pomocou tejto funkcie nie je problém <strong>na</strong>písa <strong>sk</strong>ript, ktorého úlohou by bolo zisti farbupozadia obrázka a automaticky prispôsobi farbu pozadia celej zobrazovanej stránky.ImageColorClosest je funkcia, ktorá nám dokáe urèi, èi obrázok obsahuje nejakúfarbu, prípadne aká farba v palete obrázka je tej <strong>na</strong>šej <strong>na</strong>jviac podobná. Na tento úèelmôeme poui funkciu ImageColorClosest a ImageColorExact.Int ImageColorClosest(int obrazok, int cerve<strong>na</strong>, int zele<strong>na</strong>, int modra);Funkcia vracia index farby v palete obrázka, ktorá je <strong>na</strong>jpodobnejšia zadanej hodnoteRGB. Podobnos medzi poadovanou farbou a kadou farbou v palete sa vypoèíta tak,ako keby jednotlivé farebné zloky RGB boli bodmi v trojrozmernom priestore. FunkciaImageColorClosest() preh¾adáva farby, ktoré v danom obrázku boli definované. Ak vobrázku ešte neboli alokované nijaké farby, vráti táto funkcia hodnotu −1.ImageColorExact vracia index zadanej farby, urèenej hodnotami RGB v palete obrázka. Aktakáto farba v palete neexistuje, je vrátená hodnota rovná −1.Zdrojový kód hovorí, e obrázok môe obsahova èervenú farbu. Ak áno, ušetrímejednu pozíciu v tabu¾ke farieb. Funkciou ImageColorExact sme sa ju pokúsili nájs priamo.Prvá podmienka zahàòa monos, e èervená v obrázku nie je. Vtedy ju môeme alokovafunkciou ImageColorAllocate. Ak nám došli farby, nájdeme si <strong>na</strong>jblišiu susednú farbu.Nakoniec vykreslíme èiaru z ¾avého horného rohu do pravého dolného. Daný obraz „vytla−èíme“ <strong>na</strong> monitor a uvo¾níme pamä.ImageColorResolve je podobná funkcia ako predchádzajúca. Umoòuje nám vyhnúsa nieko¾kým z uvedených krokov.Int ImageColorResolve(int obrazok, int cerve<strong>na</strong>, int zele<strong>na</strong>, int modra);Táto funkcia preh¾adá farby definované v danom obrázku a vráti index prvej farby shodnotami RGB zodpovedajúcimi poiadavke. Ak iad<strong>na</strong> farba nespåòa zadané kritériá,funkcia sa pokúsi alokova presnú farbu. Nikde však nie je <strong>na</strong>písané, e v tabu¾ke fariebbude vo¾né miesto. Vtedy funkcia ImageColorResolve vráti <strong>na</strong>jblišiu farbu. Tým je zabez−peèený typ vrátenej hodnoty, ktorý je vdy indexom farby. Predchádzajúci príklad v pre−písanej podobe s pomocou funkcie ImageColorResolve() bude vyzera takto:ImageColorSet pouijeme vtedy, ak chceme <strong>na</strong>hradi jednu farbu v celom obrázku inou.Bool ImageColorSet(int obrazok, int index, int cerve<strong>na</strong>, int zele<strong>na</strong>, int modra);Táto funkcia <strong>na</strong>stavuje zadaný index v palete <strong>na</strong> urèenú farbu. Je uitoèná pri vytváraníefektov podobných tým z ma¾ovania ☺. Výhodou je, e sa hodnota daného indexu <strong>na</strong>stavuje<strong>na</strong> farbu, ktorou má by výplò zobrazená. Tento proces nie je a taký nároèný ako vyplòovadaný objekt po pixloch. Ak takáto farba v palete neexistuje, bude vrátená hodnota −1.ImageColorsForIndex. Urèite ste si všimli, e spomí<strong>na</strong>né funkcie vracajú jediné celéèíslo, a nie tri hodnoty RGB. Hodnota vrátená týmito funkciami je farba v palete obrázka,take potrebujeme funkciu, ktorá zistí, o akú farbu <strong>sk</strong>utoène ide.Array ImageColorsForIndex(int obrazok, int index);Funkcia vráti asociatívne pole s k¾úèmi èervenej, zelenej a modrej zloky, samozrejme,v tvare RGB. Niekedy sa nám môe prida funkcia urèená <strong>na</strong> zistenie poètu farieb v pale−te zadaného obrázka ImageColorTotal(int obrazok).PREKLADANIE A PRÁCA S JEDNOTLIVÝMI PIXLAMI. Aj keï sa vám monozdá, e u sme vyèerpali všetky monosti práce s obrázkami, musím vás uisti, e to takani zïaleka nie je. Monosti, ktoré nám kninica GD v spojení s PHP dáva, vidíme aj v ïal−šej èasti. Môeme pracova s obrázkami <strong>na</strong> úrovni jednotlivých pixlov.ImageSetPixel nám umoòuje <strong>na</strong>stavi farbu ¾ubovo¾ného <strong>na</strong>mi zadaného pixla v ob−rázku. Funkcia kreslí pixel <strong>na</strong> x a y. V obrázku obrazok farbou farba.
P R O G R A M U J E M EImagePng($obrazok);ImageDestroy($obrazok);?>ImageInterlace urèuje spôsob uloenia obrázka, èo následne ovplyvòuje vizuálny efektpri <strong>na</strong>hrávaní obrázka do prehliadaèa. Funkcia ImageInterlace sa pouíva <strong>na</strong> urèenie, èi sadaný obrázok má uloi lineárne (riadky sa budú objavova od prvého do posledného)alebo prekladane (obrázok bude zaostrova viacerými prechodmi).Int ImageInterlace(int obrazok, int [prekladanie]);Funkciou ImageInterlace sa prekladanie zapí<strong>na</strong> alebo vypí<strong>na</strong>. Ak je parameter prekla−danie <strong>na</strong>stavený <strong>na</strong> 1, vykres¾ovaný obrázok bude prekladaný. Ak parameter prekladanieje <strong>na</strong>stavený <strong>na</strong> 0, prekladanie bude vypnuté.POSTSCRIPT. Postscript je riadiaci jazyk tlaèiarní, ktorý opisuje vzh¾ad textu a grafiky<strong>na</strong> tlaèenej èi zobrazovanej stránke.ImagePSLoadFont. Ak chceme poui ¾ubovo¾né post<strong>sk</strong>riptové písmo, musíme ho <strong>na</strong>j−prv <strong>na</strong>hra pomocou tejto funkcie.Int ImagePSLoadFont(string <strong>na</strong>zov_suboru);Ak je volanie tejto funkcie úspešné, vráti sa platný index písma, ktorý mono poui vïalších funkciách preberajúcich argument indexu písma. V opaènom prípade funkcia vrátihodnotu false a vytlaèí chybové hlásenie opisujúce problém.ImagePSFreeFont ruší <strong>na</strong>hrané písmo.Void ImagePSFreeFont(Int index_pisma);Funkcia uvo¾ní <strong>sk</strong>ôr <strong>na</strong>hrané písmo z pamäte. Parameter index_pisma sa vracia akovýsledok predchádzajúceho volania funkcie ImagePSLoadFont().ImagePSEncodeFont. Post<strong>sk</strong>riptové písma môu obsahova viac ne 256 z<strong>na</strong>kov, nodostupných ich môe by v <strong>sk</strong>utoènosti iba 256. Aktuálne dostupné z<strong>na</strong>ky sa oz<strong>na</strong>èujú zavektor písma. Na <strong>na</strong>stavenie tohto vektora sa pouíva funkcia ImagePSEncodeFont().Int ImagePSEncodeFont(string kodovaci_subor);Funkcia <strong>na</strong>hrá vektor kódovania z<strong>na</strong>kov zo súboru a <strong>na</strong>staví <strong>na</strong> nich kódovací vektorpísma. Uitoèný opis súborov kódovania je v príslušnej dokumentácii dostupný aj <strong>na</strong> in−ternete. Kódovanie mono zmeni aj pomocou direktívy ps.defaault_encoding v konfigu−raènom súbore php.ini.ImagePSText sa pouíva <strong>na</strong> vykreslenie textu v post<strong>sk</strong>riptovom písme <strong>na</strong> obrázok.Array ImagePSText(int obrazok, string text, int pismo, int velkost, int popredie, int pozadie,int x, int, y, int [medzera], int [prekladanie], float [uhol], int [vyhladenie]);Táto funkcia kreslí textový reazec pod¾a zvoleného post<strong>sk</strong>riptového písma. Argumentvelkost je zadaný v pixloch. Popredie je farba, ktorou sa má text <strong>na</strong>kresli, a pozadie jefarba, <strong>na</strong> ktorú sa text pri vyhladzovaní pokúša prejs. Súradnice definujú pôvod, aleboak chcete, referenèný bod prvého z<strong>na</strong>ku (¾avý spodný roh z<strong>na</strong>ku). Pozor <strong>na</strong> malièkú zme−nu, pretoe pri pouití funkcie ImageString sa súradnicami x a y myslí pravý horný rohprvého z<strong>na</strong>ku. Parameter medzera nám umoòuje zmeni ve¾kos z<strong>na</strong>ku medzery. Tátohodnota sa pridá k normálnej hodnote a môe by tak kladná, ako aj záporná. Takistomono meni medzery medzi z<strong>na</strong>kmi pomocou parametra prekladanie. Ten nám dovo¾ujeriadi mnostvo prázdneho priestoru medzi z<strong>na</strong>kmi (zadaná hodnota sa pripoèíta k nor−málnej šírke z<strong>na</strong>ku, prièom môe by tak kladná, ako aj záporná). Tieto parametre sazadávajú v jednotkách z<strong>na</strong>kových medzier, kde 1 jednotka zodpovedá 1/1000 šírky pís−me<strong>na</strong> „m“; uhol zadáva uhol, pod akým sa zadaný text vytlaèí, a urèuje sa v stupòoch.Posledným parametrom tejto funkcie je vyhladenie. To nám dovo¾uje riadi poèet fariebpouívaných <strong>na</strong> vyhladenie písma. Moné hodnoty sú 4 a 16. Vyššia hodnota sa odpo−rúèa pre ve¾kos textu 20 a menej, kde je vplyv tohto efektu <strong>na</strong> kvalitu textu ve¾mi vidi−te¾ný. Pri vyšších ve¾kostiach je lepšie poui hodnotu vyhladenia 4, pretoe je menej ná−roèná <strong>na</strong> prostriedky.ImagePSBBox sa podobá funkcii ImageTTFBBox().Array ImagePSBBox(string text, int pismo, int velkost, int medzera, int prekladanie, floatuhol);Funkcia vracia súradnice ohranièujúceho rámca post<strong>sk</strong>riptového textu. Parametrevelkost, medzera a uhol zodpovedajú tým vo funkcii ImagePSText(). Súradnice vrátenétouto funkciou sa môu nepatrne odlišova od <strong>sk</strong>utoèných výsledkov po <strong>na</strong>kreslenítextu.V predošlej a v tejto èasti sme sa blišie pozreli <strong>na</strong> problematiku dy<strong>na</strong>mického vytvá−rania a úprav obrázkov <strong>na</strong> strane servera za pomoci PHP a kninice GD. Tým sme gene−rovanie obrázkov a prácu s nimi ukonèili. Dúfam, e vám to mnohé u¾ahèí. Nabudúce sabudeme venova konektivite PHP v rôznych smeroch. U teraz sa teším <strong>na</strong> ïalšie stretnu−tie s vami.Jozef KOZÁK ml.Ako <strong>na</strong> Visual Basic .NET II6. èasV novembrovom vydaní nášho seriálu spoloène pre<strong>sk</strong>úmame dva zaujímavé programá−tor<strong>sk</strong>é experimenty: Prvý z nich je venovaný charakteristike softvérovej sluby GarbageCollection, ktorá je realizátorom automatickej správy pamäte v riadenom prostredí plat−formy .NET Framework. V druhom experimente si zasa „posvietime“ <strong>na</strong> rotáciu rastrovýchobrázkov prostredníctvom aplikaèného programového rozhrania GDI+.Experiment è. 10: Charakteristika èinnosti automatickej správy pamäteprostredníctvom softvérovej sluby Garbage CollectionVedomostná nároènos:Èasová nároènos:Urèené pre profesionálovExperiment je stredne èasovo nároènýJednou z noviniek, ktorú priniesla platforma .NET Framework, je softvérová sluba spo−loèného behového prostredia s názvom Garbage Collection (GC), ktorá sa stará o auto−matickú správu rezervovaného úseku operaènej pamäte poèítaèa, ktorý je známy ako ria−dená hromada. Automatická správa pamäte sa teda týka len riadenej hromady a objek−tov, ktoré sú <strong>na</strong> nej alokované. (Predmetom èinnosti sluby GC preto nie je zásobník prog−ramového vlák<strong>na</strong>, keïe táto dátová štruktúra pracuje samostatne a automaticky <strong>na</strong> prin−cípe LIFO. Nie je preto potrebná iad<strong>na</strong> jej ïalšia regulácia.) Riadená hromada predstavu−je sústavu troch generácií riadených objektov. Ide o generácie 0, 1 a 2. Nultá generácia jevyhradená pre novovytvorené objekty a pre tie objekty, pri ktorých sa predpokladá krát−ky ivotný cyklus. Kadý nový objekt, ktorý je vytvorený z prostredia ¾ubovo¾ného progra−movacieho jazyka kompatibilného s .NET, je alokovaný v generácii 0 riadenej hromady.Generácia 1 riadenej hromady slúi <strong>na</strong> u<strong>sk</strong>ladnenie objektov so strednodobým ivotnýmcyklom, zatia¾ èo posledná generácia (2) je urèená pre objekty, ktoré „ijú“ <strong>na</strong>jdlhšie,prièom ivotný cyklus tejto kategórie objektov sa môe kry so ivotným cyklom aplikácie.NET. Pre kadú generáciu riadenej hromady je vyhradený priestor, do ktorého monouklada vytvorené riadené objekty. Grafickú ilustráciu jednotlivých generácií riadenej hro−mady môete vidie <strong>na</strong> obr. 1. V tomto prípade sa v generácii 0 <strong>na</strong>chádzajú dva objekty,v generácii 1 jeden objekt a v generácii 2 tri objekty.Ak je kapacita rezervovaného priestoru generácie 0 vyèerpaná a <strong>na</strong>priek tomu príde odaplikácie poiadavka <strong>na</strong> alokáciu ïalšieho priestoru pre nový objekt, správca automatickejsprávy pamäte (Garbage Collector) aktivuje softvérovú slubu Garbage Collection. GC pre−h¾adá prvú generáciu (0) a zistí, èi sa v tejto generácii <strong>na</strong>chádzajú nedosiahnute¾né objekty.Rozhodovanie o tom, èi je príslušný objekt dosiahnute¾ný, alebo nie, realizuje GC pomocoutzv. stromu referencií. Strom referencií predstavuje hierarchicky usporiadanú dátovú štruktú−ru odkazov, ktoré sú uloené v referenèných premenných a ktoré smerujú <strong>na</strong> istý objekt, prí−padne objekty. GC pravidelne aktualizuje strom referencií, a preto vdy mono urèi, èi jeobjekt pouívaný, alebo nie. Ak <strong>na</strong> objekt nie sú <strong>na</strong>smerované nijaké referencie, GC ho oz<strong>na</strong>èíza nedosiahnute¾ný z programového kódu. Objekt, ktorý je oz<strong>na</strong>èený ako nedosiahnute¾ný,môe by z riadenej hromady uvo¾nený, pretoe neexistuje podstatný dôvod, aby i <strong>na</strong>ïalejalokoval cenný pamäový priestor. Výsledkom èinnosti sluby Garbage Collection je zoz<strong>na</strong>mobjektov generácie 0 riadenej hromady, ktoré mono zlikvidova. Po vytvorení zoz<strong>na</strong>mudochádza k ïalšej fáze, ktorou je zber nepotrebných objektov a ich deštrukcia. Keïe GC rea−lizuje nedeterministickú fi<strong>na</strong>lizáciu, budú deštruktory objektov, resp. príslušné fi<strong>na</strong>lizaènémetódy aktivované v nešpecifikovanom okamihu pred likvidáciou objektov.V závislosti od pozície nepotrebných objektov v nultej generácii riadenej hromadybude táto èas pamäte po ich odstránení viac alebo menej fragmentovaná. Jednoduchopovedané, po zlikvidovaných objektoch ostanú prázdne miesta, ktoré však treba v záuj−me èo <strong>na</strong>jrýchlejšej práce algoritmu GC odstráni. GC preto zaèí<strong>na</strong> s „defragmentáciou“generácie 0. Tento proces spoèíva v presune aktuálne existujúcich objektov (teda tých,166 PC REVUE 11/2004