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);

            CanvasTypographyFeatureName[] features = fontFace.GetSupportedTypographicFeatureNames(script);
            foreach (var featureName in features)
            {
                TypographyFeatureInfo featureInfo = new TypographyFeatureInfo(featureName);
                if (!TypographyOptions.Contains(featureInfo))
                {
                    TypographyOptions.Add(featureInfo);
                }
            }
        }
Пример #2
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);
            }
Пример #3
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);
            }
Пример #4
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)
            {
                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[] 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)
 {
 }
 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 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.
 }
 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.
 }
Пример #10
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);
            }
Пример #11
0
 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);
 }
Пример #12
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);
            }
Пример #13
0
 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);
 }
Пример #14
0
 public void DrawUnderline(
     Vector2 position,
     float underlineWidth, 
     float underlineThickness, 
     float underlineOffset, 
     float runHeight,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale,
     CanvasGlyphOrientation glyphOrientation)
 {
 }            
Пример #15
0
 public void DrawStrikethrough(
     Vector2 position,
     float strikethroughWidth, 
     float strikethroughThickness, 
     float strikethroughOffset,
     CanvasTextDirection textDirection,
     object brush,
     CanvasTextMeasuringMode measuringMode,
     string locale, 
     CanvasGlyphOrientation glyphOrientation)
 {
 }
Пример #16
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);
            }
Пример #17
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);
            }
Пример #18
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);
 }
Пример #19
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;
                }
            }
Пример #20
0
 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);
 }
Пример #21
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.
 }
Пример #22
0
        public void DrawGlyphRun(Vector2 point, CanvasFontFace fontFace, float fontSize, CanvasGlyph[] glyphs, bool isSideways, uint bidiLevel, object brush, CanvasTextMeasuringMode measuringMode, string localeName, string textString, int[] clusterMapIndices, uint characterIndex, CanvasGlyphOrientation glyphOrientation)
        {
            if (points == null)
            {
                Vector2 adv = Vector2.Zero;

                for (int it = 0; it < glyphs.Length; it++)
                {
                    var previousTransform = drawingSession.Transform;
                    var drawPoint         = point + adv;
                    var rotationPoint     = point + adv + new Vector2(glyphs[it].Advance / 2f, -fontSize / 4f);

                    drawingSession.Transform = Matrix3x2.CreateRotation(it * 0.01f, rotationPoint);
                    drawingSession.DrawCircle(point + adv + rotationPoint, 0.022f, Colors.Red);
                    drawingSession.DrawGlyphRun(
                        drawPoint,
                        fontFace,
                        fontSize,
                        new CanvasGlyph[] { glyphs[it] },
                        isSideways,
                        bidiLevel,
                        defaultBrush);
                    drawingSession.Transform = previousTransform;
                    adv += new Vector2(glyphs[it].Advance * Spacing, 0);
                }
            }
            else
            {
                float textLength = 0;
                foreach (var g in glyphs)
                {
                    textLength += g.Advance;
                }
                if (textLength * 3f > dists.Last())
                {
                    return;
                }


                var labelCount = MathF.Truncate(dists.Last() / (textLength * 3));
                labelCount = MathF.Truncate(MathF.Min(labelCount, MathF.Sqrt(labelCount)));
                var labelSegmentLength = dists.Last() / labelCount;

                // DEBUG
                //CanvasPathBuilder path = new CanvasPathBuilder(drawingSession);
                //path.BeginFigure(points[0]);
                //points.ToList().ForEach(p => path.AddLine(p));
                //path.EndFigure(CanvasFigureLoop.Open);
                //drawingSession.DrawGeometry(CanvasGeometry.CreatePath(path), Colors.Blue, 0.1f);
                // =====



                for (int label = 0; label < labelCount; label++)
                {
                    LinearPosition = labelSegmentLength * label + (labelSegmentLength / 2f) - (textLength / 2f);

                    Vector2 adv = Vector2.Zero;

                    for (int it = 0; it < glyphs.Length; it++)
                    {
                        var online = PositionAngleOnPoly(adv.X);

                        var drawPoint = online.pos;
                        var c         = fontSize / 4f;
                        var ox        = MathF.Cos(online.a + MathF.PI / 2f) * c;
                        var oy        = MathF.Sin(online.a + MathF.PI / 2f) * c;
                        drawPoint += new Vector2(ox, oy);

                        var rotationPoint = drawPoint;                        // + new Vector2(glyphs[it].Advance / 2f, -fontSize / 4f);

                        //drawingSession.DrawCircle(rotationPoint, 0.022f, Colors.Red);

                        var previousTransform = drawingSession.Transform;
                        drawingSession.Transform = Matrix3x2.CreateRotation(online.a, rotationPoint);
                        drawingSession.DrawGlyphRun(
                            drawPoint,
                            fontFace,
                            fontSize,
                            new CanvasGlyph[] { glyphs[it] },
                            isSideways,
                            bidiLevel,
                            defaultBrush);
                        drawingSession.Transform = previousTransform;
                        adv += new Vector2(glyphs[it].Advance * Spacing, 0);
                    }
                }
            }

            //drawingSession.DrawGlyphRun(point, fontFace, fontSize, glyphs, isSideways, bidiLevel, defaultBrush);
        }
