allow raw access to a part of the image only (faster when using alpha)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20409 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-05-01 16:37:51 +00:00
parent b72b192036
commit a452af5e68
3 changed files with 94 additions and 20 deletions

View File

@@ -180,12 +180,21 @@ struct WXDLLEXPORT wxPixelFormatFor<wxImage>
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; }
// 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;
@@ -316,7 +325,8 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage>
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);
@@ -384,6 +394,25 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage>
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.GetPositions(), 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 +421,15 @@ struct WXDLLEXPORT wxPixelDataOut<wxImage>
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 +469,22 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap>
*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 +504,8 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap>
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);
@@ -520,17 +560,31 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap>
// 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
// 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.GetPositions(), 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
// successfully
operator bool() const { return m_pixels.IsOk(); }
@@ -554,6 +608,16 @@ struct WXDLLEXPORT wxPixelDataOut<wxBitmap>
// 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;
}
};
};
@@ -562,10 +626,20 @@ class wxPixelData :
public wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>
{
public:
wxPixelData(const Image& image)
wxPixelData(Image& image)
: wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(image)
{
}
wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz)
: wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(i, pt, sz)
{
}
wxPixelData(Image& i, const wxRect& rect)
: wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat>(i, rect)
{
}
};
// some "predefined" pixel data classes

View File

@@ -260,7 +260,9 @@ public:
{
SetClientSize(SIZE, SIZE);
wxAlphaPixelData data(m_bitmap);
wxAlphaPixelData data(m_bitmap,
wxPoint(BORDER, BORDER),
wxSize(REAL_SIZE, REAL_SIZE));
if ( !data )
{
wxLogError(_T("Failed to gain raw access to bitmap data"));
@@ -271,8 +273,6 @@ public:
wxAlphaPixelData::Iterator p(data);
p.Offset(data, BORDER, BORDER);
for ( int y = 0; y < REAL_SIZE; ++y )
{
wxAlphaPixelData::Iterator rowStart = p;

View File

@@ -2314,7 +2314,7 @@ wxAlphaBlend(wxDC& dc, int xDst, int yDst, int w, int h, const wxBitmap& bmpSrc)
// combine them with the source bitmap using alpha
wxAlphaPixelData dataDst(bmpDst),
dataSrc(bmpSrc);
dataSrc((wxBitmap &)bmpSrc);
wxCHECK_RET( dataDst && dataSrc,
_T("failed to get raw data in wxAlphaBlend") );