X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=betty%2Fdisplay.c;h=ce8fd7c1aeca22236c863598c9b64fb350360b3b;hb=71bf7666ce24cd3c07bb16648e0ab231e07be6d8;hp=1248279740118943e249be6c22c505a6e4946963;hpb=e12850bb699b1f9088a72840f3ae93a06326ab67;p=my-code%2Farm.git diff --git a/betty/display.c b/betty/display.c index 1248279..ce8fd7c 100644 --- a/betty/display.c +++ b/betty/display.c @@ -7,9 +7,13 @@ /* * some comments on alpha blending! + * ################################ * - * ... - * + * if c is the result of layer a over layer b with opacity alpha: + * + * c=alpha*a+(1-alpha)*b and if alpha is a byte (0-255) + * => c=alpha*a+(255-alpha)*b + * */ #include "display.h" @@ -71,14 +75,15 @@ void display_init(void) { // gray scale palette DISPLAY_SET_WHITE(0,0,0,0); - DISPLAY_SET_LGRAY(3,3,3,3); - DISPLAY_SET_DGRAY(6,6,6,6); + DISPLAY_SET_LGRAY(5,5,5,5); // obviously 3, but it's too bright! + DISPLAY_SET_DGRAY(7,7,7,7); // obviously 6, but again too bright! DISPLAY_SET_BLACK(9,9,9,9); /* normal mode, display depending ram content */ DISPLAY_RAM_CONTENTS_ON; display_clear_screen(); - DISPLAY_NORMAL; + DISPLAY_NORMAL; // 00 -> white, 11 -> black + DISPLAY_SET_COM_ODIR_REMAPPED; // start counting at the top /* switch on the display */ DISPLAY_SET_ON; @@ -103,54 +108,55 @@ void display_load_logo(u8 *src) { } } -void display_draw_rectangle(int x,int y,int w,int h,u8 fill,u8 alpha) { +#define display_m2i(m,r) (((((m)[0]>>r)&1)<<1)|(((m)[1]>>r)&1)) - int c,r,rmax; - u8 p,spage,epage; - u8 b[2],a[2]; // c = a over b => c=alpha*a+(1-alpha)*b +void display_draw_rectangle(u8 x,u8 y,u8 w,u8 h,u8 fill,u8 alpha) { - a[0]=0; - a[1]=0; - switch(fill) { - case DISPLAY_FILL_LG: - a[1]=1; - break; - case DISPLAY_FILL_DG: - a[0]=1; - break; - case DISPLAY_FILL_B: - a[0]=1; - a[1]=1; - case DISPLAY_FILL_W: - default: - break; - } + u8 page,col,row,rmax,cnt; + u8 d[2]; + int ca,cb; + u8 a,b,c; // c = a over b + + a=fill&0x03; + ca=0; + for(cnt=0;cnt>3; // start page = y/8 - epage=(y+h)>>3; // end page (y+h)/8 - - for(p=spage;p<=epage;p++) { - DISPLAY_SET_PAGE_ADDR(p); - for(c=x;cy+h?y+h:y+8; - for(r=y;r>3);page<=((y+h)>>3);page++) { // page = y/8 + DISPLAY_SET_PAGE_ADDR(page); + rmax=(page+1)<<3; // row max + if(rmax>y+h) + rmax=y+h; + for(col=x;col>8; + d[0]&=~(1<>1)&1)<