Re: How to draw to a pixbuf?
- From: Carlo Wood <carlo alinoe com>
- To: Chris Vine <chris cvine freeserve co uk>
- Cc: gtkmm-list gnome org
- Subject: Re: How to draw to a pixbuf?
- Date: Tue, 2 Sep 2008 16:55:08 +0200
On Tue, Sep 02, 2008 at 11:08:20AM +0100, Chris Vine wrote:
> It has also occurred to me that another and probably easier way to the
> same result is to create a drawable (such as a Gdk::Pixmap object), get
> a cairo_t surface for it with gdk_cairo_create(), and then after
> drawing create a GdkPixbuf object from it with
> gdk_pixbuf_get_from_drawable() which you can wrap as a Gdk::Pixbuf
> object.
Thanks for your help! I got everything working now, except one
minor detail: I'd like to create the icons with partial transparency.
However, I can't seem to get that to work. It works for the stock
icons (ie 'Gtk::Stock::ABOUT' is transparent, I think, around the star).
The code I have now is:
void MyChessboardWidget::initialize_menus(void)
{
M_icon_factory = Gtk::IconFactory::create();
M_icon_factory->add_default();
GdkColor light_square_color;
get_light_square_color(light_square_color);
int color_count = 0;
for (bool iswhite = false; color_count < 2; ++color_count, iswhite = true)
{
using namespace cwmm;
Type type(nothing);
do
{
Glib::RefPtr<Gdk::Pixmap> icon_pixmap = Gdk::Pixmap::create(M_drawable->get_window(), 16, 16);
Cairo::RefPtr<Cairo::Context> cairo_context = icon_pixmap->create_cairo_context();
cairo_t* cr = cairo_context->cobj();
cairo_set_source_rgb(cr, light_square_color.red / 65535.0, light_square_color.green / 65535.0, light_square_color.blue / 65535.0);
cairo_paint(cr);
std::string icon_str(iswhite ? "white_" : "black_");
switch (type())
{
case nothing_bits:
icon_str += "nothing";
break;
case pawn_bits:
draw_pawn(cr, 8, 8, 16, iswhite);
icon_str += "pawn";
break;
case rook_bits:
draw_rook(cr, 8, 8, 16, iswhite);
icon_str += "rook";
break;
case knight_bits:
draw_knight(cr, 8, 8, 16, iswhite);
icon_str += "knight";
break;
case bishop_bits:
draw_bishop(cr, 8, 8, 16, iswhite);
icon_str += "bishop";
break;
case queen_bits:
draw_queen(cr, 8, 8, 16, iswhite);
icon_str += "queen";
break;
case king_bits:
draw_king(cr, 8, 8, 16, iswhite);
icon_str += "king";
break;
}
icon_str += "_icon";
Glib::RefPtr<Gdk::Pixbuf> icon_pixbuf = Gdk::Pixbuf::create(Glib::RefPtr<Gdk::Drawable>::cast_static(icon_pixmap), 0, 0, 16, 16);
// Does not work: icon_pixbuf->add_alpha(true, 255, 255, 255);
M_icon_factory->add(Gtk::StockID(icon_str.c_str()), Gtk::IconSet(icon_pixbuf));
do { TypeData type_data = { type() + 1 }; type = type_data; } while (type() == 4);
}
while (type() != 8);
}
m_refActionGroup = Gtk::ActionGroup::create();
m_refActionGroup->add(Gtk::Action::create("PlacepieceMenu", "Placepiece Menu"));
m_refActionGroup->add(Gtk::Action::create("PlacepieceBlackPawn", Gtk::StockID("black_pawn_icon"), "Black Pawn"),
sigc::mem_fun(*this, &MyChessboardWidget::on_menu_placepiece_black_pawn));
m_refActionGroup->add(Gtk::Action::create("PlacepieceBlackRook", Gtk::StockID("black_rook_icon"), "Black Rook"),
sigc::mem_fun(*this, &MyChessboardWidget::on_menu_placepiece_black_rook));
m_refActionGroup->add(Gtk::Action::create("PlacepieceBlackKnight", Gtk::StockID("black_knight_icon"), "Black Knight"),
sigc::mem_fun(*this, &MyChessboardWidget::on_menu_placepiece_black_knight));
... and so on.
This code is now using 'light_square_color' as background color, but I tried to
use say 'pink' as background color (and I tried black and white too) and then
tried to replace that with transparency with the Pixbuf::add_alpha() call, but that
never worked :/ It has no visible effect.
I also tried to create a cairo contex with alpha from the start, but that has
problems: M_drawable->get_window() (my main window) simply has no transparancy,
it's my screen - and if I explicitely set the depth to 32 with:
Glib::RefPtr<Gdk::Pixmap> icon_pixmap = Gdk::Pixmap::create(Glib::RefPtr<Gdk::Drawable>(0), 16, 16, 32);
then it complains about not having a colormap. If then I add the colormap from
M_drawable I get a runtime error that the depth's aren't matching.
--
Carlo Wood <carlo alinoe com>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]