Hollywood #1

Tagać, tagać…

 

Po przy­by­ciu na party-plejs wyge­ne­ro­wa­li­śmy kilka frak­tali na traw­niku, sko­pa­li­śmy śmiet­nik i naubli­ża­li­śmy sta­ruszce…
Uh-oh, to nie ten rok, nie to miej­sce i nie ten arty­kuł, ale jak już zaczą­łem i naj­wy­raź­niej ktoś to czyta, to zabiorę was na wybo­istą jazdę Knie­jami Ostro­krzewu, z angiel­ska zwa­nego Hol­ly­wo­odem.

Od razu zazna­czam, że jeśli ktoś ocze­kuje ful­pro­fe­ski-super-hiper tuto­riala to może prze­stać czy­tać w tym miej­scu i udać się pod ten adres: forums.hollywood-mal.com, tam znaj­dzie (albo i nie) coś odpo­wied­niego dla sie­bie.

A wra­ca­jąc na party-plejs… hmm i znowu. Zacznijmy jesz­cze raz.
A wra­ca­jąc do rze­czy istot­nych, będzie to bar­dziej opis moich doświad­czeń pod­czas prób naucze­nia się tego języka pro­gra­mo­wa­nia, niż tuto­rial. Taki tek­stowy odpo­wied­nik fil­mów na jutju­bie, które ludziki nagry­wają pod­czas swo­ich pierw­szych, a cza­sami ostat­nich razów, na przy­kład z roz­bra­ja­nia nie­wy­bu­chów czy dener­wo­wa­nia swo­ich żon (nie wiem co gor­sze).

Ostrze­gam i zastrze­gam, że nie mam żad­nego planu, będzie to pełen spon­tan, z tego powodu nawet ja nie wiem o czym, kiedy i czy w ogóle będzie następna część. Wie­cie jak to jest – obie­canki cacanki a cze­ka­ją­cemu smu­tek.
Dla rów­no­wagi, jeżeli już coś napi­szę będę się sta­rał z całych sił żeby było jasno, czy­tel­nie, zro­zu­miale i żeby można coś z nabytą w znoju wie­dzą zro­bić. Czyli taki prak­tyczny porad­nik raczej niż sucha wie­dza, z którą nie bar­dzo wia­domo co zro­bić – takie zresztą mam odczu­cie pod­czas czy­ta­nia manu­ala do Hol­ly­wood. Nie zro­zum­cie mnie źle, manual jest wpo­rzo, acz­kol­wiek pisany przez autora i cza­sami rze­czy dla niego oczy­wi­ste, które w nim pomija, dla mnie – nie­pro­gra­mi­sty – są nie­złą zagwozdką.
Z rze­czy orga­ni­za­cyj­nych muszę jesz­cze dodać, że prze­pro­wa­dze­nie kom­po­tów było… Do stu zie­lo­nych Super­fro­gów! Co się ze mną dzieje?! …Muszę jesz­cze dodać, że będę się sta­rał pisać tak żeby każdy użyt­kow­nik ami­go­wego en-gje, bez względu na smak/obóz (jak zwał tak zwał), mógł bez jakich­kol­wiek prze­ró­bek, ścią­ga­nia czcio­nek itp. uruchomić/skompilować taki skrypt u sie­bie.

Prze­cho­dząc do rze­czy napi­szę szybko o pod­sta­wach, zna­jo­mość któ­rych uła­twi nam naukę Hol­ly­wood.

Kod źró­dłowy to nic innego jak zwy­kły plik tek­stowy naj­le­piej w UTF-8, pisane w jakim­kol­wiek nada­ją­cym się edy­to­rze tek­stu.
Nie­stety GUI Hol­ly­wo­odowe na Ami­dze nie posiada, tak jak wer­sja (tfu) pece­towa, wbu­do­wa­nego edy­tora z pod­świe­tla­niem składni. Można sobie pora­dzić zaku­pu­jąc Cubi­cIDE albo zasy­sa­jąc odpo­wiedni plik z sieci dla edy­tora Anno­tate.
Póki co nasz kod (ależ to brzmi ; )) będzie tak mało skom­pli­ko­wany, że będę uży­wał sys­te­mo­wego Note­Pada.

To jedziemy z tym kok­sem.
Pliki Hol­ly­wo­odowe mają cztery roz­sze­rze­nia:
.hws – pliki źródłowe/skrypty
.hwa – applety
.hwd – pliki two­rzone przez Desi­gnera
.hwp – pliki wtyczek/pluginów

Oczy­wi­ście są jesz­cze pliki wyko­ny­walne ale one nie mają żad­nego kon­kret­nego roz­sze­rze­nia, zależy ono od sys­temu dla jakiego został skom­pi­lo­wany nasz pro­gram.

