Page 1 sur 1

ndless get_pixel

Message non luPosté: 31 Mai 2020, 08:04
de 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

Message non luPosté: 31 Mai 2020, 10:25
de Ti64CLi++
You could try to get it by accessing the LCD address

Re: ndless get_pixel

Message non luPosté: 31 Mai 2020, 11:07
de critor
Each pixel is encoded on 2 bytes in RGB-565.

Re: ndless get_pixel

Message non luPosté: 31 Mai 2020, 12:13
de 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

Message non luPosté: 31 Mai 2020, 18:52
de parisse
I tried
Code: Tout sélectionner
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

Message non luPosté: 31 Mai 2020, 19:25
de 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

Message non luPosté: 31 Mai 2020, 19:47
de 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: Tout sélectionner
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

Message non luPosté: 31 Mai 2020, 21:21
de Vogtinator
parisse a écrit:I tried
Code: Tout sélectionner
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: Tout sélectionner
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

Message non luPosté: 01 Juin 2020, 14:30
de parisse
I see, thanks. I will keep the gc code since it works...