git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40569
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
#ifndef WX_PRECOMP
#include "wx/app.h"
#ifndef WX_PRECOMP
#include "wx/app.h"
- #include "wx/dcmemory.h"
#include "wx/palette.h"
#include "wx/icon.h"
#include "wx/math.h"
#include "wx/image.h"
#endif
#include "wx/palette.h"
#include "wx/icon.h"
#include "wx/math.h"
#include "wx/image.h"
#endif
-#include "wx/filefn.h"
-
-#include <gdk/gdkx.h>
-
-#include <gdk/gdkimage.h>
extern void gdk_wx_draw_bitmap (GdkDrawable *drawable,
GdkGC *gc,
extern void gdk_wx_draw_bitmap (GdkDrawable *drawable,
GdkGC *gc,
GdkGC *gc = gdk_gc_new( m_bitmap );
GdkColor color;
GdkGC *gc = gdk_gc_new( m_bitmap );
GdkColor color;
- color.red = 65000;
- color.green = 65000;
- color.blue = 65000;
color.pixel = 1;
gdk_gc_set_foreground( gc, &color );
color.pixel = 1;
gdk_gc_set_foreground( gc, &color );
- gdk_gc_set_fill( gc, GDK_SOLID );
gdk_draw_rectangle( m_bitmap, gc, TRUE, 0, 0, image.GetWidth(), image.GetHeight() );
unsigned char *data = image.GetData();
gdk_draw_rectangle( m_bitmap, gc, TRUE, 0, 0, image.GetWidth(), image.GetHeight() );
unsigned char *data = image.GetData();
- color.red = 0;
- color.green = 0;
- color.blue = 0;
color.pixel = 0;
gdk_gc_set_foreground( gc, &color );
color.pixel = 0;
gdk_gc_set_foreground( gc, &color );
(data[index+2] == blue))
{
if (start_x == -1)
(data[index+2] == blue))
{
if (start_x == -1)
- GdkVisual *visual = wxTheApp->GetGdkVisual();
-
- if (depth == -1)
- depth = visual->depth;
-
- wxCHECK_MSG( (depth == visual->depth) || (depth == 1) || (depth == 32), false,
- wxT("invalid bitmap depth") );
-
- m_refData = new wxBitmapRefData();
- M_BMPDATA->m_mask = (wxMask *) NULL;
- M_BMPDATA->m_width = width;
- M_BMPDATA->m_height = height;
- M_BMPDATA->m_bpp = depth;
- M_BMPDATA->m_pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, true,
- 8, width, height);
+ SetPixbuf(gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, width, height));
+ M_BMPDATA->m_bpp = 32;
- M_BMPDATA->m_pixmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, depth );
+ if (depth != 1)
+ {
+ const GdkVisual* visual = wxTheApp->GetGdkVisual();
+ if (depth == -1)
+ depth = visual->depth;
+
+ wxCHECK_MSG(depth == visual->depth, false, wxT("invalid bitmap depth"));
+ }
+
+ SetPixmap(gdk_pixmap_new(wxGetRootWindow()->window, width, height, depth));
wxCHECK_MSG( bits != NULL, false, wxT("invalid bitmap data") );
wxCHECK_MSG( bits != NULL, false, wxT("invalid bitmap data") );
- GdkVisual *visual = wxTheApp->GetGdkVisual();
-
- m_refData = new wxBitmapRefData();
-
GdkBitmap *mask = (GdkBitmap*) NULL;
GdkBitmap *mask = (GdkBitmap*) NULL;
-
- M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( wxGetRootWindow()->window, &mask, NULL, (gchar **) bits );
+ SetPixmap(gdk_pixmap_create_from_xpm_d(wxGetRootWindow()->window, &mask, NULL, (gchar**)bits));
wxCHECK_MSG( M_BMPDATA->m_pixmap, false, wxT("couldn't create pixmap") );
if (mask)
{
wxCHECK_MSG( M_BMPDATA->m_pixmap, false, wxT("couldn't create pixmap") );
if (mask)
{
- M_BMPDATA->m_mask = new wxMask();
+ M_BMPDATA->m_mask = new wxMask;
M_BMPDATA->m_mask->m_bitmap = mask;
}
M_BMPDATA->m_mask->m_bitmap = mask;
}
- gdk_drawable_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
-
- M_BMPDATA->m_bpp = visual->depth; // Can we get a different depth from create_from_xpm_d() ?
-
return true;
}
wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight, int newx, int newy )
{
return true;
}
wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight, int newx, int newy )
{
- wxCHECK_MSG( Ok(), wxNullBitmap, wxT("invalid bitmap") );
+ wxBitmap bmp;
+
+ wxCHECK_MSG(Ok(), bmp, wxT("invalid bitmap"));
if (newy==M_BMPDATA->m_width && newy==M_BMPDATA->m_height)
return *this;
if (newy==M_BMPDATA->m_width && newy==M_BMPDATA->m_height)
return *this;
width = wxMin(width, clipwidth);
height = wxMin(height, clipheight);
width = wxMin(width, clipwidth);
height = wxMin(height, clipheight);
- bmp.SetWidth(width);
- bmp.SetHeight(height);
bmp.SetDepth(GetDepth());
bmp.SetPixbuf(gdk_pixbuf_new(GDK_COLORSPACE_RGB,
gdk_pixbuf_get_has_alpha(GetPixbuf()),
bmp.SetDepth(GetDepth());
bmp.SetPixbuf(gdk_pixbuf_new(GDK_COLORSPACE_RGB,
gdk_pixbuf_get_has_alpha(GetPixbuf()),
- GdkImage *img = (GdkImage*) NULL;
- if (GetPixmap())
- img = gdk_image_get( GetPixmap(), 0, 0, GetWidth(), GetHeight() );
- else
- wxFAIL_MSG( wxT("Ill-formed bitmap") );
-
- wxCHECK_MSG( img, wxNullBitmap, wxT("couldn't create image") );
-
- int bpp = -1;
+ GdkImage* img = gdk_image_get(GetPixmap(), 0, 0, GetWidth(), GetHeight());
+ wxCHECK_MSG(img, bmp, wxT("couldn't create image"));
GdkGC *gc = NULL;
GdkPixmap *dstpix = NULL;
GdkGC *gc = NULL;
GdkPixmap *dstpix = NULL;
+ char *dst = NULL;
+ long dstbyteperline = 0;
+
if (GetDepth() != 1)
{
GdkVisual *visual = gdk_drawable_get_visual( GetPixmap() );
if (visual == NULL)
visual = wxTheApp->GetGdkVisual();
if (GetDepth() != 1)
{
GdkVisual *visual = gdk_drawable_get_visual( GetPixmap() );
if (visual == NULL)
visual = wxTheApp->GetGdkVisual();
- bpp = visual->depth;
- bmp = wxBitmap(width,height,bpp);
+ bmp = wxBitmap(width, height, visual->depth);
dstpix = bmp.GetPixmap();
gc = gdk_gc_new( dstpix );
}
dstpix = bmp.GetPixmap();
gc = gdk_gc_new( dstpix );
}
-
- char *dst = NULL;
- long dstbyteperline = 0;
-
- if (GetDepth() == 1)
- bpp = 1;
- dstbyteperline = width/8*M_BMPDATA->m_bpp;
- if (width*M_BMPDATA->m_bpp % 8 != 0)
- dstbyteperline++;
+ dstbyteperline = (width + 7) / 8;
dst = (char*) malloc(dstbyteperline*height);
}
dst = (char*) malloc(dstbyteperline*height);
}
- dstbyteperline = width/8;
- if (width % 8 != 0)
- dstbyteperline++;
+ dstbyteperline = (width + 7) / 8;
dst = (char*) malloc(dstbyteperline*height);
img = gdk_image_get( GetMask()->GetBitmap(), 0, 0, GetWidth(), GetHeight() );
dst = (char*) malloc(dstbyteperline*height);
img = gdk_image_get( GetMask()->GetBitmap(), 0, 0, GetWidth(), GetHeight() );
if (image.GetWidth() <= 0 || image.GetHeight() <= 0)
return false;
if (image.GetWidth() <= 0 || image.GetHeight() <= 0)
return false;
- m_refData = new wxBitmapRefData();
-
return CreateFromImageAsBitmap(image);
return CreateFromImageAsBitmap(image);
- }
- else
- {
- if (image.HasAlpha())
- return CreateFromImageAsPixbuf(image);
- return CreateFromImageAsPixmap(image);
- }
+ if (image.HasAlpha())
+ return CreateFromImageAsPixbuf(image);
+
+ return CreateFromImageAsPixmap(image);
}
// conversion to mono bitmap:
}
// conversion to mono bitmap:
int width = image.GetWidth();
int height = image.GetHeight();
int width = image.GetWidth();
int height = image.GetHeight();
- SetHeight( height );
- SetWidth( width );
-
SetPixmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) );
SetPixmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) );
// Create picture image
GdkGC* data_gc = gdk_gc_new(M_BMPDATA->m_pixmap);
// Create picture image
GdkGC* data_gc = gdk_gc_new(M_BMPDATA->m_pixmap);
- wxMask *mask = new wxMask();
+ wxMask* mask = new wxMask;
mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 );
mask_gc = gdk_gc_new(mask->m_bitmap);
gdk_gc_set_foreground(mask_gc, &color);
mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 );
mask_gc = gdk_gc_new(mask->m_bitmap);
gdk_gc_set_foreground(mask_gc, &color);
}
// conversion to colour bitmap:
}
// conversion to colour bitmap:
-bool wxBitmap::CreateFromImageAsPixmap(const wxImage& img)
+bool wxBitmap::CreateFromImageAsPixmap(const wxImage& image)
- // convert alpha channel to mask, if it is present:
- wxImage image(img);
- image.ConvertAlphaToMask();
+ // alpha is handled by CreateFromImageAsPixbuf
+ wxASSERT(!image.HasAlpha());
int width = image.GetWidth();
int height = image.GetHeight();
int width = image.GetWidth();
int height = image.GetHeight();
- SetHeight( height );
- SetWidth( width );
-
SetPixmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, -1 ) );
SetPixmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, -1 ) );
- GdkVisual *visual = wxTheApp->GetGdkVisual();
-
- int bpp = visual->depth;
-
- SetDepth( bpp );
-
GdkGC *gc = gdk_gc_new( GetPixmap() );
gdk_draw_rgb_image( GetPixmap(),
GdkGC *gc = gdk_gc_new( GetPixmap() );
gdk_draw_rgb_image( GetPixmap(),
if (!image.HasMask())
return true;
if (!image.HasMask())
return true;
- wxMask *mask = new wxMask();
+ wxMask* mask = new wxMask;
mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 );
GdkGC* mask_gc = gdk_gc_new(mask->m_bitmap);
GdkColor color;
mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 );
GdkGC* mask_gc = gdk_gc_new(mask->m_bitmap);
GdkColor color;
wxASSERT( gdk_pixbuf_get_width(pixbuf) == width );
wxASSERT( gdk_pixbuf_get_height(pixbuf) == height );
wxASSERT( gdk_pixbuf_get_width(pixbuf) == width );
wxASSERT( gdk_pixbuf_get_height(pixbuf) == height );
- M_BMPDATA->m_pixbuf = pixbuf;
- SetHeight(height);
- SetWidth(width);
SetDepth(wxTheApp->GetGdkVisual()->depth);
SetDepth(wxTheApp->GetGdkVisual()->depth);
// Copy the data:
unsigned char *in = image.GetData();
// Copy the data:
unsigned char *in = image.GetData();
image.Create(GetWidth(), GetHeight());
unsigned char *data = image.GetData();
image.Create(GetWidth(), GetHeight());
unsigned char *data = image.GetData();
- if (!data)
- {
- wxFAIL_MSG( wxT("couldn't create image") );
- return wxNullImage;
- }
+ wxCHECK_MSG(data != NULL, wxNullImage, wxT("couldn't create image") );
{
if ( width > 0 && height > 0 )
{
{
if ( width > 0 && height > 0 )
{
- m_refData = new wxBitmapRefData();
-
- M_BMPDATA->m_mask = (wxMask *) NULL;
- M_BMPDATA->m_pixmap = gdk_bitmap_create_from_data
- (
- wxGetRootWindow()->window,
- (gchar *) bits,
- width,
- height
- );
- M_BMPDATA->m_width = width;
- M_BMPDATA->m_height = height;
- M_BMPDATA->m_bpp = 1;
+ SetPixmap(gdk_bitmap_create_from_data(wxGetRootWindow()->window, bits, width, height));
wxASSERT_MSG( M_BMPDATA->m_pixmap, wxT("couldn't create bitmap") );
}
wxASSERT_MSG( M_BMPDATA->m_pixmap, wxT("couldn't create bitmap") );
}
bool wxBitmap::CopyFromIcon(const wxIcon& icon)
{
*this = icon;
bool wxBitmap::CopyFromIcon(const wxIcon& icon)
{
*this = icon;
}
wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const
{
}
wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const
{
wxCHECK_MSG( Ok() &&
(rect.x >= 0) && (rect.y >= 0) &&
(rect.x+rect.width <= M_BMPDATA->m_width) && (rect.y+rect.height <= M_BMPDATA->m_height),
wxCHECK_MSG( Ok() &&
(rect.x >= 0) && (rect.y >= 0) &&
(rect.x+rect.width <= M_BMPDATA->m_width) && (rect.y+rect.height <= M_BMPDATA->m_height),
- wxNullBitmap, wxT("invalid bitmap or bitmap region") );
-
- wxBitmap ret( rect.width, rect.height, M_BMPDATA->m_bpp );
- wxASSERT_MSG( ret.Ok(), wxT("GetSubBitmap error") );
+ ret, wxT("invalid bitmap or bitmap region") );
gdk_pixbuf_get_has_alpha(GetPixbuf()),
8, rect.width, rect.height);
ret.SetPixbuf(pixbuf);
gdk_pixbuf_get_has_alpha(GetPixbuf()),
8, rect.width, rect.height);
ret.SetPixbuf(pixbuf);
+ ret.SetDepth(M_BMPDATA->m_bpp);
gdk_pixbuf_copy_area(GetPixbuf(),
rect.x, rect.y, rect.width, rect.height,
pixbuf, 0, 0);
}
else
{
gdk_pixbuf_copy_area(GetPixbuf(),
rect.x, rect.y, rect.width, rect.height,
pixbuf, 0, 0);
}
else
{
- if (ret.GetDepth() != 1)
+ ret = wxBitmap(rect.width, rect.height, M_BMPDATA->m_bpp);
+ if (M_BMPDATA->m_bpp != 1)
{
GdkGC *gc = gdk_gc_new( ret.GetPixmap() );
gdk_draw_drawable( ret.GetPixmap(), gc, GetPixmap(), rect.x, rect.y, 0, 0, rect.width, rect.height );
{
GdkGC *gc = gdk_gc_new( ret.GetPixmap() );
gdk_draw_drawable( ret.GetPixmap(), gc, GetPixmap(), rect.x, rect.y, 0, 0, rect.width, rect.height );
wxCHECK_MSG( Ok(), false, wxT("invalid bitmap") );
// Try to save the bitmap via wxImage handlers:
wxCHECK_MSG( Ok(), false, wxT("invalid bitmap") );
// Try to save the bitmap via wxImage handlers:
- {
- wxImage image = ConvertToImage();
- if (image.Ok()) return image.SaveFile( name, type );
- }
-
- return false;
+ wxImage image = ConvertToImage();
+ return image.Ok() && image.SaveFile(name, type);
}
bool wxBitmap::LoadFile( const wxString &name, wxBitmapType type )
{
UnRef();
}
bool wxBitmap::LoadFile( const wxString &name, wxBitmapType type )
{
UnRef();
- if (!wxFileExists(name))
- return false;
-
- GdkVisual *visual = wxTheApp->GetGdkVisual();
-
if (type == wxBITMAP_TYPE_XPM)
{
if (type == wxBITMAP_TYPE_XPM)
{
- m_refData = new wxBitmapRefData();
-
GdkBitmap *mask = (GdkBitmap*) NULL;
GdkBitmap *mask = (GdkBitmap*) NULL;
-
- M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm
- (
- wxGetRootWindow()->window,
- &mask,
- NULL,
- name.fn_str()
- );
+ SetPixmap(gdk_pixmap_create_from_xpm(wxGetRootWindow()->window, &mask, NULL, name.fn_str()));
- M_BMPDATA->m_mask = new wxMask();
- M_BMPDATA->m_mask->m_bitmap = mask;
+ M_BMPDATA->m_mask = new wxMask;
+ M_BMPDATA->m_mask->m_bitmap = mask;
-
- gdk_drawable_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
-
- M_BMPDATA->m_bpp = visual->depth;
}
else // try if wxImage can load it
{
wxImage image;
}
else // try if wxImage can load it
{
wxImage image;
- if ( !image.LoadFile( name, type ) || !image.Ok() )
- return false;
-
- *this = wxBitmap(image);
+ if (image.LoadFile(name, type) && image.Ok())
+ *this = wxBitmap(image);
void wxBitmap::SetHeight( int height )
{
if (!m_refData)
void wxBitmap::SetHeight( int height )
{
if (!m_refData)
- m_refData = new wxBitmapRefData();
+ m_refData = new wxBitmapRefData;
M_BMPDATA->m_height = height;
}
M_BMPDATA->m_height = height;
}
void wxBitmap::SetWidth( int width )
{
if (!m_refData)
void wxBitmap::SetWidth( int width )
{
if (!m_refData)
- m_refData = new wxBitmapRefData();
+ m_refData = new wxBitmapRefData;
M_BMPDATA->m_width = width;
}
M_BMPDATA->m_width = width;
}
void wxBitmap::SetDepth( int depth )
{
if (!m_refData)
void wxBitmap::SetDepth( int depth )
{
if (!m_refData)
- m_refData = new wxBitmapRefData();
+ m_refData = new wxBitmapRefData;
M_BMPDATA->m_bpp = depth;
}
M_BMPDATA->m_bpp = depth;
}
void wxBitmap::SetPixmap( GdkPixmap *pixmap )
{
if (!m_refData)
void wxBitmap::SetPixmap( GdkPixmap *pixmap )
{
if (!m_refData)
- m_refData = new wxBitmapRefData();
+ m_refData = new wxBitmapRefData;
+ wxASSERT(M_BMPDATA->m_pixmap == NULL);
M_BMPDATA->m_pixmap = pixmap;
M_BMPDATA->m_pixmap = pixmap;
+ gdk_drawable_get_size(pixmap, &M_BMPDATA->m_width, &M_BMPDATA->m_height);
+ M_BMPDATA->m_bpp = gdk_drawable_get_depth(pixmap);
PurgeOtherRepresentations(Pixmap);
}
PurgeOtherRepresentations(Pixmap);
}
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, wxT("invalid bitmap") );
// create the pixmap on the fly if we use Pixbuf representation:
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, wxT("invalid bitmap") );
// create the pixmap on the fly if we use Pixbuf representation:
- if (HasPixbuf() && !HasPixmap())
+ if (M_BMPDATA->m_pixmap == NULL)
{
delete M_BMPDATA->m_mask;
{
delete M_BMPDATA->m_mask;
- M_BMPDATA->m_mask = new wxMask();
+ M_BMPDATA->m_mask = new wxMask;
gdk_pixbuf_render_pixmap_and_mask(M_BMPDATA->m_pixbuf,
&M_BMPDATA->m_pixmap,
&M_BMPDATA->m_mask->m_bitmap,
gdk_pixbuf_render_pixmap_and_mask(M_BMPDATA->m_pixbuf,
&M_BMPDATA->m_pixmap,
&M_BMPDATA->m_mask->m_bitmap,
{
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
{
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
- if (HasPixmap() && !HasPixbuf())
+ if (M_BMPDATA->m_pixbuf == NULL)
{
int width = GetWidth();
int height = GetHeight();
{
int width = GetWidth();
int height = GetHeight();
void wxBitmap::SetPixbuf( GdkPixbuf *pixbuf )
{
if (!m_refData)
void wxBitmap::SetPixbuf( GdkPixbuf *pixbuf )
{
if (!m_refData)
- m_refData = new wxBitmapRefData();
+ m_refData = new wxBitmapRefData;
+ wxASSERT(M_BMPDATA->m_pixbuf == NULL);
M_BMPDATA->m_pixbuf = pixbuf;
M_BMPDATA->m_pixbuf = pixbuf;
+ M_BMPDATA->m_width = gdk_pixbuf_get_width(pixbuf);
+ M_BMPDATA->m_height = gdk_pixbuf_get_height(pixbuf);
PurgeOtherRepresentations(Pixbuf);
}
PurgeOtherRepresentations(Pixbuf);
}