Uru­cho­mie­nie naszego skryptu moż­liwe jest na co naj­mniej dwa spo­soby: poprzez przy­cisk „Display” w GUI, albo poprzez dwu­klik na plik źró­dłowy.
W dru­gim przy­padku trzeba zmie­nić „Domyślne narzędzie/Default tool” w ikonce pliku ze skryp­tem z „SYS:Utilities/MultiView” na „Hol­ly­wood”.

Mi naj­bar­dziej odpo­wiada ostat­nia moż­li­wość, ale wy zro­bi­cie jak wam będzie naj­wy­god­niej. Kom­pi­la­cji nato­miast możemy doko­nać poprzez klik w „Com­pile” w GUI Hol­ly­wo­oda albo z linii pole­ceń.
Nie będę opi­sy­wał opcji dostęp­nych dla kom­pi­la­cji bo dostępne są w sieci pod adre­sem: http://www.hollywood-mal.com/docs/html/hollywood/ManualUsage.html.
Dodam tylko, że wszyst­kie te argu­menty można zasto­so­wać do już skom­pi­lo­wa­nego pro­gramu poprzez doda­nie odpo­wied­nich tooltype’ów do ikony naszego pro­gramu albo przez doda­nie ich w wier­szu pole­ceń pod­czas uru­cha­mia­nia z shella.

Odno­śnie opcji kom­pi­lo­wa­nia z wier­sza pole­ceń napi­szę tylko, że główny program/interpreter Hol­ly­wood to nic wię­cej jak komenda, któ­rych wiele w sys­te­mo­wym kata­logu C:.
Nad­mie­nię tym co nie czy­tają manu­ali, że bez­względ­nie nie można tym pli­kiem dzie­lić się z nikim, to jest serce Hol­ly­wood chro­nione pra­wami autor­skimi.

Dobra, dość kwasu, czas zacząć kodo­wa­nie.

Two­rzymy plik tek­stowy.
Ja nazwa­łem swój czcionki.hws, wywa­li­łem na blat WB i zmie­ni­łem tool­type na Hol­ly­wood, dla szyb­ko­ści i wygody dostępu:


Nie­stety muszę jesz­cze posmę­cić, bo jest kilka rze­czy o któ­rych musimy wie­dzieć pisząc skrypty dla Hol­ly­wood.

Na początku każ­dego skryptu musi znaj­do­wać się komenda pre­pro­ce­sora @VERSION.
Mówi ona inter­pre­te­rowi jaka wer­sja Hol­ly­wood jest konieczna do skom­pi­lo­wa­nia naszego skryptu. Bie­rze się to stąd, że różne moż­li­wo­ści doda­wane były w róż­nych wer­sjach Hol­ly­wood i na nas spada odpo­wie­dzial­ność aby dokład­nie czy­tać doku­men­ta­cję i umie­ścić tam odpo­wiedni nume­rek.

Każda opi­sy­wana funk­cja ma podaną wer­sję wyma­ga­nego Hol­ly­wood, a nawet poszcze­gólne argu­menty prze­ka­zy­wane do funk­cji poja­wiają się w róż­nych wer­sjach Hol­ly­wood.
Dla przy­kładu funk­cja Font wymaga wer­sji 4.5:


Gwoli jasno­ści, ta komenda nie musi być w pierw­szym wier­szu pliku ze skryp­tem, bo tam może być komen­tarz który chcie­li­śmy umie­ścić dla naszej lub innych wygody. Ale musi znaj­do­wać się na pierw­szej inter­pre­to­wa­nej linii skryptu. Mam nadzieję że czu­je­cie róż­nicę.

Póki co bied­nie, ale nasz plik wygląda tak jak na zrzu­cie:

Komen­ta­rze

Przy tej oka­zji muszę napi­sać kilka słów o następ­nym ele­men­cie poja­wia­ją­cym się w naszym kodzie, a mowa tu o komen­ta­rzach. Jak widzi­cie po śred­niku jest wpis:
– poda­łem wer­sję 1,0 bo nie ma tu nic co wyma­ga­łoby wyż­szej.

W Hol­ly­wood wystę­pują dwa rodzaje komen­ta­rzy, wielo i jedno liniowe.
Jed­no­li­niowy komen­tarz nastę­puje po śred­niku „;” i może zająć prze­strzeń tylko do końca linii, taki komen­tarz może znaj­do­wać się na samym początku linii albo tak jak w naszym przy­kła­dzie znaj­do­wać się po funk­cji i jej argu­men­tach.

Dru­gim rodza­jem komen­ta­rzy jest ten wie­lo­li­niowy i zaczyna się od sekwen­cji zna­ków „/*” a koń­czy się na „*/”. Wszystko pomię­dzy nimi będzie igno­ro­wane przez Hol­ly­wood, więc możemy tam wpi­sać co nam się żyw­nie podoba, ale naj­le­piej coś co pomoże nam odna­leźć się w naszym kodzie. Ilość linii nie jest ogra­ni­czona i może zająć jeden albo nie­skoń­cze­nie wiele wier­szy.

