# include <iostream>
#endif
+GdkColor* Figura::traducir_color(GdkColor* c) const {
+ // Elimino el color anterior.
+ c->pixel = 0;
+ c->red = 0;
+ c->green = 0;
+ c->blue = 0;
+ // Tiene el primer bit en 1 tiene pigmento azul.
+ if (color & 1) {
+ // Si tiene el cuarto bit, es bien saturado.
+ c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+ }
+ // Tiene el segundo bit en 1 tiene pigmento verde.
+ if (color & (1 << 1)) {
+ // Si tiene el cuarto bit, es bien saturado.
+ c->green = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+ }
+ // Tiene el tercer bit en 1 tiene pigmento rojo.
+ if (color & (1 << 2)) {
+ // Si tiene el cuarto bit, es bien saturado.
+ c->red = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+ }
+ // 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->red
+ << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
+ << "." << std::endl;
+#endif
+ return c;
+}
+
Figura::Figura(size_t color, size_t grosor, const Punto& centro,
const char* nombre): centro(centro) {
+ // Cheque límites del color.
if (color > 15) {
this->color = 15;
} else if (color < 0) {
} else {
this->color = color;
}
+ // Chequea límites del grosor.
if (grosor > 10) {
this->grosor = 10;
} else if (grosor < 1) {
#ifdef DEBUG
std::cerr << "En constructor de Figura." << std::endl;
#endif
- strncpy(this->nombre, nombre, 30);
+ strncpy(this->nombre, nombre, MAX_NOMBRE);
}
Figura::~Figura(void) {
#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,
- grosor,
- GDK_LINE_SOLID,
- GDK_CAP_ROUND,
- GDK_JOIN_ROUND);
- //gdk_gc_set_foreground(gc, c);
+ gc, // Contexto gráfico al cual asignar propiedades.
+ grosor, // Grosor del trazo.
+ 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, &c);
+ return gc;
}