private FontResource() { this.FontBitmap = ManifestResourceLoader.LoadBitmap("LucidaTypewriterRegular.ttf.png"); string xmlContent = ManifestResourceLoader.LoadTextFile("LucidaTypewriterRegular.ttf.xml"); XElement xElement = XElement.Parse(xmlContent, LoadOptions.None); this.FontHeight = int.Parse(xElement.Attribute(strFontHeight).Value); this.FirstChar = (char)int.Parse(xElement.Attribute(strFirstChar).Value); this.LastChar = (char)int.Parse(xElement.Attribute(strLastChar).Value); this.CharInfoDict = CharacterInfoDictHelper.Parse( xElement.Element(CharacterInfoDictHelper.strCharacterInfoDict)); }
private void InitTexture() { System.Drawing.Bitmap contentBitmap = ManifestResourceLoader.LoadBitmap("DemoSimplePointSpriteElement.png"); // step 4: get texture's size int targetTextureWidth; { // Get the maximum texture size supported by OpenGL. int[] textureMaxSize = { 0 }; GL.GetInteger(GetTarget.MaxTextureSize, textureMaxSize); // Find the target width and height sizes, which is just the highest // posible power of two that'll fit into the image. targetTextureWidth = textureMaxSize[0]; int scaledWidth = contentBitmap.Width; for (int size = 1; size <= textureMaxSize[0]; size *= 2) { if (scaledWidth < size) { targetTextureWidth = size / 2; break; } if (scaledWidth == size) { targetTextureWidth = size; } } } // step 5: scale contentBitmap to right size System.Drawing.Bitmap targetImage = contentBitmap; if (contentBitmap.Width != targetTextureWidth || contentBitmap.Height != targetTextureWidth) { // Resize the image. targetImage = (System.Drawing.Bitmap)contentBitmap.GetThumbnailImage(targetTextureWidth, targetTextureWidth, null, IntPtr.Zero); } // step 6: generate texture { // Lock the image bits (so that we can pass them to OGL). BitmapData bitmapData = targetImage.LockBits(new Rectangle(0, 0, targetImage.Width, targetImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); //GL.ActiveTexture(GL.GL_TEXTURE0); GL.GenTextures(1, texture); GL.BindTexture(GL.GL_TEXTURE_2D, texture[0]); GL.TexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGBA, targetImage.Width, targetImage.Height, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, bitmapData.Scan0); // Unlock the image. targetImage.UnlockBits(bitmapData); /* We require 1 byte alignment when uploading texture data */ //GL.PixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); /* Clamping to edges is important to prevent artifacts when scaling */ GL.TexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, (int)GL.GL_CLAMP_TO_EDGE); GL.TexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, (int)GL.GL_CLAMP_TO_EDGE); /* Linear filtering usually looks best for text */ GL.TexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, (int)GL.GL_LINEAR); GL.TexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, (int)GL.GL_LINEAR); } // step 7: release images { //targetImage.Save("PointSpriteFontElement-TargetImage.png"); if (targetImage != contentBitmap) { targetImage.Dispose(); } contentBitmap.Dispose(); } }