
   True Type Fonts                                      Navi / PhyMosys
   ---------------                                    (Versi en  Catal)


        La idea s sencilla, es tracta de fer que a partir d'una proporci
     d'un punt donat en relaci a la pantalla o al tamany desitjat de la
     font, es transforme en altre punt a partir d'una escalaci i repetir
     aix entre dos punts per formar una lnia corvada.
        Per a desenvolupar el sistema aquest podria semblar necessari un
     estudi de les propietats a l'espai af 2D, per debut a la absoluta
     sencillesa del mtode (sols cal escalar), no crec que siga necessari.
        El primer pas s definir un sistema de proporcions. Els humans, en
     la vida no-virtual, usem un sistema basat en el 100 ja que s mltiple
     de la base 10 que s tamb la ms emprada. Per a nosaltres podria ser
     ms interesant usar tamb aquesta base ja que els calculs ens serien
     directes, per per al computador aquest s un sistema dolent per dues
     raons: primer perque com treballa amb la base 2, aquest no s un sistema
     directe per a ell (el ms proper sera el 2^7=128); i segn, perque t
     molt poca resoluci, ja que, directament, els procesadors "normals", no
     poden usar els nombres decimals. Per aix buscant, podem trobar la
     millor base per als nostres cculs en un ordinador, la base 256: s un
     mltiple de 2, t la suficient resoluci per a pantalles de fins a uns
     800x600 pixels i, a ms de tot aixo, s el tamany que ocupa un byte:
     podrem treballar amb bytes.
        Amb aquest sistema de proporcions ben definit, el que podem fer s
     desenvolupar les sencilles ecuacions que ens dirn on collocar un punt
     en pantalla a partir de la proporci (vertical i horizontal) i un tamany
     determinat del dispositiu (pantalla) o font. Per exemple, hem de saber
     com calcular els punts de una 'A' amb un tamany de 50x60 pixels (observa
     quin estalvi de memoria suposa a, ja que el clavar una font TT sn
     noms 20 o 30 bytes de definici dels punts i si la ficarem com a un
     bit-map serien 50*60=3000 bytes... 100 cops menor!!).
        Per a la X, per exemple, podriem comenar a desenvolupar a partir
     d'una simple regla de 3 que ens ensenyaren en 7e de EGB (2on de ESO per
     als newbies ;). Com per a la Y el desenvolupament s identic, me l'he
     estalviat i he clavat directament la formuleta:

          Rx   Fx          256   Fx               Fx*Px         Fy*Py
          -- = --    -->   --- = --    -->    X = ----- ;   Y = -----
          Px    X          Px    X                 256           256 

     On 'Fx' s el tamany X desitjat per a la font, 'Rx' s la base de la
     proporci que estem emprant, 'Px' s la dada a calcular, es a dir, el
     punt que ens diu la lletra que hem de calcular i 'X' s la incognita
     que hem de trobar, la coordenada X respecte a l'inici de l'eix on pintar
     el punt.
        Si ens fixem un poquet en aquesta frmuleta, la velocitat de clcul
     d'aix s realment bona, ja que noms hem de fer una multiplicaci
     grcies a la bona base que hem emprat de principi. Suposem que tenim en
     BL el punt que volem dibuixar (com esta en base a una proporci, sols
     caldr un byte) i en CX tenim el tamany en pixels que volem que tinga
     la font horizontalment, en un PC podriem fer simplement:

                XOR     BH, BH          ;  Borrar la part alta.
                MOV     AX, BX          ;  Preparar la multiplicaci.
                MUL     CX              ;  Multiplicaci sense signe.
                                        ;  El resultat el tenim en AH.

        Per a calcular la coordenada Y tindriem un cdi semblant i unint dos
     codis com aquestos podem anar pintant punt a punt una font. La pregunta
     s, per, com fer que la font ocupe menys si tenim que definir tots
     els punts del voltant? Doncs, sencill, unint aquestos punts mitjanant
     lnies rectes. Per a fer-ho podem emprar un algorisme qualssevol de
     dibuixat de lnies. A t un problema i s que si la font ha de ser
     molt gran, a partir d'un cert moment comenaran a notar-se les unions
     entre els diferents punts i produiran un efecte lleig a la vista. Sols
     hi ha una soluci per a a, clavar-ne ms i ms punts fins que no es
     noten aquestes unions.
        Nosaltres, per, es clar que no ens conformarem amb aquesta semi-
     soluci, ja que des d'un primer moment el que volem aconseguir s tant
     fer fonts escalables "infintament" com fer-les en el menor espai que
     siga possible (i no aconseguiriem ni una cosa ni l'altra). Que fem,
     doncs? Podriem no dibuixar lnies, avanar un poquet ms i dibuixar
     corbes. A seria realment efectiu, encara que un poquet ms complexe
     de dur a terme. Les corbes sn ms efectives perque donen la sensaci
     de continuitat i no com les rectes que van canviant gaire b totalment
     de direcci en cada punt.
        Per a dibuixar corbes, hem d'emprar alguna tcnica que ens faa
     dibuixar-les b i que no distorsione les formes, no pel sol fet de fer
     corbes la lletra apareixer ms clara, ser necessari, a ms a ms, que
     aquestes corbes tinguen unes determinades propietats. Les corbes ms
     idonees per als nostres proposits sn les corbes de Bezier i els Splines
     i derivats (segur que en el teu programa de dibuix tens d'aquestes).
     Bsicament del que es tracta s de fer una corba que pase per dos punts
     amb la novetat que es basar per a traure-la en els punts adiacents
     (existeixen infinites corbes (en l'espai R) que pasen per 2 punts, per
     noms hi ha una que pase per 3 (segur que tots hem fet algn cop en
     l'escola aix de trazar una circumferencia que pase per 3 punts)).
        Les matemtiques necessaries per a traure tot a sn un poquet
     avanades, per noms explicar la idea de la que es parteix per a
     traure aquestes corbes (que tampoc explicar com calcular ja que s'en
     surten del tema que aqu estem tractant, potser en altre article com
     aquest). Partint de la base que les corbes sn funcions algebraiques
     afitades entre dos punts (b, es poden modelar com a funcions almenys),
     podriem calcular la seua primera derivada en qualsevol punt on aquesta
     es trobe definida i aquest valor ser pel significat geomtric de la
     derivada, la pendent de la recta tangent a la corba en eixe punt. El
     que s'ha de conseguir es que entre 2 punts, la corba que els uneix,
     tinga la mateixa derivada "per la dreta" que la corba dels dos punts
     segents "per l'esquerra" formant aix una sensaci pseudo-matemtica
     de continuitat. En la frase anterior en clavat entre cometes el "per
     la dreta" i "per l'esquerra" perque no es un concepte massa matemtic
     per a referir-me al punt que es troba al mig entre tres punts de la
     lletra:
                          ,--x--------x
                         /    B      C
                        x A

     Encara que no crec que el meu art ASCII siga per a tirar flors, aqu
     teniu un dibuixet aclaridor, entre els punts A i C est el B que cuan
     estic dibuixant la corba de AB s el punt "per la dreta" i cuan trace
     la corba BC s el punt "per l'esquerra".
        Desprs d'aquestes disertacions matemtiques, tornem a la virtualitat
     del nostre mn. Per a que el nostre polgon (ja que fins ara noms hem
     fet un polign amb lnies corbes) prenga una verdadera sensaci de
     slidesa com les que en prenen els bit-maps, ens falta el pas ms
     artstic del procs, el dibuixat de l'interior.
        Per a pintar a el primer que se'ns ocorrer ser l'avorrit colorejat
     flat o monocolor que consisteix simplement en pintar tot el de dins amb
     un nic color predeterminat. Com sempre, nosaltres no ens podem quedar
     ah i hem d'avanar un poquet ms fins desenvolupar mtodes de pintat de
     l'interior ms divertits, amb molts colors, com poden ser, per exemple,
     els gradients de color (vertical, horizontal o central) o sistemes ms
     complexos com els basats en fractals o plasmes (bsicament pintar primer
     una image amb bona resoluci d'un fractal o un plasma i agafar aquesta
     image com si es tractara d'una textura que se li pega a les lletres).
        La descripci dels mtodes de programar aquestos sistemes de pintat
     surten fora de les pretensions inicials d'aquest artcle aix que noms
     nomenar el mtode principal per a pintar els flats que s el flood-fill
     i que amb unes mnimes variacions podria usar-se per a pintar amb els
     dems sistemes. En un futur podria escriure altre artcle com el present
     sobre aquestos temes, per de moment haureu de buscar-vos la vida pel
     vostre compte ;)
        Ara ja est tot dit sobre el que s'ha de fer per a aconseguir fonts
     true type en un ordinador de forma suficientment rpida, que ocupe poc
     i no excesivament difcil de programar, noms resten unes cuantes
     consideracions abans d'acomiadar-me. La primera es que, tractar de
     dibuixar en temps real la font en pantalla cada cop que siga demanada es
     realment una bojeria doncs consumirem molt de temps de CPU i potser ni
     aix ens done temps a dibuixar correctament la lletra, el millor s
     pregenerar-les totes amb un tamany i guardar-les en una zona de memoria.
     La segona consideraci es en el que respecta als splines (corbes de
     Bezier), aquestes sn realment costoses en temps de CPU de implementar
     aix que si no tens altre remei i no pots prendret un temps per a
     precalcular les fonts (per falta de memoria o per necesitar de molts
     tamanys a l'hora), el que s pot fer i seria molt interesant fer s
     pregenerar algunes taules per a aquestes corbes i no usar el copro, sino
     fer els clculs en punt fixe. Altra cosa que cal tenir en comte s el
     fet de que la pantalla no t una resoluci igual en X i Y, sino que la
     proporci que guarda es 3/4 i per tant no hem de fer coincidir el tamany
     de X i Y, sino que la Y ha de ser un pel ms petit. I per acavar, noms
     nomenar un problema en el que pots trobar-te al dibuixar una A majscula
     es que aquesta t varios segments, es a dir, amb un traat continu no
     pots dibuixar-la; s'haur d'emprar un sistema per a dibuixar per separat
     els segments indicant el color de fons (definint un color transparent).
        I com jo ja no tinc res ms a dir sobre aquest tema, sols hem resta
     recordar-te que per a qualsevol consulta, informaci o proposta de nous
     artcles, tens el meu e-mail obert de bat a bat. A aquest artcle no
     l'acompanya cap codi font ni informaci adicional pel que s important
     que tractes de programar-te un generador de fonts ara mateix (per trobar
     ms informaci dels temes que no s'han tractat en aquest artcle, busca
     en Internet coses sobre corbes de Bezier, splines, plasma, fractals,
     flood-fill, matmatica af, topologia de corbes, ensamblador, etc).
     Noms una frase ms: "Happy Code!!"

                                                     Navi / PhyMosys
                                                phymosys@moon.inf.uji.es
