public Outline GetTextOutline(string[] lines, ref Outline.Point position, HorizontalJustification h, VerticalJustification v, bool useKerning, float interline) { //int nblines = lines.Length; // total cbox BBox bbox = Measure(lines, interline); float startY = 0; switch (v) { case VerticalJustification.Origin: startY = position.Y; break; case VerticalJustification.Top: startY = position.Y - bbox.yMax; break; case VerticalJustification.Bottom: startY = position.Y - bbox.yMin; break; case VerticalJustification.Center: startY = position.Y + (bbox.yMax - bbox.yMin) / 2 - bbox.yMax; break; } Outline outline = new Outline(); Outline.Point pos = new Outline.Point(); foreach (string line in lines) { pos.X = position.X; pos.Y = startY; Outline o = GetStringOutline(line, ref pos, h, VerticalJustification.Origin, useKerning); outline.AddOutline(o); startY -= Height * interline; } return(outline); }
public Outline GetTextOutline(string[] lines, ref Outline.Point position, HorizontalJustification h, VerticalJustification v, bool useKerning, float interline) { //int nblines = lines.Length; // total cbox BBox bbox = Measure(lines, interline); float startY = 0; switch (v) { case VerticalJustification.Origin: startY = position.Y; break; case VerticalJustification.Top: startY = position.Y - bbox.yMax; break; case VerticalJustification.Bottom: startY = position.Y - bbox.yMin; break; case VerticalJustification.Center: startY = position.Y + (bbox.yMax - bbox.yMin) / 2 - bbox.yMax; break; } Outline outline = new Outline(); Outline.Point pos = new Outline.Point(); foreach (string line in lines) { pos.X = position.X; pos.Y = startY; Outline o = GetStringOutline(line, ref pos, h, VerticalJustification.Origin, useKerning); outline.AddOutline(o); startY -= Height * interline; } return outline; }
// Compute the outline for a whole line public Outline GetStringOutline(string txt, ref Outline.Point position, HorizontalJustification h, VerticalJustification v, bool useKerning, float spacing, float emboldStrenght, int isteps) { Outline res = new Outline(); // first set pen position according to requested text justification if (h != HorizontalJustification.Origin || v != VerticalJustification.Origin) { // Compute Bounding box and set original advancement according to justification BBox bbox = Measure(txt); switch (h) { case HorizontalJustification.Left: position.X = position.X - bbox.xMin; break; case HorizontalJustification.Right: position.X = position.X - bbox.xMax; break; case HorizontalJustification.Center: position.X = position.X - (bbox.xMin + bbox.xMax) / 2; break; } switch (v) { case VerticalJustification.Top: position.Y = position.Y - bbox.yMax; break; case VerticalJustification.Bottom: position.Y = position.Y - bbox.yMin; break; case VerticalJustification.Center: position.Y = position.Y - (bbox.yMin + bbox.yMax) / 2; break; } } // Console.WriteLine("Original pen position=" + position); if (!HasKerning) { useKerning = false; } uint prev = 0; for (int i = 0; i < txt.Length; ++i) { uint idx = (uint)FT.FT_Get_Char_Index(face_, txt[i]); if (useKerning && prev != 0 && idx != 0) // adjust with kerning properties { position.Translate(GetKerning((uint)prev, idx)); } Outline.Point adv; Outline o = GetGlyphOutline(idx, out adv, true, emboldStrenght, isteps); o.Translate(position); res.AddOutline(o); adv.Scale(spacing); position.Translate(adv); prev = idx; } /* * foreach (char c in txt) * { * Outline.Point adv; * Outline o = GetGlyphOutline(c, out adv, true); * o.Translate(advance); * res.AddOutline(o); * advance.Translate(adv); * } */ return(res); }
// Compute the outline for a whole line public Outline GetStringOutline(string txt, ref Outline.Point position, HorizontalJustification h, VerticalJustification v, bool useKerning, float spacing, float emboldStrenght, int isteps) { Outline res = new Outline(); // first set pen position according to requested text justification if (h != HorizontalJustification.Origin || v != VerticalJustification.Origin) { // Compute Bounding box and set original advancement according to justification BBox bbox = Measure(txt); switch (h) { case HorizontalJustification.Left: position.X = position.X - bbox.xMin; break; case HorizontalJustification.Right: position.X = position.X - bbox.xMax; break; case HorizontalJustification.Center: position.X = position.X - (bbox.xMin + bbox.xMax) / 2; break; } switch (v) { case VerticalJustification.Top: position.Y = position.Y -bbox.yMax; break; case VerticalJustification.Bottom: position.Y = position.Y -bbox.yMin; break; case VerticalJustification.Center: position.Y = position.Y -(bbox.yMin + bbox.yMax) / 2; break; } } // Console.WriteLine("Original pen position=" + position); if (! HasKerning) { useKerning = false; } int prev = 0; for (int i = 0; i < txt.Length; ++i) { int idx = FT.FT_Get_Char_Index(face_, txt[i]); if (useKerning && prev != 0 && idx != 0) // adjust with kerning properties { position.Translate(GetKerning(prev, idx)); } Outline.Point adv; Outline o = GetGlyphOutline(idx, out adv, true, emboldStrenght,isteps); o.Translate(position); res.AddOutline(o); adv.Scale(spacing); position.Translate(adv); prev = idx; } /* foreach (char c in txt) { Outline.Point adv; Outline o = GetGlyphOutline(c, out adv, true); o.Translate(advance); res.AddOutline(o); advance.Translate(adv); } */ return res; }