Vous êtes ici : Accueil - Ressources Flash - FontEmbedded.xml.

FontEmbedded.xml (Flash MX2004 uniquement)

Cette article se base sur l'astuce décrite par Stef dans son blog.

Moi qui jusqu'à présent travaillais sur des sites japonais en Flash, j'ai toujours eu en horreur à inclure les polices dans les swf, et souvent, j'avais recours à la vectorisation des textes, qui sommes toute méthode très barbare, restait moins lourd que d'inclure les polices elles-mêmes.

Pour présenter le problème, le japonais posséde plusieurs miliers de caractères. Sous Flash MX, pour une seule police, les fichiers swf peuvent atteindre plus de 3MB englobant près de 7000 caractères; sous MX2004, les sélections d'inclusion peuvent réduire le nombre à un peu plus de 3000 pour la langue de tous les jours. Mais les fichiers gardent tout de même plus d'un mégabites et certains caractères spéciaux n'y figurent pas (souvent des caractères réservés pour les noms de famille, ce qui était le cas, par le plus grand des hasards, pour les noms des patrons de mes clients \*O*/ ).

Le même problème doit se retrouver sur tous les systèmes d'écriture où le nombres de caractères est assez important, comme l'arabe qui comporte un peu plus de 1000 caractères, ou le hangul (écriture coréenne) avec plus de 11 000 caractères, ou encore le chinois qui bat les records avec plus de 18 000 caractères (cas où tous les caractères sont inclus).
NB: Ne connaîssant pas du tout ces langues et système d'écriture, je ne m'avancerais pas plus dessus, mais je pense que l'astuce et la source que je propose ici devrait marcher dans toutes les langues.

Utiliser les boîtes de textes dynamiques et les polices de caractères étant tout de même plus pratique, le problème ne se limitant plus qu'à récréer une liste des caractères signés en un seul exemplaire, je m'étais penché sur ce fichier fontembedded.xml. (ndr : ce fichier se trouve dans le répertoire C:\Program Files\Macromedia\Flash MX 2004\en\First Run\FontEmbedding\ sur mon Win XP Pro)

Lorsque l'on ouvre ce fichier, la structure du xml est la suivante:
(attention, le fichier est très long ^^)

<fontEmbeddingTable>

  <glyphRange name="un nom" id="1" >
    <range min="0x0000" max ="0x0000" />
  </glyphRange>

  <glyphRange name="un autre nom" id="2" >
    <range min="0x0000" max ="0x0000" />
  </glyphRange>

  ...

</fontEmbeddingTable>

Pour chaque sélection de caractères - ou glyphes - figurent un noeud xml avec son nom (celui que l'on retrouve dans Flash MX2004 dans le panneau de propriétés des boîtes de textes pour inclure les caractères voulus). Et dans chaque noeud, la liste des caractères.
NB : les codes de caractères dans Flash sont écrit avec 4 héxadécimales précédés d'un "0x".

En générant une liste des fichiers d'un site à envoyer vers flash, on peut ainsi recréer la liste des caractères signés. Voilà un petit exemple de script qui permet de récupérer le noeud enfant de <glyphRange>.

// simplifie les suites de noeud <range /> par un seul noeud.
function onSimplifyListing( c ) {
   return ( parseInt( arr[0], 16) == c+1 ) ? onSimplifyListing( parseInt( arr.shift(), 16) ) : reformateNumber( c.toString(16) ,4) ;
}

// triage des caractères uniques signés.
function generateRange() {
  // A chaque fichier chargé dans flash (ici du xml)
  var txt = _xml.toString(), cpt = 0;
  for (var i = 0; i < txt.length; i++) {
    var hex = reformateNumber( txt.charCodeAt(i).toString(16) ,4)
    if ( liste[hex] == undefined ) {
      liste[ hex ] = Object, arr.push(hex), liste.length++, cpt++;
    }
  }

  // vérification du fichier en cours et du nombre de caractères signés nouveaux.
  trace("fichier: "+_lien+"\t("+(totals-arrLinks.length)+"/"+totals+"\t+"+cpt+"car. )");

  // récurence jusqu'à ce qu'il n'y ait plus de fichier à traiter.
  if (arrLinks.length > 0) {
    return _xml = XMLLoader(_lien=arrLinks.shift(), this, "generateRange");
  }

  // trie de la liste des codes héxa des caractères signes.
  arr.sort();

  // sortie du noeud xml pour les caractères à inclure.
  trace("\n\n========= Début du noeud à copier =========\n\n");
  while (arr.length > 0) {
    trace('<range min="0x'+(h1 = arr.shift())+'" max ="0x'+onSimplifyListing( parseInt(h1, 16) )+'" />');
  }
  trace("\n\n========= Fin du noeud à copier =========\n\nTraitement fini.");
}

// amorce le trie des caractères uniques.
_xml = XMLLoader( _lien = arrLinks.shift(), this, "generateRange" );

Pour mon dernier projet en Flash, je me suis ainsi fait un répertoire particulier posé à la racine du site. Dedans, j'y ai mis un fichier flash utilisant un script similaire lisant un xml où j'ai répertorié tous les autres xml (toutes les données étaient statiques). Il me suffisait plus qu'à compiler ce fichier flash qui me sortait ainsi la liste à copier/coller directement dans un nouveau noeud <glyphRange>. Je faisais redémarrer Flash MX2004 après modification du fichier fontembedded.xml et recompilais le fla du projet qui contenait les polices de caractères incriminées.

Voici les fichiers sources en téléchargement : GlyphChecker.as, listing.xml et missing.xml.
NDR : Pour utiliser les sources, faites un include du fichier as dans un fla et placer le avec les deux fichiers xml dans un dossier à la racine d'un de vos projets. Modifier les fichiers xml selon votre architecture et si besoin, le fichier as.

Copyright © . Roikku.com. Tous droits de reproduction réservés.

Google