////////////////////////////////////////////////////////////////////////////////
//
//  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 flashx.textLayout.compose
{
	/** 
	 * The ISWFContext interface allows a SWF file to share its context with other SWF files that load it.
	 * An application that loads a SWF file of type ISWFContext can call methods in the context of the loaded SWF file.
	 * The main usage is for calling the FTE TextLine creation methods.
	 * 
	 * <p>There are two reasons for an application to use 
	 * this interface to control TextLine creation: </p>
	 * <ul>
	 *   <li><strong>Reuse an embedded font: </strong> if an application wants to use a font embedded in a loaded SWF file,
	 * the application can access the font if a TextLine
	 * is created in the context of the loaded SWF file.</li>
	 *   <li><strong>Reuse existing TextLine instances</strong>: reusing existing TextLine instances can result in faster recompose times. 
	 * TLF reuses existing TextLine instances internally. TLF reuses 
	 * a TextLine by calling <code>TextBlock.recreateTextLine()</code>
	 * instead of <code>TextBlock.createTextLine()</code> when TLF recognizes that a TextLine is extant.</li>
	 * </ul>
	 *
	 * 
	 * <p>Your application may have additional TextLine instances that can be reused. 
	 * To manually reuse existing TextLine instances:</p>
	 * <ol>
	 *   <li>trap calls to <code>TextBlock.createTextLine()</code>, then</li>
	 *   <li>call <code>TextBlock.recreateTextLine()</code> with the extant TextLine instance instead 
	 * of <code>TextBlock.createTextLine()</code>.</li>
	 * </ol>
	 * <p>Please note, however, that the <code>TextBlock.recreateTextLine()</code> is available
	 * only in Flash Player 10.1 and later.</p>
	 *
	 * @see flash.text.engine.TextBlock#createTextLine()
	 * @see flash.text.engine.TextBlock#recreateTextLine()
	 * @includeExample examples\EmbeddedFontLineCreator.as -noswf
	 * @includeExample examples\FontConsumer.as -noswf
	 * 
	 * @playerversion Flash 10
	 * @playerversion AIR 1.5
	 * @langversion 3.0
	 */
	public interface ISWFContext
	{
	    /**
	     *  A way to call a method in a client controlled context.
	     *
	     *  @param fn The function or method to call
	     *  @param thisArg The this pointer for the function
	     *  @param argArray The arguments for the function
	     *  @param returns If true, the function returns a value
	     *
	     *  @return Whatever the function returns, if anything.
	     *
	     *  @see Function#apply()
	
	     *  @langversion 3.0
	     *  @playerversion Flash 10
	     *  @playerversion AIR 1.5
	     */
	    function callInContext(fn:Function, thisArg:Object, argArray:Array, returns:Boolean=true):*;
	}
}
