public void DrawString(char[] text, int startAt, int len, double x, double y) { if (this.UseSubPixelRendering) { //1. clear prev drawing result _aggPainter.Clear(Drawing.Color.FromArgb(0, 0, 0, 0)); //aggPainter.Clear(Drawing.Color.White); //aggPainter.Clear(Drawing.Color.FromArgb(0, 0, 0, 0)); //2. print text span into Agg Canvas textPrinter.DrawString(text, startAt, len, 0, 0); //3.copy to gl bitmap byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(actualImage); //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, true); glBmp.IsInvert = false; //TODO: review font height canvas.DrawGlyphImageWithSubPixelRenderingTechnique(glBmp, (float)x, (float)y + 40); glBmp.Dispose(); } else { //1. clear prev drawing result _aggPainter.Clear(Drawing.Color.FromArgb(0, 0, 0, 0)); //2. print text span into Agg Canvas textPrinter.DrawString(text, startAt, len, 0, 0); //3.copy to gl bitmap byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(actualImage); //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, true); glBmp.IsInvert = false; //TODO: review font height canvas.DrawGlyphImage(glBmp, (float)x, (float)y + 40); glBmp.Dispose(); } }
public override void DrawImage(ActualImage actualImage, double x, double y) { GLBitmap glBmp = new GLBitmap(actualImage.Width, actualImage.Height, ActualImage.GetBuffer(actualImage), false); _canvas.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public void DrawString(char[] text, int startAt, int len, double x, double y) { if (this.UseSubPixelRendering) { //1. clear prev drawing result _aggPainter.Clear(Drawing.Color.FromArgb(0, 0, 0, 0)); //aggPainter.Clear(Drawing.Color.White); //aggPainter.Clear(Drawing.Color.FromArgb(0, 0, 0, 0)); //2. print text span into Agg Canvas _vxsTextPrinter.DrawString(text, startAt, len, 0, 0); //3.copy to gl bitmap //byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(_actualImage); //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(_actualImage); glBmp.IsInvert = false; //TODO: review font height if (StartDrawOnLeftTop) { y -= _vxsTextPrinter.FontLineSpacingPx; } _glsx.DrawGlyphImageWithSubPixelRenderingTechnique(glBmp, (float)x, (float)y); glBmp.Dispose(); } else { //1. clear prev drawing result _aggPainter.Clear(Drawing.Color.White); _aggPainter.StrokeColor = Color.Black; //2. print text span into Agg Canvas _vxsTextPrinter.StartDrawOnLeftTop = false; float dyOffset = _vxsTextPrinter.FontDescedingPx; _vxsTextPrinter.DrawString(text, startAt, len, 0, -dyOffset); //------------------------------------------------------ //debug save image from agg's buffer #if DEBUG //actualImage.dbugSaveToPngFile("d:\\WImageTest\\aa1.png"); #endif //------------------------------------------------------ //3.copy to gl bitmap //byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(_actualImage); //------------------------------------------------------ //debug save image from agg's buffer //------------------------------------------------------ //GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, true); GLBitmap glBmp = new GLBitmap(_actualImage); glBmp.IsInvert = false; //TODO: review font height //if (StartDrawOnLeftTop) //{ y += _vxsTextPrinter.FontLineSpacingPx; //} _glsx.DrawGlyphImage(glBmp, (float)x, (float)y + dyOffset); glBmp.Dispose(); } }
public void Dispose() { if (_lookupBmp != null) { _lookupBmp.Dispose(); _lookupBmp = null; } }
public override void DrawImage(ActualImage actualImage, params AffinePlan[] affinePlans) { //create gl bmp GLBitmap glBmp = new GLBitmap(actualImage.Width, actualImage.Height, ActualImage.GetBuffer(actualImage), false); _canvas.DrawImage(glBmp, 0, 0); glBmp.Dispose(); }
public override void Dispose() { base.Dispose(); if (_lookupBmp != null) { _lookupBmp.Dispose(); _lookupBmp = null; } }
public void Dispose() { _loadedGlyphs.Clear(); if (_glBmp != null) { _glBmp.Dispose(); _glBmp = null; } }
public void Dispose() { _myGLBitmapFontMx.Clear(); _myGLBitmapFontMx = null; if (_glBmp != null) { _glBmp.Dispose(); _glBmp = null; } }
public void Dispose() { //delete framebuffer,render buffer and texture id if (_frameBufferId > 0) { GL.DeleteFramebuffers(1, ref _frameBufferId); _frameBufferId = 0; } if (_renderBufferId > 0) { GL.DeleteRenderbuffers(1, ref _renderBufferId); _renderBufferId = 0; } if (_glBmp != null && _isBmpOwner) { _glBmp.Dispose(); _glBmp = null; } }
public void Print(char[] buffer, double x, double y) { int j = buffer.Length; int buffsize = j * 2; //get kerning list if (properGlyphs == null) { properGlyphs = new ProperGlyph[buffsize]; currentFont.GetGlyphPos(buffer, 0, buffsize, properGlyphs); } double xpos = x; for (int i = 0; i < buffsize; ++i) { uint codepoint = properGlyphs[i].codepoint; if (codepoint == 0) { break; } //------------------------------------------------------------- FontGlyph glyph = this.currentFont.GetGlyphByIndex(codepoint); //glyph image32 //------------------------------------------------------------- GLBitmap bmp = new GLBitmap(new LazyAggBitmapBufferProvider(glyph.glyphImage32)); var left = glyph.exportGlyph.img_horiBearingX; this.canvas2d.DrawImage(bmp, (float)(xpos + (left >> 6)), (float)(y + (glyph.exportGlyph.bboxYmin >> 6))); int w = (glyph.exportGlyph.advanceX) >> 6; xpos += (w); bmp.Dispose(); //temp here //------------------------------------------------------------- } }
public void Print(char[] buffer, double x, double y) { int j = buffer.Length; int buffsize = j * 2; //get kerning list ActualFont fontImp = nativeFontStore.GetResolvedNativeFont(currentFont); if (properGlyphs == null) { properGlyphs = new ProperGlyph[buffsize]; TextShapingService.GetGlyphPos(fontImp, buffer, 0, buffsize, properGlyphs); } double xpos = x; for (int i = 0; i < buffsize; ++i) { uint codepoint = properGlyphs[i].codepoint; if (codepoint == 0) { break; } //------------------------------------------------------------- FontGlyph glyph = fontImp.GetGlyphByIndex(codepoint); //glyph image32 //------------------------------------------------------------- GLBitmap bmp = new GLBitmap(new LazyAggBitmapBufferProvider(glyph.glyphImage32)); var left = glyph.glyphMatrix.img_horiBearingX; this.canvas2d.DrawImage(bmp, (float)(xpos + (left >> 6)), (float)(y + (glyph.glyphMatrix.bboxYmin >> 6))); int w = (glyph.glyphMatrix.advanceX) >> 6; xpos += (w); bmp.Dispose(); //temp here //------------------------------------------------------------- } }
public void DrawString(char[] text, double x, double y) { aggPainter.Clear(Drawing.Color.White); //draw text textPrinter.DrawString(text, 0, 18); byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(actualImage); //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, true); bool isYFliped = canvas.FlipY; if (isYFliped) { canvas.DrawImage(glBmp, (float)x, (float)y); } else { canvas.FlipY = true; canvas.DrawImage(glBmp, (float)x, (float)y); canvas.FlipY = false; } glBmp.Dispose(); }
public override void DrawImage(ActualImage actualImage, params AffinePlan[] affinePlans) { //create gl bmp GLBitmap glBmp = new GLBitmap(actualImage.Width, actualImage.Height, ActualImage.GetBuffer(actualImage), false); _canvas.DrawImage(glBmp, 0, 0); glBmp.Dispose(); }
public void DrawString(char[] textBuffer, int startAt, int len, double x, double y) { //TODO: review performance _memdc.PatBlt(Win32.NativeWin32MemoryDC.PatBltColor.White, 0, 0, _bmpWidth, _bmpHeight); _memdc.TextOut(textBuffer); //memdc.BitBltTo(destHdc); // Win32.Win32Utils.BitBlt(hdc, 0, 0, bmpWidth, 50, memHdc, 0, 0, Win32.MyWin32.SRCCOPY); //--------------- int stride = 4 * ((_bmpWidth * 32 + 31) / 32); //Bitmap newBmp = new Bitmap(bmpWidth, 50, System.Drawing.Imaging.PixelFormat.Format32bppArgb); //var bmpData = newBmp.LockBits(new Rectangle(0, 0, bmpWidth, 50), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] tmp1 = new byte[stride * 50]; System.Runtime.InteropServices.Marshal.Copy(_memdc.PPVBits, tmp1, 0, tmp1.Length); //--------------- int pos = 3; for (int r = 0; r < 50; ++r) { for (int c = 0; c < stride; ++c) { tmp1[pos] = 255; pos += 4; c += 4; } } _memdc.MeasureTextSize(textBuffer, out _bmpWidth, out _bmpHeight); var memBmp = new CpuBlit.MemBitmap(_bmpWidth, _bmpHeight); #if DEBUG memBmp._dbugNote = "WinGdiFontPrinter.DrawString"; #endif //------------------------------------------------------ //copy bmp from specific bmp area //and convert to GLBmp unsafe { using (CpuBlit.Imaging.TempMemPtr.FromBmp(memBmp, out byte *dest0)) { byte *header = (byte *)_memdc.PPVBits; { byte *dest = dest0; byte *rowHead = header; int rowLen = _bmpWidth * 4; for (int h = 0; h < _bmpHeight; ++h) { header = rowHead; for (int n = 0; n < rowLen;) { //move next *(dest + 0) = *(header + 0); *(dest + 1) = *(header + 1); *(dest + 2) = *(header + 2); //*(dest + 3) = *(header + 3); *(dest + 3) = 255; header += 4; dest += 4; n += 4; } //finish one row rowHead += stride; } } } } //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(new MemBitmapBinder(memBmp, false)); _pcx.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public void DrawString(char[] textBuffer, int startAt, int len, double x, double y) { //TODO: review performance memdc.PatBlt(Win32.NativeWin32MemoryDc.PatBltColor.White, 0, 0, bmpWidth, bmpHeight); memdc.TextOut(textBuffer); //memdc.BitBltTo(destHdc); // Win32.Win32Utils.BitBlt(hdc, 0, 0, bmpWidth, 50, memHdc, 0, 0, Win32.MyWin32.SRCCOPY); //--------------- int stride = 4 * ((bmpWidth * 32 + 31) / 32); //Bitmap newBmp = new Bitmap(bmpWidth, 50, System.Drawing.Imaging.PixelFormat.Format32bppArgb); //var bmpData = newBmp.LockBits(new Rectangle(0, 0, bmpWidth, 50), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] tmp1 = new byte[stride * 50]; System.Runtime.InteropServices.Marshal.Copy(memdc.PPVBits, tmp1, 0, tmp1.Length); //--------------- int pos = 3; for (int r = 0; r < 50; ++r) { for (int c = 0; c < stride; ++c) { tmp1[pos] = 255; pos += 4; c += 4; } } memdc.MeasureTextSize(textBuffer, out bmpWidth, out bmpHeight); var actualImg = new Agg.ActualImage(bmpWidth, bmpHeight); //------------------------------------------------------ //copy bmp from specific bmp area //and convert to GLBmp Agg.TempMemPtr buffer = PixelFarm.Agg.ActualImage.GetBufferPtr(actualImg); unsafe { byte *header = (byte *)memdc.PPVBits; byte *dest0 = (byte *)buffer.Ptr; { byte *dest = dest0; byte *rowHead = header; int rowLen = bmpWidth * 4; for (int h = 0; h < bmpHeight; ++h) { header = rowHead; for (int n = 0; n < rowLen;) { //move next *(dest + 0) = *(header + 0); *(dest + 1) = *(header + 1); *(dest + 2) = *(header + 2); //*(dest + 3) = *(header + 3); *(dest + 3) = 255; header += 4; dest += 4; n += 4; } //finish one row rowHead += stride; } } } buffer.Release(); //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(actualImg); _glsx.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public void DrawString(CanvasGL2d canvas, string text, float x, float y) { char[] textBuffer = text.ToCharArray(); Win32.MyWin32.PatBlt(memdc.DC, 0, 0, bmpWidth, bmpHeight, Win32.MyWin32.WHITENESS); Win32.NativeTextWin32.TextOut(memdc.DC, 0, 0, textBuffer, textBuffer.Length); // Win32.Win32Utils.BitBlt(hdc, 0, 0, bmpWidth, 50, memHdc, 0, 0, Win32.MyWin32.SRCCOPY); //--------------- int stride = 4 * ((bmpWidth * 32 + 31) / 32); //Bitmap newBmp = new Bitmap(bmpWidth, 50, System.Drawing.Imaging.PixelFormat.Format32bppArgb); //var bmpData = newBmp.LockBits(new Rectangle(0, 0, bmpWidth, 50), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] tmp1 = new byte[stride * 50]; System.Runtime.InteropServices.Marshal.Copy(memdc.PPVBits, tmp1, 0, tmp1.Length); //--------------- int pos = 3; for (int r = 0; r < 50; ++r) { for (int c = 0; c < stride; ++c) { tmp1[pos] = 255; pos += 4; c += 4; } } Win32.NativeTextWin32.WIN32SIZE win32Size; unsafe { fixed (char* bufferHead = &textBuffer[0]) { Win32.NativeTextWin32.GetTextExtentPoint32Char(memdc.DC, bufferHead, textBuffer.Length, out win32Size); } } bmpWidth = win32Size.Width; bmpHeight = win32Size.Height; var actualImg = new Agg.ActualImage(bmpWidth, bmpHeight, Agg.PixelFormat.ARGB32); //------------------------------------------------------ //copy bmp from specific bmp area //and convert to GLBmp byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(actualImg); unsafe { byte* header = (byte*)memdc.PPVBits; fixed (byte* dest0 = &buffer[0]) { byte* dest = dest0; byte* rowHead = header; int rowLen = bmpWidth * 4; for (int h = 0; h < bmpHeight; ++h) { header = rowHead; for (int n = 0; n < rowLen; ) { //move next *(dest + 0) = *(header + 0); *(dest + 1) = *(header + 1); *(dest + 2) = *(header + 2); //*(dest + 3) = *(header + 3); *(dest + 3) = 255; header += 4; dest += 4; n += 4; } //finish one row rowHead += stride; } } } //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, false); canvas.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public void DrawString(char[] textBuffer, double x, double y) { //TODO: review performan Win32.MyWin32.PatBlt(memdc.DC, 0, 0, bmpWidth, bmpHeight, Win32.MyWin32.WHITENESS); Win32.NativeTextWin32.TextOut(memdc.DC, 0, 0, textBuffer, textBuffer.Length); // Win32.Win32Utils.BitBlt(hdc, 0, 0, bmpWidth, 50, memHdc, 0, 0, Win32.MyWin32.SRCCOPY); //--------------- int stride = 4 * ((bmpWidth * 32 + 31) / 32); //Bitmap newBmp = new Bitmap(bmpWidth, 50, System.Drawing.Imaging.PixelFormat.Format32bppArgb); //var bmpData = newBmp.LockBits(new Rectangle(0, 0, bmpWidth, 50), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] tmp1 = new byte[stride * 50]; System.Runtime.InteropServices.Marshal.Copy(memdc.PPVBits, tmp1, 0, tmp1.Length); //--------------- int pos = 3; for (int r = 0; r < 50; ++r) { for (int c = 0; c < stride; ++c) { tmp1[pos] = 255; pos += 4; c += 4; } } Win32.NativeTextWin32.WIN32SIZE win32Size; unsafe { fixed(char *bufferHead = &textBuffer[0]) { Win32.NativeTextWin32.GetTextExtentPoint32Char(memdc.DC, bufferHead, textBuffer.Length, out win32Size); } } bmpWidth = win32Size.Width; bmpHeight = win32Size.Height; var actualImg = new Agg.ActualImage(bmpWidth, bmpHeight, Agg.PixelFormat.ARGB32); //------------------------------------------------------ //copy bmp from specific bmp area //and convert to GLBmp byte[] buffer = PixelFarm.Agg.ActualImage.GetBuffer(actualImg); unsafe { byte *header = (byte *)memdc.PPVBits; fixed(byte *dest0 = &buffer[0]) { byte *dest = dest0; byte *rowHead = header; int rowLen = bmpWidth * 4; for (int h = 0; h < bmpHeight; ++h) { header = rowHead; for (int n = 0; n < rowLen;) { //move next *(dest + 0) = *(header + 0); *(dest + 1) = *(header + 1); *(dest + 2) = *(header + 2); //*(dest + 3) = *(header + 3); *(dest + 3) = 255; header += 4; dest += 4; n += 4; } //finish one row rowHead += stride; } } } //------------------------------------------------------ GLBitmap glBmp = new GLBitmap(bmpWidth, bmpHeight, buffer, false); canvas.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public override void DrawImage(ActualImage actualImage, double x, double y) { GLBitmap glBmp = new GLBitmap(actualImage.Width, actualImage.Height, ActualImage.GetBuffer(actualImage), false); _canvas.DrawImage(glBmp, (float)x, (float)y); glBmp.Dispose(); }
public void DrawString(char[] buffer, double x, double y) { int j = buffer.Length; int buffsize = j * 2; //resolve font from painter? ActualFont fontImp = ff.GetFontAtPointsSize(font.SizeInPoints); var tt = (Typography.OpenFont.Typeface)ff.GetInternalTypeface(); List <GlyphPlan> glyphPlans = new List <GlyphPlan>(); _glyphLayout.Layout(tt, font.SizeInPoints, buffer, glyphPlans); // //un-test version //ActualFont fontImp = nativeFontStore.GetResolvedNativeFont(painter.CurrentFont); //if (properGlyphs == null) //{ // properGlyphs = new ProperGlyph[buffsize]; // TextShapingService.GetGlyphPos(fontImp, buffer, 0, buffsize, properGlyphs); //} //TODO: implement msdf texture //double xpos = x; //for (int i = 0; i < buffsize; ++i) //{ // uint codepoint = properGlyphs[i].codepoint; // if (codepoint == 0) // { // break; // } // //------------------------------------------------------------- // FontGlyph glyph = fontImp.GetGlyphByIndex(codepoint); // //glyph image32 // //------------------------------------------------------------- // GLBitmap bmp = new GLBitmap(new LazyAggBitmapBufferProvider(glyph.glyphImage32)); // var left = glyph.glyphMatrix.img_horiBearingX; // this.canvas2d.DrawImage(bmp, // (float)(xpos + (left >> 6)), // (float)(y + (glyph.glyphMatrix.bboxYmin >> 6))); // int w = (glyph.glyphMatrix.advanceX) >> 6; // xpos += (w); // bmp.Dispose(); //temp here // //------------------------------------------------------------- //} //------------------------------------- //msdf texture version double xpos = x; int n = glyphPlans.Count; Typography.Rendering.GlyphImage glyphImage = simpleFontAtlas.TotalGlyph; GLBitmap glBmp = new GLBitmap(glyphImage.Width, glyphImage.Height, glyphImage.GetImageBuffer(), false); float c_x = (float)x; float c_y = (float)y; //int left = ((int)(glyph.glyphMatrix.img_horiBearingX * scale) >> 6); int left = 0; //float baseline = c_y - 24;//eg line height= 24 //create a list float baseline = c_y - 24;//eg line height= 24 //create a list bool isFlipY = canvas2d.FlipY; if (!isFlipY) { canvas2d.FlipY = true; } for (int i = 0; i < n; ++i) { GlyphPlan glyph = glyphPlans[i]; Typography.Rendering.TextureFontGlyphData glyphData; if (!simpleFontAtlas.GetRectByCodePoint(glyph.glyphIndex, out glyphData)) { //Rectangle r = glyphData.Rect; //float x_min = glyphData.BBoxXMin / 64; ////draw each glyph at specific position ////_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); //_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); ////c_x += r.Width - 10; //c_x += (glyphData.AdvanceX / 64); continue; } //found PixelFarm.Drawing.Rectangle r = ConvToRect(glyphData.Rect); //test draw full msdf gen img //canvas2d.DrawImage(glBmp, c_x + left, (float)(baseline + ((int)(glyphData.ImgHeight)))); canvas2d.DrawSubImageWithMsdf(glBmp, ref r, c_x + left, (float)(baseline + ((int)(glyphData.ImgHeight))), 1.0f); c_x += glyph.advX; } canvas2d.FlipY = isFlipY; glBmp.Dispose(); //temp here //draw with texture printer *** //char[] chars = text.ToCharArray(); //int j = chars.Length; //int buffsize = j * 2; ////get kerning list ////get actual font for this canvas //TextureFont currentFont = _currentTextureFont; //SimpleFontAtlas fontAtlas = currentFont.FontAtlas; //ProperGlyph[] properGlyphs = new ProperGlyph[buffsize]; //TextShapingService.GetGlyphPos(currentFont, chars, 0, buffsize, properGlyphs); //GLBitmap glBmp = (GLBitmap)currentFont.GLBmp; //if (glBmp == null) //{ // //create glbmp // GlyphImage glyphImage = fontAtlas.TotalGlyph; // int[] buffer = glyphImage.GetImageBuffer(); // glBmp = new GLBitmap(glyphImage.Width, glyphImage.Height, buffer, false); //} ////int j = chars.Length; //// //float c_x = (float)x; //float c_y = (float)y; ////TODO: review here *** ////----------------- ////1. layout each glyph before render *** //// //float baseline = c_y - 24;//eg line height= 24 //create a list ////-------------- //List<float> coords = new List<float>(); //float scale = 1f; //for (int i = 0; i < buffsize; ++i) //{ // ProperGlyph glyph1 = properGlyphs[i]; // uint codepoint = properGlyphs[i].codepoint; // if (codepoint == 0) // { // break; // } // //-------------------------------- // //if (codepoint == 1173 && i > 1) // //{ // // //check prev code point // // codepoint = 1168; // //} // //-------------------------------- // TextureFontGlyphData glyphData; // if (!fontAtlas.GetRectByCodePoint((int)codepoint, out glyphData)) // { // //Rectangle r = glyphData.Rect; // //float x_min = glyphData.BBoxXMin / 64; // ////draw each glyph at specific position // ////_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); // //_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); // ////c_x += r.Width - 10; // //c_x += (glyphData.AdvanceX / 64); // continue; // } // FontGlyph glyph = currentFont.GetGlyphByIndex(codepoint); // int left = ((int)(glyph.glyphMatrix.img_horiBearingX * scale) >> 6); // Rectangle r = glyphData.Rect; // int adjustX = 0; // int bboxYMin = glyph.glyphMatrix.bboxYmin >> 6; // if (bboxYMin > 1 || bboxYMin < -1) // { // // adjustX = 3; // } // //scale down 0.8; // //_canvas.DrawSubImageWithMsdf(glBmp, ref r, adjustX + c_x + left, // // (float)(baseline + ((int)(glyphData.ImgHeight + glyph.glyphMatrix.bboxYmin) >> 6)), 1.1f); // coords.Add(r.Left); // coords.Add(r.Top); // coords.Add(r.Width); // coords.Add(r.Height); // //------------------------- // coords.Add(adjustX + c_x + left); // //coords.Add(baseline + ((int)((glyphData.ImgHeight + glyph.glyphMatrix.bboxYmin) * scale) >> 6)); // coords.Add(baseline + ((int)((glyphData.ImgHeight + glyphData.BBoxYMin) * scale) >> 6)); // //int w = (int)(glyph.glyphMatrix.advanceX * scale) >> 6; // int w = (int)(glyph.horiz_adv_x * scale) >> 6; // c_x += w; //} //_canvas.DrawSubImageWithMsdf(glBmp, coords.ToArray(), scale); //----------------------- //public override void DrawString(string text, double x, double y) //{ // char[] chars = text.ToCharArray(); // int j = chars.Length; // int buffsize = j * 2; // //get kerning list // TextureFont currentFont = this.CurrentFont as TextureFont; // SimpleFontAtlas fontAtlas = currentFont.FontAtlas; // ProperGlyph[] properGlyphs = new ProperGlyph[buffsize]; // currentFont.GetGlyphPos(chars, 0, buffsize, properGlyphs); // GLBitmap glBmp = currentFont.GLBmp; // if (glBmp == null) // { // //create glbmp // GlyphImage glyphImage = fontAtlas.TotalGlyph; // int[] buffer = glyphImage.GetImageBuffer(); // glBmp = new GLBitmap(glyphImage.Width, glyphImage.Height, buffer, false); // } // //int j = chars.Length; // // // float c_x = (float)x; // float c_y = (float)y; // //TODO: review here // //----------------- // //1. layout each glyph before render *** // float baseline = c_y - 24;//eg line height= 24 // //create a list // for (int i = 0; i < buffsize; ++i) // { // ProperGlyph glyph1 = properGlyphs[i]; // uint codepoint = properGlyphs[i].codepoint; // if (codepoint == 0) // { // break; // } // if (codepoint == 1173 && i > 1) // { // //check prev code point // codepoint = 1168; // } // TextureFontGlyphData glyphData; // if (!fontAtlas.GetRect((int)codepoint, out glyphData)) // { // //Rectangle r = glyphData.Rect; // //float x_min = glyphData.BBoxXMin / 64; // ////draw each glyph at specific position // ////_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); // //_canvas.DrawSubImageWithMsdf(glBmp, ref r, c_x + x_min, (float)(baseline + r.Height)); // ////c_x += r.Width - 10; // //c_x += (glyphData.AdvanceX / 64); // continue; // } // //------------------------------------------------------------- // //FontGlyph glyph = this.currentFont.GetGlyphByIndex(codepoint); // FontGlyph glyph = currentFont.GetGlyphByIndex(codepoint); // int left = (glyph.glyphMatrix.img_horiBearingX >> 6); // Rectangle r = glyphData.Rect; // int adjustX = 0; // int bboxYMin = glyph.glyphMatrix.bboxYmin >> 6; // if (bboxYMin > 1 || bboxYMin < -1) // { // // adjustX = 3; // } // //scale down 0.8; // _canvas.DrawSubImageWithMsdf(glBmp, ref r, adjustX + c_x + left, // (float)(baseline + ((int)(glyphData.ImgHeight + glyph.glyphMatrix.bboxYmin) >> 6)), 1.1f); // int w = (glyph.glyphMatrix.advanceX) >> 6; // c_x += (w); // } //} // public override void DrawString(string text, double x, double y) // { // ////in this version we draw string to image // ////and the write the image back to gl surface // //_winGfx.Clear(System.Drawing.Color.White); // //_winGfx.DrawString(text, _winFont, _winGfxBrush, 0, 0); // ////_winGfxBackBmp.Save("d:\\WImageTest\\a00123.png"); // //System.Drawing.SizeF textAreaSize = _winGfx.MeasureString(text, _winFont); // //var bmpData = _winGfxBackBmp.LockBits(new System.Drawing.Rectangle(0, 0, _winGfxBackBmp.Width, _winGfxBackBmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, _winGfxBackBmp.PixelFormat); // //int width = (int)textAreaSize.Width; // //int height = (int)textAreaSize.Height; // //ActualImage actualImg = new ActualImage(width, height, Agg.Image.PixelFormat.ARGB32); // ////------------------------------------------------------ // ////copy bmp from specific bmp area // ////and convert to GLBmp // //int stride = bmpData.Stride; // //byte[] buffer = actualImg.GetBuffer(); // //unsafe // //{ // // byte* header = (byte*)bmpData.Scan0; // // fixed (byte* dest0 = &buffer[0]) // // { // // byte* dest = dest0; // // byte* rowHead = header; // // int rowLen = width * 4; // // for (int h = 0; h < height; ++h) // // { // // header = rowHead; // // for (int n = 0; n < rowLen;) // // { // // //move next // // *(dest + 0) = *(header + 0); // // *(dest + 1) = *(header + 1); // // *(dest + 2) = *(header + 2); // // *(dest + 3) = *(header + 3); // // header += 4; // // dest += 4; // // n += 4; // // } // // //finish one row // // rowHead += stride; // // } // // } // //} // //_winGfxBackBmp.UnlockBits(bmpData); // ////------------------------------------------------------ // //GLBitmap glBmp = new GLBitmap(width, height, buffer, false); // //_canvas.DrawImageWithWhiteTransparent(glBmp, (float)x, (float)y); // //glBmp.Dispose(); // } }