X-Git-Url: https://git.llucax.com/z.facultad/75.42/figuras.git/blobdiff_plain/09eee1993f5b3310f6695639433fdf2d9e319db2..074cfd6ced0df4c6a74cc6193194fa2489c05887:/figura.cpp diff --git a/figura.cpp b/figura.cpp index c6ad541..99f4ad5 100644 --- a/figura.cpp +++ b/figura.cpp @@ -21,8 +21,61 @@ # include #endif +GdkColor* Figura::traducir_color(GdkColor* c) const { + // Elimino el color anterior. + c->pixel = 0; + // Tiene el primer bit en 1. + 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; + } + // Tiene el segundo bit en 1. + 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; + } + // Tiene el tercer bit en 1. + 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; + } + // 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; + } + } +#ifdef DEBUG + std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel + << "." << 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 +83,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 +94,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,9 +103,16 @@ Figura::~Figura(void) { #endif } -void Figura::dibujar(GtkWidget* widget) const { - //out << "color(" << color << "), grosor(" << grosor - // << "), nombre(" << nombre << "), centro("; - //centro.dibujar(out); +void Figura::set_gc(GdkGC* gc) const { + // Asigna propiedades del trazo. + gdk_gc_set_line_attributes( + 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). + GdkColor c; + // Cambia el color del trazo. + gdk_gc_set_foreground(gc, traducir_color(&c)); }