void ocpnDC::DrawText( const wxString &text, wxCoord x, wxCoord y ) { if( dc ) dc->DrawText( text, x, y ); else { wxCoord w = 0; wxCoord h = 0; #ifdef __WXMAC__ wxBitmap tbmp(200, 200); wxMemoryDC mac_dc(tbmp); mac_dc.GetTextExtent(text, &w, &h, NULL, NULL, &m_font); #else GetTextExtent( text, &w, &h ); #endif if( w && h ) { /* create bitmap of appropriate size and select it */ wxBitmap bmp( w, h ); wxMemoryDC temp_dc; temp_dc.SelectObject( bmp ); /* fill bitmap with black */ temp_dc.SetBackground( wxBrush( wxColour( 0, 0, 0 ) ) ); temp_dc.Clear(); /* draw the text white */ temp_dc.SetFont( m_font ); temp_dc.SetTextForeground( wxColour( 255, 255, 255 ) ); temp_dc.DrawText( text, 0, 0 ); temp_dc.SelectObject( wxNullBitmap ); /* use the data in the bitmap for alpha channel, and set the color to text foreground */ wxImage image = bmp.ConvertToImage(); unsigned char *data = new unsigned char[image.GetWidth() * image.GetHeight()]; unsigned char *im = image.GetData(); for( int i = 0; i < w * h; i++ ) data[i] = im[3 * i]; glColor4ub( m_textforegroundcolour.Red(), m_textforegroundcolour.Green(), m_textforegroundcolour.Blue(), 255 ); GLDrawBlendData( x, y, w, h, GL_ALPHA, data ); delete[] data; } } }
void ocpnDC::DrawText( const wxString &text, wxCoord x, wxCoord y ) { if( dc ) dc->DrawText( text, x, y ); #ifdef ocpnUSE_GL else { # ifdef ocpnUSE_GLES return; # endif wxCoord w = 0; wxCoord h = 0; #ifdef __WXMAC__ wxBitmap tbmp(200, 200); wxMemoryDC mac_dc(tbmp); mac_dc.GetTextExtent(text, &w, &h, NULL, NULL, &m_font); #else GetTextExtent( text, &w, &h ); #endif if( w && h ) { /* create bitmap of appropriate size and select it */ wxBitmap bmp( w, h ); wxMemoryDC temp_dc; temp_dc.SelectObject( bmp ); /* fill bitmap with black */ temp_dc.SetBackground( wxBrush( wxColour( 0, 0, 0 ) ) ); temp_dc.Clear(); /* draw the text white */ temp_dc.SetFont( m_font ); temp_dc.SetTextForeground( wxColour( 255, 255, 255 ) ); temp_dc.DrawText( text, 0, 0 ); temp_dc.SelectObject( wxNullBitmap ); /* use the data in the bitmap for alpha channel, and set the color to text foreground */ wxImage image = bmp.ConvertToImage(); if( x < 0 || y < 0 ) { // Allow Drawing text which is offset to start off screen int dx = ( x < 0 ? -x : 0 ); int dy = ( y < 0 ? -y : 0 ); w = bmp.GetWidth() - dx; h = bmp.GetHeight() - dy; /* picture is out of viewport */ if( w <= 0 || h <= 0 ) return; image = image.GetSubImage( wxRect( dx, dy, w, h ) ); x += dx; y += dy; } unsigned char *data = new unsigned char[w * h]; unsigned char *im = image.GetData(); if(im){ for( int i = 0; i < w * h; i++ ) data[i] = im[3 * i]; } glColor4ub( m_textforegroundcolour.Red(), m_textforegroundcolour.Green(), m_textforegroundcolour.Blue(), 255 ); GLDrawBlendData( x, y, w, h, GL_ALPHA, data ); delete[] data; } } #endif }