Browse Source

Awesome Plotting

Marcel Zickler 3 years ago
parent
commit
2cf83cc12b
100 changed files with 5179 additions and 3686 deletions
  1. 0 31
      Assembly-CSharp.csproj
  2. 8 0
      Assets/Plotting/.idea/Plotting.iml
  3. 16 0
      Assets/Plotting/.idea/inspectionProfiles/Project_Default.xml
  4. 5 0
      Assets/Plotting/.idea/inspectionProfiles/profiles_settings.xml
  5. 4 0
      Assets/Plotting/.idea/misc.xml
  6. 8 0
      Assets/Plotting/.idea/modules.xml
  7. 6 0
      Assets/Plotting/.idea/vcs.xml
  8. 4112 22
      Assets/Plotting/.idea/workspace.xml
  9. 15 0
      Assets/Plotting/Pipfile
  10. 1 1
      Assets/Plotting/Pipfile.lock.meta
  11. 1 1
      Assets/Plotting/Pipfile.meta
  12. 1 1
      Assets/Plotting/__pycache__.meta
  13. BIN
      Assets/Plotting/__pycache__/data.cpython-38.pyc
  14. 1 1
      Assets/Plotting/__pycache__/data.cpython-38.pyc.meta
  15. BIN
      Assets/Plotting/__pycache__/tools.cpython-38.pyc
  16. 1 1
      Assets/Plotting/__pycache__/tools.cpython-38.pyc.meta
  17. 1 1
      Assets/Plotting/assets.meta
  18. 749 0
      Assets/Plotting/assets/style.css
  19. 7 0
      Assets/Plotting/assets/style.css.meta
  20. 47 0
      Assets/Plotting/data.py
  21. 7 0
      Assets/Plotting/data.py.meta
  22. 137 0
      Assets/Plotting/main.py
  23. 1 1
      Assets/Plotting/main.py.meta
  24. 0 148
      Assets/Plotting/plot.py
  25. 0 8
      Assets/Plotting/plots.meta
  26. 44 0
      Assets/Plotting/tools.py
  27. 7 0
      Assets/Plotting/tools.py.meta
  28. 0 8
      Assets/Plotting/venv.meta
  29. 0 76
      Assets/Plotting/venv/bin/activate
  30. 0 37
      Assets/Plotting/venv/bin/activate.csh
  31. 0 75
      Assets/Plotting/venv/bin/activate.fish
  32. 0 8
      Assets/Plotting/venv/bin/easy_install
  33. 0 8
      Assets/Plotting/venv/bin/easy_install-3.7
  34. 0 7
      Assets/Plotting/venv/bin/easy_install-3.7.meta
  35. 0 7
      Assets/Plotting/venv/bin/easy_install.meta
  36. 0 8
      Assets/Plotting/venv/bin/f2py
  37. 0 7
      Assets/Plotting/venv/bin/f2py.meta
  38. 0 8
      Assets/Plotting/venv/bin/f2py3
  39. 0 8
      Assets/Plotting/venv/bin/f2py3.7
  40. 0 7
      Assets/Plotting/venv/bin/f2py3.7.meta
  41. 0 7
      Assets/Plotting/venv/bin/f2py3.meta
  42. 0 8
      Assets/Plotting/venv/bin/pip
  43. 0 7
      Assets/Plotting/venv/bin/pip.meta
  44. 0 8
      Assets/Plotting/venv/bin/pip3
  45. 0 8
      Assets/Plotting/venv/bin/pip3.7
  46. 0 7
      Assets/Plotting/venv/bin/pip3.7.meta
  47. 0 7
      Assets/Plotting/venv/bin/pip3.meta
  48. 0 1
      Assets/Plotting/venv/bin/python
  49. 0 7
      Assets/Plotting/venv/bin/python.meta
  50. 0 1
      Assets/Plotting/venv/bin/python3
  51. 0 7
      Assets/Plotting/venv/bin/python3.meta
  52. 0 8
      Assets/Plotting/venv/lib.meta
  53. 0 8
      Assets/Plotting/venv/lib/python3.7.meta
  54. 0 8
      Assets/Plotting/venv/lib/python3.7/site-packages.meta
  55. 0 8
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL.meta
  56. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libXau.6.dylib
  57. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libfreetype.6.dylib
  58. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libjpeg.9.dylib
  59. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/liblcms2.2.dylib
  60. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/liblzma.5.dylib
  61. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libopenjp2.2.3.1.dylib
  62. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libpng16.16.dylib
  63. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libtiff.5.dylib
  64. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebp.7.dylib
  65. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebpdemux.2.dylib
  66. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebpmux.3.dylib
  67. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libxcb.1.1.0.dylib
  68. BIN
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libz.1.2.11.dylib
  69. 0 110
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BdfFontFile.py
  70. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BdfFontFile.py.meta
  71. 0 422
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BlpImagePlugin.py
  72. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BlpImagePlugin.py.meta
  73. 0 381
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BmpImagePlugin.py
  74. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BmpImagePlugin.py.meta
  75. 0 73
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BufrStubImagePlugin.py
  76. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BufrStubImagePlugin.py.meta
  77. 0 120
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ContainerIO.py
  78. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ContainerIO.py.meta
  79. 0 76
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/CurImagePlugin.py
  80. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/CurImagePlugin.py.meta
  81. 0 89
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DcxImagePlugin.py
  82. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DcxImagePlugin.py.meta
  83. 0 178
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DdsImagePlugin.py
  84. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DdsImagePlugin.py.meta
  85. 0 419
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/EpsImagePlugin.py
  86. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/EpsImagePlugin.py.meta
  87. 0 318
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ExifTags.py
  88. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ExifTags.py.meta
  89. 0 76
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FitsStubImagePlugin.py
  90. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FitsStubImagePlugin.py.meta
  91. 0 172
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FliImagePlugin.py
  92. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FliImagePlugin.py.meta
  93. 0 111
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FontFile.py
  94. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FontFile.py.meta
  95. 0 243
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FpxImagePlugin.py
  96. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FpxImagePlugin.py.meta
  97. 0 106
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FtexImagePlugin.py
  98. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FtexImagePlugin.py.meta
  99. 0 100
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/GbrImagePlugin.py
  100. 0 7
      Assets/Plotting/venv/lib/python3.7/site-packages/PIL/GbrImagePlugin.py.meta

+ 0 - 31
Assembly-CSharp.csproj

@@ -310,63 +310,32 @@
      <Compile Include="Assets\Scripts\Tracking\KineticLegTracker.cs" />
      <Compile Include="Assets\TutorialInfo\Scripts\Readme.cs" />
      <Compile Include="Assets\Wheels\Scripts\FreeCamera.cs" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pyparsing-2.4.7.dist-info\top_level.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMPro.cginc" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile Overlay.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy-1.19.4.dist-info\LICENSE.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pkg_resources\tests\data\my-test-package_unpacked-egg\my_test_package-1.0-py3.7.egg\EGG-INFO\top_level.txt" />
      <None Include="Assets\AdvancedAnt\Plugins\Ant\License.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pip-20.3.3.dist-info\entry_points.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pip-20.3.3.dist-info\LICENSE.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\setuptools-51.1.0.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy\core\include\numpy\multiarray_api.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy-1.19.4.dist-info\entry_points.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pkg_resources\api_tests.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMPro_Mobile.cginc" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\setuptools\command\launcher manifest.xml" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF SSD.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\Pillow-8.0.1.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pkg_resources\tests\data\my-test-package_unpacked-egg\my_test_package-1.0-py3.7.egg\EGG-INFO\SOURCES.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pkg_resources\_vendor\vendored.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Surface-Mobile.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pip\_vendor\vendor.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pip-20.3.3.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy\core\include\numpy\ufunc_api.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\pkg_resources\tests\data\my-test-package_unpacked-egg\my_test_package-1.0-py3.7.egg\EGG-INFO\dependency_links.txt" />
      <None Include="Assets\AdvancedAnt\DEMO PREFABS\Android_readme.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\setuptools-51.1.0.dist-info\entry_points.txt" />
      <None Include="Assets\AdvancedAnt\Plugins\Android\AndroidManifest.xml" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\python_dateutil-2.8.1.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\matplotlib\mpl-data\sample_data\README.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\six-1.15.0.dist-info\top_level.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Surface.shader" />
      <None Include="Assets\TextMesh Pro\Sprites\EmojiOne Attribution.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap-Custom-Atlas.shader" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\setuptools-51.1.0.dist-info\dependency_links.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile SSD.shader" />
      <None Include="Assets\TextMesh Pro\Resources\LineBreaking Leading Characters.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy-1.19.4.dist-info\top_level.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMPro_Properties.cginc" />
      <None Include="Assets\AdvancedAnt\PC_MAC_readme.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMPro_Surface.cginc" />
      <None Include="Assets\TextMesh Pro\Resources\LineBreaking Following Characters.txt" />
      <None Include="Assets\AdvancedAnt\Plugins\Ant\Fit\FIT license.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\setuptools\_vendor\vendored.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\matplotlib-3.3.3.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\cycler-0.10.0.dist-info\top_level.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\kiwisolver-1.3.1.dist-info\top_level.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile Masking.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\matplotlib-3.3.3.dist-info\namespace_packages.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF Overlay.shader" />
      <None Include="Assets\PolygonCity\Change_Log.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap-Mobile.shader" />
      <None Include="Assets\TextMesh Pro\Fonts\LiberationSans - OFL.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile.shader" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\matplotlib\mpl-data\fonts\pdfcorefonts\readme.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy-1.19.4.dist-info\LICENSES_bundled.txt" />
-     <None Include="Assets\Plotting\venv\lib\python3.7\site-packages\numpy\LICENSE.txt" />
      <None Include="Assets\TextMesh Pro\Shaders\TMP_Sprite.shader" />
  <Reference Include="Unity.RenderPipeline.Universal.ShaderLibrary">
  <HintPath>C:/Unity Projects/VR Cycling/Library/ScriptAssemblies/Unity.RenderPipeline.Universal.ShaderLibrary.dll</HintPath>

+ 8 - 0
Assets/Plotting/.idea/Plotting.iml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 16 - 0
Assets/Plotting/.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,16 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="MysqlParsingInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="PyPep8Inspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <option name="ignoredErrors">
+        <list>
+          <option value="E302" />
+          <option value="E127" />
+        </list>
+      </option>
+    </inspection_tool>
+    <inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="SqlResolveInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+  </profile>
+</component>

+ 5 - 0
Assets/Plotting/.idea/inspectionProfiles/profiles_settings.xml

@@ -0,0 +1,5 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="PROJECT_PROFILE" />
+  </settings>
+</component>

+ 4 - 0
Assets/Plotting/.idea/misc.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (Plotting)" project-jdk-type="Python SDK" />
+</project>

+ 8 - 0
Assets/Plotting/.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/Plotting.iml" filepath="$PROJECT_DIR$/.idea/Plotting.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
Assets/Plotting/.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
+  </component>
+</project>

File diff suppressed because it is too large
+ 4112 - 22
Assets/Plotting/.idea/workspace.xml


+ 15 - 0
Assets/Plotting/Pipfile

@@ -0,0 +1,15 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+dash = "*"
+plotly = "*"
+numpy = "==1.19.3"
+pandas = "*"
+
+[dev-packages]
+
+[requires]
+python_version = "3.8"

+ 1 - 1
Assets/Plotting/venv/bin/activate.csh.meta → Assets/Plotting/Pipfile.lock.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 8cba1404136f4460fa23e6ac5d0d2beb
+guid: 54adfd9052a1abe41b05a48c9804fce5
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 1 - 1
Assets/Plotting/plot.py.meta → Assets/Plotting/Pipfile.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: b895b5583d5be5449ad8c7e304c6adbb
+guid: b615826e5b0a0194aa5304f2210dbb4f
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 1 - 1
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/__pycache__.meta → Assets/Plotting/__pycache__.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 931f0606a8b6941b9abdcd30cd522759
+guid: 394798628b5d6984cba8d9956174e530
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

BIN
Assets/Plotting/__pycache__/data.cpython-38.pyc


+ 1 - 1
Assets/Plotting/venv/bin/activate.fish.meta → Assets/Plotting/__pycache__/data.cpython-38.pyc.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 84378701a8db94664a390e4760537d2b
+guid: b18b6f0181b358e4c85da023070c16fe
 DefaultImporter:
   externalObjects: {}
   userData: 

BIN
Assets/Plotting/__pycache__/tools.cpython-38.pyc


+ 1 - 1
Assets/Plotting/venv/bin/activate.meta → Assets/Plotting/__pycache__/tools.cpython-38.pyc.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f83a1a2d1f8474e16b85d721683d1a8d
+guid: e0890a6865973624e97a4869e62691d9
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 1 - 1
Assets/Plotting/venv/bin.meta → Assets/Plotting/assets.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 20e28e4957eff40fe9c04a5a612f79bd
+guid: 580ab1d2c0f613e448d76da240634761
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 749 - 0
Assets/Plotting/assets/style.css

