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
23 GdkColor* Figura::traducir_color(GdkColor* c) const {
24 // Elimino el color anterior.
26 // Tiene el primer bit en 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)
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;
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;
44 // Tiene el cuarto bit en 1.
45 if (color & (1 << 3)) {
46 // Si tiene alguno de los bits menos significativos (tiene pigmento).
49 // Desplazo los bits del color de 24 bits 1 lugar a la
50 // izquierda (si era, por ejemplo 0111 1111, quedaría
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").
57 // Finalmente, prendo los bits resultantes en el color de 24 bits.
59 // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
60 // todos los bits apagados.
62 // Asigno un gris claro, combinación que no se da de otra manera.
67 std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
73 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
74 const char* nombre): centro(centro) {
75 // Cheque límites del color.
78 } else if (color < 0) {
83 // Chequea límites del grosor.
86 } else if (grosor < 1) {
89 this->grosor = grosor;
92 std::cerr << "En constructor de Figura." << std::endl;
94 strncpy(this->nombre, nombre, 30);
97 Figura::~Figura(void) {
99 std::cerr << "En destructor de Figura." << std::endl;
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).
112 // Cambia el color del trazo.
113 gdk_gc_set_foreground(gc, traducir_color(&c));