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
24 GdkColor* Figura::traducir_color(GdkColor* c) const {
25 // Elimino el color anterior.
30 // Tiene el primer bit en 1 tiene pigmento azul.
32 // Si tiene el cuarto bit, es bien saturado.
33 c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
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;
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;
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;
51 std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->red
52 << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
58 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
59 const char* nombre): centro(centro) {
60 // Cheque límites del color.
63 } else if (color < 0) {
68 // Chequea límites del grosor.
71 } else if (grosor < 1) {
74 this->grosor = grosor;
77 std::cerr << "En constructor de Figura." << std::endl;
79 strncpy(this->nombre, nombre, MAX_NOMBRE);
82 Figura::~Figura(void) {
84 std::cerr << "En destructor de Figura." << std::endl;
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).
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. \ |
107 // Indica que si no se puede alocar, que trate de /___________________|
108 // buscar un color similar. \.
110 // Cambia el color del trazo.
111 gdk_gc_set_foreground(gc, &c);