// conversion to mono bitmap: bool wxBitmap::CreateFromImageAsBitmap(const wxImage& img) { // convert alpha channel to mask, if it is present: wxImage image(img); image.ConvertAlphaToMask(); int width = image.GetWidth(); int height = image.GetHeight(); SetHeight( height ); SetWidth( width ); SetBitmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) ); SetDepth( 1 ); GdkVisual *visual = wxTheApp->GetGdkVisual(); // Create picture image unsigned char *data_data = (unsigned char*)malloc( ((width >> 3)+8) * height ); GdkImage *data_image = gdk_image_new_bitmap( visual, data_data, width, height ); // Create mask image GdkImage *mask_image = (GdkImage*) NULL; if (image.HasMask()) { unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height ); mask_image = gdk_image_new_bitmap( visual, mask_data, width, height ); wxMask *mask = new wxMask(); mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ); SetMask( mask ); }
/* this makes a new screen: */ struct tme_gtk_screen * _tme_gtk_screen_new(struct tme_gtk_display *display) { struct tme_gtk_screen *screen, **_prev; GtkWidget *menu_bar; GtkWidget *menu; GtkWidget *submenu; GtkWidget *menu_item; tme_uint8_t *bitmap_data; unsigned int y; #define BLANK_SIDE (16 * 8) /* create the new screen and link it in: */ for (_prev = &display->tme_gtk_display_screens; (screen = *_prev) != NULL; _prev = &screen->tme_gtk_screen_next); screen = *_prev = tme_new0(struct tme_gtk_screen, 1); /* the backpointer to the display: */ screen->tme_gtk_screen_display = display; /* there is no framebuffer connection yet: */ screen->tme_gtk_screen_fb = NULL; /* the user hasn't specified a scaling yet: */ screen->tme_gtk_screen_fb_scale = -TME_FB_XLAT_SCALE_NONE; /* we have no colorset: */ screen->tme_gtk_screen_colorset = TME_FB_COLORSET_NONE; /* create the top-level window, and allow it to shrink, grow, and auto-shrink: */ screen->tme_gtk_screen_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_policy(GTK_WINDOW(screen->tme_gtk_screen_window), FALSE, FALSE, TRUE); /* create the outer vertical packing box: */ screen->tme_gtk_screen_vbox0 = gtk_vbox_new(FALSE, 0); /* add the outer vertical packing box to the window: */ gtk_container_add(GTK_CONTAINER(screen->tme_gtk_screen_window), screen->tme_gtk_screen_vbox0); /* create the menu bar and pack it into the outer vertical packing box: */ menu_bar = gtk_menu_bar_new (); gtk_box_pack_start(GTK_BOX(screen->tme_gtk_screen_vbox0), menu_bar, FALSE, FALSE, 0); gtk_widget_show(menu_bar); /* create the Screen menu: */ menu = gtk_menu_new(); /* create the Screen scaling submenu: */ submenu = _tme_gtk_display_menu_radio(screen, _tme_gtk_screen_submenu_scaling); /* create the Screen scaling submenu item: */ menu_item = gtk_menu_item_new_with_label(_("Scale")); gtk_widget_show(menu_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); gtk_menu_append(GTK_MENU(menu), menu_item); /* create the Screen menu bar item, attach the menu to it, and attach the menu bar item to the menu bar: */ menu_item = gtk_menu_item_new_with_label("Screen"); gtk_widget_show(menu_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), menu); gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), menu_item); /* create an event box for the framebuffer area: */ screen->tme_gtk_screen_event_box = gtk_event_box_new(); /* pack the event box into the outer vertical packing box: */ gtk_box_pack_start(GTK_BOX(screen->tme_gtk_screen_vbox0), screen->tme_gtk_screen_event_box, FALSE, FALSE, 0); /* show the event box: */ gtk_widget_show(screen->tme_gtk_screen_event_box); /* create a GdkImage of an alternating-bits area. we must use malloc() here since this memory will end up as part of an XImage, and X will call free() on it: */ bitmap_data = (tme_uint8_t *) malloc((BLANK_SIDE * BLANK_SIDE) / 8); assert(bitmap_data != NULL); for (y = 0; y < BLANK_SIDE; y++) { memset(bitmap_data + (y * BLANK_SIDE / 8), (y & 1 ? 0x33 : 0xcc), (BLANK_SIDE / 8)); } screen->tme_gtk_screen_gdkimage = gdk_image_new_bitmap(gdk_visual_get_system(), bitmap_data, BLANK_SIDE, BLANK_SIDE); /* create the GtkImage for the framebuffer area: */ screen->tme_gtk_screen_gtkimage = gtk_image_new_from_image(screen->tme_gtk_screen_gdkimage, NULL); /* add the GtkImage to the event box: */ gtk_container_add(GTK_CONTAINER(screen->tme_gtk_screen_event_box), screen->tme_gtk_screen_gtkimage); /* show the GtkImage: */ gtk_widget_show(screen->tme_gtk_screen_gtkimage); /* show the outer vertical packing box: */ gtk_widget_show(screen->tme_gtk_screen_vbox0); /* show the top-level window: */ gtk_widget_show(screen->tme_gtk_screen_window); /* there is no translation function: */ screen->tme_gtk_screen_fb_xlat = NULL; /* attach the mouse to this screen: */ _tme_gtk_mouse_attach(screen); /* attach the keyboard to this screen: */ _tme_gtk_keyboard_attach(screen); return (screen); }