]> git.llucax.com Git - z.facultad/75.42/figuras.git/blob - figura.cpp
Se agrega mas doc.
[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     c->red = 0;
28     c->green = 0;
29     c->blue = 0;
30     // Tiene el primer bit en 1 tiene pigmento azul.
31     if (color & 1) {
32         // Si tiene el cuarto bit, es bien saturado.
33         c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
34     }
35     // Tiene el segundo bit en 1 tiene pigmento verde.
36     if (color & (1 << 1)) {
37         // Si tiene el cuarto bit, es bien saturado.
38         c->green = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
39     }
40     // Tiene el tercer bit en 1 tiene pigmento rojo.
41     if (color & (1 << 2)) {
42         // Si tiene el cuarto bit, es bien saturado.
43         c->red = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
44     }
45     // Tiene el cuarto bit en 1 y todo el resto en 0, le asigno un gris claro
46     // porque negro ya es cuando son todos 0.
47     if (color == (1 << 3)) {
48         c->red = c->green = c->blue = 0xD000;
49     }
50 #ifdef DEBUG
51     std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->red
52         << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
53         << "." << std::endl;
54 #endif
55     return c;
56 }
57
58 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
59         const char* nombre): centro(centro) {
60     // Cheque límites del color.
61     if (color > 15) {
62         this->color = 15;
63     } else if (color < 0) {
64         this->color = 0;
65     } else {
66         this->color = color;
67     }
68     // Chequea límites del grosor.
69     if (grosor > 10) {
70         this->grosor = 10;
71     } else if (grosor < 1) {
72         this->grosor = 1;
73     } else {
74         this->grosor = grosor;
75     }
76 #ifdef DEBUG
77     std::cerr << "En constructor de Figura." << std::endl;
78 #endif
79      strncpy(this->nombre, nombre, MAX_NOMBRE);
80 }
81
82 Figura::~Figura(void) {
83 #ifdef DEBUG
84     std::cerr << "En destructor de Figura." << std::endl;
85 #endif
86 }
87
88 GdkGC* Figura::get_gc(GtkWidget* widget) const {
89     // Copio el contexto gráfico del área de dibujo.
90     GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
91     // Asigna propiedades del trazo.
92     gdk_gc_set_line_attributes(
93             gc, // Contexto gráfico al cual asignar propiedades.
94             grosor, // Grosor del trazo.
95             GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
96             GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
97             GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
98     // Obtengo el color.
99     GdkColor c;
100     traducir_color(&c);
101     // Aloco el color en el mapa de colores del área de dibujo para que funcione
102     // en un display de menos de 24 bits.
103     gdk_colormap_alloc_color(gtk_widget_get_colormap(widget), &c, FALSE, TRUE);
104     // Indica que no se puede escribir, para que     /______________|      |
105     // se pueda compartir con otras aplicaciones.    \                     |
106     //                                                                     |
107     // Indica que si no se puede alocar, que trate de  /___________________|
108     // buscar un color similar.                        \.
109
110     // Cambia el color del trazo.
111     gdk_gc_set_foreground(gc, &c);
112     return gc;
113 }
114