X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a452af5e682893eb97b15cde1e63a09fd02e5931..2a32f1733dd39882d58627d5cb22dbdeb54eb693:/include/wx/rawbmp.h diff --git a/include/wx/rawbmp.h b/include/wx/rawbmp.h index e5d03d0a6d..1a8551ca19 100644 --- a/include/wx/rawbmp.h +++ b/include/wx/rawbmp.h @@ -5,13 +5,15 @@ // Modified by: // Created: 10.03.03 // RCS-ID: $Id$ -// Copyright: (c) 2002 Vadim Zeitlin +// Copyright: (c) 2002 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _WX_RAWBMP_H_BASE_ #define _WX_RAWBMP_H_BASE_ +#include "wx/image.h" + // ---------------------------------------------------------------------------- // Abstract Pixel API // @@ -74,6 +76,13 @@ #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 // ---------------------------------------------------------------------------- @@ -100,10 +109,12 @@ - index of the alpha component or -1 if none - type which can contain the full pixel value (all channels) */ -template -struct WXDLLEXPORT wxPixelFormat + class Pixel = wxUint32> + +struct wxPixelFormat { // iterator over pixels is usually of type "ChannelType *" typedef Channel ChannelType; @@ -118,7 +129,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 @@ -141,33 +152,52 @@ struct WXDLLEXPORT wxPixelFormat typedef wxPixelFormat wxImagePixelFormat; // the (most common) native bitmap format without alpha support -typedef wxPixelFormat wxNativePixelFormat; +#if defined(__WXMSW__) + // under MSW the RGB components are inversed, they're in BGR order + typedef wxPixelFormat 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 wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 0 +#elif defined(__WXCOCOA__) + // Cocoa is standard RGB or RGBA (normally it is RGBA) + typedef wxPixelFormat wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXGTK__) + // Under GTK+ 2.X we use GdkPixbuf, which should be RGBA + typedef wxPixelFormat wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#endif // the (most common) native format for bitmaps with alpha channel -typedef wxPixelFormat wxAlphaPixelFormat; +#ifdef wxPIXEL_FORMAT_ALPHA + typedef wxPixelFormat 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 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 +struct wxPixelFormatFor { typedef wxImagePixelFormat Format; }; +#endif //wxUSE_IMAGE // ---------------------------------------------------------------------------- // wxPixelData @@ -177,7 +207,7 @@ struct WXDLLEXPORT wxPixelFormatFor 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 @@ -187,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; } @@ -243,26 +275,28 @@ protected: // we need to define this skeleton template to mollify VC++ template -struct WXDLLEXPORT wxPixelDataOut +struct wxPixelDataOut { template - 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 +struct wxPixelDataOut { // NB: this is a template class even though it doesn't use its template // parameter because otherwise wxPixelData couldn't compile template - class WXDLLEXPORT wxPixelDataIn : public wxPixelDataBase + class wxPixelDataIn : public wxPixelDataBase { + public: // the type of the class we're working with typedef wxImage ImageType; @@ -275,7 +309,7 @@ struct WXDLLEXPORT wxPixelDataOut typedef wxImagePixelFormat PixelFormat; // the type of the pixel components - typedef typename PixelFormat::ChannelType ChannelType; + typedef typename dummyPixelFormat::ChannelType ChannelType; // the pixel data we're working with typedef @@ -320,7 +354,7 @@ struct WXDLLEXPORT wxPixelDataOut { m_pRGB += PixelFormat::SizePixel; if ( m_pAlpha ) - m_pAlpha += PixelFormat::SizePixel; + ++m_pAlpha; return *this; } @@ -372,9 +406,9 @@ struct WXDLLEXPORT wxPixelDataOut // ----------- // 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 @@ -410,7 +444,7 @@ struct WXDLLEXPORT wxPixelDataOut { 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 @@ -437,14 +471,16 @@ struct WXDLLEXPORT wxPixelDataOut 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 +struct wxPixelDataOut { template - class WXDLLEXPORT wxPixelDataIn : public wxPixelDataBase + class wxPixelDataIn : public wxPixelDataBase { public: // the type of the class we're working with @@ -558,10 +594,9 @@ struct WXDLLEXPORT wxPixelDataOut // 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; }; @@ -576,7 +611,7 @@ struct WXDLLEXPORT wxPixelDataOut 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) @@ -620,33 +655,46 @@ struct WXDLLEXPORT wxPixelDataOut } }; }; +#endif //wxUSE_GUI + +#ifdef __VISUALC__ + // typedef-name 'foo' used as synonym for class-name 'bar' + // (VC++ gives this warning each time wxPixelData::Base is used but it + // doesn't make any sense here -- what's wrong with using typedef instead + // of class, this is what it is here for!) + #pragma warning(disable: 4097) +#endif // __VISUALC__ template > class wxPixelData : public wxPixelDataOut::template wxPixelDataIn { public: - wxPixelData(Image& image) - : wxPixelDataOut::template wxPixelDataIn(image) - { - } + typedef + typename wxPixelDataOut::template wxPixelDataIn + Base; - wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) - : wxPixelDataOut::template wxPixelDataIn(i, pt, sz) - { - } + wxPixelData(Image& image) : Base(image) { } - wxPixelData(Image& i, const wxRect& rect) - : wxPixelDataOut::template wxPixelDataIn(i, rect) - { - } + wxPixelData(Image& i, const wxRect& rect) : Base(i, rect) { } + + wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) + : Base(i, pt, sz) + { + } }; + // some "predefined" pixel data classes +#if wxUSE_IMAGE typedef wxPixelData wxImagePixelData; +#endif //wxUSE_IMAGE +#if wxUSE_GUI typedef wxPixelData wxNativePixelData; typedef wxPixelData wxAlphaPixelData; +#endif //wxUSE_GUI + // ---------------------------------------------------------------------------- // wxPixelIterator // ---------------------------------------------------------------------------- @@ -664,12 +712,13 @@ typedef wxPixelData wxAlphaPixelData; partial template specialization then and neither VC6 nor VC7 provide it. */ template < class Image, class PixelFormat = wxPixelFormatFor > -struct WXDLLEXPORT wxPixelIterator : wxPixelData::Iterator +struct wxPixelIterator : wxPixelData::Iterator { }; #ifdef __VISUALC__ #pragma warning(default: 4355) + #pragma warning(default: 4097) #endif #endif // _WX_RAWBMP_H_BASE_