GdkColor* Figura::traducir_color(GdkColor* c) const {
// Elimino el color anterior.
c->pixel = 0;
- // Tiene el primer bit en 1.
+ c->red = 0;
+ c->green = 0;
+ c->blue = 0;
+ // Tiene el primer bit en 1 tiene pigmento azul.
if (color & 1) {
- // Entonces activo los bits 1,2,3,4,5,6,7 del color de 24 bits.
- // (quedaría con la componente azul en 0x7F)
- c->pixel |= 0x7F;
+ // Si tiene el cuarto bit, es bien saturado.
+ c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
}
- // Tiene el segundo bit en 1.
+ // Tiene el segundo bit en 1 tiene pigmento verde.
if (color & (1 << 1)) {
- // Entonces activo los bits 9,10,11,12,13,14,15 del color de 24 bits.
- // (quedaría con la componente verde en 0x7F)
- c->pixel |= 0x7F << 8;
+ // Si tiene el cuarto bit, es bien saturado.
+ c->green = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
}
- // Tiene el tercer bit en 1.
+ // Tiene el tercer bit en 1 tiene pigmento rojo.
if (color & (1 << 2)) {
- // Entonces activo los bits 17,18,19,20,21,22,23 del color de 24 bits.
- // (quedaría con la componente roja en 0x7F)
- c->pixel |= 0x7F << 16;
+ // Si tiene el cuarto bit, es bien saturado.
+ c->red = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
}
- // Tiene el cuarto bit en 1.
- if (color & (1 << 3)) {
- // Si tiene alguno de los bits menos significativos (tiene pigmento).
- if (color & 7) {
- c->pixel =
- // Desplazo los bits del color de 24 bits 1 lugar a la
- // izquierda (si era, por ejemplo 0111 1111, quedaría
- // 1111 1110).
- (c->pixel << 1)
- // Al resultado le aplico una máscara para que quede 'prendido'
- // el bit más significativo de los colores activados
- // anteriormente (y de esta manera darles el doble de "luz").
- // Por ejemplo: 1111 1110 & 1000 0000 = 1000 0000.
- & 0x808080
- // Finalmente, prendo los bits resultantes en el color de 24 bits.
- // Por ejemplo: 1000 0000 | 0111 1111 = 1111 1111.
- | c->pixel;
- // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
- // todos los bits apagados.
- } else {
- // Asigno un gris claro, combinación que no se da de otra manera.
- c->pixel = 0xF0F0F0;
- }
+ // Tiene el cuarto bit en 1 y todo el resto en 0, le asigno un gris claro
+ // porque negro ya es cuando son todos 0.
+ if (color == (1 << 3)) {
+ c->red = c->green = c->blue = 0xD000;
}
#ifdef DEBUG
- std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
+ std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->red
+ << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
<< "." << std::endl;
#endif
return c;
#endif
}
-void Figura::set_gc(GdkGC* gc) const {
+GdkGC* Figura::get_gc(GtkWidget* widget) const {
+ // Copio el contexto gráfico del área de dibujo.
+ GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
// Asigna propiedades del trazo.
gdk_gc_set_line_attributes(
gc, // Contexto gráfico al cual asignar propiedades.
GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
+ // Obtengo el color.
GdkColor c;
+ traducir_color(&c);
+ // Aloco el color en el mapa de colores del área de dibujo para que funcione
+ // en un display de menos de 24 bits.
+ gdk_colormap_alloc_color(gtk_widget_get_colormap(widget), &c, FALSE, TRUE);
+ // Indica que no se puede escribir, para que /______________| |
+ // se pueda compartir con otras aplicaciones. \ |
+ // |
+ // Indica que si no se puede alocar, que trate de /___________________|
+ // buscar un color similar. \.
+
// Cambia el color del trazo.
- gdk_gc_set_foreground(gc, traducir_color(&c));
+ gdk_gc_set_foreground(gc, &c);
+ return gc;
}