groove-dev 0.26.39 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (914) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/CLAUDE.md +24 -19
  3. package/node_modules/@groove-dev/cli/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/integrations-registry.json +548 -0
  5. package/node_modules/@groove-dev/daemon/package.json +1 -1
  6. package/node_modules/@groove-dev/daemon/src/api.js +172 -4
  7. package/node_modules/@groove-dev/daemon/src/classifier.js +20 -1
  8. package/node_modules/@groove-dev/daemon/src/firstrun.js +14 -1
  9. package/node_modules/@groove-dev/daemon/src/gateways/manager.js +2 -2
  10. package/node_modules/@groove-dev/daemon/src/index.js +3 -1
  11. package/node_modules/@groove-dev/daemon/src/introducer.js +56 -5
  12. package/node_modules/@groove-dev/daemon/src/journalist.js +43 -1
  13. package/node_modules/@groove-dev/daemon/src/lockmanager.js +60 -0
  14. package/node_modules/@groove-dev/daemon/src/mcp-manager.js +2 -1
  15. package/node_modules/@groove-dev/daemon/src/memory.js +370 -0
  16. package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
  17. package/node_modules/@groove-dev/daemon/src/process.js +20 -1
  18. package/node_modules/@groove-dev/daemon/src/rotator.js +155 -5
  19. package/node_modules/@groove-dev/daemon/src/router.js +43 -0
  20. package/node_modules/@groove-dev/daemon/src/tokentracker.js +62 -8
  21. package/node_modules/@groove-dev/daemon/src/validate.js +0 -13
  22. package/node_modules/@groove-dev/daemon/test/lockmanager.test.js +64 -0
  23. package/node_modules/@groove-dev/daemon/test/memory.test.js +252 -0
  24. package/node_modules/@groove-dev/daemon/test/rotator.test.js +108 -0
  25. package/node_modules/@groove-dev/daemon/test/router.test.js +64 -0
  26. package/node_modules/@groove-dev/daemon/test/tokentracker.test.js +78 -0
  27. package/node_modules/@groove-dev/gui/dist/assets/index-DjORRpF0.css +1 -0
  28. package/node_modules/@groove-dev/gui/dist/assets/index-eCrVowF0.js +652 -0
  29. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  30. package/node_modules/@groove-dev/gui/package.json +1 -4
  31. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +18 -0
  32. package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +6 -2
  33. package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +251 -8
  34. package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  35. package/node_modules/@groove-dev/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  36. package/node_modules/@groove-dev/gui/src/lib/format.js +0 -6
  37. package/node_modules/@groove-dev/gui/src/lib/hooks/use-dashboard.js +18 -1
  38. package/node_modules/@groove-dev/gui/src/stores/groove.js +0 -2
  39. package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +9 -2
  40. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +103 -77
  41. package/package.json +2 -8
  42. package/packages/cli/package.json +1 -1
  43. package/packages/daemon/integrations-registry.json +548 -0
  44. package/packages/daemon/package.json +1 -1
  45. package/packages/daemon/src/api.js +172 -4
  46. package/packages/daemon/src/classifier.js +20 -1
  47. package/packages/daemon/src/firstrun.js +14 -1
  48. package/packages/daemon/src/gateways/manager.js +2 -2
  49. package/packages/daemon/src/index.js +3 -1
  50. package/packages/daemon/src/introducer.js +56 -5
  51. package/packages/daemon/src/journalist.js +43 -1
  52. package/packages/daemon/src/lockmanager.js +60 -0
  53. package/packages/daemon/src/mcp-manager.js +2 -1
  54. package/packages/daemon/src/memory.js +370 -0
  55. package/packages/daemon/src/pm.js +1 -1
  56. package/packages/daemon/src/process.js +20 -1
  57. package/packages/daemon/src/rotator.js +155 -5
  58. package/packages/daemon/src/router.js +43 -0
  59. package/packages/daemon/src/tokentracker.js +62 -8
  60. package/packages/daemon/src/validate.js +0 -13
  61. package/packages/gui/dist/assets/index-DjORRpF0.css +1 -0
  62. package/packages/gui/dist/assets/index-eCrVowF0.js +652 -0
  63. package/packages/gui/dist/index.html +2 -2
  64. package/packages/gui/package.json +1 -4
  65. package/packages/gui/src/components/agents/spawn-wizard.jsx +18 -0
  66. package/packages/gui/src/components/dashboard/cache-ring.jsx +6 -2
  67. package/packages/gui/src/components/dashboard/intel-panel.jsx +251 -8
  68. package/packages/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  69. package/packages/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  70. package/packages/gui/src/lib/format.js +0 -6
  71. package/packages/gui/src/lib/hooks/use-dashboard.js +18 -1
  72. package/packages/gui/src/stores/groove.js +0 -2
  73. package/packages/gui/src/views/dashboard.jsx +9 -2
  74. package/packages/gui/src/views/marketplace.jsx +103 -77
  75. package/docs-manager/DOCS-WORKFLOW.md +0 -176
  76. package/node_modules/@groove-dev/gui/dist/assets/index-BkY43sei.css +0 -1
  77. package/node_modules/@groove-dev/gui/dist/assets/index-DmKZLrXU.js +0 -652
  78. package/node_modules/@groove-dev/gui/dist/groove-logo-short.png +0 -0
  79. package/node_modules/@groove-dev/gui/dist/groove-logo.png +0 -0
  80. package/node_modules/@groove-dev/gui/public/groove-logo-short.png +0 -0
  81. package/node_modules/@groove-dev/gui/public/groove-logo.png +0 -0
  82. package/node_modules/@groove-dev/gui/src/components/ui/dropdown-menu.jsx +0 -60
  83. package/node_modules/@groove-dev/gui/src/lib/hooks/use-media-query.js +0 -18
  84. package/node_modules/@radix-ui/react-dropdown-menu/LICENSE +0 -21
  85. package/node_modules/@radix-ui/react-dropdown-menu/README.md +0 -3
  86. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts +0 -97
  87. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.ts +0 -97
  88. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +0 -337
  89. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +0 -7
  90. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs +0 -305
  91. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs.map +0 -7
  92. package/node_modules/@radix-ui/react-dropdown-menu/package.json +0 -75
  93. package/node_modules/@radix-ui/react-popover/LICENSE +0 -21
  94. package/node_modules/@radix-ui/react-popover/README.md +0 -3
  95. package/node_modules/@radix-ui/react-popover/dist/index.d.mts +0 -85
  96. package/node_modules/@radix-ui/react-popover/dist/index.d.ts +0 -85
  97. package/node_modules/@radix-ui/react-popover/dist/index.js +0 -352
  98. package/node_modules/@radix-ui/react-popover/dist/index.js.map +0 -7
  99. package/node_modules/@radix-ui/react-popover/dist/index.mjs +0 -320
  100. package/node_modules/@radix-ui/react-popover/dist/index.mjs.map +0 -7
  101. package/node_modules/@radix-ui/react-popover/package.json +0 -82
  102. package/node_modules/@radix-ui/react-separator/LICENSE +0 -21
  103. package/node_modules/@radix-ui/react-separator/README.md +0 -3
  104. package/node_modules/@radix-ui/react-separator/dist/index.d.mts +0 -21
  105. package/node_modules/@radix-ui/react-separator/dist/index.d.ts +0 -21
  106. package/node_modules/@radix-ui/react-separator/dist/index.js +0 -65
  107. package/node_modules/@radix-ui/react-separator/dist/index.js.map +0 -7
  108. package/node_modules/@radix-ui/react-separator/dist/index.mjs +0 -32
  109. package/node_modules/@radix-ui/react-separator/dist/index.mjs.map +0 -7
  110. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/LICENSE +0 -21
  111. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/README.md +0 -3
  112. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.mts +0 -52
  113. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.ts +0 -52
  114. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +0 -80
  115. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -7
  116. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs +0 -47
  117. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs.map +0 -7
  118. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/package.json +0 -69
  119. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/LICENSE +0 -21
  120. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/README.md +0 -3
  121. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.mts +0 -22
  122. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.ts +0 -22
  123. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js +0 -152
  124. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js.map +0 -7
  125. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs +0 -119
  126. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs.map +0 -7
  127. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/package.json +0 -64
  128. package/node_modules/@radix-ui/react-separator/package.json +0 -69
  129. package/packages/gui/dist/assets/index-BkY43sei.css +0 -1
  130. package/packages/gui/dist/assets/index-DmKZLrXU.js +0 -652
  131. package/packages/gui/dist/groove-logo-short.png +0 -0
  132. package/packages/gui/dist/groove-logo.png +0 -0
  133. package/packages/gui/public/groove-logo-short.png +0 -0
  134. package/packages/gui/public/groove-logo.png +0 -0
  135. package/packages/gui/src/components/ui/dropdown-menu.jsx +0 -60
  136. package/packages/gui/src/lib/hooks/use-media-query.js +0 -18
  137. package/slides/convert-slides.js +0 -1120
  138. package/slides/deck.pptx +0 -0
  139. package/slides/index.html +0 -825
  140. package/slides/node_modules/.package-lock.json +0 -527
  141. package/slides/node_modules/@types/node/LICENSE +0 -21
  142. package/slides/node_modules/@types/node/README.md +0 -15
  143. package/slides/node_modules/@types/node/assert/strict.d.ts +0 -111
  144. package/slides/node_modules/@types/node/assert.d.ts +0 -1078
  145. package/slides/node_modules/@types/node/async_hooks.d.ts +0 -603
  146. package/slides/node_modules/@types/node/buffer.buffer.d.ts +0 -472
  147. package/slides/node_modules/@types/node/buffer.d.ts +0 -1934
  148. package/slides/node_modules/@types/node/child_process.d.ts +0 -1476
  149. package/slides/node_modules/@types/node/cluster.d.ts +0 -578
  150. package/slides/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  151. package/slides/node_modules/@types/node/compatibility/index.d.ts +0 -9
  152. package/slides/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  153. package/slides/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
  154. package/slides/node_modules/@types/node/console.d.ts +0 -452
  155. package/slides/node_modules/@types/node/constants.d.ts +0 -21
  156. package/slides/node_modules/@types/node/crypto.d.ts +0 -4545
  157. package/slides/node_modules/@types/node/dgram.d.ts +0 -600
  158. package/slides/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
  159. package/slides/node_modules/@types/node/dns/promises.d.ts +0 -503
  160. package/slides/node_modules/@types/node/dns.d.ts +0 -923
  161. package/slides/node_modules/@types/node/domain.d.ts +0 -170
  162. package/slides/node_modules/@types/node/events.d.ts +0 -976
  163. package/slides/node_modules/@types/node/fs/promises.d.ts +0 -1295
  164. package/slides/node_modules/@types/node/fs.d.ts +0 -4461
  165. package/slides/node_modules/@types/node/globals.d.ts +0 -172
  166. package/slides/node_modules/@types/node/globals.typedarray.d.ts +0 -38
  167. package/slides/node_modules/@types/node/http.d.ts +0 -2089
  168. package/slides/node_modules/@types/node/http2.d.ts +0 -2644
  169. package/slides/node_modules/@types/node/https.d.ts +0 -579
  170. package/slides/node_modules/@types/node/index.d.ts +0 -97
  171. package/slides/node_modules/@types/node/inspector.d.ts +0 -253
  172. package/slides/node_modules/@types/node/inspector.generated.d.ts +0 -4052
  173. package/slides/node_modules/@types/node/module.d.ts +0 -891
  174. package/slides/node_modules/@types/node/net.d.ts +0 -1076
  175. package/slides/node_modules/@types/node/os.d.ts +0 -506
  176. package/slides/node_modules/@types/node/package.json +0 -145
  177. package/slides/node_modules/@types/node/path.d.ts +0 -200
  178. package/slides/node_modules/@types/node/perf_hooks.d.ts +0 -968
  179. package/slides/node_modules/@types/node/process.d.ts +0 -2084
  180. package/slides/node_modules/@types/node/punycode.d.ts +0 -117
  181. package/slides/node_modules/@types/node/querystring.d.ts +0 -152
  182. package/slides/node_modules/@types/node/readline/promises.d.ts +0 -161
  183. package/slides/node_modules/@types/node/readline.d.ts +0 -594
  184. package/slides/node_modules/@types/node/repl.d.ts +0 -428
  185. package/slides/node_modules/@types/node/sea.d.ts +0 -153
  186. package/slides/node_modules/@types/node/sqlite.d.ts +0 -721
  187. package/slides/node_modules/@types/node/stream/consumers.d.ts +0 -38
  188. package/slides/node_modules/@types/node/stream/promises.d.ts +0 -90
  189. package/slides/node_modules/@types/node/stream/web.d.ts +0 -622
  190. package/slides/node_modules/@types/node/stream.d.ts +0 -1687
  191. package/slides/node_modules/@types/node/string_decoder.d.ts +0 -67
  192. package/slides/node_modules/@types/node/test.d.ts +0 -2163
  193. package/slides/node_modules/@types/node/timers/promises.d.ts +0 -108
  194. package/slides/node_modules/@types/node/timers.d.ts +0 -287
  195. package/slides/node_modules/@types/node/tls.d.ts +0 -1319
  196. package/slides/node_modules/@types/node/trace_events.d.ts +0 -197
  197. package/slides/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
  198. package/slides/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
  199. package/slides/node_modules/@types/node/ts5.6/index.d.ts +0 -97
  200. package/slides/node_modules/@types/node/tty.d.ts +0 -208
  201. package/slides/node_modules/@types/node/url.d.ts +0 -984
  202. package/slides/node_modules/@types/node/util.d.ts +0 -2606
  203. package/slides/node_modules/@types/node/v8.d.ts +0 -920
  204. package/slides/node_modules/@types/node/vm.d.ts +0 -1000
  205. package/slides/node_modules/@types/node/wasi.d.ts +0 -181
  206. package/slides/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
  207. package/slides/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  208. package/slides/node_modules/@types/node/web-globals/events.d.ts +0 -97
  209. package/slides/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
  210. package/slides/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
  211. package/slides/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  212. package/slides/node_modules/@types/node/worker_threads.d.ts +0 -784
  213. package/slides/node_modules/@types/node/zlib.d.ts +0 -747
  214. package/slides/node_modules/base64-js/LICENSE +0 -21
  215. package/slides/node_modules/base64-js/README.md +0 -34
  216. package/slides/node_modules/base64-js/base64js.min.js +0 -1
  217. package/slides/node_modules/base64-js/index.d.ts +0 -3
  218. package/slides/node_modules/base64-js/index.js +0 -150
  219. package/slides/node_modules/base64-js/package.json +0 -47
  220. package/slides/node_modules/bl/.travis.yml +0 -17
  221. package/slides/node_modules/bl/BufferList.js +0 -396
  222. package/slides/node_modules/bl/LICENSE.md +0 -13
  223. package/slides/node_modules/bl/README.md +0 -247
  224. package/slides/node_modules/bl/bl.js +0 -84
  225. package/slides/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  226. package/slides/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md +0 -136
  227. package/slides/node_modules/bl/node_modules/readable-stream/LICENSE +0 -47
  228. package/slides/node_modules/bl/node_modules/readable-stream/README.md +0 -106
  229. package/slides/node_modules/bl/node_modules/readable-stream/errors-browser.js +0 -127
  230. package/slides/node_modules/bl/node_modules/readable-stream/errors.js +0 -116
  231. package/slides/node_modules/bl/node_modules/readable-stream/experimentalWarning.js +0 -17
  232. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  233. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  234. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  235. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  236. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  237. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  238. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  239. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  240. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  241. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  242. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  243. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  244. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  245. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  246. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  247. package/slides/node_modules/bl/node_modules/readable-stream/package.json +0 -68
  248. package/slides/node_modules/bl/node_modules/readable-stream/readable-browser.js +0 -9
  249. package/slides/node_modules/bl/node_modules/readable-stream/readable.js +0 -16
  250. package/slides/node_modules/bl/package.json +0 -37
  251. package/slides/node_modules/bl/test/convert.js +0 -21
  252. package/slides/node_modules/bl/test/indexOf.js +0 -492
  253. package/slides/node_modules/bl/test/isBufferList.js +0 -32
  254. package/slides/node_modules/bl/test/test.js +0 -869
  255. package/slides/node_modules/buffer/AUTHORS.md +0 -70
  256. package/slides/node_modules/buffer/LICENSE +0 -21
  257. package/slides/node_modules/buffer/README.md +0 -410
  258. package/slides/node_modules/buffer/index.d.ts +0 -186
  259. package/slides/node_modules/buffer/index.js +0 -1817
  260. package/slides/node_modules/buffer/package.json +0 -96
  261. package/slides/node_modules/canvas/Readme.md +0 -657
  262. package/slides/node_modules/canvas/binding.gyp +0 -229
  263. package/slides/node_modules/canvas/browser.js +0 -31
  264. package/slides/node_modules/canvas/build/Makefile +0 -347
  265. package/slides/node_modules/canvas/build/Release/canvas.node +0 -0
  266. package/slides/node_modules/canvas/build/Release/libX11.6.dylib +0 -0
  267. package/slides/node_modules/canvas/build/Release/libXau.6.dylib +0 -0
  268. package/slides/node_modules/canvas/build/Release/libXdmcp.6.dylib +0 -0
  269. package/slides/node_modules/canvas/build/Release/libXext.6.dylib +0 -0
  270. package/slides/node_modules/canvas/build/Release/libXrender.1.dylib +0 -0
  271. package/slides/node_modules/canvas/build/Release/libcairo-gobject.2.dylib +0 -0
  272. package/slides/node_modules/canvas/build/Release/libcairo.2.dylib +0 -0
  273. package/slides/node_modules/canvas/build/Release/libdatrie.1.dylib +0 -0
  274. package/slides/node_modules/canvas/build/Release/libfontconfig.1.dylib +0 -0
  275. package/slides/node_modules/canvas/build/Release/libfreetype.6.dylib +0 -0
  276. package/slides/node_modules/canvas/build/Release/libfribidi.0.dylib +0 -0
  277. package/slides/node_modules/canvas/build/Release/libgdk_pixbuf-2.0.0.dylib +0 -0
  278. package/slides/node_modules/canvas/build/Release/libgif.7.2.0.dylib +0 -0
  279. package/slides/node_modules/canvas/build/Release/libgio-2.0.0.dylib +0 -0
  280. package/slides/node_modules/canvas/build/Release/libglib-2.0.0.dylib +0 -0
  281. package/slides/node_modules/canvas/build/Release/libgmodule-2.0.0.dylib +0 -0
  282. package/slides/node_modules/canvas/build/Release/libgobject-2.0.0.dylib +0 -0
  283. package/slides/node_modules/canvas/build/Release/libgraphite2.3.2.1.dylib +0 -0
  284. package/slides/node_modules/canvas/build/Release/libharfbuzz.0.dylib +0 -0
  285. package/slides/node_modules/canvas/build/Release/libintl.8.dylib +0 -0
  286. package/slides/node_modules/canvas/build/Release/libjpeg.8.3.2.dylib +0 -0
  287. package/slides/node_modules/canvas/build/Release/libpango-1.0.0.dylib +0 -0
  288. package/slides/node_modules/canvas/build/Release/libpangocairo-1.0.0.dylib +0 -0
  289. package/slides/node_modules/canvas/build/Release/libpangoft2-1.0.0.dylib +0 -0
  290. package/slides/node_modules/canvas/build/Release/libpcre2-8.0.dylib +0 -0
  291. package/slides/node_modules/canvas/build/Release/libpixman-1.0.dylib +0 -0
  292. package/slides/node_modules/canvas/build/Release/libpng16.16.dylib +0 -0
  293. package/slides/node_modules/canvas/build/Release/librsvg-2.2.dylib +0 -0
  294. package/slides/node_modules/canvas/build/Release/libthai.0.dylib +0 -0
  295. package/slides/node_modules/canvas/build/Release/libxcb-render.0.0.0.dylib +0 -0
  296. package/slides/node_modules/canvas/build/Release/libxcb-shm.0.0.0.dylib +0 -0
  297. package/slides/node_modules/canvas/build/Release/libxcb.1.1.0.dylib +0 -0
  298. package/slides/node_modules/canvas/build/binding.Makefile +0 -6
  299. package/slides/node_modules/canvas/build/canvas.target.mk +0 -299
  300. package/slides/node_modules/canvas/build/gyp-mac-tool +0 -766
  301. package/slides/node_modules/canvas/index.d.ts +0 -507
  302. package/slides/node_modules/canvas/index.js +0 -94
  303. package/slides/node_modules/canvas/lib/DOMMatrix.js +0 -678
  304. package/slides/node_modules/canvas/lib/bindings.js +0 -43
  305. package/slides/node_modules/canvas/lib/canvas.js +0 -113
  306. package/slides/node_modules/canvas/lib/context2d.js +0 -11
  307. package/slides/node_modules/canvas/lib/image.js +0 -97
  308. package/slides/node_modules/canvas/lib/jpegstream.js +0 -41
  309. package/slides/node_modules/canvas/lib/pattern.js +0 -15
  310. package/slides/node_modules/canvas/lib/pdfstream.js +0 -35
  311. package/slides/node_modules/canvas/lib/pngstream.js +0 -42
  312. package/slides/node_modules/canvas/package.json +0 -71
  313. package/slides/node_modules/canvas/src/Backends.h +0 -9
  314. package/slides/node_modules/canvas/src/Canvas.cc +0 -1026
  315. package/slides/node_modules/canvas/src/Canvas.h +0 -128
  316. package/slides/node_modules/canvas/src/CanvasError.h +0 -37
  317. package/slides/node_modules/canvas/src/CanvasGradient.cc +0 -113
  318. package/slides/node_modules/canvas/src/CanvasGradient.h +0 -20
  319. package/slides/node_modules/canvas/src/CanvasPattern.cc +0 -129
  320. package/slides/node_modules/canvas/src/CanvasPattern.h +0 -33
  321. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.cc +0 -3527
  322. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.h +0 -238
  323. package/slides/node_modules/canvas/src/CharData.h +0 -233
  324. package/slides/node_modules/canvas/src/FontParser.cc +0 -605
  325. package/slides/node_modules/canvas/src/FontParser.h +0 -115
  326. package/slides/node_modules/canvas/src/Image.cc +0 -1719
  327. package/slides/node_modules/canvas/src/Image.h +0 -146
  328. package/slides/node_modules/canvas/src/ImageData.cc +0 -138
  329. package/slides/node_modules/canvas/src/ImageData.h +0 -26
  330. package/slides/node_modules/canvas/src/InstanceData.h +0 -12
  331. package/slides/node_modules/canvas/src/JPEGStream.h +0 -157
  332. package/slides/node_modules/canvas/src/PNG.h +0 -292
  333. package/slides/node_modules/canvas/src/Point.h +0 -11
  334. package/slides/node_modules/canvas/src/Util.h +0 -9
  335. package/slides/node_modules/canvas/src/bmp/BMPParser.cc +0 -459
  336. package/slides/node_modules/canvas/src/bmp/BMPParser.h +0 -60
  337. package/slides/node_modules/canvas/src/bmp/LICENSE.md +0 -24
  338. package/slides/node_modules/canvas/src/closure.cc +0 -52
  339. package/slides/node_modules/canvas/src/closure.h +0 -98
  340. package/slides/node_modules/canvas/src/color.cc +0 -796
  341. package/slides/node_modules/canvas/src/color.h +0 -30
  342. package/slides/node_modules/canvas/src/dll_visibility.h +0 -20
  343. package/slides/node_modules/canvas/src/init.cc +0 -114
  344. package/slides/node_modules/canvas/src/register_font.cc +0 -352
  345. package/slides/node_modules/canvas/src/register_font.h +0 -7
  346. package/slides/node_modules/canvas/util/has_lib.js +0 -119
  347. package/slides/node_modules/canvas/util/win_jpeg_lookup.js +0 -21
  348. package/slides/node_modules/chownr/LICENSE +0 -15
  349. package/slides/node_modules/chownr/README.md +0 -3
  350. package/slides/node_modules/chownr/chownr.js +0 -167
  351. package/slides/node_modules/chownr/package.json +0 -29
  352. package/slides/node_modules/core-util-is/LICENSE +0 -19
  353. package/slides/node_modules/core-util-is/README.md +0 -3
  354. package/slides/node_modules/core-util-is/lib/util.js +0 -107
  355. package/slides/node_modules/core-util-is/package.json +0 -38
  356. package/slides/node_modules/decompress-response/index.d.ts +0 -22
  357. package/slides/node_modules/decompress-response/index.js +0 -58
  358. package/slides/node_modules/decompress-response/license +0 -9
  359. package/slides/node_modules/decompress-response/package.json +0 -56
  360. package/slides/node_modules/decompress-response/readme.md +0 -48
  361. package/slides/node_modules/deep-extend/CHANGELOG.md +0 -46
  362. package/slides/node_modules/deep-extend/LICENSE +0 -20
  363. package/slides/node_modules/deep-extend/README.md +0 -91
  364. package/slides/node_modules/deep-extend/index.js +0 -1
  365. package/slides/node_modules/deep-extend/lib/deep-extend.js +0 -150
  366. package/slides/node_modules/deep-extend/package.json +0 -62
  367. package/slides/node_modules/detect-libc/LICENSE +0 -201
  368. package/slides/node_modules/detect-libc/README.md +0 -163
  369. package/slides/node_modules/detect-libc/index.d.ts +0 -14
  370. package/slides/node_modules/detect-libc/lib/detect-libc.js +0 -313
  371. package/slides/node_modules/detect-libc/lib/elf.js +0 -39
  372. package/slides/node_modules/detect-libc/lib/filesystem.js +0 -51
  373. package/slides/node_modules/detect-libc/lib/process.js +0 -24
  374. package/slides/node_modules/detect-libc/package.json +0 -44
  375. package/slides/node_modules/end-of-stream/LICENSE +0 -21
  376. package/slides/node_modules/end-of-stream/README.md +0 -54
  377. package/slides/node_modules/end-of-stream/index.js +0 -96
  378. package/slides/node_modules/end-of-stream/package.json +0 -37
  379. package/slides/node_modules/expand-template/.travis.yml +0 -6
  380. package/slides/node_modules/expand-template/LICENSE +0 -21
  381. package/slides/node_modules/expand-template/README.md +0 -43
  382. package/slides/node_modules/expand-template/index.js +0 -26
  383. package/slides/node_modules/expand-template/package.json +0 -29
  384. package/slides/node_modules/expand-template/test.js +0 -67
  385. package/slides/node_modules/fs-constants/LICENSE +0 -21
  386. package/slides/node_modules/fs-constants/README.md +0 -26
  387. package/slides/node_modules/fs-constants/browser.js +0 -1
  388. package/slides/node_modules/fs-constants/index.js +0 -1
  389. package/slides/node_modules/fs-constants/package.json +0 -19
  390. package/slides/node_modules/github-from-package/.travis.yml +0 -4
  391. package/slides/node_modules/github-from-package/LICENSE +0 -18
  392. package/slides/node_modules/github-from-package/example/package.json +0 -8
  393. package/slides/node_modules/github-from-package/example/url.js +0 -3
  394. package/slides/node_modules/github-from-package/index.js +0 -17
  395. package/slides/node_modules/github-from-package/package.json +0 -30
  396. package/slides/node_modules/github-from-package/readme.markdown +0 -53
  397. package/slides/node_modules/github-from-package/test/a.json +0 -8
  398. package/slides/node_modules/github-from-package/test/b.json +0 -5
  399. package/slides/node_modules/github-from-package/test/c.json +0 -5
  400. package/slides/node_modules/github-from-package/test/d.json +0 -7
  401. package/slides/node_modules/github-from-package/test/e.json +0 -5
  402. package/slides/node_modules/github-from-package/test/url.js +0 -19
  403. package/slides/node_modules/https/package.json +0 -15
  404. package/slides/node_modules/ieee754/LICENSE +0 -11
  405. package/slides/node_modules/ieee754/README.md +0 -51
  406. package/slides/node_modules/ieee754/index.d.ts +0 -10
  407. package/slides/node_modules/ieee754/index.js +0 -85
  408. package/slides/node_modules/ieee754/package.json +0 -52
  409. package/slides/node_modules/image-size/LICENSE +0 -9
  410. package/slides/node_modules/image-size/Readme.md +0 -184
  411. package/slides/node_modules/image-size/bin/image-size.js +0 -53
  412. package/slides/node_modules/image-size/dist/detector.d.ts +0 -2
  413. package/slides/node_modules/image-size/dist/detector.js +0 -30
  414. package/slides/node_modules/image-size/dist/index.d.ts +0 -10
  415. package/slides/node_modules/image-size/dist/index.js +0 -129
  416. package/slides/node_modules/image-size/dist/types/bmp.d.ts +0 -2
  417. package/slides/node_modules/image-size/dist/types/bmp.js +0 -11
  418. package/slides/node_modules/image-size/dist/types/cur.d.ts +0 -2
  419. package/slides/node_modules/image-size/dist/types/cur.js +0 -17
  420. package/slides/node_modules/image-size/dist/types/dds.d.ts +0 -2
  421. package/slides/node_modules/image-size/dist/types/dds.js +0 -11
  422. package/slides/node_modules/image-size/dist/types/gif.d.ts +0 -2
  423. package/slides/node_modules/image-size/dist/types/gif.js +0 -12
  424. package/slides/node_modules/image-size/dist/types/heif.d.ts +0 -2
  425. package/slides/node_modules/image-size/dist/types/heif.js +0 -40
  426. package/slides/node_modules/image-size/dist/types/icns.d.ts +0 -2
  427. package/slides/node_modules/image-size/dist/types/icns.js +0 -101
  428. package/slides/node_modules/image-size/dist/types/ico.d.ts +0 -2
  429. package/slides/node_modules/image-size/dist/types/ico.js +0 -68
  430. package/slides/node_modules/image-size/dist/types/index.d.ts +0 -23
  431. package/slides/node_modules/image-size/dist/types/index.js +0 -46
  432. package/slides/node_modules/image-size/dist/types/interface.d.ts +0 -13
  433. package/slides/node_modules/image-size/dist/types/interface.js +0 -2
  434. package/slides/node_modules/image-size/dist/types/j2c.d.ts +0 -2
  435. package/slides/node_modules/image-size/dist/types/j2c.js +0 -12
  436. package/slides/node_modules/image-size/dist/types/jp2.d.ts +0 -2
  437. package/slides/node_modules/image-size/dist/types/jp2.js +0 -27
  438. package/slides/node_modules/image-size/dist/types/jpg.d.ts +0 -2
  439. package/slides/node_modules/image-size/dist/types/jpg.js +0 -123
  440. package/slides/node_modules/image-size/dist/types/jxl-stream.d.ts +0 -2
  441. package/slides/node_modules/image-size/dist/types/jxl-stream.js +0 -45
  442. package/slides/node_modules/image-size/dist/types/jxl.d.ts +0 -2
  443. package/slides/node_modules/image-size/dist/types/jxl.js +0 -59
  444. package/slides/node_modules/image-size/dist/types/ktx.d.ts +0 -2
  445. package/slides/node_modules/image-size/dist/types/ktx.js +0 -19
  446. package/slides/node_modules/image-size/dist/types/png.d.ts +0 -2
  447. package/slides/node_modules/image-size/dist/types/png.js +0 -35
  448. package/slides/node_modules/image-size/dist/types/pnm.d.ts +0 -2
  449. package/slides/node_modules/image-size/dist/types/pnm.js +0 -72
  450. package/slides/node_modules/image-size/dist/types/psd.d.ts +0 -2
  451. package/slides/node_modules/image-size/dist/types/psd.js +0 -11
  452. package/slides/node_modules/image-size/dist/types/svg.d.ts +0 -2
  453. package/slides/node_modules/image-size/dist/types/svg.js +0 -90
  454. package/slides/node_modules/image-size/dist/types/tga.d.ts +0 -2
  455. package/slides/node_modules/image-size/dist/types/tga.js +0 -15
  456. package/slides/node_modules/image-size/dist/types/tiff.d.ts +0 -2
  457. package/slides/node_modules/image-size/dist/types/tiff.js +0 -95
  458. package/slides/node_modules/image-size/dist/types/utils.d.ts +0 -15
  459. package/slides/node_modules/image-size/dist/types/utils.js +0 -75
  460. package/slides/node_modules/image-size/dist/types/webp.d.ts +0 -2
  461. package/slides/node_modules/image-size/dist/types/webp.js +0 -60
  462. package/slides/node_modules/image-size/dist/utils/bit-reader.d.ts +0 -10
  463. package/slides/node_modules/image-size/dist/utils/bit-reader.js +0 -44
  464. package/slides/node_modules/image-size/package.json +0 -81
  465. package/slides/node_modules/immediate/LICENSE.txt +0 -20
  466. package/slides/node_modules/immediate/README.md +0 -93
  467. package/slides/node_modules/immediate/dist/immediate.js +0 -75
  468. package/slides/node_modules/immediate/dist/immediate.min.js +0 -1
  469. package/slides/node_modules/immediate/lib/browser.js +0 -69
  470. package/slides/node_modules/immediate/lib/index.js +0 -73
  471. package/slides/node_modules/immediate/package.json +0 -42
  472. package/slides/node_modules/inherits/LICENSE +0 -16
  473. package/slides/node_modules/inherits/README.md +0 -42
  474. package/slides/node_modules/inherits/inherits.js +0 -9
  475. package/slides/node_modules/inherits/inherits_browser.js +0 -27
  476. package/slides/node_modules/inherits/package.json +0 -29
  477. package/slides/node_modules/ini/LICENSE +0 -15
  478. package/slides/node_modules/ini/README.md +0 -102
  479. package/slides/node_modules/ini/ini.js +0 -206
  480. package/slides/node_modules/ini/package.json +0 -33
  481. package/slides/node_modules/isarray/.travis.yml +0 -4
  482. package/slides/node_modules/isarray/Makefile +0 -6
  483. package/slides/node_modules/isarray/README.md +0 -60
  484. package/slides/node_modules/isarray/component.json +0 -19
  485. package/slides/node_modules/isarray/index.js +0 -5
  486. package/slides/node_modules/isarray/package.json +0 -45
  487. package/slides/node_modules/isarray/test.js +0 -20
  488. package/slides/node_modules/jszip/.codeclimate.yml +0 -16
  489. package/slides/node_modules/jszip/.editorconfig +0 -8
  490. package/slides/node_modules/jszip/.eslintrc.js +0 -43
  491. package/slides/node_modules/jszip/.github/workflows/pr.yaml +0 -58
  492. package/slides/node_modules/jszip/.jekyll-metadata +0 -0
  493. package/slides/node_modules/jszip/.travis.yml +0 -17
  494. package/slides/node_modules/jszip/CHANGES.md +0 -204
  495. package/slides/node_modules/jszip/LICENSE.markdown +0 -651
  496. package/slides/node_modules/jszip/README.markdown +0 -33
  497. package/slides/node_modules/jszip/deps.js +0 -37
  498. package/slides/node_modules/jszip/dist/jszip.js +0 -11577
  499. package/slides/node_modules/jszip/dist/jszip.min.js +0 -13
  500. package/slides/node_modules/jszip/graph.svg +0 -601
  501. package/slides/node_modules/jszip/index.d.ts +0 -330
  502. package/slides/node_modules/jszip/lib/base64.js +0 -106
  503. package/slides/node_modules/jszip/lib/compressedObject.js +0 -74
  504. package/slides/node_modules/jszip/lib/compressions.js +0 -14
  505. package/slides/node_modules/jszip/lib/crc32.js +0 -77
  506. package/slides/node_modules/jszip/lib/defaults.js +0 -11
  507. package/slides/node_modules/jszip/lib/external.js +0 -18
  508. package/slides/node_modules/jszip/lib/flate.js +0 -85
  509. package/slides/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
  510. package/slides/node_modules/jszip/lib/generate/index.js +0 -57
  511. package/slides/node_modules/jszip/lib/index.js +0 -55
  512. package/slides/node_modules/jszip/lib/license_header.js +0 -11
  513. package/slides/node_modules/jszip/lib/load.js +0 -88
  514. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  515. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  516. package/slides/node_modules/jszip/lib/nodejsUtils.js +0 -57
  517. package/slides/node_modules/jszip/lib/object.js +0 -384
  518. package/slides/node_modules/jszip/lib/readable-stream-browser.js +0 -10
  519. package/slides/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  520. package/slides/node_modules/jszip/lib/reader/DataReader.js +0 -116
  521. package/slides/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  522. package/slides/node_modules/jszip/lib/reader/StringReader.js +0 -38
  523. package/slides/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  524. package/slides/node_modules/jszip/lib/reader/readerFor.js +0 -28
  525. package/slides/node_modules/jszip/lib/signature.js +0 -7
  526. package/slides/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  527. package/slides/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  528. package/slides/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  529. package/slides/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  530. package/slides/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  531. package/slides/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
  532. package/slides/node_modules/jszip/lib/support.js +0 -38
  533. package/slides/node_modules/jszip/lib/utf8.js +0 -275
  534. package/slides/node_modules/jszip/lib/utils.js +0 -501
  535. package/slides/node_modules/jszip/lib/zipEntries.js +0 -261
  536. package/slides/node_modules/jszip/lib/zipEntry.js +0 -293
  537. package/slides/node_modules/jszip/lib/zipObject.js +0 -133
  538. package/slides/node_modules/jszip/package.json +0 -67
  539. package/slides/node_modules/jszip/sponsors.md +0 -21
  540. package/slides/node_modules/jszip/tsconfig.json +0 -101
  541. package/slides/node_modules/jszip/vendor/FileSaver.js +0 -247
  542. package/slides/node_modules/lie/README.md +0 -62
  543. package/slides/node_modules/lie/dist/lie.js +0 -350
  544. package/slides/node_modules/lie/dist/lie.min.js +0 -1
  545. package/slides/node_modules/lie/dist/lie.polyfill.js +0 -358
  546. package/slides/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  547. package/slides/node_modules/lie/lib/browser.js +0 -273
  548. package/slides/node_modules/lie/lib/index.js +0 -298
  549. package/slides/node_modules/lie/license.md +0 -7
  550. package/slides/node_modules/lie/lie.d.ts +0 -244
  551. package/slides/node_modules/lie/package.json +0 -69
  552. package/slides/node_modules/lie/polyfill.js +0 -4
  553. package/slides/node_modules/mimic-response/index.d.ts +0 -17
  554. package/slides/node_modules/mimic-response/index.js +0 -77
  555. package/slides/node_modules/mimic-response/license +0 -9
  556. package/slides/node_modules/mimic-response/package.json +0 -42
  557. package/slides/node_modules/mimic-response/readme.md +0 -78
  558. package/slides/node_modules/minimist/.eslintrc +0 -29
  559. package/slides/node_modules/minimist/.github/FUNDING.yml +0 -12
  560. package/slides/node_modules/minimist/.nycrc +0 -14
  561. package/slides/node_modules/minimist/CHANGELOG.md +0 -298
  562. package/slides/node_modules/minimist/LICENSE +0 -18
  563. package/slides/node_modules/minimist/README.md +0 -121
  564. package/slides/node_modules/minimist/example/parse.js +0 -4
  565. package/slides/node_modules/minimist/index.js +0 -263
  566. package/slides/node_modules/minimist/package.json +0 -75
  567. package/slides/node_modules/minimist/test/all_bool.js +0 -34
  568. package/slides/node_modules/minimist/test/bool.js +0 -177
  569. package/slides/node_modules/minimist/test/dash.js +0 -43
  570. package/slides/node_modules/minimist/test/default_bool.js +0 -37
  571. package/slides/node_modules/minimist/test/dotted.js +0 -24
  572. package/slides/node_modules/minimist/test/kv_short.js +0 -32
  573. package/slides/node_modules/minimist/test/long.js +0 -33
  574. package/slides/node_modules/minimist/test/num.js +0 -38
  575. package/slides/node_modules/minimist/test/parse.js +0 -209
  576. package/slides/node_modules/minimist/test/parse_modified.js +0 -11
  577. package/slides/node_modules/minimist/test/proto.js +0 -64
  578. package/slides/node_modules/minimist/test/short.js +0 -69
  579. package/slides/node_modules/minimist/test/stop_early.js +0 -17
  580. package/slides/node_modules/minimist/test/unknown.js +0 -104
  581. package/slides/node_modules/minimist/test/whitespace.js +0 -10
  582. package/slides/node_modules/mkdirp-classic/LICENSE +0 -21
  583. package/slides/node_modules/mkdirp-classic/README.md +0 -18
  584. package/slides/node_modules/mkdirp-classic/index.js +0 -98
  585. package/slides/node_modules/mkdirp-classic/package.json +0 -18
  586. package/slides/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
  587. package/slides/node_modules/napi-build-utils/LICENSE +0 -21
  588. package/slides/node_modules/napi-build-utils/README.md +0 -52
  589. package/slides/node_modules/napi-build-utils/index.js +0 -214
  590. package/slides/node_modules/napi-build-utils/index.md +0 -0
  591. package/slides/node_modules/napi-build-utils/package.json +0 -42
  592. package/slides/node_modules/node-abi/LICENSE +0 -21
  593. package/slides/node_modules/node-abi/README.md +0 -54
  594. package/slides/node_modules/node-abi/abi_registry.json +0 -439
  595. package/slides/node_modules/node-abi/index.js +0 -179
  596. package/slides/node_modules/node-abi/package.json +0 -45
  597. package/slides/node_modules/node-addon-api/LICENSE.md +0 -9
  598. package/slides/node_modules/node-addon-api/README.md +0 -319
  599. package/slides/node_modules/node-addon-api/common.gypi +0 -20
  600. package/slides/node_modules/node-addon-api/except.gypi +0 -25
  601. package/slides/node_modules/node-addon-api/index.js +0 -12
  602. package/slides/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
  603. package/slides/node_modules/node-addon-api/napi-inl.h +0 -6607
  604. package/slides/node_modules/node-addon-api/napi.h +0 -3201
  605. package/slides/node_modules/node-addon-api/node_addon_api.gyp +0 -32
  606. package/slides/node_modules/node-addon-api/node_api.gyp +0 -9
  607. package/slides/node_modules/node-addon-api/noexcept.gypi +0 -26
  608. package/slides/node_modules/node-addon-api/nothing.c +0 -0
  609. package/slides/node_modules/node-addon-api/package-support.json +0 -21
  610. package/slides/node_modules/node-addon-api/package.json +0 -480
  611. package/slides/node_modules/node-addon-api/tools/README.md +0 -73
  612. package/slides/node_modules/node-addon-api/tools/check-napi.js +0 -99
  613. package/slides/node_modules/node-addon-api/tools/clang-format.js +0 -71
  614. package/slides/node_modules/node-addon-api/tools/conversion.js +0 -301
  615. package/slides/node_modules/node-addon-api/tools/eslint-format.js +0 -79
  616. package/slides/node_modules/once/LICENSE +0 -15
  617. package/slides/node_modules/once/README.md +0 -79
  618. package/slides/node_modules/once/once.js +0 -42
  619. package/slides/node_modules/once/package.json +0 -33
  620. package/slides/node_modules/pako/CHANGELOG.md +0 -164
  621. package/slides/node_modules/pako/LICENSE +0 -21
  622. package/slides/node_modules/pako/README.md +0 -191
  623. package/slides/node_modules/pako/dist/pako.js +0 -6818
  624. package/slides/node_modules/pako/dist/pako.min.js +0 -1
  625. package/slides/node_modules/pako/dist/pako_deflate.js +0 -3997
  626. package/slides/node_modules/pako/dist/pako_deflate.min.js +0 -1
  627. package/slides/node_modules/pako/dist/pako_inflate.js +0 -3300
  628. package/slides/node_modules/pako/dist/pako_inflate.min.js +0 -1
  629. package/slides/node_modules/pako/index.js +0 -14
  630. package/slides/node_modules/pako/lib/deflate.js +0 -400
  631. package/slides/node_modules/pako/lib/inflate.js +0 -423
  632. package/slides/node_modules/pako/lib/utils/common.js +0 -105
  633. package/slides/node_modules/pako/lib/utils/strings.js +0 -187
  634. package/slides/node_modules/pako/lib/zlib/README +0 -59
  635. package/slides/node_modules/pako/lib/zlib/adler32.js +0 -51
  636. package/slides/node_modules/pako/lib/zlib/constants.js +0 -68
  637. package/slides/node_modules/pako/lib/zlib/crc32.js +0 -59
  638. package/slides/node_modules/pako/lib/zlib/deflate.js +0 -1874
  639. package/slides/node_modules/pako/lib/zlib/gzheader.js +0 -58
  640. package/slides/node_modules/pako/lib/zlib/inffast.js +0 -345
  641. package/slides/node_modules/pako/lib/zlib/inflate.js +0 -1556
  642. package/slides/node_modules/pako/lib/zlib/inftrees.js +0 -343
  643. package/slides/node_modules/pako/lib/zlib/messages.js +0 -32
  644. package/slides/node_modules/pako/lib/zlib/trees.js +0 -1222
  645. package/slides/node_modules/pako/lib/zlib/zstream.js +0 -47
  646. package/slides/node_modules/pako/package.json +0 -44
  647. package/slides/node_modules/pptxgenjs/LICENSE +0 -21
  648. package/slides/node_modules/pptxgenjs/README.md +0 -224
  649. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js +0 -96
  650. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js.map +0 -1
  651. package/slides/node_modules/pptxgenjs/dist/pptxgen.cjs.js +0 -7370
  652. package/slides/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -7368
  653. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js +0 -96
  654. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js.map +0 -1
  655. package/slides/node_modules/pptxgenjs/package.json +0 -96
  656. package/slides/node_modules/pptxgenjs/types/index.d.ts +0 -2679
  657. package/slides/node_modules/prebuild-install/CHANGELOG.md +0 -131
  658. package/slides/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
  659. package/slides/node_modules/prebuild-install/LICENSE +0 -21
  660. package/slides/node_modules/prebuild-install/README.md +0 -163
  661. package/slides/node_modules/prebuild-install/asset.js +0 -44
  662. package/slides/node_modules/prebuild-install/bin.js +0 -78
  663. package/slides/node_modules/prebuild-install/download.js +0 -142
  664. package/slides/node_modules/prebuild-install/error.js +0 -14
  665. package/slides/node_modules/prebuild-install/help.txt +0 -16
  666. package/slides/node_modules/prebuild-install/index.js +0 -1
  667. package/slides/node_modules/prebuild-install/log.js +0 -33
  668. package/slides/node_modules/prebuild-install/package.json +0 -67
  669. package/slides/node_modules/prebuild-install/proxy.js +0 -35
  670. package/slides/node_modules/prebuild-install/rc.js +0 -64
  671. package/slides/node_modules/prebuild-install/util.js +0 -143
  672. package/slides/node_modules/process-nextick-args/index.js +0 -45
  673. package/slides/node_modules/process-nextick-args/license.md +0 -19
  674. package/slides/node_modules/process-nextick-args/package.json +0 -25
  675. package/slides/node_modules/process-nextick-args/readme.md +0 -18
  676. package/slides/node_modules/pump/.github/FUNDING.yml +0 -2
  677. package/slides/node_modules/pump/.travis.yml +0 -5
  678. package/slides/node_modules/pump/LICENSE +0 -21
  679. package/slides/node_modules/pump/README.md +0 -74
  680. package/slides/node_modules/pump/SECURITY.md +0 -5
  681. package/slides/node_modules/pump/empty.js +0 -1
  682. package/slides/node_modules/pump/index.js +0 -86
  683. package/slides/node_modules/pump/package.json +0 -30
  684. package/slides/node_modules/pump/test-browser.js +0 -66
  685. package/slides/node_modules/pump/test-node.js +0 -53
  686. package/slides/node_modules/queue/LICENSE +0 -8
  687. package/slides/node_modules/queue/index.d.ts +0 -173
  688. package/slides/node_modules/queue/index.js +0 -195
  689. package/slides/node_modules/queue/package.json +0 -43
  690. package/slides/node_modules/queue/readme.md +0 -221
  691. package/slides/node_modules/rc/LICENSE.APACHE2 +0 -15
  692. package/slides/node_modules/rc/LICENSE.BSD +0 -26
  693. package/slides/node_modules/rc/LICENSE.MIT +0 -24
  694. package/slides/node_modules/rc/README.md +0 -227
  695. package/slides/node_modules/rc/browser.js +0 -7
  696. package/slides/node_modules/rc/cli.js +0 -4
  697. package/slides/node_modules/rc/index.js +0 -53
  698. package/slides/node_modules/rc/lib/utils.js +0 -104
  699. package/slides/node_modules/rc/package.json +0 -29
  700. package/slides/node_modules/rc/test/ini.js +0 -16
  701. package/slides/node_modules/rc/test/nested-env-vars.js +0 -50
  702. package/slides/node_modules/rc/test/test.js +0 -59
  703. package/slides/node_modules/readable-stream/.travis.yml +0 -34
  704. package/slides/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  705. package/slides/node_modules/readable-stream/GOVERNANCE.md +0 -136
  706. package/slides/node_modules/readable-stream/LICENSE +0 -47
  707. package/slides/node_modules/readable-stream/README.md +0 -58
  708. package/slides/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  709. package/slides/node_modules/readable-stream/duplex-browser.js +0 -1
  710. package/slides/node_modules/readable-stream/duplex.js +0 -1
  711. package/slides/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  712. package/slides/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  713. package/slides/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  714. package/slides/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  715. package/slides/node_modules/readable-stream/lib/_stream_writable.js +0 -685
  716. package/slides/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
  717. package/slides/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
  718. package/slides/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  719. package/slides/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  720. package/slides/node_modules/readable-stream/package.json +0 -52
  721. package/slides/node_modules/readable-stream/passthrough.js +0 -1
  722. package/slides/node_modules/readable-stream/readable-browser.js +0 -7
  723. package/slides/node_modules/readable-stream/readable.js +0 -19
  724. package/slides/node_modules/readable-stream/transform.js +0 -1
  725. package/slides/node_modules/readable-stream/writable-browser.js +0 -1
  726. package/slides/node_modules/readable-stream/writable.js +0 -8
  727. package/slides/node_modules/safe-buffer/LICENSE +0 -21
  728. package/slides/node_modules/safe-buffer/README.md +0 -584
  729. package/slides/node_modules/safe-buffer/index.d.ts +0 -187
  730. package/slides/node_modules/safe-buffer/index.js +0 -62
  731. package/slides/node_modules/safe-buffer/package.json +0 -37
  732. package/slides/node_modules/semver/LICENSE +0 -15
  733. package/slides/node_modules/semver/README.md +0 -665
  734. package/slides/node_modules/semver/bin/semver.js +0 -191
  735. package/slides/node_modules/semver/classes/comparator.js +0 -143
  736. package/slides/node_modules/semver/classes/index.js +0 -7
  737. package/slides/node_modules/semver/classes/range.js +0 -557
  738. package/slides/node_modules/semver/classes/semver.js +0 -333
  739. package/slides/node_modules/semver/functions/clean.js +0 -8
  740. package/slides/node_modules/semver/functions/cmp.js +0 -54
  741. package/slides/node_modules/semver/functions/coerce.js +0 -62
  742. package/slides/node_modules/semver/functions/compare-build.js +0 -9
  743. package/slides/node_modules/semver/functions/compare-loose.js +0 -5
  744. package/slides/node_modules/semver/functions/compare.js +0 -7
  745. package/slides/node_modules/semver/functions/diff.js +0 -60
  746. package/slides/node_modules/semver/functions/eq.js +0 -5
  747. package/slides/node_modules/semver/functions/gt.js +0 -5
  748. package/slides/node_modules/semver/functions/gte.js +0 -5
  749. package/slides/node_modules/semver/functions/inc.js +0 -21
  750. package/slides/node_modules/semver/functions/lt.js +0 -5
  751. package/slides/node_modules/semver/functions/lte.js +0 -5
  752. package/slides/node_modules/semver/functions/major.js +0 -5
  753. package/slides/node_modules/semver/functions/minor.js +0 -5
  754. package/slides/node_modules/semver/functions/neq.js +0 -5
  755. package/slides/node_modules/semver/functions/parse.js +0 -18
  756. package/slides/node_modules/semver/functions/patch.js +0 -5
  757. package/slides/node_modules/semver/functions/prerelease.js +0 -8
  758. package/slides/node_modules/semver/functions/rcompare.js +0 -5
  759. package/slides/node_modules/semver/functions/rsort.js +0 -5
  760. package/slides/node_modules/semver/functions/satisfies.js +0 -12
  761. package/slides/node_modules/semver/functions/sort.js +0 -5
  762. package/slides/node_modules/semver/functions/valid.js +0 -8
  763. package/slides/node_modules/semver/index.js +0 -91
  764. package/slides/node_modules/semver/internal/constants.js +0 -37
  765. package/slides/node_modules/semver/internal/debug.js +0 -11
  766. package/slides/node_modules/semver/internal/identifiers.js +0 -29
  767. package/slides/node_modules/semver/internal/lrucache.js +0 -42
  768. package/slides/node_modules/semver/internal/parse-options.js +0 -17
  769. package/slides/node_modules/semver/internal/re.js +0 -223
  770. package/slides/node_modules/semver/package.json +0 -78
  771. package/slides/node_modules/semver/preload.js +0 -4
  772. package/slides/node_modules/semver/range.bnf +0 -16
  773. package/slides/node_modules/semver/ranges/gtr.js +0 -6
  774. package/slides/node_modules/semver/ranges/intersects.js +0 -9
  775. package/slides/node_modules/semver/ranges/ltr.js +0 -6
  776. package/slides/node_modules/semver/ranges/max-satisfying.js +0 -27
  777. package/slides/node_modules/semver/ranges/min-satisfying.js +0 -26
  778. package/slides/node_modules/semver/ranges/min-version.js +0 -63
  779. package/slides/node_modules/semver/ranges/outside.js +0 -82
  780. package/slides/node_modules/semver/ranges/simplify.js +0 -49
  781. package/slides/node_modules/semver/ranges/subset.js +0 -249
  782. package/slides/node_modules/semver/ranges/to-comparators.js +0 -10
  783. package/slides/node_modules/semver/ranges/valid.js +0 -13
  784. package/slides/node_modules/setimmediate/LICENSE.txt +0 -20
  785. package/slides/node_modules/setimmediate/package.json +0 -30
  786. package/slides/node_modules/setimmediate/setImmediate.js +0 -186
  787. package/slides/node_modules/simple-concat/.travis.yml +0 -3
  788. package/slides/node_modules/simple-concat/LICENSE +0 -20
  789. package/slides/node_modules/simple-concat/README.md +0 -44
  790. package/slides/node_modules/simple-concat/index.js +0 -15
  791. package/slides/node_modules/simple-concat/package.json +0 -47
  792. package/slides/node_modules/simple-concat/test/basic.js +0 -41
  793. package/slides/node_modules/simple-get/.github/dependabot.yml +0 -15
  794. package/slides/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  795. package/slides/node_modules/simple-get/LICENSE +0 -20
  796. package/slides/node_modules/simple-get/README.md +0 -333
  797. package/slides/node_modules/simple-get/index.js +0 -108
  798. package/slides/node_modules/simple-get/package.json +0 -67
  799. package/slides/node_modules/string_decoder/.travis.yml +0 -50
  800. package/slides/node_modules/string_decoder/LICENSE +0 -48
  801. package/slides/node_modules/string_decoder/README.md +0 -47
  802. package/slides/node_modules/string_decoder/lib/string_decoder.js +0 -296
  803. package/slides/node_modules/string_decoder/package.json +0 -31
  804. package/slides/node_modules/strip-json-comments/index.js +0 -70
  805. package/slides/node_modules/strip-json-comments/license +0 -21
  806. package/slides/node_modules/strip-json-comments/package.json +0 -42
  807. package/slides/node_modules/strip-json-comments/readme.md +0 -64
  808. package/slides/node_modules/tar-fs/.travis.yml +0 -6
  809. package/slides/node_modules/tar-fs/LICENSE +0 -21
  810. package/slides/node_modules/tar-fs/README.md +0 -165
  811. package/slides/node_modules/tar-fs/index.js +0 -363
  812. package/slides/node_modules/tar-fs/package.json +0 -41
  813. package/slides/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  814. package/slides/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  815. package/slides/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  816. package/slides/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  817. package/slides/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  818. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  819. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  820. package/slides/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  821. package/slides/node_modules/tar-fs/test/fixtures/e/file +0 -0
  822. package/slides/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  823. package/slides/node_modules/tar-fs/test/index.js +0 -346
  824. package/slides/node_modules/tar-stream/LICENSE +0 -21
  825. package/slides/node_modules/tar-stream/README.md +0 -168
  826. package/slides/node_modules/tar-stream/extract.js +0 -257
  827. package/slides/node_modules/tar-stream/headers.js +0 -295
  828. package/slides/node_modules/tar-stream/index.js +0 -2
  829. package/slides/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  830. package/slides/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md +0 -136
  831. package/slides/node_modules/tar-stream/node_modules/readable-stream/LICENSE +0 -47
  832. package/slides/node_modules/tar-stream/node_modules/readable-stream/README.md +0 -106
  833. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js +0 -127
  834. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors.js +0 -116
  835. package/slides/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js +0 -17
  836. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  837. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  838. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  839. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  840. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  841. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  842. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  843. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  844. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  845. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  846. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  847. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  848. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  849. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  850. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  851. package/slides/node_modules/tar-stream/node_modules/readable-stream/package.json +0 -68
  852. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js +0 -9
  853. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable.js +0 -16
  854. package/slides/node_modules/tar-stream/pack.js +0 -255
  855. package/slides/node_modules/tar-stream/package.json +0 -58
  856. package/slides/node_modules/tar-stream/sandbox.js +0 -11
  857. package/slides/node_modules/tunnel-agent/LICENSE +0 -55
  858. package/slides/node_modules/tunnel-agent/README.md +0 -4
  859. package/slides/node_modules/tunnel-agent/index.js +0 -244
  860. package/slides/node_modules/tunnel-agent/package.json +0 -22
  861. package/slides/node_modules/undici-types/LICENSE +0 -21
  862. package/slides/node_modules/undici-types/README.md +0 -6
  863. package/slides/node_modules/undici-types/agent.d.ts +0 -31
  864. package/slides/node_modules/undici-types/api.d.ts +0 -43
  865. package/slides/node_modules/undici-types/balanced-pool.d.ts +0 -29
  866. package/slides/node_modules/undici-types/cache.d.ts +0 -36
  867. package/slides/node_modules/undici-types/client.d.ts +0 -108
  868. package/slides/node_modules/undici-types/connector.d.ts +0 -34
  869. package/slides/node_modules/undici-types/content-type.d.ts +0 -21
  870. package/slides/node_modules/undici-types/cookies.d.ts +0 -28
  871. package/slides/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
  872. package/slides/node_modules/undici-types/dispatcher.d.ts +0 -256
  873. package/slides/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
  874. package/slides/node_modules/undici-types/errors.d.ts +0 -149
  875. package/slides/node_modules/undici-types/eventsource.d.ts +0 -61
  876. package/slides/node_modules/undici-types/fetch.d.ts +0 -209
  877. package/slides/node_modules/undici-types/file.d.ts +0 -39
  878. package/slides/node_modules/undici-types/filereader.d.ts +0 -54
  879. package/slides/node_modules/undici-types/formdata.d.ts +0 -108
  880. package/slides/node_modules/undici-types/global-dispatcher.d.ts +0 -9
  881. package/slides/node_modules/undici-types/global-origin.d.ts +0 -7
  882. package/slides/node_modules/undici-types/handlers.d.ts +0 -15
  883. package/slides/node_modules/undici-types/header.d.ts +0 -4
  884. package/slides/node_modules/undici-types/index.d.ts +0 -71
  885. package/slides/node_modules/undici-types/interceptors.d.ts +0 -17
  886. package/slides/node_modules/undici-types/mock-agent.d.ts +0 -50
  887. package/slides/node_modules/undici-types/mock-client.d.ts +0 -25
  888. package/slides/node_modules/undici-types/mock-errors.d.ts +0 -12
  889. package/slides/node_modules/undici-types/mock-interceptor.d.ts +0 -93
  890. package/slides/node_modules/undici-types/mock-pool.d.ts +0 -25
  891. package/slides/node_modules/undici-types/package.json +0 -55
  892. package/slides/node_modules/undici-types/patch.d.ts +0 -33
  893. package/slides/node_modules/undici-types/pool-stats.d.ts +0 -19
  894. package/slides/node_modules/undici-types/pool.d.ts +0 -39
  895. package/slides/node_modules/undici-types/proxy-agent.d.ts +0 -28
  896. package/slides/node_modules/undici-types/readable.d.ts +0 -65
  897. package/slides/node_modules/undici-types/retry-agent.d.ts +0 -8
  898. package/slides/node_modules/undici-types/retry-handler.d.ts +0 -116
  899. package/slides/node_modules/undici-types/util.d.ts +0 -18
  900. package/slides/node_modules/undici-types/webidl.d.ts +0 -228
  901. package/slides/node_modules/undici-types/websocket.d.ts +0 -150
  902. package/slides/node_modules/util-deprecate/History.md +0 -16
  903. package/slides/node_modules/util-deprecate/LICENSE +0 -24
  904. package/slides/node_modules/util-deprecate/README.md +0 -53
  905. package/slides/node_modules/util-deprecate/browser.js +0 -67
  906. package/slides/node_modules/util-deprecate/node.js +0 -6
  907. package/slides/node_modules/util-deprecate/package.json +0 -27
  908. package/slides/node_modules/wrappy/LICENSE +0 -15
  909. package/slides/node_modules/wrappy/README.md +0 -36
  910. package/slides/node_modules/wrappy/package.json +0 -29
  911. package/slides/node_modules/wrappy/wrappy.js +0 -33
  912. package/slides/package-lock.json +0 -536
  913. package/slides/package.json +0 -16
  914. package/slides/slides.json +0 -238
