/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Provides the implementation of the GraphicBuffer interface in // renderer compostior #include "graphic_buffer_impl.h" #include <utils/Errors.h> namespace android { GraphicBufferImpl::GraphicBufferImpl(uint32_t w, uint32_t h) : mBuffer(new android::GraphicBuffer(w, h, PIXEL_FORMAT_RGBA_8888, android::GraphicBuffer::USAGE_HW_TEXTURE | android::GraphicBuffer::USAGE_SW_READ_OFTEN | android::GraphicBuffer::USAGE_SW_WRITE_OFTEN)) { } GraphicBufferImpl::~GraphicBufferImpl() { } // static long GraphicBufferImpl::Create(int w, int h) { GraphicBufferImpl* buffer = new GraphicBufferImpl( static_cast<uint32_t>(w), static_cast<uint32_t>(h)); if (buffer->InitCheck() != NO_ERROR) { delete buffer; return 0; } return reinterpret_cast<intptr_t>(buffer); } // static void GraphicBufferImpl::Release(long buffer_id) { GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); delete buffer; } // static int GraphicBufferImpl::MapStatic(long buffer_id, AwMapMode mode, void** vaddr) { GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); return buffer->Map(mode, vaddr); } // static int GraphicBufferImpl::UnmapStatic(long buffer_id) { GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); return buffer->Unmap(); } // static void* GraphicBufferImpl::GetNativeBufferStatic(long buffer_id) { GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); return buffer->GetNativeBuffer(); } // static uint32_t GraphicBufferImpl::GetStrideStatic(long buffer_id) { GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id); return buffer->GetStride(); } status_t GraphicBufferImpl::Map(AwMapMode mode, void** vaddr) { int usage = 0; switch (mode) { case MAP_READ_ONLY: usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN; break; case MAP_WRITE_ONLY: usage = android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; break; case MAP_READ_WRITE: usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN | android::GraphicBuffer::USAGE_SW_WRITE_OFTEN; break; default: return INVALID_OPERATION; } return mBuffer->lock(usage, vaddr); } status_t GraphicBufferImpl::Unmap() { return mBuffer->unlock(); } status_t GraphicBufferImpl::InitCheck() const { return mBuffer->initCheck(); } void* GraphicBufferImpl::GetNativeBuffer() const { return mBuffer->getNativeBuffer(); } uint32_t GraphicBufferImpl::GetStride() const { static const int kBytesPerPixel = 4; return mBuffer->getStride() * kBytesPerPixel; } } // namespace android