1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef AndroidKit_Surface_DEFINED
9cb93a386Sopenharmony_ci#define AndroidKit_Surface_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
12cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_ci#include <jni.h>
15cb93a386Sopenharmony_ci#include <android/native_window_jni.h>
16cb93a386Sopenharmony_ci#include <android/native_window.h>
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci#include "tools/sk_app/WindowContext.h"
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ci#include "include/core/SkImage.h"
21cb93a386Sopenharmony_ci#include "include/core/SkPictureRecorder.h"
22cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
23cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
24cb93a386Sopenharmony_ci#include "include/core/SkTypes.h"
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_ciclass SurfaceThread;
27cb93a386Sopenharmony_ci#include "modules/androidkit/src/SurfaceThread.h"
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciclass Surface : public SkRefCnt {
30cb93a386Sopenharmony_cipublic:
31cb93a386Sopenharmony_ci    virtual void release(JNIEnv*) = 0;
32cb93a386Sopenharmony_ci    virtual void flushAndSubmit() = 0;
33cb93a386Sopenharmony_ci    virtual SkCanvas* getCanvas() = 0;
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci    int width()  const { return fSurface ? fSurface->width()  : 0; }
36cb93a386Sopenharmony_ci    int height() const { return fSurface ? fSurface->height() : 0; }
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    sk_sp<SkImage> makeImageSnapshot() const {
39cb93a386Sopenharmony_ci        return fSurface ? fSurface->makeImageSnapshot() : nullptr;
40cb93a386Sopenharmony_ci    }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ciprotected:
43cb93a386Sopenharmony_ci    sk_sp<SkSurface> fSurface;
44cb93a386Sopenharmony_ci};
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ciclass WindowSurface final : public Surface {
47cb93a386Sopenharmony_cipublic:
48cb93a386Sopenharmony_ci    WindowSurface(ANativeWindow* win, std::unique_ptr<sk_app::WindowContext> wctx);
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ciprivate:
51cb93a386Sopenharmony_ci    void release(JNIEnv* env) override;
52cb93a386Sopenharmony_ci    SkCanvas* getCanvas() override;
53cb93a386Sopenharmony_ci    void flushAndSubmit() override;
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    ANativeWindow*                         fWindow;
56cb93a386Sopenharmony_ci    std::unique_ptr<sk_app::WindowContext> fWindowContext;
57cb93a386Sopenharmony_ci};
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ciclass ThreadedSurface final : public Surface {
60cb93a386Sopenharmony_cipublic:
61cb93a386Sopenharmony_ci    ThreadedSurface(JNIEnv* env, jobject surface);
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ciprivate:
64cb93a386Sopenharmony_ci    void release(JNIEnv* env) override;
65cb93a386Sopenharmony_ci    SkCanvas* getCanvas() override;
66cb93a386Sopenharmony_ci    void flushAndSubmit() override;
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci    WindowSurface* fWindowSurface = nullptr;
69cb93a386Sopenharmony_ci    SkPictureRecorder fRecorder;
70cb93a386Sopenharmony_ci    std::unique_ptr<SurfaceThread> fThread;
71cb93a386Sopenharmony_ci    int fWidth;
72cb93a386Sopenharmony_ci    int fHeight;
73cb93a386Sopenharmony_ci};
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci#endif
76