]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - figura.cpp
Se completan comentarios en el codigo.
[z.facultad/75.42/figuras.git] / figura.cpp
1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 5:
6  * Graficador de figuras.
7  *
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/).
11  *
12  * Creado: Fri Sep 19 22:05:39 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "figura.h"
18
19 #ifdef DEBUG
20 #   include <iostream>
21 #endif
22
23 GdkColor* Figura::traducir_color(GdkColor* c) const {
24     // Elimino el color anterior.
25     c->pixel = 0;
26     // Tiene el primer bit en 1.
27     if (color & 1) {
28         // Entonces activo los bits 1,2,3,4,5,6,7 del color de 24 bits.
29         // (quedaría con la componente azul en 0x7F)
30         c->pixel |= 0x7F;
31     }
32     // Tiene el segundo bit en 1.
33     if (color & (1 << 1)) {
34         // Entonces activo los bits 9,10,11,12,13,14,15 del color de 24 bits.
35         // (quedaría con la componente verde en 0x7F)
36         c->pixel |= 0x7F << 8;
37     }
38     // Tiene el tercer bit en 1.
39     if (color & (1 << 2)) {
40         // Entonces activo los bits 17,18,19,20,21,22,23 del color de 24 bits.
41         // (quedaría con la componente roja en 0x7F)
42         c->pixel |= 0x7F << 16;
43     }
44     // Tiene el cuarto bit en 1.
45     if (color & (1 << 3)) {
46         // Si tiene alguno de los bits menos significativos (tiene pigmento).
47         if (color & 7) {
48             c->pixel =
49                 // Desplazo los bits del color de 24 bits 1 lugar a la
50                 // izquierda (si era, por ejemplo 0111 1111, quedaría
51                 // 1111 1110).
52                 (c->pixel << 1)
53                 // Al resultado le aplico una máscara para que quede 'prendido'
54                 // el bit más significativo de los colores activados
55                 // anteriormente (y de esta manera darles el doble de "luz").
56                 // Por ejemplo: 1111 1110 & 1000 0000 = 1000 0000.
57                 & 0x808080
58                 // Finalmente, prendo los bits resultantes en el color de 24 bits.
59                 // Por ejemplo: 1000 0000 | 0111 1111 = 1111 1111.
60                 | c->pixel;
61         // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
62         // todos los bits apagados.
63         } else {
64             // Asigno un gris claro, combinación que no se da de otra manera.
65             c->pixel = 0xF0F0F0;
66         }
67     }
68 #ifdef DEBUG
69     std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
70         << "." << std::endl;
71 #endif
72     return c;
73 }
74
75 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
76         const char* nombre): centro(centro) {
77     // Cheque límites del color.
78     if (color > 15) {
79         this->color = 15;
80     } else if (color < 0) {
81         this->color = 0;
82     } else {
83         this->color = color;
84     }
85     // Chequea límites del grosor.
86     if (grosor > 10) {
87         this->grosor = 10;
88     } else if (grosor < 1) {
89         this->grosor = 1;
90     } else {
91         this->grosor = grosor;
92     }
93 #ifdef DEBUG
94     std::cerr << "En constructor de Figura." << std::endl;
95 #endif
96      strncpy(this->nombre, nombre, 30);
97 }
98
99 Figura::~Figura(void) {
100 #ifdef DEBUG
101     std::cerr << "En destructor de Figura." << std::endl;
102 #endif
103 }
104
105 void Figura::set_gc(GdkGC* gc) const {
106     // Asigna propiedades del trazo.
107     gdk_gc_set_line_attributes(
108             gc, // Contexto gráfico al cual asignar propiedades.
109             grosor, // Grosor del trazo.
110             GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
111             GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
112             GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
113     GdkColor c;
114     // Cambia el color del trazo.
115     gdk_gc_set_foreground(gc, traducir_color(&c));
116 }
117