@@ -0,0 +1,749 @@
+/* Table of contents ––––––––––––––––––––––––––––––––––––––––––––––––––
+Taken from https://codepen.io/chriddyp/pen/bWLwgP.css
+- Grid
+- Base Styles
+ - Typography
+ - Links
+ - Buttons
+ - Forms
+ - Lists
+ - Code
+ - Tables
+ - Spacing
+ - Utilities
+ - Clearing
+ - Media Queries
+ - Custom App CSS */
+
+
+/* Grid –––––––––––––––––––––––––––––––––––––––––––––––––– */
+.container {
+    position: relative;
+    width: 100%;
+    max-width: 960px;
+    margin: 0 auto;
+    padding: 0 20px;
+    box-sizing: border-box;
+}
+
+.column, .columns {
+    width: 100%;
+    float: left;
+    box-sizing: border-box;
+}
+
+/* For devices larger than 400px */
+@media (min-width: 400px) {
+    .container {
+        width: 85%;
+        padding: 0;
+    }
+}
+
+/* For devices larger than 550px */
+@media (min-width: 550px) {
+    .container {
+        width: 80%;
+    }
+
+    .column, .columns {
+        margin-left: 4%;
+    }
+
+    .column:first-child, .columns:first-child {
+        margin-left: 0;
+    }
+
+    .one.column, .one.columns {
+        width: 4.66666666667%;
+    }
+
+    .two.columns {
+        width: 13.3333333333%;
+    }
+
+    .three.columns {
+        width: 22%;
+    }
+
+    .four.columns {
+        width: 30.6666666667%;
+    }
+
+    .five.columns {
+        width: 39.3333333333%;
+    }
+
+    .six.columns {
+        width: 48%;
+    }
+
+    .seven.columns {
+        width: 56.6666666667%;
+    }
+
+    .eight.columns {
+        width: 65.3333333333%;
+    }
+
+    .nine.columns {
+        width: 74.0%;
+    }
+
+    .ten.columns {
+        width: 82.6666666667%;
+    }
+
+    .eleven.columns {
+        width: 91.3333333333%;
+    }
+
+    .twelve.columns {
+        width: 100%;
+        margin-left: 0;
+    }
+
+    .one-third.column {
+        width: 30.6666666667%;
+    }
+
+    .two-thirds.column {
+        width: 65.3333333333%;
+    }
+
+    .one-half.column {
+        width: 48%;
+    }
+
+    /* Offsets */
+    .offset-by-one.column, .offset-by-one.columns {
+        margin-left: 8.66666666667%;
+    }
+
+    .offset-by-two.column, .offset-by-two.columns {
+        margin-left: 17.3333333333%;
+    }
+
+    .offset-by-three.column, .offset-by-three.columns {
+        margin-left: 26%;
+    }
+
+    .offset-by-four.column, .offset-by-four.columns {
+        margin-left: 34.6666666667%;
+    }
+
+    .offset-by-five.column, .offset-by-five.columns {
+        margin-left: 43.3333333333%;
+    }
+
+    .offset-by-six.column, .offset-by-six.columns {
+        margin-left: 52%;
+    }
+
+    .offset-by-seven.column, .offset-by-seven.columns {
+        margin-left: 60.6666666667%;
+    }
+
+    .offset-by-eight.column, .offset-by-eight.columns {
+        margin-left: 69.3333333333%;
+    }
+
+    .offset-by-nine.column, .offset-by-nine.columns {
+        margin-left: 78.0%;
+    }
+
+    .offset-by-ten.column, .offset-by-ten.columns {
+        margin-left: 86.6666666667%;
+    }
+
+    .offset-by-eleven.column, .offset-by-eleven.columns {
+        margin-left: 95.3333333333%;
+    }
+
+    .offset-by-one-third.column, .offset-by-one-third.columns {
+        margin-left: 34.6666666667%;
+    }
+
+    .offset-by-two-thirds.column, .offset-by-two-thirds.columns {
+        margin-left: 69.3333333333%;
+    }
+
+    .offset-by-one-half.column, .offset-by-one-half.columns {
+        margin-left: 52%;
+    }
+}
+
+/* Base Styles –––––––––––––––––––––––––––––––––––––––––––––––––– */
+/* NOTE html is set to 62.5% so that all the REM measurements throughout Skeleton are based on 10px sizing. So basically 1.5rem = 15px :) */
+html {
+    font-size: 62.5%;
+}
+
+body {
+    font-size: 1.5em;
+    /* currently ems cause chrome bug misinterpreting rems on body element */
+    line-height: 1.6;
+    font-weight: 400;
+    color: rgb(50, 50, 50);
+}
+
+/* Typography –––––––––––––––––––––––––––––––––––––––––––––––––– */
+h1, h2, h3, h4, h5, h6 {
+    margin-top: 0;
+    margin-bottom: 0;
+    font-weight: 300;
+}
+
+h1 {
+    font-size: 4.5rem;
+    line-height: 1.2;
+    letter-spacing: -.1rem;
+    margin-bottom: 2rem;
+}
+
+h2 {
+    font-size: 3.6rem;
+    line-height: 1.25;
+    letter-spacing: -.1rem;
+    margin-bottom: 1.8rem;
+    margin-top: 1.8rem;
+}
+
+h3 {
+    font-size: 3.0rem;
+    line-height: 1.3;
+    letter-spacing: -.1rem;
+    margin-bottom: 1.5rem;
+    margin-top: 1.5rem;
+}
+
+h4 {
+    font-size: 2.6rem;
+    line-height: 1.35;
+    letter-spacing: -.08rem;
+    margin-bottom: 1.2rem;
+    margin-top: 1.2rem;
+}
+
+h5 {
+    font-size: 2.2rem;
+    line-height: 1.5;
+    letter-spacing: -.05rem;
+    margin-bottom: 0.6rem;
+    margin-top: 0.6rem;
+}
+
+h6 {
+    font-size: 2.0rem;
+    line-height: 1.6;
+    letter-spacing: 0;
+    margin-bottom: 0.75rem;
+    margin-top: 0.75rem;
+}
+
+p {
+    margin-top: 0;
+}
+
+/* Blockquotes –––––––––––––––––––––––––––––––––––––––––––––––––– */
+blockquote {
+    border-left: 4px lightgrey solid;
+    padding-left: 1rem;
+    margin-top: 2rem;
+    margin-bottom: 2rem;
+    margin-left: 0rem;
+}
+
+/* Links –––––––––––––––––––––––––––––––––––––––––––––––––– */
+a {
+    color: #1EAEDB;
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+a:hover {
+    color: #0FA0CE;
+}
+
+/* Buttons –––––––––––––––––––––––––––––––––––––––––––––––––– */
+.rc-slider-track {
+    background-color: #007eff
+}
+
+.rc-slider-rail {
+    background-color: #505050
+}
+
+
+.main-svg {
+    font-family: "Open Sans Semi Bold"
+}
+
+.gtitle {
+    font-family: "Open Sans Semi Bold" !important
+}
+
+.g-title {
+    font-family: "Open Sans Semi Bold"
+}
+
+
+.button, button, input[type="submit"], input[type="reset"], input[type="button"] {
+    display: inline-block;
+    height: 38px;
+    padding: 0 30px;
+    color: #555;
+    text-align: center;
+    font-size: 11px;
+    font-weight: 600;
+    line-height: 38px;
+    letter-spacing: .1rem;
+    text-transform: uppercase;
+    text-decoration: none;
+    white-space: nowrap;
+    background-color: transparent;
+    border-radius: 4px;
+    border: 1px solid #bbb;
+    cursor: pointer;
+    box-sizing: border-box;
+}
+
+.button:hover, button:hover, input[type="submit"]:hover, input[type="reset"]:hover, input[type="button"]:hover, .button:focus, button:focus, input[type="submit"]:focus, input[type="reset"]:focus, input[type="button"]:focus {
+    color: #333;
+    border-color: #888;
+    outline: 0;
+}
+
+.button.button-primary, button.button-primary, input[type="submit"].button-primary, input[type="reset"].button-primary, input[type="button"].button-primary {
+    color: #FFF;
+    background-color: #33C3F0;
+    border-color: #33C3F0;
+}
+
+.button.button-primary:hover, button.button-primary:hover, input[type="submit"].button-primary:hover, input[type="reset"].button-primary:hover, input[type="button"].button-primary:hover, .button.button-primary:focus, button.button-primary:focus, input[type="submit"].button-primary:focus, input[type="reset"].button-primary:focus, input[type="button"].button-primary:focus {
+    color: #FFF;
+    background-color: #1EAEDB;
+    border-color: #1EAEDB;
+}
+
+/* Forms –––––––––––––––––––––––––––––––––––––––––––––––––– */
+input[type="email"], input[type="number"], input[type="search"], input[type="text"], input[type="tel"], input[type="url"], input[type="password"], textarea, select {
+    height: 38px;
+    padding: 6px 10px;
+    /* The 6px vertically centers text on FF, ignored by Webkit */
+    background-color: #fff;
+    border: 1px solid #D1D1D1;
+    border-radius: 4px;
+    box-shadow: none;
+    box-sizing: border-box;
+    font-family: inherit;
+    font-size: inherit;
+    /*https://stackoverflow.com/questions/6080413/why-doesnt-input-inherit-the-font-from-body*/
+}
+
+/* Removes awkward default styles on some inputs for iOS */
+input[type="email"], input[type="number"], input[type="search"], input[type="text"], input[type="tel"], input[type="url"], input[type="password"], textarea {
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+}
+
+textarea {
+    min-height: 65px;
+    padding-top: 6px;
+    padding-bottom: 6px;
+}
+
+input[type="email"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="text"]:focus, input[type="tel"]:focus, input[type="url"]:focus, input[type="password"]:focus, textarea:focus, select:focus {
+    border: 1px solid #33C3F0;
+    outline: 0;
+}
+
+label, legend {
+    display: block;
+    margin-bottom: 0px;
+}
+
+fieldset {
+    padding: 0;
+    border-width: 0;
+}
+
+input[type="checkbox"], input[type="radio"] {
+    display: inline;
+}
+
+label > .label-body {
+    display: inline-block;
+    margin-left: .5rem;
+    font-weight: normal;
+}
+
+/* Lists –––––––––––––––––––––––––––––––––––––––––––––––––– */
+ul {
+    list-style: circle inside;
+}
+
+ol {
+    list-style: decimal inside;
+}
+
+ol, ul {
+    padding-left: 0;
+    margin-top: 0;
+}
+
+ul ul, ul ol, ol ol, ol ul {
+    margin: 1.5rem 0 1.5rem 3rem;
+    font-size: 90%;
+}
+
+li {
+    margin-bottom: 1rem;
+}
+
+/* Tables –––––––––––––––––––––––––––––––––––––––––––––––––– */
+table {
+    border-collapse: collapse;
+}
+
+th, td {
+    padding: 12px 15px;
+    text-align: left;
+    border-bottom: 1px solid #E1E1E1;
+}
+
+th:first-child, td:first-child {
+    padding-left: 0;
+}
+
+th:last-child, td:last-child {
+    padding-right: 0;
+}
+
+/* Spacing –––––––––––––––––––––––––––––––––––––––––––––––––– */
+button, .button {
+    margin-bottom: 0rem;
+}
+
+input, textarea, select, fieldset {
+    margin-bottom: 0rem;
+}
+
+pre, dl, figure, table, form {
+    margin-bottom: 0rem;
+}
+
+p, ul, ol {
+    margin-bottom: 0.75rem;
+}
+
+/* Utilities –––––––––––––––––––––––––––––––––––––––––––––––––– */
+.u-full-width {
+    width: 100%;
+    box-sizing: border-box;
+}
+
+.u-max-full-width {
+    max-width: 100%;
+    box-sizing: border-box;
+}
+
+.u-pull-right {
+    float: right;
+}
+
+.u-pull-left {
+    float: left;
+}
+
+/* Misc –––––––––––––––––––––––––––––––––––––––––––––––––– */
+hr {
+    margin-top: 3rem;
+    margin-bottom: 3.5rem;
+    border-width: 0;
+    border-top: 1px solid #E1E1E1;
+}
+
+/* Clearing –––––––––––––––––––––––––––––––––––––––––––––––––– */
+/* Self Clearing Goodness */
+.container:after, .row:after, .u-cf {
+    content: "";
+    display: table;
+    clear: both;
+}
+
+/* Media Queries –––––––––––––––––––––––––––––––––––––––––––––––––– */
+/* Note: The best way to structure the use of media queries is to create the queries near the relevant code. For example, if you wanted to change the styles for buttons on small devices, paste the mobile query code up in the buttons section and style it there. */
+/* Larger than mobile */
+@media (min-width: 400px) {
+}
+
+/* Larger than phablet (also point when grid becomes active) */
+@media (min-width: 550px) {
+}
+
+/* Larger than tablet */
+@media (min-width: 750px) {
+}
+
+/* Larger than desktop */
+@media (min-width: 1000px) {
+}
+
+/* Larger than Desktop HD */
+@media (min-width: 1200px) {
+}
+
+/* Custom App CSS Below --------------------------------- */
+/* Main Layout ––––––––––––––––––––––––––––––––––––––––––––––––––*/
+html, body {
+    height: 100%;
+}
+
+body {
+    background-color: #1E1E1E;
+    color: #d8d8d8;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+}
+
+.react-entry-point {
+    height: 100%;
+}
+
+h1, h2 {
+    font-family: "Open Sans Semi Bold";
+    letter-spacing: 2.1px;
+    font-size: 21px;
+    padding-left: 12px;
+}
+
+h3, h4, h5 {
+    font-family: "Open Sans Light";
+    letter-spacing: 1px;
+    font-size: 14px;
+    padding-left: 12px;
+    padding-top: 4px;
+}
+
+p {
+    font-family: "Open Sans Light";
+    font-weight: 400;
+    font-size: 14px;
+    padding-left: 12px;
+}
+
+a {
+    text-decoration: none;
+}
+
+.bg-grey {
+    background-color: #31302F;
+}
+
+.text-padding {
+    padding: 5px;
+}
+
+/* Graph Layout ––––––––––––––––––––––––––––––––––––––––––––––––––*/
+.div-for-charts {
+    display: flex;
+    flex-direction: column;
+    height: 100vh;
+    width: 100%;
+}
+
+#histogram {
+    flex-grow: 1
+}
+
+#map-graph {
+    flex-grow: 2
+}
+
+.mapboxgl-canvas, .mapboxgl-map {
+    min-width: 100%;
+}
+
+/* Graph Control Objects ––––––––––––––––––––––––––––––––––––––––––––––––––*/
+.div-user-controls {
+    padding-left: 55px;
+    padding-top: 64px;
+}
+
+.opdown {
+    padding-top: 12px;
+    padding-bottom: 12px;
+}
+
+.div-for-dropdown-group {
+    padding: 12px;
+    background-color: #31302F;
+}
+
+.div-for-slider {
+    width: 97%;
+    text-align: center;
+}
+
+.logo {
+    height: 50px;
+    padding-bottom: 12px;
+}
+
+.Select-control, .Select-menu-outer, .Select-multi-value-wrapper, .select-up, .is-open .Select-control {
+    background-color: #1E1E1E;
+    color: white;
+
+}
+
+#modelselector .Select-control {
+    max-height: 82px;
+    overflow-y: auto;
+    margin: 0px 0px -3px 0px;
+    border: 0.5px solid #dbdbdb44;
+}
+
+.Select-control {
+    border: 0.5px solid #dbdbdb44;
+}
+
+.has-value.Select--single > .Select-control .Select-value .Select-value-label, .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label {
+    color: white;
+    background: #1E1E1E;
+    background-color: #1E1E1E;
+}
+
+._dash-app-content {
+    overflow-x: hidden;
+    overflow-y: hidden;
+    position: relative;
+}
+
+.has-value.Select--single > .Select-control .Select-value .Select-value-label, .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-labeln {
+    color: #d8d8d8;
+    font-weight: 400;
+    font-size: 14px;
+}
+
+.Input.DateInput_1 {
+    background-color: #1e1e1e;
+}
+
+#date {
+    background-color: #1e1e1e;
+    font-family: "Open Sans Light";
+    font-weight: 400;
+    color: #dbdbdb;
+    border: 0.5px solid #dbdbdb44;
+}
+
+#date-picker {
+    width: 100%;
+}
+
+._dash-undo-redo {
+    display: none;
+}
+
+.DateInput.DateInput_1 {
+    width: 100%;
+}
+
+.SingleDatePickerInput__withBorder {
+    border: none;
+}
+
+.DateInput.DateInput_1 {
+    background-color: #1e1e1e;
+}
+
+.SingleDatePickerInput__withBorder {
+    border-radius: 3px;
+    color: #dbdbdb;
+    background: #1e1e1e;
+    background-color: #1e1e1e;
+}
+
+.SingleDatePickerInput.SingleDatePickerInput_1.SingleDatePickerInput__withBorder.SingleDatePickerInput__withBorder_2 {
+    border: 0.0px solid #dbdbdb;
+    display: block;
+}
+
+.SingleDatePicker_1 {
+    border: 0.0px solid #dbdbdb;
+    display: block;
+}
+
+.SingleDatePicker_picker, .SingleDatePicker_picker_1, .SingleDatePicker_picker__directionLeft,
+.SingleDatePicker_picker__directionLeft_2 {
+    filter: invert(100%);
+}
+
+/* For Mobile Phones and small screens ––––––––––––––––––––––––––––––––––––––––––––––––––*/
+@media only screen and (max-width: 768px) {
+    .four, .eight {
+        min-width: 100%;
+    }
+
+    h1, h2, h3, p {
+        text-align: center;
+    }
+
+    body {
+        display: block;
+        margin: 0px;
+        overflow-y: scroll;
+    }
+
+    .div-for-charts {
+        padding: 0px;
+        width: 100%;
+        text-align: center;
+    }
+
+    .div-user-controls {
+        padding: 32px;
+    }
+
+    .side-by-side {
+        display: inline-block;
+        width: 48%;
+    }
+
+
+    .side-by-side-right {
+        display: inline-block;
+        width: 48%;
+        float: right;
+    }
+
+    .div-for-charts {
+        margin: 0px;
+    }
+}
+
+/* width */
+::-webkit-scrollbar {
+    width: 10px !important;
+    display: block !important;
+}
+
+/* Track */
+::-webkit-scrollbar-track {
+    background: #1e1e1e !important;
+    border-radius: 10px !important;
+    display: block !important;
+}
+
+/* Handle */
+::-webkit-scrollbar-thumb {
+    background: transparent;
+}
+
+/* Handle on hover */
+::-webkit-scrollbar-thumb:hover {
+    background: #d8d8d870 !important;
+}

+ 7 - 0
Assets/Plotting/assets/style.css.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7e0c2d3c0d848834283432870d98bceb
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 47 - 0
Assets/Plotting/data.py

@@ -0,0 +1,47 @@
+import math
+import os
+from functools import reduce
+from typing import Optional
+
+import pandas as pd
+
+
+class Data:
+    def __init__(self, base_path):
+        self.base_path = base_path
+        self.df: Optional[pd.DataFrame] = None
+        self.current_folder_name = ''
+        self.current_file_name = ''
+
+    def read_folder(self, path):
+        self.current_folder_name = path
+        if path is None:
+            return []
+        return [file for file in os.listdir(f'{self.base_path}/{path}') if file.endswith('.tsv')]
+
+    def read_data(self, file_name):
+        if file_name is None:
+            return None
+        self.current_file_name = file_name
+        self.df = pd.read_csv(f'{self.base_path}/{self.current_folder_name}/{file_name}', index_col=0, sep='\t')
+
+    def read_data_old(self, path):
+        if path is None:
+            return None
+        files_names = [file for file in os.listdir(f'{self.base_path}/{path}') if file.endswith('.tsv')]
+        frames = [pd.read_csv(f'{self.base_path}/{path}/{f}', index_col=0, sep='\t') for f in files_names]
+        if frames is None or len(frames) == 0:
+            return None
+        elif len(frames) == 1:
+            self.df = frames[0]
+        else:
+            self.df = reduce(
+                lambda left, right: left.merge(right, left_index=True, right_index=True,
+                                               sort=True,
+                                               how='outer'), frames[1:], frames[0])
+
+    def get_columns(self):
+        if self.df is None:
+            return []
+        else:
+            return list(self.df.columns)

+ 7 - 0
Assets/Plotting/data.py.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 70f3556234c82a74096646f72518692f
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 137 - 0
Assets/Plotting/main.py

@@ -0,0 +1,137 @@
+from typing import Optional
+
+import dash
+import dash_html_components as html
+import dash_core_components as dcc
+import os
+
+from dash.dependencies import Input, Output
+from functools import reduce
+
+# Load data
+from data import Data
+from tools import get_options, generate_figure
+
+logs_path = "../Logs"
+log_files = sorted([file for file in os.listdir(logs_path) if not '.' in file], reverse=True)
+d1 = Data(logs_path)
+d2 = Data(logs_path)
+
+# df = pd.read_csv('data/stockdata2.csv', index_col=0, parse_dates=True)
+# df.index = pd.to_datetime(df['Date'])
+
+# Initialize the app
+app = dash.Dash(__name__)
+app.config.suppress_callback_exceptions = True
+
+app.layout = html.Div(
+    children=[
+        html.Div(className='row',
+                 children=[
+                     html.Div(className='four columns div-user-controls',
+                              children=[
+                                  html.H2('VR Cycling - Visualize Logs'),
+                                  html.H3('Pick a log folder.'),
+                                  html.Div(
+                                      className='div-for-dropdown',
+                                      children=[
+                                          dcc.Dropdown(id='select-log', options=get_options(log_files),
+                                                       multi=False, value=None,
+                                                       style={'backgroundColor': '#1E1E1E'},
+                                                       )
+                                      ],
+                                      style={'color': '#F1F1F1'}),
+
+                                  html.Div(
+                                      className='div-for-dropdown-group',
+                                      children=[
+                                          html.H3('First plot:'),
+                                          dcc.Dropdown(id='select-file-1',
+                                                       multi=False,
+                                                       style={'backgroundColor': '#1E1E1E'}
+                                                       ),
+                                          html.H3('Pick one or more data items.'),
+                                          dcc.Dropdown(id='select-data-1',
+                                                       multi=True,
+                                                       style={'backgroundColor': '#1E1E1E'}
+                                                       )
+                                      ]
+                                  ),
+
+                                  html.Div(
+                                      className='div-for-dropdown-group',
+                                      children=[
+                                          html.H3('Second plot:'),
+                                          dcc.Dropdown(id='select-file-2',
+                                                       multi=False,
+                                                       style={'backgroundColor': '#1E1E1E'}
+                                                       ),
+                                          html.H3('Pick one or more data items.'),
+                                          dcc.Dropdown(id='select-data-2',
+                                                       multi=True,
+                                                       style={'backgroundColor': '#1E1E1E'}
+                                                       )
+                                      ])
+                              ]
+                              ),
+                     html.Div(className='eight columns div-for-charts bg-grey',
+                              children=[
+                                  dcc.Graph(id='data-plot-1', config={'displayModeBar': False}, animate=True),
+                                  html.Div(style={'height': '12px'}),
+                                  dcc.Graph(id='data-plot-2', config={'displayModeBar': False}, animate=True),
+                                  #dcc.Interval(
+                                  #    id='interval-component',
+                                  #    interval=1 * 1000,  # in milliseconds
+                                  #    n_intervals=0
+                                  #)
+                              ])
+                 ])
+    ]
+
+)
+
+
+@app.callback(Output('select-file-1', 'options'),
+              [Input('select-log', 'value')])
+def update_file_options_1(selected_folder):
+    files = d1.read_folder(selected_folder)
+    return get_options(files)
+
+
+@app.callback(Output('select-file-2', 'options'),
+              [Input('select-log', 'value')])
+def update_file_options_2(selected_folder):
+    files = d2.read_folder(selected_folder)
+    return get_options(files)
+
+
+@app.callback(Output('select-data-1', 'options'),
+              [Input('select-file-1', 'value')])
+def update_file_selection_1(selected_file):
+    d1.read_data(selected_file)
+    return get_options(d1.get_columns())
+
+
+@app.callback(Output('select-data-2', 'options'),
+              [Input('select-file-2', 'value')])
+def update_file_selection_2(selected_file):
+    d2.read_data(selected_file)
+    return get_options(d2.get_columns())
+
+
+@app.callback(Output('data-plot-1', 'figure'),
+              [Input('select-data-1', 'value')])
+def update_plot_1(selected_data_columns):
+    #print(f'Interval {n}')
+    return generate_figure(selected_data_columns, d1.df,
+                           f'Log Data - {d1.current_folder_name} - {d1.current_file_name}')
+
+
+@app.callback(Output('data-plot-2', 'figure'), [Input('select-data-2', 'value')])
+def update_plot_1(selected_data_columns):
+    return generate_figure(selected_data_columns, d2.df,
+                           f'Log Data - {d2.current_folder_name} - {d2.current_file_name}')
+
+
+if __name__ == '__main__':
+    app.run_server(debug=True)

