ref: d720781005fff71800333afec5f574ccd770edea
dir: /drw.c/
#include <u.h> #include <libc.h> #include <draw.h> #include "dat.h" #include "fns.h" static u32int fb[Vwidth * Vheight]; int npal; u32int *pal; Pic pics[PCend]; static int scale, fbsz; static Rectangle fbsr; static Image *fbs; static u32int *fbsbuf; static void drawscaled(void) { u32int *s, *p, v; s = fb; p = fbsbuf; while(s < fb + nelem(fb)){ v = *s++; switch(scale){ case 12: *p++ = v; case 11: *p++ = v; case 10: *p++ = v; case 9: *p++ = v; case 8: *p++ = v; case 7: *p++ = v; case 6: *p++ = v; case 5: *p++ = v; case 4: *p++ = v; case 3: *p++ = v; case 2: *p++ = v; *p++ = v; } } } void drawfb(void) { uchar *p; Rectangle r; if(scale == 1){ loadimage(fbs, fbs->r, (uchar*)fb, fbsz); draw(screen, fbsr, fbs, nil, ZP); }else{ drawscaled(); p = (uchar*)fbsbuf; r = fbsr; while(r.min.y < fbsr.max.y){ r.max.y = r.min.y + scale; p += loadimage(fbs, fbs->r, p, fbsz / Vheight); draw(screen, r, fbs, nil, ZP); r.min.y = r.max.y; } } flushimage(display, 1); } void resetfb(int paint) { Point o, p; scale = min(Dx(screen->r) / Vwidth, Dy(screen->r) / Vheight); if(scale <= 0) scale = 1; else if(scale > 12) scale = 12; o = divpt(addpt(screen->r.min, screen->r.max), 2); p = Pt(Vwidth / 2 * scale, Vheight / 2 * scale); fbsr = Rpt(subpt(o, p), addpt(o, p)); fbsz = Vwidth * Vheight * scale * sizeof *fbsbuf; freeimage(fbs); if((fbs = allocimage(display, Rect(0,0,Vwidth*scale,scale==1? Vheight : 1), XRGB32, scale > 1, DBlack)) == nil) sysfatal("allocimage: %r"); free(fbsbuf); fbsbuf = nil; if(scale != 1) fbsbuf = emalloc(fbsz); draw(screen, screen->r, display->black, nil, ZP); if(paint) drawfb(); else flushimage(display, 1); } void initfb(void) { if(initdraw(nil, nil, "dporg") < 0) sysfatal("initdraw: %r"); loadpics(); resetfb(0); }