]> git.llucax.com Git - z.facultad/75.42/figuras.git/commitdiff
Se corrige un bug. Los colores se ponían presuponiendo un Display de 24 bits. Ahora...
authorLeandro Lucarella <llucax@gmail.com>
Tue, 7 Oct 2003 03:25:26 +0000 (03:25 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 7 Oct 2003 03:25:26 +0000 (03:25 +0000)
Makefile
circulo.cpp
figura.cpp
figura.h
linea.cpp
rectangulo.cpp

index b66efef66a901ecf2c41eefea8b856cd9ee76e2f..63dd15b32fbfbbaff12415a12ab38f618c1b2719 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,9 +15,9 @@
 
 # Opciones para el compilador.
 CXXFLAGS=`pkg-config --cflags gtk+-2.0`
-CXXFLAGS+=-ansi -pedantic -Wall -O3
+#CXXFLAGS+=-ansi -pedantic -Wall -O3
 #CXXFLAGS+=-ansi -pedantic -Wall -g3
-#CXXFLAGS+=-ansi -pedantic -Wall -g3 -DDEBUG
+CXXFLAGS+=-ansi -pedantic -Wall -g3 -DDEBUG
 
 LDFLAGS=`pkg-config --libs gtk+-2.0`
 
@@ -46,7 +46,7 @@ circulo.o: figura.h circulo.cpp circulo.h
 
 rectangulo.o: figura.h rectangulo.cpp rectangulo.h
 
-cuadrado.o: rectangulo.h cuadrado.cpp cuadrado.h
+cuadrado.o: figura.h rectangulo.h cuadrado.cpp cuadrado.h
 
 dibujo.o: dllist.h figura.h dibujo.cpp dibujo.h
 
index 6b03e9a6e6cd50d2f7e8e4205539ae8e6d9d67d6..2d2968eb127f627982bcb022f917645cecb6d01e 100644 (file)
@@ -38,10 +38,8 @@ void Circulo::dibujar(GtkWidget* widget) const {
 #ifdef DEBUG
     std::cerr << "En dibujar de Círculo." << std::endl;
 #endif
-    // Copio el contexto gráfico del área de dibujo.
-    GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
-    // Le doy los nuevos valores.
-    set_gc(gc);
+    // Obtengo un contexto gráfico con el grosor y color de la figura.
+    GdkGC* gc = get_gc(widget);
     // Dibujo el círculo.
     gdk_draw_arc(
             // Área dibujable.
index 99f4ad53d4e9654f8fd86cb548853de1b4a51abf..bd9345021f3ef217bebe810b886fa107710540b7 100644 (file)
 GdkColor* Figura::traducir_color(GdkColor* c) const {
     // Elimino el color anterior.
     c->pixel = 0;
-    // Tiene el primer bit en 1.
+    c->red = 0;
+    c->green = 0;
+    c->blue = 0;
+    // Tiene el primer bit en 1 tiene pigmento azul.
     if (color & 1) {
-        // Entonces activo los bits 1,2,3,4,5,6,7 del color de 24 bits.
-        // (quedaría con la componente azul en 0x7F)
-        c->pixel |= 0x7F;
+        // Si tiene el cuarto bit, es bien saturado.
+        c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
     }
-    // Tiene el segundo bit en 1.
+    // Tiene el segundo bit en 1 tiene pigmento verde.
     if (color & (1 << 1)) {
-        // Entonces activo los bits 9,10,11,12,13,14,15 del color de 24 bits.
-        // (quedaría con la componente verde en 0x7F)
-        c->pixel |= 0x7F << 8;
+        // Si tiene el cuarto bit, es bien saturado.
+        c->green = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
     }
-    // Tiene el tercer bit en 1.
+    // Tiene el tercer bit en 1 tiene pigmento rojo.
     if (color & (1 << 2)) {
-        // Entonces activo los bits 17,18,19,20,21,22,23 del color de 24 bits.
-        // (quedaría con la componente roja en 0x7F)
-        c->pixel |= 0x7F << 16;
+        // Si tiene el cuarto bit, es bien saturado.
+        c->red = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
     }
-    // Tiene el cuarto bit en 1.
-    if (color & (1 << 3)) {
-        // Si tiene alguno de los bits menos significativos (tiene pigmento).
-        if (color & 7) {
-            c->pixel =
-                // Desplazo los bits del color de 24 bits 1 lugar a la
-                // izquierda (si era, por ejemplo 0111 1111, quedaría
-                // 1111 1110).
-                (c->pixel << 1)
-                // Al resultado le aplico una máscara para que quede 'prendido'
-                // el bit más significativo de los colores activados
-                // anteriormente (y de esta manera darles el doble de "luz").
-                // Por ejemplo: 1111 1110 & 1000 0000 = 1000 0000.
-                & 0x808080
-                // Finalmente, prendo los bits resultantes en el color de 24 bits.
-                // Por ejemplo: 1000 0000 | 0111 1111 = 1111 1111.
-                | c->pixel;
-        // Si no tiene pigmento no lo dejo negro porque negro ya es cuando están
-        // todos los bits apagados.
-        } else {
-            // Asigno un gris claro, combinación que no se da de otra manera.
-            c->pixel = 0xF0F0F0;
-        }
+    // Tiene el cuarto bit en 1 y todo el resto en 0, le asigno un gris claro
+    // porque negro ya es cuando son todos 0.
+    if (color == (1 << 3)) {
+        c->red = c->green = c->blue = 0xD000;
     }
 #ifdef DEBUG
-    std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
+    std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->red
+        << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
         << "." << std::endl;
 #endif
     return c;
@@ -103,7 +85,9 @@ Figura::~Figura(void) {
 #endif
 }
 
-void Figura::set_gc(GdkGC* gc) const {
+GdkGC* Figura::get_gc(GtkWidget* widget) const {
+    // Copio el contexto gráfico del área de dibujo.
+    GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
     // Asigna propiedades del trazo.
     gdk_gc_set_line_attributes(
             gc, // Contexto gráfico al cual asignar propiedades.
@@ -111,8 +95,20 @@ void Figura::set_gc(GdkGC* gc) const {
             GDK_LINE_SOLID, // Tipo de línea (sólida en este caso).
             GDK_CAP_ROUND, // Tipo de terminación (redondeada en este caso).
             GDK_JOIN_ROUND); // Forma de unir trazos (también redondeado).
+    // Obtengo el color.
     GdkColor c;
+    traducir_color(&c);
+    // Aloco el color en el mapa de colores del área de dibujo para que funcione
+    // en un display de menos de 24 bits.
+    gdk_colormap_alloc_color(gtk_widget_get_colormap(widget), &c, FALSE, TRUE);
+    // Indica que no se puede escribir, para que     /______________|      |
+    // se pueda compartir con otras aplicaciones.    \                     |
+    //                                                                     |
+    // Indica que si no se puede alocar, que trate de  /___________________|
+    // buscar un color similar.                        \.
+
     // Cambia el color del trazo.
-    gdk_gc_set_foreground(gc, traducir_color(&c));
+    gdk_gc_set_foreground(gc, &c);
+    return gc;
 }
 
index c79d65fd227bae1cf5c811a2bd8bdfcbda0fd3d0..7e1b9f7656a27200f56e2bc421f1e2c4ea91b4b2 100644 (file)
--- a/figura.h
+++ b/figura.h
@@ -44,13 +44,15 @@ class Figura {
         char nombre[MAX_NOMBRE];
 
         /**
-         * Modifica el contexto gráfico.
-         * Modifica el contexto gráfico según las propiedades de la figura
-         * (color y grosor).
+         * Crea un nuevo contexto gráfico.
+         * Crea un nuevo contexto gráfico con las propiedades de la figura
+         * (color y grosor) partiendo del contexto gráfico de un widget.
+         *
+         * \param widget Widget de donde copiar el GC inicial.
          *
-         * \param gc Contexto gráfico a modificar.
+         * \return Contexto gráfico a modificar.
          */
-        virtual void set_gc(GdkGC* gc) const;
+        virtual GdkGC* get_gc(GtkWidget* widget) const;
 
         /**
          * Traduce los 16 colores (de 4 bits) en colores de 24 bits.
index 924bf9fcb97dac34b54abe849f02e5848a54bc00..7c4cebe6eed595ff9240bcf9e0003e1830c128a1 100644 (file)
--- a/linea.cpp
+++ b/linea.cpp
@@ -38,10 +38,8 @@ void Linea::dibujar(GtkWidget* widget) const {
 #ifdef DEBUG
     std::cerr << "En dibujar de Línea." << std::endl;
 #endif
-    // Copio el contexto gráfico del área de dibujo.
-    GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
-    // Le doy los nuevos valores.
-    set_gc(gc);
+    // Obtengo un contexto gráfico con el grosor y color de la figura.
+    GdkGC* gc = get_gc(widget);
     // Dibujo la línea.
     gdk_draw_line(
             // Área dibujable.
index da7e087d01784172909e768dbf3ec815e7a2ca3e..c737320dae5019695d37fdf4799927f1ab1f35b0 100644 (file)
@@ -38,10 +38,8 @@ void Rectangulo::dibujar(GtkWidget* widget) const {
 #ifdef DEBUG
     std::cerr << "En dibujar de Rectángulo." << std::endl;
 #endif
-    // Copio el contexto gráfico del área de dibujo.
-    GdkGC* gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
-    // Le doy los nuevos valores.
-    set_gc(gc);
+    // Obtengo un contexto gráfico con el grosor y color de la figura.
+    GdkGC* gc = get_gc(widget);
     // Lado de la izquierda.
     gdk_draw_line(
             // Área dibujable.