4 #include "bcwindowbase.h"
10 BC_Pixmap::BC_Pixmap(BC_WindowBase *parent_window,
17 BC_Bitmap *opaque_bitmap, *alpha_bitmap, *mask_bitmap;
18 if(frame->get_color_model() != BC_RGBA8888 &&
26 opaque_bitmap = new BC_Bitmap(parent_window,
29 parent_window->get_color_model(),
31 opaque_bitmap->set_bg_color(parent_window->get_bg_color());
32 opaque_bitmap->read_frame(frame,
42 alpha_bitmap = new BC_Bitmap(parent_window,
48 if(frame->get_color_model() != BC_RGBA8888)
49 printf("BC_Pixmap::BC_Pixmap: PIXMAP_ALPHA but frame doesn't have alpha.\n");
50 alpha_bitmap->read_frame(frame,
57 initialize(parent_window,
64 opaque_bitmap->write_drawable(opaque_pixmap,
78 alpha_bitmap->write_drawable(alpha_pixmap,
88 XFreeGC(top_level->display, copy_gc);
90 XSetClipMask(top_level->display, alpha_gc, alpha_pixmap);
94 BC_Pixmap::BC_Pixmap(BC_WindowBase *parent_window, int w, int h)
97 initialize(parent_window, w, h, PIXMAP_OPAQUE);
101 BC_Pixmap::~BC_Pixmap()
107 XftDrawDestroy((XftDraw*)opaque_xft_draw);
109 XFreePixmap(top_level->display, opaque_pixmap);
114 XFreeGC(top_level->display, alpha_gc);
117 XftDrawDestroy((XftDraw*)alpha_xft_draw);
119 XFreePixmap(top_level->display, alpha_pixmap);
125 void BC_Pixmap::reset()
135 int BC_Pixmap::initialize(BC_WindowBase *parent_window, int w, int h, int mode)
139 this->parent_window = parent_window;
141 top_level = parent_window->top_level;
145 opaque_pixmap = XCreatePixmap(top_level->display,
149 top_level->default_depth);
151 if(BC_WindowBase::get_resources()->use_xft)
153 opaque_xft_draw = XftDrawCreate(top_level->display,
163 unsigned long gcmask = GCGraphicsExposures |
168 gcvalues.graphics_exposures = 0; // prevent expose events for every redraw
169 gcvalues.foreground = 0;
170 gcvalues.background = 1;
171 gcvalues.function = GXcopy;
173 alpha_pixmap = XCreatePixmap(top_level->display,
179 alpha_gc = XCreateGC(top_level->display,
184 copy_gc = XCreateGC(top_level->display,
190 if(BC_WindowBase::get_resources()->use_xft)
192 alpha_xft_draw = XftDrawCreateBitmap(top_level->display,
200 // // For some reason, this is required in 32 bit.
202 // if(BC_WindowBase::get_resources()->use_xft)
203 // XSync(top_level->display, False);
209 void BC_Pixmap::resize(int w, int h)
211 Pixmap new_pixmap = XCreatePixmap(top_level->display,
215 top_level->default_depth);
217 XftDraw *new_xft_draw;
218 if(BC_WindowBase::get_resources()->use_xft)
220 new_xft_draw = XftDrawCreate(top_level->display,
230 XCopyArea(top_level->display,
243 if(BC_WindowBase::get_resources()->use_xft)
244 XftDrawDestroy((XftDraw*)opaque_xft_draw);
246 XFreePixmap(top_level->display, opaque_pixmap);
248 opaque_pixmap = new_pixmap;
250 if(BC_WindowBase::get_resources()->use_xft)
251 opaque_xft_draw = new_xft_draw;
256 void BC_Pixmap::copy_area(int x, int y, int w, int h, int x2, int y2)
258 XCopyArea(top_level->display,
270 int BC_Pixmap::write_drawable(Drawable &pixmap,
278 //printf("BC_Pixmap::write_drawable 1\n");
293 XSetClipOrigin(top_level->display, alpha_gc, dest_x - src_x, dest_y - src_y);
294 XCopyArea(top_level->display,
308 XCopyArea(top_level->display,
319 //printf("BC_Pixmap::write_drawable 2\n");
324 void BC_Pixmap::draw_vframe(VFrame *frame,
332 parent_window->draw_vframe(frame,
344 void BC_Pixmap::draw_pixmap(BC_Pixmap *pixmap,
352 pixmap->write_drawable(this->opaque_pixmap,
371 int BC_Pixmap::get_w()
376 int BC_Pixmap::get_h()
381 int BC_Pixmap::get_w_fixed()
386 int BC_Pixmap::get_h_fixed()
391 Pixmap BC_Pixmap::get_pixmap()
393 return opaque_pixmap;
396 Pixmap BC_Pixmap::get_alpha()
401 int BC_Pixmap::use_opaque()
406 int BC_Pixmap::use_alpha()
408 return mode == PIXMAP_ALPHA;