Exemple #1
0
            public Labeler(float f, float sd, Vector2 l, Rect tlb, float b, FontMetricsHolder.Metrics m, CanvasDrawingSession ds)
            {
                fontSize             = f;
                sizeDim              = sd;
                layoutSize           = l;
                textLayoutBounds     = tlb;
                baselineInWorldSpace = b;
                glyphRunMetrics      = m;
                drawingSession       = ds;

                horizontalMidpoint = (layoutSize.X / 2);

                leftJustifiedTextFormat = new CanvasTextFormat()
                {
                    VerticalAlignment   = CanvasVerticalAlignment.Top,
                    HorizontalAlignment = CanvasHorizontalAlignment.Left
                };
                rightJustifiedTextFormat = new CanvasTextFormat()
                {
                    VerticalAlignment   = CanvasVerticalAlignment.Top,
                    HorizontalAlignment = CanvasHorizontalAlignment.Right
                };

                NextLabel();
            }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] custerMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                CanvasGeometry geometry = CanvasGeometry.CreateGlyphRun(
                    resourceCreator,
                    position,
                    fontFace,
                    fontSize,
                    glyphs,
                    isSideways,
                    bidiLevel,
                    measuringMode,
                    glyphOrientation);

                geometries.Add(geometry);
            }
Exemple #3
0
 public void AddLine(Vector2 endPoint)
 {
     if (AreClose(endPoint.Y, (float)lineRegion.Top))
     {
         if (figureTopEdge == null)
         {
             figureTopEdge = new float[2] {
                 endPoint.X, endPoint.X
             };
         }
         else
         {
             figureTopEdge[0] = System.Math.Min(figureTopEdge[0], endPoint.X);
             figureTopEdge[1] = System.Math.Max(figureTopEdge[1], endPoint.X);
         }
     }
     else if (AreClose(endPoint.Y, (float)lineRegion.Bottom))
     {
         if (figureBottomEdge == null)
         {
             figureBottomEdge = new float[2] {
                 endPoint.X, endPoint.X
             };
         }
         else
         {
             figureBottomEdge[0] = System.Math.Min(figureBottomEdge[0], endPoint.X);
             figureBottomEdge[1] = System.Math.Max(figureBottomEdge[1], endPoint.X);
         }
     }
 }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] custerMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                if (glyphs == null)
                {
                    return;
                }

                var previousTransform = drawingSession.Transform;

                drawingSession.Transform = CanvasTextLayout.GetGlyphOrientationTransform(glyphOrientation, isSideways, position);

                drawingSession.DrawGlyphRun(
                    position,
                    fontFace,
                    fontSize,
                    glyphs,
                    isSideways,
                    bidiLevel,
                    textBrush);

                drawingSession.Transform = previousTransform;
            }
Exemple #5
0
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object customDrawingObject,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] custerMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                Metrics m = new Metrics();

                m.Ascent                = fontFace.Ascent;
                m.LineGap               = fontFace.LineGap;
                m.Descent               = fontFace.Descent;
                m.CapHeight             = fontFace.CapHeight;
                m.LowercaseLetterHeight = fontFace.LowercaseLetterHeight;

                GlyphRunMetrics.Add(m);
            }
