X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f734e1dad1a2b9aae1780cda64efd46233766c92..65df77ec74a1dc36af9eb27205859eb604b1a5c4:/include/wx/rawbmp.h diff --git a/include/wx/rawbmp.h b/include/wx/rawbmp.h index b0037d8966..e2998760e1 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 // @@ -100,9 +102,11 @@ - index of the alpha component or -1 if none - type which can contain the full pixel value (all channels) */ -template + class Pixel = wxUint32> + struct WXDLLEXPORT wxPixelFormat { // iterator over pixels is usually of type "ChannelType *" @@ -118,7 +122,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,20 +145,32 @@ 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 +#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 @@ -180,12 +196,23 @@ struct WXDLLEXPORT wxPixelFormatFor class WXDLLEXPORT wxPixelDataBase { public: + // origin of the rectangular region we represent + wxPoint GetOrigin() const { return m_ptOrigin; } + + // width and height of the region we represent 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; } // private: -- see comment in the beginning of the file + // the origin of this image inside the bigger bitmap (usually (0, 0)) + wxPoint m_ptOrigin; + // the size of the image we address, in pixels int m_width, m_height; @@ -266,7 +293,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 @@ -311,12 +338,13 @@ struct WXDLLEXPORT wxPixelDataOut { m_pRGB += PixelFormat::SizePixel; if ( m_pAlpha ) - m_pAlpha += PixelFormat::SizePixel; + ++m_pAlpha; return *this; } - // postfix (hence less efficient -- don't use unless you must) version + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version Iterator operator++(int) { Iterator p(*this); @@ -362,9 +390,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 @@ -384,6 +412,25 @@ struct WXDLLEXPORT wxPixelDataOut m_stride = Iterator::SizePixel * m_width; } + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxPoint& pt, + const wxSize& sz) : m_image(image), m_pixels(image) + { + m_stride = Iterator::SizePixel * m_width; + + InitRect(pt, sz); + } + + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxRect& rect) : m_image(image), m_pixels(image) + { + m_stride = Iterator::SizePixel * m_width; + + InitRect(rect.GetPosition(), rect.GetSize()); + } + // we evaluate to true only if we could get access to bitmap data // successfully operator bool() const { return m_pixels.IsOk(); } @@ -392,6 +439,15 @@ struct WXDLLEXPORT wxPixelDataOut Iterator GetPixels() const { return m_pixels; } private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_width = sz.x; + m_height = sz.y; + + m_ptOrigin = pt; + m_pixels.Offset(*this, pt.x, pt.y); + } + // the image we're working with ImageType& m_image; @@ -431,21 +487,22 @@ struct WXDLLEXPORT wxPixelDataOut *this = data.GetPixels(); } - // initializes the iterator to point to the origin of the given pixel - // data + // initializes the iterator to point to the origin of the given + // pixel data Iterator(PixelData& data) { Reset(data); } - // initializes the iterator to point to the origin of the given bitmap + // initializes the iterator to point to the origin of the given + // bitmap Iterator(wxBitmap& bmp, PixelData& data) { - // using cast here is ugly but it should be safe as GetRawData() - // real return type should be consistent with BitsPerPixel (which - // is in turn defined by ChannelType) and this is the only thing we - // can do without making GetRawData() a template function which is - // undesirable + // using cast here is ugly but it should be safe as + // GetRawData() real return type should be consistent with + // BitsPerPixel (which is in turn defined by ChannelType) and + // this is the only thing we can do without making GetRawData() + // a template function which is undesirable m_ptr = (ChannelType *) bmp.GetRawData(data, PixelFormat::BitsPerPixel); } @@ -465,7 +522,8 @@ struct WXDLLEXPORT wxPixelDataOut return *this; } - // postfix (hence less efficient -- don't use unless you must) version + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version Iterator operator++(int) { Iterator p(*this); @@ -518,17 +576,30 @@ 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; }; - // ctor associates this pointer with a bitmap and locks the bitmap for raw - // access, it will be unlocked only by our dtor and so these objects should - // normally be only created on the stack, i.e. have limited life-time - wxPixelDataIn(wxBitmap bmp) : m_bmp(bmp), m_pixels(bmp, *this) + // ctor associates this pointer with a bitmap and locks the bitmap for + // raw access, it will be unlocked only by our dtor and so these + // objects should normally be only created on the stack, i.e. have + // limited life-time + wxPixelDataIn(wxBitmap& bmp) : m_bmp(bmp), m_pixels(bmp, *this) + { + } + + wxPixelDataIn(wxBitmap& bmp, const wxRect& rect) + : m_bmp(bmp), m_pixels(bmp, *this) + { + InitRect(rect.GetPosition(), rect.GetSize()); + } + + wxPixelDataIn(wxBitmap& bmp, const wxPoint& pt, const wxSize& sz) + : m_bmp(bmp), m_pixels(bmp, *this) { + InitRect(pt, sz); } // we evaluate to true only if we could get access to bitmap data @@ -554,20 +625,47 @@ struct WXDLLEXPORT wxPixelDataOut // the iterator pointing to the image origin Iterator m_pixels; + + private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_pixels.Offset(*this, pt.x, pt.y); + + m_ptOrigin = pt; + m_width = sz.x; + m_height = sz.y; + } }; }; +#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(const Image& image) - : wxPixelDataOut::template wxPixelDataIn(image) - { - } + typedef + typename wxPixelDataOut::template wxPixelDataIn + Base; + + wxPixelData(Image& image) : Base(image) { } + + 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 typedef wxPixelData wxImagePixelData; typedef wxPixelData wxNativePixelData; @@ -596,6 +694,7 @@ struct WXDLLEXPORT wxPixelIterator : wxPixelData::Iterator #ifdef __VISUALC__ #pragma warning(default: 4355) + #pragma warning(default: 4097) #endif #endif // _WX_RAWBMP_H_BASE_