Using fonts inside a runtime shared library (RSL) loaded trough actionscript in Flash CS4 and CS5

This post describes how to use fonts which are stored in a runtime shared library (RSL) that is loaded trough actionscript. The post continues from the previous post I made about loading RSL via actionscript.

As a start I created two flash files very similar to the other article:

  1. The first file acts as the RSL file. I added Font definition to the library; using Arial Regular. I checked the Export for runtime sharing, used ArialRegular as class name and entered for the URL the name of an empty SWF.
  2. Into a second file I copied and pasted the Font definition from the first file (which automatically turned on Import for runtime sharing. I extended the timeline to 10 frames, created a new keyframe at frame 5 and placed at that frame a dynamic text field with some text using the font from the library. I also placed stop() at frame 5.
    At frame 2 I added the following code:
    this.stop();
    var loader: Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
    var context: LoaderContext = new LoaderContext();
    context.applicationDomain = ApplicationDomain.currentDomain; 
    loader.load(new URLRequest('test.export.picture.swf'), context);
     
    function onComplete(anEvent: Event): void
    {
    	trace('loaded');
    	play();
    }
     
    function onError(anEvent: IOErrorEvent): void
    {
    	trace('error');
    }

    This code will load the RSL and then continues the movie.

As shown in the other post, the Font definition will be present in the main movies context. However after testing the movie, I did not see any text.
It turns out having the Font definition in the same context is not enough, the definition has also to be registered trough the static method Font.registerFont().

So I changed the code at frame 2 to:

...
function onComplete(anEvent: Event): void
{
	trace('loaded');
	Font.registerFont(ApplicationDomain.currentDomain.getDefinition('ArialRegular') as Class);
	play();
}
...

Now the text was showing up when testing the movie.

Summary
To use Font Definition stored into a RSL, it needs to be registered (after the RSL has been loaded into the same domain) trough the method Font.Font.registerFont().
To obtain the definition use the method ApplicationDomain.currentDomain.getDefinition().

Embedding additional font outlines in a runtime shared library (RSL) with Flash CS4

Note that with CS5 this is no longer an issue; since you can specify exactly which font outline groups to embed with the Font Embedding dialog.

However with CS4 it is a different story.

At the end of this blog post I describe a solution how to include additional font outlines. First I describe the experiments I did, in case readers want to recreated those themselves.

As a test I created two flash files:

  • a flash file with a Font definition in the library with export for runtime sharing checked (based upon Arial – Regular)
  • a flash file with a Font definition in the library with import for runtime sharing checked and referencing the first file. I also added a dynamic text field containing some normal text and text using Cyrillic font (Eastern Europe).

The normal text showed up, but not the text with Cyrillic font. Looking at the generated size report it was also clear the Cyrillic outlines did not get exported.

So as next step I placed a dynamic text field in the main timeline of the first runtime sharing fla using the Font definition in the library. I selected the Cyrillic font via Character Embedding… outlines But nothing changed after creating the swf.

I tried various things, but in all cases the Font definition seemed to override the font embed options of the text field. At the end I found a solution (yay!), which I’ll describe next.

Solution
To embed additional (you can not override the default embedded outlines) for a Font definition in CS4 do the following:

  1. create a new Font definition in the library
  2. place a new text field on the main time-line (or use a movie clip, but in that case the movie clip must be exported as well)
  3. set type of text field to Dynamic Text
  4. as Family select the created font definition (make sure it is the font definition in the library and not the font used by the definition)
  5. click Character Embedding… and select the outlines you want to embed as well (no need to select the default ones)
  6. now for the trick to get it working: after this change the text type to Static Text
  7. build the swf file; the swf file should now also contain the additional font outlines