1

I want to access more Elements from one Allocation in RenderScript. Let's take the example code from Google:

uchar4 __attribute__((kernel)) invert(uchar4 in, uint32_t x, uint32_t y) {
  uchar4 out = in;
  out.r = 255 - in.r;
  out.g = 255 - in.g;
  out.b = 255 - in.b;
  return out;
}

It takes one uchar4 in, who is one Element of the Allocation. Is it possible to access and manipolate more than one Element? Like unrolling a loop with, for example, 8 pixels from a Bitmap.

Thank you.

gabrielication
  • 115
  • 1
  • 8

1 Answers1

5

The kernel you wrote just allows to manipulate the current pixel (x,y) based on current pixel data. In order to access neighbour pixels you need to define the in-allocation as a global allocation and then access neighbours by rsGetElementAt_uchar4(). Just for Illustration see below example.

rs_allocation in;

uchar4 __attribute__((kernel)) doCalc(uint32_t x, uint32_t y) {
  uchar4 out;

  uchar4 same= rsGetElementAt_uchar4(in, x,y);
  uchar4 top= rsGetElementAt_uchar4(in, x,y-1);
  uchar4 left= rsGetElementAt_uchar4(in, x-1,y);
  uchar4 right= rsGetElementAt_uchar4(in, x+1,y);
  // (...)

 out.r= // do whatever you want with same.r, top.r, left.r etc
 out.g= // do whatever you want with same.g, top.g, left.g etc
 out.b=...
 out.a=255;

 return out;

}
Settembrini
  • 1,366
  • 3
  • 20
  • 32