vispy 0.15.0__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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.

Potentially problematic release.


This version of vispy might be problematic. Click here for more details.

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-aarch64-linux-gnu.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,229 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ # Based on the quaternion class in the visvis project.
5
+
6
+ import numpy as np
7
+
8
+
9
+ class Quaternion(object):
10
+ """Quaternion(w=1, x=0, y=0, z=0, normalize=True)
11
+
12
+ A quaternion is a mathematically convenient way to
13
+ describe rotations.
14
+
15
+ """
16
+
17
+ def __init__(self, w=1, x=0, y=0, z=0, normalize=True):
18
+
19
+ self.w = float(w)
20
+ self.x, self.y, self.z = float(x), float(y), float(z)
21
+ if normalize:
22
+ self._normalize()
23
+
24
+ def __repr__(self):
25
+ return "<Quaternion object %1.3g + %1.3gi + %1.3gj + %1.3gk>" % (
26
+ self.w, self.x, self.y, self.z)
27
+
28
+ def copy(self):
29
+ """Create an exact copy of this quaternion."""
30
+ return Quaternion(self.w, self.x, self.y, self.z, False)
31
+
32
+ def norm(self):
33
+ """Returns the norm of the quaternion
34
+
35
+ norm = w**2 + x**2 + y**2 + z**2
36
+ """
37
+ tmp = self.w**2 + self.x**2 + self.y**2 + self.z**2
38
+ return tmp**0.5
39
+
40
+ def _normalize(self):
41
+ """Make the quaternion unit length."""
42
+ # Get length
43
+ L = self.norm()
44
+ if not L:
45
+ raise ValueError('Quaternion cannot have 0-length.')
46
+ # Correct
47
+ self.w /= L
48
+ self.x /= L
49
+ self.y /= L
50
+ self.z /= L
51
+
52
+ def normalize(self):
53
+ """Returns a normalized (unit length) version of the quaternion."""
54
+ new = self.copy()
55
+ new._normalize()
56
+ return new
57
+
58
+ def conjugate(self):
59
+ """Obtain the conjugate of the quaternion.
60
+
61
+ This is simply the same quaternion but with the sign of the
62
+ imaginary (vector) parts reversed.
63
+ """
64
+ new = self.copy()
65
+ new.x *= -1
66
+ new.y *= -1
67
+ new.z *= -1
68
+ return new
69
+
70
+ def inverse(self):
71
+ """Returns q.conjugate()/q.norm()**2
72
+
73
+ So if the quaternion is unit length, it is the same
74
+ as the conjugate.
75
+ """
76
+ new = self.conjugate()
77
+ tmp = self.norm()**2
78
+ new.w /= tmp
79
+ new.x /= tmp
80
+ new.y /= tmp
81
+ new.z /= tmp
82
+ return new
83
+
84
+ def exp(self):
85
+ """Returns the exponent of the quaternion.
86
+ (not tested)
87
+ """
88
+ # Init
89
+ vecNorm = self.x**2 + self.y**2 + self.z**2
90
+ wPart = np.exp(self.w)
91
+ q = Quaternion()
92
+
93
+ # Calculate
94
+ q.w = wPart * np.cos(vecNorm)
95
+ q.x = wPart * self.x * np.sin(vecNorm) / vecNorm
96
+ q.y = wPart * self.y * np.sin(vecNorm) / vecNorm
97
+ q.z = wPart * self.z * np.sin(vecNorm) / vecNorm
98
+
99
+ return q
100
+
101
+ def log(self):
102
+ """Returns the natural logarithm of the quaternion.
103
+ (not tested)
104
+ """
105
+ # Init
106
+ norm = self.norm()
107
+ vecNorm = self.x**2 + self.y**2 + self.z**2
108
+ tmp = self.w / norm
109
+ q = Quaternion()
110
+
111
+ # Calculate
112
+ q.w = np.log(norm)
113
+ q.x = np.log(norm) * self.x * np.arccos(tmp) / vecNorm
114
+ q.y = np.log(norm) * self.y * np.arccos(tmp) / vecNorm
115
+ q.z = np.log(norm) * self.z * np.arccos(tmp) / vecNorm
116
+
117
+ return q
118
+
119
+ def __add__(self, q):
120
+ """Add quaternions."""
121
+ new = self.copy()
122
+ new.w += q.w
123
+ new.x += q.x
124
+ new.y += q.y
125
+ new.z += q.z
126
+ return new
127
+
128
+ def __sub__(self, q):
129
+ """Subtract quaternions."""
130
+ new = self.copy()
131
+ new.w -= q.w
132
+ new.x -= q.x
133
+ new.y -= q.y
134
+ new.z -= q.z
135
+ return new
136
+
137
+ def __mul__(self, q2):
138
+ """Multiply two quaternions."""
139
+ new = Quaternion()
140
+ q1 = self
141
+ new.w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z
142
+ new.x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y
143
+ new.y = q1.w*q2.y + q1.y*q2.w + q1.z*q2.x - q1.x*q2.z
144
+ new.z = q1.w*q2.z + q1.z*q2.w + q1.x*q2.y - q1.y*q2.x
145
+ return new
146
+
147
+ def rotate_point(self, p):
148
+ """Rotate a Point instance using this quaternion."""
149
+ # Prepare
150
+ p = Quaternion(0, p[0], p[1], p[2], False) # Do not normalize!
151
+ q1 = self.normalize()
152
+ q2 = self.inverse()
153
+ # Apply rotation
154
+ r = (q1*p)*q2
155
+ # Make point and return
156
+ return r.x, r.y, r.z
157
+
158
+ def get_matrix(self):
159
+ """Create a 4x4 homography matrix that represents the rotation
160
+ of the quaternion.
161
+ """
162
+ # Init matrix (remember, a matrix, not an array)
163
+ a = np.zeros((4, 4), dtype=np.float32)
164
+ w, x, y, z = self.w, self.x, self.y, self.z
165
+ # First row
166
+ a[0, 0] = - 2.0 * (y * y + z * z) + 1.0
167
+ a[1, 0] = + 2.0 * (x * y + z * w)
168
+ a[2, 0] = + 2.0 * (x * z - y * w)
169
+ a[3, 0] = 0.0
170
+ # Second row
171
+ a[0, 1] = + 2.0 * (x * y - z * w)
172
+ a[1, 1] = - 2.0 * (x * x + z * z) + 1.0
173
+ a[2, 1] = + 2.0 * (z * y + x * w)
174
+ a[3, 1] = 0.0
175
+ # Third row
176
+ a[0, 2] = + 2.0 * (x * z + y * w)
177
+ a[1, 2] = + 2.0 * (y * z - x * w)
178
+ a[2, 2] = - 2.0 * (x * x + y * y) + 1.0
179
+ a[3, 2] = 0.0
180
+ # Fourth row
181
+ a[0, 3] = 0.0
182
+ a[1, 3] = 0.0
183
+ a[2, 3] = 0.0
184
+ a[3, 3] = 1.0
185
+ return a
186
+
187
+ def get_axis_angle(self):
188
+ """Get the axis-angle representation of the quaternion.
189
+ (The angle is in radians)
190
+ """
191
+ # Init
192
+ angle = 2 * np.arccos(max(min(self.w, 1.), -1.))
193
+ scale = (self.x**2 + self.y**2 + self.z**2)**0.5
194
+
195
+ # Calc axis
196
+ if scale:
197
+ ax = self.x / scale
198
+ ay = self.y / scale
199
+ az = self.z / scale
200
+ else:
201
+ # No rotation, so arbitrary axis
202
+ ax, ay, az = 1, 0, 0
203
+ # Return
204
+ return angle, ax, ay, az
205
+
206
+ @classmethod
207
+ def create_from_axis_angle(cls, angle, ax, ay, az, degrees=False):
208
+ """Classmethod to create a quaternion from an axis-angle representation.
209
+ (angle should be in radians).
210
+ """
211
+ if degrees:
212
+ angle = np.radians(angle)
213
+ while angle < 0:
214
+ angle += np.pi*2
215
+ angle2 = angle/2.0
216
+ sinang2 = np.sin(angle2)
217
+ return Quaternion(np.cos(angle2), ax*sinang2, ay*sinang2, az*sinang2)
218
+
219
+ @classmethod
220
+ def create_from_euler_angles(cls, rx, ry, rz, degrees=False):
221
+ """Classmethod to create a quaternion given the euler angles."""
222
+ if degrees:
223
+ rx, ry, rz = np.radians([rx, ry, rz])
224
+ # Obtain quaternions
225
+ qx = Quaternion(np.cos(rx/2), 0, 0, np.sin(rx/2))
226
+ qy = Quaternion(np.cos(ry/2), 0, np.sin(ry/2), 0)
227
+ qz = Quaternion(np.cos(rz/2), np.sin(rz/2), 0, 0)
228
+ # Almost done
229
+ return qx*qy*qz
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier. All rights reserved.
4
+ # Distributed under the terms of the new BSD License.
5
+ # -----------------------------------------------------------------------------
6
+ from . svg import SVG
7
+ from . path import Path # noqa
8
+ from . base import namespace
9
+ from xml.etree import ElementTree
10
+
11
+
12
+ def Document(filename):
13
+ tree = ElementTree.parse(filename)
14
+ root = tree.getroot()
15
+ if root.tag != namespace + 'svg':
16
+ text = 'File "%s" does not seem to be a valid SVG file' % filename
17
+ raise TypeError(text)
18
+ return SVG(root)
vispy/util/svg/base.py ADDED
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier. All rights reserved.
4
+ # Distributed under the terms of the new BSD License.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ namespace = '{http://www.w3.org/2000/svg}'
8
+ dpi = 90
9
+ units = {
10
+ None: 1, # Default unit (same as pixel)
11
+ 'px': 1, # px: pixel. Default SVG unit
12
+ 'em': 10, # 1 em = 10 px FIXME
13
+ 'ex': 5, # 1 ex = 5 px FIXME
14
+ 'in': dpi, # 1 in = 96 px
15
+ 'cm': dpi / 2.54, # 1 cm = 1/2.54 in
16
+ 'mm': dpi / 25.4, # 1 mm = 1/25.4 in
17
+ 'pt': dpi / 72.0, # 1 pt = 1/72 in
18
+ 'pc': dpi / 6.0, # 1 pc = 1/6 in
19
+ '%': 1 / 100.0 # 1 percent
20
+ }
@@ -0,0 +1,219 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ from itertools import product
8
+ from string import hexdigits
9
+
10
+
11
+ # See <http://www.w3.org/TR/SVG/types.html#ColorKeywords>
12
+ _keyword_colors = {
13
+ "aliceblue": (240, 248, 255),
14
+ "antiquewhite": (250, 235, 215),
15
+ "aqua": (0, 255, 255),
16
+ "aquamarine": (127, 255, 212),
17
+ "azure": (240, 255, 255),
18
+ "beige": (245, 245, 220),
19
+ "bisque": (255, 228, 196),
20
+ "black": (0, 0, 0),
21
+ "blanchedalmond": (255, 235, 205),
22
+ "blue": (0, 0, 255),
23
+ "blueviolet": (138, 43, 226),
24
+ "brown": (165, 42, 42),
25
+ "burlywood": (222, 184, 135),
26
+ "cadetblue": (95, 158, 160),
27
+ "chartreuse": (127, 255, 0),
28
+ "chocolate": (210, 105, 30),
29
+ "coral": (255, 127, 80),
30
+ "cornflowerblue": (100, 149, 237),
31
+ "cornsilk": (255, 248, 220),
32
+ "crimson": (220, 20, 60),
33
+ "cyan": (0, 255, 255),
34
+ "darkblue": (0, 0, 139),
35
+ "darkcyan": (0, 139, 139),
36
+ "darkgoldenrod": (184, 134, 11),
37
+ "darkgray": (169, 169, 169),
38
+ "darkgreen": (0, 100, 0),
39
+ "darkgrey": (169, 169, 169),
40
+ "darkkhaki": (189, 183, 107),
41
+ "darkmagenta": (139, 0, 139),
42
+ "darkolivegreen": (85, 107, 47),
43
+ "darkorange": (255, 140, 0),
44
+ "darkorchid": (153, 50, 204),
45
+ "darkred": (139, 0, 0),
46
+ "darksalmon": (233, 150, 122),
47
+ "darkseagreen": (143, 188, 143),
48
+ "darkslateblue": (72, 61, 139),
49
+ "darkslategray": (47, 79, 79),
50
+ "darkslategrey": (47, 79, 79),
51
+ "darkturquoise": (0, 206, 209),
52
+ "darkviolet": (148, 0, 211),
53
+ "deeppink": (255, 20, 147),
54
+ "deepskyblue": (0, 191, 255),
55
+ "dimgray": (105, 105, 105),
56
+ "dimgrey": (105, 105, 105),
57
+ "dodgerblue": (30, 144, 255),
58
+ "firebrick": (178, 34, 34),
59
+ "floralwhite": (255, 250, 240),
60
+ "forestgreen": (34, 139, 34),
61
+ "fuchsia": (255, 0, 255),
62
+ "gainsboro": (220, 220, 220),
63
+ "ghostwhite": (248, 248, 255),
64
+ "gold": (255, 215, 0),
65
+ "goldenrod": (218, 165, 32),
66
+ "gray": (128, 128, 128),
67
+ "grey": (128, 128, 128),
68
+ "green": (0, 128, 0),
69
+ "greenyellow": (173, 255, 47),
70
+ "honeydew": (240, 255, 240),
71
+ "hotpink": (255, 105, 180),
72
+ "indianred": (205, 92, 92),
73
+ "indigo": (75, 0, 130),
74
+ "ivory": (255, 255, 240),
75
+ "khaki": (240, 230, 140),
76
+ "lavender": (230, 230, 250),
77
+ "lavenderblush": (255, 240, 245),
78
+ "lawngreen": (124, 252, 0),
79
+ "lemonchiffon": (255, 250, 205),
80
+ "lightblue": (173, 216, 230),
81
+ "lightcoral": (240, 128, 128),
82
+ "lightcyan": (224, 255, 255),
83
+ "lightgoldenrodyellow": (250, 250, 210),
84
+ "lightgray": (211, 211, 211),
85
+ "lightgreen": (144, 238, 144),
86
+ "lightgrey": (211, 211, 211),
87
+ "lightpink": (255, 182, 193),
88
+ "lightsalmon": (255, 160, 122),
89
+ "lightseagreen": (32, 178, 170),
90
+ "lightskyblue": (135, 206, 250),
91
+ "lightslategray": (119, 136, 153),
92
+ "lightslategrey": (119, 136, 153),
93
+ "lightsteelblue": (176, 196, 222),
94
+ "lightyellow": (255, 255, 224),
95
+ "lime": (0, 255, 0),
96
+ "limegreen": (50, 205, 50),
97
+ "linen": (250, 240, 230),
98
+ "magenta": (255, 0, 255),
99
+ "maroon": (128, 0, 0),
100
+ "mediumaquamarine": (102, 205, 170),
101
+ "mediumblue": (0, 0, 205),
102
+ "mediumorchid": (186, 85, 211),
103
+ "mediumpurple": (147, 112, 219),
104
+ "mediumseagreen": (60, 179, 113),
105
+ "mediumslateblue": (123, 104, 238),
106
+ "mediumspringgreen": (0, 250, 154),
107
+ "mediumturquoise": (72, 209, 204),
108
+ "mediumvioletred": (199, 21, 133),
109
+ "midnightblue": (25, 25, 112),
110
+ "mintcream": (245, 255, 250),
111
+ "mistyrose": (255, 228, 225),
112
+ "moccasin": (255, 228, 181),
113
+ "navajowhite": (255, 222, 173),
114
+ "navy": (0, 0, 128),
115
+ "oldlace": (253, 245, 230),
116
+ "olive": (128, 128, 0),
117
+ "olivedrab": (107, 142, 35),
118
+ "orange": (255, 165, 0),
119
+ "orangered": (255, 69, 0),
120
+ "orchid": (218, 112, 214),
121
+ "palegoldenrod": (238, 232, 170),
122
+ "palegreen": (152, 251, 152),
123
+ "paleturquoise": (175, 238, 238),
124
+ "palevioletred": (219, 112, 147),
125
+ "papayawhip": (255, 239, 213),
126
+ "peachpuff": (255, 218, 185),
127
+ "peru": (205, 133, 63),
128
+ "pink": (255, 192, 203),
129
+ "plum": (221, 160, 221),
130
+ "powderblue": (176, 224, 230),
131
+ "purple": (128, 0, 128),
132
+ "red": (255, 0, 0),
133
+ "rosybrown": (188, 143, 143),
134
+ "royalblue": (65, 105, 225),
135
+ "saddlebrown": (139, 69, 19),
136
+ "salmon": (250, 128, 114),
137
+ "sandybrown": (244, 164, 96),
138
+ "seagreen": (46, 139, 87),
139
+ "seashell": (255, 245, 238),
140
+ "sienna": (160, 82, 45),
141
+ "silver": (192, 192, 192),
142
+ "skyblue": (135, 206, 235),
143
+ "slateblue": (106, 90, 205),
144
+ "slategray": (112, 128, 144),
145
+ "slategrey": (112, 128, 144),
146
+ "snow": (255, 250, 250),
147
+ "springgreen": (0, 255, 127),
148
+ "steelblue": (70, 130, 180),
149
+ "tan": (210, 180, 140),
150
+ "teal": (0, 128, 128),
151
+ "thistle": (216, 191, 216),
152
+ "tomato": (255, 99, 71),
153
+ "turquoise": (64, 224, 208),
154
+ "violet": (238, 130, 238),
155
+ "wheat": (245, 222, 179),
156
+ "white": (255, 255, 255),
157
+ "whitesmoke": (245, 245, 245),
158
+ "yellow": (255, 255, 0),
159
+ "yellowgreen": (154, 205, 50)}
160
+
161
+
162
+ _HEXDEC = {}
163
+ for x, y in product(hexdigits, repeat=2):
164
+ v = x + y
165
+ _HEXDEC[v] = int(v, 16)
166
+
167
+
168
+ def _rgb(triplet):
169
+ return _HEXDEC[triplet[0:2]], _HEXDEC[triplet[2:4]], _HEXDEC[triplet[4:6]]
170
+
171
+
172
+ class Color(object):
173
+
174
+ def __init__(self, content):
175
+
176
+ color = content.strip()
177
+ if color.startswith("#"):
178
+ rgb = color[1:]
179
+ if len(rgb) == 3:
180
+ r, g, b = tuple(ord((c + c).decode('hex')) for c in rgb)
181
+ else:
182
+ # r,g,b = tuple(ord(c) for c in rgb.decode('hex'))
183
+ r, g, b = tuple(c for c in _rgb(rgb))
184
+ elif color.startswith("rgb("):
185
+ rgb = color[4:-1]
186
+ r, g, b = [value.strip() for value in rgb.split(',')]
187
+ if r.endswith("%"):
188
+ r = 255 * int(r[:-1]) // 100
189
+ else:
190
+ r = int(r)
191
+ if g.endswith("%"):
192
+ g = 255 * int(g[:-1]) // 100
193
+ else:
194
+ g = int(r)
195
+ if b.endswith("%"):
196
+ b = 255 * int(b[:-1]) // 100
197
+ else:
198
+ b = int(r)
199
+ elif color in _keyword_colors:
200
+ r, g, b = _keyword_colors[color]
201
+ else:
202
+ # text = "Unknown color (%s)" % color
203
+ r, g, b = 0, 0, 0
204
+ self._rgb = r / 255., g / 255., b / 255.
205
+
206
+ @property
207
+ def rgb(self):
208
+ r, g, b = self._rgb
209
+ return r, g, b
210
+
211
+ @property
212
+ def rgba(self):
213
+ r, g, b = self._rgb
214
+ return r, g, b, 1
215
+
216
+ def __repr__(self):
217
+ r, g, b = self._rgb
218
+ r, g, b = int(r * 255), int(g * 255), int(b * 255)
219
+ return "#%02x%02x%02x" % (r, g, b)
@@ -0,0 +1,51 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier. All rights reserved.
4
+ # Distributed under the terms of the new BSD License.
5
+ # -----------------------------------------------------------------------------
6
+ import copy
7
+ from . style import Style
8
+
9
+ namespace = '{http://www.w3.org/2000/svg}'
10
+
11
+
12
+ class Element(object):
13
+ """Generic SVG element"""
14
+
15
+ def __init__(self, content=None, parent=None):
16
+ self._parent = parent
17
+ self._id = hex(id(self))
18
+ self._style = Style()
19
+ self._computed_style = Style()
20
+
21
+ if isinstance(content, str):
22
+ return
23
+
24
+ self._id = content.get('id', self._id)
25
+ self._style.update(content.get("style", None))
26
+ self._computed_style = Style()
27
+ if parent and parent.style:
28
+ self._computed_style = copy.copy(parent.style)
29
+ self._computed_style.update(content.get("style", None))
30
+
31
+ @property
32
+ def root(self):
33
+ if self._parent:
34
+ return self._parent.root
35
+ return self
36
+
37
+ @property
38
+ def parent(self):
39
+ if self._parent:
40
+ return self._parent
41
+ return None
42
+
43
+ @property
44
+ def style(self):
45
+ return self._computed_style
46
+
47
+ @property
48
+ def viewport(self):
49
+ if self._parent:
50
+ return self._parent.viewport
51
+ return None