1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Graficador de figuras.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: Fri Sep 19 22:05:39 ART 2003
24 GdkColor* Figura::traducir_color(GdkColor* c) const {
25 // Elimino el color anterior.
27 // Tiene el primer bit en 1.
29 // Entonces activo los bits 1,2,3,4,5,6,7 del color de 24 bits.
30 // (quedaría con la componente azul en 0x7F)
33 // Tiene el segundo bit en 1.
34 if (color & (1 << 1)) {
35 // Entonces activo los bits 9,10,11,12,13,14,15 del color de 24 bits.
36 // (quedaría con la componente verde en 0x7F)
37 c->pixel |= 0x7F << 8;
39 // Tiene el tercer bit en 1.
40 if (color & (1 << 2)) {
41 // Entonces activo los bits 17,18,19,20,21,22,23 del color de 24 bits.
42 // (quedaría con la componente roja en 0x7F)
43 c->pixel |= 0x7F << 16;
45 // Tiene el cuarto bit en 1.
46 if (color & (1 << 3)) {
47 // Si tiene alguno de los bits menos significativos (tiene pigmento).
50 // Desplazo los bits del color de 24 bits 1 lugar a la
51 // izquierda (si era, por ejemplo 0111 1111, quedaría
54 // Al resultado le aplico una máscara para que quede 'prendido'
55 // el bit más significativo de los colores activados
56 // anteriormente (y de esta manera darles el doble de "luz").
57 // Por ejemplo: 1111 1110 & 1000 0000 = 1000 0000.
59 // Finalmente, prendo los bits resultantes en el color de 24 bits.
60 // Por ejemplo: 1000 0000 | 0111 1111 = 1111 1111.
62 // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
63 // todos los bits apagados.
65 // Asigno un gris claro, combinación que no se da de otra manera.
70 std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
76 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
77 const char* nombre): centro(centro) {
78 // Cheque límites del color.
81 } else if (color < 0) {
86 // Chequea límites del grosor.
89 } else if (grosor < 1) {
92 this->grosor = grosor;
95 std::cerr << "En constructor de Figura." << std::endl;
97 strncpy(this->nombre, nombre, MAX_NOMBRE);
100 Figura::~Figura(void) {
102 std::cerr << "En destructor de Figura." << std::endl;
106 void Figura::set_gc(GdkGC* gc) const {
107 // Asigna propiedades del trazo.
108 gdk_gc_set_line_attributes(
109 gc, // Contexto gráfico al cual asignar propiedades.
110 grosor, // Grosor del trazo.
111 GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
112 GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
113 GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
115 // Cambia el color del trazo.
116 gdk_gc_set_foreground(gc, traducir_color(&c));