====== 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]]