void tilemap_draw(TileMap *tile_map, ImageSet *set, i32 dx, i32 dy) { unused(dx); unused(dy); V4i r = PROGRAM->screen_rect; rect_tr(&r, -PROGRAM->tx, -PROGRAM->ty); r.min_x = MAX(0, ((r.min_x) / (i32)set->cw)); r.min_y = MAX(0, ((r.min_y) / (i32)set->ch)); r.max_x = MIN((i32)tile_map->w, ceil_div(r.max_x, set->cw)); r.max_y = MIN((i32)tile_map->h, ceil_div(r.max_y, set->ch)); u16 *tile = tile_map_data(tile_map); for (i32 y = r.min_y; y != r.max_y; y++) { for (i32 x = r.min_x; x != r.max_x; x++) { if (tile[x] != 0xFFFF) { image_set_draw(x * set->cw, y * set->ch, set, tile[x], 0, 0); } } tile += tile_map->w; } }
void bitmap_draw(i32 x, i32 y, i32 pivot_x, i32 pivot_y, Bitmap *bitmap, Rect *bitmap_rect, u32 flags, u8 color) { Rect p_bitmap_rect, rect; i32 sx = 0, sy = 0; ASSERT(bitmap); ASSERT(clip_check()); if (bitmap_rect) { ASSERT(rect_check_limits(bitmap_rect, 0, 0, bitmap->width, bitmap->height)); p_bitmap_rect = *bitmap_rect; } else { p_bitmap_rect = rect_make_size(0, 0, bitmap->width, bitmap->height); } rect = rect_make_size(x - pivot_x, y - pivot_y, p_bitmap_rect.max_x - p_bitmap_rect.min_x, p_bitmap_rect.max_y - p_bitmap_rect.min_y); rect_tr(&rect, CORE->translate_x, CORE->translate_y); if (clip_rect_with_offsets(&rect, &CORE->clip, &sx, &sy)) { i32 w = rect.max_x - rect.min_x; i32 h = rect.max_y - rect.min_y; u32 dst_fill = CORE->canvas->width; u8 *dst = CORE->canvas->pixels + rect.min_x + (rect.min_y * dst_fill); i32 punp_blit_x, punp_blit_y; // i32 sw = (p_bitmap_rect.max_x - p_bitmap_rect.min_x) - sx; // i32 sh = (p_bitmap_rect.max_y - p_bitmap_rect.min_y) - sy; sx += p_bitmap_rect.left; sy += p_bitmap_rect.top; if ((flags & DrawFlags_FlipH) == 0) { u32 src_fill = bitmap->width - w; u8 *src = bitmap->pixels // + (index * (sw * sh)) + (sx + (sy * bitmap->width)); if (flags & DrawFlags_Mask) { PUNP_BLIT(color, src++); } else { PUNP_BLIT(*src, src++); } } else { u32 src_fill = bitmap->width + w; u8 *src = bitmap->pixels // + (index * (sw * sh)) + (sx + (sy * bitmap->width)) + (w - 1); if (flags & DrawFlags_Mask) { PUNP_BLIT(color, src--); } else { PUNP_BLIT(*src, src--); } } } }
DrawTextResult text_draw(i32 x, i32 y, char *text, u8 cf, u8 cb) { ASSERT(PROGRAM->font); V4i r = v4i_make_size(x, y, PROGRAM->font->cw, PROGRAM->font->ch); if ((x + PROGRAM->tx) < PROGRAM->bitmap_rect.max_x && (y + PROGRAM->ty) < PROGRAM->bitmap_rect.max_y) { // rect_tr(&r, PROGRAM->tx, PROGRAM->ty); V4i rect; ImageSet *font = PROGRAM->font; char *anchor = text; for (;;) { text = find_next(anchor, '\n'); if (cb) { rect.min_x = x - font->padding.min_x; rect.min_y = y - font->padding.min_y; rect.max_x = x + (text - anchor) * font->cw + font->padding.max_x; rect.max_y = y + font->ch + font->padding.max_y; rect_draw(rect, cb); } i32 xp = x; while (anchor != text) { if (*anchor != ' ') { image_set_draw(xp, y, PROGRAM->font, *anchor, DrawSpriteMode_Mask, cf); } anchor++; xp += PROGRAM->font->cw; } if (*text == 0) { break; } text++; anchor = text; rect_tr(&r, 0, PROGRAM->font->ch); } } DrawTextResult res = { r.max_x, r.min_y }; return res; }
void image_set_draw(i32 x, i32 y, ImageSet *set, u16 index, u8 mode, u8 mask) { ASSERT(index < set->count); V4i r = v4i_make_size(x - set->pivot_x, y - set->pivot_y, set->cw, set->ch); rect_tr(&r, PROGRAM->tx, PROGRAM->ty); // clip_rect(&r, &program->bitmap_rect); i32 ox = 0; i32 oy = 0; if (clip_rect_with_offsets(&r, &PROGRAM->bitmap_rect, &ox, &oy)) { i32 w = r.max_x - r.min_x; i32 h = r.max_y - r.min_y; i32 sw = set->cw; i32 sh = set->ch; u32 dst_fill = PROGRAM->bitmap_rect.max_x - PROGRAM->bitmap_rect.min_x; u8 *dst = PROGRAM->bitmap->data + r.min_x + (r.min_y * dst_fill); i32 _x, _y; if ((mode & DrawSpriteMode_FlipH) == 0) { u32 src_fill = sw - w; u8 *src = image_set_data(set) + (index * (sw * sh)) + (ox + (oy * sw)); if (mode & DrawSpriteMode_Mask) { _BLIT(mask, src++); } else { _BLIT(*src, src++); } } else { u32 src_fill = sw + w; u8 *src = image_set_data(set) + (index * (sw * sh)) + (ox + (oy * sw)) + (w - 1); if (mode & DrawSpriteMode_Mask) { _BLIT(mask, src--); } else { _BLIT(*src, src--); } } } }
void rect_draw(Rect r, u8 color) { rect_tr(&r, CORE->translate_x, CORE->translate_y); rect_intersect(&r, &CORE->clip); if (r.max_x > r.min_x && r.max_y > r.min_y) { u32 canvas_pitch = CORE->canvas->width; u8 *row = CORE->canvas->pixels + r.min_x + (r.min_y * canvas_pitch); i32 w = r.max_x - r.min_x; while (r.max_y != r.min_y) { memset(row, color, w); row += canvas_pitch; r.max_y--; } } }
void rect_draw(V4i r, u8 color) { rect_tr(&r, PROGRAM->tx, PROGRAM->ty); clip_rect(&r, &PROGRAM->bitmap_rect); if (r.max_x != r.min_x && r.max_y != r.min_y) { // i32 row_pitch = PROGRAM->bitmap_rect.max_x - PROGRAM->bitmap_rect.min_x; // u8 *row = PROGRAM->bitmap->data + r.min_x + (r.min_y * row_pitch); u8 *row = PROGRAM->bitmap->data + r.min_x + (r.min_y * PROGRAM->bitmap->w); i32 w = r.max_x - r.min_x; while (r.max_y != r.min_y) { memset(row, color, w); row += PROGRAM->bitmap->w; // row_pitch; r.max_y--; } } }