Пример #1
0
int SurfaceTextureClient::dispatchSetScalingMode(va_list args) {
    int m = va_arg(args, int);
    return setScalingMode(m);
}
int GonkNativeWindowClient::dispatchSetScalingMode(va_list args) {
    int m = va_arg(args, int);
    return setScalingMode(m);
}
Пример #3
0
    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);
    }
status_t BnSurfaceTexture::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case REQUEST_BUFFER: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int bufferIdx   = data.readInt32();
            sp<GraphicBuffer> buffer;
            int result = requestBuffer(bufferIdx, &buffer);
            reply->writeInt32(buffer != 0);
            if (buffer != 0) {
                reply->write(*buffer);
            }
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case SET_BUFFER_COUNT: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int bufferCount = data.readInt32();
            int result = setBufferCount(bufferCount);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case DEQUEUE_BUFFER: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            uint32_t w      = data.readInt32();
            uint32_t h      = data.readInt32();
            uint32_t format = data.readInt32();
            uint32_t usage  = data.readInt32();
            int buf;
            int result = dequeueBuffer(&buf, w, h, format, usage);
            reply->writeInt32(buf);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case QUEUE_BUFFER: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int buf = data.readInt32();
            int64_t timestamp = data.readInt64();
            uint32_t outWidth, outHeight, outTransform;
            status_t result = queueBuffer(buf, timestamp,
                    &outWidth, &outHeight, &outTransform);
            reply->writeInt32(outWidth);
            reply->writeInt32(outHeight);
            reply->writeInt32(outTransform);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case CANCEL_BUFFER: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int buf = data.readInt32();
            cancelBuffer(buf);
            return NO_ERROR;
        } break;
        case SET_CROP: {
            Rect reg;
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            reg.left = data.readFloat();
            reg.top = data.readFloat();
            reg.right = data.readFloat();
            reg.bottom = data.readFloat();
            status_t result = setCrop(reg);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case SET_TRANSFORM: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            uint32_t transform = data.readInt32();
            status_t result = setTransform(transform);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case SET_SCALING_MODE: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int mode = data.readInt32();
            status_t result = setScalingMode(mode);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case QUERY: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int value;
            int what = data.readInt32();
            int res = query(what, &value);
            reply->writeInt32(value);
            reply->writeInt32(res);
            return NO_ERROR;
        } break;
        case SET_SYNCHRONOUS_MODE: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            bool enabled = data.readInt32();
            status_t res = setSynchronousMode(enabled);
            reply->writeInt32(res);
            return NO_ERROR;
        } break;
        case CONNECT: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int api = data.readInt32();
            uint32_t outWidth, outHeight, outTransform;
            status_t res = connect(api,
                    &outWidth, &outHeight, &outTransform);
            reply->writeInt32(outWidth);
            reply->writeInt32(outHeight);
            reply->writeInt32(outTransform);
            reply->writeInt32(res);
            return NO_ERROR;
        } break;
        case DISCONNECT: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int api = data.readInt32();
            status_t res = disconnect(api);
            reply->writeInt32(res);
            return NO_ERROR;
        } break;

        // [MTK] for S3D offset control
        //--------------------------------------------------------------
        case SET_S3DOFFSET: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int32_t offset = data.readInt32();
            status_t result = setS3DOffset(offset);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
    }
    return BBinder::onTransact(code, data, reply, flags);
}