@DISPLAY [id,] table

Jak już prze­brnę­li­śmy przez abso­lutną pod­stawę, to musimy teraz okre­ślić wiel­kość i rodzaj okna w jakim będzie wyświe­tlany nasz pro­gram:


Służy do tego kolejna funk­cja pre­pro­ce­sora @DISPLAY. Jesz­cze jedna kwe­stia, autor Hol­ly­wood zaleca aby komendy pre­pro­ce­sora zapi­sy­wać dużymi lite­rami. Wszyst­kie funk­cje pre­pro­ce­sora zaczy­nają się małpą „@”.

Komenda @DISPLAY służy do okre­śle­nia rodzaju, roz­miaru, tła i chyba z setki innych opcji dla naszego okna albo ekranu naszego pro­gramu.
Po cały opis wysy­łam pod: http://www.hollywood-mal.com/docs/html/hollywood/atDISPLAY.html.

Ta komenda jest dobrym przy­kła­dem poka­zu­ją­cym jak poszcze­gólne argu­menty poja­wiały się w róż­nych wer­sjach Hol­ly­wood.
Nasze okienko będzie miało sze­ro­kość 800 i wyso­kość 600 pik­seli i nie będzie miało ramki. Dodajmy teraz jakąś czcionkę, którą będziemy mogli pisać w naszym okienku.
Na samym początku zwróć­cie uwagę, że zmie­nił się numer wer­sji wyma­ga­nego Hol­ly­wood, powo­dem jest uży­cie „Engine=#FONTENGINE_INBUILT” który to argu­ment poja­wił się w Hol­ly­wood 4.7.

@FONT id, font­name$, size[, table]

Teraz roz­pra­cujmy ten roz­kaz:


Komenda ta ładuje nam font o poda­nej nazwie i roz­mia­rze i przy­pi­suje mu iden­ty­fi­ka­tor. W naszym wypadku są dwie takie komendy. Pierw­sza przy­pi­suje iden­ty­fi­ka­to­rowi „1” czcionkę Arial o wiel­ko­ści 50 pik­seli, druga zaś iden­ty­fi­ka­to­rowi „2” tę samą czcionkę ale o wiel­ko­ści 20 pik­seli.
W obu przy­pad­kach na końcu wystę­puje w nawia­sie klam­ro­wym atry­but funk­cji:
„Engine=#FONTENGINE_INBUILT
Powo­duje on że wyko­rzy­sty­wany jest wbu­do­wany w Hol­ly­wood spo­sób wyświe­tla­nia czcio­nek, co gwa­ran­tuje że tekst będzie wyglą­dał tak samo na każ­dym sys­te­mie dla jakiego skom­pi­lu­jemy nasz pro­gram.
Ta komenda ma tę wła­ści­wość, że auto­ma­tycz­nie dołą­cza czcionki do naszego pro­gramu. Daje nam to pew­ność, że nie zabrak­nie czcionki wyko­rzy­sta­nej w naszym pro­gra­mie. Z dru­giej strony musimy uwa­żać jakie czcionki uży­wamy i jakim pra­wom autor­skim pod­le­gają. Ponad to ma to tę zaletę że czcionki są dostępne od samego początku wyko­ny­wa­nia się pro­gramu, nie trzeba ich „łado­wać”.

W Hol­ly­wood poza uży­wa­niem czcio­nek bit­ma­po­wych i tru­taj­pów zassa­nych z sieci mamy jesz­cze jedną moż­li­wość, a mia­no­wi­cie możemy użyć czcionki wbu­do­wa­nej. Ma to tę zaletę, że nie musimy lin­ko­wać pli­ków z czcion­kami, ani łado­wać ich z dysku użyt­kow­nika, ta czcionka jest wszę­dzie i zawsze dostępna. Dodat­ko­wym atu­tem jest gwa­ran­cja tego samego wyglądu na wszel­kich sys­te­mach pod jakimi może dzia­łać nasz pro­gram.
Ogra­ni­cze­niem nato­miast jest to, że mamy tylko po jed­nym kroju czcio­nek bit­ma­po­wych i tru­etaj­pów do wyboru i żad­nych zna­ków naro­do­wych, czyli możemy póki co zapo­mnieć o „ę”, „ó” i tak dalej. Może się to kie­dyś zmieni.
Jeżeli wspo­mniane ogra­ni­cze­nia nie będą mieć wpływu na nasz pro­gram, to myślę, że jest to cał­kiem dobry wybór. Bo bar­dzo łatwy w uży­ciu i nie nastrę­cza kło­po­tów z łado­wa­niem pli­ków z dysku (co może być dość błę­do­genne w przy­padku kom­pi­lo­wa­nia pod wiele sys­te­mów, ale o tym napi­szę nieco póź­niej), ani zmar­twień o licen­cje w przy­padku ich lin­ko­wa­nia.

