X-Git-Url: https://git.llucax.com/z.facultad/75.42/figuras.git/blobdiff_plain/f5088550a4245865592cb5fd781da3862ef1bef1..7f1839c6a8a7f53d0c6800354e0158926b76ebeb:/figura.cpp diff --git a/figura.cpp b/figura.cpp index 5ce3dec..bd93450 100644 --- a/figura.cpp +++ b/figura.cpp @@ -21,8 +21,43 @@ # include #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) { @@ -30,6 +65,7 @@ Figura::Figura(size_t color, size_t grosor, const Punto& centro, } else { this->color = color; } + // Chequea límites del grosor. if (grosor > 10) { this->grosor = 10; } else if (grosor < 1) { @@ -40,7 +76,7 @@ Figura::Figura(size_t color, size_t grosor, const Punto& centro, #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) { @@ -49,13 +85,30 @@ 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; }