/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "RasterWindowContext_android.h" #include "SkSurface.h" #include "SkTypes.h" #include "Window_android.h" namespace sk_app { RasterWindowContext* RasterWindowContext::Create(void* platformData, const DisplayParams& params) { RasterWindowContext* ctx = new RasterWindowContext_android(platformData, params); if (!ctx->isValid()) { delete ctx; ctx = nullptr; } return ctx; } RasterWindowContext_android::RasterWindowContext_android( void* platformData, const DisplayParams& params) { fDisplayParams = params; ContextPlatformData_android* androidPlatformData = reinterpret_cast(platformData); fNativeWindow = androidPlatformData->fNativeWindow; fWidth = ANativeWindow_getWidth(fNativeWindow); fHeight = ANativeWindow_getHeight(fNativeWindow); this->setBuffersGeometry(); } void RasterWindowContext_android::setBuffersGeometry() { int32_t format = 0; switch(fDisplayParams.fColorType) { case kRGBA_8888_SkColorType: format = WINDOW_FORMAT_RGBA_8888; break; case kRGB_565_SkColorType: format = WINDOW_FORMAT_RGB_565; break; default: SK_ABORT("Unsupported Android color type"); } ANativeWindow_setBuffersGeometry(fNativeWindow, fWidth, fHeight, format); } void RasterWindowContext_android::setDisplayParams(const DisplayParams& params) { fDisplayParams = params; this->setBuffersGeometry(); } void RasterWindowContext_android::resize(uint32_t w, uint32_t h) { fWidth = w; fHeight = h; this->setBuffersGeometry(); } sk_sp RasterWindowContext_android::getBackbufferSurface() { if (nullptr == fBackbufferSurface) { ANativeWindow_lock(fNativeWindow, &fBuffer, &fBounds); const int bytePerPixel = fBuffer.format == WINDOW_FORMAT_RGB_565 ? 2 : 4; SkImageInfo info = SkImageInfo::Make(fWidth, fHeight, fDisplayParams.fColorType, kOpaque_SkAlphaType, fDisplayParams.fProfileType); fBackbufferSurface = SkSurface::MakeRasterDirect( info, fBuffer.bits, fBuffer.stride * bytePerPixel, nullptr); } return fBackbufferSurface; } void RasterWindowContext_android::swapBuffers() { ANativeWindow_unlockAndPost(fNativeWindow); fBackbufferSurface.reset(nullptr); } } // namespace sk_app