+ 1 - 1
Assets/Plotting/venv/lib/python3.7/site-packages/pip/_internal/cli/main.py.meta → Assets/Plotting/main.py.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 08c39e65929fe4a6e84f3b62f8d36593
+guid: 684719e0aeeba9b409a88c3065c50b79
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 0 - 148
Assets/Plotting/plot.py

@@ -1,148 +0,0 @@
-import signal
-import sys
-
-from matplotlib import pyplot as plt
-import asyncio
-import os
-import time
-
-file_data = {}
-axes = {}
-labels = {}
-
-
-def tryParseInt(value):
-    if value is None or value == "":
-        return value, False
-    try:
-        return int(value), True
-    except ValueError:
-        return value, False
-
-
-def tryParseIntList(list):
-    new_vars = []
-    for i in list:
-        y, success = tryParseInt(i)
-        if not success:
-            new_vars = None
-            break
-        new_vars.append(y)
-    return new_vars
-
-
-async def follow(path):
-    with open(path, "r") as f:
-        labels[path] = f.readline().split("\t")
-        while True:
-            line = f.readline()
-            if not line:
-                # print("nothing new")
-                await asyncio.sleep(0.1)
-                continue
-            yield line
-        print("returned follow")
-
-
-def init_plt(paths):
-    plt.ion()
-    fig = plt.figure()
-
-    nrows = 1
-    ncolumns = 1
-    index = 1
-
-    while nrows * ncolumns < len(paths):
-        nrows += 1
-        if nrows * ncolumns >= len(paths):
-            break
-        ncolumns += 1
-
-    for key in paths:
-        axes[key] = fig.add_subplot(nrows, ncolumns, index)
-        index += 1
-
-    plt.subplots_adjust(hspace=0.5)
-
-    return fig
-
-
-def get_files():
-    return ["plots/{}".format(p) for p in [f for f in os.listdir("plots") if f.endswith(".tsv")]]
-
-
-async def read_file_data(path):
-    print(f"reading data for {path}")
-    lines = follow(path)
-    xs = []
-    ys = []
-
-    async for line in lines:
-        line_data = line.split("\t")
-
-        x, success = tryParseInt(line_data[0])
-        if success:
-            xs.append(x / 1000)
-
-            rest = tryParseIntList(line_data[1:])
-            if rest is not None:
-                if len(ys) == 0:
-                    ys = [[i] for i in rest]
-                else:
-                    for i in range(len(rest)):
-                        ys[i].append(rest[i])
-
-                file_data[path] = (xs, ys)
-                # print("added to file_data")
-
-    print("read all lines")
-
-
-async def plot_loop():
-    print("before plot loop")
-    while True:
-        if len(axes) > 0:
-            for key, ax in axes.items():
-                if len(file_data) > 0:
-                    xs, ys = file_data[key]
-                    # print("reading file data")
-                    ax.clear()
-                    for i in range(len(ys)):
-                        y = ys[i]
-                        ax.plot(xs, y, label=labels[key][i + 1], linewidth=0.7)
-                        ax.set_title(key)
-                        ax.set_xlabel(labels[key][0])
-                    left, right = ax.get_xlim()
-                    if right - left > 10:
-                        ax.set_xlim(right - 10, right)
-            plt.legend()
-            plt.pause(0.2)
-            await asyncio.sleep(0.2)
-            # await asyncio.sleep(1)
-
-
-async def test():
-    print("abc")
-
-
-def signal_handler(signal, frame):
-    loop.stop()
-    sys.exit(0)
-
-
-if __name__ == '__main__':
-    loop = asyncio.get_event_loop()
-    signal.signal(signal.SIGINT, signal_handler)
-
-    paths = get_files()
-    fig = init_plt(paths)
-
-    asyncio.ensure_future(test())
-
-    for p in paths:
-        asyncio.ensure_future(read_file_data(p))
-
-    asyncio.ensure_future(plot_loop())
-    asyncio.ensure_future(test())
-
-    loop.run_forever()

+ 0 - 8
Assets/Plotting/plots.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 3ae3e6584e8a5416da6df33d6446528f
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 44 - 0
Assets/Plotting/tools.py

@@ -0,0 +1,44 @@
+import plotly.graph_objects as go
+
+def get_options(options_list):
+    dict_list = []
+    for i in options_list:
+        dict_list.append({'label': i, 'value': i})
+
+    return dict_list
+
+def generate_figure(cols, df, title):
+    trace = []
+    # STEP 2
+    # Draw and append traces for each stock
+    for c in cols if cols is not None else []:
+        trace.append(go.Scatter(x=df.index,
+                                y=df[c],
+                                mode='lines',
+                                opacity=0.7,
+                                name=c,
+                                textposition='bottom center',
+                                showlegend=True))
+        # STEP 3
+    traces = [trace]
+    data = [val for sublist in traces for val in sublist]
+    # Define Figure
+    # STEP 4
+    figure = {'data': data,
+              'layout': go.Layout(
+                  colorway=["#5E0DAC", '#FF4F00', '#375CB1', '#FF7400', '#FFF400', '#FF0056'],
+                  template='plotly_dark',
+                  paper_bgcolor='rgba(0, 0, 0, 0)',
+                  plot_bgcolor='rgba(0, 0, 0, 0)',
+                  margin={'b': 15},
+                  hovermode='x',
+                  autosize=True,
+                  title={'text': title,
+                         'font': {'color': 'white'}, 'x': 0.5},
+                  xaxis={'range': [df.index.min() if df is not None else 0,
+                                   df.index.max() if df is not None else 0]},
+              ),
+
+              }
+
+    return figure

+ 7 - 0
Assets/Plotting/tools.py.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f78a286d56202ba49a2831e9855e8c8c
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 48328747ec0bd44bab2913d9818ce8a5
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 76
Assets/Plotting/venv/bin/activate

@@ -1,76 +0,0 @@
-# This file must be used with "source bin/activate" *from bash*
-# you cannot run it directly
-
-deactivate () {
-    # reset old environment variables
-    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
-        PATH="${_OLD_VIRTUAL_PATH:-}"
-        export PATH
-        unset _OLD_VIRTUAL_PATH
-    fi
-    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
-        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
-        export PYTHONHOME
-        unset _OLD_VIRTUAL_PYTHONHOME
-    fi
-
-    # This should detect bash and zsh, which have a hash command that must
-    # be called to get it to forget past commands.  Without forgetting
-    # past commands the $PATH changes we made may not be respected
-    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
-        hash -r
-    fi
-
-    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
-        PS1="${_OLD_VIRTUAL_PS1:-}"
-        export PS1
-        unset _OLD_VIRTUAL_PS1
-    fi
-
-    unset VIRTUAL_ENV
-    if [ ! "${1:-}" = "nondestructive" ] ; then
-    # Self destruct!
-        unset -f deactivate
-    fi
-}
-
-# unset irrelevant variables
-deactivate nondestructive
-
-VIRTUAL_ENV="/Users/marcel/Unity/VRCyling/Assets/Plotting/venv"
-export VIRTUAL_ENV
-
-_OLD_VIRTUAL_PATH="$PATH"
-PATH="$VIRTUAL_ENV/bin:$PATH"
-export PATH
-
-# unset PYTHONHOME if set
-# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
-# could use `if (set -u; : $PYTHONHOME) ;` in bash
-if [ -n "${PYTHONHOME:-}" ] ; then
-    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
-    unset PYTHONHOME
-fi
-
-if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
-    _OLD_VIRTUAL_PS1="${PS1:-}"
-    if [ "x(venv) " != x ] ; then
-	PS1="(venv) ${PS1:-}"
-    else
-    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
-        # special case for Aspen magic directories
-        # see http://www.zetadev.com/software/aspen/
-        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
-    else
-        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
-    fi
-    fi
-    export PS1
-fi
-
-# This should detect bash and zsh, which have a hash command that must
-# be called to get it to forget past commands.  Without forgetting
-# past commands the $PATH changes we made may not be respected
-if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
-    hash -r
-fi

+ 0 - 37
Assets/Plotting/venv/bin/activate.csh

@@ -1,37 +0,0 @@
-# This file must be used with "source bin/activate.csh" *from csh*.
-# You cannot run it directly.
-# Created by Davide Di Blasi <davidedb@gmail.com>.
-# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
-
-alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
-
-# Unset irrelevant variables.
-deactivate nondestructive
-
-setenv VIRTUAL_ENV "/Users/marcel/Unity/VRCyling/Assets/Plotting/venv"
-
-set _OLD_VIRTUAL_PATH="$PATH"
-setenv PATH "$VIRTUAL_ENV/bin:$PATH"
-
-
-set _OLD_VIRTUAL_PROMPT="$prompt"
-
-if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
-    if ("venv" != "") then
-        set env_name = "venv"
-    else
-        if (`basename "VIRTUAL_ENV"` == "__") then
-            # special case for Aspen magic directories
-            # see http://www.zetadev.com/software/aspen/
-            set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
-        else
-            set env_name = `basename "$VIRTUAL_ENV"`
-        endif
-    endif
-    set prompt = "[$env_name] $prompt"
-    unset env_name
-endif
-
-alias pydoc python -m pydoc
-
-rehash

+ 0 - 75
Assets/Plotting/venv/bin/activate.fish

@@ -1,75 +0,0 @@
-# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
-# you cannot run it directly
-
-function deactivate  -d "Exit virtualenv and return to normal shell environment"
-    # reset old environment variables
-    if test -n "$_OLD_VIRTUAL_PATH"
-        set -gx PATH $_OLD_VIRTUAL_PATH
-        set -e _OLD_VIRTUAL_PATH
-    end
-    if test -n "$_OLD_VIRTUAL_PYTHONHOME"
-        set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
-        set -e _OLD_VIRTUAL_PYTHONHOME
-    end
-
-    if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
-        functions -e fish_prompt
-        set -e _OLD_FISH_PROMPT_OVERRIDE
-        functions -c _old_fish_prompt fish_prompt
-        functions -e _old_fish_prompt
-    end
-
-    set -e VIRTUAL_ENV
-    if test "$argv[1]" != "nondestructive"
-        # Self destruct!
-        functions -e deactivate
-    end
-end
-
-# unset irrelevant variables
-deactivate nondestructive
-
-set -gx VIRTUAL_ENV "/Users/marcel/Unity/VRCyling/Assets/Plotting/venv"
-
-set -gx _OLD_VIRTUAL_PATH $PATH
-set -gx PATH "$VIRTUAL_ENV/bin" $PATH
-
-# unset PYTHONHOME if set
-if set -q PYTHONHOME
-    set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
-    set -e PYTHONHOME
-end
-
-if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
-    # fish uses a function instead of an env var to generate the prompt.
-
-    # save the current fish_prompt function as the function _old_fish_prompt
-    functions -c fish_prompt _old_fish_prompt
-
-    # with the original prompt function renamed, we can override with our own.
-    function fish_prompt
-        # Save the return status of the last command
-        set -l old_status $status
-
-        # Prompt override?
-        if test -n "(venv) "
-            printf "%s%s" "(venv) " (set_color normal)
-        else
-            # ...Otherwise, prepend env
-            set -l _checkbase (basename "$VIRTUAL_ENV")
-            if test $_checkbase = "__"
-                # special case for Aspen magic directories
-                # see http://www.zetadev.com/software/aspen/
-                printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
-            else
-                printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
-            end
-        end
-
-        # Restore the return status of the previous command.
-        echo "exit $old_status" | .
-        _old_fish_prompt
-    end
-
-    set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
-end

+ 0 - 8
Assets/Plotting/venv/bin/easy_install

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from setuptools.command.easy_install import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 8
Assets/Plotting/venv/bin/easy_install-3.7

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from setuptools.command.easy_install import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 7
Assets/Plotting/venv/bin/easy_install-3.7.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 6dd6d4a1cca624b8f91c0f61774df25a
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 7
Assets/Plotting/venv/bin/easy_install.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 88d7bb36faf9049f7a6c0005c10bb0bd
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/bin/f2py

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from numpy.f2py.f2py2e import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 7
Assets/Plotting/venv/bin/f2py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: a59dcd9e83d9f4592b18302983b237a7
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/bin/f2py3

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from numpy.f2py.f2py2e import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 8
Assets/Plotting/venv/bin/f2py3.7

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from numpy.f2py.f2py2e import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 7
Assets/Plotting/venv/bin/f2py3.7.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 8e868454d45c54ffebfb47fd433109d0
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 7
Assets/Plotting/venv/bin/f2py3.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: a84f030f89dcd4fee97cb99f6ac85eaa
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/bin/pip

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 7
Assets/Plotting/venv/bin/pip.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 4133e6e8a5a2a451e818bd4b047addc9
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/bin/pip3

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 8
Assets/Plotting/venv/bin/pip3.7

@@ -1,8 +0,0 @@
-#!/Users/marcel/Unity/VRCyling/Assets/Plotting/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from pip._internal.cli.main import main
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())

+ 0 - 7
Assets/Plotting/venv/bin/pip3.7.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: f39810bc523844123b6f4b477288516b
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 7
Assets/Plotting/venv/bin/pip3.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: e08c181c4bf304f8483e26aab9212c87
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 1
Assets/Plotting/venv/bin/python

@@ -1 +0,0 @@
-python3

+ 0 - 7
Assets/Plotting/venv/bin/python.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 2ca32f4d2e15440819884cd1f0bec7c6
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 1
Assets/Plotting/venv/bin/python3

@@ -1 +0,0 @@
-/usr/local/Cellar/python/3.7.7/bin/python3

+ 0 - 7
Assets/Plotting/venv/bin/python3.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 365c8b94899644f8eaaef8573f673243
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/lib.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: b5df9630233464f8090fefe05578b00d
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/lib/python3.7.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 8e89407068895468ebb692b6a0b4e58f
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/lib/python3.7/site-packages.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: fd8ca44976c9a4074ba1980f60ea12df
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Assets/Plotting/venv/lib/python3.7/site-packages/PIL.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 6e3f6e587f7424143922b50ce9087dd5
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libXau.6.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libfreetype.6.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libjpeg.9.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/liblcms2.2.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/liblzma.5.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libopenjp2.2.3.1.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libpng16.16.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libtiff.5.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebp.7.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebpdemux.2.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libwebpmux.3.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libxcb.1.1.0.dylib


BIN
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/.dylibs/libz.1.2.11.dylib


+ 0 - 110
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BdfFontFile.py

@@ -1,110 +0,0 @@
-#
-# The Python Imaging Library
-# $Id$
-#
-# bitmap distribution font (bdf) file parser
-#
-# history:
-# 1996-05-16 fl   created (as bdf2pil)
-# 1997-08-25 fl   converted to FontFile driver
-# 2001-05-25 fl   removed bogus __init__ call
-# 2002-11-20 fl   robustification (from Kevin Cazabon, Dmitry Vasiliev)
-# 2003-04-22 fl   more robustification (from Graham Dumpleton)
-#
-# Copyright (c) 1997-2003 by Secret Labs AB.
-# Copyright (c) 1997-2003 by Fredrik Lundh.
-#
-# See the README file for information on usage and redistribution.
-#
-
-"""
-Parse X Bitmap Distribution Format (BDF)
-"""
-
-
-from . import FontFile, Image
-
-bdf_slant = {
-    "R": "Roman",
-    "I": "Italic",
-    "O": "Oblique",
-    "RI": "Reverse Italic",
-    "RO": "Reverse Oblique",
-    "OT": "Other",
-}
-
-bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"}
-
-
-def bdf_char(f):
-    # skip to STARTCHAR
-    while True:
-        s = f.readline()
-        if not s:
-            return None
-        if s[:9] == b"STARTCHAR":
-            break
-    id = s[9:].strip().decode("ascii")
-
-    # load symbol properties
-    props = {}
-    while True:
-        s = f.readline()
-        if not s or s[:6] == b"BITMAP":
-            break
-        i = s.find(b" ")
-        props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii")
-
-    # load bitmap
-    bitmap = []
-    while True:
-        s = f.readline()
-        if not s or s[:7] == b"ENDCHAR":
-            break
-        bitmap.append(s[:-1])
-    bitmap = b"".join(bitmap)
-
-    [x, y, l, d] = [int(p) for p in props["BBX"].split()]
-    [dx, dy] = [int(p) for p in props["DWIDTH"].split()]
-
-    bbox = (dx, dy), (l, -d - y, x + l, -d), (0, 0, x, y)
-
-    try:
-        im = Image.frombytes("1", (x, y), bitmap, "hex", "1")
-    except ValueError:
-        # deal with zero-width characters
-        im = Image.new("1", (x, y))
-
-    return id, int(props["ENCODING"]), bbox, im
-
-
-class BdfFontFile(FontFile.FontFile):
-    """Font file plugin for the X11 BDF format."""
-
-    def __init__(self, fp):
-        super().__init__()
-
-        s = fp.readline()
-        if s[:13] != b"STARTFONT 2.1":
-            raise SyntaxError("not a valid BDF file")
-
-        props = {}
-        comments = []
-
-        while True:
-            s = fp.readline()
-            if not s or s[:13] == b"ENDPROPERTIES":
-                break
-            i = s.find(b" ")
-            props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii")
-            if s[:i] in [b"COMMENT", b"COPYRIGHT"]:
-                if s.find(b"LogicalFontDescription") < 0:
-                    comments.append(s[i + 1 : -1].decode("ascii"))
-
-        while True:
-            c = bdf_char(fp)
-            if not c:
-                break
-            id, ch, (xy, dst, src), im = c
-            if 0 <= ch < len(self.glyph):
-                self.glyph[ch] = xy, dst, src, im

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BdfFontFile.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 81fc70148fb6f4512ae1e42c0fa8673e
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 422
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BlpImagePlugin.py

