File: Core\CSharp\MS\Internal\TextFormatting\TextShapeableSymbols.cs
Project: wpf\src\PresentationCore.csproj (PresentationCore)
//-----------------------------------------------------------------------
//
//  Microsoft Windows Client Platform
//  Copyright (C) Microsoft Corporation
//
//  File:      TextShapeableSymbols.cs
//
//  Contents:  Definition of text shapeable symbols
//
//  Spec:      http://team/sites/Avalon/Specs/Text%20Formatting%20API.doc
//
//  Created:   1-2-2004 Worachai Chaoweeraprasit (wchao)
//  History:  1-19-2004 garyyang: Changing the class to internal           
//
//------------------------------------------------------------------------
 
 
using System;
using System.Security;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.TextFormatting;
using MS.Internal.Shaping;
 
namespace MS.Internal.TextFormatting
{
    /// <summary>
    /// Provide definition for a group of characters in which measuring, hittesting 
    /// and drawing of character is done as a group of glyphs.
    /// </summary>
    internal abstract class TextShapeableSymbols : TextRun
    {
        /// <summary>
        /// Compute a shaped glyph run object from specified glyph-based info
        /// </summary>
        /// <param name="origin">location relative to drawing context reference location where the glyph run is drawn</param>
        /// <param name="characterString">character string</param>
        /// <param name="clusterMap">character to glyph cluster mapping</param>
        /// <param name="glyphIndices">array of glyph indices</param>
        /// <param name="glyphAdvances">glyph advance width array</param>
        /// <param name="glyphOffsets">glyph offset array</param>
        /// <param name="rightToLeft">flag indicating whether run is drawn from right to left</param>
        /// <param name="sideways">flag indicating whether run is drawn with its side parallel to baseline</param>
        /// <returns>shaped glyph run object</returns>
        internal abstract GlyphRun ComputeShapedGlyphRun(
            Point                   origin,
            char[]                   characterString,
            ushort[]                 clusterMap,
            ushort[]                 glyphIndices,
            IList<double>            glyphAdvances,
            IList<Point>             glyphOffsets,
            bool                     rightToLeft,
            bool                     sideways
            );
 
 
        /// <summary>
        /// Return value indicates whether two runs can shape together
        /// </summary>
        /// <param name="shapeable">another run</param>
        internal abstract bool CanShapeTogether(
            TextShapeableSymbols    shapeable
            );
 
 
        /// <summary>
        /// A Boolean value indicates whether run cannot be treated as simple characters because shaping is required
        /// </summary>
        internal abstract bool IsShapingRequired
        { get; }
 
        /// <summary>
        /// This is needed to decide whether we should pass a max cluster size to LS.
        /// We pass a max cluster size to LS to perform line breaking correctly.
        /// Passing a max cluster size larger than necessary will have impact on perf.
        /// </summary>
        internal abstract bool NeedsMaxClusterSize
        { get; }
 
        /// <summary>
        /// Get the maximum cluster size that may be associated with the text. 
        /// </summary>
        internal abstract ushort MaxClusterSize
        { get; }
 
        /// <summary>
        /// A Boolean value indicates whether additional info is required for caret positioning
        /// </summary>
        internal abstract bool NeedsCaretInfo
        { get; }
 
        /// <summary>
        /// A Boolean value indicates whether run has extended character
        /// </summary>
        internal abstract bool HasExtendedCharacter
        { get; }
 
        internal abstract GlyphTypeface GlyphTypeFace
        { get; }
 
        internal abstract double EmSize
        { get; }
 
        internal abstract MS.Internal.Text.TextInterface.ItemProps ItemProps
        { get; }
 
        /// <summary>
        /// Get advance widths of unshaped characters
        /// </summary>
        /// <param name="characterString">character string</param>
        /// <param name="characterLength">character length</param>
        /// <param name="scalingFactor">scaling factor</param>
        /// <param name="advanceWidthsUnshaped">unshaped glyph advance widths</param>
        /// <remarks>The method gets glyph advances and glyph offsets in ideal values </remarks>        
        ///  <SecurityNote>
        ///    Critical: Receives unsafe pointers as parameters.
        /// </SecurityNote>
        [SecurityCritical]
        internal abstract unsafe void GetAdvanceWidthsUnshaped(
            char*         characterString,
            int           characterLength,
            double        scalingFactor,
            int*          advanceWidthsUnshaped
            );
 
 
        /// <summary>
        /// Compute unshaped glyph run object from the specified character-based info
        /// </summary>
        /// <remarks>
        /// The result of this call is guaranteed to produce a correct display result 
        /// only when IsShapingRequired property of this run is set to true.
        /// </remarks>
        /// <param name="origin">location relative to drawing context reference location where the glyph run is drawn</param>
        /// <param name="characterString">character string</param>
        /// <param name="characterAdvances">character advance values</param>
        /// <returns>display bounding box</returns> 
        /// <remarks>The method constructs glyph run with real values</remarks>
        internal abstract GlyphRun ComputeUnshapedGlyphRun(
            Point         origin,       
            char[]        characterString,
            IList<double> characterAdvances
            );
 
 
        /// <summary>
        /// Draw glyph run to the drawing surface
        /// </summary>
        /// <param name="drawingContext">drawing surface</param>
        /// <param name="foregroundBrush">
        /// Foreground brush of the glyphrun. Passing in null brush will mean the GlyphRun 
        /// is to be drawn with the Foreground of the TextRun.
        /// </param>
        /// <param name="glyphRun">glyph run object to be drawn</param>
        internal abstract void Draw(
            DrawingContext      drawingContext,
            Brush               foregroundBrush,
            GlyphRun            glyphRun
            );
 
 
        /// <summary>
        /// Run height
        /// </summary>
        internal abstract double Height
        { get; }
 
 
        /// <summary>
        /// Distance from top to baseline
        /// </summary>
        internal abstract double Baseline
        { get; }
 
 
        /// <summary>
        /// Distance from baseline to underline position relative to TextRunProperties.FontRenderingEmSize
        /// </summary>
        internal abstract double UnderlinePosition
        { get; }
 
 
        /// <summary>
        /// Underline thickness relative to TextRunProperties.FontRenderingEmSize
        /// </summary>
        internal abstract double UnderlineThickness
        { get; }
 
 
        /// <summary>
        /// Distance from baseline to strike-through position relative to TextRunProperties.FontRenderingEmSize
        /// </summary>
        internal abstract double StrikethroughPosition
        { get; }
 
 
        /// <summary>
        /// strike-through thickness relative to TextRunProperties.FontRenderingEmSize
        /// </summary>
        internal abstract double StrikethroughThickness
        { get; }
    }
}