/** * @file Canvas.cpp * @author apio (cloudapio.eu) * @brief Drawable surfaces. * * @copyright Copyright (c) 2023, the Luna authors. * */ #include namespace ui { Canvas Canvas::create(u8* ptr, int width, int height) { return Canvas { .width = width, .height = height, .stride = width, .ptr = ptr }; } Canvas Canvas::subcanvas(Rect rect) { if (rect.pos.x < 0) rect.pos.x = 0; if (rect.pos.y < 0) rect.pos.y = 0; if (rect.pos.x + rect.width > width) rect.width = width - rect.pos.x; if (rect.pos.y + rect.height > height) rect.height = height - rect.pos.y; u8* p = ptr + rect.pos.x * sizeof(Color) + (rect.pos.y * sizeof(Color) * stride); return Canvas { .width = rect.width, .height = rect.height, .stride = stride, .ptr = p }; } void Canvas::fill(Color color) { u8* p = ptr; for (int i = 0; i < height; i++) { u32* colorp = (u32*)p; for (int j = 0; j < width; j++) { *colorp = color.raw; colorp++; } p += stride * sizeof(Color); } } void Canvas::fill(u32* pixels, int _stride) { u8* p = ptr; for (int i = 0; i < height; i++) { u32* colorp = (u32*)p; for (int j = 0; j < width; j++) { u32 pix = pixels[j]; if (Color::from_u32(pix).alpha() == 0xff) *colorp = pix; colorp++; } pixels += _stride; p += stride * sizeof(Color); } } }