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); }
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; }
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); }
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. }
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) { }
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); }
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); }
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)); }
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 }; } }
public void DrawInlineObject( Vector2 baselineOrigin, ICanvasTextInlineObject inlineObject, bool isSideways, bool isRightToLeft, object brush, CanvasGlyphOrientation glyphOrientation) { }
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 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) { }
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)); }
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); }
/// <summary></summary> public void DrawGradientMesh(Microsoft.Graphics.Canvas.Geometry.CanvasGradientMesh gradientMesh, Microsoft.Graphics.Canvas.Numerics.Vector2 offset) { throw new System.NotImplementedException(); }
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; }
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; }
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 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."); }
public void Draw(ICanvasTextRenderer renderer, Vector2 position, bool isSideways, bool isRightToLeft, object brush) { currentDrawingSession.DrawImage(resourceBitmap, new Rect(position.X, position.Y, size, size)); }
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); }
public void AddQuadraticBezier(Vector2 controlPoint, Vector2 endPoint) { throw new NotSupportedException("This is never called, since we use CanvasGeometrySimplification.Lines on the 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[] 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; } } }