Żeby zade­kla­ro­wać chęć uży­cia wbu­do­wa­nej w Hol­ly­wood czcionki zamiast nazwy kroju uży­wamy znacz­nika „#” plus nazwa z dużej litery.
Mamy do wyboru pięć, a wła­ści­wie póki co cztery rodzaje czcio­nek:
#SANS – otwiera wbu­do­waną czcionkę tru­type bez­sze­ry­fową
#SERIF – otwiera wbu­do­waną czcionkę tru­type z sze­ry­fami
#MONOSPACE – otwiera wbu­do­waną czcionkę tru­type o sta­łej sze­ro­ko­ści znaku
#TRUETYPE_DEFAULT – póki co daje taki sam wynik jak uży­cie #SANS (stąd cztery a nie pięć rodza­jów)
#BITMAP_DEFAULT – otwiera wbu­do­waną czcionkę bit­ma­pową o roz­mia­rze 8 pik­seli, i w żaden spo­sób na razie nie możemy tego zmie­nić.

Zmieńmy teraz czcionkę Arial 20 pik­seli na wbu­do­waną w pro­gram. Dodat­kowo żeby spraw­dzić jak wygląda czcionka bit­ma­powa dodamy sobie jeden wiersz z pole­ce­niem jej zała­do­wa­nia. I tak nasza źró­dłówka wygląda tak jak na zrzu­cie:


Jak widzi­cie uży­cie jest bar­dzo pro­ste, z jedną uwagą. Nawet jeśli mamy do wyboru tylko czcionkę bit­ma­pową o roz­mia­rze 8 pik­seli, to i tak musimy podać roz­miar funk­cji @FONT, bo przy kom­pi­la­cji wysko­czy nam błąd. Poza tym w przy­padku czcionki wbu­do­wa­nej nie musimy poda­wać atry­butu „Engine=#FONTENGINE_INBUILT” bo jest on wybie­rany auto­ma­tycz­nie.

Open­Font (id, font­name$, size[, table])

Żeby umoż­li­wić uży­cie jakie­goś kroju czcio­nek w naszym pro­gra­mie poza funk­cją pre­pro­ce­sora @FONT, możemy użyć funk­cji Open­Font.
Jedyna róż­nica po mię­dzy tymi roz­ka­zami jest taka, że czcionki zała­do­wane przez Open­Font są dostępne od miej­sca uży­cia tej funk­cji.
Czyli czcionki nie będą dostępne od samego początku dzia­ła­nia pro­gramu, a dopiero gdy nastąpi wyko­na­nie roz­kazu Open­Font.
Ponadto, jak wspo­mnia­łem wyżej. funk­cja „@FONT” dołącza/linkuje czcionki do pliku wyko­ny­wal­nego naszego pro­gramu. To zacho­wa­nie można zmie­nić ale musimy o tym pamię­tać, bo zmie­nia to wiel­kość pliku wyko­ny­wal­nego, szcze­gól­nie w wypadku dołą­cze­nia wielu kro­jów, i nakłada na nas odpo­wie­dzial­ność sto­so­wa­nia się do licen­cji.
Oczy­wi­ście zdaję sobie sprawę że two­rząc nasze pro­gra­miki nikt takimi bzdu­rami jak prawa autor­skie
nie będzie się przej­mo­wał, ale mając przed oczami świe­tlaną przy­szłość naszych zaawan­so­wa­nych wie­lo­plat­for­mo­wych two­rów, muszę o tym wspo­mnieć żeby uchro­nić nas przed hordą wygłod­nia­łych praw­ni­ków w chwili gdy nasz soft odnie­sie komer­cyjny suk­ces ; ).

Jak dotąd udało nam się otwo­rzyć okno naszego pro­gramu i udo­stęp­nić czcionki, które będziemy mogli uży­wać w naszym pro­gra­mie.
Teraz zaj­miemy się funk­cjami które będą przy­pi­sy­wać krój i w zależ­no­ści od potrzeb zmie­niać jego wła­ści­wo­ści:

Use­Font (id)

Roz­kaz ten zmie­nia czcionkę domyślną na tę okre­śloną iden­ty­fi­ka­to­rem w nawia­sach, w naszym przy­kła­dzie jest to 1, czyli Arial o roz­mia­rze 50 pik­seli. Styl czcionki zosta­nie przy­wró­cony do domyśl­nego po uży­ciu tej funk­cji. Na przy­kład jeśli zmie­ni­li­śmy krój naszej czcionki na pogru­bioną kur­sywę to po zasto­so­wa­niu tej funk­cji zosta­nie on zmie­niony na zwy­kły nie­po­gru­biony. Ta funk­cja jest bar­dzo pro­sta ale i ogra­ni­czona, bo narzuca nam krój, roz­miar itd. bez moż­li­wo­ści jakich­kol­wiek zmian w jej obrę­bie. Czyli w naszym przy­kła­dzie jeśli uży­jemy UseFont(1) to nasz tekst będzie pisany Aria­lem o wyso­ko­ści 50 pik­seli i bez uży­cia innych roz­ka­zów w żaden spo­sób tego nie zmie­nimy.