Exemple #6
0
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] clusterMapIndices,
                uint startingTextPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                if (glyphs == null || glyphs.Length == 0)
                {
                    return;
                }

                float scaledFontAscent               = fontFace.Ascent * fontSize;
                float subscriptBaselineDropAmount    = scaledFontAscent * subscriptBaselineScale;
                float superscriptBaselineRaiseAmount = scaledFontAscent * superscriptBaselineScale;

                // Draw glyph-by-glyph.
                for (int i = 0; i < glyphs.Length; ++i)
                {
                    CanvasGlyph[] singleGlyph = new CanvasGlyph[1];
                    singleGlyph[0] = glyphs[i];

                    Vector2 positionForThisGlyph = position;

                    CustomBrushData brushData = (CustomBrushData)brush;
                    if (brushData != null)
                    {
                        if (brushData.BaselineAdjustment == CustomBrushData.BaselineAdjustmentType.Lower)
                        {
                            positionForThisGlyph.Y += subscriptBaselineDropAmount;
                        }
                        else if (brushData.BaselineAdjustment == CustomBrushData.BaselineAdjustmentType.Raise)
                        {
                            positionForThisGlyph.Y -= superscriptBaselineRaiseAmount;
                        }
                    }

                    DrawingSession.DrawGlyphRun(
                        positionForThisGlyph,
                        fontFace,
                        fontSize,
                        singleGlyph,
                        isSideways,
                        bidiLevel,
                        TextBrush);

                    position.X += glyphs[i].Advance;
                }
            }
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
 }
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
     // There aren't any inline objects in this sample.
 }
Exemple #9
0
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
     // This sample doesn't use inline objects.
 }
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth,
     float strikethroughThickness,
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
 }
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth,
     float underlineThickness,
     float underlineOffset,
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
 }
Exemple #12
0
        public void Vector2WinRTInteropTest()
        {
            Vector2 a = new Vector2(23, 42);

            Microsoft.Graphics.Canvas.Numerics.Vector2 b = a;

            Assert.AreEqual(a.X, b.X);
            Assert.AreEqual(a.Y, b.Y);

            Vector2 c = b;

            Assert.AreEqual(a, c);
        }
Exemple #13
0
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth,
     float strikethroughThickness,
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     // Normally, we'd add strikethrough support here. Strikethrough isn't used by this demo.
 }
            private Rect GetLineRectangle(
                Vector2 position,
                float lineWidth,
                float lineThickness,
                float lineOffset,
                CanvasGlyphOrientation glyphOrientation)
            {
                Rect rect = new Rect(0, lineOffset, lineWidth, lineThickness);

                rect    = RotateRectangle(rect, glyphOrientation);
                rect.X += position.X;
                rect.Y += position.Y;
                return(rect);
            }
Exemple #15
0
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth,
     float underlineThickness,
     float underlineOffset,
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     // Normally, we'd add underline support here. Underline isn't used by this demo.
 }
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth,
     float strikethroughThickness,
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     drawingSession.FillRectangle(
         GetLineRectangle(position, strikethroughWidth, strikethroughThickness, strikethroughOffset, glyphOrientation),
         textBrush);
 }
            public void DrawStrikethrough(
                Vector2 position,
                float strikethroughWidth,
                float strikethroughThickness,
                float strikethroughOffset,
                CanvasTextDirection textDirection,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = GetTransformedRectangle(strikethroughWidth, strikethroughThickness, strikethroughOffset, position, glyphOrientation);

                geometries.Add(geometry);
            }
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth,
     float underlineThickness,
     float underlineOffset,
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     drawingSession.FillRectangle(
         GetLineRectangle(position, underlineWidth, underlineThickness, underlineOffset, glyphOrientation),
         textBrush);
 }
            public void DrawUnderline(
                Vector2 position,
                float underlineWidth,
                float underlineThickness,
                float underlineOffset,
                float runHeight,
                CanvasTextDirection textDirection,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = GetTransformedRectangle(underlineWidth, underlineThickness, underlineOffset, position, glyphOrientation);

                geometries.Add(geometry);
            }
            private CanvasGeometry GetTransformedRectangle(
                float width,
                float thickness,
                float offset,
                Vector2 position,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = CanvasGeometry.CreateRectangle(
                    resourceCreator,
                    new Rect(0, offset, width, thickness));

                var rotate    = System.Numerics.Matrix3x2.CreateRotation(GetGlyphOrientationInRadians(glyphOrientation));
                var translate = System.Numerics.Matrix3x2.CreateTranslation(position);

                return(geometry.Transform(rotate * translate));
            }
