====== 12 - Práce se soubory + dynamická správa paměti ======
Pro učitele: [[courses:a0b36pr2:internal:tutorials:12:start|]]
Na tomto cvičení spojíme několik předcházejících témat (dynamická alokace paměti, práce se soubory, pointerová aritmetika, ukazatele na funkce, atd.) v jednom komplexním programu.
===== Úkol =====
Vytvořte knihovnu pro práci s bitmapami (''bitmap_utils.c'', ''bitmap_utils.h''). Tato knihovna umožní vytvořit bitmapu o zadané velikosti v paměti, kreslit do ní jednotlivé pixely a čáry zadanou barvou a exportovat tuto bitmapu ve formátu BMP.
Toto jsou povinné funkce knihovny "bitmap_utils":
t_bitmap *create_bitmap(uint16_t width, uint16_t height);
void delete_bitmap(t_bitmap *bitmap);
void set_color(uint8_t r, uint8_t g, uint8_t b);
void draw_pixel(t_bitmap *bitmap, uint16_t x, uint16_t y);
void draw_line(t_bitmap *bitmap, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
int export_bitmap_to_bmp(char *filename, t_bitmap *bitmap);
Typy ''unit16_t'', ''uint8_t'' najdete v ''inttypes.h''.
Datový typ ''t_bitmap'' navrhněte dle vlastního uvážení.
Dále vytvořte funkci ''plot'', která do zadané bitmapy vykreslí graf funkce (tuto funkci předávejte jako ukazatel) v zadaných mezích (rozsah osy x a y).
Testovací hlavní program:
#include
#include
#include
#include "bitmap_utils.h"
#define WIDTH 320
#define HEIGHT 200
double function1(double x) {
return sin(x);
}
double function2(double x) {
return sin(x) * sin(x);
}
void plot(t_bitmap *bitmap, /* DOPLŇTE */,
double x_min, double x_max, double y_min, double y_max) {
/* DOPLŇTE VLASTNÍ KÓD */
}
int main(int argc, char** argv) {
t_bitmap* bitmap;
int x, y;
bitmap = create_bitmap(WIDTH, HEIGHT);
set_color(255, 255, 255); // White color
for (x = 0; x < WIDTH; x++) {
for (y = 0; y < HEIGHT; y++) {
draw_pixel(bitmap, x, y);
}
}
set_color(0, 0, 0); // White color
plot(bitmap, &function1, 0, 2 * M_PI, -1, 1);
export_bitmap_to_bmp("out1.bmp", bitmap);
set_color(255, 0, 0); // Red color
plot(bitmap, &function2, 0, 2 * M_PI, -1, 1);
export_bitmap_to_bmp("out2.bmp", bitmap);
set_color(0, 255, 0); // Green color
plot(bitmap, &function2, 0, 10 * M_PI, -1, 1);
export_bitmap_to_bmp("out3.bmp", bitmap);
set_color(0, 0, 255); // Blue color
plot(bitmap, &function2, 0, 10 * M_PI, 0, 1);
export_bitmap_to_bmp("out4.bmp", bitmap);
delete_bitmap(bitmap);
return (EXIT_SUCCESS);
}
Tento program by měl vygenerovat následující obrázky:
* out1.bmp : {{:courses:a0b36pr2:labs:out1.png?80|}}
* out2.bmp : {{:courses:a0b36pr2:labs:out2.png?80|}}
* out3.bmp : {{:courses:a0b36pr2:labs:out3.png?80|}}
* out4.bmp : {{:courses:a0b36pr2:labs:out4.png?80|}}
Důsledně ošetřujte chyby. Např. předání nulového ukazatele, chyba při alokaci paměti, chyba při otevírání souboru, horní a dolní meze souřadnic při kreslení, atd.
Existuje velké množství variant BMP formátu - doporučujeme zvolit RGB formát bez komprese s velikostí DIB hlavičky 40 bytů. Můžete ale implementovat libovolnou variantu - např. verzi s paletou.
===== Užitečné odkazy =====
* [[http://en.wikipedia.org/wiki/BMP_file_format]]
* [[http://en.wikipedia.org/wiki/Bresenham's_line_algorithm]]