#include <GL/glut.h>
#include <iostream>

int imageWidth = 256;  // Ancho de la imagen
int imageHeight = 256; // Alto de la imagen
GLubyte* pixels;  // Puntero para almacenar los píxeles

// Función para generar la imagen (cuadrado blanco sobre fondo negro)
void createImage() {
    glClear(GL_COLOR_BUFFER_BIT);  // Limpiar el buffer de color

    glColor3f(1.0f, 1.0f, 1.0f);  // Color blanco para el cuadrado
    glBegin(GL_QUADS);
        glVertex2f(-0.5f, -0.5f);  // Esquina inferior izquierda
        glVertex2f( 0.5f, -0.5f);  // Esquina inferior derecha
        glVertex2f( 0.5f,  0.5f);  // Esquina superior derecha
        glVertex2f(-0.5f,  0.5f);  // Esquina superior izquierda
    glEnd();

    glutSwapBuffers();  // Mostrar el contenido de la ventana
}

// Función para leer los píxeles
void readPixels() {
    // Reservamos espacio para almacenar los píxeles (RGB)
    pixels = new GLubyte[imageWidth * imageHeight * 3];

    // Leemos los píxeles desde la pantalla 
	// (coordenadas desde el origen en la esquina inferior izquierda)
    glReadPixels(0, 0, imageWidth, imageHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels);

    // Imprimir los valores de los píxeles
    std::cout << "Píxeles leídos (en formato RGB):" << std::endl;
    for (int y = 0; y < imageHeight; ++y) {
        for (int x = 0; x < imageWidth; ++x) {
			// Índice del píxel en la matriz de píxeles
            int index = (y * imageWidth + x) * 3;  
            GLubyte r = pixels[index];     // Canal rojo
            GLubyte g = pixels[index + 1]; // Canal verde
            GLubyte b = pixels[index + 2]; // Canal azul

            // Imprimir el valor RGB del píxel
            std::cout << "(" << (int)r << ", " << (int)g << ", " << (int)b << ") ";
        }
        std::cout << std::endl;
    }

    // Liberar memoria
    delete[] pixels;
}

// Función de renderizado principal
void display() {
    createImage();  // Generar la imagen
    readPixels();   // Leer los píxeles y mostrarlos en la consola
}

// Función para configurar la ventana y el contexto de OpenGL
void init() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // Fondo negro
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);  // Configurar el sistema de coordenadas ortográficas
    glMatrixMode(GL_MODELVIEW);
}

// Función principal
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Leer y mostrar los píxeles de una imagen");

    init();
    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}

