📄 bitmap.cpp
字号:
return false;}bool wxBitmap::IsOk() const{ return (M_BITMAPDATA && M_BITMAPDATA->m_ok);}int wxBitmap::GetHeight() const{ wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BITMAPDATA->m_height;}int wxBitmap::GetWidth() const{ wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BITMAPDATA->m_width;}int wxBitmap::GetDepth() const{ wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BITMAPDATA->m_depth;}int wxBitmap::GetQuality() const{ wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BITMAPDATA->m_quality;}wxMask *wxBitmap::GetMask() const{ wxCHECK_MSG( Ok(), (wxMask *) NULL, wxT("invalid bitmap") ); return M_BITMAPDATA->m_bitmapMask;}void wxBitmap::SetWidth(int w){ AllocExclusive(); M_BITMAPDATA->m_width = w;}void wxBitmap::SetHeight(int h){ AllocExclusive(); M_BITMAPDATA->m_height = h;}void wxBitmap::SetDepth(int d){ AllocExclusive(); M_BITMAPDATA->m_depth = d;}void wxBitmap::SetQuality(int q){ if (!M_BITMAPDATA) m_refData = new wxBitmapRefData; M_BITMAPDATA->m_quality = q;}void wxBitmap::SetOk(bool isOk){ if (!M_BITMAPDATA) m_refData = new wxBitmapRefData; M_BITMAPDATA->m_ok = isOk;}#if wxUSE_PALETTEwxPalette *wxBitmap::GetPalette() const{ wxCHECK_MSG( Ok(), NULL, wxT("Invalid bitmap GetPalette()") ); return &M_BITMAPDATA->m_bitmapPalette;}void wxBitmap::SetPalette(const wxPalette& palette){ if (!M_BITMAPDATA) m_refData = new wxBitmapRefData; M_BITMAPDATA->m_bitmapPalette = palette ;}#endif // wxUSE_PALETTEvoid wxBitmap::SetMask(wxMask *mask){ if (!M_BITMAPDATA) m_refData = new wxBitmapRefData; // Remove existing mask if there is one. delete M_BITMAPDATA->m_bitmapMask; M_BITMAPDATA->m_bitmapMask = mask ;}WXHBITMAP wxBitmap::GetHBITMAP() const{ wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") ); return MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap);}WXHMETAFILE wxBitmap::GetPict( bool *created ) const{ wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") ); PicHandle picture = NULL ; // This is the returned picture if ( created ) (*created) = false ; // If bitmap already in Pict format return pointer if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) { return M_BITMAPDATA->m_hPict; } else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) { // Invalid bitmap return NULL; } else { if ( GetMask() ) { picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , MAC_WXHBITMAP(GetMask()->GetMaskBitmap() ) ) ; } else { picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , NULL ) ; } if ( created && picture ) (*created) = true ; } return picture ;}/* * wxMask */wxMask::wxMask() : m_maskBitmap(NULL){}// Construct a mask from a bitmap and a colour indicating// the transparent areawxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour) : m_maskBitmap(NULL){ Create(bitmap, colour);}// Construct a mask from a bitmap and a palette index indicating// the transparent areawxMask::wxMask(const wxBitmap& bitmap, int paletteIndex) : m_maskBitmap(NULL){ Create(bitmap, paletteIndex);}// Construct a mask from a mono bitmap (copies the bitmap).wxMask::wxMask(const wxBitmap& bitmap) : m_maskBitmap(NULL){ Create(bitmap);}wxMask::~wxMask(){ if ( m_maskBitmap ) { wxMacDestroyGWorld( (GWorldPtr) m_maskBitmap ) ; m_maskBitmap = NULL ; }}// Create a mask from a mono bitmap (copies the bitmap).bool wxMask::Create(const wxBitmap& bitmap){ if ( m_maskBitmap ) { wxMacDestroyGWorld( (GWorldPtr) m_maskBitmap ) ; m_maskBitmap = NULL ; } wxCHECK_MSG( bitmap.GetBitmapType() == kMacBitmapTypeGrafWorld, false, wxT("Cannot create mask from this bitmap type (TODO)")); // other types would require a temporary bitmap. not yet implemented wxCHECK_MSG( bitmap.Ok(), false, wxT("Invalid bitmap")); m_depth = bitmap.GetDepth() ; m_maskBitmap = wxMacCreateGWorld(bitmap.GetWidth(), bitmap.GetHeight(), bitmap.GetDepth() ); Rect rect = { 0,0, bitmap.GetHeight(), bitmap.GetWidth() }; LockPixels( GetGWorldPixMap( (GWorldPtr) m_maskBitmap) ); LockPixels( GetGWorldPixMap( (GWorldPtr) bitmap.GetHBITMAP()) ); CopyBits(GetPortBitMapForCopyBits( (GWorldPtr) bitmap.GetHBITMAP()), GetPortBitMapForCopyBits( (GWorldPtr) m_maskBitmap), &rect, &rect, srcCopy, 0); UnlockPixels( GetGWorldPixMap( (GWorldPtr) m_maskBitmap) ); UnlockPixels( GetGWorldPixMap( (GWorldPtr) bitmap.GetHBITMAP()) ); return false;}// Create a mask from a bitmap and a palette index indicating// the transparent areabool wxMask::Create(const wxBitmap& bitmap, int paletteIndex){ // TODO wxCHECK_MSG( 0, false, wxT("wxMask::Create not yet implemented")); return false;}// Create a mask from a bitmap and a colour indicating// the transparent areabool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour){ if ( m_maskBitmap ) { wxMacDestroyGWorld( (GWorldPtr) m_maskBitmap ) ; m_maskBitmap = NULL ; } wxCHECK_MSG( bitmap.GetBitmapType() == kMacBitmapTypeGrafWorld, false, wxT("Cannot create mask from this bitmap type (TODO)")); // other types would require a temporary bitmap. not yet implemented wxCHECK_MSG( bitmap.Ok(), false, wxT("Illigal bitmap")); m_maskBitmap = wxMacCreateGWorld( bitmap.GetWidth() , bitmap.GetHeight() , 1 ); m_depth = 1 ; LockPixels( GetGWorldPixMap( (GWorldPtr) m_maskBitmap ) ); LockPixels( GetGWorldPixMap( (GWorldPtr) bitmap.GetHBITMAP() ) ); RGBColor maskColor = MAC_WXCOLORREF(colour.GetPixel()); // this is not very efficient, but I can't think // of a better way of doing it CGrafPtr origPort ; GDHandle origDevice ; RGBColor col; RGBColor colors[2] = { { 0xFFFF, 0xFFFF, 0xFFFF }, { 0, 0, 0 }}; GetGWorld( &origPort , &origDevice ) ; for (int w = 0; w < bitmap.GetWidth(); w++) { for (int h = 0; h < bitmap.GetHeight(); h++) { SetGWorld( (GWorldPtr) bitmap.GetHBITMAP(), NULL ) ; GetCPixel( w , h , &col ) ; SetGWorld( (GWorldPtr) m_maskBitmap , NULL ) ; if (col.red == maskColor.red && col.green == maskColor.green && col.blue == maskColor.blue) { SetCPixel( w , h , &colors[0] ) ; } else { SetCPixel( w , h , &colors[1] ) ; } } } UnlockPixels( GetGWorldPixMap( (CGrafPtr) m_maskBitmap ) ) ; UnlockPixels( GetGWorldPixMap( (GWorldPtr) bitmap.GetHBITMAP() ) ) ; SetGWorld( origPort , origDevice ) ; return true;}bool wxMask::PointMasked(int x, int y){ GWorldPtr origPort; GDHandle origDevice; RGBColor color; bool masked = true; GetGWorld( &origPort, &origDevice); //Set port to mask and see if it masked (1) or not ( 0 ) SetGWorld( (GWorldPtr) m_maskBitmap, NULL); LockPixels(GetGWorldPixMap( (GWorldPtr) m_maskBitmap)); GetCPixel(x,y, &color); masked = !(color.red == 0 && color.green == 0 && color.blue == 0); UnlockPixels(GetGWorldPixMap( (GWorldPtr) m_maskBitmap)); SetGWorld( origPort, origDevice); return masked;}/* * wxBitmapHandler */wxBitmapHandler::~wxBitmapHandler(){}bool wxBitmapHandler::Create(wxBitmap *bitmap, void *data, long type, int width, int height, int depth){ return false;}bool wxBitmapHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, int desiredWidth, int desiredHeight){ return false;}bool wxBitmapHandler::SaveFile(const wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette){ return false;}/* * Standard handlers */class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler{ DECLARE_DYNAMIC_CLASS(wxPICTResourceHandler)public: inline wxPICTResourceHandler() { m_name = wxT("Macintosh Pict resource"); m_extension = wxEmptyString; m_type = wxBITMAP_TYPE_PICT_RESOURCE; }; virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags, int desiredWidth, int desiredHeight);};IMPLEMENT_DYNAMIC_CLASS(wxPICTResourceHandler, wxBitmapHandler)bool wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, int desiredWidth, int desiredHeight){ Str255 theName ; wxMacStringToPascal( name , theName ) ; PicHandle thePict = (PicHandle ) GetNamedResource( 'PICT' , theName ) ; if ( thePict ) { PictInfo theInfo ; GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ; DetachResource( (Handle) thePict ) ; M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypePict ; M_BITMAPHANDLERDATA->m_hPict = thePict ; M_BITMAPHANDLERDATA->m_width = theInfo.sourceRect.right - theInfo.sourceRect.left ; M_BITMAPHANDLERDATA->m_height = theInfo.sourceRect.bottom - theInfo.sourceRect.top ; M_BITMAPHANDLERDATA->m_depth = theInfo.depth ; M_BITMAPHANDLERDATA->m_ok = true ; M_BITMAPHANDLERDATA->m_numColors = theInfo.uniqueColors ;// M_BITMAPHANDLERDATA->m_bitmapPalette;// M_BITMAPHANDLERDATA->m_quality; return true ; } return false ;}void wxBitmap::InitStandardHandlers(){ AddHandler(new wxPICTResourceHandler) ; AddHandler(new wxICONResourceHandler) ;}// ----------------------------------------------------------------------------// raw bitmap access support// ----------------------------------------------------------------------------void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp){ if ( !Ok() ) { // no bitmap, no data (raw or otherwise) return NULL; } if ( M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld ) { wxFAIL_MSG( _T("GetRawData() only supported for GWorlds") ); return NULL; } GWorldPtr gworld = MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap); PixMapHandle hPixMap = GetGWorldPixMap(gworld); wxCHECK_MSG( hPixMap && *hPixMap, NULL, _T("GetRawData(): failed to get PixMap from GWorld?") ); wxCHECK_MSG( (*hPixMap)->pixelSize == bpp, NULL, _T("GetRawData(): pixel format mismatch") ); if ( !LockPixels(hPixMap) ) { wxFAIL_MSG( _T("failed to lock PixMap in GetRawData()") ); return NULL; } data.m_width = GetWidth(); data.m_height = GetHeight(); data.m_stride = (*hPixMap)->rowBytes & 0x7fff; M_BITMAPDATA->m_hasAlpha = false; return GetPixBaseAddr(hPixMap);}void wxBitmap::UngetRawData(wxPixelDataBase& dataBase){ if ( !Ok() ) return; if ( M_BITMAPDATA->m_hasAlpha ) { wxAlphaPixelData& data = (wxAlphaPixelData&)dataBase; int w = data.GetWidth(), h = data.GetHeight(); wxBitmap bmpMask(GetWidth(), GetHeight(), 32); wxAlphaPixelData dataMask(bmpMask, data.GetOrigin(), wxSize(w, h)); wxAlphaPixelData::Iterator pMask(dataMask), p(data); for ( int y = 0; y < h; y++ ) { wxAlphaPixelData::Iterator rowStartMask = pMask, rowStart = p; for ( int x = 0; x < w; x++ ) { const wxAlphaPixelData::Iterator::ChannelType alpha = p.Alpha(); pMask.Red() = alpha; pMask.Green() = alpha; pMask.Blue() = alpha; ++p; ++pMask; } p = rowStart; p.OffsetY(data, 1); pMask = rowStartMask; pMask.OffsetY(dataMask, 1); } SetMask(new wxMask(bmpMask)); } GWorldPtr gworld = MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap); PixMapHandle hPixMap = GetGWorldPixMap(gworld); if ( hPixMap ) { UnlockPixels(hPixMap); }}void wxBitmap::UseAlpha(){ // remember that we are using alpha channel, we'll need to create a proper // mask in UngetRawData() M_BITMAPDATA->m_hasAlpha = true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -