/*
Nome: Mario
Cognome: Montanari
Classe: 3AIN
Data: 02/05/2025

Metodo 1 per la generazione di un immagine .bmp (copio un'immagine già esistente
e la modifico come voglio).
*/

#include <iostream>

using namespace std;

#pragma pack(1)

typedef struct {
	char bfType[2];
	int bfSize;
	int bfReserved;
	int bfOffBits;
} BITMAPFILEHEADER;

typedef struct {
	unsigned char b;
	unsigned char g;
	unsigned char r;
} BGR;

int main(void) {
	cout << "Size of BITMAPFILEHEADER: " << sizeof(BITMAPFILEHEADER) << endl;
	
	FILE * file = fopen("immagine_generata.bmp", "r+b");
	
	if (file != NULL) {
		int bfOffBits;
		
		BITMAPFILEHEADER bf;
		
		fread(&bf, sizeof(bf), 1, file);
		cout << "bfType: " << bf.bfType[0] << bf.bfType[1] << endl;
		cout << "bfSize: " << bf.bfSize << endl;
		cout << "bfReserved: " << bf.bfReserved << endl;
		cout << "bfOffBits: " << bf.bfOffBits << endl;
		
		fseek(file, bf.bfOffBits, SEEK_SET);
		
		BGR bgr[20 * 20];
		
		/* METODO 1 PER LA VERIFICA DELLA LETTURA DEL PIXEL
		if(fread(&bgr, sizeof(BGR), 20 * 20, file) < 400) {
			cout << "Errore di scrittura." << endl;
		}
		*/
		
		// METODO 2 PER LA VERIFICA DELLA LETTURA DEL PIXEL
		if(fread(&bgr, sizeof(bgr), 1, file) < 1) {
			cout << "Errore di scrittura." << endl;
		}
		
		for (int i = 0; i < 20 * 20; i++) {			
			bgr[i].b = 0;
			bgr[i].g = 255;
			bgr[i].r = 0;
		}
		
		fseek(file, bf.bfOffBits, SEEK_SET);
		
		/* METODO 1 PER LA VERIFICA DELLA SCRITTURA DEL PIXEL
		if(fwrite(&bgr, sizeof(BGR), 20 * 20, file) < 400) {
			cout << "Errore di scrittura." << endl;
		}
		*/
		
		// METODO 1 PER LA VERIFICA DELLA SCRITTURA DEL PIXEL
		if(fwrite(&bgr, sizeof(bgr), 1, file) < 1) {
			cout << "Errore di scrittura." << endl;
		}
		
		fclose(file);
	} else {
		perror("Error (source)");
	}
	
	return 0;
}