AmigaOS 3.5: La nuova icon.library
di Bernardo Innocenti <bernie@cosmos.it>

ABSTRACT

Lo scorso mese abbiamo esaminato in dettaglio le novità presenti nella workbench.library V44. Questo mese concluderemo la nostra panoramica sul Workbench soffermandoci sulle funzionalità introdotte nella icon.library, le cui caratteristiche erano rimaste pressoché immutate dalla nascita di Amiga ad oggi.

Le Vecchie Icone

Amiga ha sempre potuto vantare un sistema di icone di gran lunga più flessibile di quelli presenti in MacOS ed in Windows, per non parlare dei desktop UNIX (ad eccezione, forse, di OpenStep). Sebbene non vi siano particolari impedimenti tecnici ad ostacolarne l’implementazione, il Workbench rimane tuttora il solo desktop in cui sia possibile creare icone di dimensioni arbitrarie e con una seconda immagine per lo stato selezionato. La possibilità di associare qualsiasi icona a ciascun file o directory offre inoltre un grado di libertà in più rispetto a sistemi in cui le icone sono stabilite esclusivamente in base al tipo del file o, peggio ancora, all’estensione di tre caratteri.

Queste caratteristiche erano presenti fin dalle primissime versioni del Workbench. Con l’introduzione del Kickstart 2.0, la icon.library fu estesa con alcune funzioni per associare delle icone di default ai file che ne sono privi. Si trattava tuttavia di uno schema piuttosto limitato, successivamente esteso da commodities di terze parti come DefIcons.

Tradizionalmente, le icone del Workbench erano disegnate in quattro colori (blu, nero, bianco e arancio), anche se il formato non poneva limiti sul numero di bitplanes utilizzabili. In AmigaOS 2.0 la palette standard dello schermo Workbench fu alterata al fine di introdurre l’odierno look tridimensionale dell’interfaccia utente. Inaspettatamente, i colori 1 e 2 (bianco e nero) furono scambiati, dando così luogo ad una sorta di “incompatibilità estetica” con le vecchie icone dell’1.3.

Non molto tempo dopo gli utenti di Amiga iniziarono a stancarsi dell’aspetto piatto e poco colorato delle icone standard. Molti si sbizzarrirono a creare collezioni di icone dall’aspetto più gradevole, o perlomeno più vivace. Questi tentativi culminarono nel pacchetto di icone shareware realizzato da Martin Huttenloher, chiamato MagicWB, che per anni si impose come standard de-facto grazie ad una efficace procedura di installazione e una serie di utility a corredo che ne rendevano facile l’adozione. L’aspetto sfumato a 8 colori delle icone MagicWB e le dimensioni adeguate alle alte risoluzioni costituivano, in effetti, un grosso passo avanti rispetto al passato.

Le Nuove Icone

Un ulteriore passo avanti fu compiuto da Nicola Salmoria con l’introduzione della newicon.library, accompagnata da un patch di sistema chiamato NewIcon. Senza rompere completamente con il passato, le NewIcons estendevano il formato originale delle icone aggiungendovi un’ulteriore coppia di bitmap dotata di una propria palette. Il patch inserito nella icon.library consentiva di rimappare i colori delle icone su quelli dello schermo Workbench al momento del caricamento, eventualmente allocandone di nuovi in caso di necessità. Per evitare problemi di compatibilità nel formato dei file “.info”, le bitmap estese erano codificate in delle stringhe ASCII memorizzate sotto forma di tooltype. Questa soluzione, sebbene poco elegante, risolveva efficacemente il problema.

Il pacchetto originale delle NewIcons comprendeva una vasta collezione di icone dotate di un proprio stile, senza tuttavia limitare la possibilità di introdurre stili alternativi. Difatti su Aminet non tardarono a comparire le più disparate collezioni di icone, nessuna delle quali fu però adottata universalmente dagli utenti, che erano invece divisi per la maggior parte tra MagicWB e NewIcons.

Grossomodo un anno e mezzo fa, comparve una collezione di NewIcons denominata GlowIcons, il cui stile vivace e pulito era contraddistinto da un effetto di “illuminazione” nello stato selezionato. Seppure incompleta, questa collezione piacque a molti utenti. Non tardarono le voci di corridoio che davano per certa l’adozione delle GlowIcons come standard per la nuova versione del sistema operativo, alimentate anche dall’evidente reticenza dell’autore sull’argomento. Non molto tempo dopo, Fleecy Moss, allora coordinatore degli sviluppatori esterni, venne inspiegabilmente cacciato via da Amiga Inc. Matt Chaput, autore delle GlowIcons, fece non poco scalpore pubblicando sulla propria home page un aggiornamento della propria collezione di icone ed una lettera aperta nella quale spiegava che Fleecy Moss costituiva il suo unico contatto con Amiga Inc. ed in seguito alla sua dipartita non era stato più possibile proseguire la collaborazione.

Le Nuovissime Icone

Il team di sviluppatori di AmigaOS 3.5, ben sapendo che gli utenti si aspettavano che il nuovo sistema operativo mettesse ordine nel caos che si era venuto a creare in un interregno durato ben sei anni, ha dovuto prendere una decisione per tutte riguardo alle icone. Rompere completamente con il passato o assecondare gli standard stratificatisi negli anni?

