Advertisement
Guest User

CUDA bilinear resize

a guest
Jul 28th, 2011
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.61 KB | None | 0 0
  1. __global__ void bilinear_resize(unsigned int *out, int width, float ratio) {
  2.     int x, y;
  3.     int j = blockDim.x * blockIdx.x + threadIdx.x;
  4.     int i = blockDim.y * blockIdx.y + threadIdx.y;
  5.     unsigned int a, b, c, d;
  6.     float x_diff, y_diff, blue, red, green;
  7.  
  8.     // do the bilinear scaling
  9.     x = (int)(ratio * j);
  10.     y = (int)(ratio * i);
  11.     x_diff = (ratio * j) - x;
  12.     y_diff = (ratio * i) - y;
  13.  
  14.     // fetch the 32bit ARGB unsigned ints for the four pixels
  15.     a = tex2D(texRef, x, y);
  16.     b = tex2D(texRef, x+1, y);
  17.     c = tex2D(texRef, x, y+1);
  18.     d = tex2D(texRef, x+1, y+1);
  19.  
  20.     // blue channel
  21.     // Yb = Ab(1-w)(1-h) + Bb(w)(1-h) + Cb(h)(1-w) + Db(wh)
  22.     blue = (MAKE_BLUE_PIXEL(a) * (1.0f-x_diff) * (1.0f-y_diff)) +
  23.            (MAKE_BLUE_PIXEL(b) * (x_diff) * (1.0f-y_diff)) +
  24.            (MAKE_BLUE_PIXEL(c) * (1.0f-x_diff) * (y_diff)) +
  25.            (MAKE_BLUE_PIXEL(d) * (x_diff * y_diff));
  26.  
  27.     // green channel
  28.     // Yg = Ag(1-w)(1-h) + Bg(w)(1-h) + Cg(h)(1-w) + Dg(wh)
  29.     green = (MAKE_GREEN_PIXEL(a) * (1.0f-x_diff) * (1.0f-y_diff)) +
  30.             (MAKE_GREEN_PIXEL(b) * (x_diff) * (1.0f-y_diff)) +
  31.             (MAKE_GREEN_PIXEL(c) * (1.0f-x_diff) * (y_diff)) +
  32.             (MAKE_GREEN_PIXEL(d) * (x_diff * y_diff));
  33.  
  34.     // red channel
  35.     // Yr = Ar(1-w)(1-h) + Br(w)(1-h) + Cr(h)(1-w) + Dr(wh)
  36.     red = (MAKE_RED_PIXEL(a) * (1.0f-x_diff) * (1.0f-y_diff)) +
  37.           (MAKE_RED_PIXEL(b) * (x_diff) * (1.0f-y_diff)) +
  38.           (MAKE_RED_PIXEL(c) * (1.0f-x_diff) * (y_diff)) +
  39.           (MAKE_RED_PIXEL(d) * (x_diff * y_diff));
  40.  
  41.     out[i*width + j] = MAKE_ARGB(
  42.         CLAMP(__float2uint_rn(red), 0, 255),
  43.         CLAMP(__float2uint_rn(green), 0, 255),
  44.         CLAMP(__float2uint_rn(blue), 0, 255));
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement