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 }
void ocpnDC::DrawBitmap( const wxBitmap &bitmap, wxCoord x, wxCoord y, bool usemask ) { wxBitmap bmp; if( x < 0 || y < 0 ) { int dx = ( x < 0 ? -x : 0 ); int dy = ( y < 0 ? -y : 0 ); int w = bitmap.GetWidth() - dx; int h = bitmap.GetHeight() - dy; /* picture is out of viewport */ if( w <= 0 || h <= 0 ) return; wxBitmap newBitmap = bitmap.GetSubBitmap( wxRect( dx, dy, w, h ) ); x += dx; y += dy; bmp = newBitmap; } else { bmp = bitmap; } if( dc ) dc->DrawBitmap( bmp, x, y, usemask ); else { wxImage image = bmp.ConvertToImage(); int w = image.GetWidth(), h = image.GetHeight(); if( usemask ) { unsigned char *d = image.GetData(); unsigned char *a = image.GetAlpha(); unsigned char mr, mg, mb; if( !image.GetOrFindMaskColour( &mr, &mg, &mb ) && !a ) printf( "trying to use mask to draw a bitmap without alpha or mask\n" ); unsigned char *e = new unsigned char[4 * w * h]; // int w = image.GetWidth(), h = image.GetHeight(); { for( int y = 0; y < h; y++ ) for( int x = 0; x < w; x++ ) { unsigned char r, g, b; int off = ( y * image.GetWidth() + x ); r = d[off * 3 + 0]; g = d[off * 3 + 1]; b = d[off * 3 + 2]; e[off * 4 + 0] = r; e[off * 4 + 1] = g; e[off * 4 + 2] = b; e[off * 4 + 3] = a ? a[off] : ( ( r == mr ) && ( g == mg ) && ( b == mb ) ? 0 : 255 ); } } glColor4f( 1, 1, 1, 1 ); GLDrawBlendData( x, y, w, h, GL_RGBA, e ); delete[] ( e ); } else { glRasterPos2i( x, y ); glPixelZoom( 1, -1 ); /* draw data from top to bottom */ glDrawPixels( w, h, GL_RGB, GL_UNSIGNED_BYTE, image.GetData() ); glPixelZoom( 1, 1 ); } } }
void ocpnDC::DrawText( const wxString &text, wxCoord x, wxCoord y ) { if( dc ) dc->DrawText( text, x, y ); #ifdef ocpnUSE_GL else { wxCoord w = 0; wxCoord h = 0; #ifndef __WXMAC__ m_texfont.Build( m_font ); // make sure the font is ready m_texfont.GetTextExtent(text, &w, &h); if( w && h ) { glEnable( GL_BLEND ); glEnable( GL_TEXTURE_2D ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); glPushMatrix(); glTranslatef(x, y, 0); glColor3ub( m_textforegroundcolour.Red(), m_textforegroundcolour.Green(), m_textforegroundcolour.Blue() ); m_texfont.RenderString(text); glPopMatrix(); glDisable( GL_TEXTURE_2D ); glDisable( GL_BLEND ); } #else wxScreenDC sdc; sdc.GetTextExtent(text, &w, &h, NULL, NULL, &m_font); /* 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 } #endif }