Con questo articolo voglio introdurvi ad alcune cose interessanti relative al nuovo formato per le icone utilizzato da Haiku. A prima vista, sembrano soltanto icone vettoriali scalabili, ed Haiku non è l’unico sistema operativo ad averle. Ma la cosa interessante è nei dettagli dell’implementazione (implementazione=applicazione pratica di una metodologia o di un algoritmo) che dovrebbe permettere ad Haiku di avere una posizione di rilievo rispetto agli altri.

La prima caratteristica unica è che Haiku usa uno speciale formato di memorizzazione vettoriale, espressamente disegnato per memorizzare icone; noi lo chiamiamo Haiku Vector Icon Format, o in breve HVIF. Haiku non sta utilizzando il formato SVG. Il supporto per SVG è disponibile tramite la caratteristica, presente nell’editor di icone “Icon-O-Matic”, di poter importare ed esportare SVG. HVIF risparmia così tanto spazio, che le icone sono in genere sempre più piccole delle icone bitmap di BeOS, che utilizzano 1280 bytes. In media le icone vettoriali di Haiku usano circa 500-700 bytes, con alcune icone che superano di poco i 1000 bytes e altre sotto i 250 bytes. Ciò significa che un’icona memorizzata come attributo di un file si adatta in quella che viene chiamata small data region, che risiede all’interno dell’inode del file. Quando il tracker legge le informazioni di un file per visualizzarlo (il suo nome, dimensione, data e anche l’icona) tutto viene letto in una sola disk operation, durante l’analisi dell’inode del file. E’ ovvio che ciò è un grosso beneficio per la velocità, visto che l’hard disk rimane uno dei componenti più lenti di un computer. L’unico salto di prestazioni è nel rendering delle icone, che è molto veloce in confronto alle operazioni sui dischi. Se Haiku dovesse usare le icone SVG, avremmo bisogno almeno di una ricerca supplementare dopo aver preso l’inode (poiché l’icona è troppo grande per starci dentro), e ciò avrebbe un notevole impatto sulle prestazioni. Per mettere in prospettiva il formato delle icone di Haiku, le icone di Windows Vista possono usare circa 80KB, poiché utilizzano immagini PNG per memorizzare le icone alle diverse dimensioni. Le icone SVG in Zeta vengono memorizzate compresse e utilizzano 2-10 KB.
Un’altra caratteristica unica delle nuove icone è che il rendering è effettuato in un singolo passaggio, toccando ogni pixel solo una volta. Tipicamente, le figure vettoriali vengono renderizzate in passaggi multipli, uno sopra l’altro se coincidono. Con le icone di Haiku, le informazioni geometriche di ogni figura sono raccolte tutte in una volta, risolvendo il problema della visibilità delle giunture tra le figure, che spesso possono essere osservate con il rendering multi-pass tradizionale. Ciò avviene grazie alle nuove caratteristiche nella Anti-Grain Geometry rendering library che Haiku già utilizza per disegnare sullo schermo. Il modo in cui ciò viene fatto in AGG è anche più efficiente che nel rendering multi-pass.
La maggior parte del codice delle icone vettoriali è contenuto nella libreria statica libicon che è collegata in libbe. Anche se, non bisogna dedurre che già si può fare largo uso delle classi che contiene, visto che l’implementazione deve cambiare ancora ed essere migliorata. Ma è disponibile una nuova classe chiamata BIconUtils, simile a BTranslationUtils. Lo scopo di questa classe è offrire un accesso unificato alle icone, e poterle caricare in BBitmaps. Che maneggia in modo trasparente le vecchie icone di BeOS e le icone vettoriali. BNode, BNodeInfo, BAppFileInfo e BMimeType sono stati tutti modificati per caricare e salvare le icone con la classe BIconUtils. Prima di ciò c’era anche molto codice duplicato. Le icone vettoriali vengono caricate grazie alle stesse API disponibili precedentemente. Ad esempio BNodeInfo::GetIcon(BBitmap* bitmap, icon_size size). L’argomento dimensione è purtroppo ridondante dal momento che la bitmap che il chiamante deve pre-allocare, fornisce comunque una dimensione. In BeOS, la dimensione della bitmap deve corrispondere alla dimensione data all’icona. In Haiku, quale icona un’applicazione ottiene, è determinato dal colorspace della bitmap fornita. Se è B_RGBA32 (nel qual caso la bitmap può essere di ogni dimensione poiché l’argomento icon_size viene ignorato), viene preferita l’icona vettoriale. Se la bitmap è B_CMAP8, viene preferita la vecchia icona BeOS. se è disponibile un solo tipo di icona, verrà inserita nella bitmap fornita con la necessaria conversione. Purtroppo BeOS restituisce solo una bitmap bianca se passate una bitmap B_RGBA32 alla funzione di caricamento dell’icona – senza ritornare un’errore. Ciò significa che è necessario un po di sforzo extra per scrivere applicazioni che usano icone vettoriali con colori reali sotto Haiku contrariamente alle icone BeOS. Se BeOS restituisce un’errore, potreste provare semplicemente a passargli prima una bitmap a 32 bit e se fallisce riprovare con una a 8 bit. Bummer(vagabondo).
In Haiku molte applicazioni supportano già le nuove icone vettoriali. Ma il Tracker e la Deskbar non hanno ricevuto alcun codice speciale per le icone. Semplicemente sono stati adottati per utilizzare B_RGBA32 bitmaps invece di B_CMAP8 bitmaps, e sono stati risolti molti problemi per il disegno delle icone con l’alpha blending. (L’Alpha Blending è un processo che consente di controllare la trasparenza di un pixel rispetto al sottostante, rendendolo opaco o trasparente in modo variabile.)
La dove il Tracker legge le icone dalle sue proprie risorse, e stata adottata la soluzione di preferire le icone vettoriali passate tramite BIconUtils. Tranne ciò, Tracker and Deskbar usano il normale sistema di API disponibile ad ogni altra applicazione. Così in questo senso, le icone vettoriali sono completamente integrate con il sistema e direttamente implementate in tutte le classi API che si occupano delle icone.
Per ora, il lavoro su HVIF non è ancora completo al 100%. Ci sono alcuni bug da eliminare e deve essere ancora aggiunto il supporto ai driver delle periferiche che ritornano icone. La parte maggiore del lavoro è nel disegnare tutte le altre icone del sistema. E’ in lavorazione anche una guida per il disegno delle icone, che spiegherà le regole artistiche delle icone in Haiku. Un altro documento spiegherà come utilizzare Icon-O-Matic, che al momento è solo abbozzato. Con la speranza che entrambi i documenti incoraggeranno gli artisti ad aiutarci a completare il set di icone di Haiku.
Stephan Aßmus (a.k.a. Stippi)
- traduzione di Giuseppe Gargaro dal documento originale: https://www.haiku-os.org/news/2006-11-06/icon_facts