void SurfaceUtils::showTestFrame(const frame_t *f, int idx) { ANativeWindowBuffer *buf; void *ptr; const Rect rect(LAYER_WIDTH, LAYER_HEIGHT); // set buffer size setBuffersDimensions(LAYER_WIDTH, LAYER_HEIGHT); // set usage software write-able and hardware texture bind-able setUsage(GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_TEXTURE); // set scaling to match window display size setScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); // set transform switch(idx) { case 0: // LOGD("layer no rotation"); break; case 1: // LOGD("layer %d: ROT_90", idx); setBuffersTransform(HAL_TRANSFORM_ROT_90); break; case 2: // LOGD("layer %d: ROT_180", idx); setBuffersTransform(HAL_TRANSFORM_ROT_180); break; default: // LOGD("layer %d: ROT_270", idx); setBuffersTransform(HAL_TRANSFORM_ROT_270); } // get the buffer handle mWindow->dequeueBuffer(mWindow, &buf); // get the buffer addr // LOGD("lock GraphicBuffer: %d", idx_frame); GraphicBufferMapper::getInstance().lock(buf->handle, GRALLOC_USAGE_SW_WRITE_OFTEN, rect, &ptr); /* LOGD("(w,h,s,f)=(%d,%d,%d,%d)", buf->width, buf->height, buf->stride, buf->format); */ // fill buffer //LOGD("load bitmap"); SkBitmap bitmap; ssize_t bpr = buf->stride * BPP; bitmap.setConfig(convertPixelFormat(buf->format), buf->width, buf->height, bpr); SkImageDecoder::DecodeFile(f->name, &bitmap, SkBitmap::kARGB_8888_Config, SkImageDecoder::kDecodePixels_Mode, NULL); int w = bitmap.width(); int h = bitmap.height(); for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { memcpy((uint8_t *)ptr + (j * bpr) + (i * BPP), bitmap.getAddr32(i, j), sizeof(uint32_t)); } } // set transparent/translucent region setAlpha((uint8_t *)ptr, &f->blk[0], buf, false); setAlpha((uint8_t *)ptr, &f->blk[1], buf, true); //LOGD("end fill buffer"); // call unlock after finishing changes against the buffer //LOGD("unlock GraphicBuffer"); GraphicBufferMapper::getInstance().unlock(buf->handle); // transfer the ownership back to the server mWindow->queueBuffer(mWindow, buf); }
int SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) { int transform = va_arg(args, int); return setBuffersTransform(transform); }
int GonkNativeWindowClient::dispatchSetBuffersTransform(va_list args) { int transform = va_arg(args, int); return setBuffersTransform(transform); }