Page 1 of 1
ndless get_pixel

Posted:
31 May 2020, 08:04
by parisse
Is it possible to get the color of a pixel using ndless? I can only see writing functions in ngc.h
Re: ndless get_pixel

Posted:
31 May 2020, 10:25
by Ti64CLi++
You could try to get it by accessing the LCD address
Re: ndless get_pixel

Posted:
31 May 2020, 11:07
by critor
Each pixel is encoded on 2 bytes in RGB-565.
Re: ndless get_pixel

Posted:
31 May 2020, 12:13
by Noury
TI64CLI++ and critor are right.
But be careful, the pixel address depends on the Nspire model. There are two LCD layouts.
Re: ndless get_pixel

Posted:
31 May 2020, 18:52
by parisse
I tried
- Code: Select all
int os_get_pixel(int x,int y){
unsigned short * addr=(unsigned short *) 0xC0000010;
int r=addr[y*SCREEN_WIDTH+x];
return r;
}
But that does not work (tried on a nspire cx). I filled a rectangle (0,0,100,100) with red, then get_pixel(2,30) does not return the same value as get_pixel(2,31), 27113 then 0.
Re: ndless get_pixel

Posted:
31 May 2020, 19:25
by Noury
Last time I've written to LCD (using assembly language), I have used:
@pixel=0xC0000010 + ((num col * 480) + (num lig * 2))
0xC0000010 is Frame Base Address
It was with a CX CAS
I think older Nspire have an LCD rotated (90°). Not sure which way.
Re: ndless get_pixel

Posted:
31 May 2020, 19:47
by parisse
Perhaps reading in the LCD does not work. But I found another way, inspired by ngc.c of the SDK, using the offscreen buffer, like this
- 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;
}
int os_get_pixel(int x,int y){
if (x<0 || x>=SCREEN_WIDTH || y<0 || y>=SCREEN_HEIGHT)
return -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;
}
Re: ndless get_pixel

Posted:
31 May 2020, 21:21
by Vogtinator
parisse wrote:I tried
- Code: Select all
int os_get_pixel(int x,int y){
unsigned short * addr=(unsigned short *) 0xC0000010;
int r=addr[y*SCREEN_WIDTH+x];
return r;
}
But that does not work (tried on a nspire cx). I filled a rectangle (0,0,100,100) with red, then get_pixel(2,30) does not return the same value as get_pixel(2,31), 27113 then 0.
You forgot one level of indirection. 0xC0000010 has a pointer to the framebuffer, so it has to be
- Code: Select all
int os_get_pixel(int x,int y){
unsigned short * addr=*(unsigned short **) 0xC0000010;
int r=addr[y*SCREEN_WIDTH+x];
return r;
}
Though I wonder what this is for.
Re: ndless get_pixel

Posted:
01 Jun 2020, 14:30
by parisse
I see, thanks. I will keep the gc code since it works...