Set­Font (font$, size[, table])

Aby móc zmie­nić różne rodzaje czcionki, czy ją samą na inną, uży­jemy roz­kazu Set­Font. Atry­but font$ okre­śla czcionkę jaką chcemy użyć, tu muszę wró­cić do „błę­do­gen­no­ści” wspo­mnia­nej przy opi­sy­wa­niu komendy @FONT. Aby móc zała­do­wać kon­kretny krój czcionki z dysku trzeba trzy­mać się pew­nych reguł narzu­co­nych przez Hol­ly­wood. Poda­jąc nazwę czcionki wpi­su­jemy jej nazwę, a nie ścieżkę dostępu (choć jest wyją­tek od tej reguły). Nazwa musi być iden­tyczna z nazwą pliku na dysku bez roz­sze­rze­nia. I tak jeżeli chcemy użyć czcionki Arial bold ita­lic, to jako atry­but musimy wpi­sać „Arial Bold Ita­lic”, zwróć­cie uwagę że nazwa czcionki i jej atry­buty muszą być oddzie­lone spa­cją, a całość zamknięta w cudzy­sło­wie. Wyją­tek sta­nowi przy­pa­dek, kiedy chcemy użyć czcionki wek­to­ro­wej TTF, która znaj­duje się na dysku wraz z wbu­do­wa­nym w Hol­ly­wood spo­so­bem wyświe­tla­nia czcio­nek {ENGINE=#FONTENGINE_INBUILT}, wtedy to możemy podać całą ścieżkę dostępu wraz z nazwą pliku czcionki z roz­sze­rze­niem. To tyczy się jedy­nie czcio­nek TTF.
Dla przy­kładu, możemy wtedy podać jako argu­ment funk­cji SetFont(„SYS:Fonts/_ttf/Arial.TTF”, 30, {Engine=#FONTENGINE_INBUILT} ).
Błę­do­gen­ność wynika stąd, że różne sys­temy insta­lują czcionki pod róż­nymi nazwami. Dla przy­kładu gdy plik czcionki ma nazwę arial­bol­di­ta­lic to jeste­śmy poza­mia­tani, bo nie dosyć że nie ma spa­cji to cechy bold i ita­lic są pisane z małych liter (Wiel­kość liter w nazwach pod nie­któ­rymi sys­te­mami też ma zna­cze­nie).
Wię­cej na temat jak radzić sobie z przy­ja­zną Hol­ly­wo­odowi insta­la­cją i uży­ciem czcio­nek znaj­dzie­cie pod poniż­szymi adre­sami:

http://www.hollywood-mal.com/docs/html/hollywood/PrgG2KFonts.html

http://www.hollywood-mal.com/docs/html/hollywood/FontSpecification.html

Print/NPrint (var, …)

Zasto­su­jemy teraz w naszym pro­gra­mie roz­kaz wyświe­tla­jący tekst na ekra­nie, aby­śmy mogli w końcu zoba­czyć wynik naszej pracy w dzia­ła­niu.
Znacz­nie lepiej się wtedy pra­cuje czy wpro­wa­dza poprawki no i usuwa błędy. Do tego celu uży­jemy funk­cji Print i NPrint. Opi­suję oby­dwie jed­no­cze­śnie bo są pra­wie iden­tyczne. Jedyna róż­nica jest taka, że NPrint dodaje znak końca linii.

Za pomocą tej funk­cji możemy wyświe­tlić zawar­tość atry­butu „var”, cokol­wiek to jest – ciąg zna­ków, liczby, tablice czy war­tość zmien­nych, które to mogą być całymi pli­kami łado­wa­nymi do odczy­ta­nia. Roz­kaz ten zaczyna wyświe­tlać tekst w obec­nym poło­że­niu kur­sora, czyli w naszym wypadku lewy górny róg. Można to zmie­nić ale o tym kiedy indziej. Funk­cja potrafi inter­pre­to­wać kody ucieczki (ang. escape codes), jak i znacz­niki for­ma­tu­jące tekst znane choćby z for inter­ne­to­wych, takie jak
[b][/b], [i][/i], [u][/u], a poza tym:
[shadow=color,size,direction][/shadow] – cień, [edge=color,size][/edge] – obrys kra­wę­dzi,
[color=color][/color] – kolor czcionki.
Trzy pierw­sze nie wyma­gają chyba opisu, a pozo­stałe trzy opi­szę dokład­niej tro­chę póź­niej przy opi­sie następ­nych funk­cji.
Dodajmy do naszego skryptu dwie funk­cje: NPrint(„Cześć”)
Print(„C[edge=#RED,1]z[b]e[/b][/edge][u]ś[/u][color=#GREEN]ć[/color]”)

Pierw­sza linia wypi­suje po pro­stu Cześć i prze­suwa kur­sor do następ­nej linii, za to w dru­giej się dopiero dzieje. „Ce” jest nie zmie­nione, „Zet” ma czer­woną obwódkę o sze­ro­ko­ści jed­nego pik­sela, podob­nie jak „E”, ale jest ono dodat­kowo pogru­bione. To żeby poka­zać, że tagi for­ma­tu­jące można zagnież­dżać. „Ś” jest nato­miast pod­kre­ślone, a „Ć” zie­lone:

Poni­żej nieco powięk­szony zrzut okna, dla lep­szego poka­za­nia fon­tów, taka próbka moż­li­wo­ści. Spró­buj­cie w ramach ćwi­cze­nia dla sie­bie napi­sać samo­dziel­nie odpo­wiedni kod żeby uzy­skać to samo.

 

escape codes

Set­Font, Open­Font, Use­Font i @FONT usta­wiają tylko rodzinę i roz­miar czcionki, żeby zmie­nić kolor i prze­źro­czy­stość, dodać cień czy obrys, albo wygła­dza­nie opi­szę teraz dwa nowe roz­kazy Set­Font­Co­lor i Set­Font­Style. Usta­wiają one styl domyślny dla tek­stu, czyli nie musimy przy każ­dej funk­cji Print czy NPrint wpi­sy­wać oddziel­nie jeśli chcemy żeby nasz tekst był na przy­kład czer­wony z zie­loną obwódką.

Set­Font­Co­lor (color) 

 

Jak nazwa wska­zuje, roz­kaz ten usta­wia kolor czcionki aktu­al­nej na inny niż domyślny (na mar­gi­ne­sie domyślne kolory to biały dla czcionki i czarny dla tła). Aktu­al­nej to zna­czy, wszystko co napi­szemy poprzez N/Print czy inne funk­cje wypro­wa­dza­jące tekst na ekran będzie miało wybrany przez nas kolor. Musimy pamię­tać, że styl czcionki jest rese­to­wany na domyślny po każ­dym uży­ciu funk­cji Set­Font czy Use­Font. Czyli znowu musimy użyć Set­Font­Co­lor czy Set­Font­Style jeśli chcemy zmie­nić wygląd czcionki.
Wybie­ra­jąc kolor w zależ­no­ści od potrzeby mamy do wyboru z i bez prze­źro­czy­sto­ści. War­to­ści możemy poda­wać w for­mie dzie­sięt­nej lub szes­nast­ko­wej. Jeżeli zde­cy­du­jemy się na szes­nast­kową to bez­po­śred­nio przed poda­nymi war­to­ściami wpi­su­jemy znak dolara „$”$RRGGBB, $AARRGGBB, a w przy­padku dru­giego spo­sobu wpi­su­jemy RGB albo ARGBRBG(0, 255, 255), w obu wypad­kach pierw­szy to bez, a drugi to z prze­źro­czy­sto­ścią. Kolory możemy też poda­wać w for­mie „sta­łych wbu­do­wa­nych”, czyli na przy­kład chcemy czer­wony z 50% prze­zro­czy­sto­ści ARGB(128, #RED), to samo osią­gniemy wpi­su­jąc ARGB(128, $FF0000) albo ($80FF0000). Jak widać można łączyć spo­soby wpro­wa­dza­nia war­to­ści, ale są trzy duże ale, po pierw­sze takie mie­szanki mogą spra­wiać kło­pot a po dru­gie funk­cja ta NIE przyj­muje zapisu w pełni dzie­sięt­nego ARGB(128, 255, 0,0) nie wiem czy to błąd czy zamie­rzone zacho­wa­nie. I po trze­cie jeśli w wypadku zapisu szes­nast­ko­wego chcemy użyć ARGB przed nawia­sem to w jego wnę­trzu musimy oddziel­nie podać war­to­ści dla prze­źro­czy­sto­ści i koloru, w taki spo­sób: ARGB($80, $FF0000), czyli war­to­ści muszą być oddzie­lone prze­cin­kiem i każda mieć swo­jego $ – dolara. Poza tym zauważ­cie że sam znacz­nik A/RGB można pomi­nąć jedy­nie w wypadku uży­cia formy w pełni szes­nast­ko­wej, w każ­dym innym wypadku musi się poja­wić przed nawia­sami z poda­nymi war­to­ściami.
Wszyst­kie stałe wbu­do­wane w Hol­ly­wood, bez względu na rodzaj, zawsze zaczy­nają się zna­kiem # i są pisane z dużych liter, na przy­kład #RED, #WHITE, #BLUE. Dzięki temu widząc tak opi­sany ciąg zna­ków w skryp­cie może­cie być pewni, że jest to stała wbu­do­wana.
Oczy­wi­ście jeśli autor skryptu sto­so­wał się do zale­ceń odno­śnie sty­li­za­cji kodu Hol­ly­wood. Sta­łych w wbu­do­wa­nych jest znacz­nie wię­cej, chęt­nych na zapo­zna­nie się z nimi zapra­szam pod adres: http://www.hollywood-mal.com/docs/html/hollywood/. Nie­stety nie są wszyst­kie opi­sane, wiele z nich zależy bowiem od funk­cji przez nas uży­tej, a Andreas Fal­ken­hahn nie jest wsta­nie wszyst­kiego sam ogar­nąć. W jakimś wywia­dzie prze­czy­ta­łem że pisa­nie doku­men­ta­cji zaj­muje mu wię­cej czasu niż sam roz­wój tego języka. Mówi samo za sie­bie.

Set­Font­Style (style, …)

Poza kolo­rem możemy zmie­nić lub dodać naszej czcionce kilka rze­czy. Możemy użyć do tego sta­łych wbu­do­wa­nych takich jak: #NORMAL, #BOLD, #ITALIC, #UNDERLINED. Nie będę opi­sy­wał co jaka stała robi bo pew­nie łatwo się domy­ślić. Odno­śnie tych czte­rech sta­łych sty­li­zu­ją­cych czcionkę jest takie zastrze­że­nie, że każda czcionka TTF zazwy­czaj ma swój wek­to­rowy odpo­wied­nik dla zwy­kłej, pogru­bio­nej itd. I naj­le­piej wybrać go przy wybo­rze czcionki funk­cjami takimi jak Set­Font, Open­Font czy @FONT, raczej niż uży­wać Set­Font­Style do tego celu. Bo algo­rytm wbu­do­wany w Hol­ly­wood nie będzie tak dobry jak zapro­jek­to­wana czcionka.
Poza tymi czte­rema sty­lami, mamy jesz­cze #ANTIALIAS, #EDGE i #SHADOW. Pierw­sza wygła­dza czcionkę, ale jedy­nie czcionki wek­to­rowe – TTF, druga dodaje obwódkę. Podany kolor może być, tak jak w przy­padku koloru dla czcionki, z lub bez prze­źro­czy­sto­ści, zasady okre­śla­nia koloru są takie same (Zresztą nie tylko odno­śnie czcio­nek, wszę­dzie tam gdzie znaj­duje się potrzeba poda­nia koloru sto­su­jemy zasady jak przy Set­Font­Co­lor). #SHADOW nato­miast dodaje cień pod czcionką.

W wypadku #NORMAL, #BOLD, #ITALIC, #UNDERLINED, #ANTIALIAS możemy je ze sobą łączyć w jed­nym wywo­ła­niu funk­cji, na przy­kład SetFontStyle(#BOLD|#UNDERLINED) Nie można tego robić w wypadku #EDGE i #SHADOW.

Styl #EDGE przyj­muje dwa argu­menty kolor i gru­bość obrysu w pik­se­lach, na przy­kład SetFontStyle(#EDGE RGB(255, 0, 0), 1) doda nam czer­wony obrys o gru­bo­ści jed­nego pik­sela. W przy­padku #SHADOW wyma­ga­nych argu­men­tów jest trzy – kolor, odle­głość w pik­se­lach o czcionki rzu­ca­ją­cej cień i kie­ru­nek rzu­ca­nia cie­nia poda­wany tylko i wyłącz­nie za pomocą „kie­run­ko­wych sta­łych wbu­do­wa­nych” (Direc­tio­nal Con­stants). Jest ich osiem i może­cie o nich poczy­tać pod tym lin­kiem:
http://www.hollywood-mal.com/docs/html/hollywood/PrgDirectionCst.html.

Rzućmy tro­chę cie­nia na połu­dniowy wschód, cień zazwy­czaj jest prze­źro­czy­sty, więc i nasz niech będzie: SetFontStyle(#SHADOW ARGB(128, $FFFFFF), 4, #SHDWSOUTHEAST).
Z powodu, że nasze tło jest czarne, nasz cień będzie biały, bo czarny byłby kiep­sko widoczny ; ). Żeby dodać jed­no­cze­śnie cień i obrys do czcionki aktu­al­nej musimy wywo­łać funk­cję Set­Font­Style dwa razy, raz dla każ­dego stylu. A jeśli chcie­li­by­śmy ją dodat­kowo pod­kre­ślić i wygła­dzić to nawet musimy ją wywo­łać trzy­krot­nie. Zobacz­cie sami na kod:

Do wyczer­pa­nia tematu czcio­nek pozo­stało nam do wspo­mnie­nia kilka funk­cji, nie będę się o nich roz­pi­sy­wał, może­cie sami o nich poczy­tać na stro­nie Hol­ly­wo­oda.

GetA­va­ila­ble­Fonts spraw­dza jakie zain­sta­lo­wane są czcionki na kom­pu­te­rze, z któ­rego odpa­lany jest nasz pro­gram i zwraca nam infor­ma­cje w for­mie tabeli zawie­ra­jącą pod­ta­belę z ele­men­tami: NAME, FAMILY, WEIGHT, SLANT, BITMAP, SIZES.

Fre­eGly­ph­Ca­che (mode[, id])
Czy­ści z pamięci pod­ręcz­nej infor­ma­cje o wszyst­kich czcion­kach albo szcze­gól­nej okre­ślo­nej iden­ty­fi­ka­to­rem. Jeśli chcemy wyrzu­cić wszyst­kie czcionki z pamięci możemy pomi­nąć argu­ment ID, a jako mode poda­jemy 0 – zero. FreeGlyphCache(0). A jeśli chcemy wyrzu­cić czcionkę z iden­ty­fi­ka­to­rem 2 i/lub 3, (nie uży­wamy ich w naszym skryp­cie więc pozbądźmy się ich z pamięci) to nasz roz­kaz będzie wyglą­dał nastę­pu­jąco: FreeGlyphCache(1, 2|3). Zwróć­cie uwagę na spo­sób poda­nia iden­ty­fi­ka­to­rów 2 i 3, jak widać można je roz­dzie­lać zna­kiem „|” i poda­wać dowol­nie wiele.

Clo­se­Font
Kom­plet­nie wyrzuca z pamięci jakie­kol­wiek infor­ma­cje o czcionce o poda­nym iden­ty­fi­ka­to­rze.

Add­Font­Path
Za pomocą tej funk­cji, możemy dodać miej­sce w któ­rym Hol­ly­wood będzie szu­kał czcio­nek, poza tymi domyśl­nymi.
Żeby opi­sać wszyst­kie funk­cje wystę­pu­jące w naszym skryp­cie nie mogę pomi­nąć dwóch ostat­nich:

WaitLe­ft­Mo­use()
Funk­cja ta wstrzy­muje wyko­ny­wa­nie skryptu dopóki użyt­kow­nik nie klik­nie lewym przy­ci­skiem myszki. W naszym wypadku potrzebna jest żeby móc cokol­wiek zoba­czyć, gdy­by­śmy jej nie zasto­so­wali to skrypt wyko­nałby się z taką szyb­ko­ścią, że widzie­li­by­śmy jedy­nie błysk.

End()
Roz­kaz ten koń­czy wyko­ny­wa­nie naszego pro­gramu.

Jesz­cze krótko ogól­nie o składni funk­cji. Nawet jeśli nie prze­ka­zu­jemy w nawia­sach żad­nych argu­men­tów, to i tak dla lep­szej czy­tel­no­ści kodu powin­ni­śmy je sto­so­wać.

Uffff, prze­brnę­li­śmy jakoś przez gęste zaro­śla pełne lite­rek i kro­jów, sty­lów i kolo­rów. Myśla­łem już, że to się nigdy nie skoń­czy. Ta część może nie jest zbyt pory­wa­jąca, ale od cze­goś trzeba zacząć, czcionki to dobry start bo w końcu bez nich nic byśmy nie napi­sali. W toku pisa­nia, mimo odgra­ża­nia się na początku arty­kułu, wykieł­ko­wał plan na przy­szłość. Jako że pisa­li­śmy o czcion­kach to w następ­nej czę­ści napi­szemy o kon­troli tek­stu, spo­so­bach wyświe­tla­nia, mani­pu­lo­wa­nia i innych aniach.
A wjeż­dża­jąc na koń­cową sta­cję, wystrze­li­li­śmy z pociągu na peron, bo kon­duk­tor chciał żeby­śmy zabrali ze sobą te sześć­dzie­siąt dzie­więć pustych bute­lek od piwa. Chyba go Bóg opu­ścił jeżeli myślał, że po trzech dniach i dwóch nocach ostrego obco­wa­nia z gawie­dzią sce­nową, będziemy w sta­nie unieść cokol­wiek innego niż nasze na wpół żywe ciała.

 

 

ferin – Amiga NG 1/2017

1 Komentarz

  1. Nie mogłem pojąć czemu pół­prze­zro­czy­stość 50% ma war­tość $80. Zapy­ta­łem autora arty­kułu, i wyja­śnił to tak:
    „To zapis szes­nast­kowy, w tym zapi­sie 80 to nie jest war­tość prze­źro­czy­sto­ści, tylko podaje ile razy trzeba pomno­żyć liczbę szes­na­ście; w tym wypadku 8x16, bo 256 = 16x16 = FF, czyli połowa to 8x16; gdy­byś miał $81 to byłoby 8x16 plus 1 czyli 129.”
    Widocz­nie zapi­su­jąc szes­nast­kowo trzeba prze­ka­zać dwa znaki na jedną war­tość, dla­tego zero to 00.

Dodaj komentarz

Twój adres email nie zostanie opublikowany.


*