1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC.
2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3cb93a386Sopenharmony_ci
4cb93a386Sopenharmony_ci// Proof of principle of a text editor written with Skia & SkShaper.
5cb93a386Sopenharmony_ci// https://bugs.skia.org/9020
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
8cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
9cb93a386Sopenharmony_ci#include "include/core/SkTime.h"
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "tools/sk_app/Application.h"
12cb93a386Sopenharmony_ci#include "tools/sk_app/Window.h"
13cb93a386Sopenharmony_ci#include "tools/skui/ModifierKey.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#include "experimental/sktext/editor/Editor.h"
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ci#include "third_party/icu/SkLoadICU.h"
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ci#include <fstream>
20cb93a386Sopenharmony_ci#include <memory>
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ciusing namespace skia::text;
23cb93a386Sopenharmony_cinamespace skia {
24cb93a386Sopenharmony_cinamespace editor {
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_cistruct EditorApplication : public sk_app::Application {
27cb93a386Sopenharmony_ci    std::unique_ptr<sk_app::Window> fWindow;
28cb93a386Sopenharmony_ci    std::unique_ptr<Editor> fLayer;
29cb93a386Sopenharmony_ci    double fNextTime = -DBL_MAX;
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci    EditorApplication(std::unique_ptr<sk_app::Window> win) : fWindow(std::move(win)) {}
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    bool init(const char* path) {
34cb93a386Sopenharmony_ci        fWindow->attach(sk_app::Window::kRaster_BackendType);
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci        fLayer = Editor::MakeDemo(fWindow->width(), fWindow->height());
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci        fWindow->pushLayer(fLayer.get());
39cb93a386Sopenharmony_ci        fWindow->setTitle("Editor");
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci        fLayer->onResize(fWindow->width(), fWindow->height());
42cb93a386Sopenharmony_ci        fWindow->show();
43cb93a386Sopenharmony_ci        return true;
44cb93a386Sopenharmony_ci    }
45cb93a386Sopenharmony_ci    ~EditorApplication() override { fWindow->detach(); }
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci    void onIdle() override {
48cb93a386Sopenharmony_ci        double now = SkTime::GetNSecs();
49cb93a386Sopenharmony_ci        if (now >= fNextTime) {
50cb93a386Sopenharmony_ci            constexpr double kHalfPeriodNanoSeconds = 0.5 * 1e9;
51cb93a386Sopenharmony_ci            fNextTime = now + kHalfPeriodNanoSeconds;
52cb93a386Sopenharmony_ci            fLayer->blink();
53cb93a386Sopenharmony_ci            fWindow->inval();
54cb93a386Sopenharmony_ci        }
55cb93a386Sopenharmony_ci    }
56cb93a386Sopenharmony_ci};
57cb93a386Sopenharmony_ci} // namespace text
58cb93a386Sopenharmony_ci} // namespace skia
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_cisk_app::Application* sk_app::Application::Create(int argc, char** argv, void* dat) {
61cb93a386Sopenharmony_ci    if (!SkLoadICU()) {
62cb93a386Sopenharmony_ci        SK_ABORT("SkLoadICU failed.");
63cb93a386Sopenharmony_ci    }
64cb93a386Sopenharmony_ci    std::unique_ptr<sk_app::Window> win(sk_app::Window::CreateNativeWindow(dat));
65cb93a386Sopenharmony_ci    if (!win) {
66cb93a386Sopenharmony_ci        SK_ABORT("CreateNativeWindow failed.");
67cb93a386Sopenharmony_ci    }
68cb93a386Sopenharmony_ci    std::unique_ptr<skia::editor::EditorApplication> app(new skia::editor::EditorApplication(std::move(win)));
69cb93a386Sopenharmony_ci    (void)app->init(argc > 1 ? argv[1] : nullptr);
70cb93a386Sopenharmony_ci    return app.release();
71cb93a386Sopenharmony_ci}
72