#include #include #include #include bitmap_rich* bitmap_new_rich(uint32_t size_px_x, uint32_t size_px_y, uint32_t* color, bool copy_color, uint32_t *layout, bool copy_layout) { bitmap_rich* bmp = malloc(sizeof(bitmap_rich)); if (!bmp) return 0; bmp->size_px_x = size_px_x; bmp->size_px_y = size_px_y; bmp->size_o_y = 1 + (size_px_x - 1)/(8*sizeof(uint32_t)); bmp->color_dynamic = copy_color; bmp->layout_dynamic = copy_layout; uint32_t size_octets = size_px_y * bmp->size_o_y * sizeof(uint32_t); if (copy_color) { bmp->color = malloc(size_octets); if (!bmp->color) { free(bmp); return 0; } memcpy(bmp->color, color, size_octets); } else bmp->color = color; if (copy_layout && layout) { bmp->layout=malloc(size_octets); if (!bmp->layout) { free(bmp); if (copy_color) free(bmp->color); return 0; } memcpy(bmp->layout, layout, size_octets); } else bmp->layout = layout; return bmp; } void bitmap_delete_rich(bitmap_rich* bmp) { if (!bmp) return; if (bmp->layout_dynamic && bmp->layout) free(bmp->layout); if (bmp->color) free(bmp->color); free(bmp); } uint8_t bitmap_get_pixel_r(const bitmap_rich * bmp, uint32_t x, uint32_t y) { if (x >= bmp->size_px_x || y >= bmp->size_px_y) return 0; const uint32_t indice = y * bmp->size_o_y + (x / 32); const uint32_t numero_bit = 31 - (x %32); if (bmp->layout) return (((bmp->layout[indice] & (1 << numero_bit)) >> numero_bit) + ((bmp->color[indice] & (1 << numero_bit)) >> numero_bit)); else return (0b10 + ((bmp->color[indice] & (1 << numero_bit)) >> numero_bit)); } void bitmap_display_pixel_r(const bitmap_rich * bmp, uint32_t bmp_x, uint32_t bmp_y, uint32_t x, uint32_t y) { uint8_t color = bitmap_get_pixel_r(bmp, bmp_x, bmp_y); if (color) dpixel(x, y, 3 * (color % 2)); }