Home | History | Annotate | Download | only in android
      1 
      2 /*
      3  * Copyright 2016 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #include "WindowContextFactory_android.h"
     10 #include "../RasterWindowContext.h"
     11 #include "SkSurface.h"
     12 #include "SkTypes.h"
     13 
     14 using sk_app::RasterWindowContext;
     15 using sk_app::DisplayParams;
     16 
     17 namespace {
     18 class RasterWindowContext_android : public RasterWindowContext {
     19 public:
     20     RasterWindowContext_android(ANativeWindow*, const DisplayParams& params);
     21 
     22     sk_sp<SkSurface> getBackbufferSurface() override;
     23     void swapBuffers() override;
     24 
     25     bool isValid() override { return SkToBool(fNativeWindow); }
     26     void resize(int w, int h) override;
     27     void setDisplayParams(const DisplayParams& params) override;
     28 
     29 private:
     30     void setBuffersGeometry();
     31     sk_sp<SkSurface> fBackbufferSurface = nullptr;
     32     ANativeWindow* fNativeWindow = nullptr;
     33     ANativeWindow_Buffer fBuffer;
     34     ARect fBounds;
     35 
     36     typedef RasterWindowContext INHERITED;
     37 };
     38 
     39 RasterWindowContext_android::RasterWindowContext_android(ANativeWindow* window,
     40                                                          const DisplayParams& params)
     41     : INHERITED(params) {
     42     fNativeWindow = window;
     43     fWidth = ANativeWindow_getWidth(fNativeWindow);
     44     fHeight = ANativeWindow_getHeight(fNativeWindow);
     45     this->setBuffersGeometry();
     46 }
     47 
     48 void RasterWindowContext_android::setBuffersGeometry() {
     49     int32_t format = 0;
     50     switch(fDisplayParams.fColorType) {
     51         case kRGBA_8888_SkColorType:
     52             format = WINDOW_FORMAT_RGBA_8888;
     53             break;
     54         case kRGB_565_SkColorType:
     55             format = WINDOW_FORMAT_RGB_565;
     56             break;
     57         default:
     58             SK_ABORT("Unsupported Android color type");
     59     }
     60     ANativeWindow_setBuffersGeometry(fNativeWindow, fWidth, fHeight, format);
     61 }
     62 
     63 void RasterWindowContext_android::setDisplayParams(const DisplayParams& params) {
     64     fDisplayParams = params;
     65     this->setBuffersGeometry();
     66 }
     67 
     68 void RasterWindowContext_android::resize(int w, int h) {
     69     fWidth = w;
     70     fHeight = h;
     71     this->setBuffersGeometry();
     72 }
     73 
     74 sk_sp<SkSurface> RasterWindowContext_android::getBackbufferSurface() {
     75     if (nullptr == fBackbufferSurface) {
     76         ANativeWindow_lock(fNativeWindow, &fBuffer, &fBounds);
     77         const int bytePerPixel = fBuffer.format == WINDOW_FORMAT_RGB_565 ? 2 : 4;
     78         SkImageInfo info = SkImageInfo::Make(fWidth, fHeight,
     79                                              fDisplayParams.fColorType,
     80                                              kPremul_SkAlphaType,
     81                                              fDisplayParams.fColorSpace);
     82         fBackbufferSurface = SkSurface::MakeRasterDirect(
     83                 info, fBuffer.bits, fBuffer.stride * bytePerPixel, nullptr);
     84     }
     85     return fBackbufferSurface;
     86 }
     87 
     88 
     89 void RasterWindowContext_android::swapBuffers() {
     90     ANativeWindow_unlockAndPost(fNativeWindow);
     91     fBackbufferSurface.reset(nullptr);
     92 }
     93 }  // anonymous namespace
     94 
     95 namespace sk_app {
     96 namespace window_context_factory {
     97 
     98 WindowContext* NewRasterForAndroid(ANativeWindow* window, const DisplayParams& params) {
     99     WindowContext* ctx = new RasterWindowContext_android(window, params);
    100     if (!ctx->isValid()) {
    101         delete ctx;
    102         return nullptr;
    103     }
    104     return ctx;
    105 }
    106 
    107 }
    108 }   // namespace sk_app
    109