by parisse » 21 Sep 2020, 13:02
Il y a une doc specifique pour la nspire cx ii?
Voila le code par ou passent tous les affichages de KhiCAS, si quelqu'un voit du code non portable:
- Code: Select all
Gc nspire_gc=0;
Gc * get_gc(){
if (!nspire_gc){
nspire_gc=gui_gc_global_GC();
gui_gc_setRegion(nspire_gc, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
gui_gc_begin(nspire_gc);
}
return &nspire_gc;
}
void os_set_pixel(int x,int y,int c){
get_gc();
gui_gc_setColor(nspire_gc,c_rgb565to888(c));
gui_gc_drawRect(nspire_gc,x,y+nspire_statusarea,1,1);
}
void os_fill_rect(int x,int y,int w,int h,int c){
get_gc();
gui_gc_setColor(nspire_gc,c_rgb565to888(c));
gui_gc_fillRect(nspire_gc,x,y+nspire_statusarea,w,h);
}
int os_get_pixel(int x,int y){
if (x<0 || x>=SCREEN_WIDTH || y<0 || y>=SCREEN_HEIGHT)
return -1;
#if 1
get_gc();
char ** off_buff = ((((char *****)nspire_gc)[9])[0])[0x8];
int res = *(unsigned short *) (off_buff[y+nspire_statusarea] + 2*x);
return res;
#else
unsigned short * addr=*(unsigned short **) 0xC0000010;
int r=addr[(y+nspire_statusarea)*SCREEN_WIDTH+x];
return r;
#endif
}
int nspire_draw_string(int x,int y,int c,int bg,int f,const char * s,bool fake){
// void ascii2utf16(void *buf, const char *str, int max_size): converts the UTF-8 string str to the UTF-16 string buf of size max_size.
int l=strlen(s);
char utf16[2*l+2];
ascii2utf16(utf16,s,l);
utf16[2*l]=0;
utf16[2*l+1]=0;
get_gc();
gui_gc_setFont(nspire_gc,f);
int dx=gui_gc_getStringWidth(nspire_gc, f, utf16, 0, l) ;
if (fake)
return x+dx;
int dy=17;
if (f==Regular9)
dy=13;
if (f==Regular11)
dy=16;
gui_gc_setColor(nspire_gc,c_rgb565to888(bg));
gui_gc_fillRect(nspire_gc,x,y,dx,dy);
gui_gc_setColor(nspire_gc,c_rgb565to888(c));
//gui_gc_setPen(nspire_gc, GC_PS_MEDIUM, GC_PM_SMOOTH);
gui_gc_drawString(nspire_gc, utf16, x, y-1, GC_SM_NORMAL | GC_SM_TOP); // normal mode
return x+dx;
}
int os_draw_string(int x,int y,int c,int bg,const char * s,bool fake){
get_gc();
gui_gc_clipRect(nspire_gc,0,nspire_statusarea,SCREEN_WIDTH,SCREEN_HEIGHT-nspire_statusarea,0);
int i=nspire_draw_string(x,y+nspire_statusarea,c,bg,Regular12,s,fake);
gui_gc_clipRect(nspire_gc,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,GC_CRO_RESET);
return i;
}
int os_draw_string_small(int x,int y,int c,int bg,const char * s,bool fake){
get_gc();
gui_gc_clipRect(nspire_gc,0,nspire_statusarea,SCREEN_WIDTH,SCREEN_HEIGHT-nspire_statusarea,GC_CRO_SET);
int i=nspire_draw_string(x,y+nspire_statusarea,c,bg,Regular9,s,fake);
gui_gc_clipRect(nspire_gc,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,GC_CRO_RESET);
return i;
}
int os_draw_string_medium(int x,int y,int c,int bg,const char * s,bool fake){
get_gc();
gui_gc_clipRect(nspire_gc,0,nspire_statusarea,SCREEN_WIDTH,SCREEN_HEIGHT-nspire_statusarea,GC_CRO_SET);
int i=nspire_draw_string(x,y+nspire_statusarea,c,bg,Regular11,s,fake);
gui_gc_clipRect(nspire_gc,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,GC_CRO_RESET);
return i;
}
void statuslinemsg(const char * msg){
get_gc();
int bg=exam_bg();
gui_gc_setColor(nspire_gc,c_rgb565to888(bg));
gui_gc_fillRect(nspire_gc,0,0,SCREEN_WIDTH,nspire_statusarea);
nspire_draw_string(0,0,0xffff,bg,Regular9,msg,false);
}
void display_time(){
int h,m,s;
get_hms(&h,&m,&s);
char msg[10];
msg[0]=' ';
msg[1]='0'+(h/10);
msg[2]='0'+(h%10);
msg[3]= 'h';
msg[4]= ('0'+(m/10));
msg[5]= ('0'+(m%10));
msg[6]=0;
//msg[6]= 'm';
//msg[7] = ('0'+(s/10));
//msg[8] = ('0'+(s%10));
//msg[9]=0;
int bg=exam_bg();
gui_gc_setColor(nspire_gc,c_rgb565to888(bg));
gui_gc_fillRect(nspire_gc,270,0,SCREEN_WIDTH-270,nspire_statusarea);
nspire_draw_string(270,0,0xffff,bg,Regular9,msg,false);
}
void sync_screen(){
get_gc();
//gui_gc_finish(nspire_gc);
gui_gc_blit_to_screen(nspire_gc);
msleep(10);
//nspire_gc=0;
// gui_gc_begin(nspire_gc);
}
// Nspire peripheral reset :
// https://github.com/nDroidProject/nDroid-bootloader/blob/master/kernel.c
// https://hackspire.org/index.php?title=Memory-mapped_I/O_ports_on_CX#CC000000_-_SHA-256_hash_generator
// hardware ports
// https://hackspire.org/index.php?title=Memory-mapped_I/O_ports_on_CX
bool nspire_shift=false;
bool nspire_ctrl=false;
bool nspire_select=false;
void statusline(int mode){
char *msg=0;
if (nspire_ctrl){
if (nspire_shift)
msg="shift ctrl";
else
msg=" ctrl";
}
else {
if (nspire_shift)
msg="shift";
else
msg="";
}
int bg=exam_bg();
gui_gc_setColor(nspire_gc,c_rgb565to888(bg));
gui_gc_fillRect(nspire_gc,210,0,SCREEN_WIDTH-210,nspire_statusarea);
nspire_draw_string(220,0,0xffff,bg,Regular9,msg,false);
if (nspireemu)
nspire_draw_string(210,0,0xffff,bg,Regular9,"e",false);
display_time();
if (mode==0)
return;
sync_screen();
}