]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - figura.cpp
Se agrega documentacion.
[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 #include <cstring>
19
20 #ifdef DEBUG
21 #   include <iostream>
22 #endif
23
24 GdkColor* Figura::traducir_color(GdkColor* c) const {
25     // Elimino el color anterior.
26     c->pixel = 0;
27     // Tiene el primer bit en 1.
28     if (color & 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)
31         c->pixel |= 0x7F;
32     }
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;
38     }
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;
44     }
45     // Tiene el cuarto bit en 1.
46     if (color & (1 << 3)) {
47         // Si tiene alguno de los bits menos significativos (tiene pigmento).
48         if (color & 7) {
49             c->pixel =
50                 // Desplazo los bits del color de 24 bits 1 lugar a la
51                 // izquierda (si era, por ejemplo 0111 1111, quedaría
52                 // 1111 1110).
53                 (c->pixel << 1)
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.
58                 & 0x808080
59                 // Finalmente, prendo los bits resultantes en el color de 24 bits.
60                 // Por ejemplo: 1000 0000 | 0111 1111 = 1111 1111.
61                 | c->pixel;
62         // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
63         // todos los bits apagados.
64         } else {
65             // Asigno un gris claro, combinación que no se da de otra manera.
66             c->pixel = 0xF0F0F0;
67         }
68     }
69 #ifdef DEBUG
70     std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
71         << "." << std::endl;
72 #endif
73     return c;
74 }
75
76 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
77         const char* nombre): centro(centro) {
78     // Cheque límites del color.
79     if (color > 15) {
80         this->color = 15;
81     } else if (color < 0) {
82         this->color = 0;
83     } else {
84         this->color = color;
85     }
86     // Chequea límites del grosor.
87     if (grosor > 10) {
88         this->grosor = 10;
89     } else if (grosor < 1) {
90         this->grosor = 1;
91     } else {
92         this->grosor = grosor;
93     }
94 #ifdef DEBUG
95     std::cerr << "En constructor de Figura." << std::endl;
96 #endif
97      strncpy(this->nombre, nombre, MAX_NOMBRE);
98 }
99
100 Figura::~Figura(void) {
101 #ifdef DEBUG
102     std::cerr << "En destructor de Figura." << std::endl;
103 #endif
104 }
105
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).
114     GdkColor c;
115     // Cambia el color del trazo.
116     gdk_gc_set_foreground(gc, traducir_color(&c));
117 }
118