Font streaming

Update: Now the project is on google code

A promise is a promise 😉 Now you can download sources of my library handling progressive download of fonts for Flash.

I clean up all to separate different works.

1. Waterfall demo

Font stream waterfall demo

Main demo proof of concept. Demonstrate the system with non embed fonts where chars are loaded when them entered. Also give an example to the usage with Flex on custom components (through Text.fontContext)

2. Font cache generator

An AS3 Command line executable (made with redtamarin) allow quickly generate fonts cache. A binary file format used to serve fast small amount of font data (optionaly a format used to storage data).

Use it to add more supported fonts for build in test (Waterfall demo). For generate font cache files simply use console: fcgen embed_fonts.swf (or use --help for display help), put generated files (by default *.foncache) in fontcache folder and update fontlist.xml

This contains also 2 others version, an old version in AS3/SWF by passing the SWF file by clicking on stage first and save the result by click second, and an not working flex alternative (read only some information about the SWF file passing through the button “open”).

3. SWF template base

Not realy important but used for generated the template used in library for generate dynamically SWF file contain fonts data.

Here miss an other part used to modify the SWF template for keep only needed informations (remove debug, metadata …)

And finally an example to embed font with Flex SDK.


I’m currently work on a big multilingual project which use it. But the server get in trouble (we suppose) with PHP when handling huge file like for Arial Unicode MS for CJK texts. We use a (temporary ?) solution by caching requested files and serve again for same requests. This not include in sources.

Beyond, is hard to get styles applied on HTML text. This for what, I had create a class handling HTML text and parsing it to know used text/fonts, improve HTML support by TextField (by some hack and HTML transformations). Is not yet include in souces.

  • Can have memory impact or CPU time when intensive usage for large range of chars (need be more tested)
  • Not all font information supported, but maybe no real impact (Small text ? and language code ? )
  • Server performance (PHP parsing and generating are time consumer) (need enhance by optimizing the script or use an other language like C/C++ or use a DB for stocking gyphs data instead a unique file)
  • Only TextField can use it, not supported by new Flash 10 TextEngine, it use an other way to embed font (CFF Fonts) (need support DefineFont4 tag)
  • The font embedded by Flash are cleaner than Flex SDK, but Flash CS3 allow generate fake italic and bold whereas Flash CS4 allow used real font styles (Light, Condensed, Heavy …)

No licence explicitly declared but sure i think as GPL, no AS3 package, more examples, SVN, dedicated page, real name, logo … this will come.

Download it ~50Mo Download it on google code

[JSFL] Publish all opened FLA

Command menu on CS4 French

When you work on a large project, sometime often, you need to recompile all FLAs. With this script, you can do this without execute the compilation by hand for each.

Download it: Publish all.jsfl

Install it in apt folder :

  • Windows Vista: boot drive\Users\username\Local Settings\Application Data\Adobe\Flash CS4\language\Configuration\Commands
  • Windows XP: boot drive\Documents and Settings\user\Local Settings\Application Data\Adobe\Flash CS4\language\Configuration\Commands
  • Mac OS X: Macintosh HD/Users/userName/Library/Application Support/Adobe/Flash CS4/language/Configuration/Commands

(You don’t need relaunch Flash CS4)

Go to menu “Command” > “Publish all” and voilĂ .


Streaming de polices

Je viens de mettre au point un systĂšme qui permet d’utiliser des polices embarquĂ©es, mais seulement de charger les caractĂšres nĂ©cessaires.

Le systĂšme est simple :

Le server de streaming
Il va s’occuper de la sĂ©lection des caractĂšres Ă  retourner en fonction de ceux demandĂ©s.
Le client
Il va s’occuper de faire le choix des caractĂšres nĂ©cessaires (en fonction du texte Ă  afficher) ainsi que le leur rapatriement et l’intĂ©gration aux polices Ă  utiliser.

SWF to Font cache to SWF

Voir la démo

La police Arial Unicode MS, contient la majoritĂ© des plages unicodes : Latin, CJK (Chinois, Japonais, CorĂ©en), Cyrillique, HĂ©breu, …

