1cb93a386Sopenharmony_ci// Copyright 2021 Google LLC.
2cb93a386Sopenharmony_ci#ifndef Cursor_DEFINED
3cb93a386Sopenharmony_ci#define Cursor_DEFINED
4cb93a386Sopenharmony_ci#include <sstream>
5cb93a386Sopenharmony_ci#include "experimental/sktext/editor/Defaults.h"
6cb93a386Sopenharmony_ci#include "experimental/sktext/include/Text.h"
7cb93a386Sopenharmony_ci#include "experimental/sktext/include/Types.h"
8cb93a386Sopenharmony_ci#include "experimental/sktext/src/Paint.h"
9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
10cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
11cb93a386Sopenharmony_ci#include "include/core/SkTime.h"
12cb93a386Sopenharmony_ci#include "tools/sk_app/Application.h"
13cb93a386Sopenharmony_ci#include "tools/sk_app/Window.h"
14cb93a386Sopenharmony_ci#include "tools/skui/ModifierKey.h"
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cinamespace skia {
17cb93a386Sopenharmony_cinamespace editor {
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ciusing namespace skia::text;
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ciclass Cursor {
22cb93a386Sopenharmony_cipublic:
23cb93a386Sopenharmony_ci    static std::unique_ptr<Cursor> Make();
24cb93a386Sopenharmony_ci    Cursor();
25cb93a386Sopenharmony_ci    virtual ~Cursor() = default;
26cb93a386Sopenharmony_ci    void place(SkPoint xy, SkSize size) {
27cb93a386Sopenharmony_ci        if (size.width() < DEFAULT_CURSOR_WIDTH) {
28cb93a386Sopenharmony_ci            size.fWidth = DEFAULT_CURSOR_WIDTH;
29cb93a386Sopenharmony_ci        }
30cb93a386Sopenharmony_ci        fXY = xy;
31cb93a386Sopenharmony_ci        fSize = size;
32cb93a386Sopenharmony_ci    }
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci    void place(SkRect rect) {
35cb93a386Sopenharmony_ci        if (rect.width() < DEFAULT_CURSOR_WIDTH) {
36cb93a386Sopenharmony_ci            rect.fRight = rect.fLeft + DEFAULT_CURSOR_WIDTH;
37cb93a386Sopenharmony_ci        }
38cb93a386Sopenharmony_ci        fXY = SkPoint::Make(rect.fLeft, rect.fTop);
39cb93a386Sopenharmony_ci        fSize = SkSize::Make(rect.width(), rect.height());
40cb93a386Sopenharmony_ci    }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci    void blink() {
43cb93a386Sopenharmony_ci        fBlink = !fBlink;
44cb93a386Sopenharmony_ci    }
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    SkPoint getPosition() const { return fXY; }
47cb93a386Sopenharmony_ci    SkPoint getCenterPosition() const {
48cb93a386Sopenharmony_ci        return fXY + SkPoint::Make(0, fSize.fHeight / 2);
49cb93a386Sopenharmony_ci    }
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci    void paint(SkCanvas* canvas);
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ciprivate:
54cb93a386Sopenharmony_ci    SkPaint fLinePaint;
55cb93a386Sopenharmony_ci    SkPaint fRectPaint;
56cb93a386Sopenharmony_ci    SkPoint fXY;
57cb93a386Sopenharmony_ci    SkSize fSize;
58cb93a386Sopenharmony_ci    bool fBlink;
59cb93a386Sopenharmony_ci};
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci} // namespace editor
62cb93a386Sopenharmony_ci} // namespace skia
63cb93a386Sopenharmony_ci#endif // Cursor_DEFINED
64