Table of Contents
This chapter describes how to use fonts in LZX applications.
A font is a set of glyphs (images) representing the characters from some particular character set in a particular size, style, and typeface. There are several different computer representations for fonts. The most widely known are Adobe Systems, Inc.'s PostScript font definitions and Apple's TrueType.
Since DHTML doesn't support compiled fonts, we have to rely on system fonts. This means fonts may not look exactly the same across runtimes because letter spacing and rendering/smoothing are often different from one implementation to the next.
Small type isn't smoothed in DHTML as it is in SWF. I'm not sure what to do here, except choose our fonts carefully and/or avoid small point sizes.
We make every effort to make font metrics in DHTML match those in swf. They may not match exactly but they're very close.
It is virtually impossible to acheive pixel-perfect font rendering across all runtimes. However, with minimal changes for alignment and font names, you can usually make SWF and DHTML versions of your application essentially indistinguishable with regard to appearance of text.
The image of each character in a font may be encoded either as
a bitmap (a bitmap font, sometimes called a pixel font)
a higher-level description in terms of lines and areas (an outline font).
In general, bitmap fonts are intended to be displayed at a specific size and outline fonts can be displayed at a variety of sizes.
SWF only: The features described in this section only work in applications compiled to SWF. They do not work in applications compiled to other runtimes.
Only some runtimes support embedded fonts (just SWF for now). Because of this, if you're not compiling to SWF all fonts need
to be on the end-user's system and <font>
tag(s) don't work.
Font attributes can take a list of names (optionally including compiled font names for swf.)
The runtime goes through the comma-separated list and picks the first one it finds on the system. This allows for fallback
fonts if one or more fonts can't be found by name.
OpenLaszlo applications can access fonts in either of two ways: by building them into the application itself (SWF only) or by using the fonts that are resident on the client machine (DHTML and SWF).
With embedded fonts, there is a reasonable guarantee that the text in that application will look the same, no matter where it is run. However, fonts are large, and including fonts in your application makes the application (download) larger, and the startup time slower. With client fonts, (also called native fonts or device fonts), applications are smaller and start faster, but there is no guarantee that the rendering of that font, or the font definitions themselves, will be the same from computer to computer. Embedded fonts provide higher fidelity.
In addition, because of limitations of the Flash Player, there are certain things you cannot do with client fonts. For example, client fonts cannot be rotated, nor can you vary their opacity. Here is a summary of the differences:
Client fonts
Smaller downloads and faster initialization
Some limitations (no rotation, etc)
No guarantee that application will look the same on all platforms
Embedded fonts
Larger downloads; slower startup
All text manipulations available
Designer control over application appearance
By default, OpenLaszlo applications use the device fonts.
Example 23.1. using device fonts
<canvas> <window title="Fonts are fun!" width="400" height="400" resizable="true"> <view width="500"> <simplelayout axis="y" spacing="10"/> <view width="400" font="Arial" fontsize="14"> <simplelayout axis="y" spacing="10"/> <text>Arial</text> <text>abcdefghijklmnopqrstuvwxyz1234567890!@#$%^*()-=+|</text> <text>ABCDEFGHIJKLMNOPQRSTUVWXYZ ,./ ;?;':"[]{}\~`</text> <text><b>Arial</b></text> <text><i>Arial</i></text> <text><b><i>Arial</i></b></text> <inputtext>inputtext here</inputtext> <inputtext multiline="true" height="100" width="100">hello there</inputtext> <inputtext>Arial</inputtext> <text> <b><i>BoldItalic</i> Bold </b><i>Italic</i> <u>Underline <b>Bold Underline</b></u></text> </view> <view width="400" font="Arial Narrow" fontsize="14"> <simplelayout axis="y" spacing="10"/> <text>Arial Narrow</text> <text>abcdefghijklmnopqrstuvwxyz1234567890!@#$%^*()-=+|</text> <text>ABCDEFGHIJKLMNOPQRSTUVWXYZ ,./?;':"[]{}\~`</text> <text><b>Arial Narrow</b></text> <text><i>Arial Narrow</i></text> <text><u>Arial Narrow</u></text> <text><b><i>Arial Narrow</i></b></text> <inputtext>inputtext here</inputtext> <inputtext multiline="true" height="100" width="100">hello there</inputtext> <inputtext>Arial Narrow</inputtext> <text> <b><i>BoldItalic</i> Bold </b><i>Italic</i> <u>Underline <b>Bold Underline</b></u></text> </view> <view width="400" font="Times New Roman" fontsize="14"> <simplelayout axis="y" spacing="10"/> <text>Times New Roman</text> <text>abcdefghijklmnopqrstuvwxyz1234567890!@#$%^*()-=+|</text> <text>ABCDEFGHIJKLMNOPQRSTUVWXYZ ,./?;':"[]{}\~`</text> <text><b>Times New Roman</b></text> <text><i>Times New Roman</i></text> <text><u>Times New Roman</u></text> <text><b><i>Times New Roman</i></b></text> <inputtext>inputtext here</inputtext> <inputtext multiline="true" height="100" width="100">hello there</inputtext> <inputtext>Times New Roman</inputtext> <text> <b><i>BoldItalic</i> Bold</b> <i>Italic</i ><u>Underline <b>Bold Underline</b></u> </text> </view> </view> <scrollbar axis="y"/> </window> </canvas>
You can override the default font by redefining the default font on the <canvas>
.
Note that you need to do this within the <canvas>
itself—you cannot do it using an attribute tag.
Example 23.2. setting default tag on the canvas
<canvas width="500" height="100" bgcolor="gray" font="default" fontsize="8"> <font name="default" src="verity/verityplus11.ttf"/> <text >default Foobar the quick brown frotz jumped over the bad music</text> <text font="default" fontsize='8'>Verity Foobar the quick brown frotz jumped over the bad music</text> <text font="Verdana">Verdana Foobar the quick brown frotz jumped over the bad music</text> <simplelayout /> </canvas>
SWF only: The features described in this section only work in applications compiled to SWF. They do not work in applications compiled to other runtimes.
Because the underlying Flash runtime can only display outline fonts, OpenLaszlo applications today can only support outline fonts. This would seem to imply that fonts in a OpenLaszlo application can be displayed at any size, and strictly speaking this is true. However, the OpenLaszlo runtime library (the LFC) includes a number of "pseudo-pixel" fonts. These font files contain outlines that describe precise bitmaps that, when rendered and antialiased by Flash at a specific size, appear pixel-accurate for another size. Again, even though you specify the font size in LZX as one value, the characters, as they are rendered, will appear pixel accurate for another font size that is typically indicated by the font file name.
The following font files in $LPS_HOME/lps/fonts
are designed to be displayed at font size 8 only.
lztahoe
*
lzsans
*
verity
/verity
*
Any font file whose name is of the form: face
-size
-style
-width
.ttf
Note | |
---|---|
Embarrassing historical tidbit: the lzsans fonts have an '8' in their name but actually appear as size 9. |
There are two ways to identify which font your application, or any element of it, should to use: the font
attribute on <view>
s and classes derived from views, ant the <font>
.
The font
attribute specifies font to be used for any <text> or <inputtext> elements that appear inside this view. Like all the font
properties (fontstyle and fontsize too) these properties cascade down the view hierarchy until a new value is specified. When
the font attributes are modified at runtime, using JavaScript, the font is changed for the view itself, not for any of its
subviews.
For example,
Example 23.3. Using the font attribute
<canvas> <simplelayout/> <view font="helvetica"> <text>Howdy!</text> </view> <view font="times"> <text>Howdy back!</text> </view> </canvas>
You can supply more than one font name as argument to the font attribute. At runtime, the system will try the font list from left to right and use the first one it finds. This can come in handy if you have an application that you would like to compile to both SWF and DHTML.
The font attribute accepts a comma-separated list of fonts so DHTML can fall back to a system font when a compiled font isn't found by name. For example, say you have embedded the "helmet" font:
<font name="helmet" src="helmet.ttf"/>
Then the tag,
<text font="helmet,helvetica,sans-serif">
finds the compiled font 'helmet' when you compile to SWF and falls back to 'helvetica, sans-serif' when you compile to DHTML.
SWF only: The features described in this section only work in applications compiled to SWF. They do not work in applications compiled to other runtimes.
The value of the font
attribute is the name of a embedded font, that is declared with the
<font>
tag.
The behavior of font
in LZX closely parallels HTML/CSS, but is not equivalent in all cases. In particular:
The value of the 'font' attribute is a comma-separated list of font names. These font names are used in priority order. The first font in the list that is available is used to render the text of the view.
Font names can include the names of fonts on the client runtime, such as (typically) "Helvetica" and "Times".
There are three "generic family names", which can be used as font names. These generic family names are "serif", "sans-serif", and "monospace".
The default font is "sans-serif". No font is embedded in the application by default.
There are no warnings for fonts that are named as the literal values of 'font' attributes but don't have embedded font
definitions.
OpenLaszlo does not implement generic font family definitions, but it does not preclude them nor is it incompatible with them (as described below).
This renders Hello World in a client font.
Example 23.5. Default font with non-default font size
<canvas height="100"> <text fontsize="24">Hello World</text> </canvas>
This renders Hello World in a larger client font, with no jaggies.
Example 23.6. Equivalence of generic and defite names
<canvas height="100"> <simplelayout axis="y"/> <text font="sans-serif">Some text</text> <text font="Helvetica">Some text</text> <text font="Times">Some text</text> <text font="serif">Some text</text> <text font="Courier">Some text</text> <text font="monospace">Some text</text> </canvas>
This displays three pairs of items. The items in each pair may be rendered in the same font, depending on the default fonts on the client.
Example 23.7. "nofont" attribute
<canvas height="100"> <simplelayout axis="y"/> <text font="nofont, nofont, sans-serif">Some text</text> <text font="nofont, sans-serif">Some text</text> <text font="sans-serif">Some text</text> </canvas>
This displays three lines in the same font.
The OpenLaszlo font
attribute is similar to the CSS 'font' and 'font-family' properties: http://www.w3.org/TR/2004/CR-CSS21-20040225/fonts.html#font-family-prop.
The remaining differences are:
LZX specifies the font as an XML attribute. HTML+CSS specifies it is a CSS property.
An OpenLaszlo 'font' can only be a list of font names. This makes it more similar to the CSS 'font-family' than to the CSS 'font', which is a shorthand property that can also accept font size, style, variant, weight, and line-height values.
CSS defines the additional generic font families 'cursive' and 'fantasy' , as well as "system font" names 'caption', 'icon', 'menu', 'message-box', 'small-caption', and 'status-bar'. (Generic family name definitions, below, let the application or library developer define these system names.)
CSS allows multiword font names to be quoted, e.g. "Times New Roman" (where the quotes are part of the value). LZX does not allow this.
In order to use any font other than the default font in an OpenLaszlo application, you must first declare it. The default font is described below.
OpenLaszlo documentation uses the verbs, importing, defining, and declaring,
somewhat interchangeably when it comes to fonts. Each of these words implies that you are letting LZX know
about a font you are going to use in your application.
In LZX, fonts are referred to by name and there is an application-global
namespace for fonts. Fonts can be defined directly under the <canvas>
or <library>
tags like:
Each font that is imported has a name
, an optional
style
, and a src
file that contains the TTF. (The name
is interpreted as the font face when the LZX application renders HTML text. See Chapter 21, Text Views .)
The style must be one of plain
, bold
, italic
, or
bold italic
and the default style is plain
. You must declare each style of
a font that you intend to use.
The style of a font is interpreted when LZX applications render HTML text.
See Chapter 21, Text Views for more information.
The OpenLaszlo compiler will auto-include the plain, bold, italic, and bold italic styles of the default font, if it can detect that they will be needed. In general, it is safest to declare the bold, italic, and bold italic styles explicitly if you know you will need them. For fonts other than the default, you must explicitly import a file for each of the styles. For more details, see the section on the default font.
Each font must be imported from an external file and the value of the src
attribute must be a
pathname to that file (URLs are not currently supported).
Relative pathnames are resolved relative to the including file.
The OpenLaszlo Server also looks in $LPS_HOME/lps/fonts
directory.
There are two syntaxes for importing a font. The example below imports the plain and bold style of
a font named myfont
.
Example 23.9. Declaring fonts
<font name="myfont" src="myfont.ttf" style="plain"/> <font name="myfont" src="myfont-bold.ttf" style="bold" />
Alternatively, you can declare several styles at once like:
Example 23.10. Declaring multiple font styles (faces) at once
<font name="myfont"> <face src="myfont.ttf" style="plain" /> <face src="myfont-bold.ttf" style="bold" /> <face src="myfont-ital.ttf" style="italic" /> <face src="myfont-bita.ttf" style="bold italic"/> </font>
Notes:
Redefining a font name is unsupported and application behavior is undefined if you do this.
There are no font aliases today. A single font can have only one name. If you need the same font to have two names, you must declare it twice (and it will be embedded twice).
The base LZX visual object, <view>
, has three font attributes,
font
, fontstyle
, and fontsize
.
The font
attribute with value myfont
indicates that this view should look for and use a font named myfont
to render text.
The fontsize
attribute indicates the point size at which the font should be rendered and the
fontstyle
indicates the style of the font that should be used.
As you will see below, these are actually the default values of the font attributes for the canvas. Because of the way that font attributes cascade, the values of these attributes on the canvas are essentially the defaults for the entire application. Below are some examples of using font attributes.
Example 23.11. Using a font
<canvas height="70"> <font name="helmet" src="helmetr.ttf"/> <text font="helmet" fontsize="20">Hello Helmet</text> </canvas>
As you can see below, The HTML text rendering tags, <b>
(for bold) and
<i>
(for italic) instruct the OpenLaszlo application to look for and use
the bold, italic, or bold italic version of the current font.
Example 23.12. Using font styles and HTML text
<canvas height="70"> <font name="myfont"> <face src="helmetr.ttf" style="plain" /> <face src="helmetb.ttf" style="bold" /> <face src="helmeti.ttf" style="italic" /> <face src="helmetbi.ttf" style="bold italic" /> </font> <text font="myfont" fontsize="20"> plain <b>bold</b> <i>italic</i> <b><i>bold italic</i></b> </text> </canvas>
In the example below, we use the HTML text <font>
tag to
change fonts inside a single piece of text.
Example 23.13. Using mulitple fonts in HTML text
<canvas height="70"> <font name="helmet" src="helmetr.ttf"/> <font name="arioso" src="ariosor.ttf"/> <text fontsize="20"> <font face="helmet">helmet</font> <font face="arioso">arioso</font> </text> </canvas>
In the example below, you can see that setting the fontsize
can get you very big text.
Example 23.14. Using the fontsize attribute
<canvas height="100"> <font name="helmet" src="helmetr.ttf"/> <text resize="true" fontsize="100" font="helmet">BIG</text> </canvas>
Many of the fonts look too small at the default fontsize of 8.
Example 23.15. Omitting the fontsize attribute.
<canvas height="70"> <font name="helmet" src="helmetr.ttf"/> <text font="helmet">Helmet at default size(8) is very hard to read!</text> </canvas>
You can specify the font for inputtext, too.
Example 23.16. Specifying the font for inputtext.
<canvas fontsize="20" height="70"> <font name="helmet" src="helmetr.ttf"/> <inputtext bgcolor="red" font="helmet">Type your text here</inputtext> </canvas>
There are two basic rules that a view uses to choose its font attributes.
font attributes cascade
font attribute definitions in classes bind tightly (to children)
These are described in turn below.
Cascading occurs when a view does not specify one of its font attributes. In this case, it will receive its parent's value for that font attribute. If the parent doesn't specify a font attribute, it keeps going up the view hierarchy to find a view that specifies a value for that font attribute, going all the way to the canvas, if no ancestors specify a value for the given font attribute. Each of the three font attributes cascade separately.
Example 23.17. Using cascaded font attributes
<canvas height="250"> <font name="conga" src="congar.ttf"/> <font name="conga" src="congab.ttf" style="bold"/> <view layout="axis: y; spacing: 2" font="conga"> <text resize="true" fontsize="12" text="I will be in conga 12"/> <text resize="true" fontsize="22" text="I will be in conga 22"/> <text resize="true" fontsize="32" text="I will be in conga 32"/> <view layout="axis: y; spacing: 2" fontsize="32" fontstyle="bold"> <text resize="true" text="I will be bold"/> <text resize="true" text="Me, too"/> <text resize="true" fontsize="8" font="default" text="I will be in the default font"/> </view> </view> </canvas>
You can even specify font attributes on the canvas
Example 23.18. Specifying a canvas font
<canvas font="tahoe" height="70" width="200"> <font name="tahoe" src="lztahoe8.ttf"/> <text text="hello"/> </canvas>
Specifying a font attribute on a class definition:
causes instances of that class to use the class definition of that font attribute and
the class definition font attribute cascades down to instance children in the class definition itself.
Class font attributes bind more tightly than cascaded font attributes.
The following is a set of rules that a view uses to choose its font:
Use the font attribute set on the instance. If not set, then
Use the font attribute set on this instance's baseclass (or any of its subclasses, going up the chain). If it is not set,
Use the cascaded font attribute.
You may want to use a font attribute on a class definition if you are going to closely tie the implementation (design, layout, positioning) of that class to that specific font. In general, you should only do this when absolutely necessary.
Example 23.19. Using font attributes in a class definition
<canvas height="100"> <font name="helmet" src="helmetr.ttf"/> <font name="tahoe" src="lztahoe8.ttf"/> <class name="myclass" fontsize="20" font="helmet"> <attribute name="defaultplacement" value="'content'"/> <text bgcolor="red" text="Uses the class font"/> <view name="content"/> </class> <view layout="axis:y; spacing: 2" font="tahoe"> <myclass/> <text text="use cascaded font"/> </view> </canvas>
All Laszlo applications come bundled with a default font. The name of this
font is 'default'. This font is actually the verity11
pseudo-pixel font and is designed
to look well when antialiased.
Example 23.20. Verity and vera fonts
<canvas height="120"> <font name="vera" src="bitstream-vera-1.10/vera.ttf"/> <font name="verity9" src="verity/verity9.ttf"/> <font name="verity11" src="verity/verity11.ttf"/> <simplelayout axis="y" spacing="2"/> <view layout="axis: x; spacing: 2" pixellock="true"> <text pixellock="true" fontsize="9" font="vera" text="vera 9 abcdefghi"/> <text pixellock="true" fontsize="8" font="verity9" text="verity 9 abcdefghi"/> </view> <text fontsize="10" font="vera" text="vera 10 abcdefghi"/> <view layout="axis: x; spacing: 2" pixellock="true"> <text pixellock="true" fontsize="11" font="vera" text="vera 11 abcdefghi"/> <text pixellock="true" fontsize="8" font="verity11" text="verity 11 abcdefghi"/> </view> <text pixellock="true" fontsize="12" font="vera" text="vera 12 abcdefghi"/> <text pixellock="true" fontsize="14" font="vera" text="vera 14 abcdefghi"/> <text pixellock="true" fontsize="20" font="vera" text="vera 20 abcdefghi"/> </canvas>
The OpenLaszlo compiler also knows to automatically include the bold, italic, or bold italic version of this font if it can detect that they are needed.
You may redefine the default font if you'd like.
Example 23.21. Redefining the default font
<canvas height="70"> <font name="default" src="bitstream-vera-1.10/vera.ttf"/> <simplelayout axis="y" spacing="2"/> <text text="vera"/> <button text="vera button"/> </canvas>
Note that when you redefine the default font, the compiler no longer can automatically include the bold, italic, or bold italic styles for you.
Because components are classes in LZX, there can be an interaction between any component
that has a font attribute declared in its class definition. In particular, the
<basecomponent>
class is defined to use the font named 'default'.
The OpenLaszlo components are defined and built to use a specific font (verity11). They should/may work with other fonts. But today, you are only guaranteed that they work with the font they were designed with.
There is no mechanism for developers to easily change the fonts used by the components. (Note: some components may not work correctly with anything except the default font.) It can be done on component instances easily, or you can declare new classes like
Example 23.22. Changing the fonts for Laszlo components
<class name="mybutton" extends="button" font="myfont"/> <class name="mycheckbox" extends="checkbox" font="myfont"/> ⋮
Another way to get components to use a font other than 'default' is to actually redefine the default font.
Example 23.23. Redefining the default font for Laszlo components
<canvas height="80"> <font name="default" src="helmetr.ttf"/> <button text="hello"/> </canvas>
The OpenLaszlo Server provides a number of fonts for your use in $LPS_HOME/lps/fonts
.
The pseudo-pixel fonts that come with the OpenLaszlo Server are described above. The OpenLaszlo
default (pseudo-pixel) font, verity11
is there as is an outline version of the same
glyphs in bitstream-1.10-vera
.
OpenLaszlo provides some basic APIs for measuring text. You can use the LzFontManager
to look up information about a given font name and style, including character advances (widths) and line ascents
and descents. The font metrics provided by the OpenLaszlo Runtime Library are all for the version of the default size
of the given font (which is 8). In order to adjust the font metrics for a given font, you must
multiply the font metric by a factor that adjusts for the change in font size, fontsize/8
.
(Note: These APIs are likely to be deprecated in the future in lieu of APIs that
simply measure text).
If you want to know the size of a piece of text, the simplest technique is to create a
<text>
view using the font attributes that are appropriate and the call
the LzText.getTextWidth() method.
Note that in DHTML, measuring font metrics is computationaly "expensive". Do it sparingly, as it can slow your application's performance considerably.
DHTML only: The features described in this section only work in applications compiled to DHTML. They do not work in applications compiled to other runtimes.
There is a general tension in DHTML regarding who controls type size—the user or the application. w3c leans toward the end user having ultimate control, which means that you, as designer, have to be prepared for the fonts you have specified not being the ones that are displayed.
Small type isn't smoothed in DHTML as it is in SWF. It is hard to offer advice about what to do here, except choose your fonts carefully and/or avoid small point sizes. This is a browser and/or display setting, so there is nothing you can do about it. (For example., OS X allows you to set a minimum font size, below which smoothing will never happen; Safari lets you set a minimum font size for accessibility and smaller sizes will just be mapped up to that minimum.)
However, note that the Flash Player and some browsers do not handle font sizes equivalently. You may find that, relative to applications compiled to SWF, you need to step the size down for some DHTML OpenLaszlo applications where the text shows up too large.
Font attributes are cascaded down the view hierarchy but only instances
of <text>
have access to their font attributes at runtime. Text views will have the
font
, fontsize
, and fontstyle
attributes.
You can look up the actual LzFont that is represented by a given
font
and fontstyle
via the LzFontManager.
If you need to know the font attribute associated with a view that is not a text instance, the simplest way is to get the
font attributes from a sibling view. If no such view exists, you can create an invisible text view.
SWF only: The features described in this section only work in applications compiled to SWF. They do not work in applications compiled to other runtimes.
Embedded fonts (in applications compiled to SWF) increase the size the size of the application.
When deciding what embedded fonts to use, you may need to take into account how fonts affect the size, hence download time, of your application. Here are some heuristics to help you with file size/download calculus. -
The larger the font, the larger the application. The size
of the font can be estimated by looking at the file size of the .ttf
file.
Fonts with more complicated shape outlines will be larger.
Fonts with more character codes in them will be larger. One size optimization technique is to use a version of the font file that has only the characters in it that your application uses.
Copyright © 2002-2007 Laszlo Systems, Inc. All Rights Reserved. Unauthorized use, duplication or distribution is strictly prohibited. This is the proprietary information of Laszlo Systems, Inc. Use is subject to license terms.