Exemple #21
0
            public void BeginFigure(Vector2 point, CanvasFigureFill fill)
            {
                figureTopEdge    = null;
                figureBottomEdge = null;

                if (AreClose(point.Y, (float)lineRegion.Top))
                {
                    figureTopEdge = new float[2] {
                        point.X, point.X
                    };
                }
                else if (AreClose(point.Y, (float)lineRegion.Bottom))
                {
                    figureBottomEdge = new float[2] {
                        point.X, point.X
                    };
                }
            }
Exemple #22
0
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
 }
Exemple #23
0
            public Labeler(float f, float sd, Vector2 l, Rect tlb, float b, FontMetricsHolder.Metrics m, CanvasDrawingSession ds)
            {
                fontSize = f;
                sizeDim = sd;
                layoutSize = l;
                textLayoutBounds = tlb;
                baselineInWorldSpace = b;
                glyphRunMetrics = m;
                drawingSession = ds;

                horizontalMidpoint = (layoutSize.X / 2);

                leftJustifiedTextFormat = new CanvasTextFormat()
                {
                    VerticalAlignment = CanvasVerticalAlignment.Top,
                    HorizontalAlignment = CanvasHorizontalAlignment.Left
                };
                rightJustifiedTextFormat = new CanvasTextFormat()
                {
                    VerticalAlignment = CanvasVerticalAlignment.Top,
                    HorizontalAlignment = CanvasHorizontalAlignment.Right
                };

                NextLabel();
            }
Exemple #24
0
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth, 
     float strikethroughThickness, 
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale, 
     CanvasGlyphOrientation glyphOrientation)
 {
 }
Exemple #25
0
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth, 
     float underlineThickness, 
     float underlineOffset, 
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
 }            
Exemple #26
0
 public static void DrawBaseline(CanvasDrawingSession ds, Vector2 layoutSize, float baselineInWorldSpace)
 {
     ds.DrawLine(0, baselineInWorldSpace, layoutSize.X, baselineInWorldSpace, Colors.LightGreen, strokeWidth * 2, dashedStroke);
     ds.DrawText("baseline", 100, baselineInWorldSpace, Colors.LightGreen);
 }
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
     // This sample doesn't use inline objects.
 }
 public void Draw(ICanvasTextRenderer renderer, Vector2 position, bool isSideways, bool isRightToLeft, object brush)
 {
     currentDrawingSession.DrawImage(resourceBitmap, new Rect(position.X, position.Y, size, size));
 }
Exemple #29
0
            private CanvasGeometry GetTransformedRectangle(
                float width,
                float thickness,
                float offset,
                Vector2 position,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = CanvasGeometry.CreateRectangle(
                    resourceCreator,
                    new Rect(0, offset, width, thickness));

                var rotate = System.Numerics.Matrix3x2.CreateRotation(GetGlyphOrientationInRadians(glyphOrientation));
                var translate = System.Numerics.Matrix3x2.CreateTranslation(position);

                return geometry.Transform(rotate * translate);
            }
Exemple #30
0
 /// <summary></summary>
 public void DrawGradientMesh(Microsoft.Graphics.Canvas.Geometry.CanvasGradientMesh gradientMesh, Microsoft.Graphics.Canvas.Numerics.Vector2 offset)
 {
     throw new System.NotImplementedException();
 }
Exemple #31
0
 public static void DrawBaseline(CanvasDrawingSession ds, Vector2 layoutSize, float baselineInWorldSpace)
 {
     ds.DrawLine(0, baselineInWorldSpace, layoutSize.X, baselineInWorldSpace, Colors.LightGreen, strokeWidth * 2, dashedStroke);
     ds.DrawText("baseline", 100, baselineInWorldSpace, Colors.LightGreen);
 }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] custerMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                if (glyphs == null)
                    return;

                var previousTransform = drawingSession.Transform;

                drawingSession.Transform = CanvasTextLayout.GetGlyphOrientationTransform(glyphOrientation, isSideways, position);

                drawingSession.DrawGlyphRun(
                    position,
                    fontFace,
                    fontSize,
                    glyphs,
                    isSideways,
                    bidiLevel,
                    textBrush);

                drawingSession.Transform = previousTransform;
            }
