]> git.llucax.com Git - z.facultad/75.42/figuras.git/blobdiff - figura.cpp
Se termina la documentacion.
[z.facultad/75.42/figuras.git] / figura.cpp
index 5ce3dec7ec0b6289a67d1c8335af1e63a37971f5..bd9345021f3ef217bebe810b886fa107710540b7 100644 (file)
 #   include <iostream>
 #endif
 
+GdkColor* Figura::traducir_color(GdkColor* c) const {
+    // Elimino el color anterior.
+    c->pixel = 0;
+    c->red = 0;
+    c->green = 0;
+    c->blue = 0;
+    // Tiene el primer bit en 1 tiene pigmento azul.
+    if (color & 1) {
+        // Si tiene el cuarto bit, es bien saturado.
+        c->blue = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+    }
+    // Tiene el segundo bit en 1 tiene pigmento verde.
+    if (color & (1 << 1)) {
+        // Si tiene el cuarto bit, es bien saturado.
+        c->green = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+    }
+    // Tiene el tercer bit en 1 tiene pigmento rojo.
+    if (color & (1 << 2)) {
+        // Si tiene el cuarto bit, es bien saturado.
+        c->red = (color & (1 << 3)) ? 0xFFFF : 0x7FFF;
+    }
+    // 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->red
+        << ", 0x" << std::hex << c->green << ", 0x" << std::hex << c->blue
+        << "." << std::endl;
+#endif
+    return c;
+}
+
 Figura::Figura(size_t color, size_t grosor, const Punto& centro,
         const char* nombre): centro(centro) {
+    // Cheque límites del color.
     if (color > 15) {
         this->color = 15;
     } else if (color < 0) {
@@ -30,6 +65,7 @@ Figura::Figura(size_t color, size_t grosor, const Punto& centro,
     } else {
         this->color = color;
     }
+    // Chequea límites del grosor.
     if (grosor > 10) {
         this->grosor = 10;
     } else if (grosor < 1) {
@@ -40,7 +76,7 @@ Figura::Figura(size_t color, size_t grosor, const Punto& centro,
 #ifdef DEBUG
     std::cerr << "En constructor de Figura." << std::endl;
 #endif
-     strncpy(this->nombre, nombre, 30);
+     strncpy(this->nombre, nombre, MAX_NOMBRE);
 }
 
 Figura::~Figura(void) {
@@ -49,13 +85,30 @@ 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,
-            grosor,
-            GDK_LINE_SOLID,
-            GDK_CAP_ROUND,
-            GDK_JOIN_ROUND);
-    //gdk_gc_set_foreground(gc, c);
+            gc, // Contexto gráfico al cual asignar propiedades.
+            grosor, // Grosor del trazo.
+            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, &c);
+    return gc;
 }