}
for(page=0;page<DISPLAY_PAGE_MAX;page++) {
- DISPLAY_SET_C_ADDR(0);
+ DISPLAY_SET_COL_ADDR(0);
DISPLAY_SET_PAGE_ADDR(page);
for(width=0;width<DISPLAY_DIMX;width++) {
DISPLAY_DATA=buf[0];
s=default_logo;
for(page=0;page<DISPLAY_PAGE_MAX;page++) {
- DISPLAY_SET_C_ADDR(0);
+ DISPLAY_SET_COL_ADDR(0);
DISPLAY_SET_PAGE_ADDR(page);
for(width=0;width<DISPLAY_DIMX;width++) {
DISPLAY_DATA=*s++;
if(rmax>y+h)
rmax=y+h;
for(col=x;col<x+w;col++) {
- DISPLAY_SET_C_ADDR(col);
+ DISPLAY_SET_COL_ADDR(col);
d[0]=DISPLAY_DATA; // dummy read (p.16)
d[0]=DISPLAY_DATA;
d[1]=DISPLAY_DATA;
d[0]|=((c>>1)&1)<<row;
d[1]|=(c&1)<<row;
}
- DISPLAY_SET_C_ADDR(col);
+ DISPLAY_SET_COL_ADDR(col);
DISPLAY_DATA=b[0];
DISPLAY_DATA=b[1];
}
+ h-=(rmax-y);
+ y=rmax;
+ }
+}
+
+void display_draw_font(u8 x,u8 y,u8 *font,u8 fill,u8 alpha) {
+
+ u8 page,col,row,rmax,cnt,left;
+ u8 d[2];
+ int ca,cb;
+ u8 a,b,c; // c = a over b
+
+ left=8;
+
+ a=fill&0x03;
+ ca=0;
+ for(cnt=0;cnt<a;cnt++) // contribution of a: alpha*a
+ ca+=alpha;
+
+ for(page=(y>>3);page<=((y+8)>>3);page++) { // page = y/8
+ DISPLAY_SET_PAGE_ADDR(page);
+ rmax=(page+1)<<3; // row max
+ if(rmax>y+left)
+ rmax=y+left;
+ cf=0;
+ for(col=x;col<x+8;col++) {
+ DISPLAY_SET_COL_ADDR(col);
+ d[0]=DISPLAY_DATA; // dummy read (p.16)
+ d[0]=DISPLAY_DATA;
+ d[1]=DISPLAY_DATA;
+ rf=0;
+ for(row=y;row<rmax;row++) {
+ // contribution of b: (255-alpha)*b
+ b=display_m2i(d,row);
+ cb=0;
+ for(cnt=0;cnt<b;cnt++)
+ cb+=(255-alpha);
+ // finally there is c
+ if((font[cf]>>row)&1) {
+ c=(ca+cb)>>8;
+ d[0]&=~(1<<row);
+ d[1]&=~(1<<row);
+ d[0]|=((c>>1)&1)<<row;
+ d[1]|=(c&1)<<row;
+ }
+ rf+=1;
+ }
+ DISPLAY_SET_COL_ADDR(col);
+ DISPLAY_DATA=b[0];
+ DISPLAY_DATA=b[1];
+ cf+=1;
+ }
+ left-=(rmax-y);
y=rmax;
}
}
void display_draw_buf(u8 x,u8 y,u8 w,u8 h,u8 *buf,u8 alpha) {
+ u8 page,col,row,rmax,cnt;
+ u8 d[2];
+ int ca,cb;
+ u8 a,b,c;
+
+ for(page=(y>>3);page<=((y+h)>>3);page++) {
+ DISPLAY_SET_PAGE_ADDR(page);
+ for(col=x;col<x+w;col++) {
+ DISPLAY_SET_COL_ADDR(col);
+ d[0]=DISPLAY_DATA;
+ d[0]=DISPLAY_DATA;
+ d[1]=DISPLAY_DATA;
+ for(row=y;row<rmax;row++) {
+ }
+ }
+ }
}
void display_bl_init(void) {
#define DISPLAY_RAM_CONTENT (DISPLAY_PAGE_MAX*DISPLAY_COL_MAX*2)
/* display cmds */
-#define DISPLAY_SET_C_ADDR(c) DISPLAY_CMD=(0x00|((c)&0x0f)); \
+#define DISPLAY_SET_COL_ADDR(c) DISPLAY_CMD=(0x00|((c)&0x0f)); \
DISPLAY_CMD=(0x10|(((c)&0x70)>>4))
#define DISPLAY_SET_MASTER DISPLAY_CMD=0x18
#define DISPLAY_SET_SLAVE DISPLAY_CMD=0x19
DISPLAY_CMD=(c)
#define DISPLAY_EXTENDED_FEATURES DISPLAY_CMD=0xf0
+/* experimental cmds */
+#define DISPLAY_SET_READ_MODIFY_WRITE DISPLAY_CMD=0xe0;
+#define DISPLAY_UNSET_READ_MODIFY_WRITE DISPLAY_CMD=0xee;
+
/* display api specific defines */
#define DISPLAY_FILL_W 0x00
#define DISPLAY_FILL_LG 0x01