51 lines
1,009 B
C
51 lines
1,009 B
C
#include "bmp.h"
|
|
#include "heap.h"
|
|
#include "video.h"
|
|
#include "stdlib.h"
|
|
#include "defines.h"
|
|
|
|
void bmp_draw(u64 px,u64 py,u64 w,u64 h,u8* bmp)
|
|
{
|
|
u32 offbits = *(u32*)(bmp+0x0A);
|
|
u64 bw,bh,stride;
|
|
u64 bc;
|
|
u8* bmap = bmp+offbits;
|
|
|
|
w = MIN(w,lmem->v_width);
|
|
h = MIN(h,lmem->v_height);
|
|
|
|
bw = *(u32*)(bmp+0x12);
|
|
bh = *(u32*)(bmp+0x16);
|
|
bc = *(u16*)(bmp+0x1C)>>3;
|
|
|
|
stride = ROUND2_UP((bw*bc),2);
|
|
|
|
u64 f_w,f_h;
|
|
if(!w) f_w = 0x00010000;
|
|
else f_w = (w<<32) / (bw<<16);
|
|
if(!h) f_h = 0x00010000;
|
|
else f_h = (h<<32) / (bh<<16);
|
|
|
|
u64 c_y = 0;
|
|
for(u64 y = 0; y < bh; y++)
|
|
{
|
|
u64 c_x = 0;
|
|
u8* line = &bmap[(bh-y-1)*stride];
|
|
for(u64 x = 0; x < bw; x++)
|
|
{
|
|
u8 r,g,b;
|
|
r = *line++;
|
|
g = *line++;
|
|
b = *line++;
|
|
u32 color = (b<<16|g<<8|r);
|
|
for(u64 i = 0; i < (f_w>>16); i++)
|
|
{
|
|
video_pixel(px+c_x+i,py+c_y,color);
|
|
for(u64 j = 1; j < (f_h>>16); j++)
|
|
video_pixel(px+c_x+i,py+c_y+j,color);
|
|
}
|
|
c_x = ((c_x<<16) + f_w) >> 16;
|
|
}
|
|
c_y = ((c_y<<16) + f_h) >> 16;
|
|
}
|
|
}
|