@@ -1,422 +0,0 @@
-"""
-Blizzard Mipmap Format (.blp)
-Jerome Leclanche <jerome@leclan.ch>
-
-The contents of this file are hereby released in the public domain (CC0)
-Full text of the CC0 license:
-  https://creativecommons.org/publicdomain/zero/1.0/
-
-BLP1 files, used mostly in Warcraft III, are not fully supported.
-All types of BLP2 files used in World of Warcraft are supported.
-
-The BLP file structure consists of a header, up to 16 mipmaps of the
-texture
-
-Texture sizes must be powers of two, though the two dimensions do
-not have to be equal; 512x256 is valid, but 512x200 is not.
-The first mipmap (mipmap #0) is the full size image; each subsequent
-mipmap halves both dimensions. The final mipmap should be 1x1.
-
-BLP files come in many different flavours:
-* JPEG-compressed (type == 0) - only supported for BLP1.
-* RAW images (type == 1, encoding == 1). Each mipmap is stored as an
-  array of 8-bit values, one per pixel, left to right, top to bottom.
-  Each value is an index to the palette.
-* DXT-compressed (type == 1, encoding == 2):
-- DXT1 compression is used if alpha_encoding == 0.
-  - An additional alpha bit is used if alpha_depth == 1.
-  - DXT3 compression is used if alpha_encoding == 1.
-  - DXT5 compression is used if alpha_encoding == 7.
-"""
-
-import struct
-from io import BytesIO
-
-from . import Image, ImageFile
-
-BLP_FORMAT_JPEG = 0
-
-BLP_ENCODING_UNCOMPRESSED = 1
-BLP_ENCODING_DXT = 2
-BLP_ENCODING_UNCOMPRESSED_RAW_BGRA = 3
-
-BLP_ALPHA_ENCODING_DXT1 = 0
-BLP_ALPHA_ENCODING_DXT3 = 1
-BLP_ALPHA_ENCODING_DXT5 = 7
-
-
-def unpack_565(i):
-    return (((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3)
-
-
-def decode_dxt1(data, alpha=False):
-    """
-    input: one "row" of data (i.e. will produce 4*width pixels)
-    """
-
-    blocks = len(data) // 8  # number of blocks in row
-    ret = (bytearray(), bytearray(), bytearray(), bytearray())
-
-    for block in range(blocks):
-        # Decode next 8-byte block.
-        idx = block * 8
-        color0, color1, bits = struct.unpack_from("<HHI", data, idx)
-
-        r0, g0, b0 = unpack_565(color0)
-        r1, g1, b1 = unpack_565(color1)
-
-        # Decode this block into 4x4 pixels
-        # Accumulate the results onto our 4 row accumulators
-        for j in range(4):
-            for i in range(4):
-                # get next control op and generate a pixel
-
-                control = bits & 3
-                bits = bits >> 2
-
-                a = 0xFF
-                if control == 0:
-                    r, g, b = r0, g0, b0
-                elif control == 1:
-                    r, g, b = r1, g1, b1
-                elif control == 2:
-                    if color0 > color1:
-                        r = (2 * r0 + r1) // 3
-                        g = (2 * g0 + g1) // 3
-                        b = (2 * b0 + b1) // 3
-                    else:
-                        r = (r0 + r1) // 2
-                        g = (g0 + g1) // 2
-                        b = (b0 + b1) // 2
-                elif control == 3:
-                    if color0 > color1:
-                        r = (2 * r1 + r0) // 3
-                        g = (2 * g1 + g0) // 3
-                        b = (2 * b1 + b0) // 3
-                    else:
-                        r, g, b, a = 0, 0, 0, 0
-
-                if alpha:
-                    ret[j].extend([r, g, b, a])
-                else:
-                    ret[j].extend([r, g, b])
-
-    return ret
-
-
-def decode_dxt3(data):
-    """
-    input: one "row" of data (i.e. will produce 4*width pixels)
-    """
-
-    blocks = len(data) // 16  # number of blocks in row
-    ret = (bytearray(), bytearray(), bytearray(), bytearray())
-
-    for block in range(blocks):
-        idx = block * 16
-        block = data[idx : idx + 16]
-        # Decode next 16-byte block.
-        bits = struct.unpack_from("<8B", block)
-        color0, color1 = struct.unpack_from("<HH", block, 8)
-
-        (code,) = struct.unpack_from("<I", block, 12)
-
-        r0, g0, b0 = unpack_565(color0)
-        r1, g1, b1 = unpack_565(color1)
-
-        for j in range(4):
-            high = False  # Do we want the higher bits?
-            for i in range(4):
-                alphacode_index = (4 * j + i) // 2
-                a = bits[alphacode_index]
-                if high:
-                    high = False
-                    a >>= 4
-                else:
-                    high = True
-                    a &= 0xF
-                a *= 17  # We get a value between 0 and 15
-
-                color_code = (code >> 2 * (4 * j + i)) & 0x03
-
-                if color_code == 0:
-                    r, g, b = r0, g0, b0
-                elif color_code == 1:
-                    r, g, b = r1, g1, b1
-                elif color_code == 2:
-                    r = (2 * r0 + r1) // 3
-                    g = (2 * g0 + g1) // 3
-                    b = (2 * b0 + b1) // 3
-                elif color_code == 3:
-                    r = (2 * r1 + r0) // 3
-                    g = (2 * g1 + g0) // 3
-                    b = (2 * b1 + b0) // 3
-
-                ret[j].extend([r, g, b, a])
-
-    return ret
-
-
-def decode_dxt5(data):
-    """
-    input: one "row" of data (i.e. will produce 4 * width pixels)
-    """
-
-    blocks = len(data) // 16  # number of blocks in row
-    ret = (bytearray(), bytearray(), bytearray(), bytearray())
-
-    for block in range(blocks):
-        idx = block * 16
-        block = data[idx : idx + 16]
-        # Decode next 16-byte block.
-        a0, a1 = struct.unpack_from("<BB", block)
-
-        bits = struct.unpack_from("<6B", block, 2)
-        alphacode1 = bits[2] | (bits[3] << 8) | (bits[4] << 16) | (bits[5] << 24)
-        alphacode2 = bits[0] | (bits[1] << 8)
-
-        color0, color1 = struct.unpack_from("<HH", block, 8)
-
-        (code,) = struct.unpack_from("<I", block, 12)
-
-        r0, g0, b0 = unpack_565(color0)
-        r1, g1, b1 = unpack_565(color1)
-
-        for j in range(4):
-            for i in range(4):
-                # get next control op and generate a pixel
-                alphacode_index = 3 * (4 * j + i)
-
-                if alphacode_index <= 12:
-                    alphacode = (alphacode2 >> alphacode_index) & 0x07
-                elif alphacode_index == 15:
-                    alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06)
-                else:  # alphacode_index >= 18 and alphacode_index <= 45
-                    alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07
-
-                if alphacode == 0:
-                    a = a0
-                elif alphacode == 1:
-                    a = a1
-                elif a0 > a1:
-                    a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7
-                elif alphacode == 6:
-                    a = 0
-                elif alphacode == 7:
-                    a = 255
-                else:
-                    a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5
-
-                color_code = (code >> 2 * (4 * j + i)) & 0x03
-
-                if color_code == 0:
-                    r, g, b = r0, g0, b0
-                elif color_code == 1:
-                    r, g, b = r1, g1, b1
-                elif color_code == 2:
-                    r = (2 * r0 + r1) // 3
-                    g = (2 * g0 + g1) // 3
-                    b = (2 * b0 + b1) // 3
-                elif color_code == 3:
-                    r = (2 * r1 + r0) // 3
-                    g = (2 * g1 + g0) // 3
-                    b = (2 * b1 + b0) // 3
-
-                ret[j].extend([r, g, b, a])
-
-    return ret
-
-
-class BLPFormatError(NotImplementedError):
-    pass
-
-
-class BlpImageFile(ImageFile.ImageFile):
-    """
-    Blizzard Mipmap Format
-    """
-
-    format = "BLP"
-    format_description = "Blizzard Mipmap Format"
-
-    def _open(self):
-        self.magic = self.fp.read(4)
-        self._read_blp_header()
-
-        if self.magic == b"BLP1":
-            decoder = "BLP1"
-            self.mode = "RGB"
-        elif self.magic == b"BLP2":
-            decoder = "BLP2"
-            self.mode = "RGBA" if self._blp_alpha_depth else "RGB"
-        else:
-            raise BLPFormatError(f"Bad BLP magic {repr(self.magic)}")
-
-        self.tile = [(decoder, (0, 0) + self.size, 0, (self.mode, 0, 1))]
-
-    def _read_blp_header(self):
-        (self._blp_compression,) = struct.unpack("<i", self.fp.read(4))
-
-        (self._blp_encoding,) = struct.unpack("<b", self.fp.read(1))
-        (self._blp_alpha_depth,) = struct.unpack("<b", self.fp.read(1))
-        (self._blp_alpha_encoding,) = struct.unpack("<b", self.fp.read(1))
-        (self._blp_mips,) = struct.unpack("<b", self.fp.read(1))
-
-        self._size = struct.unpack("<II", self.fp.read(8))
-
-        if self.magic == b"BLP1":
-            # Only present for BLP1
-            (self._blp_encoding,) = struct.unpack("<i", self.fp.read(4))
-            (self._blp_subtype,) = struct.unpack("<i", self.fp.read(4))
-
-        self._blp_offsets = struct.unpack("<16I", self.fp.read(16 * 4))
-        self._blp_lengths = struct.unpack("<16I", self.fp.read(16 * 4))
-
-
-class _BLPBaseDecoder(ImageFile.PyDecoder):
-    _pulls_fd = True
-
-    def decode(self, buffer):
-        try:
-            self.fd.seek(0)
-            self.magic = self.fd.read(4)
-            self._read_blp_header()
-            self._load()
-        except struct.error as e:
-            raise OSError("Truncated Blp file") from e
-        return 0, 0
-
-    def _read_palette(self):
-        ret = []
-        for i in range(256):
-            try:
-                b, g, r, a = struct.unpack("<4B", self.fd.read(4))
-            except struct.error:
-                break
-            ret.append((b, g, r, a))
-        return ret
-
-    def _read_blp_header(self):
-        (self._blp_compression,) = struct.unpack("<i", self.fd.read(4))
-
-        (self._blp_encoding,) = struct.unpack("<b", self.fd.read(1))
-        (self._blp_alpha_depth,) = struct.unpack("<b", self.fd.read(1))
-        (self._blp_alpha_encoding,) = struct.unpack("<b", self.fd.read(1))
-        (self._blp_mips,) = struct.unpack("<b", self.fd.read(1))
-
-        self.size = struct.unpack("<II", self.fd.read(8))
-
-        if self.magic == b"BLP1":
-            # Only present for BLP1
-            (self._blp_encoding,) = struct.unpack("<i", self.fd.read(4))
-            (self._blp_subtype,) = struct.unpack("<i", self.fd.read(4))
-
-        self._blp_offsets = struct.unpack("<16I", self.fd.read(16 * 4))
-        self._blp_lengths = struct.unpack("<16I", self.fd.read(16 * 4))
-
-
-class BLP1Decoder(_BLPBaseDecoder):
-    def _load(self):
-        if self._blp_compression == BLP_FORMAT_JPEG:
-            self._decode_jpeg_stream()
-
-        elif self._blp_compression == 1:
-            if self._blp_encoding in (4, 5):
-                data = bytearray()
-                palette = self._read_palette()
-                _data = BytesIO(self.fd.read(self._blp_lengths[0]))
-                while True:
-                    try:
-                        (offset,) = struct.unpack("<B", _data.read(1))
-                    except struct.error:
-                        break
-                    b, g, r, a = palette[offset]
-                    data.extend([r, g, b])
-
-                self.set_as_raw(bytes(data))
-            else:
-                raise BLPFormatError(
-                    f"Unsupported BLP encoding {repr(self._blp_encoding)}"
-                )
-        else:
-            raise BLPFormatError(
-                f"Unsupported BLP compression {repr(self._blp_encoding)}"
-            )
-
-    def _decode_jpeg_stream(self):
-        from PIL.JpegImagePlugin import JpegImageFile
-
-        (jpeg_header_size,) = struct.unpack("<I", self.fd.read(4))
-        jpeg_header = self.fd.read(jpeg_header_size)
-        self.fd.read(self._blp_offsets[0] - self.fd.tell())  # What IS this?
-        data = self.fd.read(self._blp_lengths[0])
-        data = jpeg_header + data
-        data = BytesIO(data)
-        image = JpegImageFile(data)
-        self.tile = image.tile  # :/
-        self.fd = image.fp
-        self.mode = image.mode
-
-
-class BLP2Decoder(_BLPBaseDecoder):
-    def _load(self):
-        palette = self._read_palette()
-
-        data = bytearray()
-        self.fd.seek(self._blp_offsets[0])
-
-        if self._blp_compression == 1:
-            # Uncompressed or DirectX compression
-
-            if self._blp_encoding == BLP_ENCODING_UNCOMPRESSED:
-                _data = BytesIO(self.fd.read(self._blp_lengths[0]))
-                while True:
-                    try:
-                        (offset,) = struct.unpack("<B", _data.read(1))
-                    except struct.error:
-                        break
-                    b, g, r, a = palette[offset]
-                    data.extend((r, g, b))
-
-            elif self._blp_encoding == BLP_ENCODING_DXT:
-                if self._blp_alpha_encoding == BLP_ALPHA_ENCODING_DXT1:
-                    linesize = (self.size[0] + 3) // 4 * 8
-                    for yb in range((self.size[1] + 3) // 4):
-                        for d in decode_dxt1(
-                            self.fd.read(linesize), alpha=bool(self._blp_alpha_depth)
-                        ):
-                            data += d
-
-                elif self._blp_alpha_encoding == BLP_ALPHA_ENCODING_DXT3:
-                    linesize = (self.size[0] + 3) // 4 * 16
-                    for yb in range((self.size[1] + 3) // 4):
-                        for d in decode_dxt3(self.fd.read(linesize)):
-                            data += d
-
-                elif self._blp_alpha_encoding == BLP_ALPHA_ENCODING_DXT5:
-                    linesize = (self.size[0] + 3) // 4 * 16
-                    for yb in range((self.size[1] + 3) // 4):
-                        for d in decode_dxt5(self.fd.read(linesize)):
-                            data += d
-                else:
-                    raise BLPFormatError(
-                        f"Unsupported alpha encoding {repr(self._blp_alpha_encoding)}"
-                    )
-            else:
-                raise BLPFormatError(f"Unknown BLP encoding {repr(self._blp_encoding)}")
-
-        else:
-            raise BLPFormatError(
-                f"Unknown BLP compression {repr(self._blp_compression)}"
-            )
-
-        self.set_as_raw(bytes(data))
-
-
-Image.register_open(
-    BlpImageFile.format, BlpImageFile, lambda p: p[:4] in (b"BLP1", b"BLP2")
-)
-Image.register_extension(BlpImageFile.format, ".blp")
-
-Image.register_decoder("BLP1", BLP1Decoder)
-Image.register_decoder("BLP2", BLP2Decoder)

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BlpImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 243af4b5cdd6f468e92736c44c059e9d
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 381
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BmpImagePlugin.py

@@ -1,381 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# BMP file handler
-#
-# Windows (and OS/2) native bitmap storage format.
-#
-# history:
-# 1995-09-01 fl   Created
-# 1996-04-30 fl   Added save
-# 1997-08-27 fl   Fixed save of 1-bit images
-# 1998-03-06 fl   Load P images as L where possible
-# 1998-07-03 fl   Load P images as 1 where possible
-# 1998-12-29 fl   Handle small palettes
-# 2002-12-30 fl   Fixed load of 1-bit palette images
-# 2003-04-21 fl   Fixed load of 1-bit monochrome images
-# 2003-04-23 fl   Added limited support for BI_BITFIELDS compression
-#
-# Copyright (c) 1997-2003 by Secret Labs AB
-# Copyright (c) 1995-2003 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-
-from . import Image, ImageFile, ImagePalette
-from ._binary import i8
-from ._binary import i16le as i16
-from ._binary import i32le as i32
-from ._binary import o8
-from ._binary import o16le as o16
-from ._binary import o32le as o32
-
-#
-# --------------------------------------------------------------------
-# Read BMP file
-
-BIT2MODE = {
-    # bits => mode, rawmode
-    1: ("P", "P;1"),
-    4: ("P", "P;4"),
-    8: ("P", "P"),
-    16: ("RGB", "BGR;15"),
-    24: ("RGB", "BGR"),
-    32: ("RGB", "BGRX"),
-}
-
-
-def _accept(prefix):
-    return prefix[:2] == b"BM"
-
-
-def _dib_accept(prefix):
-    return i32(prefix[:4]) in [12, 40, 64, 108, 124]
-
-
-# =============================================================================
-# Image plugin for the Windows BMP format.
-# =============================================================================
-class BmpImageFile(ImageFile.ImageFile):
-    """ Image plugin for the Windows Bitmap format (BMP) """
-
-    # ------------------------------------------------------------- Description
-    format_description = "Windows Bitmap"
-    format = "BMP"
-
-    # -------------------------------------------------- BMP Compression values
-    COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5}
-    for k, v in COMPRESSIONS.items():
-        vars()[k] = v
-
-    def _bitmap(self, header=0, offset=0):
-        """ Read relevant info about the BMP """
-        read, seek = self.fp.read, self.fp.seek
-        if header:
-            seek(header)
-        file_info = {}
-        # read bmp header size @offset 14 (this is part of the header size)
-        file_info["header_size"] = i32(read(4))
-        file_info["direction"] = -1
-
-        # -------------------- If requested, read header at a specific position
-        # read the rest of the bmp header, without its size
-        header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4)
-
-        # -------------------------------------------------- IBM OS/2 Bitmap v1
-        # ----- This format has different offsets because of width/height types
-        if file_info["header_size"] == 12:
-            file_info["width"] = i16(header_data[0:2])
-            file_info["height"] = i16(header_data[2:4])
-            file_info["planes"] = i16(header_data[4:6])
-            file_info["bits"] = i16(header_data[6:8])
-            file_info["compression"] = self.RAW
-            file_info["palette_padding"] = 3
-
-        # --------------------------------------------- Windows Bitmap v2 to v5
-        # v3, OS/2 v2, v4, v5
-        elif file_info["header_size"] in (40, 64, 108, 124):
-            file_info["y_flip"] = i8(header_data[7]) == 0xFF
-            file_info["direction"] = 1 if file_info["y_flip"] else -1
-            file_info["width"] = i32(header_data[0:4])
-            file_info["height"] = (
-                i32(header_data[4:8])
-                if not file_info["y_flip"]
-                else 2 ** 32 - i32(header_data[4:8])
-            )
-            file_info["planes"] = i16(header_data[8:10])
-            file_info["bits"] = i16(header_data[10:12])
-            file_info["compression"] = i32(header_data[12:16])
-            # byte size of pixel data
-            file_info["data_size"] = i32(header_data[16:20])
-            file_info["pixels_per_meter"] = (
-                i32(header_data[20:24]),
-                i32(header_data[24:28]),
-            )
-            file_info["colors"] = i32(header_data[28:32])
-            file_info["palette_padding"] = 4
-            self.info["dpi"] = tuple(
-                int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"]
-            )
-            if file_info["compression"] == self.BITFIELDS:
-                if len(header_data) >= 52:
-                    for idx, mask in enumerate(
-                        ["r_mask", "g_mask", "b_mask", "a_mask"]
-                    ):
-                        file_info[mask] = i32(header_data[36 + idx * 4 : 40 + idx * 4])
-                else:
-                    # 40 byte headers only have the three components in the
-                    # bitfields masks, ref:
-                    # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx
-                    # See also
-                    # https://github.com/python-pillow/Pillow/issues/1293
-                    # There is a 4th component in the RGBQuad, in the alpha
-                    # location, but it is listed as a reserved component,
-                    # and it is not generally an alpha channel
-                    file_info["a_mask"] = 0x0
-                    for mask in ["r_mask", "g_mask", "b_mask"]:
-                        file_info[mask] = i32(read(4))
-                file_info["rgb_mask"] = (
-                    file_info["r_mask"],
-                    file_info["g_mask"],
-                    file_info["b_mask"],
-                )
-                file_info["rgba_mask"] = (
-                    file_info["r_mask"],
-                    file_info["g_mask"],
-                    file_info["b_mask"],
-                    file_info["a_mask"],
-                )
-        else:
-            raise OSError(f"Unsupported BMP header type ({file_info['header_size']})")
-
-        # ------------------ Special case : header is reported 40, which
-        # ---------------------- is shorter than real size for bpp >= 16
-        self._size = file_info["width"], file_info["height"]
-
-        # ------- If color count was not found in the header, compute from bits
-        file_info["colors"] = (
-            file_info["colors"]
-            if file_info.get("colors", 0)
-            else (1 << file_info["bits"])
-        )
-
-        # ---------------------- Check bit depth for unusual unsupported values
-        self.mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None))
-        if self.mode is None:
-            raise OSError(f"Unsupported BMP pixel depth ({file_info['bits']})")
-
-        # ---------------- Process BMP with Bitfields compression (not palette)
-        if file_info["compression"] == self.BITFIELDS:
-            SUPPORTED = {
-                32: [
-                    (0xFF0000, 0xFF00, 0xFF, 0x0),
-                    (0xFF0000, 0xFF00, 0xFF, 0xFF000000),
-                    (0xFF, 0xFF00, 0xFF0000, 0xFF000000),
-                    (0x0, 0x0, 0x0, 0x0),
-                    (0xFF000000, 0xFF0000, 0xFF00, 0x0),
-                ],
-                24: [(0xFF0000, 0xFF00, 0xFF)],
-                16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)],
-            }
-            MASK_MODES = {
-                (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX",
-                (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR",
-                (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA",
-                (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA",
-                (32, (0x0, 0x0, 0x0, 0x0)): "BGRA",
-                (24, (0xFF0000, 0xFF00, 0xFF)): "BGR",
-                (16, (0xF800, 0x7E0, 0x1F)): "BGR;16",
-                (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15",
-            }
-            if file_info["bits"] in SUPPORTED:
-                if (
-                    file_info["bits"] == 32
-                    and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]]
-                ):
-                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])]
-                    self.mode = "RGBA" if "A" in raw_mode else self.mode
-                elif (
-                    file_info["bits"] in (24, 16)
-                    and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]]
-                ):
-                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])]
-                else:
-                    raise OSError("Unsupported BMP bitfields layout")
-            else:
-                raise OSError("Unsupported BMP bitfields layout")
-        elif file_info["compression"] == self.RAW:
-            if file_info["bits"] == 32 and header == 22:  # 32-bit .cur offset
-                raw_mode, self.mode = "BGRA", "RGBA"
-        else:
-            raise OSError(f"Unsupported BMP compression ({file_info['compression']})")
-
-        # --------------- Once the header is processed, process the palette/LUT
-        if self.mode == "P":  # Paletted for 1, 4 and 8 bit images
-
-            # ---------------------------------------------------- 1-bit images
-            if not (0 < file_info["colors"] <= 65536):
-                raise OSError(f"Unsupported BMP Palette size ({file_info['colors']})")
-            else:
-                padding = file_info["palette_padding"]
-                palette = read(padding * file_info["colors"])
-                greyscale = True
-                indices = (
-                    (0, 255)
-                    if file_info["colors"] == 2
-                    else list(range(file_info["colors"]))
-                )
-
-                # ----------------- Check if greyscale and ignore palette if so
-                for ind, val in enumerate(indices):
-                    rgb = palette[ind * padding : ind * padding + 3]
-                    if rgb != o8(val) * 3:
-                        greyscale = False
-
-                # ------- If all colors are grey, white or black, ditch palette
-                if greyscale:
-                    self.mode = "1" if file_info["colors"] == 2 else "L"
-                    raw_mode = self.mode
-                else:
-                    self.mode = "P"
-                    self.palette = ImagePalette.raw(
-                        "BGRX" if padding == 4 else "BGR", palette
-                    )
-
-        # ---------------------------- Finally set the tile data for the plugin
-        self.info["compression"] = file_info["compression"]
-        self.tile = [
-            (
-                "raw",
-                (0, 0, file_info["width"], file_info["height"]),
-                offset or self.fp.tell(),
-                (
-                    raw_mode,
-                    ((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3),
-                    file_info["direction"],
-                ),
-            )
-        ]
-
-    def _open(self):
-        """ Open file, check magic number and read header """
-        # read 14 bytes: magic number, filesize, reserved, header final offset
-        head_data = self.fp.read(14)
-        # choke if the file does not have the required magic bytes
-        if not _accept(head_data):
-            raise SyntaxError("Not a BMP file")
-        # read the start position of the BMP image data (u32)
-        offset = i32(head_data[10:14])
-        # load bitmap information (offset=raster info)
-        self._bitmap(offset=offset)
-
-
-# =============================================================================
-# Image plugin for the DIB format (BMP alias)
-# =============================================================================
-class DibImageFile(BmpImageFile):
-
-    format = "DIB"
-    format_description = "Windows Bitmap"
-
-    def _open(self):
-        self._bitmap()
-
-
-#
-# --------------------------------------------------------------------
-# Write BMP file
-
-
-SAVE = {
-    "1": ("1", 1, 2),
-    "L": ("L", 8, 256),
-    "P": ("P", 8, 256),
-    "RGB": ("BGR", 24, 0),
-    "RGBA": ("BGRA", 32, 0),
-}
-
-
-def _dib_save(im, fp, filename):
-    _save(im, fp, filename, False)
-
-
-def _save(im, fp, filename, bitmap_header=True):
-    try:
-        rawmode, bits, colors = SAVE[im.mode]
-    except KeyError as e:
-        raise OSError(f"cannot write mode {im.mode} as BMP") from e
-
-    info = im.encoderinfo
-
-    dpi = info.get("dpi", (96, 96))
-
-    # 1 meter == 39.3701 inches
-    ppm = tuple(map(lambda x: int(x * 39.3701 + 0.5), dpi))
-
-    stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3)
-    header = 40  # or 64 for OS/2 version 2
-    image = stride * im.size[1]
-
-    # bitmap header
-    if bitmap_header:
-        offset = 14 + header + colors * 4
-        file_size = offset + image
-        if file_size > 2 ** 32 - 1:
-            raise ValueError("File size is too large for the BMP format")
-        fp.write(
-            b"BM"  # file type (magic)
-            + o32(file_size)  # file size
-            + o32(0)  # reserved
-            + o32(offset)  # image data offset
-        )
-
-    # bitmap info header
-    fp.write(
-        o32(header)  # info header size
-        + o32(im.size[0])  # width
-        + o32(im.size[1])  # height
-        + o16(1)  # planes
-        + o16(bits)  # depth
-        + o32(0)  # compression (0=uncompressed)
-        + o32(image)  # size of bitmap
-        + o32(ppm[0])  # resolution
-        + o32(ppm[1])  # resolution
-        + o32(colors)  # colors used
-        + o32(colors)  # colors important
-    )
-
-    fp.write(b"\0" * (header - 40))  # padding (for OS/2 format)
-
-    if im.mode == "1":
-        for i in (0, 255):
-            fp.write(o8(i) * 4)
-    elif im.mode == "L":
-        for i in range(256):
-            fp.write(o8(i) * 4)
-    elif im.mode == "P":
-        fp.write(im.im.getpalette("RGB", "BGRX"))
-
-    ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))])
-
-
-#
-# --------------------------------------------------------------------
-# Registry
-
-
-Image.register_open(BmpImageFile.format, BmpImageFile, _accept)
-Image.register_save(BmpImageFile.format, _save)
-
-Image.register_extension(BmpImageFile.format, ".bmp")
-
-Image.register_mime(BmpImageFile.format, "image/bmp")
-
-Image.register_open(DibImageFile.format, DibImageFile, _dib_accept)
-Image.register_save(DibImageFile.format, _dib_save)
-
-Image.register_extension(DibImageFile.format, ".dib")
-
-Image.register_mime(DibImageFile.format, "image/bmp")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BmpImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 69bf4f4ee213d4810bcdbaefc0668944
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 73
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BufrStubImagePlugin.py