Пример #23
0
        public void DrawGlyphRun(Vector2 point, CanvasFontFace fontFace, float fontSize, CanvasGlyph[] glyphs, bool isSideways, uint bidiLevel, object brush, CanvasTextMeasuringMode measuringMode, string localeName, string textString, int[] clusterMapIndices, uint characterIndex, CanvasGlyphOrientation glyphOrientation)
        {
            Matrix3x2 OTrans = ds.Transform;

            int i = 0;

            if (characterIndex == 0)
            {
                ds.Transform = Matrix3x2.CreateTranslation(new Vector2(-0.5f * PTextW, -R)) * Matrix3x2.CreateRotation(Offset, Origin);
                ds.DrawGlyphRun(Origin, fontFace, fontSize, new CanvasGlyph[] { glyphs[0] }, isSideways, bidiLevel, Brush);

                MovingRad = 0;
                i++;
            }

            while (i < glyphs.Length)
            {
                float TextW     = TextWidths[i + characterIndex];
                float Rad       = TextW / R;
                float OffsetRad = 0.5f * (PTextW + TextW) / R + MovingRad;

                MovingRad += Rad;

                // Stop drawing texts if ring is already crowded
                if (6.2831f < (OffsetRad + Rad))
                {
                    break;
                }

                ds.Transform = Matrix3x2.CreateTranslation(new Vector2(-0.5f * TextW, -R)) * Matrix3x2.CreateRotation(OffsetRad + Offset, Origin);
                ds.DrawGlyphRun(Origin, fontFace, fontSize, new CanvasGlyph[] { glyphs[i] }, isSideways, bidiLevel, Brush);

                i++;
            }

            ds.Transform = OTrans;
        }
Пример #24
0
 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);
 }
Пример #25
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);
            }
Пример #26
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.
 }
Пример #27
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)
            {
                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;
            }
Пример #28
0
 public void DrawStrikethrough(Vector2 point, float strikethroughWidth, float strikethroughThickness, float strikethroughOffset, CanvasTextDirection textDirection, object brush, CanvasTextMeasuringMode textMeasuringMode, string localeName, CanvasGlyphOrientation glyphOrientation)
 {
     //throw new NotImplementedException();
     ;
 }
Пример #29
0
 public void DrawUnderline(Vector2 point, float underlineWidth, float underlineThickness, float underlineOffset, float runHeight, CanvasTextDirection textDirection, object brush, CanvasTextMeasuringMode textMeasuringMode, string localeName, CanvasGlyphOrientation glyphOrientation)
 {
     //throw new NotImplementedException();
     ;
 }
            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;
                    }
                }
            }
Пример #31
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 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;
                    }
                }
            }