@@ -1,1719 +0,0 @@
1
- // Copyright (c) 2010 LearnBoost <tj@learnboost.com>
2
-
3
- #include "Image.h"
4
- #include "InstanceData.h"
5
-
6
- #include "bmp/BMPParser.h"
7
- #include "Canvas.h"
8
- #include <cerrno>
9
- #include <cstdlib>
10
- #include <cstring>
11
- #include <node_buffer.h>
12
- #include <sys/stat.h>
13
-
14
- /* Cairo limit:
15
- * https://lists.cairographics.org/archives/cairo/2010-December/021422.html
16
- */
17
- static constexpr int canvas_max_side = (1 << 15) - 1;
18
-
19
- #ifdef HAVE_GIF
20
- typedef struct {
21
- uint8_t *buf;
22
- unsigned len;
23
- unsigned pos;
24
- } gif_data_t;
25
- #endif
26
-
27
- #ifdef HAVE_JPEG
28
- #include <csetjmp>
29
-
30
- struct canvas_jpeg_error_mgr: jpeg_error_mgr {
31
- Image* image;
32
- jmp_buf setjmp_buffer;
33
- };
34
- #endif
35
-
36
- /*
37
- * Read closure used by loadFromBuffer.
38
- */
39
-
40
- typedef struct {
41
- Napi::Env env;
42
- unsigned len;
43
- uint8_t *buf;
44
- } read_closure_t;
45
-
46
- /*
47
- * Initialize Image.
48
- */
49
-
50
- void
51
- Image::Initialize(Napi::Env& env, Napi::Object& exports) {
52
- InstanceData *data = env.GetInstanceData<InstanceData>();
53
- Napi::HandleScope scope(env);
54
-
55
- Napi::Function ctor = DefineClass(env, "Image", {
56
- InstanceAccessor<&Image::GetComplete>("complete", napi_default_jsproperty),
57
- InstanceAccessor<&Image::GetWidth, &Image::SetWidth>("width", napi_default_jsproperty),
58
- InstanceAccessor<&Image::GetHeight, &Image::SetHeight>("height", napi_default_jsproperty),
59
- InstanceAccessor<&Image::GetNaturalWidth>("naturalWidth", napi_default_jsproperty),
60
- InstanceAccessor<&Image::GetNaturalHeight>("naturalHeight", napi_default_jsproperty),
61
- InstanceAccessor<&Image::GetDataMode, &Image::SetDataMode>("dataMode", napi_default_jsproperty),
62
- StaticValue("MODE_IMAGE", Napi::Number::New(env, DATA_IMAGE), napi_default_jsproperty),
63
- StaticValue("MODE_MIME", Napi::Number::New(env, DATA_MIME), napi_default_jsproperty)
64
- });
65
-
66
- // Used internally in lib/image.js
67
- exports.Set("GetSource", Napi::Function::New(env, &GetSource));
68
- exports.Set("SetSource", Napi::Function::New(env, &SetSource));
69
-
70
- data->ImageCtor = Napi::Persistent(ctor);
71
- exports.Set("Image", ctor);
72
- }
73
-
74
- /*
75
- * Initialize a new Image.
76
- */
77
-
78
- Image::Image(const Napi::CallbackInfo& info) : ObjectWrap<Image>(info), env(info.Env()) {
79
- data_mode = DATA_IMAGE;
80
- info.This().ToObject().Unwrap().Set("onload", env.Null());
81
- info.This().ToObject().Unwrap().Set("onerror", env.Null());
82
- filename = NULL;
83
- _data = nullptr;
84
- _data_len = 0;
85
- _surface = NULL;
86
- width = height = 0;
87
- naturalWidth = naturalHeight = 0;
88
- state = DEFAULT;
89
- #ifdef HAVE_RSVG
90
- _rsvg = NULL;
91
- _is_svg = false;
92
- _svg_last_width = _svg_last_height = 0;
93
- #endif
94
- }
95
-
96
- /*
97
- * Get complete boolean.
98
- */
99
-
100
- Napi::Value
101
- Image::GetComplete(const Napi::CallbackInfo& info) {
102
- return Napi::Boolean::New(env, true);
103
- }
104
-
105
- /*
106
- * Get dataMode.
107
- */
108
-
109
- Napi::Value
110
- Image::GetDataMode(const Napi::CallbackInfo& info) {
111
- return Napi::Number::New(env, data_mode);
112
- }
113
-
114
- /*
115
- * Set dataMode.
116
- */
117
-
118
- void
119
- Image::SetDataMode(const Napi::CallbackInfo& info, const Napi::Value& value) {
120
- if (value.IsNumber()) {
121
- int mode = value.As<Napi::Number>().Uint32Value();
122
- data_mode = (data_mode_t) mode;
123
- }
124
- }
125
-
126
- /*
127
- * Get natural width
128
- */
129
-
130
- Napi::Value
131
- Image::GetNaturalWidth(const Napi::CallbackInfo& info) {
132
- return Napi::Number::New(env, naturalWidth);
133
- }
134
-
135
- /*
136
- * Get width.
137
- */
138
-
139
- Napi::Value
140
- Image::GetWidth(const Napi::CallbackInfo& info) {
141
- return Napi::Number::New(env, width);
142
- }
143
-
144
- /*
145
- * Set width.
146
- */
147
-
148
- void
149
- Image::SetWidth(const Napi::CallbackInfo& info, const Napi::Value& value) {
150
- if (value.IsNumber()) {
151
- width = value.As<Napi::Number>().Uint32Value();
152
- }
153
- }
154
-
155
- /*
156
- * Get natural height
157
- */
158
-
159
- Napi::Value
160
- Image::GetNaturalHeight(const Napi::CallbackInfo& info) {
161
- return Napi::Number::New(env, naturalHeight);
162
- }
163
-
164
- /*
165
- * Get height.
166
- */
167
-
168
- Napi::Value
169
- Image::GetHeight(const Napi::CallbackInfo& info) {
170
- return Napi::Number::New(env, height);
171
- }
172
- /*
173
- * Set height.
174
- */
175
-
176
- void
177
- Image::SetHeight(const Napi::CallbackInfo& info, const Napi::Value& value) {
178
- if (value.IsNumber()) {
179
- height = value.As<Napi::Number>().Uint32Value();
180
- }
181
- }
182
-
183
- /*
184
- * Get src path.
185
- */
186
-
187
- Napi::Value
188
- Image::GetSource(const Napi::CallbackInfo& info){
189
- Napi::Env env = info.Env();
190
- Image *img = Image::Unwrap(info.This().As<Napi::Object>());
191
- return Napi::String::New(env, img->filename ? img->filename : "");
192
- }
193
-
194
- /*
195
- * Clean up assets and variables.
196
- */
197
-
198
- void
199
- Image::clearData() {
200
- if (_surface) {
201
- cairo_surface_destroy(_surface);
202
- Napi::MemoryManagement::AdjustExternalMemory(env, -_data_len);
203
- _data_len = 0;
204
- _surface = NULL;
205
- }
206
-
207
- delete[] _data;
208
- _data = nullptr;
209
-
210
- free(filename);
211
- filename = NULL;
212
-
213
- #ifdef HAVE_RSVG
214
- if (_rsvg != NULL) {
215
- g_object_unref(_rsvg);
216
- _rsvg = NULL;
217
- }
218
- #endif
219
-
220
- width = height = 0;
221
- naturalWidth = naturalHeight = 0;
222
- state = DEFAULT;
223
- }
224
-
225
- /*
226
- * Set src path.
227
- */
228
-
229
- void
230
- Image::SetSource(const Napi::CallbackInfo& info){
231
- Napi::Env env = info.Env();
232
- Napi::Object This = info.This().As<Napi::Object>();
233
- Image *img = Image::Unwrap(This);
234
-
235
- cairo_status_t status = CAIRO_STATUS_READ_ERROR;
236
-
237
- Napi::Value value = info[0];
238
-
239
- img->clearData();
240
- // Clear errno in case some unrelated previous syscall failed
241
- errno = 0;
242
-
243
- // url string
244
- if (value.IsString()) {
245
- std::string src = value.As<Napi::String>().Utf8Value();
246
- if (img->filename) free(img->filename);
247
- img->filename = strdup(src.c_str());
248
- status = img->load();
249
- // Buffer
250
- } else if (value.IsBuffer()) {
251
- uint8_t *buf = value.As<Napi::Buffer<uint8_t>>().Data();
252
- unsigned len = value.As<Napi::Buffer<uint8_t>>().Length();
253
- status = img->loadFromBuffer(buf, len);
254
- }
255
-
256
- if (status) {
257
- Napi::Value onerrorFn;
258
- if (This.Get("onerror").UnwrapTo(&onerrorFn) && onerrorFn.IsFunction()) {
259
- Napi::Error arg;
260
- if (img->errorInfo.empty()) {
261
- arg = Napi::Error::New(env, Napi::String::New(env, cairo_status_to_string(status)));
262
- } else {
263
- arg = img->errorInfo.toError(env);
264
- }
265
- onerrorFn.As<Napi::Function>().Call({ arg.Value() });
266
- }
267
- } else {
268
- img->loaded();
269
- Napi::Value onloadFn;
270
- if (This.Get("onload").UnwrapTo(&onloadFn) && onloadFn.IsFunction()) {
271
- onloadFn.As<Napi::Function>().Call({});
272
- }
273
- }
274
- }
275
-
276
- /*
277
- * Load image data from `buf` by sniffing
278
- * the bytes to determine format.
279
- */
280
-
281
- cairo_status_t
282
- Image::loadFromBuffer(uint8_t *buf, unsigned len) {
283
- if (len == 0) return CAIRO_STATUS_READ_ERROR;
284
-
285
- uint8_t data[4] = {0};
286
- memcpy(data, buf, (len < 4 ? len : 4) * sizeof(uint8_t));
287
-
288
- if (isPNG(data)) return loadPNGFromBuffer(buf);
289
-
290
- if (isGIF(data)) {
291
- #ifdef HAVE_GIF
292
- return loadGIFFromBuffer(buf, len);
293
- #else
294
- this->errorInfo.set("node-canvas was built without GIF support");
295
- return CAIRO_STATUS_READ_ERROR;
296
- #endif
297
- }
298
-
299
- if (isJPEG(data)) {
300
- #ifdef HAVE_JPEG
301
- if (DATA_IMAGE == data_mode) return loadJPEGFromBuffer(buf, len);
302
- if (DATA_MIME == data_mode) return decodeJPEGBufferIntoMimeSurface(buf, len);
303
- if ((DATA_IMAGE | DATA_MIME) == data_mode) {
304
- cairo_status_t status;
305
- status = loadJPEGFromBuffer(buf, len);
306
- if (status) return status;
307
- return assignDataAsMime(buf, len, CAIRO_MIME_TYPE_JPEG);
308
- }
309
- #else // HAVE_JPEG
310
- this->errorInfo.set("node-canvas was built without JPEG support");
311
- return CAIRO_STATUS_READ_ERROR;
312
- #endif
313
- }
314
-
315
- // confirm svg using first 1000 chars
316
- // if a very long comment precedes the root <svg> tag, isSVG returns false
317
- unsigned head_len = (len < 1000 ? len : 1000);
318
- if (isSVG(buf, head_len)) {
319
- #ifdef HAVE_RSVG
320
- return loadSVGFromBuffer(buf, len);
321
- #else
322
- this->errorInfo.set("node-canvas was built without SVG support");
323
- return CAIRO_STATUS_READ_ERROR;
324
- #endif
325
- }
326
-
327
- if (isBMP(buf, len))
328
- return loadBMPFromBuffer(buf, len);
329
-
330
- this->errorInfo.set("Unsupported image type");
331
- return CAIRO_STATUS_READ_ERROR;
332
- }
333
-
334
- /*
335
- * Load PNG data from `buf`.
336
- */
337
-
338
- cairo_status_t
339
- Image::loadPNGFromBuffer(uint8_t *buf) {
340
- read_closure_t closure{ env, 0, buf };
341
- _surface = cairo_image_surface_create_from_png_stream(readPNG, &closure);
342
- cairo_status_t status = cairo_surface_status(_surface);
343
- if (status) return status;
344
- return CAIRO_STATUS_SUCCESS;
345
- }
346
-
347
- /*
348
- * Read PNG data.
349
- */
350
-
351
- cairo_status_t
352
- Image::readPNG(void *c, uint8_t *data, unsigned int len) {
353
- read_closure_t *closure = (read_closure_t *) c;
354
- memcpy(data, closure->buf + closure->len, len);
355
- closure->len += len;
356
- return CAIRO_STATUS_SUCCESS;
357
- }
358
-
359
- /*
360
- * Destroy image and associated surface.
361
- */
362
-
363
- Image::~Image() {
364
- clearData();
365
- }
366
-
367
- /*
368
- * Initiate image loading.
369
- */
370
-
371
- cairo_status_t
372
- Image::load() {
373
- if (LOADING != state) {
374
- state = LOADING;
375
- return loadSurface();
376
- }
377
- return CAIRO_STATUS_READ_ERROR;
378
- }
379
-
380
- /*
381
- * Set state, assign dimensions.
382
- */
383
-
384
- void
385
- Image::loaded() {
386
- Napi::HandleScope scope(env);
387
- state = COMPLETE;
388
-
389
- width = naturalWidth = cairo_image_surface_get_width(_surface);
390
- height = naturalHeight = cairo_image_surface_get_height(_surface);
391
- _data_len = naturalHeight * cairo_image_surface_get_stride(_surface);
392
- Napi::MemoryManagement::AdjustExternalMemory(env, _data_len);
393
- }
394
-
395
- /*
396
- * Returns this image's surface.
397
- */
398
- cairo_surface_t *Image::surface() {
399
- #ifdef HAVE_RSVG
400
- if (_is_svg && (_svg_last_width != width || _svg_last_height != height)) {
401
- if (_surface != NULL) {
402
- cairo_surface_destroy(_surface);
403
- _surface = NULL;
404
- }
405
-
406
- cairo_status_t status = renderSVGToSurface();
407
- if (status != CAIRO_STATUS_SUCCESS) {
408
- g_object_unref(_rsvg);
409
- Napi::Error::New(env, cairo_status_to_string(status)).ThrowAsJavaScriptException();
410
-
411
- return NULL;
412
- }
413
- }
414
- #endif
415
- return _surface;
416
- }
417
-
418
- /*
419
- * Load cairo surface from the image src.
420
- *
421
- * TODO: support more formats
422
- * TODO: use node IO or at least thread pool
423
- */
424
-
425
- cairo_status_t
426
- Image::loadSurface() {
427
- FILE *stream = fopen(filename, "rb");
428
- if (!stream) {
429
- this->errorInfo.set(NULL, "fopen", errno, filename);
430
- return CAIRO_STATUS_READ_ERROR;
431
- }
432
- uint8_t buf[5];
433
- if (1 != fread(&buf, 5, 1, stream)) {
434
- fclose(stream);
435
- return CAIRO_STATUS_READ_ERROR;
436
- }
437
- rewind(stream);
438
-
439
- // png
440
- if (isPNG(buf)) {
441
- fclose(stream);
442
- return loadPNG();
443
- }
444
-
445
-
446
- if (isGIF(buf)) {
447
- #ifdef HAVE_GIF
448
- return loadGIF(stream);
449
- #else
450
- this->errorInfo.set("node-canvas was built without GIF support");
451
- return CAIRO_STATUS_READ_ERROR;
452
- #endif
453
- }
454
-
455
- if (isJPEG(buf)) {
456
- #ifdef HAVE_JPEG
457
- return loadJPEG(stream);
458
- #else
459
- this->errorInfo.set("node-canvas was built without JPEG support");
460
- return CAIRO_STATUS_READ_ERROR;
461
- #endif
462
- }
463
-
464
- // confirm svg using first 1000 chars
465
- // if a very long comment precedes the root <svg> tag, isSVG returns false
466
- uint8_t head[1000] = {0};
467
- fseek(stream, 0 , SEEK_END);
468
- long len = ftell(stream);
469
- unsigned head_len = (len < 1000 ? len : 1000);
470
- unsigned head_size = head_len * sizeof(uint8_t);
471
- rewind(stream);
472
- if (head_size != fread(&head, 1, head_size, stream)) {
473
- fclose(stream);
474
- return CAIRO_STATUS_READ_ERROR;
475
- }
476
- rewind(stream);
477
- if (isSVG(head, head_len)) {
478
- #ifdef HAVE_RSVG
479
- return loadSVG(stream);
480
- #else
481
- this->errorInfo.set("node-canvas was built without SVG support");
482
- return CAIRO_STATUS_READ_ERROR;
483
- #endif
484
- }
485
-
486
- if (isBMP(buf, 2))
487
- return loadBMP(stream);
488
-
489
- fclose(stream);
490
-
491
- this->errorInfo.set("Unsupported image type");
492
- return CAIRO_STATUS_READ_ERROR;
493
- }
494
-
495
- /*
496
- * Load PNG.
497
- */
498
-
499
- cairo_status_t
500
- Image::loadPNG() {
501
- _surface = cairo_image_surface_create_from_png(filename);
502
- return cairo_surface_status(_surface);
503
- }
504
-
505
- // GIF support
506
-
507
- #ifdef HAVE_GIF
508
-
509
- /*
510
- * Return the alpha color for `gif` at `frame`, or -1.
511
- */
512
-
513
- int
514
- get_gif_transparent_color(GifFileType *gif, int frame) {
515
- ExtensionBlock *ext = gif->SavedImages[frame].ExtensionBlocks;
516
- int len = gif->SavedImages[frame].ExtensionBlockCount;
517
- for (int x = 0; x < len; ++x, ++ext) {
518
- if ((ext->Function == GRAPHICS_EXT_FUNC_CODE) && (ext->Bytes[0] & 1)) {
519
- return ext->Bytes[3] == 0 ? 0 : (uint8_t) ext->Bytes[3];
520
- }
521
- }
522
- return -1;
523
- }
524
-
525
- /*
526
- * Memory GIF reader callback.
527
- */
528
-
529
- int
530
- read_gif_from_memory(GifFileType *gif, GifByteType *buf, int len) {
531
- gif_data_t *data = (gif_data_t *) gif->UserData;
532
- if ((data->pos + len) > data->len) len = data->len - data->pos;
533
- memcpy(buf, data->pos + data->buf, len);
534
- data->pos += len;
535
- return len;
536
- }
537
-
538
- /*
539
- * Load GIF.
540
- */
541
-
542
- cairo_status_t
543
- Image::loadGIF(FILE *stream) {
544
- struct stat s;
545
- int fd = fileno(stream);
546
-
547
- // stat
548
- if (fstat(fd, &s) < 0) {
549
- fclose(stream);
550
- return CAIRO_STATUS_READ_ERROR;
551
- }
552
-
553
- uint8_t *buf = (uint8_t *) malloc(s.st_size);
554
-
555
- if (!buf) {
556
- fclose(stream);
557
- this->errorInfo.set(NULL, "malloc", errno);
558
- return CAIRO_STATUS_NO_MEMORY;
559
- }
560
-
561
- size_t read = fread(buf, s.st_size, 1, stream);
562
- fclose(stream);
563
-
564
- cairo_status_t result = CAIRO_STATUS_READ_ERROR;
565
- if (1 == read) result = loadGIFFromBuffer(buf, s.st_size);
566
- free(buf);
567
-
568
- return result;
569
- }
570
-
571
- /*
572
- * Load give from `buf` and the given `len`.
573
- */
574
-
575
- cairo_status_t
576
- Image::loadGIFFromBuffer(uint8_t *buf, unsigned len) {
577
- int i = 0;
578
- GifFileType* gif;
579
-
580
- gif_data_t gifd = { buf, len, 0 };
581
-
582
- #if GIFLIB_MAJOR >= 5
583
- int errorcode;
584
- if ((gif = DGifOpen((void*) &gifd, read_gif_from_memory, &errorcode)) == NULL)
585
- return CAIRO_STATUS_READ_ERROR;
586
- #else
587
- if ((gif = DGifOpen((void*) &gifd, read_gif_from_memory)) == NULL)
588
- return CAIRO_STATUS_READ_ERROR;
589
- #endif
590
-
591
- if (GIF_OK != DGifSlurp(gif)) {
592
- GIF_CLOSE_FILE(gif);
593
- return CAIRO_STATUS_READ_ERROR;
594
- }
595
-
596
- if (gif->SWidth > canvas_max_side || gif->SHeight > canvas_max_side) {
597
- GIF_CLOSE_FILE(gif);
598
- return CAIRO_STATUS_INVALID_SIZE;
599
- }
600
-
601
- width = naturalWidth = gif->SWidth;
602
- height = naturalHeight = gif->SHeight;
603
-
604
- uint8_t *data = new uint8_t[naturalWidth * naturalHeight * 4];
605
- if (!data) {
606
- GIF_CLOSE_FILE(gif);
607
- this->errorInfo.set(NULL, "malloc", errno);
608
- return CAIRO_STATUS_NO_MEMORY;
609
- }
610
-
611
- GifImageDesc *img = &gif->SavedImages[i].ImageDesc;
612
-
613
- // local colormap takes precedence over global
614
- ColorMapObject *colormap = img->ColorMap
615
- ? img->ColorMap
616
- : gif->SColorMap;
617
-
618
- if (colormap == nullptr) {
619
- GIF_CLOSE_FILE(gif);
620
- return CAIRO_STATUS_READ_ERROR;
621
- }
622
-
623
- int bgColor = 0;
624
- int alphaColor = get_gif_transparent_color(gif, i);
625
- if (gif->SColorMap) bgColor = (uint8_t) gif->SBackGroundColor;
626
- else if(alphaColor >= 0) bgColor = alphaColor;
627
-
628
- uint8_t *src_data = (uint8_t*) gif->SavedImages[i].RasterBits;
629
- uint32_t *dst_data = (uint32_t*) data;
630
-
631
- if (!gif->Image.Interlace) {
632
- if (naturalWidth == img->Width && naturalHeight == img->Height) {
633
- for (int y = 0; y < naturalHeight; ++y) {
634
- for (int x = 0; x < naturalWidth; ++x) {
635
- *dst_data = ((*src_data == alphaColor) ? 0 : 255) << 24
636
- | colormap->Colors[*src_data].Red << 16
637
- | colormap->Colors[*src_data].Green << 8
638
- | colormap->Colors[*src_data].Blue;
639
-
640
- dst_data++;
641
- src_data++;
642
- }
643
- }
644
- } else {
645
- // Image does not take up whole "screen" so we need to fill-in the background
646
- int bottom = img->Top + img->Height;
647
- int right = img->Left + img->Width;
648
-
649
- uint32_t bgPixel =
650
- ((bgColor == alphaColor) ? 0 : 255) << 24
651
- | colormap->Colors[bgColor].Red << 16
652
- | colormap->Colors[bgColor].Green << 8
653
- | colormap->Colors[bgColor].Blue;
654
-
655
- for (int y = 0; y < naturalHeight; ++y) {
656
- for (int x = 0; x < naturalWidth; ++x) {
657
- if (y < img->Top || y >= bottom || x < img->Left || x >= right) {
658
- *dst_data = bgPixel;
659
- dst_data++;
660
- } else {
661
- *dst_data = ((*src_data == alphaColor) ? 0 : 255) << 24
662
- | colormap->Colors[*src_data].Red << 16
663
- | colormap->Colors[*src_data].Green << 8
664
- | colormap->Colors[*src_data].Blue;
665
- dst_data++;
666
- src_data++;
667
- }
668
- }
669
- }
670
- }
671
- } else {
672
- // Image is interlaced so that it streams nice over 14.4k and 28.8k modems :)
673
- // We first load in 1/8 of the image, followed by another 1/8, followed by
674
- // 1/4 and finally the remaining 1/2.
675
- int ioffs[] = { 0, 4, 2, 1 };
676
- int ijumps[] = { 8, 8, 4, 2 };
677
-
678
- uint8_t *src_ptr = src_data;
679
- uint32_t *dst_ptr;
680
-
681
- for(int z = 0; z < 4; z++) {
682
- for(int y = ioffs[z]; y < naturalHeight; y += ijumps[z]) {
683
- dst_ptr = dst_data + naturalWidth * y;
684
- for(int x = 0; x < naturalWidth; ++x) {
685
- *dst_ptr = ((*src_ptr == alphaColor) ? 0 : 255) << 24
686
- | (colormap->Colors[*src_ptr].Red) << 16
687
- | (colormap->Colors[*src_ptr].Green) << 8
688
- | (colormap->Colors[*src_ptr].Blue);
689
-
690
- dst_ptr++;
691
- src_ptr++;
692
- }
693
- }
694
- }
695
- }
696
-
697
- GIF_CLOSE_FILE(gif);
698
-
699
- // New image surface
700
- _surface = cairo_image_surface_create_for_data(
701
- data
702
- , CAIRO_FORMAT_ARGB32
703
- , naturalWidth
704
- , naturalHeight
705
- , cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, naturalWidth));
706
-
707
- cairo_status_t status = cairo_surface_status(_surface);
708
-
709
- if (status) {
710
- delete[] data;
711
- return status;
712
- }
713
-
714
- _data = data;
715
-
716
- return CAIRO_STATUS_SUCCESS;
717
- }
718
- #endif /* HAVE_GIF */
719
-
720
- // JPEG support
721
-
722
- #ifdef HAVE_JPEG
723
-
724
- // libjpeg 6.2 does not have jpeg_mem_src; define it ourselves here unless
725
- // libjpeg 8 is installed.
726
- #if JPEG_LIB_VERSION < 80 && !defined(MEM_SRCDST_SUPPORTED)
727
-
728
- /* Read JPEG image from a memory segment */
729
- static void
730
- init_source(j_decompress_ptr cinfo) {}
731
-
732
- static boolean
733
- fill_input_buffer(j_decompress_ptr cinfo) {
734
- ERREXIT(cinfo, JERR_INPUT_EMPTY);
735
- return TRUE;
736
- }
737
- static void
738
- skip_input_data(j_decompress_ptr cinfo, long num_bytes) {
739
- struct jpeg_source_mgr* src = (struct jpeg_source_mgr*) cinfo->src;
740
- if (num_bytes > 0) {
741
- src->next_input_byte += (size_t) num_bytes;
742
- src->bytes_in_buffer -= (size_t) num_bytes;
743
- }
744
- }
745
-
746
- static void term_source (j_decompress_ptr cinfo) {}
747
- static void jpeg_mem_src (j_decompress_ptr cinfo, void* buffer, long nbytes) {
748
- struct jpeg_source_mgr* src;
749
-
750
- if (cinfo->src == NULL) {
751
- cinfo->src = (struct jpeg_source_mgr *)
752
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
753
- sizeof(struct jpeg_source_mgr));
754
- }
755
-
756
- src = (struct jpeg_source_mgr*) cinfo->src;
757
- src->init_source = init_source;
758
- src->fill_input_buffer = fill_input_buffer;
759
- src->skip_input_data = skip_input_data;
760
- src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
761
- src->term_source = term_source;
762
- src->bytes_in_buffer = nbytes;
763
- src->next_input_byte = (JOCTET*)buffer;
764
- }
765
-
766
- #endif
767
-
768
- class BufferReader : public Image::Reader {
769
- public:
770
- BufferReader(uint8_t* buf, unsigned len) : _buf(buf), _len(len), _idx(0) {}
771
-
772
- bool hasBytes(unsigned n) const override { return (_idx + n - 1 < _len); }
773
-
774
- uint8_t getNext() override {
775
- return _buf[_idx++];
776
- }
777
-
778
- void skipBytes(unsigned n) override { _idx += n; }
779
-
780
- private:
781
- uint8_t* _buf; // we do not own this
782
- unsigned _len;
783
- unsigned _idx;
784
- };
785
-
786
- class StreamReader : public Image::Reader {
787
- public:
788
- StreamReader(FILE *stream) : _stream(stream), _len(0), _idx(0) {
789
- fseek(_stream, 0, SEEK_END);
790
- _len = ftell(_stream);
791
- fseek(_stream, 0, SEEK_SET);
792
- }
793
-
794
- bool hasBytes(unsigned n) const override { return (_idx + n - 1 < _len); }
795
-
796
- uint8_t getNext() override {
797
- ++_idx;
798
- return getc(_stream);
799
- }
800
-
801
- void skipBytes(unsigned n) override {
802
- _idx += n;
803
- fseek(_stream, _idx, SEEK_SET);
804
- }
805
-
806
- private:
807
- FILE* _stream;
808
- unsigned _len;
809
- unsigned _idx;
810
- };
811
-
812
- void Image::jpegToARGB(jpeg_decompress_struct* args, uint8_t* data, uint8_t* src, JPEGDecodeL decode) {
813
- int stride = naturalWidth * 4;
814
- for (int y = 0; y < naturalHeight; ++y) {
815
- jpeg_read_scanlines(args, &src, 1);
816
- uint32_t *row = (uint32_t*)(data + stride * y);
817
- for (int x = 0; x < naturalWidth; ++x) {
818
- int bx = args->output_components * x;
819
- row[x] = decode(src + bx);
820
- }
821
- }
822
- }
823
-
824
- /*
825
- * Takes an initialised jpeg_decompress_struct and decodes the
826
- * data into _surface.
827
- */
828
-
829
- cairo_status_t
830
- Image::decodeJPEGIntoSurface(jpeg_decompress_struct *args, Orientation orientation) {
831
- const int channels = 4;
832
- cairo_status_t status = CAIRO_STATUS_SUCCESS;
833
-
834
- uint8_t *data = new uint8_t[naturalWidth * naturalHeight * channels];
835
- if (!data) {
836
- jpeg_abort_decompress(args);
837
- jpeg_destroy_decompress(args);
838
- this->errorInfo.set(NULL, "malloc", errno);
839
- return CAIRO_STATUS_NO_MEMORY;
840
- }
841
-
842
- uint8_t *src = new uint8_t[naturalWidth * args->output_components];
843
- if (!src) {
844
- free(data);
845
- jpeg_abort_decompress(args);
846
- jpeg_destroy_decompress(args);
847
- this->errorInfo.set(NULL, "malloc", errno);
848
- return CAIRO_STATUS_NO_MEMORY;
849
- }
850
-
851
- // These are the three main cases to handle. libjpeg converts YCCK to CMYK
852
- // and YCbCr to RGB by default.
853
- switch (args->out_color_space) {
854
- case JCS_CMYK:
855
- jpegToARGB(args, data, src, [](uint8_t const* src) {
856
- uint16_t k = static_cast<uint16_t>(src[3]);
857
- uint8_t r = k * src[0] / 255;
858
- uint8_t g = k * src[1] / 255;
859
- uint8_t b = k * src[2] / 255;
860
- return 255 << 24 | r << 16 | g << 8 | b;
861
- });
862
- break;
863
- case JCS_RGB:
864
- jpegToARGB(args, data, src, [](uint8_t const* src) {
865
- uint8_t r = src[0], g = src[1], b = src[2];
866
- return 255 << 24 | r << 16 | g << 8 | b;
867
- });
868
- break;
869
- case JCS_GRAYSCALE:
870
- jpegToARGB(args, data, src, [](uint8_t const* src) {
871
- uint8_t v = src[0];
872
- return 255 << 24 | v << 16 | v << 8 | v;
873
- });
874
- break;
875
- default:
876
- this->errorInfo.set("Unsupported JPEG encoding");
877
- status = CAIRO_STATUS_READ_ERROR;
878
- break;
879
- }
880
-
881
- updateDimensionsForOrientation(orientation);
882
-
883
- if (!status) {
884
- _surface = cairo_image_surface_create_for_data(
885
- data
886
- , CAIRO_FORMAT_ARGB32
887
- , naturalWidth
888
- , naturalHeight
889
- , cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, naturalWidth));
890
- }
891
-
892
- jpeg_finish_decompress(args);
893
- jpeg_destroy_decompress(args);
894
- status = cairo_surface_status(_surface);
895
-
896
- rotatePixels(data, naturalWidth, naturalHeight, channels, orientation);
897
-
898
- delete[] src;
899
-
900
- if (status) {
901
- delete[] data;
902
- return status;
903
- }
904
-
905
- _data = data;
906
-
907
- return CAIRO_STATUS_SUCCESS;
908
- }
909
-
910
- /*
911
- * Callback to recover from jpeg errors
912
- */
913
-
914
- static void canvas_jpeg_error_exit(j_common_ptr cinfo) {
915
- canvas_jpeg_error_mgr *cjerr = static_cast<canvas_jpeg_error_mgr*>(cinfo->err);
916
- cjerr->output_message(cinfo);
917
- // Return control to the setjmp point
918
- longjmp(cjerr->setjmp_buffer, 1);
919
- }
920
-
921
- // Capture libjpeg errors instead of writing stdout
922
- static void canvas_jpeg_output_message(j_common_ptr cinfo) {
923
- canvas_jpeg_error_mgr *cjerr = static_cast<canvas_jpeg_error_mgr*>(cinfo->err);
924
- char buff[JMSG_LENGTH_MAX];
925
- cjerr->format_message(cinfo, buff);
926
- // (Only the last message will be returned to JS land.)
927
- cjerr->image->errorInfo.set(buff);
928
- }
929
-
930
- /*
931
- * Takes a jpeg data buffer and assigns it as mime data to a
932
- * dummy surface
933
- */
934
-
935
- cairo_status_t
936
- Image::decodeJPEGBufferIntoMimeSurface(uint8_t *buf, unsigned len) {
937
- // TODO: remove this duplicate logic
938
- // JPEG setup
939
- struct jpeg_decompress_struct args;
940
- struct canvas_jpeg_error_mgr err;
941
-
942
- err.image = this;
943
- args.err = jpeg_std_error(&err);
944
- args.err->error_exit = canvas_jpeg_error_exit;
945
- args.err->output_message = canvas_jpeg_output_message;
946
-
947
- // Establish the setjmp return context for canvas_jpeg_error_exit to use
948
- if (setjmp(err.setjmp_buffer)) {
949
- // If we get here, the JPEG code has signaled an error.
950
- // We need to clean up the JPEG object, close the input file, and return.
951
- jpeg_destroy_decompress(&args);
952
- return CAIRO_STATUS_READ_ERROR;
953
- }
954
-
955
- jpeg_create_decompress(&args);
956
-
957
- jpeg_mem_src(&args, buf, len);
958
-
959
- jpeg_read_header(&args, 1);
960
- jpeg_start_decompress(&args);
961
- width = naturalWidth = args.output_width;
962
- height = naturalHeight = args.output_height;
963
-
964
- // Data alloc
965
- // 8 pixels per byte using Alpha Channel format to reduce memory requirement.
966
- int buf_size = naturalHeight * cairo_format_stride_for_width(CAIRO_FORMAT_A1, naturalWidth);
967
- uint8_t *data = new uint8_t[buf_size];
968
- if (!data) {
969
- this->errorInfo.set(NULL, "malloc", errno);
970
- return CAIRO_STATUS_NO_MEMORY;
971
- }
972
-
973
- BufferReader reader(buf, len);
974
- Orientation orientation = getExifOrientation(reader);
975
- updateDimensionsForOrientation(orientation);
976
-
977
- // New image surface
978
- _surface = cairo_image_surface_create_for_data(
979
- data
980
- , CAIRO_FORMAT_A1
981
- , naturalWidth
982
- , naturalHeight
983
- , cairo_format_stride_for_width(CAIRO_FORMAT_A1, naturalWidth));
984
-
985
- // Cleanup
986
- jpeg_abort_decompress(&args);
987
- jpeg_destroy_decompress(&args);
988
- cairo_status_t status = cairo_surface_status(_surface);
989
-
990
- if (status) {
991
- delete[] data;
992
- return status;
993
- }
994
-
995
- rotatePixels(data, naturalWidth, naturalHeight, 1, orientation);
996
-
997
- _data = data;
998
-
999
- return assignDataAsMime(buf, len, CAIRO_MIME_TYPE_JPEG);
1000
- }
1001
-
1002
- /*
1003
- * Helper function for disposing of a mime data closure.
1004
- */
1005
-
1006
- void
1007
- clearMimeData(void *closure) {
1008
- Napi::MemoryManagement::AdjustExternalMemory(
1009
- static_cast<read_closure_t *>(closure)->env,
1010
- -static_cast<int>((static_cast<read_closure_t *>(closure)->len)));
1011
- free(static_cast<read_closure_t *>(closure)->buf);
1012
- free(closure);
1013
- }
1014
-
1015
- /*
1016
- * Assign a given buffer as mime data against the surface.
1017
- * The provided buffer will be copied, and the copy will
1018
- * be automatically freed when the surface is destroyed.
1019
- */
1020
-
1021
- cairo_status_t
1022
- Image::assignDataAsMime(uint8_t *data, int len, const char *mime_type) {
1023
- uint8_t *mime_data = (uint8_t *) malloc(len);
1024
- if (!mime_data) {
1025
- this->errorInfo.set(NULL, "malloc", errno);
1026
- return CAIRO_STATUS_NO_MEMORY;
1027
- }
1028
-
1029
- read_closure_t *mime_closure = (read_closure_t *) malloc(sizeof(read_closure_t));
1030
- if (!mime_closure) {
1031
- free(mime_data);
1032
- this->errorInfo.set(NULL, "malloc", errno);
1033
- return CAIRO_STATUS_NO_MEMORY;
1034
- }
1035
-
1036
- memcpy(mime_data, data, len);
1037
-
1038
- mime_closure->env = env;
1039
- mime_closure->buf = mime_data;
1040
- mime_closure->len = len;
1041
-
1042
- Napi::MemoryManagement::AdjustExternalMemory(env, len);
1043
-
1044
- return cairo_surface_set_mime_data(_surface
1045
- , mime_type
1046
- , mime_data
1047
- , len
1048
- , clearMimeData
1049
- , mime_closure);
1050
- }
1051
-
1052
- /*
1053
- * Load jpeg from buffer.
1054
- */
1055
-
1056
- cairo_status_t
1057
- Image::loadJPEGFromBuffer(uint8_t *buf, unsigned len) {
1058
- BufferReader reader(buf, len);
1059
- Orientation orientation = getExifOrientation(reader);
1060
-
1061
- // TODO: remove this duplicate logic
1062
- // JPEG setup
1063
- struct jpeg_decompress_struct args;
1064
- struct canvas_jpeg_error_mgr err;
1065
-
1066
- err.image = this;
1067
- args.err = jpeg_std_error(&err);
1068
- args.err->error_exit = canvas_jpeg_error_exit;
1069
- args.err->output_message = canvas_jpeg_output_message;
1070
-
1071
- // Establish the setjmp return context for canvas_jpeg_error_exit to use
1072
- if (setjmp(err.setjmp_buffer)) {
1073
- // If we get here, the JPEG code has signaled an error.
1074
- // We need to clean up the JPEG object, close the input file, and return.
1075
- jpeg_destroy_decompress(&args);
1076
- return CAIRO_STATUS_READ_ERROR;
1077
- }
1078
-
1079
- jpeg_create_decompress(&args);
1080
-
1081
- jpeg_mem_src(&args, buf, len);
1082
-
1083
- jpeg_read_header(&args, 1);
1084
- jpeg_start_decompress(&args);
1085
- width = naturalWidth = args.output_width;
1086
- height = naturalHeight = args.output_height;
1087
-
1088
- return decodeJPEGIntoSurface(&args, orientation);
1089
- }
1090
-
1091
- /*
1092
- * Load JPEG, convert RGB to ARGB.
1093
- */
1094
-
1095
- cairo_status_t
1096
- Image::loadJPEG(FILE *stream) {
1097
- cairo_status_t status;
1098
-
1099
- #if defined(_MSC_VER)
1100
- if (false) { // Force using loadJPEGFromBuffer
1101
- #else
1102
- if (data_mode == DATA_IMAGE) { // Can lazily read in the JPEG.
1103
- #endif
1104
- Orientation orientation = NORMAL;
1105
- {
1106
- StreamReader reader(stream);
1107
- orientation = getExifOrientation(reader);
1108
- rewind(stream);
1109
- }
1110
-
1111
- // JPEG setup
1112
- struct jpeg_decompress_struct args;
1113
- struct canvas_jpeg_error_mgr err;
1114
-
1115
- err.image = this;
1116
- args.err = jpeg_std_error(&err);
1117
- args.err->error_exit = canvas_jpeg_error_exit;
1118
- args.err->output_message = canvas_jpeg_output_message;
1119
-
1120
- // Establish the setjmp return context for canvas_jpeg_error_exit to use
1121
- if (setjmp(err.setjmp_buffer)) {
1122
- // If we get here, the JPEG code has signaled an error.
1123
- // We need to clean up the JPEG object, close the input file, and return.
1124
- jpeg_destroy_decompress(&args);
1125
- return CAIRO_STATUS_READ_ERROR;
1126
- }
1127
-
1128
- jpeg_create_decompress(&args);
1129
-
1130
- jpeg_stdio_src(&args, stream);
1131
-
1132
- jpeg_read_header(&args, 1);
1133
- jpeg_start_decompress(&args);
1134
-
1135
- if (args.output_width > canvas_max_side || args.output_height > canvas_max_side) {
1136
- jpeg_destroy_decompress(&args);
1137
- return CAIRO_STATUS_INVALID_SIZE;
1138
- }
1139
-
1140
- width = naturalWidth = args.output_width;
1141
- height = naturalHeight = args.output_height;
1142
-
1143
- status = decodeJPEGIntoSurface(&args, orientation);
1144
- fclose(stream);
1145
- } else { // We'll need the actual source jpeg data, so read fully.
1146
- uint8_t *buf;
1147
- unsigned len;
1148
-
1149
- fseek(stream, 0, SEEK_END);
1150
- len = ftell(stream);
1151
- fseek(stream, 0, SEEK_SET);
1152
-
1153
- buf = (uint8_t *) malloc(len);
1154
- if (!buf) {
1155
- this->errorInfo.set(NULL, "malloc", errno);
1156
- return CAIRO_STATUS_NO_MEMORY;
1157
- }
1158
-
1159
- if (fread(buf, len, 1, stream) != 1) {
1160
- status = CAIRO_STATUS_READ_ERROR;
1161
- } else if ((DATA_IMAGE | DATA_MIME) == data_mode) {
1162
- status = loadJPEGFromBuffer(buf, len);
1163
- if (!status) status = assignDataAsMime(buf, len, CAIRO_MIME_TYPE_JPEG);
1164
- } else if (DATA_MIME == data_mode) {
1165
- status = decodeJPEGBufferIntoMimeSurface(buf, len);
1166
- }
1167
- #if defined(_MSC_VER)
1168
- else if (DATA_IMAGE == data_mode) {
1169
- status = loadJPEGFromBuffer(buf, len);
1170
- }
1171
- #endif
1172
- else {
1173
- status = CAIRO_STATUS_READ_ERROR;
1174
- }
1175
-
1176
- fclose(stream);
1177
- free(buf);
1178
- }
1179
-
1180
- return status;
1181
- }
1182
-
1183
- /*
1184
- * Returns the Exif orientation if one exists, otherwise returns NORMAL
1185
- */
1186
-
1187
- Image::Orientation
1188
- Image::getExifOrientation(Reader& jpeg) {
1189
- static const char kJpegStartOfImage = (char)0xd8;
1190
- static const char kJpegStartOfFrameBaseline = (char)0xc0;
1191
- static const char kJpegStartOfFrameProgressive = (char)0xc2;
1192
- static const char kJpegHuffmanTable = (char)0xc4;
1193
- static const char kJpegQuantizationTable = (char)0xdb;
1194
- static const char kJpegRestartInterval = (char)0xdd;
1195
- static const char kJpegComment = (char)0xfe;
1196
- static const char kJpegStartOfScan = (char)0xda;
1197
- static const char kJpegApp0 = (char)0xe0;
1198
- static const char kJpegApp1 = (char)0xe1;
1199
-
1200
- // Find the Exif tag (if it exists)
1201
- int exif_len = 0;
1202
- bool done = false;
1203
- while (!done && jpeg.hasBytes(1)) {
1204
- while (jpeg.hasBytes(1) && jpeg.getNext() != 0xff) {
1205
- // noop
1206
- }
1207
- if (jpeg.hasBytes(1)) {
1208
- char tag = jpeg.getNext();
1209
- switch (tag) {
1210
- case kJpegStartOfImage:
1211
- break; // beginning of file, no extra bytes
1212
- case kJpegRestartInterval:
1213
- jpeg.skipBytes(4);
1214
- break;
1215
- case kJpegStartOfFrameBaseline:
1216
- case kJpegStartOfFrameProgressive:
1217
- case kJpegHuffmanTable:
1218
- case kJpegQuantizationTable:
1219
- case kJpegComment:
1220
- case kJpegApp0:
1221
- case kJpegApp1: {
1222
- if (jpeg.hasBytes(2)) {
1223
- uint16_t tag_len = 0;
1224
- tag_len |= jpeg.getNext() << 8;
1225
- tag_len |= jpeg.getNext();
1226
- // The tag length includes the two bytes for the length
1227
- uint16_t tag_content_len = std::max(0, tag_len - 2);
1228
- if (tag != kJpegApp1 || !jpeg.hasBytes(tag_content_len)) {
1229
- jpeg.skipBytes(tag_content_len); // skip JPEG tags we ignore.
1230
- } else if (!jpeg.hasBytes(6)) {
1231
- jpeg.skipBytes(tag_content_len); // too short to have "Exif\0\0"
1232
- } else {
1233
- if (jpeg.getNext() == 'E' && jpeg.getNext() == 'x' &&
1234
- jpeg.getNext() == 'i' && jpeg.getNext() == 'f' &&
1235
- jpeg.getNext() == '\0' && jpeg.getNext() == '\0') {
1236
- exif_len = tag_content_len - 6;
1237
- done = true;
1238
- } else {
1239
- jpeg.skipBytes(tag_content_len); // too short to have "Exif\0\0"
1240
- }
1241
- }
1242
- } else {
1243
- done = true; // shouldn't happen: corrupt file or we have a bug
1244
- }
1245
- break;
1246
- }
1247
- case kJpegStartOfScan:
1248
- default:
1249
- done = true; // got to the image, apparently no exif tags here
1250
- break;
1251
- }
1252
- }
1253
- }
1254
-
1255
- // Parse exif if it exists. If it does, we have already checked that jpeglen
1256
- // is longer than exifStart + exifLen, so we can safely index the data
1257
- if (exif_len > 0) {
1258
- // The first two bytes of TIFF header are "II" if little-endian ("Intel")
1259
- // and "MM" if big-endian ("Motorola")
1260
- const bool isLE = (jpeg.getNext() == 'I');
1261
- jpeg.skipBytes(3); // +1 for the other I/M, +2 for 0x002a
1262
-
1263
- auto readUint16Little = [](Reader &jpeg) -> uint32_t {
1264
- uint16_t val = uint16_t(jpeg.getNext());
1265
- val |= uint16_t(jpeg.getNext()) << 8;
1266
- return val;
1267
- };
1268
- auto readUint32Little = [](Reader &jpeg) -> uint32_t {
1269
- uint32_t val = uint32_t(jpeg.getNext());
1270
- val |= uint32_t(jpeg.getNext()) << 8;
1271
- val |= uint32_t(jpeg.getNext()) << 16;
1272
- val |= uint32_t(jpeg.getNext()) << 24;
1273
- return val;
1274
- };
1275
- auto readUint16Big = [](Reader &jpeg) -> uint32_t {
1276
- uint16_t val = uint16_t(jpeg.getNext()) << 8;
1277
- val |= uint16_t(jpeg.getNext());
1278
- return val;
1279
- };
1280
- auto readUint32Big = [](Reader &jpeg) -> uint32_t {
1281
- uint32_t val = uint32_t(jpeg.getNext()) << 24;
1282
- val |= uint32_t(jpeg.getNext()) << 16;
1283
- val |= uint32_t(jpeg.getNext()) << 8;
1284
- val |= uint32_t(jpeg.getNext());
1285
- return val;
1286
- };
1287
- // The first two bytes of TIFF header are "II" if little-endian ("Intel")
1288
- // and "MM" if big-endian ("Motorola")
1289
- auto readUint32 = [readUint32Little, readUint32Big, isLE](Reader &jpeg) -> uint32_t {
1290
- return isLE ? readUint32Little(jpeg) : readUint32Big(jpeg);
1291
- };
1292
- auto readUint16 = [readUint16Little, readUint16Big, isLE](Reader &jpeg) -> uint32_t {
1293
- return isLE ? readUint16Little(jpeg) : readUint16Big(jpeg);
1294
- };
1295
- // offset to the IFD0 (offset from beginning of TIFF header, II/MM,
1296
- // which is 8 bytes before where we are after reading the uint32)
1297
- jpeg.skipBytes(readUint32(jpeg) - 8);
1298
-
1299
- // Read the IFD0 ("Image File Directory 0")
1300
- // | NN | n entries in directory (2 bytes)
1301
- // | TT | tt | nnnn | vvvv | entry: tag (2b), data type (2b),
1302
- // n components (4b), value/offset (4b)
1303
- if (jpeg.hasBytes(2)) {
1304
- uint16_t nEntries = readUint16(jpeg);
1305
- for (uint16_t i = 0; i < nEntries && jpeg.hasBytes(2); ++i) {
1306
- uint16_t tag = readUint16(jpeg);
1307
- // The entry is 12 bytes. We already read the 2 bytes for the tag.
1308
- jpeg.skipBytes(6); // skip 2 for the data type, skip 4 n components.
1309
- if (tag == 0x112) {
1310
- switch (readUint16(jpeg)) { // orientation tag is always one uint16
1311
- case 1: return NORMAL;
1312
- case 2: return MIRROR_HORIZ;
1313
- case 3: return ROTATE_180;
1314
- case 4: return MIRROR_VERT;
1315
- case 5: return MIRROR_HORIZ_AND_ROTATE_270_CW;
1316
- case 6: return ROTATE_90_CW;
1317
- case 7: return MIRROR_HORIZ_AND_ROTATE_90_CW;
1318
- case 8: return ROTATE_270_CW;
1319
- default: return NORMAL;
1320
- }
1321
- } else {
1322
- jpeg.skipBytes(4); // skip the four bytes for the value
1323
- }
1324
- }
1325
- }
1326
- }
1327
-
1328
- return NORMAL;
1329
- }
1330
-
1331
- /*
1332
- * Updates the dimensions of the bitmap according to the orientation
1333
- */
1334
-
1335
- void Image::updateDimensionsForOrientation(Orientation orientation) {
1336
- switch (orientation) {
1337
- case ROTATE_90_CW:
1338
- case ROTATE_270_CW:
1339
- case MIRROR_HORIZ_AND_ROTATE_90_CW:
1340
- case MIRROR_HORIZ_AND_ROTATE_270_CW: {
1341
- int tmp = naturalWidth;
1342
- naturalWidth = naturalHeight;
1343
- naturalHeight = tmp;
1344
- tmp = width;
1345
- width = height;
1346
- height = tmp;
1347
- break;
1348
- }
1349
- case NORMAL:
1350
- case MIRROR_HORIZ:
1351
- case MIRROR_VERT:
1352
- case ROTATE_180:
1353
- default: {
1354
- break;
1355
- }
1356
- }
1357
- }
1358
-
1359
- /*
1360
- * Rotates the pixels to the correct orientation.
1361
- */
1362
-
1363
- void
1364
- Image::rotatePixels(uint8_t* pixels, int width, int height, int channels,
1365
- Orientation orientation) {
1366
- auto swapPixel = [channels](uint8_t* pixels, int src_idx, int dst_idx) {
1367
- uint8_t tmp;
1368
- for (int i = 0; i < channels; ++i) {
1369
- tmp = pixels[src_idx + i];
1370
- pixels[src_idx + i] = pixels[dst_idx + i];
1371
- pixels[dst_idx + i] = tmp;
1372
- }
1373
- };
1374
-
1375
- auto mirrorHoriz = [swapPixel](uint8_t* pixels, int width, int height, int channels) {
1376
- int midX = width / 2; // ok to truncate if odd, since we don't swap a center pixel
1377
- for (int y = 0; y < height; ++y) {
1378
- for (int x = 0; x < midX; ++x) {
1379
- int orig_idx = (y * width + x) * channels;
1380
- int new_idx = (y * width + width - 1 - x) * channels;
1381
- swapPixel(pixels, orig_idx, new_idx);
1382
- }
1383
- }
1384
- };
1385
-
1386
- auto mirrorVert = [swapPixel](uint8_t* pixels, int width, int height, int channels) {
1387
- int midY = height / 2; // ok to truncate if odd, since we don't swap a center pixel
1388
- for (int y = 0; y < midY; ++y) {
1389
- for (int x = 0; x < width; ++x) {
1390
- int orig_idx = (y * width + x) * channels;
1391
- int new_idx = ((height - y - 1) * width + x) * channels;
1392
- swapPixel(pixels, orig_idx, new_idx);
1393
- }
1394
- }
1395
- };
1396
-
1397
- auto rotate90 = [](uint8_t* pixels, int width, int height, int channels) {
1398
- const int n_bytes = width * height * channels;
1399
- uint8_t *unrotated = new uint8_t[n_bytes];
1400
- if (!unrotated) {
1401
- return;
1402
- }
1403
- std::memcpy(unrotated, pixels, n_bytes);
1404
- for (int y = 0; y < height; ++y) {
1405
- for (int x = 0; x < width ; ++x) {
1406
- int orig_idx = (y * width + x) * channels;
1407
- int new_idx = (x * height + height - 1 - y) * channels;
1408
- std::memcpy(pixels + new_idx, unrotated + orig_idx, channels);
1409
- }
1410
- }
1411
- };
1412
-
1413
- auto rotate270 = [](uint8_t* pixels, int width, int height, int channels) {
1414
- const int n_bytes = width * height * channels;
1415
- uint8_t *unrotated = new uint8_t[n_bytes];
1416
- if (!unrotated) {
1417
- return;
1418
- }
1419
- std::memcpy(unrotated, pixels, n_bytes);
1420
- for (int y = 0; y < height; ++y) {
1421
- for (int x = 0; x < width ; ++x) {
1422
- int orig_idx = (y * width + x) * channels;
1423
- int new_idx = ((width - 1 - x) * height + y) * channels;
1424
- std::memcpy(pixels + new_idx, unrotated + orig_idx, channels);
1425
- }
1426
- }
1427
- };
1428
-
1429
- switch (orientation) {
1430
- case MIRROR_HORIZ:
1431
- mirrorHoriz(pixels, width, height, channels);
1432
- break;
1433
- case MIRROR_VERT:
1434
- mirrorVert(pixels, width, height, channels);
1435
- break;
1436
- case ROTATE_180:
1437
- mirrorHoriz(pixels, width, height, channels);
1438
- mirrorVert(pixels, width, height, channels);
1439
- break;
1440
- case ROTATE_90_CW:
1441
- rotate90(pixels, height, width, channels); // swap w/h because we need orig w/h
1442
- break;
1443
- case ROTATE_270_CW:
1444
- rotate270(pixels, height, width, channels); // swap w/h because we need orig w/h
1445
- break;
1446
- case MIRROR_HORIZ_AND_ROTATE_90_CW:
1447
- mirrorHoriz(pixels, height, width, channels); // swap w/h because we need orig w/h
1448
- rotate90(pixels, height, width, channels);
1449
- break;
1450
- case MIRROR_HORIZ_AND_ROTATE_270_CW:
1451
- mirrorHoriz(pixels, height, width, channels); // swap w/h because we need orig w/h
1452
- rotate270(pixels, height, width, channels);
1453
- break;
1454
- case NORMAL:
1455
- default:
1456
- break;
1457
- }
1458
- }
1459
-
1460
- #endif /* HAVE_JPEG */
1461
-
1462
- #ifdef HAVE_RSVG
1463
-
1464
- /*
1465
- * Load SVG from buffer
1466
- */
1467
-
1468
- cairo_status_t
1469
- Image::loadSVGFromBuffer(uint8_t *buf, unsigned len) {
1470
- _is_svg = true;
1471
-
1472
- if (NULL == (_rsvg = rsvg_handle_new_from_data(buf, len, nullptr))) {
1473
- return CAIRO_STATUS_READ_ERROR;
1474
- }
1475
-
1476
- double d_width;
1477
- double d_height;
1478
-
1479
- rsvg_handle_get_intrinsic_size_in_pixels(_rsvg, &d_width, &d_height);
1480
-
1481
- width = naturalWidth = d_width;
1482
- height = naturalHeight = d_height;
1483
-
1484
- if (width <= 0 || height <= 0) {
1485
- this->errorInfo.set("Width and height must be set on the svg element");
1486
- return CAIRO_STATUS_READ_ERROR;
1487
- }
1488
-
1489
- return renderSVGToSurface();
1490
- }
1491
-
1492
- /*
1493
- * Renders the Rsvg handle to this image's surface
1494
- */
1495
- cairo_status_t
1496
- Image::renderSVGToSurface() {
1497
- cairo_status_t status;
1498
-
1499
- _surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
1500
-
1501
- status = cairo_surface_status(_surface);
1502
- if (status != CAIRO_STATUS_SUCCESS) {
1503
- g_object_unref(_rsvg);
1504
- return status;
1505
- }
1506
-
1507
- cairo_t *cr = cairo_create(_surface);
1508
- status = cairo_status(cr);
1509
- if (status != CAIRO_STATUS_SUCCESS) {
1510
- g_object_unref(_rsvg);
1511
- return status;
1512
- }
1513
-
1514
- RsvgRectangle viewport = {
1515
- 0, // x
1516
- 0, // y
1517
- static_cast<double>(width),
1518
- static_cast<double>(height)
1519
- };
1520
- gboolean render_ok = rsvg_handle_render_document(_rsvg, cr, &viewport, nullptr);
1521
- if (!render_ok) {
1522
- g_object_unref(_rsvg);
1523
- cairo_destroy(cr);
1524
- return CAIRO_STATUS_READ_ERROR; // or WRITE?
1525
- }
1526
-
1527
- cairo_destroy(cr);
1528
-
1529
- _svg_last_width = width;
1530
- _svg_last_height = height;
1531
-
1532
- return status;
1533
- }
1534
-
1535
- /*
1536
- * Load SVG
1537
- */
1538
-
1539
- cairo_status_t
1540
- Image::loadSVG(FILE *stream) {
1541
- _is_svg = true;
1542
-
1543
- struct stat s;
1544
- int fd = fileno(stream);
1545
-
1546
- // stat
1547
- if (fstat(fd, &s) < 0) {
1548
- fclose(stream);
1549
- return CAIRO_STATUS_READ_ERROR;
1550
- }
1551
-
1552
- uint8_t *buf = (uint8_t *) malloc(s.st_size);
1553
-
1554
- if (!buf) {
1555
- fclose(stream);
1556
- return CAIRO_STATUS_NO_MEMORY;
1557
- }
1558
-
1559
- size_t read = fread(buf, s.st_size, 1, stream);
1560
- fclose(stream);
1561
-
1562
- cairo_status_t result = CAIRO_STATUS_READ_ERROR;
1563
- if (1 == read) result = loadSVGFromBuffer(buf, s.st_size);
1564
- free(buf);
1565
-
1566
- return result;
1567
- }
1568
-
1569
- #endif /* HAVE_RSVG */
1570
-
1571
- /*
1572
- * Load BMP from buffer.
1573
- */
1574
-
1575
- cairo_status_t Image::loadBMPFromBuffer(uint8_t *buf, unsigned len){
1576
- BMPParser::Parser parser;
1577
-
1578
- // Reversed ARGB32 with pre-multiplied alpha
1579
- uint8_t pixFmt[5] = {2, 1, 0, 3, 1};
1580
- parser.parse(buf, len, pixFmt);
1581
-
1582
- if (parser.getStatus() != BMPParser::Status::OK) {
1583
- errorInfo.reset();
1584
- errorInfo.message = parser.getErrMsg();
1585
- return CAIRO_STATUS_READ_ERROR;
1586
- }
1587
-
1588
- width = naturalWidth = parser.getWidth();
1589
- height = naturalHeight = parser.getHeight();
1590
- uint8_t *data = parser.getImgd();
1591
-
1592
- _surface = cairo_image_surface_create_for_data(
1593
- data,
1594
- CAIRO_FORMAT_ARGB32,
1595
- width,
1596
- height,
1597
- cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width)
1598
- );
1599
-
1600
- // No need to delete the data
1601
- cairo_status_t status = cairo_surface_status(_surface);
1602
- if (status) return status;
1603
-
1604
- _data = data;
1605
- parser.clearImgd();
1606
-
1607
- return CAIRO_STATUS_SUCCESS;
1608
- }
1609
-
1610
- /*
1611
- * Load BMP.
1612
- */
1613
-
1614
- cairo_status_t Image::loadBMP(FILE *stream){
1615
- struct stat s;
1616
- int fd = fileno(stream);
1617
-
1618
- // Stat
1619
- if (fstat(fd, &s) < 0) {
1620
- fclose(stream);
1621
- return CAIRO_STATUS_READ_ERROR;
1622
- }
1623
-
1624
- uint8_t *buf = new uint8_t[s.st_size];
1625
-
1626
- if (!buf) {
1627
- fclose(stream);
1628
- errorInfo.set(NULL, "malloc", errno);
1629
- return CAIRO_STATUS_NO_MEMORY;
1630
- }
1631
-
1632
- size_t read = fread(buf, s.st_size, 1, stream);
1633
- fclose(stream);
1634
-
1635
- cairo_status_t result = CAIRO_STATUS_READ_ERROR;
1636
- if (read == 1) result = loadBMPFromBuffer(buf, s.st_size);
1637
- delete[] buf;
1638
-
1639
- return result;
1640
- }
1641
-
1642
- /*
1643
- * Return UNKNOWN, SVG, GIF, JPEG, or PNG based on the filename.
1644
- */
1645
-
1646
- Image::type
1647
- Image::extension(const char *filename) {
1648
- size_t len = strlen(filename);
1649
- filename += len;
1650
- if (len >= 5 && 0 == strcmp(".jpeg", filename - 5)) return Image::JPEG;
1651
- if (len >= 4 && 0 == strcmp(".gif", filename - 4)) return Image::GIF;
1652
- if (len >= 4 && 0 == strcmp(".jpg", filename - 4)) return Image::JPEG;
1653
- if (len >= 4 && 0 == strcmp(".png", filename - 4)) return Image::PNG;
1654
- if (len >= 4 && 0 == strcmp(".svg", filename - 4)) return Image::SVG;
1655
- return Image::UNKNOWN;
1656
- }
1657
-
1658
- /*
1659
- * Sniff bytes 0..1 for JPEG's magic number ff d8.
1660
- */
1661
-
1662
- int
1663
- Image::isJPEG(uint8_t *data) {
1664
- return 0xff == data[0] && 0xd8 == data[1];
1665
- }
1666
-
1667
- /*
1668
- * Sniff bytes 0..2 for "GIF".
1669
- */
1670
-
1671
- int
1672
- Image::isGIF(uint8_t *data) {
1673
- return 'G' == data[0] && 'I' == data[1] && 'F' == data[2];
1674
- }
1675
-
1676
- /*
1677
- * Sniff bytes 1..3 for "PNG".
1678
- */
1679
-
1680
- int
1681
- Image::isPNG(uint8_t *data) {
1682
- return 'P' == data[1] && 'N' == data[2] && 'G' == data[3];
1683
- }
1684
-
1685
- /*
1686
- * Skip "<?" and "<!" tags to test if root tag starts "<svg"
1687
- */
1688
- int
1689
- Image::isSVG(uint8_t *data, unsigned len) {
1690
- for (unsigned i = 3; i < len; i++) {
1691
- if ('<' == data[i-3]) {
1692
- switch (data[i-2]) {
1693
- case '?':
1694
- case '!':
1695
- break;
1696
- case 's':
1697
- return ('v' == data[i-1] && 'g' == data[i]);
1698
- default:
1699
- return false;
1700
- }
1701
- }
1702
- }
1703
- return false;
1704
- }
1705
-
1706
- /*
1707
- * Check for valid BMP signatures
1708
- */
1709
-
1710
- int Image::isBMP(uint8_t *data, unsigned len) {
1711
- if(len < 2) return false;
1712
- std::string sig = std::string(1, (char)data[0]) + (char)data[1];
1713
- return sig == "BM" ||
1714
- sig == "BA" ||
1715
- sig == "CI" ||
1716
- sig == "CP" ||
1717
- sig == "IC" ||
1718
- sig == "PT";
1719
- }