@@ -1,73 +0,0 @@
-#
-# The Python Imaging Library
-# $Id$
-#
-# BUFR stub adapter
-#
-# Copyright (c) 1996-2003 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-from . import Image, ImageFile
-
-_handler = None
-
-
-def register_handler(handler):
-    """
-    Install application-specific BUFR image handler.
-
-    :param handler: Handler object.
-    """
-    global _handler
-    _handler = handler
-
-
-# --------------------------------------------------------------------
-# Image adapter
-
-
-def _accept(prefix):
-    return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC"
-
-
-class BufrStubImageFile(ImageFile.StubImageFile):
-
-    format = "BUFR"
-    format_description = "BUFR"
-
-    def _open(self):
-
-        offset = self.fp.tell()
-
-        if not _accept(self.fp.read(4)):
-            raise SyntaxError("Not a BUFR file")
-
-        self.fp.seek(offset)
-
-        # make something up
-        self.mode = "F"
-        self._size = 1, 1
-
-        loader = self._load()
-        if loader:
-            loader.open(self)
-
-    def _load(self):
-        return _handler
-
-
-def _save(im, fp, filename):
-    if _handler is None or not hasattr("_handler", "save"):
-        raise OSError("BUFR save handler not installed")
-    _handler.save(im, fp, filename)
-
-
-# --------------------------------------------------------------------
-# Registry
-
-Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept)
-Image.register_save(BufrStubImageFile.format, _save)
-
-Image.register_extension(BufrStubImageFile.format, ".bufr")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/BufrStubImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 1ebfe6b60c4004d72bdc374e113c0185
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 120
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ContainerIO.py

@@ -1,120 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# a class to read from a container file
-#
-# History:
-# 1995-06-18 fl     Created
-# 1995-09-07 fl     Added readline(), readlines()
-#
-# Copyright (c) 1997-2001 by Secret Labs AB
-# Copyright (c) 1995 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-
-import io
-
-
-class ContainerIO:
-    """
-    A file object that provides read access to a part of an existing
-    file (for example a TAR file).
-    """
-
-    def __init__(self, file, offset, length):
-        """
-        Create file object.
-
-        :param file: Existing file.
-        :param offset: Start of region, in bytes.
-        :param length: Size of region, in bytes.
-        """
-        self.fh = file
-        self.pos = 0
-        self.offset = offset
-        self.length = length
-        self.fh.seek(offset)
-
-    ##
-    # Always false.
-
-    def isatty(self):
-        return False
-
-    def seek(self, offset, mode=io.SEEK_SET):
-        """
-        Move file pointer.
-
-        :param offset: Offset in bytes.
-        :param mode: Starting position. Use 0 for beginning of region, 1
-           for current offset, and 2 for end of region.  You cannot move
-           the pointer outside the defined region.
-        """
-        if mode == 1:
-            self.pos = self.pos + offset
-        elif mode == 2:
-            self.pos = self.length + offset
-        else:
-            self.pos = offset
-        # clamp
-        self.pos = max(0, min(self.pos, self.length))
-        self.fh.seek(self.offset + self.pos)
-
-    def tell(self):
-        """
-        Get current file pointer.
-
-        :returns: Offset from start of region, in bytes.
-        """
-        return self.pos
-
-    def read(self, n=0):
-        """
-        Read data.
-
-        :param n: Number of bytes to read. If omitted or zero,
-            read until end of region.
-        :returns: An 8-bit string.
-        """
-        if n:
-            n = min(n, self.length - self.pos)
-        else:
-            n = self.length - self.pos
-        if not n:  # EOF
-            return b"" if "b" in self.fh.mode else ""
-        self.pos = self.pos + n
-        return self.fh.read(n)
-
-    def readline(self):
-        """
-        Read a line of text.
-
-        :returns: An 8-bit string.
-        """
-        s = b"" if "b" in self.fh.mode else ""
-        newline_character = b"\n" if "b" in self.fh.mode else "\n"
-        while True:
-            c = self.read(1)
-            if not c:
-                break
-            s = s + c
-            if c == newline_character:
-                break
-        return s
-
-    def readlines(self):
-        """
-        Read multiple lines of text.
-
-        :returns: A list of 8-bit strings.
-        """
-        lines = []
-        while True:
-            s = self.readline()
-            if not s:
-                break
-            lines.append(s)
-        return lines

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ContainerIO.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 59afeda3dcc9a4386b3d218eda8e34cc
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 76
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/CurImagePlugin.py

@@ -1,76 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# Windows Cursor support for PIL
-#
-# notes:
-#       uses BmpImagePlugin.py to read the bitmap data.
-#
-# history:
-#       96-05-27 fl     Created
-#
-# Copyright (c) Secret Labs AB 1997.
-# Copyright (c) Fredrik Lundh 1996.
-#
-# See the README file for information on usage and redistribution.
-#
-from . import BmpImagePlugin, Image
-from ._binary import i8
-from ._binary import i16le as i16
-from ._binary import i32le as i32
-
-#
-# --------------------------------------------------------------------
-
-
-def _accept(prefix):
-    return prefix[:4] == b"\0\0\2\0"
-
-
-##
-# Image plugin for Windows Cursor files.
-
-
-class CurImageFile(BmpImagePlugin.BmpImageFile):
-
-    format = "CUR"
-    format_description = "Windows Cursor"
-
-    def _open(self):
-
-        offset = self.fp.tell()
-
-        # check magic
-        s = self.fp.read(6)
-        if not _accept(s):
-            raise SyntaxError("not a CUR file")
-
-        # pick the largest cursor in the file
-        m = b""
-        for i in range(i16(s[4:])):
-            s = self.fp.read(16)
-            if not m:
-                m = s
-            elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]):
-                m = s
-        if not m:
-            raise TypeError("No cursors were found")
-
-        # load as bitmap
-        self._bitmap(i32(m[12:]) + offset)
-
-        # patch up the bitmap height
-        self._size = self.size[0], self.size[1] // 2
-        d, e, o, a = self.tile[0]
-        self.tile[0] = d, (0, 0) + self.size, o, a
-
-        return
-
-
-#
-# --------------------------------------------------------------------
-
-Image.register_open(CurImageFile.format, CurImageFile, _accept)
-
-Image.register_extension(CurImageFile.format, ".cur")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/CurImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 1b3af07e55d274edd9157173ef1411d4
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 89
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DcxImagePlugin.py

