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); } } }
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[] 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 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. }
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 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) { var geometry = GetTransformedRectangle(underlineWidth, underlineThickness, underlineOffset, 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 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 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); }
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; }
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 DrawStrikethrough(Vector2 point, float strikethroughWidth, float strikethroughThickness, float strikethroughOffset, CanvasTextDirection textDirection, object brush, CanvasTextMeasuringMode textMeasuringMode, string localeName, CanvasGlyphOrientation glyphOrientation) { //throw new NotImplementedException(); ; }
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; } } }
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; } } }