]> 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
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                 & 0x808080
57                 // Finalmente, prendo los bits resultantes en el color de 24 bits.
58                 | c->pixel;
59         // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
60         // todos los bits apagados.
61         } else {
62             // Asigno un gris claro, combinación que no se da de otra manera.
63             c->pixel = 0xF0F0F0;
64         }
65     }
66 #ifdef DEBUG
67     std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
68         << "." << std::endl;
69 #endif
70     return c;
71 }
72
73 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
74         const char* nombre): centro(centro) {
75     // Cheque límites del color.
76     if (color > 15) {
77         this->color = 15;
78     } else if (color < 0) {
79         this->color = 0;
80     } else {
81         this->color = color;
82     }
83     // Chequea límites del grosor.
84     if (grosor > 10) {
85         this->grosor = 10;
86     } else if (grosor < 1) {
87         this->grosor = 1;
88     } else {
89         this->grosor = grosor;
90     }
91 #ifdef DEBUG
92     std::cerr << "En constructor de Figura." << std::endl;
93 #endif
94      strncpy(this->nombre, nombre, 30);
95 }
96
97 Figura::~Figura(void) {
98 #ifdef DEBUG
99     std::cerr << "En destructor de Figura." << std::endl;
100 #endif
101 }
102
103 void Figura::set_gc(GdkGC* gc) const {
104     // Asigna propiedades del trazo.
105     gdk_gc_set_line_attributes(
106             gc, // Contexto gráfico al cual asignar propiedades.
107             grosor, // Grosor del trazo.
108             GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
109             GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
110             GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
111     GdkColor c;
112     // Cambia el color del trazo.
113     gdk_gc_set_foreground(gc, traducir_color(&c));
114 }
115