-
Notifications
You must be signed in to change notification settings - Fork 491
/
Copy pathRNSkDomView.h
104 lines (79 loc) · 2.63 KB
/
RNSkDomView.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once
#include <functional>
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include <vector>
#include <jsi/jsi.h>
#include "JsiValueWrapper.h"
#include "RNSkView.h"
#include "JsiDomRenderNode.h"
#include "RNSkLog.h"
#include "RNSkPlatformContext.h"
#include "RNSkTimingInfo.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#include "include/core/SkBBHFactory.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkFont.h"
#pragma clang diagnostic pop
class SkPicture;
class SkRect;
class SkImage;
namespace RNSkia {
class JsiSkCanvas;
namespace jsi = facebook::jsi;
class RNSkDomRenderer : public RNSkRenderer,
public std::enable_shared_from_this<RNSkDomRenderer> {
public:
RNSkDomRenderer(std::function<void()> requestRedraw,
std::shared_ptr<RNSkPlatformContext> context);
~RNSkDomRenderer();
bool tryRender(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override;
void
renderImmediate(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override;
void setRoot(std::shared_ptr<JsiDomRenderNode> node);
private:
void renderCanvas(SkCanvas *canvas, float scaledWidth, float scaledHeight);
void renderDebugOverlays(SkCanvas *canvas);
std::shared_ptr<RNSkPlatformContext> _platformContext;
std::shared_ptr<std::timed_mutex> _renderLock;
std::shared_ptr<JsiDomRenderNode> _root;
std::shared_ptr<DrawingContext> _drawingContext;
RNSkTimingInfo _renderTimingInfo;
std::mutex _rootLock;
SkFont _font;
};
class RNSkDomView : public RNSkView {
public:
/**
* Constructor
*/
RNSkDomView(std::shared_ptr<RNSkPlatformContext> context,
std::shared_ptr<RNSkCanvasProvider> canvasProvider)
: RNSkView(context, canvasProvider,
std::make_shared<RNSkDomRenderer>(
std::bind(&RNSkView::requestRedraw, this), context)) {}
void setJsiProperties(
std::unordered_map<std::string, JsiValueWrapper> &props) override {
RNSkView::setJsiProperties(props);
for (auto &prop : props) {
if (prop.first == "root") {
// Save root
if (prop.second.isUndefined() || prop.second.isNull()) {
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
->setRoot(nullptr);
} else {
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
->setRoot(std::dynamic_pointer_cast<JsiDomRenderNode>(
prop.second.getAsHostObject()));
}
// Request redraw
requestRedraw();
}
}
}
};
} // namespace RNSkia