Пример #1
0
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;
    }
}
Пример #2
0
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--);
            }
        }
    }
}
Пример #3
0
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;
}
Пример #4
0
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--);
            }
        }
    }
}
Пример #5
0
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--;
        }
    }
}
Пример #6
0
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--;
        }
    }
}