@@ -1,89 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# DCX file handling
-#
-# DCX is a container file format defined by Intel, commonly used
-# for fax applications.  Each DCX file consists of a directory
-# (a list of file offsets) followed by a set of (usually 1-bit)
-# PCX files.
-#
-# History:
-# 1995-09-09 fl   Created
-# 1996-03-20 fl   Properly derived from PcxImageFile.
-# 1998-07-15 fl   Renamed offset attribute to avoid name clash
-# 2002-07-30 fl   Fixed file handling
-#
-# Copyright (c) 1997-98 by Secret Labs AB.
-# Copyright (c) 1995-96 by Fredrik Lundh.
-#
-# See the README file for information on usage and redistribution.
-#
-
-from . import Image
-from ._binary import i32le as i32
-from .PcxImagePlugin import PcxImageFile
-
-MAGIC = 0x3ADE68B1  # QUIZ: what's this value, then?
-
-
-def _accept(prefix):
-    return len(prefix) >= 4 and i32(prefix) == MAGIC
-
-
-##
-# Image plugin for the Intel DCX format.
-
-
-class DcxImageFile(PcxImageFile):
-
-    format = "DCX"
-    format_description = "Intel DCX"
-    _close_exclusive_fp_after_loading = False
-
-    def _open(self):
-
-        # Header
-        s = self.fp.read(4)
-        if not _accept(s):
-            raise SyntaxError("not a DCX file")
-
-        # Component directory
-        self._offset = []
-        for i in range(1024):
-            offset = i32(self.fp.read(4))
-            if not offset:
-                break
-            self._offset.append(offset)
-
-        self.__fp = self.fp
-        self.frame = None
-        self.n_frames = len(self._offset)
-        self.is_animated = self.n_frames > 1
-        self.seek(0)
-
-    def seek(self, frame):
-        if not self._seek_check(frame):
-            return
-        self.frame = frame
-        self.fp = self.__fp
-        self.fp.seek(self._offset[frame])
-        PcxImageFile._open(self)
-
-    def tell(self):
-        return self.frame
-
-    def _close__fp(self):
-        try:
-            if self.__fp != self.fp:
-                self.__fp.close()
-        except AttributeError:
-            pass
-        finally:
-            self.__fp = None
-
-
-Image.register_open(DcxImageFile.format, DcxImageFile, _accept)
-
-Image.register_extension(DcxImageFile.format, ".dcx")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DcxImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 05216b337235a4152b435a4850b20ff5
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 178
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DdsImagePlugin.py

@@ -1,178 +0,0 @@
-"""
-A Pillow loader for .dds files (S3TC-compressed aka DXTC)
-Jerome Leclanche <jerome@leclan.ch>
-
-Documentation:
-  https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt
-
-The contents of this file are hereby released in the public domain (CC0)
-Full text of the CC0 license:
-  https://creativecommons.org/publicdomain/zero/1.0/
-"""
-
-import struct
-from io import BytesIO
-
-from . import Image, ImageFile
-
-# Magic ("DDS ")
-DDS_MAGIC = 0x20534444
-
-# DDS flags
-DDSD_CAPS = 0x1
-DDSD_HEIGHT = 0x2
-DDSD_WIDTH = 0x4
-DDSD_PITCH = 0x8
-DDSD_PIXELFORMAT = 0x1000
-DDSD_MIPMAPCOUNT = 0x20000
-DDSD_LINEARSIZE = 0x80000
-DDSD_DEPTH = 0x800000
-
-# DDS caps
-DDSCAPS_COMPLEX = 0x8
-DDSCAPS_TEXTURE = 0x1000
-DDSCAPS_MIPMAP = 0x400000
-
-DDSCAPS2_CUBEMAP = 0x200
-DDSCAPS2_CUBEMAP_POSITIVEX = 0x400
-DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800
-DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000
-DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000
-DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000
-DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000
-DDSCAPS2_VOLUME = 0x200000
-
-# Pixel Format
-DDPF_ALPHAPIXELS = 0x1
-DDPF_ALPHA = 0x2
-DDPF_FOURCC = 0x4
-DDPF_PALETTEINDEXED8 = 0x20
-DDPF_RGB = 0x40
-DDPF_LUMINANCE = 0x20000
-
-
-# dds.h
-
-DDS_FOURCC = DDPF_FOURCC
-DDS_RGB = DDPF_RGB
-DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS
-DDS_LUMINANCE = DDPF_LUMINANCE
-DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS
-DDS_ALPHA = DDPF_ALPHA
-DDS_PAL8 = DDPF_PALETTEINDEXED8
-
-DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT
-DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT
-DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH
-DDS_HEADER_FLAGS_PITCH = DDSD_PITCH
-DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE
-
-DDS_HEIGHT = DDSD_HEIGHT
-DDS_WIDTH = DDSD_WIDTH
-
-DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE
-DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP
-DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX
-
-DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX
-DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX
-DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY
-DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY
-DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ
-DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ
-
-
-# DXT1
-DXT1_FOURCC = 0x31545844
-
-# DXT3
-DXT3_FOURCC = 0x33545844
-
-# DXT5
-DXT5_FOURCC = 0x35545844
-
-
-# dxgiformat.h
-
-DXGI_FORMAT_BC7_TYPELESS = 97
-DXGI_FORMAT_BC7_UNORM = 98
-DXGI_FORMAT_BC7_UNORM_SRGB = 99
-
-
-class DdsImageFile(ImageFile.ImageFile):
-    format = "DDS"
-    format_description = "DirectDraw Surface"
-
-    def _open(self):
-        magic, header_size = struct.unpack("<II", self.fp.read(8))
-        if header_size != 124:
-            raise OSError(f"Unsupported header size {repr(header_size)}")
-        header_bytes = self.fp.read(header_size - 4)
-        if len(header_bytes) != 120:
-            raise OSError(f"Incomplete header: {len(header_bytes)} bytes")
-        header = BytesIO(header_bytes)
-
-        flags, height, width = struct.unpack("<3I", header.read(12))
-        self._size = (width, height)
-        self.mode = "RGBA"
-
-        pitch, depth, mipmaps = struct.unpack("<3I", header.read(12))
-        struct.unpack("<11I", header.read(44))  # reserved
-
-        # pixel format
-        pfsize, pfflags = struct.unpack("<2I", header.read(8))
-        fourcc = header.read(4)
-        (bitcount,) = struct.unpack("<I", header.read(4))
-        masks = struct.unpack("<4I", header.read(16))
-        if pfflags & 0x40:
-            # DDPF_RGB - Texture contains uncompressed RGB data
-            masks = {mask: ["R", "G", "B", "A"][i] for i, mask in enumerate(masks)}
-            rawmode = ""
-            if bitcount == 32:
-                rawmode += masks[0xFF000000]
-            rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF]
-
-            self.tile = [("raw", (0, 0) + self.size, 0, (rawmode, 0, 1))]
-        else:
-            data_start = header_size + 4
-            n = 0
-            if fourcc == b"DXT1":
-                self.pixel_format = "DXT1"
-                n = 1
-            elif fourcc == b"DXT3":
-                self.pixel_format = "DXT3"
-                n = 2
-            elif fourcc == b"DXT5":
-                self.pixel_format = "DXT5"
-                n = 3
-            elif fourcc == b"DX10":
-                data_start += 20
-                # ignoring flags which pertain to volume textures and cubemaps
-                dxt10 = BytesIO(self.fp.read(20))
-                dxgi_format, dimension = struct.unpack("<II", dxt10.read(8))
-                if dxgi_format in (DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM):
-                    self.pixel_format = "BC7"
-                    n = 7
-                elif dxgi_format == DXGI_FORMAT_BC7_UNORM_SRGB:
-                    self.pixel_format = "BC7"
-                    self.info["gamma"] = 1 / 2.2
-                    n = 7
-                else:
-                    raise NotImplementedError(
-                        f"Unimplemented DXGI format {dxgi_format}"
-                    )
-            else:
-                raise NotImplementedError(f"Unimplemented pixel format {repr(fourcc)}")
-
-            self.tile = [("bcn", (0, 0) + self.size, data_start, (n))]
-
-    def load_seek(self, pos):
-        pass
-
-
-def _validate(prefix):
-    return prefix[:4] == b"DDS "
-
-
-Image.register_open(DdsImageFile.format, DdsImageFile, _validate)
-Image.register_extension(DdsImageFile.format, ".dds")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/DdsImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 40bccfb30cdcd41629bd0ac2fad2afc2
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 419
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/EpsImagePlugin.py

@@ -1,419 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# EPS file handling
-#
-# History:
-# 1995-09-01 fl   Created (0.1)
-# 1996-05-18 fl   Don't choke on "atend" fields, Ghostscript interface (0.2)
-# 1996-08-22 fl   Don't choke on floating point BoundingBox values
-# 1996-08-23 fl   Handle files from Macintosh (0.3)
-# 2001-02-17 fl   Use 're' instead of 'regex' (Python 2.1) (0.4)
-# 2003-09-07 fl   Check gs.close status (from Federico Di Gregorio) (0.5)
-# 2014-05-07 e    Handling of EPS with binary preview and fixed resolution
-#                 resizing
-#
-# Copyright (c) 1997-2003 by Secret Labs AB.
-# Copyright (c) 1995-2003 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-import io
-import os
-import re
-import subprocess
-import sys
-import tempfile
-
-from . import Image, ImageFile
-from ._binary import i32le as i32
-
-#
-# --------------------------------------------------------------------
-
-split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$")
-field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$")
-
-gs_windows_binary = None
-if sys.platform.startswith("win"):
-    import shutil
-
-    for binary in ("gswin32c", "gswin64c", "gs"):
-        if shutil.which(binary) is not None:
-            gs_windows_binary = binary
-            break
-    else:
-        gs_windows_binary = False
-
-
-def has_ghostscript():
-    if gs_windows_binary:
-        return True
-    if not sys.platform.startswith("win"):
-        try:
-            subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL)
-            return True
-        except OSError:
-            # No Ghostscript
-            pass
-    return False
-
-
-def Ghostscript(tile, size, fp, scale=1):
-    """Render an image using Ghostscript"""
-
-    # Unpack decoder tile
-    decoder, tile, offset, data = tile[0]
-    length, bbox = data
-
-    # Hack to support hi-res rendering
-    scale = int(scale) or 1
-    # orig_size = size
-    # orig_bbox = bbox
-    size = (size[0] * scale, size[1] * scale)
-    # resolution is dependent on bbox and size
-    res = (
-        72.0 * size[0] / (bbox[2] - bbox[0]),
-        72.0 * size[1] / (bbox[3] - bbox[1]),
-    )
-
-    out_fd, outfile = tempfile.mkstemp()
-    os.close(out_fd)
-
-    infile_temp = None
-    if hasattr(fp, "name") and os.path.exists(fp.name):
-        infile = fp.name
-    else:
-        in_fd, infile_temp = tempfile.mkstemp()
-        os.close(in_fd)
-        infile = infile_temp
-
-        # Ignore length and offset!
-        # Ghostscript can read it
-        # Copy whole file to read in Ghostscript
-        with open(infile_temp, "wb") as f:
-            # fetch length of fp
-            fp.seek(0, io.SEEK_END)
-            fsize = fp.tell()
-            # ensure start position
-            # go back
-            fp.seek(0)
-            lengthfile = fsize
-            while lengthfile > 0:
-                s = fp.read(min(lengthfile, 100 * 1024))
-                if not s:
-                    break
-                lengthfile -= len(s)
-                f.write(s)
-
-    # Build Ghostscript command
-    command = [
-        "gs",
-        "-q",  # quiet mode
-        "-g%dx%d" % size,  # set output geometry (pixels)
-        "-r%fx%f" % res,  # set input DPI (dots per inch)
-        "-dBATCH",  # exit after processing
-        "-dNOPAUSE",  # don't pause between pages
-        "-dSAFER",  # safe mode
-        "-sDEVICE=ppmraw",  # ppm driver
-        f"-sOutputFile={outfile}",  # output file
-        # adjust for image origin
-        "-c",
-        f"{-bbox[0]} {-bbox[1]} translate",
-        "-f",
-        infile,  # input file
-        # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272)
-        "-c",
-        "showpage",
-    ]
-
-    if gs_windows_binary is not None:
-        if not gs_windows_binary:
-            raise OSError("Unable to locate Ghostscript on paths")
-        command[0] = gs_windows_binary
-
-    # push data through Ghostscript
-    try:
-        startupinfo = None
-        if sys.platform.startswith("win"):
-            startupinfo = subprocess.STARTUPINFO()
-            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
-        subprocess.check_call(command, startupinfo=startupinfo)
-        out_im = Image.open(outfile)
-        out_im.load()
-    finally:
-        try:
-            os.unlink(outfile)
-            if infile_temp:
-                os.unlink(infile_temp)
-        except OSError:
-            pass
-
-    im = out_im.im.copy()
-    out_im.close()
-    return im
-
-
-class PSFile:
-    """
-    Wrapper for bytesio object that treats either CR or LF as end of line.
-    """
-
-    def __init__(self, fp):
-        self.fp = fp
-        self.char = None
-
-    def seek(self, offset, whence=io.SEEK_SET):
-        self.char = None
-        self.fp.seek(offset, whence)
-
-    def readline(self):
-        s = self.char or b""
-        self.char = None
-
-        c = self.fp.read(1)
-        while c not in b"\r\n":
-            s = s + c
-            c = self.fp.read(1)
-
-        self.char = self.fp.read(1)
-        # line endings can be 1 or 2 of \r \n, in either order
-        if self.char in b"\r\n":
-            self.char = None
-
-        return s.decode("latin-1")
-
-
-def _accept(prefix):
-    return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5)
-
-
-##
-# Image plugin for Encapsulated PostScript.  This plugin supports only
-# a few variants of this format.
-
-
-class EpsImageFile(ImageFile.ImageFile):
-    """EPS File Parser for the Python Imaging Library"""
-
-    format = "EPS"
-    format_description = "Encapsulated Postscript"
-
-    mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"}
-
-    def _open(self):
-        (length, offset) = self._find_offset(self.fp)
-
-        # Rewrap the open file pointer in something that will
-        # convert line endings and decode to latin-1.
-        fp = PSFile(self.fp)
-
-        # go to offset - start of "%!PS"
-        fp.seek(offset)
-
-        box = None
-
-        self.mode = "RGB"
-        self._size = 1, 1  # FIXME: huh?
-
-        #
-        # Load EPS header
-
-        s_raw = fp.readline()
-        s = s_raw.strip("\r\n")
-
-        while s_raw:
-            if s:
-                if len(s) > 255:
-                    raise SyntaxError("not an EPS file")
-
-                try:
-                    m = split.match(s)
-                except re.error as e:
-                    raise SyntaxError("not an EPS file") from e
-
-                if m:
-                    k, v = m.group(1, 2)
-                    self.info[k] = v
-                    if k == "BoundingBox":
-                        try:
-                            # Note: The DSC spec says that BoundingBox
-                            # fields should be integers, but some drivers
-                            # put floating point values there anyway.
-                            box = [int(float(i)) for i in v.split()]
-                            self._size = box[2] - box[0], box[3] - box[1]
-                            self.tile = [
-                                ("eps", (0, 0) + self.size, offset, (length, box))
-                            ]
-                        except Exception:
-                            pass
-
-                else:
-                    m = field.match(s)
-                    if m:
-                        k = m.group(1)
-
-                        if k == "EndComments":
-                            break
-                        if k[:8] == "PS-Adobe":
-                            self.info[k[:8]] = k[9:]
-                        else:
-                            self.info[k] = ""
-                    elif s[0] == "%":
-                        # handle non-DSC PostScript comments that some
-                        # tools mistakenly put in the Comments section
-                        pass
-                    else:
-                        raise OSError("bad EPS header")
-
-            s_raw = fp.readline()
-            s = s_raw.strip("\r\n")
-
-            if s and s[:1] != "%":
-                break
-
-        #
-        # Scan for an "ImageData" descriptor
-
-        while s[:1] == "%":
-
-            if len(s) > 255:
-                raise SyntaxError("not an EPS file")
-
-            if s[:11] == "%ImageData:":
-                # Encoded bitmapped image.
-                x, y, bi, mo = s[11:].split(None, 7)[:4]
-
-                if int(bi) != 8:
-                    break
-                try:
-                    self.mode = self.mode_map[int(mo)]
-                except ValueError:
-                    break
-
-                self._size = int(x), int(y)
-                return
-
-            s = fp.readline().strip("\r\n")
-            if not s:
-                break
-
-        if not box:
-            raise OSError("cannot determine EPS bounding box")
-
-    def _find_offset(self, fp):
-
-        s = fp.read(160)
-
-        if s[:4] == b"%!PS":
-            # for HEAD without binary preview
-            fp.seek(0, io.SEEK_END)
-            length = fp.tell()
-            offset = 0
-        elif i32(s[0:4]) == 0xC6D3D0C5:
-            # FIX for: Some EPS file not handled correctly / issue #302
-            # EPS can contain binary data
-            # or start directly with latin coding
-            # more info see:
-            # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf
-            offset = i32(s[4:8])
-            length = i32(s[8:12])
-        else:
-            raise SyntaxError("not an EPS file")
-
-        return (length, offset)
-
-    def load(self, scale=1):
-        # Load EPS via Ghostscript
-        if not self.tile:
-            return
-        self.im = Ghostscript(self.tile, self.size, self.fp, scale)
-        self.mode = self.im.mode
-        self._size = self.im.size
-        self.tile = []
-
-    def load_seek(self, *args, **kwargs):
-        # we can't incrementally load, so force ImageFile.parser to
-        # use our custom load method by defining this method.
-        pass
-
-
-#
-# --------------------------------------------------------------------
-
-
-def _save(im, fp, filename, eps=1):
-    """EPS Writer for the Python Imaging Library."""
-
-    #
-    # make sure image data is available
-    im.load()
-
-    #
-    # determine PostScript image mode
-    if im.mode == "L":
-        operator = (8, 1, "image")
-    elif im.mode == "RGB":
-        operator = (8, 3, "false 3 colorimage")
-    elif im.mode == "CMYK":
-        operator = (8, 4, "false 4 colorimage")
-    else:
-        raise ValueError("image mode is not supported")
-
-    base_fp = fp
-    wrapped_fp = False
-    if fp != sys.stdout:
-        fp = io.TextIOWrapper(fp, encoding="latin-1")
-        wrapped_fp = True
-
-    try:
-        if eps:
-            #
-            # write EPS header
-            fp.write("%!PS-Adobe-3.0 EPSF-3.0\n")
-            fp.write("%%Creator: PIL 0.1 EpsEncode\n")
-            # fp.write("%%CreationDate: %s"...)
-            fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size)
-            fp.write("%%Pages: 1\n")
-            fp.write("%%EndComments\n")
-            fp.write("%%Page: 1 1\n")
-            fp.write("%%ImageData: %d %d " % im.size)
-            fp.write('%d %d 0 1 1 "%s"\n' % operator)
-
-        #
-        # image header
-        fp.write("gsave\n")
-        fp.write("10 dict begin\n")
-        fp.write(f"/buf {im.size[0] * operator[1]} string def\n")
-        fp.write("%d %d scale\n" % im.size)
-        fp.write("%d %d 8\n" % im.size)  # <= bits
-        fp.write(f"[{im.size[0]} 0 0 -{im.size[1]} 0 {im.size[1]}]\n")
-        fp.write("{ currentfile buf readhexstring pop } bind\n")
-        fp.write(operator[2] + "\n")
-        if hasattr(fp, "flush"):
-            fp.flush()
-
-        ImageFile._save(im, base_fp, [("eps", (0, 0) + im.size, 0, None)])
-
-        fp.write("\n%%%%EndBinary\n")
-        fp.write("grestore end\n")
-        if hasattr(fp, "flush"):
-            fp.flush()
-    finally:
-        if wrapped_fp:
-            fp.detach()
-
-
-#
-# --------------------------------------------------------------------
-
-
-Image.register_open(EpsImageFile.format, EpsImageFile, _accept)
-
-Image.register_save(EpsImageFile.format, _save)
-
-Image.register_extensions(EpsImageFile.format, [".ps", ".eps"])
-
-Image.register_mime(EpsImageFile.format, "application/postscript")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/EpsImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: de95b45ef2cef445ca5a0a5a1be71657
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 318
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ExifTags.py

