////////////////////////////////////////////////////////////////////////////////
//
//  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.formats
{
	/**
	 *  Defines constants for specifying subscript or superscript in the <code>baselineShift</code> property
	 *  of the <code>TextLayoutFormat</code> class. You can specify baseline shift as an absolute pixel offset, 
	 *  a percentage of the current point size, or the constants SUPERSCRIPT or 
	 *  SUBSCRIPT. Positive values shift the line up for horizontal text (right for vertical) and negative values 
	 *  shift it down for horizontal (left for vertical). 
	 *
	 * @playerversion Flash 10
	 * @playerversion AIR 1.5
	 * @langversion 3.0
	 *
	 *  @see flashx.textLayout.formats.TextLayoutFormat#baselineShift TextLayoutFormat.baselineShift
	 */
	public final class BaselineShift
	{
		/** Shifts baseline to the current superscript position.
		 * @playerversion Flash 10
	 	 * @playerversion AIR 1.5
	 	 * @langversion 3.0
	 	 */
	 	 
		public static const SUPERSCRIPT:String = "superscript";
		
		/** Shifts baseline to the current subscript position.
		 *
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
		 * @langversion 3.0
		 */
		 
		public static const SUBSCRIPT:String = "subscript";		
	}
}