A titre d’information :

  • ShinGoPro-Medium_regular.fontcache 3,38Mo (A-OTF-ShinGoPro-Medium.otf 3,11Mo)
  • Arial Unicode MS_regular.fontcache 9,96Mo (Arial Unicode MS.otf 23,28Mo)
  • CodingFontTobi_regular.fontcache 53Ko (cft.ttf 47Ko)
  • Coca Cola ii_regular.fontcacheCoca 20Ko (Cola ii.ttf 58Ko)
  • Futura_boldItalic.fontcache 27Ko (Futura Bold Italic.ttf 35Ko)
  • Futura_bold.fontcache 25Ko (Futura Bold.ttf 34Ko)
  • Futura Heavy_regular.fontcache 28Ko (Futura-Heavy.otf 17Ko)
  • Futura Heavy_italic.fontcache 29Ko (Futura-HeavyOblique.otf 17Ko)
  • Futura Light_regular.fontcache 29Ko (Futura-Light.otf 17Ko)
  • Futura_italic.fontcache 29Ko (Futura-Oblique.otf 16Ko)
  • Futura Heavy_regular.fontcache 28Ko (Futura.otf 16Ko)
  • Futura Condensed_regular.fontcache 28Ko (FuturaCondMedium.otf 22Ko)
  • Microsoft YaHei_bold.fontcache 8,7Mo (Microsoft YaHei Bold.otf 14,69Mo)
  • Microsoft YaHei_regular.fontcache 8,89Mo (Microsoft YaHei.otf 15,04Mo)
  • SegoeUI_regular.fontcache 252Ko (segoeui.ttf 415Ko)

Total 31,48Mo (56,81Mo)

Must have (softwares)

Flash Player info reader

[How to] Create SVN managed project with 3rd part library on SVN

SVN has a smart fonctionality : Externals. The objective is import files from an other SVN repository
Instead of download all of them and keep it in a folder (only one for all your project using this lib or a duplicate inside each projects), make only a link to the repository.
For example, my project use Papervision 3D. I need juste add “svn:externals” property to my root folder of classes.

On Window with Turtoise SVN : Right click on folder and select “TurtoiseSNV” > “Properties …”
Turtoise SVN folder menu
Click on “Add” button, select “svn:externals” for property name and set property value to :


Turtoise SVN folder properties window
Now commit and update your local copy.

Now indicated folders/files are synconized when you update your local copy with external(s) SVN(s)

For use a specific revision, use -r indicator. For example work with revision 727 of Papervision 3D, use property value :

org/papervision3d -r727
org/ascollada -r727
nochump -r727

You can also use SVN tags.


Random non-uniform distribution

Ces graphiques sont gĂ©nĂ©rĂ© Ă  partir de 1 000 000 valeurs (Ă  chaque affichage). Le rouge est la valeur moyenne et le rose est la rĂ©partition moyenne de probabilitĂ© (tout les valeurs on le mĂȘme probabilitĂ© de sortir)


Ce qui serai excellent c’est de faire la mĂȘme chose mais avec des points de contrĂŽles comme pour les courbes de bĂ©zier.

Des liens :

Flash et les langues “exotiques”

Comment faire quand on a un Flash avec du texte dynamique en français, anglais, russe ou chinois ?

DĂ©jĂ  le problĂšme c’est qu’on ne peut pas utiliser qu’une seule police. Le graphisme utilise une police, mais celle-ci, dans la majoritĂ© des cas ne gĂšre pas tout les caractĂšre Unicode.
Faire une concession sur le graphisme, ou utilise 2 polices ?

Une police qui gĂšre le chinois ? Pas sĂ»r, par exemple avec la police PMingLiU (police par dĂ©faut sur XP gĂ©rant les caractĂšres asiatiques) avec les caractĂšres chinois tous (Chinois traditionnel tous + chinois simplifiĂ©) sois 21664 caractĂšres, on rajoute 12Mo au SWF…

AprĂšs quelques tests, le seul moyen que j’ai trouvĂ©, c’est d’utiliser pour les langues europĂ©ennes (romanes et germaniques) la police du graphisme (exemple : DIN ou Helvetica) et pour les autres langues utiliser la police _sans.
Le seul soucis c’est que pour du texte qui utilise la police _sans, il faut le mettre en myTextField.embedFonts = false; sinon elle n’apparaitra pas. De ce fait, on ne pourra pas appliquer des transformation tels que la rotation ou le scaling au champs texte quand on utilise _sans. Seule l’alpha peut ĂȘtre appliquĂ© en mettant le champ texte en mode de fusion BlendMode.LAYER

La seule chose qu’il reste Ă  faire, c’est dĂ©tecter quand on doit utiliser _sans ? Quelques pistes :

  • Identifier la langue utilisĂ© et faire une correspondance (exemple l’attribut lang et/ou xml:lang)
  • VĂ©rifier chaque caractĂšre si il exsite dans la police, sinon utiliser _sans avec myFont.hasGlyphs(myString);

