private static void RenderLetter(char letter, BitmapFont bitmapFont, ImageData imageData, int x, int y) { float tvTop = 0; float tvBottom = 0; float tuLeft = 0; float tuRight = 0; int textureWidth = bitmapFont.Texture.Width; int textureHeight = bitmapFont.Texture.Height; bitmapFont.AssignCharacterTextureCoordinates((int)letter, out tvTop, out tvBottom, out tuLeft, out tuRight); float characterHeight = bitmapFont.GetCharacterHeight(letter); int pixelLeft = (int)(tuLeft * textureWidth); int pixelTop = (int)(tvTop * textureHeight); int pixelRight = (int)(tuRight * textureWidth); int pixelBottom = (int)(tvBottom * textureWidth); float unitPerPixel = (characterHeight / (float)(pixelBottom - pixelTop)); int pixelFromTop = (int)(bitmapFont.LineHeightInPixels * bitmapFont.DistanceFromTopOfLine((int)letter) / (2));// * .25f); for (int sourceY = pixelTop; sourceY < pixelBottom; sourceY++) { for (int sourceX = pixelLeft; sourceX < pixelRight; sourceX++) { Color colorFromSource = sTemporaryTextureBuffer[sourceY * textureHeight + sourceX]; if (colorFromSource.A != 0) { imageData.SetPixel(x + (sourceX - pixelLeft), pixelFromTop + y + (sourceY - pixelTop), colorFromSource); } } } }