@@ -1,318 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# EXIF tags
-#
-# Copyright (c) 2003 by Secret Labs AB
-#
-# See the README file for information on usage and redistribution.
-#
-
-"""
-This module provides constants and clear-text names for various
-well-known EXIF tags.
-"""
-
-
-TAGS = {
-    # possibly incomplete
-    0x000B: "ProcessingSoftware",
-    0x00FE: "NewSubfileType",
-    0x00FF: "SubfileType",
-    0x0100: "ImageWidth",
-    0x0101: "ImageLength",
-    0x0102: "BitsPerSample",
-    0x0103: "Compression",
-    0x0106: "PhotometricInterpretation",
-    0x0107: "Thresholding",
-    0x0108: "CellWidth",
-    0x0109: "CellLength",
-    0x010A: "FillOrder",
-    0x010D: "DocumentName",
-    0x010E: "ImageDescription",
-    0x010F: "Make",
-    0x0110: "Model",
-    0x0111: "StripOffsets",
-    0x0112: "Orientation",
-    0x0115: "SamplesPerPixel",
-    0x0116: "RowsPerStrip",
-    0x0117: "StripByteCounts",
-    0x0118: "MinSampleValue",
-    0x0119: "MaxSampleValue",
-    0x011A: "XResolution",
-    0x011B: "YResolution",
-    0x011C: "PlanarConfiguration",
-    0x011D: "PageName",
-    0x0120: "FreeOffsets",
-    0x0121: "FreeByteCounts",
-    0x0122: "GrayResponseUnit",
-    0x0123: "GrayResponseCurve",
-    0x0124: "T4Options",
-    0x0125: "T6Options",
-    0x0128: "ResolutionUnit",
-    0x0129: "PageNumber",
-    0x012D: "TransferFunction",
-    0x0131: "Software",
-    0x0132: "DateTime",
-    0x013B: "Artist",
-    0x013C: "HostComputer",
-    0x013D: "Predictor",
-    0x013E: "WhitePoint",
-    0x013F: "PrimaryChromaticities",
-    0x0140: "ColorMap",
-    0x0141: "HalftoneHints",
-    0x0142: "TileWidth",
-    0x0143: "TileLength",
-    0x0144: "TileOffsets",
-    0x0145: "TileByteCounts",
-    0x014A: "SubIFDs",
-    0x014C: "InkSet",
-    0x014D: "InkNames",
-    0x014E: "NumberOfInks",
-    0x0150: "DotRange",
-    0x0151: "TargetPrinter",
-    0x0152: "ExtraSamples",
-    0x0153: "SampleFormat",
-    0x0154: "SMinSampleValue",
-    0x0155: "SMaxSampleValue",
-    0x0156: "TransferRange",
-    0x0157: "ClipPath",
-    0x0158: "XClipPathUnits",
-    0x0159: "YClipPathUnits",
-    0x015A: "Indexed",
-    0x015B: "JPEGTables",
-    0x015F: "OPIProxy",
-    0x0200: "JPEGProc",
-    0x0201: "JpegIFOffset",
-    0x0202: "JpegIFByteCount",
-    0x0203: "JpegRestartInterval",
-    0x0205: "JpegLosslessPredictors",
-    0x0206: "JpegPointTransforms",
-    0x0207: "JpegQTables",
-    0x0208: "JpegDCTables",
-    0x0209: "JpegACTables",
-    0x0211: "YCbCrCoefficients",
-    0x0212: "YCbCrSubSampling",
-    0x0213: "YCbCrPositioning",
-    0x0214: "ReferenceBlackWhite",
-    0x02BC: "XMLPacket",
-    0x1000: "RelatedImageFileFormat",
-    0x1001: "RelatedImageWidth",
-    0x1002: "RelatedImageLength",
-    0x4746: "Rating",
-    0x4749: "RatingPercent",
-    0x800D: "ImageID",
-    0x828D: "CFARepeatPatternDim",
-    0x828E: "CFAPattern",
-    0x828F: "BatteryLevel",
-    0x8298: "Copyright",
-    0x829A: "ExposureTime",
-    0x829D: "FNumber",
-    0x83BB: "IPTCNAA",
-    0x8649: "ImageResources",
-    0x8769: "ExifOffset",
-    0x8773: "InterColorProfile",
-    0x8822: "ExposureProgram",
-    0x8824: "SpectralSensitivity",
-    0x8825: "GPSInfo",
-    0x8827: "ISOSpeedRatings",
-    0x8828: "OECF",
-    0x8829: "Interlace",
-    0x882A: "TimeZoneOffset",
-    0x882B: "SelfTimerMode",
-    0x9000: "ExifVersion",
-    0x9003: "DateTimeOriginal",
-    0x9004: "DateTimeDigitized",
-    0x9101: "ComponentsConfiguration",
-    0x9102: "CompressedBitsPerPixel",
-    0x9201: "ShutterSpeedValue",
-    0x9202: "ApertureValue",
-    0x9203: "BrightnessValue",
-    0x9204: "ExposureBiasValue",
-    0x9205: "MaxApertureValue",
-    0x9206: "SubjectDistance",
-    0x9207: "MeteringMode",
-    0x9208: "LightSource",
-    0x9209: "Flash",
-    0x920A: "FocalLength",
-    0x920B: "FlashEnergy",
-    0x920C: "SpatialFrequencyResponse",
-    0x920D: "Noise",
-    0x9211: "ImageNumber",
-    0x9212: "SecurityClassification",
-    0x9213: "ImageHistory",
-    0x9214: "SubjectLocation",
-    0x9215: "ExposureIndex",
-    0x9216: "TIFF/EPStandardID",
-    0x927C: "MakerNote",
-    0x9286: "UserComment",
-    0x9290: "SubsecTime",
-    0x9291: "SubsecTimeOriginal",
-    0x9292: "SubsecTimeDigitized",
-    0x9400: "AmbientTemperature",
-    0x9401: "Humidity",
-    0x9402: "Pressure",
-    0x9403: "WaterDepth",
-    0x9404: "Acceleration",
-    0x9405: "CameraElevationAngle",
-    0x9C9B: "XPTitle",
-    0x9C9C: "XPComment",
-    0x9C9D: "XPAuthor",
-    0x9C9E: "XPKeywords",
-    0x9C9F: "XPSubject",
-    0xA000: "FlashPixVersion",
-    0xA001: "ColorSpace",
-    0xA002: "ExifImageWidth",
-    0xA003: "ExifImageHeight",
-    0xA004: "RelatedSoundFile",
-    0xA005: "ExifInteroperabilityOffset",
-    0xA20B: "FlashEnergy",
-    0xA20C: "SpatialFrequencyResponse",
-    0xA20E: "FocalPlaneXResolution",
-    0xA20F: "FocalPlaneYResolution",
-    0xA210: "FocalPlaneResolutionUnit",
-    0xA214: "SubjectLocation",
-    0xA215: "ExposureIndex",
-    0xA217: "SensingMethod",
-    0xA300: "FileSource",
-    0xA301: "SceneType",
-    0xA302: "CFAPattern",
-    0xA401: "CustomRendered",
-    0xA402: "ExposureMode",
-    0xA403: "WhiteBalance",
-    0xA404: "DigitalZoomRatio",
-    0xA405: "FocalLengthIn35mmFilm",
-    0xA406: "SceneCaptureType",
-    0xA407: "GainControl",
-    0xA408: "Contrast",
-    0xA409: "Saturation",
-    0xA40A: "Sharpness",
-    0xA40B: "DeviceSettingDescription",
-    0xA40C: "SubjectDistanceRange",
-    0xA420: "ImageUniqueID",
-    0xA430: "CameraOwnerName",
-    0xA431: "BodySerialNumber",
-    0xA432: "LensSpecification",
-    0xA433: "LensMake",
-    0xA434: "LensModel",
-    0xA435: "LensSerialNumber",
-    0xA500: "Gamma",
-    0xC4A5: "PrintImageMatching",
-    0xC612: "DNGVersion",
-    0xC613: "DNGBackwardVersion",
-    0xC614: "UniqueCameraModel",
-    0xC615: "LocalizedCameraModel",
-    0xC616: "CFAPlaneColor",
-    0xC617: "CFALayout",
-    0xC618: "LinearizationTable",
-    0xC619: "BlackLevelRepeatDim",
-    0xC61A: "BlackLevel",
-    0xC61B: "BlackLevelDeltaH",
-    0xC61C: "BlackLevelDeltaV",
-    0xC61D: "WhiteLevel",
-    0xC61E: "DefaultScale",
-    0xC61F: "DefaultCropOrigin",
-    0xC620: "DefaultCropSize",
-    0xC621: "ColorMatrix1",
-    0xC622: "ColorMatrix2",
-    0xC623: "CameraCalibration1",
-    0xC624: "CameraCalibration2",
-    0xC625: "ReductionMatrix1",
-    0xC626: "ReductionMatrix2",
-    0xC627: "AnalogBalance",
-    0xC628: "AsShotNeutral",
-    0xC629: "AsShotWhiteXY",
-    0xC62A: "BaselineExposure",
-    0xC62B: "BaselineNoise",
-    0xC62C: "BaselineSharpness",
-    0xC62D: "BayerGreenSplit",
-    0xC62E: "LinearResponseLimit",
-    0xC62F: "CameraSerialNumber",
-    0xC630: "LensInfo",
-    0xC631: "ChromaBlurRadius",
-    0xC632: "AntiAliasStrength",
-    0xC633: "ShadowScale",
-    0xC634: "DNGPrivateData",
-    0xC635: "MakerNoteSafety",
-    0xC65A: "CalibrationIlluminant1",
-    0xC65B: "CalibrationIlluminant2",
-    0xC65C: "BestQualityScale",
-    0xC65D: "RawDataUniqueID",
-    0xC68B: "OriginalRawFileName",
-    0xC68C: "OriginalRawFileData",
-    0xC68D: "ActiveArea",
-    0xC68E: "MaskedAreas",
-    0xC68F: "AsShotICCProfile",
-    0xC690: "AsShotPreProfileMatrix",
-    0xC691: "CurrentICCProfile",
-    0xC692: "CurrentPreProfileMatrix",
-    0xC6BF: "ColorimetricReference",
-    0xC6F3: "CameraCalibrationSignature",
-    0xC6F4: "ProfileCalibrationSignature",
-    0xC6F6: "AsShotProfileName",
-    0xC6F7: "NoiseReductionApplied",
-    0xC6F8: "ProfileName",
-    0xC6F9: "ProfileHueSatMapDims",
-    0xC6FA: "ProfileHueSatMapData1",
-    0xC6FB: "ProfileHueSatMapData2",
-    0xC6FC: "ProfileToneCurve",
-    0xC6FD: "ProfileEmbedPolicy",
-    0xC6FE: "ProfileCopyright",
-    0xC714: "ForwardMatrix1",
-    0xC715: "ForwardMatrix2",
-    0xC716: "PreviewApplicationName",
-    0xC717: "PreviewApplicationVersion",
-    0xC718: "PreviewSettingsName",
-    0xC719: "PreviewSettingsDigest",
-    0xC71A: "PreviewColorSpace",
-    0xC71B: "PreviewDateTime",
-    0xC71C: "RawImageDigest",
-    0xC71D: "OriginalRawFileDigest",
-    0xC71E: "SubTileBlockSize",
-    0xC71F: "RowInterleaveFactor",
-    0xC725: "ProfileLookTableDims",
-    0xC726: "ProfileLookTableData",
-    0xC740: "OpcodeList1",
-    0xC741: "OpcodeList2",
-    0xC74E: "OpcodeList3",
-    0xC761: "NoiseProfile",
-}
-"""Maps EXIF tags to tag names."""
-
-
-GPSTAGS = {
-    0: "GPSVersionID",
-    1: "GPSLatitudeRef",
-    2: "GPSLatitude",
-    3: "GPSLongitudeRef",
-    4: "GPSLongitude",
-    5: "GPSAltitudeRef",
-    6: "GPSAltitude",
-    7: "GPSTimeStamp",
-    8: "GPSSatellites",
-    9: "GPSStatus",
-    10: "GPSMeasureMode",
-    11: "GPSDOP",
-    12: "GPSSpeedRef",
-    13: "GPSSpeed",
-    14: "GPSTrackRef",
-    15: "GPSTrack",
-    16: "GPSImgDirectionRef",
-    17: "GPSImgDirection",
-    18: "GPSMapDatum",
-    19: "GPSDestLatitudeRef",
-    20: "GPSDestLatitude",
-    21: "GPSDestLongitudeRef",
-    22: "GPSDestLongitude",
-    23: "GPSDestBearingRef",
-    24: "GPSDestBearing",
-    25: "GPSDestDistanceRef",
-    26: "GPSDestDistance",
-    27: "GPSProcessingMethod",
-    28: "GPSAreaInformation",
-    29: "GPSDateStamp",
-    30: "GPSDifferential",
-    31: "GPSHPositioningError",
-}
-"""Maps EXIF GPS tags to tag names."""

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/ExifTags.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 8aabb15e392a245f8aee46ebc68d91ba
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 76
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FitsStubImagePlugin.py

@@ -1,76 +0,0 @@
-#
-# The Python Imaging Library
-# $Id$
-#
-# FITS stub adapter
-#
-# Copyright (c) 1998-2003 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-from . import Image, ImageFile
-
-_handler = None
-
-
-def register_handler(handler):
-    """
-    Install application-specific FITS image handler.
-
-    :param handler: Handler object.
-    """
-    global _handler
-    _handler = handler
-
-
-# --------------------------------------------------------------------
-# Image adapter
-
-
-def _accept(prefix):
-    return prefix[:6] == b"SIMPLE"
-
-
-class FITSStubImageFile(ImageFile.StubImageFile):
-
-    format = "FITS"
-    format_description = "FITS"
-
-    def _open(self):
-
-        offset = self.fp.tell()
-
-        if not _accept(self.fp.read(6)):
-            raise SyntaxError("Not a FITS file")
-
-        # FIXME: add more sanity checks here; mandatory header items
-        # include SIMPLE, BITPIX, NAXIS, etc.
-
-        self.fp.seek(offset)
-
-        # make something up
-        self.mode = "F"
-        self._size = 1, 1
-
-        loader = self._load()
-        if loader:
-            loader.open(self)
-
-    def _load(self):
-        return _handler
-
-
-def _save(im, fp, filename):
-    if _handler is None or not hasattr("_handler", "save"):
-        raise OSError("FITS save handler not installed")
-    _handler.save(im, fp, filename)
-
-
-# --------------------------------------------------------------------
-# Registry
-
-Image.register_open(FITSStubImageFile.format, FITSStubImageFile, _accept)
-Image.register_save(FITSStubImageFile.format, _save)
-
-Image.register_extensions(FITSStubImageFile.format, [".fit", ".fits"])

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FitsStubImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 674a906f3ee4c408792d6500ab09952a
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 172
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FliImagePlugin.py

@@ -1,172 +0,0 @@
-#
-# The Python Imaging Library.
-# $Id$
-#
-# FLI/FLC file handling.
-#
-# History:
-#       95-09-01 fl     Created
-#       97-01-03 fl     Fixed parser, setup decoder tile
-#       98-07-15 fl     Renamed offset attribute to avoid name clash
-#
-# Copyright (c) Secret Labs AB 1997-98.
-# Copyright (c) Fredrik Lundh 1995-97.
-#
-# See the README file for information on usage and redistribution.
-#
-
-
-from . import Image, ImageFile, ImagePalette
-from ._binary import i8
-from ._binary import i16le as i16
-from ._binary import i32le as i32
-from ._binary import o8
-
-#
-# decoder
-
-
-def _accept(prefix):
-    return len(prefix) >= 6 and i16(prefix[4:6]) in [0xAF11, 0xAF12]
-
-
-##
-# Image plugin for the FLI/FLC animation format.  Use the <b>seek</b>
-# method to load individual frames.
-
-
-class FliImageFile(ImageFile.ImageFile):
-
-    format = "FLI"
-    format_description = "Autodesk FLI/FLC Animation"
-    _close_exclusive_fp_after_loading = False
-
-    def _open(self):
-
-        # HEAD
-        s = self.fp.read(128)
-        if not (
-            _accept(s)
-            and i16(s[14:16]) in [0, 3]  # flags
-            and s[20:22] == b"\x00\x00"  # reserved
-        ):
-            raise SyntaxError("not an FLI/FLC file")
-
-        # frames
-        self.n_frames = i16(s[6:8])
-        self.is_animated = self.n_frames > 1
-
-        # image characteristics
-        self.mode = "P"
-        self._size = i16(s[8:10]), i16(s[10:12])
-
-        # animation speed
-        duration = i32(s[16:20])
-        magic = i16(s[4:6])
-        if magic == 0xAF11:
-            duration = (duration * 1000) // 70
-        self.info["duration"] = duration
-
-        # look for palette
-        palette = [(a, a, a) for a in range(256)]
-
-        s = self.fp.read(16)
-
-        self.__offset = 128
-
-        if i16(s[4:6]) == 0xF100:
-            # prefix chunk; ignore it
-            self.__offset = self.__offset + i32(s)
-            s = self.fp.read(16)
-
-        if i16(s[4:6]) == 0xF1FA:
-            # look for palette chunk
-            s = self.fp.read(6)
-            if i16(s[4:6]) == 11:
-                self._palette(palette, 2)
-            elif i16(s[4:6]) == 4:
-                self._palette(palette, 0)
-
-        palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette]
-        self.palette = ImagePalette.raw("RGB", b"".join(palette))
-
-        # set things up to decode first frame
-        self.__frame = -1
-        self.__fp = self.fp
-        self.__rewind = self.fp.tell()
-        self.seek(0)
-
-    def _palette(self, palette, shift):
-        # load palette
-
-        i = 0
-        for e in range(i16(self.fp.read(2))):
-            s = self.fp.read(2)
-            i = i + i8(s[0])
-            n = i8(s[1])
-            if n == 0:
-                n = 256
-            s = self.fp.read(n * 3)
-            for n in range(0, len(s), 3):
-                r = i8(s[n]) << shift
-                g = i8(s[n + 1]) << shift
-                b = i8(s[n + 2]) << shift
-                palette[i] = (r, g, b)
-                i += 1
-
-    def seek(self, frame):
-        if not self._seek_check(frame):
-            return
-        if frame < self.__frame:
-            self._seek(0)
-
-        for f in range(self.__frame + 1, frame + 1):
-            self._seek(f)
-
-    def _seek(self, frame):
-        if frame == 0:
-            self.__frame = -1
-            self.__fp.seek(self.__rewind)
-            self.__offset = 128
-        else:
-            # ensure that the previous frame was loaded
-            self.load()
-
-        if frame != self.__frame + 1:
-            raise ValueError(f"cannot seek to frame {frame}")
-        self.__frame = frame
-
-        # move to next frame
-        self.fp = self.__fp
-        self.fp.seek(self.__offset)
-
-        s = self.fp.read(4)
-        if not s:
-            raise EOFError
-
-        framesize = i32(s)
-
-        self.decodermaxblock = framesize
-        self.tile = [("fli", (0, 0) + self.size, self.__offset, None)]
-
-        self.__offset += framesize
-
-    def tell(self):
-        return self.__frame
-
-    def _close__fp(self):
-        try:
-            if self.__fp != self.fp:
-                self.__fp.close()
-        except AttributeError:
-            pass
-        finally:
-            self.__fp = None
-
-
-#
-# registry
-
-Image.register_open(FliImageFile.format, FliImageFile, _accept)
-
-Image.register_extensions(FliImageFile.format, [".fli", ".flc"])

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FliImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 869289d8b90d848fabfbe6ea72333ee8
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 111
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FontFile.py