Informations complémentaires :

Cadratin – part 1

L’AS3 Ă  permis d’ouvrir la porte Ă  pas mal de choses dont 2 intĂ©ressantes : la gestion native de ByteArray et le chargement dynamique de SWF Ă  partir de donnĂ©es contenu dans un ByteArray.

Dit comme ça, ça n’a pas forcĂ©ment d’intĂ©rĂȘt immĂ©diat. Seulement, le fait de pouvoir modifier/gĂ©nĂ©rer les donnĂ©es binaires d’un SWF et de les charger pour les rĂ©cuperer sous forme native, ça change pas mal de choses !
Image, vidĂ©o ou vectoriel bon ça on peut dĂ©jĂ  le faire nativement avec BitmapData et Video ou Shape. Mais on peux aussi le faire pour du son, du code ActionScript, ou pour une police embarquĂ©e. C’est ce dernier point, qui m’intĂ©resse et qui n’a pas encore vraiment Ă©tĂ© explorĂ©.

Pour ce faire, j’ai appris Ă  lire les donnĂ©es brut du format SWF : demo, sources
Attention les logs gĂ©nĂ©rĂ©s sont assez lourds ~1Mo pour un SWF d’environ 30Ko contenant seulement une police embarquĂ©.

Ca lit les donnĂ©es global d’un SWF (dimensions, couleur de fond, bibliothĂšque) ainsi que tout la partie qui gĂšre les polices (le nom de la police, les donnĂ©es de dessins des glyphs …). Il faudra ensuite que je fasse l’opĂ©ration inverse : gĂ©nerer les donnĂ©es nĂ©cĂ©ssaire Ă  l’intĂ©gration d’une police dans un SWF.

Liens :

[How to] Image format

Un problĂšme auquel j’ai Ă©tĂ© confrontĂ© rĂ©cemment, c’est le poids que font des PNG 32bits de taille moyen ~ 400px * 500px pour ~ 200Ko. En passant par PNGOUT on gagne une ou deux dizaine de kilooctet au maximum.
Seulement, ces images au nombre d’une vingtaine Ă©tait utilisĂ© simultanĂ©ment (ou presque). Rien qu’une image au poids de 200Ko dĂ©passe largement le poids normal conseillĂ© d’une page HTML (JS + CSS + images compris).

Pourtant je devais absolument disposer d’images transparente. HĂ©las seul le format acceptable dans ce cas est le PNG. Le BMP, TIFF ou encore TGA Ă©tant encore plus lourd, de plus non gĂ©rĂ© nativement dans Flash. Comment rĂ©duire le poid (compression lossy ?) et tout en conservant la transparence (une palette gris ?) tout ça en utilisant un containers supportĂ©s par Flash ou en passant par une librairies (si faut pas la faire une sois mĂȘme) ?

Je suis pas allĂ© trĂšs loin pour trouver la solution : utiliser 2 images au lieu d’une. Un JPEG pour les canneaux rouge, vert, bleu, plus un PNG 8bits (voir moins) en palette de gris pour la transparence. Restait plus qu’a les gĂ©rer dans flash.

var rgb:BitmapData = myRGBBitmapData;
var alpha:BitmapData = myAlphaBitmapData;

//Loaded JPEG BitmapData are not transparent
argb = new BitmapData(rgb.width, rgb.height, true, 0x00000000);
//Copy RGB
	new Rectangle(0, 0, rgb.width, rgb.height),
	new Point(0, 0)

//Apply alpha channel
	new Rectangle(0, 0, alpha.width, alpha.height),
	new Point(0, 0),
	BitmapDataChannel.RED,//r = g = b = gray

//ARGB is ready to use

Le réslutat :

RGB (JPEG) (32 024 octets) + Alpha (PNG8) (12 037 octets) = 44 061 octets vs. Result (PNG32) (58 618 octets). Soit un gain de 25% par rapport Ă  l’original. On peut mĂȘme atteindre un gain de 90%.
On pourrai aller encore plus loin en les compressant dans un fichier 7zip. Dans notre cas celui ci permet de gagner encore 10 422 octets, soit au final 57% de la taille originale.

Dans tout ça, le problĂšme aprĂšs, c’est le temps de calcul nĂ©cessaire Ă  la lecture et la dĂ©compression du(des) fichier(s) chargĂ©(s) plus le temps de calcul pour que Flash fasse la fusion des 2 images.

Les sources :

Mais sinon pourquoi pas ?