X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/957f03699b05057de4d75af2f19e08f38ade03ff..1a07a730f05b69977e567fab04b415f1e6a81440:/include/wx/rawbmp.h diff --git a/include/wx/rawbmp.h b/include/wx/rawbmp.h index a9199e541c..3e599a602b 100644 --- a/include/wx/rawbmp.h +++ b/include/wx/rawbmp.h @@ -5,12 +5,14 @@ // Modified by: // Created: 10.03.03 // RCS-ID: $Id$ -// Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwindows.org> +// Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwidgets.org> // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifndef _WX_RAWBMP_H_BASE_ -#define _WX_RAWBMP_H_BASE_ +#ifndef _WX_RAWBMP_H_ +#define _WX_RAWBMP_H_ + +#include "wx/image.h" // ---------------------------------------------------------------------------- // Abstract Pixel API @@ -69,10 +71,12 @@ } */ -#ifdef __VISUALC__ - // VC++ gives an absolutely harmless warning for wxPixelData<wxBitmap> ctor - #pragma warning(disable: 4355) // 'this' used in initializer list -#endif +/* + Note: we do not use WXDLLEXPORT with classes in this file because VC++ has + problems with exporting inner class defined inside a specialization of a + template class from a DLL. Besides, as all the methods are inline it's not + really necessary to put them in DLL at all. + */ // ---------------------------------------------------------------------------- // wxPixelFormat @@ -101,17 +105,11 @@ - type which can contain the full pixel value (all channels) */ -#ifdef __DIGITALMARS__ template <class Channel, size_t Bpp, int R, int G, int B, int A = -1, class Pixel = wxUint32> -#else -template <typename Channel, - size_t Bpp, int R, int G, int B, int A = -1, - typename Pixel = wxUint32> -#endif - -struct WXDLLEXPORT wxPixelFormat + +struct wxPixelFormat { // iterator over pixels is usually of type "ChannelType *" typedef Channel ChannelType; @@ -126,7 +124,7 @@ struct WXDLLEXPORT wxPixelFormat enum { BitsPerPixel = Bpp }; // size of one pixel in ChannelType units (usually bytes) - enum { SizePixel = BitsPerPixel / (8 * sizeof(ChannelType)) }; + enum { SizePixel = Bpp / (8 * sizeof(Channel)) }; // the channels indices inside the pixel enum @@ -149,33 +147,57 @@ struct WXDLLEXPORT wxPixelFormat typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxImagePixelFormat; // the (most common) native bitmap format without alpha support -typedef wxPixelFormat<unsigned char, 24, - #ifdef __WXMSW__ - 2, 1, 0 - #else // !__WXMSW__ - 0, 1, 2 - #endif // __WXMSW__/!__WXMSW__ - > wxNativePixelFormat; +#if defined(__WXMSW__) + // under MSW the RGB components are reversed, they're in BGR order + typedef wxPixelFormat<unsigned char, 24, 2, 1, 0> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXMAC__) + // under Mac, first component is unused but still present, hence we use + // 32bpp, not 24 + typedef wxPixelFormat<unsigned char, 32, 1, 2, 3> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 0 +#elif defined(__WXCOCOA__) + // Cocoa is standard RGB or RGBA (normally it is RGBA) + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXGTK__) + // Under GTK+ 2.X we use GdkPixbuf, which is standard RGB or RGBA + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXDFB__) + // Under DirectFB, RGB components are reversed, they're in BGR order + typedef wxPixelFormat<unsigned char, 24, 2, 1, 0> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#endif // the (most common) native format for bitmaps with alpha channel -typedef wxPixelFormat<unsigned char, 32, - wxNativePixelFormat::RED, - wxNativePixelFormat::GREEN, - wxNativePixelFormat::BLUE, - 3> wxAlphaPixelFormat; +#ifdef wxPIXEL_FORMAT_ALPHA + typedef wxPixelFormat<unsigned char, 32, + wxNativePixelFormat::RED, + wxNativePixelFormat::GREEN, + wxNativePixelFormat::BLUE, + wxPIXEL_FORMAT_ALPHA> wxAlphaPixelFormat; +#endif // wxPIXEL_FORMAT_ALPHA // we also define the (default/best) pixel format for the given class: this is // used as default value for the pixel format in wxPixelIterator template template <class T> struct wxPixelFormatFor; +#if wxUSE_IMAGE // wxPixelFormatFor is only defined for wxImage, attempt to use it with other // classes (wxBitmap...) will result in compile errors which is exactly what we // want template <> -struct WXDLLEXPORT wxPixelFormatFor<wxImage> +struct wxPixelFormatFor<wxImage> { typedef wxImagePixelFormat Format; }; +#endif //wxUSE_IMAGE // ---------------------------------------------------------------------------- // wxPixelData @@ -185,7 +207,7 @@ struct WXDLLEXPORT wxPixelFormatFor<wxImage> wxPixelDataBase is just a helper for wxPixelData: it contains things common to both wxImage and wxBitmap specializations. */ -class WXDLLEXPORT wxPixelDataBase +class wxPixelDataBase { public: // origin of the rectangular region we represent @@ -195,6 +217,8 @@ public: int GetWidth() const { return m_width; } int GetHeight() const { return m_height; } + wxSize GetSize() const { return wxSize(m_width, m_height); } + // the distance between two rows int GetRowStride() const { return m_stride; } @@ -251,26 +275,28 @@ protected: // we need to define this skeleton template to mollify VC++ template <class Image> -struct WXDLLEXPORT wxPixelDataOut +struct wxPixelDataOut { template <class PixelFormat> - class WXDLLEXPORT wxPixelDataIn + class wxPixelDataIn { public: class Iterator { }; }; }; +#if wxUSE_IMAGE // wxPixelData specialization for wxImage: this is the simplest case as we // don't have to care about different pixel formats here template <> -struct WXDLLEXPORT wxPixelDataOut<wxImage> +struct wxPixelDataOut<wxImage> { // NB: this is a template class even though it doesn't use its template // parameter because otherwise wxPixelData couldn't compile template <class dummyPixelFormat> - class WXDLLEXPORT wxPixelDataIn : public wxPixelDataBase + class wxPixelDataIn : public wxPixelDataBase { + public: // the type of the class we're working with typedef wxImage ImageType; @@ -328,7 +354,7 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage> { m_pRGB += PixelFormat::SizePixel; if ( m_pAlpha ) - m_pAlpha += PixelFormat::SizePixel; + ++m_pAlpha; return *this; } @@ -380,9 +406,9 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage> // ----------- // access to invidividual colour components - ChannelType& Red() { return m_ptr[PixelFormat::RED]; } - ChannelType& Green() { return m_ptr[PixelFormat::GREEN]; } - ChannelType& Blue() { return m_ptr[PixelFormat::BLUE]; } + ChannelType& Red() { return m_pRGB[PixelFormat::RED]; } + ChannelType& Green() { return m_pRGB[PixelFormat::GREEN]; } + ChannelType& Blue() { return m_pRGB[PixelFormat::BLUE]; } ChannelType& Alpha() { return *m_pAlpha; } // private: -- see comment in the beginning of the file @@ -418,7 +444,7 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage> { m_stride = Iterator::SizePixel * m_width; - InitRect(rect.GetPositions(), rect.GetSize()); + InitRect(rect.GetPosition(), rect.GetSize()); } // we evaluate to true only if we could get access to bitmap data @@ -445,14 +471,16 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage> Iterator m_pixels; }; }; +#endif //wxUSE_IMAGE +#if wxUSE_GUI // wxPixelData specialization for wxBitmap: here things are more interesting as // we also have to support different pixel formats template <> -struct WXDLLEXPORT wxPixelDataOut<wxBitmap> +struct wxPixelDataOut<wxBitmap> { template <class Format> - class WXDLLEXPORT wxPixelDataIn : public wxPixelDataBase + class wxPixelDataIn : public wxPixelDataBase { public: // the type of the class we're working with @@ -497,6 +525,12 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap> bmp.GetRawData(data, PixelFormat::BitsPerPixel); } + // default constructor + Iterator() + { + m_ptr = NULL; + } + // return true if this iterator is valid bool IsOk() const { return m_ptr != NULL; } @@ -566,10 +600,9 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap> // private: -- see comment in the beginning of the file - // NB: for efficiency reasons this class must *not* have any other - // fields, otherwise it won't be put into a CPU register (as it - // should inside the inner loops) by some compilers, notably - // gcc + // for efficiency reasons this class should not have any other + // fields, otherwise it won't be put into a CPU register (as it + // should inside the inner loops) by some compilers, notably gcc ChannelType *m_ptr; }; @@ -584,7 +617,7 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap> wxPixelDataIn(wxBitmap& bmp, const wxRect& rect) : m_bmp(bmp), m_pixels(bmp, *this) { - InitRect(rect.GetPositions(), rect.GetSize()); + InitRect(rect.GetPosition(), rect.GetSize()); } wxPixelDataIn(wxBitmap& bmp, const wxPoint& pt, const wxSize& sz) @@ -603,11 +636,22 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap> // dtor unlocks the bitmap ~wxPixelDataIn() { - m_bmp.UngetRawData(*this); + if ( m_pixels.IsOk() ) + { +#if defined(__WXMSW__) || defined(__WXMAC__) + // this is a hack to mark wxBitmap as using alpha channel + if ( Format::HasAlpha ) + m_bmp.UseAlpha(); +#endif + m_bmp.UngetRawData(*this); + } + // else: don't call UngetRawData() if GetRawData() failed } - // call this to indicate that we should use the alpha channel - void UseAlpha() { m_bmp.UseAlpha(); } +#if WXWIN_COMPATIBILITY_2_8 + // not needed anymore, calls to it should be simply removed + wxDEPRECATED_INLINE( void UseAlpha(), wxEMPTY_PARAMETER_VALUE ) +#endif // private: -- see comment in the beginning of the file @@ -629,55 +673,37 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap> }; }; -#ifdef __DIGITALMARS__ -template <class Image, class PixelFormat = wxPixelFormatFor<Image> > -class wxPixelData : - public wxPixelDataOut<Image>:: wxPixelDataIn<PixelFormat> -{ -public: - wxPixelData(Image& image) - : wxPixelDataOut<Image>:: wxPixelDataIn<PixelFormat>(image) - { - } - - wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) - : wxPixelDataOut<Image>:: wxPixelDataIn<PixelFormat>(i, pt, sz) - { - } +#endif //wxUSE_GUI - wxPixelData(Image& i, const wxRect& rect) - : wxPixelDataOut<Image>:: wxPixelDataIn<PixelFormat>(i, rect) - { - } -}; -#else // not __DIGITALMARS__ template <class Image, class PixelFormat = wxPixelFormatFor<Image> > class wxPixelData : public wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> { public: - wxPixelData(Image& image) - : wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(image) - { - } + typedef + typename wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> + Base; - wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) - : wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(i, pt, sz) - { - } + wxPixelData(Image& image) : Base(image) { } - wxPixelData(Image& i, const wxRect& rect) - : wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(i, rect) - { - } + wxPixelData(Image& i, const wxRect& rect) : Base(i, rect) { } + + wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) + : Base(i, pt, sz) + { + } }; -#endif // __DIGITALMARS__ // some "predefined" pixel data classes +#if wxUSE_IMAGE typedef wxPixelData<wxImage> wxImagePixelData; +#endif //wxUSE_IMAGE +#if wxUSE_GUI typedef wxPixelData<wxBitmap, wxNativePixelFormat> wxNativePixelData; typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> wxAlphaPixelData; +#endif //wxUSE_GUI + // ---------------------------------------------------------------------------- // wxPixelIterator // ---------------------------------------------------------------------------- @@ -695,13 +721,8 @@ typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> wxAlphaPixelData; partial template specialization then and neither VC6 nor VC7 provide it. */ template < class Image, class PixelFormat = wxPixelFormatFor<Image> > -struct WXDLLEXPORT wxPixelIterator : wxPixelData<Image, PixelFormat>::Iterator +struct wxPixelIterator : public wxPixelData<Image, PixelFormat>::Iterator { }; -#ifdef __VISUALC__ - #pragma warning(default: 4355) -#endif - -#endif // _WX_RAWBMP_H_BASE_ - +#endif // _WX_RAWBMP_H_