3 #include "bcwindowbase.h"
9 BC_Pixmap::BC_Pixmap(BC_WindowBase *parent_window,
14 BC_Bitmap *opaque_bitmap, *alpha_bitmap, *mask_bitmap;
15 if(frame->get_color_model() != BC_RGBA8888 &&
23 opaque_bitmap = new BC_Bitmap(parent_window,
26 parent_window->get_color_model(),
28 opaque_bitmap->set_bg_color(parent_window->get_bg_color());
29 opaque_bitmap->read_frame(frame,
39 alpha_bitmap = new BC_Bitmap(parent_window,
45 if(frame->get_color_model() != BC_RGBA8888)
46 printf("BC_Pixmap::BC_Pixmap: PIXMAP_ALPHA but frame doesn't have alpha.\n");
47 alpha_bitmap->read_frame(frame,
54 initialize(parent_window,
61 opaque_bitmap->write_drawable(opaque_pixmap,
75 alpha_bitmap->write_drawable(alpha_pixmap,
85 XFreeGC(top_level->display, copy_gc);
87 XSetClipMask(top_level->display, alpha_gc, alpha_pixmap);
91 BC_Pixmap::BC_Pixmap(BC_WindowBase *parent_window, int w, int h)
93 initialize(parent_window, w, h, PIXMAP_OPAQUE);
97 BC_Pixmap::~BC_Pixmap()
101 XFreePixmap(top_level->display, opaque_pixmap);
106 XFreeGC(top_level->display, alpha_gc);
107 XFreePixmap(top_level->display, alpha_pixmap);
111 int BC_Pixmap::initialize(BC_WindowBase *parent_window, int w, int h, int mode)
113 unsigned long gcmask = GCGraphicsExposures | GCForeground | GCBackground | GCFunction;
115 gcvalues.graphics_exposures = 0; // prevent expose events for every redraw
116 gcvalues.foreground = 0;
117 gcvalues.background = 1;
118 gcvalues.function = GXcopy;
122 this->parent_window = parent_window;
124 top_level = parent_window->top_level;
128 opaque_pixmap = XCreatePixmap(top_level->display,
132 top_level->default_depth);
134 opaque_xft_draw = XftDrawCreate(top_level->display,
143 alpha_pixmap = XCreatePixmap(top_level->display,
149 alpha_gc = XCreateGC(top_level->display,
154 copy_gc = XCreateGC(top_level->display,
160 alpha_xft_draw = XftDrawCreateBitmap(top_level->display,
168 void BC_Pixmap::resize(int w, int h)
170 Pixmap new_pixmap = XCreatePixmap(top_level->display,
174 top_level->default_depth);
175 XCopyArea(top_level->display,
187 XFreePixmap(top_level->display, opaque_pixmap);
188 opaque_pixmap = new_pixmap;
192 void BC_Pixmap::copy_area(int x, int y, int w, int h, int x2, int y2)
194 XCopyArea(top_level->display,
206 int BC_Pixmap::write_drawable(Drawable &pixmap,
214 //printf("BC_Pixmap::write_drawable 1\n");
229 XSetClipOrigin(top_level->display, alpha_gc, dest_x - src_x, dest_y - src_y);
230 XCopyArea(top_level->display,
244 XCopyArea(top_level->display,
255 //printf("BC_Pixmap::write_drawable 2\n");
260 void BC_Pixmap::draw_vframe(VFrame *frame,
268 parent_window->draw_vframe(frame,
280 void BC_Pixmap::draw_pixmap(BC_Pixmap *pixmap,
288 pixmap->write_drawable(this->opaque_pixmap,
307 int BC_Pixmap::get_w()
312 int BC_Pixmap::get_h()
317 int BC_Pixmap::get_w_fixed()
322 int BC_Pixmap::get_h_fixed()
327 Pixmap BC_Pixmap::get_pixmap()
329 return opaque_pixmap;
332 Pixmap BC_Pixmap::get_alpha()
337 int BC_Pixmap::use_opaque()
342 int BC_Pixmap::use_alpha()
344 return mode == PIXMAP_ALPHA;