#include "wx/defs.h"
-#include "wx/palette.h"
#include "wx/bitmap.h"
+#include "wx/palette.h"
#include "wx/icon.h"
#include "wx/filefn.h"
#include "wx/image.h"
#include "wx/dcmemory.h"
#include "wx/app.h"
+#include "wx/rawbmp.h"
#ifdef __WXGTK20__
// need this to get gdk_image_new_bitmap()
#include <gdk/gdkrgb.h>
#endif // GTK+ 2.0/1.2
-#include <math.h>
+#include "wx/math.h"
extern void gdk_wx_draw_bitmap (GdkDrawable *drawable,
GdkGC *gc,
if (depth == -1)
depth = visual->depth;
- wxCHECK_MSG( (depth == visual->depth) || (depth == 1), FALSE,
+ wxCHECK_MSG( (depth == visual->depth) || (depth == 1) || (depth == 32), FALSE,
wxT("invalid bitmap depth") )
m_refData = new wxBitmapRefData();
M_BMPDATA->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 );
M_BMPDATA->m_bpp = 1;
}
+#ifdef __WXGTK20__
+ else if (depth == 32)
+ {
+ M_BMPDATA->m_pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, true,
+ 8, width, height);
+ M_BMPDATA->m_bpp = 32;
+ }
+#endif
else
{
M_BMPDATA->m_pixmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, depth );
bmp.SetWidth(width);
bmp.SetHeight(height);
bmp.SetDepth(GetDepth());
- bmp.SetPixbuf(gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE/*has_alpha*/,
+ bmp.SetPixbuf(gdk_pixbuf_new(GDK_COLORSPACE_RGB,
+ gdk_pixbuf_get_has_alpha(GetPixbuf()),
8, width, height));
- gdk_pixbuf_scale(M_BMPDATA->m_pixbuf, bmp.GetPixbuf(),
+ gdk_pixbuf_scale(GetPixbuf(), bmp.GetPixbuf(),
0, 0, width, height,
clipx, clipy,
(double)newx/GetWidth(), (double)newy/GetHeight(),
if (!pixbuf)
return false;
+ wxASSERT( image.HasAlpha() ); // for now
wxASSERT( gdk_pixbuf_get_n_channels(pixbuf) == 4 );
wxASSERT( gdk_pixbuf_get_width(pixbuf) == width );
wxASSERT( gdk_pixbuf_get_height(pixbuf) == height );
int rowinc = gdk_pixbuf_get_rowstride(pixbuf) - 4 * width;
-
for (int y = 0; y < height; y++, out += rowinc)
{
for (int x = 0; x < width; x++, alpha++, out += 4, in += 3)
}
wxBitmap::wxBitmap( const wxBitmap& bmp )
- : wxGDIObject()
+ : wxBitmapBase()
{
Ref( bmp );
}
-wxBitmap::wxBitmap( const wxString &filename, int type )
+wxBitmap::wxBitmap( const wxString &filename, wxBitmapType type )
{
LoadFile( filename, type );
}
if (HasPixbuf())
{
GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
- TRUE/*has_alpha*/,
+ gdk_pixbuf_get_has_alpha(GetPixbuf()),
8, GetWidth(), GetHeight());
ret.SetPixbuf(pixbuf);
- gdk_pixbuf_copy_area(M_BMPDATA->m_pixbuf,
+ gdk_pixbuf_copy_area(GetPixbuf(),
rect.x, rect.y, rect.width, rect.height,
pixbuf, 0, 0);
}
return ret;
}
-bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(palette) )
+bool wxBitmap::SaveFile( const wxString &name, wxBitmapType type, const wxPalette *WXUNUSED(palette) ) const
{
wxCHECK_MSG( Ok(), FALSE, wxT("invalid bitmap") );
return FALSE;
}
-bool wxBitmap::LoadFile( const wxString &name, int type )
+bool wxBitmap::LoadFile( const wxString &name, wxBitmapType type )
{
UnRef();
return M_BMPDATA->m_palette;
}
+void wxBitmap::SetPalette(const wxPalette& WXUNUSED(palette))
+{
+ // TODO
+}
+
void wxBitmap::SetHeight( int height )
{
if (!m_refData)
m_refData = new wxBitmapRefData();
M_BMPDATA->m_pixmap = pixmap;
+#ifdef __WXGTK20__
+ PurgeOtherRepresentations(Pixmap);
+#endif
}
void wxBitmap::SetBitmap( GdkPixmap *bitmap )
m_refData = new wxBitmapRefData();
M_BMPDATA->m_bitmap = bitmap;
+#ifdef __WXGTK20__
+ PurgeOtherRepresentations(Pixmap);
+#endif
}
GdkPixmap *wxBitmap::GetPixmap() const
// create the pixmap on the fly if we use Pixbuf representation:
if (HasPixbuf() && !HasPixmap())
{
+ delete M_BMPDATA->m_mask;
+ M_BMPDATA->m_mask = new wxMask();
gdk_pixbuf_render_pixmap_and_mask(M_BMPDATA->m_pixbuf,
&M_BMPDATA->m_pixmap,
- NULL /*mask*/,
+ &M_BMPDATA->m_mask->m_bitmap,
128 /*threshold*/);
}
#endif // __WXGTK20__
{
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
+ if (HasPixmap() && !HasPixbuf())
+ {
+ int width = GetWidth();
+ int height = GetHeight();
+
+ GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
+ GetMask() != NULL,
+ 8, width, height);
+ M_BMPDATA->m_pixbuf =
+ gdk_pixbuf_get_from_drawable(pixbuf, M_BMPDATA->m_pixmap, NULL,
+ 0, 0, 0, 0, width, height);
+
+ // apply the mask to created pixbuf:
+ if (M_BMPDATA->m_pixbuf && M_BMPDATA->m_mask)
+ {
+ GdkPixbuf *pmask =
+ gdk_pixbuf_get_from_drawable(NULL,
+ M_BMPDATA->m_mask->GetBitmap(),
+ NULL,
+ 0, 0, 0, 0, width, height);
+ if (pmask)
+ {
+ guchar *bmp = gdk_pixbuf_get_pixels(pixbuf);
+ guchar *mask = gdk_pixbuf_get_pixels(pmask);
+ int bmprowinc = gdk_pixbuf_get_rowstride(pixbuf) - 4 * width;
+ int maskrowinc = gdk_pixbuf_get_rowstride(pmask) - 3 * width;
+
+ for (int y = 0; y < height;
+ y++, bmp += bmprowinc, mask += maskrowinc)
+ {
+ for (int x = 0; x < width; x++, bmp += 4, mask += 3)
+ {
+ if (mask[0] == 0 /*black pixel*/)
+ bmp[3] = 0;
+ }
+ }
+
+ gdk_pixbuf_unref(pmask);
+ }
+ }
+ }
+
return M_BMPDATA->m_pixbuf;
}
m_refData = new wxBitmapRefData();
M_BMPDATA->m_pixbuf = pixbuf;
+ PurgeOtherRepresentations(Pixbuf);
}
void wxBitmap::PurgeOtherRepresentations(wxBitmap::Representation keep)
}
#endif // __WXGTK20__
+
+void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
+{
+#ifdef __WXGTK20__
+ if (bpp != 32)
+ return NULL;
+
+ GdkPixbuf *pixbuf = GetPixbuf();
+ if (!pixbuf)
+ return NULL;
+
+#if 0
+ if (gdk_pixbuf_get_has_alpha( pixbuf ))
+ wxPrintf( wxT("Has alpha\n") );
+ else
+ wxPrintf( wxT("No alpha.\n") );
+#endif
+
+ data.m_height = gdk_pixbuf_get_height( pixbuf );
+ data.m_width = gdk_pixbuf_get_width( pixbuf );
+ data.m_stride = gdk_pixbuf_get_rowstride( pixbuf );
+
+ return gdk_pixbuf_get_pixels( pixbuf );
+#else
+ return NULL;
+#endif
+}
+
+void wxBitmap::UngetRawData(wxPixelDataBase& data)
+{
+}
+
+
+bool wxBitmap::HasAlpha() const
+{
+#ifdef __WXGTK20__
+ return HasPixbuf();
+#else
+ return false;
+#endif
+}
+
+void wxBitmap::UseAlpha()
+{
+#ifdef __WXGTK20__
+ GetPixbuf();
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// wxBitmapHandler
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler,wxBitmapHandlerBase)
+
+wxBitmapHandler::~wxBitmapHandler()
+{
+}
+
+bool wxBitmapHandler::Create(wxBitmap *bitmap, void *data, long type, int width, int height, int depth)
+{
+ return FALSE;
+}
+
+bool wxBitmapHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+ int desiredWidth, int desiredHeight)
+{
+ return FALSE;
+}
+
+bool wxBitmapHandler::SaveFile(const wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette)
+{
+ return FALSE;
+}
+
+/* static */ void wxBitmap::InitStandardHandlers()
+{
+ // TODO: Insert handler based on GdkPixbufs handler later
+}
+
+