X-Git-Url: https://git.llucax.com/z.facultad/75.42/figuras.git/blobdiff_plain/4f1b771eeb4558af6b71fe236803d49d752aa6fb..97e53887b274b619a05713c784357cbf80007c89:/figura.cpp diff --git a/figura.cpp b/figura.cpp index f20fa3c..bd93450 100644 --- a/figura.cpp +++ b/figura.cpp @@ -15,6 +15,7 @@ */ #include "figura.h" +#include #ifdef DEBUG # include @@ -23,50 +24,32 @@ 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; @@ -93,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) { @@ -102,7 +85,9 @@ 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, // Contexto gráfico al cual asignar propiedades. @@ -110,8 +95,20 @@ void Figura::set_gc(GdkGC* gc) const { 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; }