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