public override SpriteFontContent Process(Texture2DContent input, ContentProcessorContext context) { var output = new SpriteFontContent(); // extract the glyphs from the texture and map them to a list of characters. // we need to call GtCharacterForIndex for each glyph in the Texture to // get the char for that glyph, by default we start at ' ' then '!' and then ASCII // after that. var systemBitmap = input.Faces[0][0].ToSystemBitmap(); int linespacing = 0; var glyphs = ExtractGlyphs(systemBitmap, out linespacing); // Optimize. foreach (Glyph glyph in glyphs) { GlyphCropper.Crop(glyph); } systemBitmap.Dispose(); systemBitmap = GlyphPacker.ArrangeGlyphs(glyphs.ToArray(), true, true); foreach (Glyph glyph in glyphs) { glyph.XAdvance += linespacing; if (!output.CharacterMap.Contains(glyph.Character)) { output.CharacterMap.Add(glyph.Character); } output.Glyphs.Add(new Rectangle(glyph.Subrect.X, glyph.Subrect.Y, glyph.Subrect.Width, glyph.Subrect.Height)); output.Cropping.Add(new Rectangle(0, 0, glyph.Subrect.Width, glyph.Subrect.Height)); ABCFloat abc = glyph.CharacterWidths; output.Kerning.Add(new Vector3(abc.A, abc.B, abc.C)); } output.Texture.Faces.Add(new MipmapChain(systemBitmap.ToXnaBitmap(true))); systemBitmap.Dispose(); GraphicsUtil.CompressTexture(context.TargetProfile, output.Texture, context, false, false, false); return(output); }
// This only handles one character for right now internal static void GetCharABCWidthsFloat(char characters, CTFont font, out ABCFloat[] abc) { var atts = buildAttributedString(characters.ToString(), font); // for now just a line not sure if this is going to work CTLine line = new CTLine(atts); #if IOS nfloat ascent = 0.0f; nfloat descent = 0.0f; nfloat leading = 0.0f; #else var ascent = 0.0f; var descent = 0.0f; var leading = 0.0f; #endif abc = new ABCFloat[1]; abc[0].abcfB = (float)line.GetTypographicBounds(out ascent, out descent, out leading); abc [0].abcfB += (float)leading; }
private static extern int GetCharABCWidthsFloatW(IntPtr dc, uint iFirstChar, uint iLastChar, out ABCFloat abcFloat);
private static void GetKerningInfo(CCRawList <char> charset) { _abcValues.Clear(); var fontFace = new FontFace(_currentFont); var value = new ABCFloat[1]; var glyphRun = new GlyphRun(); glyphRun.FontFace = fontFace; glyphRun.FontSize = _currentDIP; var BrushColor = SharpDX.Color.White; /* * SharpDX.DirectWrite.Matrix mtrx = new SharpDX.DirectWrite.Matrix(); * mtrx.M11 = 1F; * mtrx.M12 = 0; * mtrx.M21 = 0; * mtrx.M22 = 1F; * mtrx.Dx = 0; * mtrx.Dy = 0; */ //GlyphMetrics[] metrics = fontFace.GetGdiCompatibleGlyphMetrics(23, 1, mtrx, false, glyphIndices, false); //FontMetrics metr = fontFace.GetGdiCompatibleMetrics(23, 1, new SharpDX.DirectWrite.Matrix()); //_pRenderTarget.DrawGlyphRun(new SharpDX.DrawingPointF(left, top), glyphRun, new SharpDX.Direct2D1.SolidColorBrush(_pRenderTarget, BrushColor), MeasuringMode.GdiClassic); int[] codePoints = new int[1]; var unitsPerEm = fontFace.Metrics.DesignUnitsPerEm; var familyName = _currentFont.ToString(); for (int i = 0; i < charset.Count; i++) { var ch = charset[i]; if (!_abcValues.ContainsKey(ch)) { var textLayout = new TextLayout(FactoryDWrite, ch.ToString(), textFormat, unitsPerEm, unitsPerEm); var tlMetrics = textLayout.Metrics; var tlmWidth = tlMetrics.Width; var tllWidth = tlMetrics.LayoutWidth; codePoints[0] = (int)ch; short[] glyphIndices = fontFace.GetGlyphIndices(codePoints); glyphRun.Indices = glyphIndices; var metrics = fontFace.GetDesignGlyphMetrics(glyphIndices, false); //var width = metrics[0].AdvanceWidth + metrics[0].LeftSideBearing + metrics[0].RightSideBearing; //var glyphWidth = _currentFontSizeEm * (float)metrics[0].AdvanceWidth / unitsPerEm; //var abcWidth = _currentDIP * (float)width / unitsPerEm; //value[0].abcfA = _currentFontSizeEm * (float)metrics[0].LeftSideBearing / unitsPerEm; //value[0].abcfB = _currentFontSizeEm * (float)metrics[0].AdvanceWidth / unitsPerEm; //value[0].abcfC = _currentFontSizeEm * (float)metrics[0].RightSideBearing / unitsPerEm; // The A and C values are throwing the spacing off //value[0].abcfA = _currentDIP * (float)metrics[0].LeftSideBearing / unitsPerEm; value[0].abcfB = _currentDIP * (float)metrics[0].AdvanceWidth / unitsPerEm; //value[0].abcfC = _currentDIP * (float)metrics[0].RightSideBearing / unitsPerEm; _abcValues.Add( ch, new KerningInfo() { A = value[0].abcfA, B = value[0].abcfB, C = value[0].abcfC }); } } }
private static void GetKerningInfo(CCRawList<char> charset) { _abcValues.Clear(); var fontFace = new FontFace(_currentFont); var value = new ABCFloat[1]; var glyphRun = new GlyphRun(); glyphRun.FontFace = fontFace; glyphRun.FontSize = _currentDIP; var BrushColor = SharpDX.Color.White; /* SharpDX.DirectWrite.Matrix mtrx = new SharpDX.DirectWrite.Matrix(); mtrx.M11 = 1F; mtrx.M12 = 0; mtrx.M21 = 0; mtrx.M22 = 1F; mtrx.Dx = 0; mtrx.Dy = 0; */ //GlyphMetrics[] metrics = fontFace.GetGdiCompatibleGlyphMetrics(23, 1, mtrx, false, glyphIndices, false); //FontMetrics metr = fontFace.GetGdiCompatibleMetrics(23, 1, new SharpDX.DirectWrite.Matrix()); //_pRenderTarget.DrawGlyphRun(new SharpDX.DrawingPointF(left, top), glyphRun, new SharpDX.Direct2D1.SolidColorBrush(_pRenderTarget, BrushColor), MeasuringMode.GdiClassic); int[] codePoints = new int[1]; var unitsPerEm = fontFace.Metrics.DesignUnitsPerEm; var familyName = _currentFont.ToString(); for (int i = 0; i < charset.Count; i++) { var ch = charset[i]; if (!_abcValues.ContainsKey(ch)) { var textLayout = new TextLayout(FactoryDWrite, ch.ToString(), textFormat, unitsPerEm, unitsPerEm); var tlMetrics = textLayout.Metrics; var tlmWidth = tlMetrics.Width; var tllWidth = tlMetrics.LayoutWidth; codePoints[0] = (int)ch; short[] glyphIndices = fontFace.GetGlyphIndices(codePoints); glyphRun.Indices = glyphIndices; var metrics = fontFace.GetDesignGlyphMetrics(glyphIndices, false); //var width = metrics[0].AdvanceWidth + metrics[0].LeftSideBearing + metrics[0].RightSideBearing; //var glyphWidth = _currentFontSizeEm * (float)metrics[0].AdvanceWidth / unitsPerEm; //var abcWidth = _currentDIP * (float)width / unitsPerEm; //value[0].abcfA = _currentFontSizeEm * (float)metrics[0].LeftSideBearing / unitsPerEm; //value[0].abcfB = _currentFontSizeEm * (float)metrics[0].AdvanceWidth / unitsPerEm; //value[0].abcfC = _currentFontSizeEm * (float)metrics[0].RightSideBearing / unitsPerEm; // The A and C values are throwing the spacing off //value[0].abcfA = _currentDIP * (float)metrics[0].LeftSideBearing / unitsPerEm; value[0].abcfB = _currentDIP * (float)metrics[0].AdvanceWidth / unitsPerEm; //value[0].abcfC = _currentDIP * (float)metrics[0].RightSideBearing / unitsPerEm; _abcValues.Add( ch, new KerningInfo() { A = value[0].abcfA, B = value[0].abcfB, C = value[0].abcfC }); } } }
private static void GetKerningInfo(CCRawList<char> charset) { _abcValues.Clear(); var hDC = CreateCompatibleDC(IntPtr.Zero); var hFont = _currentFont.ToHfont(); SelectObject(hDC, hFont); var value = new ABCFloat[1]; for (int i = 0; i < charset.Count; i++) { var ch = charset[i]; if (!_abcValues.ContainsKey(ch)) { GetCharABCWidthsFloat(hDC, ch, ch, value); _abcValues.Add( ch, new KerningInfo() { A = value[0].abcfA, B = value[0].abcfB, C = value[0].abcfC }); } } DeleteObject(hFont); ReleaseDC(IntPtr.Zero, hDC); }
public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context) { var output = new SpriteFontContent(input); var fontName = input.FontName; #if WINDOWS var windowsfolder = Environment.GetFolderPath(Environment.SpecialFolder.Windows); var fontDirectory = Path.Combine(windowsfolder, "Fonts"); fontName = FindFontFileFromFontName(fontName, fontDirectory); if (string.IsNullOrWhiteSpace(fontName)) { fontName = input.FontName; #endif var directory = Path.GetDirectoryName(input.Identity.SourceFilename); var directories = new string[] { directory, "/Library/Fonts", #if WINDOWS fontDirectory, #endif } ; foreach (var dir in directories) { if (File.Exists(Path.Combine(dir, fontName + ".ttf"))) { fontName += ".ttf"; directory = dir; break; } if (File.Exists(Path.Combine(dir, fontName + ".ttc"))) { fontName += ".ttc"; directory = dir; break; } if (File.Exists(Path.Combine(dir, fontName + ".otf"))) { fontName += ".otf"; directory = dir; break; } } fontName = Path.Combine(directory, fontName); #if WINDOWS } #endif context.Logger.LogMessage("Building Font {0}", fontName); try { if (!File.Exists(fontName)) { throw new Exception(string.Format("Could not load {0}", fontName)); } var lineSpacing = 0f; var glyphs = ImportFont(input, out lineSpacing, context, fontName); // Optimize. foreach (Glyph glyph in glyphs) { GlyphCropper.Crop(glyph); } Bitmap outputBitmap = GlyphPacker.ArrangeGlyphs(glyphs, true, true); //outputBitmap.Save ("/Users/Jimmy/Desktop/Cocos2D-XNAImages/fontglyphs.png"); // Adjust line and character spacing. lineSpacing += input.Spacing; foreach (Glyph glyph in glyphs) { glyph.XAdvance += input.Spacing; if (!output.CharacterMap.Contains(glyph.Character)) { output.CharacterMap.Add(glyph.Character); } output.Glyphs.Add(new Rectangle(glyph.Subrect.X, glyph.Subrect.Y, glyph.Subrect.Width, glyph.Subrect.Height)); output.Cropping.Add(new Rectangle(0, (int)(glyph.YOffset + glyphs.Select(x => x.YOffset).Max()), glyph.Subrect.Width, glyph.Subrect.Height)); ABCFloat abc = glyph.CharacterWidths; output.Kerning.Add(new Vector3(abc.A, abc.B, abc.C)); } // outputBitmap.Save("/Users/Jimmy/Desktop/Cocos2D-XNAImages/test.png"); output.Texture._bitmap = outputBitmap; var bitmapContent = new PixelBitmapContent <Color>(outputBitmap.Width, outputBitmap.Height); bitmapContent.SetPixelData(outputBitmap.GetData()); output.Texture.Faces.Add(new MipmapChain(bitmapContent)); GraphicsUtil.CompressTexture(output.Texture, context, false, false); } catch (Exception ex) { context.Logger.LogImportantMessage("{0}", ex.ToString()); } return(output); }
// This only handles one character for right now internal static void GetCharABCWidthsFloat (char characters, CTFont font, out ABCFloat[] abc) { var atts = buildAttributedString(characters.ToString(), font); // for now just a line not sure if this is going to work CTLine line = new CTLine(atts); nfloat ascent; nfloat descent; nfloat leading; abc = new ABCFloat[1]; abc[0].abcfB = (float)line.GetTypographicBounds(out ascent, out descent, out leading); abc [0].abcfB += (float)leading; }
public override SpriteFontContent Process(Texture2DContent input, ContentProcessorContext context) { var output = new SpriteFontContent(); // extract the glyphs from the texture and map them to a list of characters. // we need to call GtCharacterForIndex for each glyph in the Texture to // get the char for that glyph, by default we start at ' ' then '!' and then ASCII // after that. var systemBitmap = input.Faces[0][0].ToSystemBitmap(); var glyphs = ExtractGlyphs(systemBitmap); // Optimize. foreach (Glyph glyph in glyphs) { GlyphCropper.Crop(glyph); output.VerticalLineSpacing = Math.Max(output.VerticalLineSpacing, glyph.Subrect.Height); } systemBitmap.Dispose(); var compressed = TextureFormat == TextureProcessorOutputFormat.DxtCompressed || TextureFormat == TextureProcessorOutputFormat.Compressed; systemBitmap = GlyphPacker.ArrangeGlyphs(glyphs.ToArray(), compressed, compressed); foreach (Glyph glyph in glyphs) { output.CharacterMap.Add(glyph.Character); output.Glyphs.Add(new Rectangle(glyph.Subrect.X, glyph.Subrect.Y, glyph.Subrect.Width, glyph.Subrect.Height)); output.Cropping.Add(new Rectangle((int)glyph.XOffset, (int)glyph.YOffset, glyph.Subrect.Width, glyph.Subrect.Height)); ABCFloat abc = glyph.CharacterWidths; output.Kerning.Add(new Vector3(abc.A, abc.B, abc.C)); } output.Texture.Faces[0].Add(systemBitmap.ToXnaBitmap(false)); systemBitmap.Dispose(); var bmp = output.Texture.Faces[0][0]; if (PremultiplyAlpha) { var data = bmp.GetPixelData(); var idx = 0; for (; idx < data.Length;) { var r = data[idx + 0]; var g = data[idx + 1]; var b = data[idx + 2]; var a = data[idx + 3]; var col = Color.FromNonPremultiplied(r, g, b, a); data[idx + 0] = col.R; data[idx + 1] = col.G; data[idx + 2] = col.B; data[idx + 3] = col.A; idx += 4; } bmp.SetPixelData(data); } if (compressed) { GraphicsUtil.CompressTexture(context.TargetProfile, output.Texture, context, false, PremultiplyAlpha, true); } return(output); }
private static extern int GetCharABCWidthsFloatW( IntPtr dc, uint iFirstChar, uint iLastChar, out ABCFloat abcFloat );