1
1
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
2
- index 97cf24ad5f4a6..ab3f90752b11a 100644
2
+ index 97cf24ad5f4a6..ce12415534d20 100644
3
3
--- a/content/renderer/render_frame_impl.cc
4
4
+++ b/content/renderer/render_frame_impl.cc
5
- @@ -256,6 +256,15 @@
5
+ @@ -256,6 +256,18 @@
6
6
#include "content/renderer/java/gin_java_bridge_dispatcher.h"
7
7
#endif
8
8
9
9
+ // html2svg includes
10
+ + #include <stdlib.h>
10
11
+ #include <iostream>
11
12
+ #include "cc/paint/paint_recorder.h"
12
13
+ #include "cc/paint/skia_paint_canvas.h"
14
+ + #include "third_party/skia/include/core/SkEncodedImageFormat.h"
13
15
+ #include "third_party/skia/include/core/SkStream.h"
16
+ + #include "third_party/skia/include/core/SkSurface.h"
14
17
+ #include "third_party/skia/include/docs/SkPDFDocument.h"
15
18
+ #include "third_party/skia/include/svg/SkSVGCanvas.h"
16
19
+ #include "third_party/skia/include/svg/SkSVGCanvas.h"
17
20
+
18
21
using base::Time;
19
22
using blink::ContextMenuData;
20
23
using blink::WebContentDecryptionModule;
21
- @@ -3822,6 +3831,135 @@ void RenderFrameImpl::DidClearWindowObject() {
24
+ @@ -3822,6 +3834,126 @@ void RenderFrameImpl::DidClearWindowObject() {
22
25
23
26
for (auto& observer : observers_)
24
27
observer.DidClearWindowObject();
25
28
+
26
- + // A Skia stream writing to stdout
27
- + class StdoutStream : public SkWStream {
28
- + public:
29
- + ~StdoutStream() override {
30
- + flush();
31
- +
32
- + delete[] fBytes;
33
- + }
34
- +
35
- + bool write(const void* data, size_t size) override {
36
- + auto* buffer = static_cast<const char*>(data);
37
- + size_t remaining = size;
38
- + size_t bufferSize = 8 * 1024;
39
- +
40
- + while (remaining != 0) {
41
- + ssize_t length = std::min(bufferSize - fBytesBuffered, remaining);
42
- +
43
- + std::memcpy(&fBytes[fBytesBuffered], &buffer[size - remaining], length);
44
- +
45
- + remaining -= length;
46
- + fBytesWritten += length;
47
- + fBytesBuffered += length;
48
- +
49
- + if (fBytesBuffered == bufferSize) {
50
- + flush();
51
- + }
52
- + }
53
- +
54
- + return true;
55
- + }
56
- +
57
- + void flush() override {
58
- + if (::write(1, fBytes, fBytesBuffered) != -1) {
59
- + fBytesBuffered = 0;
60
- + fflush(stdout);
61
- + }
62
- + }
63
- +
64
- + size_t bytesWritten() const override {
65
- + return fBytesWritten;
66
- + }
67
- +
68
- + private:
69
- + char* fBytes = new char[8 * 1024];
70
- + size_t fBytesWritten = 0;
71
- + size_t fBytesBuffered = 0;
72
- + };
73
- +
74
29
+ // Get access to the JS VM for this process (each tab is a process)
75
30
+ v8::Isolate *isolate = blink::MainThreadIsolate();
76
31
+ // Auto-clean v8 handles
@@ -114,11 +69,12 @@ index 97cf24ad5f4a6..ab3f90752b11a 100644
114
69
+ );
115
70
+
116
71
+ // Create a memory stream to save the SVG content
117
- + StdoutStream stream;
72
+ + SkDynamicMemoryWStream stream;
118
73
+ // Get the recording data
119
74
+ auto picture = recorder.finishRecordingAsPicture();
75
+ + auto mode = args[1]->ToUint32(context).ToLocalChecked()->Value();
120
76
+
121
- + switch(args[1]->ToUint32(context).ToLocalChecked()->Value() ) {
77
+ + switch(mode ) {
122
78
+ // SVG
123
79
+ case 0: {
124
80
+ picture->Playback(SkSVGCanvas::Make(rect, &stream).get());
@@ -141,16 +97,54 @@ index 97cf24ad5f4a6..ab3f90752b11a 100644
141
97
+
142
98
+ break;
143
99
+ }
100
+ + default: {
101
+ + auto surface = SkSurface::MakeRasterN32Premul(width, height);
102
+ +
103
+ + picture->Playback(surface->getCanvas());
104
+ +
105
+ + auto img = surface->makeImageSnapshot();
106
+ +
107
+ + assert(img != nullptr);
108
+ +
109
+ + auto result = img->encodeToData(
110
+ + [mode]() -> SkEncodedImageFormat {
111
+ + switch(mode) {
112
+ + case 3:
113
+ + return SkEncodedImageFormat::kJPEG;
114
+ + case 4:
115
+ + return SkEncodedImageFormat::kWEBP;
116
+ + default:
117
+ + return SkEncodedImageFormat::kPNG;
118
+ + }
119
+ + }(),
120
+ + 100
121
+ + );
122
+ +
123
+ + assert(result != nullptr);
124
+ +
125
+ + stream.write(result->data(), result->size());
126
+ +
127
+ + break;
128
+ + }
144
129
+ }
130
+ +
131
+ + auto buffer = v8::ArrayBuffer::New(isolate, stream.bytesWritten());
132
+ +
133
+ + stream.copyTo(buffer->Data());
134
+ + args.GetReturnValue().Set(buffer);
145
135
+ }
146
136
+ );
147
137
+
148
138
+ // Register the function as "getPageContentsAsSVG"
149
139
+ global->Set(
150
- + context,
151
- + v8::String::NewFromUtf8(isolate, "getPageContentsAsSVG").ToLocalChecked(),
152
- + fn->GetFunction(context).ToLocalChecked()
140
+ + context,
141
+ + v8::String::NewFromUtf8(isolate, "getPageContentsAsSVG").ToLocalChecked(),
142
+ + fn->GetFunction(context).ToLocalChecked()
153
143
+ ).Check();
144
+ +
145
+ + if (command_line.HasSwitch("html2svg-svg-mode")) {
146
+ + setenv("html2svg_svg_mode", "true", 1);
147
+ + }
154
148
}
155
149
156
150
void RenderFrameImpl::DidCreateDocumentElement() {
0 commit comments