]> git.saurik.com Git - wxWidgets.git/commitdiff
First attempt to document raw bitmap access
authorRobert Roebling <robert@roebling.de>
Thu, 10 Apr 2008 13:21:20 +0000 (13:21 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 10 Apr 2008 13:21:20 +0000 (13:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

interface/bitmap.h
interface/rawbmp.h [new file with mode: 0644]
interface/region.h

index 8656ae698357535d7be249e86b4bdcb19224e666..41fa0c644b8b75c2e5ca25663d658c6349eac683 100644 (file)
@@ -158,6 +158,11 @@ public:
 
     This class encapsulates the concept of a platform-dependent bitmap,
     either monochrome or colour or colour with alpha channel support.
+    
+    If you need direct access the bitmap data instead going through
+    drawing to it using wxMemoryDC you need to use the wxPixelData
+    class (either wxNativePixelData for RGB bitmaps or wxAlphaPixelData
+    for bitmaps with an additionaly alpha channel).
 
     @note
     Many wxBitmap functions take a @e type parameter, which is a value of the
@@ -178,7 +183,7 @@ public:
     ::wxNullBitmap
 
     @see @ref overview_bitmap, @ref overview_bitmap_supportedformats,
-         wxDC::Blit, wxIcon, wxCursor, wxBitmap, wxMemoryDC
+         wxDC::Blit, wxIcon, wxCursor, wxMemoryDC, wxImage, wxPixelData
 */
 class wxBitmap : public wxGDIObject
 {
diff --git a/interface/rawbmp.h b/interface/rawbmp.h
new file mode 100644 (file)
index 0000000..45b2ab1
--- /dev/null
@@ -0,0 +1,201 @@
+
+/**
+    @class wxPixelData
+    @wxheader{rawbmp.h}
+
+    A class template with ready to use implementations for getting
+    direct and efficient access to wxBitmap's internal data and
+    wxImage's internal data through a standard interface. It is
+    possible to extend this class (interface) to other types of
+    image content.
+    
+    Implemented on Windows, GTK+ and OS X:
+    wxNativePixelData: Class to access to wxBitmap's internal data without alpha channel (RGB).
+    wxAlphaPixelData: Class to access to wxBitmap's internal data with alpha channel (RGBA).
+    
+    Implemented everywhere:
+    wxImagePixelData: Class to access to wxImage's internal data with alpha channel (RGBA).
+    
+    @code
+    wxBitmap bmp;
+    wxNativePixelData data(bmp);
+    if ( !data )
+    {
+        ... raw access to bitmap data unavailable, do something else ...
+        return;
+    }
+
+    if ( data.GetWidth() < 20 || data.GetHeight() < 20 )
+    {
+        ... complain: the bitmap it too small ...
+        return;
+    }
+
+    wxNativePixelData::Iterator p(data);
+
+    // we draw a (10, 10)-(20, 20) rect manually using the given r, g, b
+    p.Offset(data, 10, 10);
+
+    for ( int y = 0; y < 10; ++y )
+    {
+        wxNativePixelData::Iterator rowStart = p;
+
+        for ( int x = 0; x < 10; ++x, ++p )
+        {
+            p.Red() = r;
+            p.Green() = g;
+            p.Blue() = b;
+        }
+
+        p = rowStart;
+        p.OffsetY(data, 1);
+    }
+    @endcode
+
+    @library{wxcore}
+    @category{gdi}
+    
+    @see wxBitmap, wxImage
+*/
+template <class Image, class PixelFormat = wxPixelFormatFor<Image> >
+class wxPixelData :
+    public wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>
+{
+public:
+    /** 
+        the type of the class we're working with
+    */
+    typedef Image ImageType;
+    
+    /**
+        Create pixel data object representing the entire image
+    */
+    wxPixelData(Image& image);
+    
+    
+    /**
+        Create pixel data object representing the area
+        of the image defined by @e rect.
+    */
+    wxPixelData(Image& i, const wxRect& rect);
+    
+    /**
+        Create pixel data object representing the area
+        of the image defined by @e pt and @e sz.
+    */
+    wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz)
+    
+    /**
+        Return true of if we could get access to bitmap data
+        successfully
+    */
+    operator bool() const:
+
+    /** 
+       Return the iterator pointing to the origin of the image
+    */
+    Iterator GetPixels() const;
+
+    /**
+        Returns origin of the rectangular region we represent
+    */
+    wxPoint GetOrigin() const;
+
+    /** 
+         Return width of the region we represent
+    */
+    int GetWidth() const;
+
+    /** 
+         Return height of the region we represent
+    */
+    int GetHeight() const;
+
+    /*
+        Return area which this class represents in the image
+    */
+    wxSize GetSize() const;
+
+    /**
+       Return the distance between two rows
+    */
+    int GetRowStride() const;
+
+
+    /**
+        Iterator
+    */
+        class Iterator
+        {
+        public:
+            /**
+               go back to (0, 0)
+            */
+            void Reset(const PixelData& data);
+            
+            /**
+               Initializes the iterator to point to the origin of the given
+               pixel data
+            */
+            Iterator(PixelData& data);
+
+            /**
+               Initializes the iterator to point to the origin of the given
+               Bitmap
+            */
+            Iterator(wxBitmap& bmp, PixelData& data);
+
+            /**
+               Default constructor
+            */
+            Iterator();
+
+            /**
+               Return true if this iterator is valid
+            */
+            bool IsOk() const;
+
+            /**
+               Advance the iterator to the next pixel, prefix version
+            */
+            Iterator& operator++();
+
+            /**
+               Postfix (hence less efficient -- don't use it unless you
+               absolutely must) version
+            */
+            Iterator operator++(int);
+
+            /**
+               Move x pixels to the right and y down
+               note that the rows don't wrap!
+            */
+            void Offset(const PixelData& data, int x, int y);
+
+            /**
+               Move x pixels to the right (again, no row wrapping)
+            */
+            void OffsetX(const PixelData&data, int x);
+
+            /**
+               Move y rows to the bottom
+            */
+            void OffsetY(const PixelData& data, int y);
+
+            /**
+               Go to the given position
+            */
+            void MoveTo(const PixelData& data, int x, int y);
+
+    //@{
+            /**
+               Data access: gives access to invidividual colour components.
+            */
+            ChannelType& Red();
+            ChannelType& Green();
+            ChannelType& Blue();
+            ChannelType& Alpha();
+    //@}
+        };
+};
+
index f27e9db5861f133fb7c56abff1fb1bcf10ae1d31..a9f96cf2f57790f9b6f3b0a3241698d2237eeaf2 100644 (file)
     See wxPaintEvent for an example of use.
 
     @library{wxcore}
-    @category{FIXME}
+    @category{gdi}
+
+    @stdobjects
+    ::wxNullRegion
 
     @see wxPaintEvent
 */