blob: 9e7fb002f2a846df6942700712da1fde8320f258 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package spark.core
{
import flash.text.engine.FontLookup;
import flash.text.engine.Kerning;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.property.Property;
import flashx.textLayout.tlf_internal;
import mx.core.mx_internal;
import mx.styles.IStyleClient;
[ExcludeClass]
/**
* @private
* This class is used by components such as RichText
* and RichEditableText which use TLF to display their text.
* The default formatting for their text is determined
* by the component's CSS styles.
*
* TLF recognizes the copy that is done in this constructor and does not
* do another one. If TLF adds formats to TextLayoutFormats this should
* continue to work as long as Flex doesn't want some alterate behavior.
*
* The only extra functionality supported here, beyond what TLF has,
* is the ability for the fontLookup style to have the value "auto";
* in this case, the client object's embeddedFontContext is used
* to determine whether the the fontLookup format in TLF should be
* "embeddedCFF" or "device".
*/
public class CSSTextLayoutFormat extends TextLayoutFormat
{
include "../core/Version.as";
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* @private
* Constructor
*/
public function CSSTextLayoutFormat(client:IStyleClient)
{
super();
for each (var prop:Property in TextLayoutFormat.tlf_internal::description)
{
const propName:String = prop.name;
if (propName == "fontLookup")
{
this[propName] = convertedFontLookup(client);
}
else if (propName == "kerning")
{
this[propName] = convertedKerning(client);
}
else
{
const value:* = client.getStyle(propName);
if (value !== undefined)
this[propName] = value;
}
}
}
/**
* @private
*/
private static function convertedFontLookup(client:IStyleClient):*
{
var value:String = client.getStyle("fontLookup");
// Special processing of the "auto" value is required,
// because this value has meaning only in Flex, not in TLF.
// It tells Flex to use its EmbeddedFontRegistry to determine
// whether the font is embedded or not.
if (value == "auto")
{
if (client.mx_internal::embeddedFontContext)
value = FontLookup.EMBEDDED_CFF;
else
value = FontLookup.DEVICE;
}
return value;
}
/**
* @private
*/
private static function convertedKerning(client:IStyleClient):*
{
var kerning:Object = client.getStyle("kerning");
// In Halo components based on TextField,
// kerning is supposed to be true or false.
// The default in TextField and Flex 3 is false
// because kerning doesn't work for device fonts
// and is slow for embedded fonts.
// In Spark components based on TLF and FTE,
// kerning is "auto", "on", or, "off".
// The default in TLF and FTE is "auto"
// (which means kern non-Asian characters)
// because kerning works even on device fonts
// and has miminal performance impact.
// Since a CSS selector or parent container
// can affect both Halo and Spark components,
// we need to map true to "on" and false to "off"
// here and in Label.
// For Halo components, UITextField and UIFTETextField
// do the opposite mapping
// of "auto" and "on" to true and "off" to false.
// We also support a value of "default"
// (which we set in the global selector)
// to mean "auto" for Spark and false for Halo
// to get the recommended behavior in both sets of components.
if (kerning === "default")
kerning = Kerning.AUTO;
else if (kerning === true)
kerning = Kerning.ON;
else if (kerning === false)
kerning = Kerning.OFF;
return kerning;
}
}
}