Exemple #33
0
 public void DrawGlyphRun(
     Vector2 position,
     CanvasFontFace fontFace,
     float fontSize,
     CanvasGlyph[] glyphs,
     bool isSideways,
     uint bidiLevel,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     string textString,
     int[] custerMapIndices,
     uint textPosition,
     CanvasGlyphOrientation glyphOrientation)
 {
     CanvasGeometry geometry = CanvasGeometry.CreateGlyphRun(
         resourceCreator,
         position,
         fontFace,
         fontSize,
         glyphs,
         isSideways,
         bidiLevel,
         measuringMode,
         glyphOrientation);
     geometries.Add(geometry);
 }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] clusterMapIndices,
                uint startingTextPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                if (glyphs == null || glyphs.Length == 0)
                    return;

                float scaledFontAscent = fontFace.Ascent * fontSize;
                float subscriptBaselineDropAmount = scaledFontAscent * subscriptBaselineScale;
                float superscriptBaselineRaiseAmount = scaledFontAscent * superscriptBaselineScale;

                // Draw glyph-by-glyph.
                for (int i = 0; i < glyphs.Length; ++i)
                {
                    CanvasGlyph[] singleGlyph = new CanvasGlyph[1];
                    singleGlyph[0] = glyphs[i];

                    Vector2 positionForThisGlyph = position;

                    CustomBrushData brushData = (CustomBrushData)brush;
                    if (brushData != null)
                    {
                        if (brushData.BaselineAdjustment == CustomBrushData.BaselineAdjustmentType.Lower)
                        {
                            positionForThisGlyph.Y += subscriptBaselineDropAmount;
                        }
                        else if (brushData.BaselineAdjustment == CustomBrushData.BaselineAdjustmentType.Raise)
                        {
                            positionForThisGlyph.Y -= superscriptBaselineRaiseAmount;
                        }
                    }

                    DrawingSession.DrawGlyphRun(
                        positionForThisGlyph,
                        fontFace,
                        fontSize,
                        singleGlyph,
                        isSideways,
                        bidiLevel,
                        TextBrush);

                    position.X += glyphs[i].Advance;
                }
            }
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth,
     float strikethroughThickness,
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     // Normally, we'd add strikethrough support here. Strikethrough isn't used by this demo.
 }
 private Rect GetLineRectangle(
     Vector2 position,
     float lineWidth,
     float lineThickness,
     float lineOffset,
     CanvasGlyphOrientation glyphOrientation)
 {
     Rect rect = new Rect(0, lineOffset, lineWidth, lineThickness);
     rect = RotateRectangle(rect, glyphOrientation);
     rect.X += position.X;
     rect.Y += position.Y;
     return rect;
 }
Exemple #37
0
            public void DrawStrikethrough(
                Vector2 position,
                float strikethroughWidth,
                float strikethroughThickness,
                float strikethroughOffset,
                CanvasTextDirection textDirection,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = GetTransformedRectangle(strikethroughWidth, strikethroughThickness, strikethroughOffset, position, glyphOrientation);

                geometries.Add(geometry);
            }
Exemple #38
0
 public void AddArc(Vector2 point, float x, float y, float z, CanvasSweepDirection sweepDirection, CanvasArcSize arcSize)
 {
     throw new NotSupportedException("This is never called, since we use CanvasGeometrySimplification.Lines on the geometry.");
 }
Exemple #39
0
 public void Draw(ICanvasTextRenderer renderer, Vector2 position, bool isSideways, bool isRightToLeft, object brush)
 {
     currentDrawingSession.DrawImage(resourceBitmap, new Rect(position.X, position.Y, size, size));
 }
