Lenguaje simbólico azul
En los setenta e inicios de los ochenta escribía en dos lenguajes, que aunque yo los consideraba hermanos, uno más de uso habitual y otro de uso más culto, tenían características y orígenes súmamente diferentes. Con el paso del tiempo y la dificultad de evolucionar, el lenguaje más culto e icónico fue desapareciendo de mi mente y el más habitual estilizándose en mi mano.
Hacia finales de los noventa e inicios del dos mil, el lenguaje icónico había desaparecido, ya no lo sabía escribir y prácticamente no lo podía leer, mientras que el otro se descompuso a su vez en dos, el que seguía escribiendo a mano ya con cierta dificultad y su evolución simbólica, curvilínea y automatizada, esto es, que yo no lo se escribir, aunque si leer, pero que se escribir programas que lo escriben.
Aunque cuando empecé a mecanizar este lenguaje simbólico ya existían tipos de letras escalables de Adobe y Apple y aunque estos símbolos están originalmente definidos como un conjunto de curvas, estas curvas se pasan a un formato gráficos que se escala ya como un mapa de bits, perdiéndose toda posibilidad vectorial. Para automatizar el manejo de estos gráficos he confiado tradicionalmente en Alchemy (alchlong.exe) de Handmade Software, invocándolo desde el lenguaje TOL que es en el lenguaje en el que se programan los algoritmos de escritura. A continuación muestro esta invocación, para dos usos diferentes de alchlong.exe desde TOL:
///////////////////////////////////////////////////////////////////
Set AlcSize(Text filPth) // File path
///////////////////////////////////////////////////////////////////
{
If(Not(FileExist(filPth)), [[0,0]], // File doesn't exist
{
Text tmpDos = "tmp\\alchemy.tmp"; // Store alchemy information
Text inpDos = "tmp\\smb.imb"; // Alchemy don't handle complex
Real FilCopy(filPth, inpDos); // file names
Real sysExe = System("bin\\alchlong.exe "+ // Executable
"-x "+ // Options
inpDos+" > "+ // Input file path
tmpDos); // Output file path
Text tmpTxt = ReadFile(tmpDos);
Text sizTxt = TxtBetween2Tag(tmpTxt,
"Width x Height: ","\n",TRUE);
If(sizTxt=="", [[0,0]], // Size doesn't exist
{
Set sizSet = Tokenizer(sizTxt,"x"); // width x height
Real width = Eval(sizSet[1]+"; ");
Real height = Eval(sizSet[2]+"; ");
[[width, height]]
})
})
};
///////////////////////////////////////////////////////////////////
PutDescription(
"Returns a set (width, height) in pixels of a image.",
AlcSize);
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
Real Bmp2Pic(Text bmpDir,
Text picDir)
///////////////////////////////////////////////////////////////////
{
Set filSet = GetDir(bmpDir)[1];
Set filCic = EvalSet(filSet, Real(Text filNam)
{
Text inpFil = bmpDir+"/"+filNam;
Text outFil = picDir+"/"+Replace(filNam,".bmp",".gif");
FilMake(inpFil, outFil, Real(Text inpFil, Text outFil)
{
Text inpDos = "tmp\\smb.bmp";
Text outDos = "tmp\\smb.gif";
Real FilCopy(inpFil,inpDos); // Alchemy don't handle complex
// file names
Real sysExe = System("bin\\alchlong.exe "+ // Executable
"-g -Xb56 -+ ---t -o "+ // Options (84)
inpDos+" "+ // Input file path
outDos); // Output file path
Real FilCopy(outDos,outFil);
sysExe
})
});
Card(filCic)
};
En la plana de lenguaje simbólico que puede verse al final de este post, los símbolos están ajustados a un cuadrado sobre una imagen de fondo que corresponde a mi acuarela llamada «requiescant in pace». Es a la vista de la plana cuando se entiende que clasifique este post más como pintura y poesía que como pura tecnología.