En todos los modos, un color se puede configurar de 2 maneras:
- Configurando el color INK para gráficos, texto, ventana y comandos BLOCK
- Introduciendo el valor del color directamente en la memoria de video
Creación de imágenes de 256 colores
Estaba claro desde el principio que tenía que rehacer todos los sprites para el modo 16 (256 colores) para aprovechar los 256 colores. Normalmente uso Photoshop para gráficos, así que tuve que crear una paleta de colores QL Mode 16. Al final, creé dos paletas:
- QL_INK_Colour_PAL: paleta de modo 16 con los colores ordenados por valor de TINTA, que ordena los colores (más o menos) por color y tono, lo que facilita la selección de los colores al dibujar.
- QL _Colour_PAL: con los colores ordenados por valor hexadecimal, que se utiliza para convertir la imagen en una imagen de color indexada que se puede exportar como una imagen RAW. La imagen RAW exportada tiene el mismo formato que una imagen QL _SCR en modo 16 y luego se puede cargar directamente en la pantalla QL usando LBYTES.
Conversión de imágenes de 256 colores a imágenes de 65536 colores
Mis sprites solo usaban un puñado de colores, por lo que solo tuve que convertir los 256 valores hexadecimales de 8 bits a los valores de 32 bits correspondientes.
La primera sorpresa para mí fue que QL en realidad tiene 2 modos de color con 65535 colores, incompatibles entre sí.
- Modo 32: utilizado por QXl y QPC
- Modo 33: utilizado por Q40, Q60, Q68, QIMSI GOLD
Debido a que el modo 32 usa little endian, el valor de color rojo $F800 debe guardarse en la memoria como $00F8 (el byte menos significativo primero)
El modo 33 usa big endian, por lo que el valor de color rojo $07C0 debe guardarse en la memoria como $07C0 (el byte más significativo primero)
Pensé que esto sería fácil: solo tengo que crear una tabla con todos los valores de TINTA de 0 a 255 y sus valores correspondientes para los modos 16, 32 y 33.
Pronto descubrí que, aunque tenemos 256 valores de tinta en el modo 16, en realidad solo tenemos ¡243 colores! 13 valores de INK te darán el mismo valor hexadecimal que otras INK
p. ej., INK 29 (azul claro) e INK 37 (cian pastel) tienen el mismo valor hexadecimal $F7
También tenemos 13 valores hexadecimales que se pueden introducir en la memoria de video y se mostrarán como color en la pantalla, pero no se asignan a ningún color de INK.
Para empeorar las cosas, algunos colores de INK nos darán diferentes tonos de color en la pantalla en el modo 16, modo 32 y modo 33
Y desafortunadamente estaba usando algunos de estos colores para mis sprites.
Entonces, ¿qué podríamos hacer para convertir el modo 16 al modo 32 y al modo 33?
Tenemos 4 opciones:
- Utilizar las funciones SMSQE que convierten sprites e imágenes al modo de color actual
- Utilizar el fantástico kit de herramientas CV2NAT de Per que convierte sprites e imágenes al modo de color actual
- Utilizar el programa BMP de Dilwyn Jones y Bob Spelten Jr. para convertir imágenes _scr y _pic
- Escribir tu propio programa de conversión
El programa BMP funciona muy bien, lo he probado con algunas imágenes. Pero como mis archivos de sprites usaban un formato personalizado, no podía utilizar el programa para convertirlos directamente y convertir los archivos de sprites primero al formato _scr o _pic y luego de nuevo a mi formato personalizado era mucho trabajo.
Así que opté por la opción 4.
Tuve la suerte de encontrar un artículo escrito por Dilwyn y publicado en QL TODAY VOLUMEN 8 NÚMERO 3 que convertía del modo 16 al modo 32. Y escribí un programa de conversión similar del modo 16 al modo 33 que funciona tanto con mi formato de sprite como con archivos _scr y, con un pequeño cambio, también con archivos _pic.