]> git.llucax.com Git - z.facultad/75.42/figuras.git/blobdiff - figura.cpp
Se agrega una parte del informe con una captura de pantalla.
[z.facultad/75.42/figuras.git] / figura.cpp
index c6ad541fa576ee3f12e9123e16fce7298e0b54ff..99f4ad53d4e9654f8fd86cb548853de1b4a51abf 100644 (file)
 #   include <iostream>
 #endif
 
+GdkColor* Figura::traducir_color(GdkColor* c) const {
+    // Elimino el color anterior.
+    c->pixel = 0;
+    // Tiene el primer bit en 1.
+    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;
+    }
+    // Tiene el segundo bit en 1.
+    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;
+    }
+    // Tiene el tercer bit en 1.
+    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;
+    }
+    // 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;
+        }
+    }
+#ifdef DEBUG
+    std::cerr << "En Figura::traducir_color: 0x" << std::hex << c->pixel
+        << "." << 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 +83,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 +94,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,9 +103,16 @@ Figura::~Figura(void) {
 #endif
 }
 
-void Figura::dibujar(GtkWidget* widget) const {
-    //out << "color(" << color << "), grosor(" << grosor
-    //   << "), nombre(" << nombre << "), centro(";
-    //centro.dibujar(out);
+void Figura::set_gc(GdkGC* gc) const {
+    // Asigna propiedades del trazo.
+    gdk_gc_set_line_attributes(
+            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).
+    GdkColor c;
+    // Cambia el color del trazo.
+    gdk_gc_set_foreground(gc, traducir_color(&c));
 }