ocpCursor::ocpCursor( const char **xpm_data, long type, int hotSpotX, int hotSpotY ) : wxCursor( wxCURSOR_ARROW ) { wxImage cImage( xpm_data ); // wxMSW Bug??? // On Windows XP, conversion from wxImage to wxBitmap fails at the ::CreateDIBitmap() call // unless a "compatible" dc is provided. Why?? // As a workaround, just make a simple wxDC for temporary use wxBitmap tbmp( cImage.GetWidth(), cImage.GetHeight(), -1 ); wxMemoryDC dwxdc; dwxdc.SelectObject( tbmp ); // HCURSOR hcursor = wxBitmapToHCURSOR ( wxBitmap ( cImage, ( wxDC & ) dwxdc ), // hotSpotX, hotSpotY ); HCURSOR hcursor = NULL; if( !hcursor ) { wxLogWarning( _T( "Failed to create ocpCursor." ) ); return; } // Replace the HANDLE created in the base class constructor // Probably leaks.... GetGDIImageData()->m_handle = hcursor; }
ocpCursor::ocpCursor ( const char **xpm_data, long type, int hotSpotX, int hotSpotY ) : wxCursor ( wxCURSOR_ARROW ) { wxImage cImage ( xpm_data ); wxBitmap tbmp ( cImage.GetWidth(),cImage.GetHeight(),-1 ); }
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; } } }
ocpCursor::ocpCursor ( const wxString& cursorName, long type, int hotSpotX, int hotSpotY ) : wxCursor ( wxCURSOR_ARROW ) { wxImage cImage; if ( !cImage.CanRead ( cursorName ) ) ::wxInitAllImageHandlers(); cImage.LoadFile ( cursorName ); // wxMSW Bug??? // On Windows XP, conversion from wxImage to wxBitmap fails at the ::CreateDIBitmap() call // unless a "compatible" dc is provided. Why?? // As a workaround, just make a simple wxDC for temporary use wxBitmap tbmp ( cImage.GetWidth(),cImage.GetHeight(),-1 ); }
wxBitmap *PlugInManager::BuildDimmedToolBitmap(wxBitmap *pbmp_normal, unsigned char dim_ratio) { wxImage img_dup = pbmp_normal->ConvertToImage(); if(dim_ratio < 200) { // Create a dimmed version of the image/bitmap int gimg_width = img_dup.GetWidth(); int gimg_height = img_dup.GetHeight(); double factor = (double)(dim_ratio) / 256.0; for(int iy=0 ; iy < gimg_height ; iy++) { for(int ix=0 ; ix < gimg_width ; ix++) { if(!img_dup.IsTransparent(ix, iy)) { wxImage::RGBValue rgb(img_dup.GetRed(ix, iy), img_dup.GetGreen(ix, iy), img_dup.GetBlue(ix, iy)); wxImage::HSVValue hsv = wxImage::RGBtoHSV(rgb); hsv.value = hsv.value * factor; wxImage::RGBValue nrgb = wxImage::HSVtoRGB(hsv); img_dup.SetRGB(ix, iy, nrgb.red, nrgb.green, nrgb.blue); } } } } // Make a bitmap wxBitmap *ptoolBarBitmap; #ifdef __WXMSW__ wxBitmap tbmp(img_dup.GetWidth(),img_dup.GetHeight(),-1); wxMemoryDC dwxdc; dwxdc.SelectObject(tbmp); ptoolBarBitmap = new wxBitmap(img_dup, (wxDC &)dwxdc); #else ptoolBarBitmap = new wxBitmap(img_dup); #endif // store it return ptoolBarBitmap; }
void TexFont::Build( wxFont &font, bool blur ) { /* avoid rebuilding if the parameters are the same */ if(font == m_font && blur == m_blur) return; m_font = font; m_blur = blur; m_maxglyphw = 0; m_maxglyphh = 0; wxScreenDC sdc; sdc.SetFont( font ); for( int i = MIN_GLYPH; i < MAX_GLYPH; i++ ) { wxCoord gw, gh; wxString text; if(i == DEGREE_GLYPH) text = wxString::Format(_T("%c"), 0x00B0); //_T("°"); else text = wxString::Format(_T("%c"), i); wxCoord descent, exlead; sdc.GetTextExtent( text, &gw, &gh, &descent, &exlead, &font ); // measure the text tgi[i].width = gw; tgi[i].height = gh; tgi[i].advance = gw; m_maxglyphw = wxMax(tgi[i].width, m_maxglyphw); m_maxglyphh = wxMax(tgi[i].height, m_maxglyphh); } /* add extra pixel to give a border between rows of characters without this, in some cases a faint line can be see on the edge from the character above */ m_maxglyphh++; int w = COLS_GLYPHS * m_maxglyphw; int h = ROWS_GLYPHS * m_maxglyphh; wxASSERT(w < 2048 && h < 2048); /* make power of 2 */ for(tex_w = 1; tex_w < w; tex_w *= 2); for(tex_h = 1; tex_h < h; tex_h *= 2); wxBitmap tbmp(tex_w, tex_h); wxMemoryDC dc; dc.SelectObject(tbmp); dc.SetFont( font ); /* fill bitmap with black */ dc.SetBackground( wxBrush( wxColour( 0, 0, 0 ) ) ); dc.Clear(); /* draw the text white */ dc.SetTextForeground( wxColour( 255, 255, 255 ) ); /* wxPen pen(wxColour( 255, 255, 255 )); wxBrush brush(wxColour( 255, 255, 255 ), wxTRANSPARENT); dc.SetPen(pen); dc.SetBrush(brush); */ int row = 0, col = 0; for( int i = MIN_GLYPH; i < MAX_GLYPH; i++ ) { if(col == COLS_GLYPHS) { col = 0; row++; } tgi[i].x = col * m_maxglyphw; tgi[i].y = row * m_maxglyphh; wxString text; if(i == DEGREE_GLYPH) text = wxString::Format(_T("%c"), 0x00B0); //_T("°"); else text = wxString::Format(_T("%c"), i); dc.DrawText(text, tgi[i].x, tgi[i].y ); // dc.DrawRectangle(tgi[i].x, tgi[i].y, tgi[i].advance, tgi[i].height); col++; } dc.SelectObject(wxNullBitmap); wxImage image = tbmp.ConvertToImage(); GLuint format, internalformat; int stride; format = GL_ALPHA; internalformat = format; stride = 1; if( m_blur ) image = image.Blur(1); unsigned char *imgdata = image.GetData(); if(imgdata){ unsigned char *teximage = (unsigned char *) malloc( stride * tex_w * tex_h ); for( int j = 0; j < tex_w*tex_h; j++ ) for( int k = 0; k < stride; k++ ) teximage[j * stride + k] = imgdata[3*j]; Delete(); glGenTextures( 1, &texobj ); glBindTexture( GL_TEXTURE_2D, texobj ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST/*GL_LINEAR*/ ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexImage2D( GL_TEXTURE_2D, 0, internalformat, tex_w, tex_h, 0, format, GL_UNSIGNED_BYTE, teximage ); free(teximage); } m_built = true; }
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 }