@@ -1,111 +0,0 @@
-#
-# The Python Imaging Library
-# $Id$
-#
-# base class for raster font file parsers
-#
-# history:
-# 1997-06-05 fl   created
-# 1997-08-19 fl   restrict image width
-#
-# Copyright (c) 1997-1998 by Secret Labs AB
-# Copyright (c) 1997-1998 by Fredrik Lundh
-#
-# See the README file for information on usage and redistribution.
-#
-
-
-import os
-
-from . import Image, _binary
-
-WIDTH = 800
-
-
-def puti16(fp, values):
-    """Write network order (big-endian) 16-bit sequence"""
-    for v in values:
-        if v < 0:
-            v += 65536
-        fp.write(_binary.o16be(v))
-
-
-class FontFile:
-    """Base class for raster font file handlers."""
-
-    bitmap = None
-
-    def __init__(self):
-
-        self.info = {}
-        self.glyph = [None] * 256
-
-    def __getitem__(self, ix):
-        return self.glyph[ix]
-
-    def compile(self):
-        """Create metrics and bitmap"""
-
-        if self.bitmap:
-            return
-
-        # create bitmap large enough to hold all data
-        h = w = maxwidth = 0
-        lines = 1
-        for glyph in self:
-            if glyph:
-                d, dst, src, im = glyph
-                h = max(h, src[3] - src[1])
-                w = w + (src[2] - src[0])
-                if w > WIDTH:
-                    lines += 1
-                    w = src[2] - src[0]
-                maxwidth = max(maxwidth, w)
-
-        xsize = maxwidth
-        ysize = lines * h
-
-        if xsize == 0 and ysize == 0:
-            return ""
-
-        self.ysize = h
-
-        # paste glyphs into bitmap
-        self.bitmap = Image.new("1", (xsize, ysize))
-        self.metrics = [None] * 256
-        x = y = 0
-        for i in range(256):
-            glyph = self[i]
-            if glyph:
-                d, dst, src, im = glyph
-                xx = src[2] - src[0]
-                # yy = src[3] - src[1]
-                x0, y0 = x, y
-                x = x + xx
-                if x > WIDTH:
-                    x, y = 0, y + h
-                    x0, y0 = x, y
-                    x = xx
-                s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0
-                self.bitmap.paste(im.crop(src), s)
-                self.metrics[i] = d, dst, s
-
-    def save(self, filename):
-        """Save font"""
-
-        self.compile()
-
-        # font data
-        self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG")
-
-        # font metrics
-        with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp:
-            fp.write(b"PILfont\n")
-            fp.write(f";;;;;;{self.ysize};\n".encode("ascii"))  # HACK!!!
-            fp.write(b"DATA\n")
-            for id in range(256):
-                m = self.metrics[id]
-                if not m:
-                    puti16(fp, [0] * 10)
-                else:
-                    puti16(fp, m[0] + m[1] + m[2])

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FontFile.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: cc66a6eb8c6944881b749a77291315d7
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 243
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FpxImagePlugin.py

@@ -1,243 +0,0 @@
-#
-# THIS IS WORK IN PROGRESS
-#
-# The Python Imaging Library.
-# $Id$
-#
-# FlashPix support for PIL
-#
-# History:
-# 97-01-25 fl   Created (reads uncompressed RGB images only)
-#
-# Copyright (c) Secret Labs AB 1997.
-# Copyright (c) Fredrik Lundh 1997.
-#
-# See the README file for information on usage and redistribution.
-#
-import olefile
-
-from . import Image, ImageFile
-from ._binary import i8
-from ._binary import i32le as i32
-
-# we map from colour field tuples to (mode, rawmode) descriptors
-MODES = {
-    # opacity
-    (0x00007FFE): ("A", "L"),
-    # monochrome
-    (0x00010000,): ("L", "L"),
-    (0x00018000, 0x00017FFE): ("RGBA", "LA"),
-    # photo YCC
-    (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"),
-    (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"),
-    # standard RGB (NIFRGB)
-    (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"),
-    (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"),
-}
-
-
-#
-# --------------------------------------------------------------------
-
-
-def _accept(prefix):
-    return prefix[:8] == olefile.MAGIC
-
-
-##
-# Image plugin for the FlashPix images.
-
-
-class FpxImageFile(ImageFile.ImageFile):
-
-    format = "FPX"
-    format_description = "FlashPix"
-
-    def _open(self):
-        #
-        # read the OLE directory and see if this is a likely
-        # to be a FlashPix file
-
-        try:
-            self.ole = olefile.OleFileIO(self.fp)
-        except OSError as e:
-            raise SyntaxError("not an FPX file; invalid OLE file") from e
-
-        if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B":
-            raise SyntaxError("not an FPX file; bad root CLSID")
-
-        self._open_index(1)
-
-    def _open_index(self, index=1):
-        #
-        # get the Image Contents Property Set
-
-        prop = self.ole.getproperties(
-            [f"Data Object Store {index:06d}", "\005Image Contents"]
-        )
-
-        # size (highest resolution)
-
-        self._size = prop[0x1000002], prop[0x1000003]
-
-        size = max(self.size)
-        i = 1
-        while size > 64:
-            size = size / 2
-            i += 1
-        self.maxid = i - 1
-
-        # mode.  instead of using a single field for this, flashpix
-        # requires you to specify the mode for each channel in each
-        # resolution subimage, and leaves it to the decoder to make
-        # sure that they all match.  for now, we'll cheat and assume
-        # that this is always the case.
-
-        id = self.maxid << 16
-
-        s = prop[0x2000002 | id]
-
-        colors = []
-        bands = i32(s, 4)
-        if bands > 4:
-            raise OSError("Invalid number of bands")
-        for i in range(bands):
-            # note: for now, we ignore the "uncalibrated" flag
-            colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF)
-
-        self.mode, self.rawmode = MODES[tuple(colors)]
-
-        # load JPEG tables, if any
-        self.jpeg = {}
-        for i in range(256):
-            id = 0x3000001 | (i << 16)
-            if id in prop:
-                self.jpeg[i] = prop[id]
-
-        self._open_subimage(1, self.maxid)
-
-    def _open_subimage(self, index=1, subimage=0):
-        #
-        # setup tile descriptors for a given subimage
-
-        stream = [
-            f"Data Object Store {index:06d}",
-            f"Resolution {subimage:04d}",
-            "Subimage 0000 Header",
-        ]
-
-        fp = self.ole.openstream(stream)
-
-        # skip prefix
-        fp.read(28)
-
-        # header stream
-        s = fp.read(36)
-
-        size = i32(s, 4), i32(s, 8)
-        # tilecount = i32(s, 12)
-        tilesize = i32(s, 16), i32(s, 20)
-        # channels = i32(s, 24)
-        offset = i32(s, 28)
-        length = i32(s, 32)
-
-        if size != self.size:
-            raise OSError("subimage mismatch")
-
-        # get tile descriptors
-        fp.seek(28 + offset)
-        s = fp.read(i32(s, 12) * length)
-
-        x = y = 0
-        xsize, ysize = size
-        xtile, ytile = tilesize
-        self.tile = []
-
-        for i in range(0, len(s), length):
-
-            compression = i32(s, i + 8)
-
-            if compression == 0:
-                self.tile.append(
-                    (
-                        "raw",
-                        (x, y, x + xtile, y + ytile),
-                        i32(s, i) + 28,
-                        (self.rawmode),
-                    )
-                )
-
-            elif compression == 1:
-
-                # FIXME: the fill decoder is not implemented
-                self.tile.append(
-                    (
-                        "fill",
-                        (x, y, x + xtile, y + ytile),
-                        i32(s, i) + 28,
-                        (self.rawmode, s[12:16]),
-                    )
-                )
-
-            elif compression == 2:
-
-                internal_color_conversion = i8(s[14])
-                jpeg_tables = i8(s[15])
-                rawmode = self.rawmode
-
-                if internal_color_conversion:
-                    # The image is stored as usual (usually YCbCr).
-                    if rawmode == "RGBA":
-                        # For "RGBA", data is stored as YCbCrA based on
-                        # negative RGB. The following trick works around
-                        # this problem :
-                        jpegmode, rawmode = "YCbCrK", "CMYK"
-                    else:
-                        jpegmode = None  # let the decoder decide
-
-                else:
-                    # The image is stored as defined by rawmode
-                    jpegmode = rawmode
-
-                self.tile.append(
-                    (
-                        "jpeg",
-                        (x, y, x + xtile, y + ytile),
-                        i32(s, i) + 28,
-                        (rawmode, jpegmode),
-                    )
-                )
-
-                # FIXME: jpeg tables are tile dependent; the prefix
-                # data must be placed in the tile descriptor itself!
-
-                if jpeg_tables:
-                    self.tile_prefix = self.jpeg[jpeg_tables]
-
-            else:
-                raise OSError("unknown/invalid compression")
-
-            x = x + xtile
-            if x >= xsize:
-                x, y = 0, y + ytile
-                if y >= ysize:
-                    break  # isn't really required
-
-        self.stream = stream
-        self.fp = None
-
-    def load(self):
-
-        if not self.fp:
-            self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"])
-
-        return ImageFile.ImageFile.load(self)
-
-
-#
-# --------------------------------------------------------------------
-
-
-Image.register_open(FpxImageFile.format, FpxImageFile, _accept)
-
-Image.register_extension(FpxImageFile.format, ".fpx")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FpxImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 309d762aa956040bc8da79473b8e843d
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 106
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FtexImagePlugin.py

@@ -1,106 +0,0 @@
-"""
-A Pillow loader for .ftc and .ftu files (FTEX)
-Jerome Leclanche <jerome@leclan.ch>
-
-The contents of this file are hereby released in the public domain (CC0)
-Full text of the CC0 license:
-  https://creativecommons.org/publicdomain/zero/1.0/
-
-Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001
-
-The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a
-packed custom format called FTEX. This file format uses file extensions FTC
-and FTU.
-* FTC files are compressed textures (using standard texture compression).
-* FTU files are not compressed.
-Texture File Format
-The FTC and FTU texture files both use the same format. This
-has the following structure:
-{header}
-{format_directory}
-{data}
-Where:
-{header} = {
-    u32:magic,
-    u32:version,
-    u32:width,
-    u32:height,
-    u32:mipmap_count,
-    u32:format_count
-}
-
-* The "magic" number is "FTEX".
-* "width" and "height" are the dimensions of the texture.
-* "mipmap_count" is the number of mipmaps in the texture.
-* "format_count" is the number of texture formats (different versions of the
-same texture) in this file.
-
-{format_directory} = format_count * { u32:format, u32:where }
-
-The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB
-uncompressed textures.
-The texture data for a format starts at the position "where" in the file.
-
-Each set of texture data in the file has the following structure:
-{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } }
-* "mipmap_size" is the number of bytes in that mip level. For compressed
-textures this is the size of the texture data compressed with DXT1. For 24 bit
-uncompressed textures, this is 3 * width * height. Following this are the image
-bytes for that mipmap level.
-
-Note: All data is stored in little-Endian (Intel) byte order.
-"""
-
-import struct
-from io import BytesIO
-
-from . import Image, ImageFile
-
-MAGIC = b"FTEX"
-FORMAT_DXT1 = 0
-FORMAT_UNCOMPRESSED = 1
-
-
-class FtexImageFile(ImageFile.ImageFile):
-    format = "FTEX"
-    format_description = "Texture File Format (IW2:EOC)"
-
-    def _open(self):
-        struct.unpack("<I", self.fp.read(4))  # magic
-        struct.unpack("<i", self.fp.read(4))  # version
-        self._size = struct.unpack("<2i", self.fp.read(8))
-        mipmap_count, format_count = struct.unpack("<2i", self.fp.read(8))
-
-        self.mode = "RGB"
-
-        # Only support single-format files.
-        # I don't know of any multi-format file.
-        assert format_count == 1
-
-        format, where = struct.unpack("<2i", self.fp.read(8))
-        self.fp.seek(where)
-        (mipmap_size,) = struct.unpack("<i", self.fp.read(4))
-
-        data = self.fp.read(mipmap_size)
-
-        if format == FORMAT_DXT1:
-            self.mode = "RGBA"
-            self.tile = [("bcn", (0, 0) + self.size, 0, (1))]
-        elif format == FORMAT_UNCOMPRESSED:
-            self.tile = [("raw", (0, 0) + self.size, 0, ("RGB", 0, 1))]
-        else:
-            raise ValueError(f"Invalid texture compression format: {repr(format)}")
-
-        self.fp.close()
-        self.fp = BytesIO(data)
-
-    def load_seek(self, pos):
-        pass
-
-
-def _validate(prefix):
-    return prefix[:4] == MAGIC
-
-
-Image.register_open(FtexImageFile.format, FtexImageFile, _validate)
-Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"])

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/FtexImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 3dba91bced771426fa910bf0746853b9
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 100
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/GbrImagePlugin.py

@@ -1,100 +0,0 @@
-#
-# The Python Imaging Library
-#
-# load a GIMP brush file
-#
-# History:
-#       96-03-14 fl     Created
-#       16-01-08 es     Version 2
-#
-# Copyright (c) Secret Labs AB 1997.
-# Copyright (c) Fredrik Lundh 1996.
-# Copyright (c) Eric Soroos 2016.
-#
-# See the README file for information on usage and redistribution.
-#
-#
-# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for
-# format documentation.
-#
-# This code Interprets version 1 and 2 .gbr files.
-# Version 1 files are obsolete, and should not be used for new
-#   brushes.
-# Version 2 files are saved by GIMP v2.8 (at least)
-# Version 3 files have a format specifier of 18 for 16bit floats in
-#   the color depth field. This is currently unsupported by Pillow.
-
-from . import Image, ImageFile
-from ._binary import i32be as i32
-
-
-def _accept(prefix):
-    return len(prefix) >= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2)
-
-
-##
-# Image plugin for the GIMP brush format.
-
-
-class GbrImageFile(ImageFile.ImageFile):
-
-    format = "GBR"
-    format_description = "GIMP brush file"
-
-    def _open(self):
-        header_size = i32(self.fp.read(4))
-        version = i32(self.fp.read(4))
-        if header_size < 20:
-            raise SyntaxError("not a GIMP brush")
-        if version not in (1, 2):
-            raise SyntaxError(f"Unsupported GIMP brush version: {version}")
-
-        width = i32(self.fp.read(4))
-        height = i32(self.fp.read(4))
-        color_depth = i32(self.fp.read(4))
-        if width <= 0 or height <= 0:
-            raise SyntaxError("not a GIMP brush")
-        if color_depth not in (1, 4):
-            raise SyntaxError(f"Unsupported GIMP brush color depth: {color_depth}")
-
-        if version == 1:
-            comment_length = header_size - 20
-        else:
-            comment_length = header_size - 28
-            magic_number = self.fp.read(4)
-            if magic_number != b"GIMP":
-                raise SyntaxError("not a GIMP brush, bad magic number")
-            self.info["spacing"] = i32(self.fp.read(4))
-
-        comment = self.fp.read(comment_length)[:-1]
-
-        if color_depth == 1:
-            self.mode = "L"
-        else:
-            self.mode = "RGBA"
-
-        self._size = width, height
-
-        self.info["comment"] = comment
-
-        # Image might not be small
-        Image._decompression_bomb_check(self.size)
-
-        # Data is an uncompressed block of w * h * bytes/pixel
-        self._data_size = width * height * color_depth
-
-    def load(self):
-        if self.im:
-            # Already loaded
-            return
-
-        self.im = Image.core.new(self.mode, self.size)
-        self.frombytes(self.fp.read(self._data_size))
-
-
-#
-# registry
-
-
-Image.register_open(GbrImageFile.format, GbrImageFile, _accept)
-Image.register_extension(GbrImageFile.format, ".gbr")

+ 0 - 7
Assets/Plotting/venv/lib/python3.7/site-packages/PIL/GbrImagePlugin.py.meta

@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 301073250571b40cd8abf94f79552adf
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

Some files were not shown because too many files changed in this diff