Mercurial
annotate infinite_canvas/web_surface_web.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | 8d560f50ed4c |
| children | 49e9e591c9bb |
| rev | line source |
|---|---|
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 #include "infinite_canvas/web_surface.h" |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 #include <emscripten/emscripten.h> |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 #include <string.h> |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 EM_JS(void, Canvas_Web_Begin_Frame, (), { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 document.querySelectorAll("[data-canvas-web-surface]").forEach((surface) => { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 surface.dataset.canvasActive = "false"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 EM_JS(void, Canvas_Web_Create_Or_Update, ( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 uint32 entity_id, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 const char *p_url, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 float x, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 float y, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 float width, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
18 float height, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
19 float opacity, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
20 int dark_mode), { |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 const canvas = Module.canvas; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 const surfaceId = `canvas-web-surface-${entity_id}`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 let surface = document.getElementById(surfaceId); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 if (!surface) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 surface = document.createElement("div"); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 surface.id = surfaceId; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 surface.dataset.canvasWebSurface = "true"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 surface.style.position = "fixed"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 surface.style.zIndex = "4"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 surface.style.overflow = "hidden"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 surface.style.borderRadius = "8px"; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
32 surface.style.background = dark_mode ? "#0f0f11" : "#fff"; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 const frame = document.createElement("iframe"); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 frame.title = `Canvas web content ${entity_id}`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 frame.referrerPolicy = "strict-origin-when-cross-origin"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 frame.sandbox = "allow-downloads allow-forms allow-modals allow-popups allow-same-origin allow-scripts"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 frame.style.width = "100%"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 frame.style.height = "100%"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 frame.style.border = "0"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 frame.style.display = "block"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 surface.appendChild(frame); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 document.body.appendChild(surface); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 surface.dataset.canvasActive = "true"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 const frame = surface.firstElementChild; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
48 const colorScheme = dark_mode ? "dark" : "light"; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
49 surface.style.colorScheme = colorScheme; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
50 surface.style.background = dark_mode ? "#0f0f11" : "#fff"; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
51 frame.style.colorScheme = colorScheme; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 const url = UTF8ToString(p_url); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 if (frame.dataset.url !== url) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 frame.dataset.url = url; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 frame.src = url; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 const canvasBounds = canvas.getBoundingClientRect(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 const scaleX = canvasBounds.width / Math.max(1, canvas.width); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 const scaleY = canvasBounds.height / Math.max(1, canvas.height); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 surface.style.left = `${canvasBounds.left + x * scaleX}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 surface.style.top = `${canvasBounds.top + y * scaleY}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 surface.style.width = `${Math.max(1, width * scaleX)}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 surface.style.height = `${Math.max(1, height * scaleY)}px`; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
65 surface.style.opacity = `${opacity}`; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
66 surface.style.pointerEvents = opacity >= 0.99 ? "auto" : "none"; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
67 }); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
68 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
69 EM_JS(void, Canvas_Web_History_Go, (uint32 entity_id, int direction), { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
70 const surface = document.getElementById( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
71 `canvas-web-surface-${entity_id}`); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
72 const frame = surface && surface.firstElementChild; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
73 if (!frame || !frame.contentWindow) return; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
74 try { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
75 frame.contentWindow.history.go(direction); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
76 } catch (error) { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
77 console.warn("Canvas iframe history navigation is unavailable", error); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
78 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
79 }); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
80 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
81 EM_JS(int, Canvas_Web_Has_Surface, (uint32 entity_id), { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
82 return document.getElementById( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
83 `canvas-web-surface-${entity_id}`) ? 1 : 0; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 EM_JS(void, Canvas_Image_Create_Or_Update, ( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 uint32 entity_id, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 const char *p_source, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 float x, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 float y, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 float width, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
92 float height, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
93 float opacity), { |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 const canvas = Module.canvas; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 const surfaceId = `canvas-web-surface-${entity_id}`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 let surface = document.getElementById(surfaceId); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 if (!surface) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 surface = document.createElement("div"); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 surface.id = surfaceId; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 surface.dataset.canvasWebSurface = "true"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 surface.style.position = "fixed"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 surface.style.zIndex = "4"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 surface.style.overflow = "hidden"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 surface.style.borderRadius = "8px"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 surface.style.pointerEvents = "none"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 const image = document.createElement("img"); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 image.alt = "Canvas image"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 image.style.width = "100%"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 image.style.height = "100%"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 image.style.objectFit = "contain"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 image.style.display = "block"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 surface.appendChild(image); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 document.body.appendChild(surface); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 surface.dataset.canvasActive = "true"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 const image = surface.firstElementChild; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 const source = UTF8ToString(p_source); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 if (image.dataset.url !== source) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 if (image.dataset.blobUrl) URL.revokeObjectURL(image.dataset.blobUrl); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 image.dataset.url = source; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 delete image.dataset.blobUrl; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 if (/^(https?:|data:|blob:)/i.test(source)) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 image.src = source; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 } else { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 try { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 const bytes = FS.readFile(source); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 const extension = source.split(".").pop().toLowerCase(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 const mime = extension === "svg" ? "image/svg+xml" : |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 extension === "png" ? "image/png" : |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 extension === "webp" ? "image/webp" : |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 extension === "gif" ? "image/gif" : "image/jpeg"; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 const blobUrl = URL.createObjectURL(new Blob([bytes], {type: mime})); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 image.dataset.blobUrl = blobUrl; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 image.src = blobUrl; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 } catch (error) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 image.src = source; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 const canvasBounds = canvas.getBoundingClientRect(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 const scaleX = canvasBounds.width / Math.max(1, canvas.width); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 const scaleY = canvasBounds.height / Math.max(1, canvas.height); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 surface.style.left = `${canvasBounds.left + x * scaleX}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 surface.style.top = `${canvasBounds.top + y * scaleY}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 surface.style.width = `${Math.max(1, width * scaleX)}px`; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 surface.style.height = `${Math.max(1, height * scaleY)}px`; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
150 surface.style.opacity = `${opacity}`; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
153 EM_JS(void, Canvas_Web_End_Frame, (), { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 document.querySelectorAll("[data-canvas-web-surface]").forEach((surface) => { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 if (surface.dataset.canvasActive !== "true") { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 const content = surface.firstElementChild; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 if (content && content.dataset.blobUrl) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 URL.revokeObjectURL(content.dataset.blobUrl); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 surface.remove(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 EM_JS(void, Canvas_Web_Destroy, (), { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 document.querySelectorAll("[data-canvas-web-surface]").forEach((surface) => { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 const content = surface.firstElementChild; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 if (content && content.dataset.blobUrl) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
169 URL.revokeObjectURL(content.dataset.blobUrl); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 surface.remove(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 static Rectangle Canvas_Web_Content_Bounds( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 const Canvas_Camera *p_camera, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
177 const Canvas_Scene *p_scene, |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 const Canvas_Entity *p_entity) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 { |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
180 (void)p_scene; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 float frame_inset = CANVAS_WEB_FRAME_INSET / p_camera->zoom; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
182 float amount = p_entity->web_chrome_amount; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
183 if (amount < 0.0f) amount = 0.0f; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
184 if (amount > 1.0f) amount = 1.0f; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
185 float eased = amount * amount * (3.0f - 2.0f * amount); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
186 float toolbar_height = |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
187 CANVAS_WEB_TOOLBAR_HEIGHT * eased / p_camera->zoom; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 float resize_handle = CANVAS_WEB_RESIZE_HANDLE / p_camera->zoom; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 Vector2 position = Canvas_Camera_World_To_Screen( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
190 p_camera, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 (Vector2){ |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 p_entity->position.x + frame_inset, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
193 p_entity->position.y + frame_inset + toolbar_height, |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 }); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 return (Rectangle){ |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 position.x, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 position.y, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 (p_entity->size.x - frame_inset - resize_handle) * p_camera->zoom, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
199 (p_entity->size.y - frame_inset - resize_handle - toolbar_height) * |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
200 p_camera->zoom, |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 }; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 static boolean Canvas_Web_Is_Visible( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
205 const Canvas_Camera *p_camera, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 Rectangle bounds) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 return p_camera->zoom >= 0.30f && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 bounds.x + bounds.width > 0.0f && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
210 bounds.y + bounds.height > 0.0f && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 bounds.x < (float)p_camera->viewport_width && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
212 bounds.y < (float)p_camera->viewport_height; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
214 |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
215 static float Canvas_Web_Entity_Opacity(const Canvas_Entity *p_entity) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
216 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
217 float amount = p_entity->visibility_amount; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
218 if (amount < 0.0f) amount = 0.0f; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
219 if (amount > 1.0f) amount = 1.0f; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
220 return amount * amount * (3.0f - 2.0f * amount); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
221 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
222 |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 int32 Canvas_Web_Surface_Execute_Subprocess(int argc, char **p_argv) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
225 (void)argc; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 (void)p_argv; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
227 return -1; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
228 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
230 boolean Canvas_Web_Surface_Init( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 Canvas_Web_Surface *p_surface, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
232 Dowa_Arena *p_arena, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
233 boolean dark_mode) |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 memset(p_surface, 0, sizeof(*p_surface)); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 p_surface->p_arena = p_arena; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
237 p_surface->dark_mode = dark_mode; |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
238 p_surface->initialized = TRUE; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
239 return TRUE; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
240 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
241 |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
242 void Canvas_Web_Surface_Set_Dark_Mode( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
243 Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
244 boolean dark_mode) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
245 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
246 p_surface->dark_mode = dark_mode; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
247 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
248 |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 boolean Canvas_Web_Surface_Update_Input( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 Canvas_Web_Surface *p_surface, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 const Canvas_Camera *p_camera, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 const Canvas_Scene *p_scene) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 (void)p_surface; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 (void)p_camera; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 (void)p_scene; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 return FALSE; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 void Canvas_Web_Surface_Sync( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 Canvas_Web_Surface *p_surface, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 const Canvas_Camera *p_camera, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 const Canvas_Scene *p_scene) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 if (!p_surface->initialized) return; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
267 Canvas_Web_Begin_Frame(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
268 uint32 visible_views = 0; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
269 for (size_t index = 0; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 index < Dowa_Array_Length(p_scene->p_entities) && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 visible_views < CANVAS_MAX_WEB_VIEWS; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 index++) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
273 const Canvas_Entity *p_entity = &p_scene->p_entities[index]; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 if (p_entity->type != CANVAS_ENTITY_WEB_CONTENT && |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 p_entity->type != CANVAS_ENTITY_IMAGE) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 continue; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 } |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
278 Rectangle bounds = Canvas_Web_Content_Bounds( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
279 p_camera, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
280 p_scene, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
281 p_entity); |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 if (!Canvas_Web_Is_Visible(p_camera, bounds)) continue; |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
283 float opacity = Canvas_Web_Entity_Opacity(p_entity); |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 if (p_entity->type == CANVAS_ENTITY_IMAGE) { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 Canvas_Image_Create_Or_Update( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 p_entity->id, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 p_entity->text, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 bounds.x, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 bounds.y, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 bounds.width, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
291 bounds.height, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
292 opacity); |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 } else { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 Canvas_Web_Create_Or_Update( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 p_entity->id, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 p_entity->text, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 bounds.x, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 bounds.y, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 bounds.width, |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
300 bounds.height, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
301 opacity, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
302 p_surface->dark_mode ? 1 : 0); |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 visible_views++; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 Canvas_Web_End_Frame(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 void Canvas_Web_Surface_Draw( |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 const Canvas_Web_Surface *p_surface, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 const Canvas_Camera *p_camera, |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 const Canvas_Scene *p_scene) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 (void)p_surface; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 (void)p_camera; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 (void)p_scene; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 |
|
278
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
319 void Canvas_Web_Surface_Draw_Entity( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
320 const Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
321 const Canvas_Camera *p_camera, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
322 const Canvas_Scene *p_scene, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
323 size_t entity_index) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
324 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
325 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
326 (void)p_camera; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
327 (void)p_scene; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
328 (void)entity_index; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
329 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
330 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
331 const char *Canvas_Web_Surface_URL( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
332 const Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
333 uint32 entity_id) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
334 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
335 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
336 (void)entity_id; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
337 return NULL; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
338 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
339 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
340 boolean Canvas_Web_Surface_Can_Go_Back( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
341 const Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
342 uint32 entity_id) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
343 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
344 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
345 return Canvas_Web_Has_Surface(entity_id) ? TRUE : FALSE; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
346 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
347 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
348 boolean Canvas_Web_Surface_Can_Go_Forward( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
349 const Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
350 uint32 entity_id) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
351 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
352 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
353 return Canvas_Web_Has_Surface(entity_id) ? TRUE : FALSE; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
354 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
355 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
356 void Canvas_Web_Surface_Go_Back( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
357 Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
358 uint32 entity_id) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
359 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
360 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
361 Canvas_Web_History_Go(entity_id, -1); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
362 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
363 |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
364 void Canvas_Web_Surface_Go_Forward( |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
365 Canvas_Web_Surface *p_surface, |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
366 uint32 entity_id) |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
367 { |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
368 (void)p_surface; |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
369 Canvas_Web_History_Go(entity_id, 1); |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
370 } |
|
8d560f50ed4c
Improve infinite canvas interactions and browser chrome
MrJuneJune <me@mrjunejune.com>
parents:
276
diff
changeset
|
371 |
|
276
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
372 boolean Canvas_Web_Surface_Is_Focused(const Canvas_Web_Surface *p_surface) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
373 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
374 (void)p_surface; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
375 return FALSE; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
376 } |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
378 void Canvas_Web_Surface_Shutdown(Canvas_Web_Surface *p_surface) |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 { |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
380 if (!p_surface->initialized) return; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 Canvas_Web_Destroy(); |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 p_surface->initialized = FALSE; |
|
b55c22cff335
Add interactive infinite canvas prototype
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 } |