*
* Taller de Programación (75.42).
*
- * Ejercicio Número 3:
- * Lista de figuras.
+ * Ejercicio Número 5:
+ * Graficador de figuras.
*
* Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
* Puede copiar, modificar y distribuir este programa bajo los términos de
*/
#include "figura.h"
-#include <cstring>
#ifdef DEBUG
# 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) {
} else {
this->color = color;
}
+ // Chequea límites del grosor.
if (grosor > 10) {
this->grosor = 10;
} else if (grosor < 1) {
#endif
}
-void Figura::dibujar(std::ostream& out) const {
- out << "color(" << color << "), grosor(" << grosor
- << "), nombre(" << nombre << "), centro(";
- centro.dibujar(out);
- 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));
}