Exemple #40
0
            public void DrawUnderline(
                Vector2 position,
                float underlineWidth,
                float underlineThickness,
                float underlineOffset,
                float runHeight,
                CanvasTextDirection textDirection,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                CanvasGlyphOrientation glyphOrientation)
            {
                var geometry = GetTransformedRectangle(underlineWidth, underlineThickness, underlineOffset, position, glyphOrientation);

                geometries.Add(geometry);
            }
Exemple #41
0
 public void AddQuadraticBezier(Vector2 controlPoint, Vector2 endPoint)
 {
     throw new NotSupportedException("This is never called, since we use CanvasGeometrySimplification.Lines on the geometry.");
 }
Exemple #42
0
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace, 
                float fontSize, 
                CanvasGlyph[] glyphs, 
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode, 
                string locale, 
                string textString, 
                int[] custerMapIndices, 
                uint textPosition, 
                CanvasGlyphOrientation glyphOrientation)
            {
                Metrics m = new Metrics();
                m.Ascent = fontFace.Ascent;
                m.LineGap = fontFace.LineGap;
                m.Descent = fontFace.Descent;
                m.CapHeight = fontFace.CapHeight;
                m.LowercaseLetterHeight = fontFace.LowercaseLetterHeight;
                m.Bounds = fontFace.GetGlyphRunBounds(
                    drawingSession,
                    position,
                    fontSize,
                    glyphs,
                    isSideways,
                    bidiLevel);

                GlyphRunMetrics.Add(m);
            }
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth,
     float strikethroughThickness,
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     drawingSession.FillRectangle(
         GetLineRectangle(position, strikethroughWidth, strikethroughThickness, strikethroughOffset, glyphOrientation),
         textBrush);
 }
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth,
     float underlineThickness,
     float underlineOffset,
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     // Normally, we'd add underline support here. Underline isn't used by this demo.
 }
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth,
     float underlineThickness,
     float underlineOffset,
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
     drawingSession.FillRectangle(
         GetLineRectangle(position, underlineWidth, underlineThickness, underlineOffset, glyphOrientation),
         textBrush);
 }
 public void DrawInlineObject(
     Vector2 baselineOrigin,
     ICanvasTextInlineObject inlineObject,
     bool isSideways,
     bool isRightToLeft,
     object brush,
     CanvasGlyphOrientation glyphOrientation)
 {
     // There aren't any inline objects in this sample.
 }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] clusterMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                var script = GetScript(textPosition);

                if (CurrentMode == Mode.BuildTypographyList)
                {
                    CanvasTypographyFeatureName[] features = fontFace.GetSupportedTypographicFeatureNames(script);

                    foreach (var featureName in features)
                    {
                        TypographyFeatureInfo featureInfo = new TypographyFeatureInfo(featureName);

                        if (!TypographyOptions.Contains(featureInfo))
                        {
                            TypographyOptions.Add(featureInfo);
                        }
                    }
                }
                else
                {
                    if (glyphs == null || glyphs.Length == 0)
                    {
                        return;
                    }
                    //
                    // This demo handles only simple Latin text with no diacritical
                    // markers or ligatures, so we can make assumptions about the
                    // mapping of text positions to glyph indices. This works fine for
                    // the sake of this example.
                    //
                    // In general, apps should use the cluster map to map text
                    // positions to glyphs while knowing that glyph substitution can happen
                    // for reasons besides typography.
                    //
                    uint[] codePoints = new uint[glyphs.Length];
                    for (int i = 0; i < glyphs.Length; i++)
                    {
                        int glyphTextPosition = 0;
                        for (int j = 0; j < clusterMapIndices.Length; j++)
                        {
                            if (clusterMapIndices[j] == i)
                            {
                                glyphTextPosition = j;
                                break;
                            }
                        }
                        codePoints[i] = textString[glyphTextPosition];
                    }
                    int[] nominalGlyphIndices = fontFace.GetGlyphIndices(codePoints);

                    CanvasGlyph[] unsubstitutedGlyphs = new CanvasGlyph[glyphs.Length];
                    for (int i = 0; i < glyphs.Length; i++)
                    {
                        unsubstitutedGlyphs[i]       = glyphs[i];
                        unsubstitutedGlyphs[i].Index = nominalGlyphIndices[i];
                    }

                    bool[] eligible = fontFace.GetTypographicFeatureGlyphSupport(script, FeatureToHighlight, unsubstitutedGlyphs);

                    var highlightBrush = new CanvasSolidColorBrush(currentDrawingSession, Colors.Yellow);

                    for (int i = 0; i < glyphs.Length; ++i)
                    {
                        if (eligible[i])
                        {
                            CanvasGlyph[] singleGlyph = new CanvasGlyph[1];
                            singleGlyph[0] = glyphs[i];

                            currentDrawingSession.DrawGlyphRun(
                                position,
                                fontFace,
                                fontSize,
                                singleGlyph,
                                isSideways,
                                bidiLevel,
                                highlightBrush);
                        }

                        position.X += glyphs[i].Advance;
                    }
                }
            }
            public void DrawGlyphRun(
                Vector2 position,
                CanvasFontFace fontFace,
                float fontSize,
                CanvasGlyph[] glyphs,
                bool isSideways,
                uint bidiLevel,
                object brush,
                CanvasTextMeasuringMode measuringMode,
                string locale,
                string textString,
                int[] clusterMapIndices,
                uint textPosition,
                CanvasGlyphOrientation glyphOrientation)
            {
                var script = GetScript(textPosition);

                if (CurrentMode == Mode.BuildTypographyList)
                {
                    CanvasTypographyFeatureName[] features = fontFace.GetSupportedTypographicFeatureNames(script);

                    foreach (var featureName in features)
                    {
                        TypographyFeatureInfo featureInfo = new TypographyFeatureInfo(featureName);

                        if (!TypographyOptions.Contains(featureInfo))
                        {
                            TypographyOptions.Add(featureInfo);
                        }
                    }
                }
                else
                {
                    if (glyphs == null || glyphs.Length == 0)
                        return;
                    //
                    // This demo handles only simple Latin text with no diacritical
                    // markers or ligatures, so we can make assumptions about the 
                    // mapping of text positions to glyph indices. This works fine for
                    // the sake of this example.
                    //
                    // In general, apps should use the cluster map to map text 
                    // positions to glyphs while knowing that glyph substitution can happen 
                    // for reasons besides typography.
                    //
                    uint[] codePoints = new uint[glyphs.Length];
                    for (int i = 0; i < glyphs.Length; i++)
                    {
                        int glyphTextPosition = 0;
                        for (int j=0; j<clusterMapIndices.Length; j++)
                        {
                            if (clusterMapIndices[j] == i)
                            {
                                glyphTextPosition = j;
                                break;
                            }
                        }
                        codePoints[i] = textString[glyphTextPosition];
                    }
                    int[] nominalGlyphIndices = fontFace.GetGlyphIndices(codePoints);

                    CanvasGlyph[] unsubstitutedGlyphs = new CanvasGlyph[glyphs.Length];
                    for (int i = 0; i < glyphs.Length; i++)
                    {
                        unsubstitutedGlyphs[i] = glyphs[i];
                        unsubstitutedGlyphs[i].Index = nominalGlyphIndices[i];
                    }

                    bool[] eligible = fontFace.GetTypographicFeatureGlyphSupport(script, FeatureToHighlight, unsubstitutedGlyphs);

                    var highlightBrush = new CanvasSolidColorBrush(currentDrawingSession, Colors.Yellow);

                    for (int i = 0; i < glyphs.Length; ++i)
                    {
                        if (eligible[i])
                        {
                            CanvasGlyph[] singleGlyph = new CanvasGlyph[1];
                            singleGlyph[0] = glyphs[i];

                            currentDrawingSession.DrawGlyphRun(
                                position,
                                fontFace,
                                fontSize,
                                singleGlyph,
                                isSideways,
                                bidiLevel,
                                highlightBrush);
                        }

                        position.X += glyphs[i].Advance;
                    }
                }
            }