Dopo un’attenta valutazione dei pro e dei contro di ciascuna possibilità, è stato deciso che il formato NewIcons doveva essere in qualche modo supportato, ma non adottato. Sebbene ben congegnato, il sistema delle NewIcons rimane pur sempre un patch, con tutti i limiti che questo comporta. Per esempio, non è possibile visualizzare una NewIcon su uno schermo diverso dal Workbench perché il remap della palette viene operato incondizionatamente su quest’ultimo. Inoltre il remap avviene al momento del caricamento dell’icona, non quando è necessario visualizzarla, pertanto le icone “consumano” le penne dello schermo Workbench anche quando non ve ne è bisogno. Per lo stesso motivo, le NewIcons non sono in grado di mantenere la propria palette se lo schermo viene chiuso e riaperto.

Il nuovo schema prevede invece delle funzioni aggiuntive nella icon.library per offrire alle applicazioni la possibilità di manipolare l’immagine e la palette delle icone in modo consistente. Come nelle NewIcons, è stata mantenuta la compatibilità binaria dei file “.info” con le versioni precedenti del sistema operativo. Restano infatti presenti le due immagini prive di palette che vengono visualizzate dalle applicazioni ignare della presenza delle immagini palette-mapped. Il formato delle icone è stato però esteso senza ricorrere a trucchi con i tooltypes, ottenendo così file di dimensioni più contenute ed una velocità di lettura decisamente migliore.

Interfaccia per il programmatore

La icon.library fino alla V40 conteneva le funzioni per il caricamento di icone che sono elencate nel riquadro 1. A queste si aggiungono le nuove funzioni presenti a partire dalla V44 (riquadro 2). Le immagini palette-mapped possono essere ottenute soltanto utilizzando queste ultime. Per ragioni di compatibilità, esse rimangono nascoste alle applicazioni che non sono state aggiornate all’OS 3.5. Quasi tutte le nuove funzioni dispongono di numerosi tag per garantire al programmatore un grado di controllo superiore. In passato era prassi comune manipolare direttamente i campi della struttura DiskObject. Sebbene le icone ritornate da GetIconTags() mantengano una struttura DiskObject compatibile verso il basso, le informazioni relative alle immagini palette-mapped ed i nuovi attributi sono accessibili solo attraverso i tag di IconControl().

La icon.library dispone inoltre di un gruppo di funzioni che permettono di disegnare icone al di fuori del Workbench (vedi riquadro 3). Grazie a queste funzioni, le applicazioni possono facilmente utilizzare le icone come elementi dell’interfaccia grafica. L’interfaccia di DrawIconState() ricalca volutamente la funzione di Intuition DrawImageState(). Con mio disappunto, Olaf Barthel non ha colto l’occasione di questo aggiornamento per trasformare le icone in vere e proprie classi boopsi, magari derivate dalla imageclass. In questo modo sarebbe stato immediatamente possibile creare bottoni contenenti icone, senza dover scrivere codice aggiuntivo.

Conclusione

Per questo mese è tutto. Alcuni approfondimenti sulle nuove caratteristiche della icon.library sono presenti nella V44 Changes Guide, presente nel CD allegato al numero 106 di Amiga Life. La documentazione completa di tutte le funzioni della icon.library potete trovarla negli AutoDocs presenti sull’Amiga Developer CD 2.1 (che abbiamo recensito sul numero 107).

[Daniele, per favore verifica se i numeri che ho indicato sopra sono corretti]

RIQUADRO 1: Le funzioni classiche per l’accesso alle icone

icona = GetDiskObject(nome)
Carica un’icona del Workbench

icona = GetDefDiskObject(tipo)
Carica una delle icone di default del Workbench.

icona = GetDiskObjectNew(nome)
Carica l’icona indicata, ritornando un’icona di default nel caso che non ve ne sia una specifica.

successo = PutDiskObject(nome, icona)
	Salva un’icona su disco con il nome specificato.

FreeDiskObject(icona)
Libera la memoria allocata dalle funzioni sopra indicate.

RIQUADRO 2: Le funzioni V44 per l’accesso alle icone

icona = GetIconTagList(nome, tags)
successo = PutIconTagList(nome, icona, tags)
Queste funzioni sono simili a GetDiskObject() e PutDiskObject(), ma offrono il supporto del nuovo formato palette-mapped ed un controllo accurato dell’operazione mediante i tags.

DupDiskObjectA(icona, tags)
Crea un duplicato di un’icona in memoria. I tag permettono di scegliere selettivamente le informazioni da duplicare.

NewDiskObject(tipo)
Crea una nuova icona priva di immagine e con tutti i parametri impostati ai valori di default.

RIQUADRO 3: Funzioni per il disegno di icone

successo = GetIconRectangle(rastport, icona, label, rettangolo, tags)
Calcola le dimensioni occupate dal disegno di un’icona in una rastport.

LayoutIcon(icona, schermo, tags)
Prepara un’icona per la visualizzazione su uno schermo, eventualmente allocando le penne richieste e rimappando l’immagine.

DrawIconState(rastport, icona, label, leftEdge, topEdge, stato, tags)
	Disegna un’icona in una rastport come se fosse un’immagine boopsi.

ChangeToSelectedIconColor(colore)
	Modifica un colore RGB per ottenere l’effetto di selezione standard di un’icona.

IconControl(icona, tags)
	Permette di impostare numerosi parametri dell’icona specificata o le impostazioni globali della icon.library.