From 0d13fc3f0061fc935b6ef792a0de8f07df606c49 Mon Sep 17 00:00:00 2001 From: Unity Technologies <@unity> Date: Fri, 14 May 2021 00:00:00 +0000 Subject: [PATCH] com.unity.2d.psdimporter@6.0.0-pre.2 ## [6.0.0-pre.2] - 2021-05-14 ### Changed - Update dependency version ## [6.0.0-pre.1] - 2021-05-05 ### Changed - Version bump for Unity 2021.2 ### Added - Add ability to use Photoshop file's layer name to map to SpriteRect instead of using layer id - Provide auto custom Physics shape generation option - Add support to collapse layers in a Photoshop file's group - Improve PSDImporter Inspector ### Fixed - Fixed Unity hang when importing certain PSD files (case 1312835) --- CHANGELOG.md | 338 +- CHANGELOG.md.meta | 14 +- Documentation~/PSD-importer-SpriteRect.md | 126 +- Documentation~/PSD-importer-properties.md | 126 +- Documentation~/PSD-override.md | 110 +- Documentation~/TableOfContents.md | 10 +- .../21_2-Fei-SpriteRect-head-moved-hidden.png | Bin 0 -> 101407 bytes .../images/21_2-Fei-SpriteRect-head-moved.png | Bin 0 -> 102931 bytes .../21_2-Fei-SpriteRect-head-original.png | Bin 0 -> 96162 bytes .../21_2-Fei-SpriteRect-head-resized.png | Bin 0 -> 81849 bytes .../images/21_2-Fei-grouping-layers.png | Bin 0 -> 173905 bytes Documentation~/images/21_2-Fei-nogrouping.png | Bin 0 -> 169554 bytes .../images/21_2-PSDImporter-properties.png | Bin 0 -> 20977 bytes Documentation~/images/SpriteRect_table1.png | Bin 80114 -> 90037 bytes Documentation~/images/SpriteRect_table2.png | Bin 82909 -> 76514 bytes Documentation~/images/table1.png | Bin 119083 -> 0 bytes Documentation~/images/table2.png | Bin 115885 -> 0 bytes Documentation~/index.md | 38 +- Documentation~/skeleton-sharing.md | 46 +- Editor.meta | 16 +- Editor/Analytics.cs | 128 +- Editor/Analytics.cs.meta | 22 +- Editor/AssemblyInfo.cs | 4 +- Editor/AssemblyInfo.cs.meta | 22 +- Editor/Assets.meta | 8 + Editor/Assets/Icons.meta | 8 + Editor/Assets/Icons/Dark.meta | 8 + .../Icons/Dark/Layers Collapsed@16x.png | Bin 0 -> 3807 bytes .../Icons/Dark/Layers Collapsed@16x.png.meta | 109 + .../Assets/Icons/Dark/Layers Collapsed@1x.png | Bin 0 -> 425 bytes .../Icons/Dark/Layers Collapsed@1x.png.meta | 109 + .../Assets/Icons/Dark/Layers Collapsed@2x.png | Bin 0 -> 611 bytes .../Icons/Dark/Layers Collapsed@2x.png.meta | 109 + .../Assets/Icons/Dark/Layers Collapsed@4x.png | Bin 0 -> 1093 bytes .../Icons/Dark/Layers Collapsed@4x.png.meta | 109 + .../Assets/Icons/Dark/Layers Collapsed@8x.png | Bin 0 -> 1877 bytes .../Icons/Dark/Layers Collapsed@8x.png.meta | 109 + Editor/Assets/Icons/Dark/Layers Mixed@16x.png | Bin 0 -> 2652 bytes .../Icons/Dark/Layers Mixed@16x.png.meta | 109 + Editor/Assets/Icons/Dark/Layers Mixed@1x.png | Bin 0 -> 347 bytes .../Icons/Dark/Layers Mixed@1x.png.meta | 109 + Editor/Assets/Icons/Dark/Layers Mixed@2x.png | Bin 0 -> 487 bytes .../Icons/Dark/Layers Mixed@2x.png.meta | 109 + Editor/Assets/Icons/Dark/Layers Mixed@4x.png | Bin 0 -> 824 bytes .../Icons/Dark/Layers Mixed@4x.png.meta | 109 + Editor/Assets/Icons/Dark/Layers Mixed@8x.png | Bin 0 -> 1388 bytes .../Icons/Dark/Layers Mixed@8x.png.meta | 109 + .../Icons/Dark/Layers Separated@16x.png | Bin 0 -> 3963 bytes .../Icons/Dark/Layers Separated@16x.png.meta | 109 + .../Assets/Icons/Dark/Layers Separated@1x.png | Bin 0 -> 426 bytes .../Icons/Dark/Layers Separated@1x.png.meta | 109 + .../Assets/Icons/Dark/Layers Separated@2x.png | Bin 0 -> 667 bytes .../Icons/Dark/Layers Separated@2x.png.meta | 109 + .../Assets/Icons/Dark/Layers Separated@4x.png | Bin 0 -> 1155 bytes .../Icons/Dark/Layers Separated@4x.png.meta | 109 + .../Assets/Icons/Dark/Layers Separated@8x.png | Bin 0 -> 1978 bytes .../Icons/Dark/Layers Separated@8x.png.meta | 109 + Editor/Assets/Icons/Light.meta | 8 + .../Icons/Light/Layers Collapsed@16x.png | Bin 0 -> 3853 bytes .../Icons/Light/Layers Collapsed@16x.png.meta | 109 + .../Icons/Light/Layers Collapsed@1x.png | Bin 0 -> 412 bytes .../Icons/Light/Layers Collapsed@1x.png.meta | 109 + .../Icons/Light/Layers Collapsed@2x.png | Bin 0 -> 616 bytes .../Icons/Light/Layers Collapsed@2x.png.meta | 109 + .../Icons/Light/Layers Collapsed@4x.png | Bin 0 -> 1121 bytes .../Icons/Light/Layers Collapsed@4x.png.meta | 109 + .../Icons/Light/Layers Collapsed@8x.png | Bin 0 -> 1921 bytes .../Icons/Light/Layers Collapsed@8x.png.meta | 109 + .../Assets/Icons/Light/Layers Mixed@16x.png | Bin 0 -> 2678 bytes .../Icons/Light/Layers Mixed@16x.png.meta | 109 + Editor/Assets/Icons/Light/Layers Mixed@1x.png | Bin 0 -> 346 bytes .../Icons/Light/Layers Mixed@1x.png.meta | 109 + Editor/Assets/Icons/Light/Layers Mixed@2x.png | Bin 0 -> 492 bytes .../Icons/Light/Layers Mixed@2x.png.meta | 109 + Editor/Assets/Icons/Light/Layers Mixed@4x.png | Bin 0 -> 828 bytes .../Icons/Light/Layers Mixed@4x.png.meta | 109 + Editor/Assets/Icons/Light/Layers Mixed@8x.png | Bin 0 -> 1400 bytes .../Icons/Light/Layers Mixed@8x.png.meta | 109 + .../Icons/Light/Layers Separated@16x.png | Bin 0 -> 4056 bytes .../Icons/Light/Layers Separated@16x.png.meta | 109 + .../Icons/Light/Layers Separated@1x.png | Bin 0 -> 433 bytes .../Icons/Light/Layers Separated@1x.png.meta | 109 + .../Icons/Light/Layers Separated@2x.png | Bin 0 -> 664 bytes .../Icons/Light/Layers Separated@2x.png.meta | 109 + .../Icons/Light/Layers Separated@4x.png | Bin 0 -> 1204 bytes .../Icons/Light/Layers Separated@4x.png.meta | 109 + .../Icons/Light/Layers Separated@8x.png | Bin 0 -> 2009 bytes .../Icons/Light/Layers Separated@8x.png.meta | 109 + Editor/Assets/Icons/Selected.meta | 8 + .../Icons/Selected/Layers Collapsed@16x.png | Bin 0 -> 3577 bytes .../Selected/Layers Collapsed@16x.png.meta | 109 + .../Icons/Selected/Layers Collapsed@1x.png | Bin 0 -> 362 bytes .../Selected/Layers Collapsed@1x.png.meta | 109 + .../Icons/Selected/Layers Collapsed@2x.png | Bin 0 -> 563 bytes .../Selected/Layers Collapsed@2x.png.meta | 109 + .../Icons/Selected/Layers Collapsed@4x.png | Bin 0 -> 1030 bytes .../Selected/Layers Collapsed@4x.png.meta | 109 + .../Icons/Selected/Layers Collapsed@8x.png | Bin 0 -> 1739 bytes .../Selected/Layers Collapsed@8x.png.meta | 109 + .../Icons/Selected/Layers Mixed@16x.png | Bin 0 -> 2512 bytes .../Icons/Selected/Layers Mixed@16x.png.meta | 109 + .../Assets/Icons/Selected/Layers Mixed@1x.png | Bin 0 -> 308 bytes .../Icons/Selected/Layers Mixed@1x.png.meta | 109 + .../Assets/Icons/Selected/Layers Mixed@2x.png | Bin 0 -> 464 bytes .../Icons/Selected/Layers Mixed@2x.png.meta | 109 + .../Assets/Icons/Selected/Layers Mixed@4x.png | Bin 0 -> 763 bytes .../Icons/Selected/Layers Mixed@4x.png.meta | 109 + .../Assets/Icons/Selected/Layers Mixed@8x.png | Bin 0 -> 1325 bytes .../Icons/Selected/Layers Mixed@8x.png.meta | 109 + .../Icons/Selected/Layers Separated@16x.png | Bin 0 -> 3749 bytes .../Selected/Layers Separated@16x.png.meta | 109 + .../Icons/Selected/Layers Separated@1x.png | Bin 0 -> 358 bytes .../Selected/Layers Separated@1x.png.meta | 109 + .../Icons/Selected/Layers Separated@2x.png | Bin 0 -> 599 bytes .../Selected/Layers Separated@2x.png.meta | 109 + .../Icons/Selected/Layers Separated@4x.png | Bin 0 -> 1084 bytes .../Selected/Layers Separated@4x.png.meta | 109 + .../Icons/Selected/Layers Separated@8x.png | Bin 0 -> 1859 bytes .../Selected/Layers Separated@8x.png.meta | 109 + Editor/PSDImportPostProcessor.cs | 116 +- Editor/PSDImportPostProcessor.cs.meta | 22 +- Editor/PSDImporter.cs | 3183 +++++++++-------- Editor/PSDImporter.cs.meta | 22 +- Editor/PSDImporterDataProvider.cs | 597 ++-- Editor/PSDImporterDataProvider.cs.meta | 22 +- Editor/PSDImporterEditor.cs | 2567 +++++++------ Editor/PSDImporterEditor.cs.meta | 22 +- Editor/PSDImporterEditorLayerTreeView.cs | 289 ++ Editor/PSDImporterEditorLayerTreeView.cs.meta | 11 + Editor/PSDLayer.cs | 141 +- Editor/PSDLayer.cs.meta | 22 +- Editor/PSDLayerMappingStrategy.cs | 131 + Editor/PSDLayerMappingStrategy.cs.meta | 11 + Editor/PSDPlugin.meta | 20 +- Editor/PSDPlugin/AssemblyInfo.cs | 4 +- Editor/PSDPlugin/AssemblyInfo.cs.meta | 22 +- Editor/PSDPlugin/PDNWrapper.meta | 18 +- Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs | 100 +- .../PSDPlugin/PDNWrapper/BitmapLayer.cs.meta | 24 +- Editor/PSDPlugin/PDNWrapper/Document.cs | 60 +- Editor/PSDPlugin/PDNWrapper/Document.cs.meta | 24 +- Editor/PSDPlugin/PDNWrapper/Enums.cs | 54 +- Editor/PSDPlugin/PDNWrapper/Enums.cs.meta | 24 +- Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs | 1246 +++---- .../PSDPlugin/PDNWrapper/PDNDecodeJob.cs.meta | 22 +- Editor/PSDPlugin/PDNWrapper/Rectangle.cs | 516 +-- Editor/PSDPlugin/PDNWrapper/Rectangle.cs.meta | 24 +- Editor/PSDPlugin/PDNWrapper/Size.cs | 98 +- Editor/PSDPlugin/PDNWrapper/Size.cs.meta | 24 +- Editor/PSDPlugin/PDNWrapper/Surface.cs | 62 +- Editor/PSDPlugin/PDNWrapper/Surface.cs.meta | 24 +- Editor/PSDPlugin/PhotoShopFileType.meta | 18 +- .../PhotoShopFileType/BlendModeMapping.cs | 214 +- .../BlendModeMapping.cs.meta | 24 +- .../PhotoShopFileType/DocumentLoadContext.cs | 92 +- .../DocumentLoadContext.cs.meta | 24 +- .../PhotoShopFileType/ImageDecoderPdn.cs | 1614 ++++----- .../PhotoShopFileType/ImageDecoderPdn.cs.meta | 24 +- Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs | 602 ++-- .../PhotoShopFileType/PsdLoad.cs.meta | 24 +- Editor/PSDPlugin/PsdFile.meta | 18 +- Editor/PSDPlugin/PsdFile/Compression.meta | 18 +- .../PsdFile/Compression/EndianReverser.cs | 100 +- .../Compression/EndianReverser.cs.meta | 24 +- .../PsdFile/Compression/ImageData.cs | 114 +- .../PsdFile/Compression/ImageData.cs.meta | 24 +- .../PsdFile/Compression/ImageDataFactory.cs | 192 +- .../Compression/ImageDataFactory.cs.meta | 24 +- .../PSDPlugin/PsdFile/Compression/RawImage.cs | 88 +- .../PsdFile/Compression/RawImage.cs.meta | 24 +- .../PSDPlugin/PsdFile/Compression/RleImage.cs | 122 +- .../PsdFile/Compression/RleImage.cs.meta | 24 +- .../PSDPlugin/PsdFile/Compression/ZipImage.cs | 202 +- .../PsdFile/Compression/ZipImage.cs.meta | 24 +- .../PsdFile/Compression/ZipPredict16Image.cs | 226 +- .../Compression/ZipPredict16Image.cs.meta | 24 +- .../PsdFile/Compression/ZipPredict32Image.cs | 350 +- .../Compression/ZipPredict32Image.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Exceptions.cs | 86 +- Editor/PSDPlugin/PsdFile/Exceptions.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/ImageResource.cs | 468 +-- .../PSDPlugin/PsdFile/ImageResource.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/ImageResources.meta | 18 +- .../ImageResources/AlphaChannelNames.cs | 104 +- .../ImageResources/AlphaChannelNames.cs.meta | 24 +- .../ImageResources/RawImageResource.cs | 96 +- .../ImageResources/RawImageResource.cs.meta | 24 +- .../PsdFile/ImageResources/ResolutionInfo.cs | 188 +- .../ImageResources/ResolutionInfo.cs.meta | 24 +- .../PsdFile/ImageResources/Thumbnail.cs | 170 +- .../PsdFile/ImageResources/Thumbnail.cs.meta | 24 +- .../ImageResources/UnicodeAlphaNames.cs | 118 +- .../ImageResources/UnicodeAlphaNames.cs.meta | 24 +- .../PsdFile/ImageResources/VersionInfo.cs | 106 +- .../ImageResources/VersionInfo.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Layers.meta | 18 +- .../PsdFile/Layers/BlendingRanges.cs | 112 +- .../PsdFile/Layers/BlendingRanges.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Layers/Channel.cs | 464 +-- .../PSDPlugin/PsdFile/Layers/Channel.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Layers/Layer.cs | 480 +-- Editor/PSDPlugin/PsdFile/Layers/Layer.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs | 336 +- .../PsdFile/Layers/LayerInfo.cs.meta | 24 +- .../PSDPlugin/PsdFile/Layers/LayerInfo.meta | 18 +- .../PsdFile/Layers/LayerInfo/InfoLayers.cs | 174 +- .../Layers/LayerInfo/InfoLayers.cs.meta | 24 +- .../PsdFile/Layers/LayerInfo/LayerId.cs | 142 +- .../PsdFile/Layers/LayerInfo/LayerId.cs.meta | 22 +- .../Layers/LayerInfo/LayerSectionInfo.cs | 188 +- .../Layers/LayerInfo/LayerSectionInfo.cs.meta | 24 +- .../Layers/LayerInfo/LayerUnicodeName.cs | 84 +- .../Layers/LayerInfo/LayerUnicodeName.cs.meta | 24 +- .../PsdFile/Layers/LayerInfo/RawLayerInfo.cs | 104 +- .../Layers/LayerInfo/RawLayerInfo.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Layers/Mask.cs | 298 +- Editor/PSDPlugin/PsdFile/Layers/Mask.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/LoadContext.cs | 88 +- Editor/PSDPlugin/PsdFile/LoadContext.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs | 458 +-- .../PSDPlugin/PsdFile/PsdBinaryReader.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/PsdBlendMode.cs | 104 +- Editor/PSDPlugin/PsdFile/PsdBlendMode.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/PsdFile.cs | 1416 ++++---- Editor/PSDPlugin/PsdFile/PsdFile.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/RleReader.cs | 212 +- Editor/PSDPlugin/PsdFile/RleReader.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/RleRowLengths.cs | 100 +- .../PSDPlugin/PsdFile/RleRowLengths.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/RleWriter.cs | 460 +-- Editor/PSDPlugin/PsdFile/RleWriter.cs.meta | 24 +- Editor/PSDPlugin/PsdFile/Util.cs | 780 ++-- Editor/PSDPlugin/PsdFile/Util.cs.meta | 24 +- Editor/PSDPlugin/PsdPlugin.asmdef | 18 +- Editor/PSDPlugin/PsdPlugin.asmdef.meta | 14 +- Editor/SpriteData.cs | 188 +- Editor/SpriteData.cs.meta | 26 +- Editor/Tasks.meta | 16 +- Editor/Tasks/ExtractLayerTask.cs | 276 +- Editor/Tasks/ExtractLayerTask.cs.meta | 22 +- Editor/Tasks/FlattenImageTask.cs | 250 +- Editor/Tasks/FlattenImageTask.cs.meta | 22 +- Editor/TexturePlatformSettingsController.cs | 508 +-- .../TexturePlatformSettingsController.cs.meta | 26 +- Editor/TexturePlatformSettingsModal.cs | 760 ++-- Editor/TexturePlatformSettingsModal.cs.meta | 22 +- Editor/TexturePlatformSettingsView.cs | 310 +- Editor/TexturePlatformSettingsView.cs.meta | 26 +- Editor/TextureSettingsGUI.cs | 766 ++-- Editor/TextureSettingsGUI.cs.meta | 22 +- Editor/Unity.2D.Psdimporter.Editor.asmdef | 44 +- .../Unity.2D.Psdimporter.Editor.asmdef.meta | 14 +- LICENSE.md | 8 +- LICENSE.md.meta | 14 +- README.md | 18 +- README.md.meta | 14 +- Tests.meta | 20 +- Tests/EditorTests.meta | 16 +- Tests/EditorTests/PlaceholderTests.cs | 28 +- Tests/EditorTests/PlaceholderTests.cs.meta | 22 +- .../Unity.2D.Psdimporter.EditorTests.asmdef | 48 +- ...ity.2D.Psdimporter.EditorTests.asmdef.meta | 14 +- Third Party Notices.md | 144 +- Third Party Notices.md.meta | 14 +- package.json | 16 +- package.json.meta | 14 +- 266 files changed, 18649 insertions(+), 12808 deletions(-) create mode 100644 Documentation~/images/21_2-Fei-SpriteRect-head-moved-hidden.png create mode 100644 Documentation~/images/21_2-Fei-SpriteRect-head-moved.png create mode 100644 Documentation~/images/21_2-Fei-SpriteRect-head-original.png create mode 100644 Documentation~/images/21_2-Fei-SpriteRect-head-resized.png create mode 100644 Documentation~/images/21_2-Fei-grouping-layers.png create mode 100644 Documentation~/images/21_2-Fei-nogrouping.png create mode 100644 Documentation~/images/21_2-PSDImporter-properties.png delete mode 100644 Documentation~/images/table1.png delete mode 100644 Documentation~/images/table2.png create mode 100644 Editor/Assets.meta create mode 100644 Editor/Assets/Icons.meta create mode 100644 Editor/Assets/Icons/Dark.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@16x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@16x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@1x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@1x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@2x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@2x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@4x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@4x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@8x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Collapsed@8x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@16x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@16x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@1x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@1x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@2x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@2x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@4x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@4x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@8x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Mixed@8x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@16x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@16x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@1x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@1x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@2x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@2x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@4x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@4x.png.meta create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@8x.png create mode 100644 Editor/Assets/Icons/Dark/Layers Separated@8x.png.meta create mode 100644 Editor/Assets/Icons/Light.meta create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@16x.png create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@16x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@1x.png create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@1x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@2x.png create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@2x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@4x.png create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@4x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@8x.png create mode 100644 Editor/Assets/Icons/Light/Layers Collapsed@8x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@16x.png create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@16x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@1x.png create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@1x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@2x.png create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@2x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@4x.png create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@4x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@8x.png create mode 100644 Editor/Assets/Icons/Light/Layers Mixed@8x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Separated@16x.png create mode 100644 Editor/Assets/Icons/Light/Layers Separated@16x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Separated@1x.png create mode 100644 Editor/Assets/Icons/Light/Layers Separated@1x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Separated@2x.png create mode 100644 Editor/Assets/Icons/Light/Layers Separated@2x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Separated@4x.png create mode 100644 Editor/Assets/Icons/Light/Layers Separated@4x.png.meta create mode 100644 Editor/Assets/Icons/Light/Layers Separated@8x.png create mode 100644 Editor/Assets/Icons/Light/Layers Separated@8x.png.meta create mode 100644 Editor/Assets/Icons/Selected.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@16x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@16x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@1x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@1x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@2x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@2x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@4x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@4x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@8x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Collapsed@8x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@16x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@16x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@1x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@1x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@2x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@2x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@4x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@4x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@8x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Mixed@8x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@16x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@16x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@1x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@1x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@2x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@2x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@4x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@4x.png.meta create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@8x.png create mode 100644 Editor/Assets/Icons/Selected/Layers Separated@8x.png.meta create mode 100644 Editor/PSDImporterEditorLayerTreeView.cs create mode 100644 Editor/PSDImporterEditorLayerTreeView.cs.meta create mode 100644 Editor/PSDLayerMappingStrategy.cs create mode 100644 Editor/PSDLayerMappingStrategy.cs.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index 430cdf8..cd4eb86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,169 +1,169 @@ -# Changelog - -## [5.0.3] - 2021-03-28 -### Fixed -- Fixed package description -- Fixed Unity hang when importing certain PSD files (case 1325770) - - -## [5.0.2] - 2021-03-21 -### Changed -- Updated package dependencies - -### Fixed -- Fixed manual documentation - -## [5.0.1] - 2021-03-19 -### Changed -- Updated package dependencies - -## [5.0.0] - 2021-03-17 -### Changed -- Update version for release - -## [5.0.0-pre.3] - 2021-03-15 -### Changed -- Updated documentation - -## [5.0.0-pre.2] - 2021-01-16 -### Changed -- Update license file - -### Fixed -- Fixed case 1291323 where upgrading from PSDImporter v2 causes Sprite to be missing - -## [5.0.0-pre.1] - 2020-11-02 -### Added -- Added bone sharing from other PSDImporter file - -## [4.0.2] - 2020-08-31 -### Fixed -- Fixed importing files with vector layers generates textures incorrectly (case 1266986) -- Fixed Sprite Editor Window doesn't show the Sprite when the Inspector is locked and the Sprite is not selected in the Project window - -## [4.0.1] - 2020-07-07 -### Fixed -- Fixed ArgumentException thrown when 2D Game Kit is imported for the first time (case 1244287) -- Updated to use non-experimental AssetImporter (case 1254380) - -## [4.0.0] - 2020-05-11 -### Changed -- Version bump for Unity 2020.2 - -## [3.1.4] - 2020-04-09 -### Fixed -- Fix PSD import issues with PSD file without unique layer id -- Fix crash on importing huge PSD files -- Fix metafile not updated when reimporting -- Fix error when importing PSB files with 32-bit color - -### Changed -- Improve PSD file import performance - -## [3.1.3] - 2020-03-20 -### Changed -- Update 2D Animation dependency - -## [4.0.0] - 2020-03-11 -### Changed -- Version bump for Unity 2020.2 - -## [3.1.2] - 2020-02-27 -### Fixed -- Fixed broken documentation links in inspectors -- Fixed empty GameObjects created in certain cases - -## [3.1.1] - 2020-01-09 -### Fixed -- Fix wrong dependency version - -## [3.1.0] - 2019-12-16 -### Added -- Expose PSDImporter class to be accessible via scripting -- Added example in manual to show how to set PSDImporter as default importer for PSD files. - -## [3.0.0] - 2019-11-06 -### Changed -- Update version number for Unity 2020.1 -- Update documentation - -## [2.0.6] - 2019-10-18 -### Fixed -- Fixed SpriteRect name clash when Photoshop layer is renamed to the same name as an exisiting user created SpriteRect - -## [2.0.5] - 2019-08-06 -### Fixed -- Physics Shape not saved into Sprite when importing with AssetDatabase V2 - -### Added -- Experimental feature to have Sprites with same name generated from source file -- Support for providing Layer and Group order to Animation Skinning Module - -## [2.0.4] - 2019-08-09 -### Added -- Add related test packages -- Add support Secondary Texture Module in Sprite Editor Window - -### Fixed -- Texture and SpriteLibraryAsset subassets in PSDImporter now follows the main asset's name. - -## [2.0.3] - 2019-07-20 -### Changed -- Update 2D Animation dependency - -## [2.0.2] - 2019-07-13 -### Changed -- Mark package to support Unity 2019.3.0a10 onwards. - -## [2.0.1] - 2019-06-12 -### Changed -- Update 2D Animation dependency - -## [2.0.0] - 2019-06-17 -### Changed -- Remove preview tag -- Remove experimental namespace - -## [1.2.0-preview.2] - 2019-06-07 -### Added -- Change API to internal access -- Only generate Sprite Library Asset if there is entry -- Do not reset Reslice checkbox after Inspector apply - -## [1.2.0-preview.1] - 2019-03-15 -### Added -- Update support for 2019.2 -- Integrate with 2D Animation Sprite Library -- Integrate with new 2D Animation Character Group -- Fix asset name conflict - -## [1.1.0-preview.2] - 2019-04-23 -### Added -- Fix potential name clashing issues with ScriptedImporter -- Fix Prefab asset using wrong name. Note this will break Prefab references if upgrading from previous versions. - -## [1.1.0-preview.1] - 2019-02-19 -### Added -- Update dependency for 2019.1 support - -## [1.0.0-preview.3] - 2019-02-19 -### Added -- Fix compilation error in .NET 3.5 - -## [1.0.0-preview.2] - 2019-01-25 -### Added -- Fix unable to rig Sprites created manually -- Remove legacy packing tag -- Default Texture Type is changed to 'Sprite (2D and UI)' -- Default Sprite Mode is changed to 'Multiple' - -## [1.0.0-preview.1] - 2018-11-20 -### Added -- New release -- ScriptedImporter for importing Adobe Photoshop file -- Supports handling of Adobe Photoshop layers - - Creates Sprites from individual layers - - Handles include or exclude hidden layers -- Supports Prefab generation that reconstruct generated Sprites to original art asset layout - - Prefab generation supports GameObject grouping based on Adobe Photoshop layer grouping -- Supports 2D Animation v2 single character with multiple Sprites workflow +# Changelog + +## [6.0.0-pre.2] - 2021-05-14 +### Changed +- Update dependency version + +## [6.0.0-pre.1] - 2021-05-05 +### Changed +- Version bump for Unity 2021.2 + +### Added +- Add ability to use Photoshop file's layer name to map to SpriteRect instead of using layer id +- Provide auto custom Physics shape generation option +- Add support to collapse layers in a Photoshop file's group +- Improve PSDImporter Inspector + +### Fixed +- Fixed Unity hang when importing certain PSD files (case 1312835) + +## [5.0.0] - 2021-03-17 +### Changed +- Update version for release + +## [5.0.0-pre.3] - 2021-03-15 +### Changed +- Updated documentation + +## [5.0.0-pre.2] - 2021-01-16 +### Changed +- Update license file + +### Fixed +- Fixed case 1291323 where upgrading from PSDImporter v2 causes Sprite to be missing + +## [5.0.0-pre.1] - 2020-11-02 +### Added +- Added bone sharing from other PSDImporter file + +## [4.0.2] - 2020-08-31 +### Fixed +- Fixed importing files with vector layers generates textures incorrectly (case 1266986) +- Fixed Sprite Editor Window doesn't show the Sprite when the Inspector is locked and the Sprite is not selected in the Project window + +## [4.0.1] - 2020-07-07 +### Fixed +- Fixed ArgumentException thrown when 2D Game Kit is imported for the first time (case 1244287) +- Updated to use non-experimental AssetImporter (case 1254380) + +## [4.0.0] - 2020-05-11 +### Changed +- Version bump for Unity 2020.2 + +## [3.1.4] - 2020-04-09 +### Fixed +- Fix PSD import issues with PSD file without unique layer id +- Fix crash on importing huge PSD files +- Fix metafile not updated when reimporting +- Fix error when importing PSB files with 32-bit color + +### Changed +- Improve PSD file import performance + +## [3.1.3] - 2020-03-20 +### Changed +- Update 2D Animation dependency + +## [4.0.0] - 2020-03-11 +### Changed +- Version bump for Unity 2020.2 + +## [3.1.2] - 2020-02-27 +### Fixed +- Fixed broken documentation links in inspectors +- Fixed empty GameObjects created in certain cases + +## [3.1.1] - 2020-01-09 +### Fixed +- Fix wrong dependency version + +## [3.1.0] - 2019-12-16 +### Added +- Expose PSDImporter class to be accessible via scripting +- Added example in manual to show how to set PSDImporter as default importer for PSD files. + +## [3.0.0] - 2019-11-06 +### Changed +- Update version number for Unity 2020.1 +- Update documentation + +## [2.0.6] - 2019-10-18 +### Fixed +- Fixed SpriteRect name clash when Photoshop layer is renamed to the same name as an exisiting user created SpriteRect + +## [2.0.5] - 2019-08-06 +### Fixed +- Physics Shape not saved into Sprite when importing with AssetDatabase V2 + +### Added +- Experimental feature to have Sprites with same name generated from source file +- Support for providing Layer and Group order to Animation Skinning Module + +## [2.0.4] - 2019-08-09 +### Added +- Add related test packages +- Add support Secondary Texture Module in Sprite Editor Window + +### Fixed +- Texture and SpriteLibraryAsset subassets in PSDImporter now follows the main asset's name. + +## [2.0.3] - 2019-07-20 +### Changed +- Update 2D Animation dependency + +## [2.0.2] - 2019-07-13 +### Changed +- Mark package to support Unity 2019.3.0a10 onwards. + +## [2.0.1] - 2019-06-12 +### Changed +- Update 2D Animation dependency + +## [2.0.0] - 2019-06-17 +### Changed +- Remove preview tag +- Remove experimental namespace + +## [1.2.0-preview.2] - 2019-06-07 +### Added +- Change API to internal access +- Only generate Sprite Library Asset if there is entry +- Do not reset Reslice checkbox after Inspector apply + +## [1.2.0-preview.1] - 2019-03-15 +### Added +- Update support for 2019.2 +- Integrate with 2D Animation Sprite Library +- Integrate with new 2D Animation Character Group +- Fix asset name conflict + +## [1.1.0-preview.2] - 2019-04-23 +### Added +- Fix potential name clashing issues with ScriptedImporter +- Fix Prefab asset using wrong name. Note this will break Prefab references if upgrading from previous versions. + +## [1.1.0-preview.1] - 2019-02-19 +### Added +- Update dependency for 2019.1 support + +## [1.0.0-preview.3] - 2019-02-19 +### Added +- Fix compilation error in .NET 3.5 + +## [1.0.0-preview.2] - 2019-01-25 +### Added +- Fix unable to rig Sprites created manually +- Remove legacy packing tag +- Default Texture Type is changed to 'Sprite (2D and UI)' +- Default Sprite Mode is changed to 'Multiple' + +## [1.0.0-preview.1] - 2018-11-20 +### Added +- New release +- ScriptedImporter for importing Adobe Photoshop file +- Supports handling of Adobe Photoshop layers + - Creates Sprites from individual layers + - Handles include or exclude hidden layers +- Supports Prefab generation that reconstruct generated Sprites to original art asset layout + - Prefab generation supports GameObject grouping based on Adobe Photoshop layer grouping +- Supports 2D Animation v2 single character with multiple Sprites workflow diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta index 6d4519a..d288b53 100644 --- a/CHANGELOG.md.meta +++ b/CHANGELOG.md.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 2e891b338ba9c514b871d785976f600e -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2e891b338ba9c514b871d785976f600e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation~/PSD-importer-SpriteRect.md b/Documentation~/PSD-importer-SpriteRect.md index 4ade9d9..1828e86 100644 --- a/Documentation~/PSD-importer-SpriteRect.md +++ b/Documentation~/PSD-importer-SpriteRect.md @@ -1,63 +1,63 @@ -# How the PSD Importer uses SpriteRect data -The PSD Importer can store four separate sets of[ SpriteRect](https://docs.unity3d.com/ScriptReference/Sprite-rect.html) data, with one set per each of the four combinations of Importer property settings below: - 1. When [**Sprite Mode**](PSD-importer-properties.md#SpriteMode) is set to **Single**. - 2. When **Sprite Mode** is set to **Multiple**. - 3. When **Sprite Mode** is set to **Multiple,** and [**Mosaic**](PSD-importer-properties.md#Mosaic) is enabled. - 4. When **Sprite Mode** is set to **Multiple**, both **Mosaic** and [**Character Rig**](PSD-importer-properties.md#character-rig) are enabled, and there is no [Skeleton Asset](PSD-importer-properties.md#main-skeleton) assigned as the [**Main Skeleton**](PSD-importer-properties.md#main-skeleton). - 5. When **Sprite Mode** is set to **Multiple**, both **Mosaic** and **Character Rig** are enabled, and a Skeleton Asset is assigned as the **Main Skeleton**. - -Each set of data is persistent, and does not affect or overwrite the data of other sets. This means you can save different SpriteRect data for different importer settings for the same source file. The SpriteRect data persists even if you modify the dimensions and position of images in the source file, as long as the original [Layer ID](https://github.com/adobe-photoshop/generator-core/wiki/Understanding-Layer-IDs-and-Layer-Indices) of the source layers remain the same. - -## Modifying the SpriteRect data -The SpriteRect defines the location of the Sprite on the Texture that Unity generates from the imported source file. You can modify the location and size of each SpriteRect in the Sprite Editor. - -![](images/SpriteRect1.png)
Original SpriteRect location of the ‘head’ Sprite on the combined Sprite sheet Texture. - -![](images/SpriteRect2.png)
Drag the corners of the SpriteRect to modify its dimensions and location, or enter the coordinates and dimensions in the Sprite panel. - -A SpriteRect’s modified dimensions and location on the Texture is reflected for its respective Sprite in the Scene view. - -| ![](images/SpriteRect_table1.png) | ![](images/SpriteRect_table2.png) | -| ------------------------------------------------------------ | ------------------------------------------------------------ | -| Original character prefab and its ‘head’ Sprite with unmodified SpriteRect data. | Character prefab with its ‘head’ Sprite’s SpriteRect data modified.| - - -When you enable the [Mosaic](PSD-importer-properties.md#Mosaic) importer setting, the PSD Importer arranges the different layers of the source file together to form a single combined Texture when you import it. The importer generates a SpriteRect for each of these imported layers, and follows the position of its associated layer wherever it is placed in the Mosaic Texture. - -![](images/MovedSpriteRect.png)
The SpriteRect of the ‘head’ layer. The SpriteRect has been moved from its original position. - -![](images/SpriteRect_following.png)
The source file reimported after hiding several layers. The SpriteRect follows the ‘head’ layer’s placement in the new Texture. - -However, a SpriteRect’s size and position remains the same if you change the image or canvas size of its source layer in the source file. You must manually edit the size and position of the SpriteRect in the Sprite Editor, or select and apply the [Reslice](PSD-importer-properties.md#reslice) option to regenerate it from the source file. - -![](images/OriginalSpriteRect.png)
Original position and size of the SpriteRect for the generated ‘head’ Sprite. - -![image alt text](images/IncreaseSize.png)
Position and size of the SpriteRect remains the same after increasing the image size of its source layer. - -SpriteRect data persists until you manually delete the SpriteRect, or select the **Reslice** option and apply it in the importer settings. When you do this, Unity discards all user modifications for the current set of SpriteRect data and regenerates all the SpriteRects from the current source file. - -## Summary of source file modifications and their effects on SpriteRect data -| __Modification to the source file__ | __Effect on SpriteRect data__ | -| ----------------------------------------------- | ------------------------------------------------------------ | -| __New layer added /layer visibility turned on__ | The PSD importer automatically generates a new Sprite from the new layer, or newly visible layer, with its associated SpriteRect. | -| __Layer deleted /layer visibility turned off__ | The Sprite and SpriteRect that the PSD Importer generated from the deleted or previously visible layer are also deleted from the Project file. | -| __Layer is renamed__ | By default, the SpriteRect copies the new name of its source layer. However if you rename the SpriteRect in the Sprite Editor, then it retains its modified name and does not copy the source layer’s new name. | -| __Layer or canvas size changed__ | When a source layer is resized, the size and position of its related SpriteRect remains the same and does not reflect the changes made to its source layer. To make the SpriteRect reflect the changes made to its source layer, manually edit the SpriteRect’s dimensions in the Sprite Editor or select and apply the [Reslice](#Reslice) option in the PSD Importer settings. | - - -## Name collision errors -A name collision error can happen due to the following reasons: - -1. Two or more layers in the imported source file have the same name. However, Photoshop [group layers](https://helpx.adobe.com/photoshop/using/selecting-grouping-linking-layers.html#group_and_link_layers) with the same names do not cause this issue.
-2. A new layer that the PSD Importer creates in the source file has the same name as a SpriteRect you have created or modified.
-3. A layer is renamed to the same name as a SpriteRect you have modified.
-4. A previously hidden layer is made visible and imported, and it has the same name as an existing SpriteRect. - -When a name collision occurs, one SpriteRect retains the original name while the other is appended with a running number. Which SpriteRect retains their original name is based on the following priority: - -1. A SpriteRect you have created or modified.
-2. The first layer in the source file, starting from the bottom of the layer stack.
-3. Currently existing SpriteRects in the Project.
- -## Keep duplicate names -Unity’s default import behavior when there are duplicate names is to append "_[number]" to Sprites and SpriteRects it generates from source layers with identical names. Enable this feature to instead have Unity give both Sprites/SpriteRects the exact same name as their source layer even if they have duplicate names. +# How the PSD Importer uses SpriteRect data +The PSD Importer can store five separate sets of[ SpriteRect](https://docs.unity3d.com/ScriptReference/Sprite-rect.html) data, with one set for each of the five combinations of Importer property settings below: + 1. When [**Sprite Mode**](PSD-importer-properties.md#SpriteMode) is set to **Single**. + 2. When **Sprite Mode** is set to **Multiple**. + 3. When **Sprite Mode** is set to **Multiple,** and [**Mosaic**](PSD-importer-properties.md#Mosaic) is enabled. + 4. When **Sprite Mode** is set to **Multiple**, both **Mosaic** and [**Character Rig**](PSD-importer-properties.md#character-rig) are enabled, and there is no [Skeleton Asset](PSD-importer-properties.md#main-skeleton) assigned as the [**Main Skeleton**](PSD-importer-properties.md#main-skeleton). + 5. When **Sprite Mode** is set to **Multiple**, both **Mosaic** and **Character Rig** are enabled, and a Skeleton Asset is assigned as the **Main Skeleton**. + +Each set of data is persistent, and does not affect or overwrite the data of other sets. This means you can save different SpriteRect data for different importer settings for the same source file. The SpriteRect data persists even if you modify the dimensions and position of images in the source file, as long as the original [Layer ID](https://github.com/adobe-photoshop/generator-core/wiki/Understanding-Layer-IDs-and-Layer-Indices) of the source layers remains the same. + +## Modifying the SpriteRect data +The SpriteRect defines the location of the Sprite on the Texture that Unity generates from the imported source file. You can modify the location and size of each SpriteRect in the Sprite Editor. SpriteRect data persists until you manually delete the SpriteRect, or select the **Reslice** option and apply it in the importer settings. When you do this, Unity discards all user modifications for the current set of SpriteRect data and regenerates all the SpriteRects from the current source file. + +### Moving the SpriteRect + +![](images/21_2-Fei-SpriteRect-head-original.png)
Example 1: Original SpriteRect location of the ‘head’ Sprite on the combined Sprite sheet Texture. + +![](images/21_2-Fei-SpriteRect-head-moved.png)
Example 2: Drag the corners of the SpriteRect to modify its dimensions and location, or enter the coordinates and dimensions in the Sprite panel. + +A SpriteRect’s modified dimensions and location on the Texture is reflected for its respective Sprite in the Scene view. + +| ![](images/SpriteRect_table1.png) | ![](images/SpriteRect_table2.png) | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| Original character prefab and its ‘head’ Sprite with unmodified SpriteRect data. | Character prefab with its ‘head’ Sprite’s SpriteRect data modified.| + +### SpriteRect follows the position of its source layer +When you enable the [Mosaic](PSD-importer-properties.md#Mosaic) importer setting, the PSD Importer arranges the different layers of the source file together to form a single combined Texture when you import it. The importer generates a SpriteRect for each of these imported layers, and follows the position of its associated layer wherever it is placed in the Mosaic Texture. + +![](images/21_2-Fei-SpriteRect-head-moved.png)
Before example: The SpriteRect of the ‘head’ layer after moving its SpriteRect from its original position. + +![](images/21_2-Fei-SpriteRect-head-moved-hidden.png)
After hiding some of the layers in the source file and reimporting it, the resulting Mosaic Texture is different from the original. However, the SpriteRect follows the ‘head’ layer’s placement in the new Texture. + +### Resizing the source file or image +A SpriteRect’s size and position remains the same if you change the image or canvas size of its source layer in the source file. You must manually edit the size and position of the SpriteRect in the Sprite Editor, or select and apply the [Reslice](PSD-importer-properties.md#reslice) option to regenerate the SpriteRect completely from the source file. + +![](images/21_2-Fei-SpriteRect-head-original.png)
Before example: Original position and size of the SpriteRect for the generated ‘head’ Sprite from the 'head' layer. + +![](images/21_2-Fei-SpriteRect-head-resized.png)
After example: After increasing the size of the 'head' layer, the SpriteRect's position and size remains the same. + +SpriteRect data persists until you manually delete the SpriteRect, or select the **Reslice** option and apply it in the importer settings. When you do this, Unity discards all user modifications for the current set of SpriteRect data and regenerates all the SpriteRects from the current source file. + +## Summary of source file modifications and their effects on SpriteRect data +| __Modification to the source file__ | __Effect on SpriteRect data__ | +| ----------------------------------------------- | ------------------------------------------------------------ | +| __Add a new layer or enable layer visibility__ | The PSD importer automatically generates a new Sprite from the new layer, or newly visible layer, with its associated SpriteRect. | +| __Delete a layer or disable layer visibility__ | The PSD Importer deletes the associated Sprite and SpriteRect from the Project file. | +| __Rename a layer__ | By default, the SpriteRect copies the new name of its source layer. However if you rename the SpriteRect in the Sprite Editor, then it retains its modified name and does not copy the source layer’s new name. | +| __Change a layer or canvas size__ | When a source layer's size changes, the size and position of its related SpriteRect remain the same and do not reflect the changes made to its source layer.
To make the SpriteRect reflect the changes made to its source layer, manually edit the SpriteRect’s dimensions in the Sprite Editor, or go to the PSD Importer settings and select and apply the [Reslice](#Reslice) option. | + + +## Name collision errors +A name collision error occurs when two or more layers have the same name. This can happen for the following reasons: + +1. Two or more layers in the imported source file have the same name. However, Photoshop [group layers](https://helpx.adobe.com/photoshop/using/selecting-grouping-linking-layers.html#group_and_link_layers) with the same names do not cause this issue.
+2. A new layer that the PSD Importer creates in the source file has the same name as a SpriteRect you have created or modified.
+3. A layer is renamed to the same name as a SpriteRect you have modified.
+4. A previously hidden layer with the same name as an existing SpriteRect becomes visible and Unity imports it. + +When a name collision occurs, one SpriteRect retains the original name while the other is appended with a running number to the others (starting with 1). Which SpriteRect retains their original name is based on the following priority: + +1. A SpriteRect you have created or modified.
+2. The first layer in the source file, starting from the bottom of the layer stack.
+3. Currently existing SpriteRects in the Project.
diff --git a/Documentation~/PSD-importer-properties.md b/Documentation~/PSD-importer-properties.md index 033bd28..7240a31 100644 --- a/Documentation~/PSD-importer-properties.md +++ b/Documentation~/PSD-importer-properties.md @@ -1,72 +1,54 @@ -# PSD Importer Inspector properties -After importing a .psb file into your Project, select the Asset file and set its **Texture Type** to [Sprite (2D and UI)](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite). The following PSD Importer properties become available in the Inspector window. - -![](images/psd-importer-v5-properties.png)
PSD Importer Inspector properties - -| Property | Function | -| ------------------------------------------------------------ | ------------------------------------------------------------ | -| __Texture Type__ | Select [Sprite (2D and UI)](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite) to import the Texture as a [Sprite](https://docs.unity3d.com/Manual/Sprites.html). This is required to begin using the imported images with the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest/) package. | -| __Sprite Mode__ | Use this property to specify how Unity extracts the Sprite graphic from the image. This property is set to __Multiple__ by default. | -|     Single | Select this to have imported texture be treated as a single Sprite Asset without multiple parts or elements. This is ideal for characters that are a single layer in the source .psb file, which are not split into multiple layers. | -|     Multiple | This is the default option. Select this if the imported texture has multiple parts or elements, and is ideal for complex characters which have different parts which are split between multiple layers in the source .psb file as it prepares the characters for animation with the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) package. | -| __Pixels Per Unit__ | The number of pixels that equal to one Unity unit. | -| __Mesh Type__ | This defines the Mesh type that Unity generates for the Sprite. This is set to __Tight__ by default. | -|     [Full Rect](https://docs.unity3d.com/Documentation/ScriptReference/SpriteMeshType.FullRect.html) | Unity maps the Sprite onto a rectangular Mesh. | -|     [Tight](https://docs.unity3d.com/Documentation/ScriptReference/SpriteMeshType.Tight.html) | Unity generates a Mesh based on the outline of the Sprite. If the Sprite is smaller than 32 x 32 pixels, Unity always maps it onto a __Full Rect__ quad Mesh, even if you select __Tight__. | -| [__Extrude Edges__](https://docs.unity3d.com/Manual/Glossary.html#ExtrudeEdges) | Use the slider to determine how much to extend the Mesh from the edge of the Sprite. | -| __Import Hidden__ | Enable this property to include the hidden [layers](https://helpx.adobe.com/photoshop/using/layer-basics.html#layers_panel_overview) of the .psb file in the import. This produces the same import result as making all layers visible in the source file unhiding all layers in the source file before you importing it into Unity. Clear this option if you want to only import the visible layers in the .psb file. | -| __Mosaic__ | This setting is only available if you set the __Texture Type__ to __Multiple__. Enable this setting to make the PSD Importer generate Sprites from the imported layers and combine them into a single Texture in a Sprite sheet layout. | -| [__Character Rig__](#character-rig) | Enable this property to make the importer generate a [Prefab](https://docs.unity3d.com/Manual/Prefabs.html) based on the imported source file. The PSD Importer generates Sprites from the imported layers of the source file, and the Sprites’ [hierarchy](https://docs.unity3d.com/Manual/Hierarchy.html) and positions are based on their [layer hierarchy](https://helpx.adobe.com/photoshop/using/layer-basics.html#layers_panel_overview) and their positions in the .psb file. | -| __Use Layer Grouping__ | This setting is only available when you enable __Character Rig__. Enable this setting to make the importer generate a Prefab that follows the layer and grouping hierarchy of the imported .psb. file. | -| __Pivot__ | This is only available when **Character Rig** is enabled. Select the pivot point of the Sprite. | -|      Custom | Define the X and Y coordinates of a custom __Pivot__ location. | -| [__Main Skeleton__](#main-skeleton) | This is only available when **Character Rig** is enabled. Assign the [Skeleton Asset](#main-skeleton) that this character Prefab’s bone hierarchy will reference.
If no Skeleton Asset is assigned, the importer will automatically generate a Skeleton Asset as a sub-asset of this character. The Skeleton Asset contains the bone hierarchy of the Asset that was defined in the [Skinning Module]() (refer to [Skeleton Sharing](skeleton-sharing.md) for more information). | -| [__Reslice__](#reslice) | This is available only when **Mosaic** is enabled. Enable this setting to regenerate the Sprite from the imported layers and clear any changes you have made to the Sprite and its metadata. | -| [__Keep Duplicate Name__](#keep-duplicate-name) | Enable this setting to make the PSD Importer generate Sprites from the source files with the exact same name as their source layers, even when there are multiple layers with the same name. | - -## Property details -### Character Rig -Enable this property to have the PSD Importer generate a Prefab containing [Sprites](https://docs.unity3d.com/Manual/Sprites.html) based on the layers of the imported source file. The PSD Importer also automatically gives the Sprites an [Order in Layer](https://docs.unity3d.com/Manual/2DSorting.html#sortlayer) value that sorts them according to their positions in the layer hierarchy in the source file. As a result, the generated Prefab recreates the arrangement and appearance of the assets in the original source file as closely as possible. - -The name of each Sprite in the Prefab is the same as the source layer it is based on, unless a [name collision error](PSD-importer-SpriteRect.md#name-collision-errors) occurs, which is usually due to duplicate names in the source layers. - -If the Sprite contains [bone](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) or [weight](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#weight-tools) data, the PSD Importer automatically adds the __Sprite Skin__ component to it. This happens if the Sprite has been [rigged](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/CharacterRig.html) with bones and weights in the [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html) already and the source file is being reimported, or you have manually [copied and pasted](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/CopyPasteSkele.html) the bone and weight data onto the Sprites. - -Refer to the examples below of a character designed in Photoshop, and how its original layer hierarchy is transposed to the Prefab. - -![](images/PhotoshopSetup.png)
Example 1: Character artwork in Photoshop with different parts separated into different Photoshop layers. - -![](images/LayerHierarchy.png)
Example 2: The generated Prefab with Sprites sorted according to the source file’s layer hierarchy. - -![](images/LayerGrouping.png)
Example 3: The generated Prefab of the same source file but with the [Layer Grouping](#LayerGrouping) setting enabled. - -### Main Skeleton -A skeleton Asset (.skeleton) is an Asset that contains the bone hierarchy structure that can be animated with the 2D Animation package. The **Main Skeleton** property is only available when you import a .psb file with the [**Character Rig**](#character-rig) importer setting enabled. After importing the .psb file, assign a .skeleton Asset to the **Main Skeleton** property to have the generated prefab character be automatically rigged with the bone hierarchy structure contained in that .skeleton Asset. - -If there is no .skeleton Asset assigned to the importer’s **Main Skeleton** property, then a .skeleton Asset is automatically generated as a sub-Asset of the imported source file and it will be named ‘[Asset File Name] Skeleton’. You can [share .skeleton Assets](skeleton-sharing.md) between different generated Prefabs by assigning the same .skeleton as their **Main Skeleton** property when they're imported. - -When you open and edit the character in 2D Animation package’s [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html), the module will display the bone hierarchy provided by the Skeleton Asset assigned to **Main Skeleton** for rigging. - -### Reslice -Enable this setting to discard all user modifications for the current set of [`Sprite.Rect`](https://docs.unity3d.com/ScriptReference/Sprite-rect.html) data and regenerate all `Sprite.Rects` based on the current source file. Extra `Sprite.Rect` metadata (such as weights and bones data) persist if they remain valid with the regenerated `Sprite.Rects`. - -### Keep Duplicate Name -Unity’s default import behavior when there are duplicate names is to append "_[number]" to Sprites and `Sprite.Rects` it generates from source layers with identical names. Enable this feature to instead have Unity give both Sprites/`Sprite.Rects` the exact same name as their source layer even if they have duplicate names. - -## Name collision errors -A name collision error can happen due to the following reasons: -1. Two or more layers in the imported source file have the same name. However, you can use Photoshop's [group layers](https://helpx.adobe.com/photoshop/using/selecting-grouping-linking-layers.html#group_and_link_layers) feature to group layers with the same names to solve this issue. -
-2. A new layer that the PSD Importer creates in the source file has the same name as a `Sprite.Rect` you have created or modified. -
-3. A layer is renamed to the same name of a `Sprite.Rect` you have modified. -
-4. A previously hidden layer is made visible and imported, and it has the same name as an existing `Sprite.Rect`. - -When a name collision occurs, one `Sprite.Rect` retains its original name while the other is appended with a running number. Which `Sprite.Rect` retains their original name is based on the following priority: - -1. A `Sprite.Rect` you have created or modified. - -2. The first layer in the source file, starting from the bottom of the layer stack. - -3. Currently existing `Sprite.Rects` in the Project. +# PSD Importer Inspector properties +The PSD Importer is available after you import a .psb file into your Project. Select the .psb Asset file and set its **Texture Type** to [Sprite (2D and UI)](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite). The following PSD Importer properties become available in the Inspector window. + +![](images/21_2-PSDImporter-properties.png)
PSD Importer Inspector properties + +| Property | Function | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| __Texture Type__ | Select [Sprite (2D and UI)](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite) to import the Texture as a [Sprite](https://docs.unity3d.com/Manual/Sprites.html). This is necessary to begin using the imported images with the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest/) package. | +| __Sprite Mode__ | Use this property to specify how Unity extracts the Sprite graphic from the image. This property is set to __Multiple__ by default. | +|     Single | Select **Single** to have Unity treat the imported texture as a single Sprite Asset without multiple individual parts. This is ideal for characters that are a single layer in the source .psb file, which are not split into multiple layers. | +|     Multiple |If the imported texture has multiple parts, select **Multiple** to have Unity create a Sprite for each layer. This is ideal for complex characters which have different parts split between multiple layers in the source .psb file, because it prepares the characters for animation with the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) package. | +| __Pixels Per Unit__ | Set the number of pixels that equal to one Unity unit. | +| __Mesh Type__ | Set the Mesh type that Unity generates for the Sprite. This is set to __Tight__ by default. | +|     [Full Rect](https://docs.unity3d.com/Documentation/ScriptReference/SpriteMeshType.FullRect.html) | Unity maps the Sprite onto a rectangular Mesh. | +|     [Tight](https://docs.unity3d.com/Documentation/ScriptReference/SpriteMeshType.Tight.html) | Unity generates a Mesh based on the outline of the Sprite. If the Sprite is smaller than 32 x 32 pixels, Unity always maps it onto a __Full Rect__ quad Mesh, even if you select __Tight__. | +| [__Extrude Edges__](https://docs.unity3d.com/Manual/Glossary.html#ExtrudeEdges) | Use the slider to determine how much to extend the Mesh from the edge of the Sprite. | +| __Import Hidden__ | Enable this property to include the hidden [layers](https://helpx.adobe.com/photoshop/using/layer-basics.html#layers_panel_overview) of the .psb file in the import. This is the equivalent of making all layers visible in the source file before it is imported into Unity. Disable this property if you want to only import the visible layers in the .psb file. | +| __Mosaic__ |Enable this property to make the PSD Importer generate Sprites from the imported layers and combine them into a single Texture in a Sprite sheet layout.
This setting is only available if you set the **Texture Type** to **Multiple**. | | | +| __Character Rig__ | Enable this property to make the importer generate a [Prefab](https://docs.unity3d.com/Manual/Prefabs.html) based on the imported source file. The PSD Importer generates Sprites from the imported layers of the source file, and the Sprites’ [hierarchy](https://docs.unity3d.com/Manual/Hierarchy.html) and positions are based on their [layer hierarchy](https://helpx.adobe.com/photoshop/using/layer-basics.html#layers_panel_overview) and their positions in the .psb file.
For more details, see [Property details: Character Rig](#character-rig), below. | +| __Use Layer Grouping__ | Enable this setting to make the importer generate a Prefab that follows the layer and grouping hierarchy of the imported .psb file.
This setting is only available when you enable **Character Rig**. | +| __Pivot__ |Select the pivot point of the Sprite.
This is only available when **Character Rig** is enabled. | +|      Custom | Define the X and Y coordinates of a custom __Pivot__ location. | +| __Main Skeleton__ | Assign the [Skeleton Asset](#main-skeleton) that this character Prefab’s bone hierarchy should reference.
If no Skeleton Asset is assigned, the importer automatically generates a Skeleton Asset as a sub-asset of this character. The Skeleton Asset contains the bone hierarchy of the Asset defined in the [Skinning Module]() (see [Skeleton Sharing](skeleton-sharing.md) for more information about using Skeleton Assets).
This property is only available when Character Rig is enabled.
For more details, see [Property details: Main Skeleton](#main-skeleton), below. | +| __Reslice__ |Enable this setting to regenerate the Sprite from the imported layers and clear any changes you have made to the Sprite and its metadata.
This is available only when Mosaic is enabled.
For more details, see [Property details: Reslice](#reslice) below. | +| __Keep Duplicate Name__ | Enable this setting to make the PSD Importer generate Sprites from the source files with the exact same name as their source layers, even when there are multiple layers with the same name.
For more details, see [Property details: Keep Duplicate Name](#keep-duplicate-name) below.| + +## Property details +### Character Rig +When **Character Rig** is enabled, the PSD Importer generates a Prefab that contains [Sprites](https://docs.unity3d.com/Manual/Sprites.html) based on the layers of the imported source file. The PSD Importer also automatically gives the Sprites an [Order in Layer](https://docs.unity3d.com/Manual/2DSorting.html#sortlayer) value that sorts them according to their positions in the layer hierarchy in the source file. As a result, the generated Prefab recreates the arrangement and appearance of the assets in the original source file as closely as possible. + +The name of each Sprite in the Prefab is the same as the source layer it is based on, unless a [name collision error](PSD-importer-SpriteRect.md#name-collision-errors) occurs, which is usually due to duplicate names in the source layers. + +If the Sprite contains [bone](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) or [weight](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#weight-tools) data, the PSD Importer automatically adds the __Sprite Skin__ component to it. This happens if the Sprite is already [rigged](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/CharacterRig.html) with bones and weights in the [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html) already and you are reimporting the source file, or if you have manually [copied and pasted](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/CopyPasteSkele.html) the bone and weight data onto the Sprites. + +The examples below demonstrate a character designed in Photoshop, and how its original layer hierarchy is transposed to the Prefab. + +![](images/PhotoshopSetup.png)
Example 1: Character artwork in Photoshop with different parts separated into different Photoshop layers. + +![](images/21_2-Fei-nogrouping.png)
Example 2: The generated Prefab with Sprites sorted according to the source file’s layer hierarchy. + +![](images/21_2-Fei-grouping-layers.png)
Example 3: The generated Prefab of the same source file but with [Layer Grouping](#LayerGrouping) enabled. + +### Main Skeleton +A skeleton Asset (.skeleton) is an Asset that contains the bone hierarchy structure that you can animate with the 2D Animation package. The **Main Skeleton** property is only available when you import a .psb file with the [**Character Rig**](#character-rig) importer setting enabled. After importing the .psb file, assign a .skeleton Asset to the **Main Skeleton** property to have Unity automatically rig generated prefab character with the bone hierarchy structure contained in that .skeleton Asset. + +If no Skeleton Asset is assigned to the importer’s **Main Skeleton** property, then Unity automatically generates a Skeleton Asset as a sub-asset of the imported source file and it will be named ‘[Asset File Name] Skeleton’. You can [share .skeleton Assets](skeleton-sharing.md) between different generated Prefabs; to do this, assign the same .skeleton as their **Main Skeleton** property when they're imported. + +When you open and edit the character in 2D Animation package’s [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html), the module displays the bone hierarchy provided by the Skeleton Asset assigned to **Main Skeleton** for rigging. + +### Reslice +Enable this setting to discard all user modifications for the current set of [`SpriteRect`](https://docs.unity3d.com/Packages/com.unity.2d.sprite@1.0/api/UnityEditor.SpriteRect.html) data and regenerate all `SpriteRects` based on the current source file. Extra `SpriteRect` metadata (such as weights and bones data) persist if they remain valid with the regenerated `SpriteRects`. + +### Keep Duplicate Name +Unity’s default import behavior when there are duplicate names is to append `_[number]` to Sprites and `SpriteRects` it generates from source layers with identical names. Enable this feature to instead have Unity give Sprites and `SpriteRects` the same name as their source layer even if they have duplicate names. diff --git a/Documentation~/PSD-override.md b/Documentation~/PSD-override.md index 7670655..2d749a7 100644 --- a/Documentation~/PSD-override.md +++ b/Documentation~/PSD-override.md @@ -1,53 +1,57 @@ -# PSD File Importer Override - -From Unity 2019.30f1 onwards, the PSD Importer can be customized to import files with the .psd extension. To do that you will need to have custom scripts that allows you to do that by calling the `AssetDatabaseExperimental.SetImporterOverride` method. The following are examples on how to use the API: - -## PSDImporterOverride.cs -``` -using UnityEngine; - -namespace UnityEditor.U2D.PSD -{ - [ScriptedImporter(1, "psd", AutoSelect = false)] - internal class PSDImporterOverride : PSDImporter - { - - [MenuItem("Assets/2D Importer", false, 30)] - [MenuItem("Assets/2D Importer/Change PSD File Importer", false, 30)] - static void ChangeImporter() - { - foreach (var obj in Selection.objects) - { - var path = AssetDatabase.GetAssetPath(obj); - var ext = System.IO.Path.GetExtension(path); - if (ext == ".psd") - { - var importer = AssetImporter.GetAtPath(path); - if (importer is PSDImporterOverride) - { - Debug.Log(string.Format("{0} is now imported with TextureImporter", path)); - AssetDatabaseExperimental.ClearImporterOverride(path); - } - else - { - Debug.Log(string.Format("{0} is now imported with PSDImporter", path)); - AssetDatabaseExperimental.SetImporterOverride(path); - } - } - } - } - } -} -``` - -## PSDImporterOverrideEditor.cs -``` -namespace UnityEditor.U2D.PSD -{ - [CustomEditor(typeof(UnityEditor.U2D.PSD.PSDImporterOverride))] - internal class PSDImporterOverrideEditor : PSDImporterEditor - { - } - -} -``` +# PSD File Importer Override + +From Unity 2019.30f1 onwards, you can customize the PSD Importer to import files with the .psd extension. To do that you need to create custom scripts that call the `AssetDatabaseExperimental.SetImporterOverride` method. + +## Example SetImporterOverride scripts +### PSDImporterOverride.cs +``` +using System.IO; +using UnityEditor.Experimental; +using UnityEditor.Experimental.AssetImporters; +using UnityEngine; + +namespace UnityEditor.U2D.PSD +{ + [ScriptedImporter(1, "psd", AutoSelect = false)] + internal class PSDImporterOverride : PSDImporter + { + + [MenuItem("Assets/2D Importer", false, 30)] + [MenuItem("Assets/2D Importer/Change PSD File Importer", false, 30)] + static void ChangeImporter() + { + foreach (var obj in Selection.objects) + { + var path = AssetDatabase.GetAssetPath(obj); + var ext = System.IO.Path.GetExtension(path); + if (ext == ".psd") + { + var importer = AssetImporter.GetAtPath(path); + if (importer is PSDImporterOverride) + { + Debug.Log(string.Format("{0} is now imported with TextureImporter", path)); + AssetDatabaseExperimental.ClearImporterOverride(path); + } + else + { + Debug.Log(string.Format("{0} is now imported with PSDImporter", path)); + AssetDatabaseExperimental.SetImporterOverride(path); + } + } + } + } + } +} +``` + +### PSDImporterOverrideEditor.cs +``` +namespace UnityEditor.U2D.PSD +{ + [CustomEditor(typeof(UnityEditor.U2D.PSD.PSDImporterOverride))] + internal class PSDImporterOverrideEditor : PSDImporterEditor + { + } + +} +``` diff --git a/Documentation~/TableOfContents.md b/Documentation~/TableOfContents.md index 6fe5330..bcbccb6 100644 --- a/Documentation~/TableOfContents.md +++ b/Documentation~/TableOfContents.md @@ -1,5 +1,5 @@ -* [PSD Importer Overview](index) -* [PSD Importer Inspector properties](PSD-importer-properties) - * [Skeleton sharing](skeleton-sharing) -* [How SpriteRect data is used](PSD-importer-SpriteRect) -* [Implementing the PSD File Importer Override](PSD-override) +* [PSD Importer Overview](index) +* [PSD Importer Inspector properties](PSD-importer-properties) + * [Skeleton sharing](skeleton-sharing) +* [How SpriteRect data is used](PSD-importer-SpriteRect) +* [Implementing the PSD File Importer Override](PSD-override) diff --git a/Documentation~/images/21_2-Fei-SpriteRect-head-moved-hidden.png b/Documentation~/images/21_2-Fei-SpriteRect-head-moved-hidden.png new file mode 100644 index 0000000000000000000000000000000000000000..4af42587af0cf3bf465c7c6e7780bb1e51871229 GIT binary patch literal 101407 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

X=~YXg)IWKA+?Bj@}n0zE6DL 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

)CJ>HqNijYa8kqlgYdD)#_zio;)Wvzt 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 @UZVM}h5fx&KF<}R{t@J0S_YR#84<@s)8MsgN( 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 literal 0 HcmV?d00001 diff --git a/Documentation~/images/21_2-Fei-SpriteRect-head-original.png b/Documentation~/images/21_2-Fei-SpriteRect-head-original.png new file mode 100644 index 0000000000000000000000000000000000000000..d518f213193ae2db4a3abe28231999b029fdcb15 GIT binary patch literal 96162 zcmb??1yozl*B}Ik0xc9M?%LuZxE6;L3KS?>+%>_a&_bb5oFWM>!J)<7iWY)Paf-XU zb@TiEWxw6;TRD3+=Omf;-ks|+cjn%CpEX}85#m$fqoJV@swm5Ap`oFlq1r3B*r?xn z9-(^FAD*l7TL>B&QP*Ez^smo}sL{}{TkUl8q55ETF$)(b9y3c9b1NQiCs!0S8k&T( zx2u_jgB6s)+{(tzS(53nsf~%j&Qg*|PYBEhc717OYp3k%Zl&$}O2@+2!9vuMNm`0Q z!dnc5z{v_~#^CMb=nN6_mSp-HuNbQR*KJ-VhQC3e4w6i=e-UKR2Wv9CbaA(00P*l~ zTk!FL7=%T6_(4EnA;A|60(=7eynF(@{6gIP{9-}^V*G*(|NJnasJUBOi)qO#{*xB! zN|MPI3Uw9Z<@NIN;_(vXadEfd(HS^|nhA{sNgS-{Q!rjgl zYUkq2@E1lia~BV&Bom6$e~94Z`fs$(kbkNPr7&J^Ggn@I9=^Xs`Ww*F;@@zt9`25R z6SuVBwQ{s_vT}w(P_X>}hIO@dfx19!UH%uS|NZ!XAb?UW82oP<|0OR@PX8tWfhu^S z#Q3K|{!3_xj*qJqua*_W#lzjgO2HGwCi7p?xQe}Ww=#pexa+vMIR48}n*U;%K|p{< zkby(b&e_t%3&QyyI#|h@L9Ha2{<0c3ACQ|*SchLoOb{f-FYugCM2wH`AE00tOFL_y z{|qW3Ccr1gC;UHvqFlz(3~Kg&1h%vgvvzTJGD8V$=VWGM#p~*9!^H4!HHy7-addG< z5k_$*_#f}9ynLzY?qY4{h=- zen|19_Xn9CJD%3-Wpctn*gNL#T;iu24V!6x2iJkO_fz|IOM(2jA6^Zga-_dX*t|Yl z{zyDlZrrq0VtUVIC16+iBGPr)rN$t?wN;Ah*)xWvOU_3x4R&2=!nnTTM@2`+HxkX% z8vo(>`s(#h@DnWgeD}{A6dQKFo-k``>%wpP4AMuOM<4Y+ZmB6J-H23wiFs4?cCw98 zT*J=2XrZ!bU^LUF?{#KTvTtTj!_J#G6;y9^2qcR!>9}z~K6yR4VpVw$lKCcj6JAfZ zj^AG8@;sYm*)Ea7OqP~0?={q8~uhX808-Cr`6e%Ejt`}uUlqx;#QKZ8) zdVRX-6McMWP}T$S{BwUvdO$oIc(Yw_&3k~g@!r-pTufYi_cEufEQ+n%2r+zrzNER) zzJ$ntKajs+H+hZ06Fc4%RveiNJYD+}bFn`oheNdRb6<_#HS?h9P|BIw;dfC%#>%1B z!F>OHhoArA;^M1{mJ6!;pcQAtVU#oo-107E0AybAyI=ZV9c4W`FJ;qP-ZuWkn+ z!y^-2Pu~_xf0U$6RBh0CkyK=KUZ`Jwa$T<%BXNhj;J!wl(R r|IktGJI;#{XWBh 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%0A*O?e)OXs(fi;3 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 UHY(n-jQ{`u07*qoM6N<$g0dgbUjP6A literal 0 HcmV?d00001 diff --git a/Documentation~/images/21_2-Fei-SpriteRect-head-resized.png b/Documentation~/images/21_2-Fei-SpriteRect-head-resized.png new file mode 100644 index 0000000000000000000000000000000000000000..7aaadcebdb850649b23a85b5d134993db529d1cf GIT binary patch literal 81849 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"uP0s%6(+!2-qB7jw^)=jwK~~{>}Yl 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

D2R)&VoB5h64Z^injKfTTqt3*U?zBNBlKUJ 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

#3^!iZ_gg!rF>HL`V)Z_crV)0AA*!* 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

_nmW2Bw!X3D5%j>0HIL>2 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 E2XoPx(*OVf literal 0 HcmV?d00001 diff --git a/Documentation~/images/21_2-PSDImporter-properties.png b/Documentation~/images/21_2-PSDImporter-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac4e3f1e662dd9e06b61c760a4f8077b5aa18b2 GIT binary patch literal 20977 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 literal 80114 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

J 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 - /// ScriptedImporter to import Photoshop files - /// - [ScriptedImporter(5, "psb")] - [HelpURL("https://docs.unity3d.com/Packages/com.unity.2d.psdimporter@latest")] - [MovedFrom("UnityEditor.Experimental.AssetImporters")] - public class PSDImporter : ScriptedImporter, ISpriteEditorDataProvider - { - class UniqueNameGenerator - { - List m_NameHash = new List(); - - public bool ContainHash(int i) - { - return m_NameHash.Contains(i); - } - - public void AddHash(int i) - { - m_NameHash.Add(i); - } - - public string GetUniqueName(string name) - { - return PSDImporter.GetUniqueName(name, m_NameHash); - } - } - - class GameObjectCreationFactory : UniqueNameGenerator - { - - public GameObject CreateGameObject(string name, params System.Type[] components) - { - var newName = GetUniqueName(name); - return new GameObject(newName, components); - } - } - - struct BoneGO - { - public GameObject go; - public int index; - } - - [SerializeField] - TextureImporterSettings m_TextureImporterSettings = new TextureImporterSettings() { - mipmapEnabled = true, - mipmapFilter = TextureImporterMipFilter.BoxFilter, - sRGBTexture = true, - borderMipmap = false, - mipMapsPreserveCoverage = false, - alphaTestReferenceValue = 0.5f, - readable = false, - -#if ENABLE_TEXTURE_STREAMING - streamingMipmaps = true, -#endif - - fadeOut = false, - mipmapFadeDistanceStart = 1, - mipmapFadeDistanceEnd = 3, - - convertToNormalMap = false, - heightmapScale = 0.25F, - normalMapFilter = 0, - - generateCubemap = TextureImporterGenerateCubemap.AutoCubemap, - cubemapConvolution = 0, - - seamlessCubemap = false, - - npotScale = TextureImporterNPOTScale.ToNearest, - - spriteMode = (int)SpriteImportMode.Multiple, - spriteExtrude = 1, - spriteMeshType = SpriteMeshType.Tight, - spriteAlignment = (int)SpriteAlignment.Center, - spritePivot = new Vector2(0.5f, 0.5f), - spritePixelsPerUnit = 100.0f, - spriteBorder = new Vector4(0.0f, 0.0f, 0.0f, 0.0f), - - alphaSource = TextureImporterAlphaSource.FromInput, - alphaIsTransparency = true, - spriteTessellationDetail = -1.0f, - - textureType = TextureImporterType.Sprite, - textureShape = TextureImporterShape.Texture2D, - - filterMode = FilterMode.Bilinear, - aniso = 1, - mipmapBias = 0.0f, - wrapModeU = TextureWrapMode.Repeat, - wrapModeV = TextureWrapMode.Repeat, - wrapModeW = TextureWrapMode.Repeat, - }; - - [SerializeField] - // SpriteData for both single and multiple mode - List m_SpriteImportData = new List(); // we use index 0 for single sprite and the rest for multiple sprites - [SerializeField] - // SpriteData for Mosaic mode - List m_MosaicSpriteImportData = new List(); - [SerializeField] - // SpriteData for Rig mode - List m_RigSpriteImportData = new List(); - [SerializeField] - // CharacterData for Rig mode - CharacterData m_CharacterData = new CharacterData(); - [SerializeField] - // SpriteData for shared rig mode - List m_SharedRigSpriteImportData = new List(); - [SerializeField] - // CharacterData for shared rig mode - CharacterData m_SharedRigCharacterData = new CharacterData(); - - [SerializeField] - List m_PlatformSettings = new List(); - [SerializeField] - bool m_MosaicLayers = true; - [SerializeField] - bool m_CharacterMode = true; - [SerializeField] - Vector2 m_DocumentPivot = Vector2.zero; - [SerializeField] - SpriteAlignment m_DocumentAlignment = SpriteAlignment.BottomCenter; - [SerializeField] - bool m_ImportHiddenLayers = false; - [SerializeField] - int m_ImportedTextureWidth; - [SerializeField] - int m_ImportedTextureHeight; - [SerializeField] - Vector2Int m_DocumentSize; - - [SerializeField] - bool m_PaperDollMode = false; - - [SerializeField] - bool m_KeepDupilcateSpriteName = true; - - [SerializeField] - private string m_SkeletonAssetReferenceID = null; - - [SerializeField] - SpriteCategoryList m_SpriteCategoryList = new SpriteCategoryList() {categories = new List()}; - GameObjectCreationFactory m_GameObjectFactory = new GameObjectCreationFactory(); - - internal SpriteCategoryList spriteCategoryList { get { return m_SpriteCategoryList; } set { m_SpriteCategoryList = value; } } - - [SerializeField] - int m_TextureActualWidth; - internal int textureActualWidth - { - get { return m_TextureActualWidth; } - private set { m_TextureActualWidth = value; } - } - - [SerializeField] - int m_TextureActualHeight; - internal int textureActualHeight - { - get { return m_TextureActualHeight; } - private set { m_TextureActualHeight = value; } - } - - [SerializeField] - string m_SpritePackingTag = ""; - - [SerializeField] - bool m_ResliceFromLayer = false; - - [SerializeField] - List m_MosaicPSDLayers = new List(); - [SerializeField] - List m_RigPSDLayers = new List(); - [SerializeField] - List m_SharedRigPSDLayers = new List(); - - [SerializeField] - bool m_GenerateGOHierarchy = false; - - [SerializeField] - string m_TextureAssetName = null; - - [SerializeField] - string m_PrefabAssetName = null; - - [SerializeField] - string m_SpriteLibAssetName = null; - - [SerializeField] - string m_SkeletonAssetName = null; - - [SerializeField] - SecondarySpriteTexture[] m_SecondarySpriteTextures; - - /// - /// Implementation of ScriptedImporter.OnImportAsset - /// - /// - /// This argument contains all the contextual information needed to process the import - /// event and is also used by the custom importer to store the resulting Unity Asset. - /// - public override void OnImportAsset(AssetImportContext ctx) - { - FileStream fileStream = new FileStream(ctx.assetPath, FileMode.Open, FileAccess.Read); - Document doc = null; - try - { - UnityEngine.Profiling.Profiler.BeginSample("OnImportAsset"); - - UnityEngine.Profiling.Profiler.BeginSample("PsdLoad"); - doc = PaintDotNet.Data.PhotoshopFileType.PsdLoad.Load(fileStream); - UnityEngine.Profiling.Profiler.EndSample(); - - ValidatePSDLayerId(doc); - - m_DocumentSize = new Vector2Int(doc.width, doc.height); - bool singleSpriteMode = m_TextureImporterSettings.textureType == TextureImporterType.Sprite && m_TextureImporterSettings.spriteMode != (int)SpriteImportMode.Multiple; - EnsureSingleSpriteExist(); - - if (m_TextureImporterSettings.textureType != TextureImporterType.Sprite || - m_MosaicLayers == false || singleSpriteMode) - { - var image = new NativeArray(doc.width * doc.height, Allocator.Persistent); - try - { - var spriteImportData = GetSpriteImportData(); - FlattenImageTask.Execute(doc.Layers, m_ImportHiddenLayers, doc.width, doc.height, image); - - int spriteCount = spriteDataCount; - int spriteIndexStart = 1; - - if (spriteImportData.Count <= 0 || spriteImportData[0] == null) - { - spriteImportData.Add(new SpriteMetaData()); - } - spriteImportData[0].name = System.IO.Path.GetFileNameWithoutExtension(ctx.assetPath) + "_1"; - spriteImportData[0].alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; - spriteImportData[0].border = m_TextureImporterSettings.spriteBorder; - spriteImportData[0].pivot = m_TextureImporterSettings.spritePivot; - spriteImportData[0].rect = new Rect(0, 0, doc.width, doc.height); - if (singleSpriteMode) - { - spriteCount = 1; - spriteIndexStart = 0; - } - textureActualWidth = doc.width; - textureActualHeight = doc.height; - var output = ImportTexture(ctx, image, doc.width, doc.height, spriteIndexStart, spriteCount); - RegisterAssets(ctx, output); - } - finally - { - image.Dispose(); - } - } - else - { - ImportFromLayers(ctx, doc); - } - - if (!string.IsNullOrEmpty(m_SkeletonAssetReferenceID)) - { - var primaryAssetPath = AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID); - if(!string.IsNullOrEmpty(primaryAssetPath) && primaryAssetPath != assetPath) - { - ctx.DependsOnArtifact(primaryAssetPath); - } - } - } - finally - { - fileStream.Close(); - if (doc != null) - doc.Dispose(); - UnityEngine.Profiling.Profiler.EndSample(); - EditorUtility.SetDirty(this); - } - - } - - static void ValidatePSDLayerId(IEnumerable oldPsdLayer, List layers, UniqueNameGenerator uniqueNameGenerator) - { - // first check if all layers are unique. If not, we use back the previous layer id based on name match - HashSet uniqueIdSet = new HashSet(); - bool useOldID = false; - foreach(var layer in layers) - { - if (uniqueIdSet.Contains(layer.LayerID)) - { - useOldID = true; - break; - } - uniqueIdSet.Add(layer.LayerID); - } - - for (int i = 0; i < layers.Count; ++i) - { - // fix case 1291323 - if (useOldID) - { - var oldLayers = oldPsdLayer.Where(x => x.name == layers[i].Name); - // pick one that is not already on the list - foreach (var ol in oldLayers) - { - if (!uniqueNameGenerator.ContainHash(ol.layerID)) - { - layers[i].LayerID = ol.layerID; - break; - } - } - } - - if (uniqueNameGenerator.ContainHash(layers[i].LayerID)) - { - var importWarning = string.Format("Layer {0}: LayerId is not unique. Mapping will be done by Layer's name.", layers[i].Name); - var layerName = uniqueNameGenerator.GetUniqueName(layers[i].Name); - if (layerName != layers[i].Name) - importWarning += "\nLayer names are not unique. Please ensure they are unique to for SpriteRect to be mapped back correctly."; - layers[i].LayerID = layerName.GetHashCode(); - Debug.LogWarning(importWarning); - } - else - uniqueNameGenerator.AddHash(layers[i].LayerID); - if (layers[i].ChildLayer != null) - { - ValidatePSDLayerId(oldPsdLayer, layers[i].ChildLayer, uniqueNameGenerator); - } - } - } - - - void ValidatePSDLayerId(Document doc) - { - UniqueNameGenerator uniqueNameGenerator = new UniqueNameGenerator(); - - ValidatePSDLayerId(GetPSDLayers(), doc.Layers, uniqueNameGenerator); - } - - TextureGenerationOutput ImportTexture(AssetImportContext ctx, NativeArray imageData, int textureWidth, int textureHeight, int spriteStart, int spriteCount) - { - if (!imageData.IsCreated || imageData.Length == 0) - return new TextureGenerationOutput(); - - UnityEngine.Profiling.Profiler.BeginSample("ImportTexture"); - var platformSettings = GetPlatformTextureSettings(ctx.selectedBuildTarget); - - var textureSettings = m_TextureImporterSettings.ExtractTextureSettings(); - textureSettings.assetPath = ctx.assetPath; - textureSettings.enablePostProcessor = true; - textureSettings.containsAlpha = true; - textureSettings.hdr = false; - - var textureAlphaSettings = m_TextureImporterSettings.ExtractTextureAlphaSettings(); - var textureMipmapSettings = m_TextureImporterSettings.ExtractTextureMipmapSettings(); - var textureCubemapSettings = m_TextureImporterSettings.ExtractTextureCubemapSettings(); - var textureWrapSettings = m_TextureImporterSettings.ExtractTextureWrapSettings(); - - TextureGenerationOutput output; - switch (m_TextureImporterSettings.textureType) - { - case TextureImporterType.Default: - output = TextureGeneratorHelper.GenerateTextureDefault(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); - break; - case TextureImporterType.NormalMap: - var textureNormalSettings = m_TextureImporterSettings.ExtractTextureNormalSettings(); - output = TextureGeneratorHelper.GenerateNormalMap(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureNormalSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); - break; - case TextureImporterType.GUI: - output = TextureGeneratorHelper.GenerateTextureGUI(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); - break; - case TextureImporterType.Sprite: - var textureSpriteSettings = m_TextureImporterSettings.ExtractTextureSpriteSettings(); - textureSpriteSettings.packingTag = m_SpritePackingTag; - textureSpriteSettings.qualifyForPacking = !string.IsNullOrEmpty(m_SpritePackingTag); - textureSpriteSettings.spriteSheetData = new UnityEditor.AssetImporters.SpriteImportData[spriteCount]; - textureSettings.npotScale = TextureImporterNPOTScale.None; - textureSettings.secondaryTextures = secondaryTextures; - var spriteImportData = GetSpriteImportData(); - for (int i = 0; i < spriteCount; ++i) - { - //AutoGenerateSpriteSkinData(m_SpriteImportData[spriteStart + i]); - textureSpriteSettings.spriteSheetData[i] = spriteImportData[spriteStart + i]; - } - output = TextureGeneratorHelper.GenerateTextureSprite(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureSpriteSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); - break; - case TextureImporterType.Cursor: - output = TextureGeneratorHelper.GenerateTextureCursor(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); - break; - case TextureImporterType.Cookie: - output = TextureGeneratorHelper.GenerateCookie(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); - break; - case TextureImporterType.Lightmap: - output = TextureGeneratorHelper.GenerateLightmap(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureMipmapSettings, textureWrapSettings); - break; - case TextureImporterType.SingleChannel: - output = TextureGeneratorHelper.GenerateTextureSingleChannel(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); - break; - default: - Debug.LogAssertion("Unknown texture type for import"); - output = default(TextureGenerationOutput); - break; - } - UnityEngine.Profiling.Profiler.EndSample(); - return output; - } - - void AutoGenerateSpriteSkinData(SpriteMetaData metaData) - { - //If bone data exist but skinning data doesn't exist, auto generate them - if (metaData.spriteBone != null && metaData.spriteBone.Count > 0 && - (metaData.vertices == null || metaData.vertices.Count == 0)) - { - var spriteMeshDataController = new SpriteMeshDataController(); - var smd = new SpriteMeshData(); - smd.spriteID = metaData.spriteID; - smd.frame = metaData.rect; - smd.pivot = metaData.pivot; - smd.bones = ModuleUtility.CreateSpriteBoneData(metaData.spriteBone.ToArray(), Matrix4x4.TRS(metaData.rect.position, Quaternion.identity, Vector3.one)); - spriteMeshDataController.spriteMeshData = smd; - spriteMeshDataController.OutlineFromAlpha(new OutlineGenerator(), GetDataProvider(), 0.05f, 200); - spriteMeshDataController.Triangulate(new Triangulator()); - spriteMeshDataController.Subdivide(new Triangulator(), 0.25f); - spriteMeshDataController.CalculateWeights(new BoundedBiharmonicWeightsGenerator(), null, 0.01f); - spriteMeshDataController.SortTrianglesByDepth(); - - List vmd = new List(smd.vertices.Count); - foreach (var v in smd.vertices) - vmd.Add(new Vertex2DMetaData() { position = v.position - smd.frame.position, boneWeight = v.editableBoneWeight.ToBoneWeight(true) }); - List emd = new List(smd.edges.Count); - foreach (var e in smd.edges) - emd.Add(new Vector2Int(e.index1, e.index2)); - - metaData.vertices = vmd; - metaData.indices = smd.indices.ToArray(); - metaData.edges = emd.ToArray(); - } - } - - string GetUniqueSpriteName(string name, List namehash) - { - if (m_KeepDupilcateSpriteName) - return name; - return GetUniqueName(name, namehash); - } - - void ImportFromLayers(AssetImportContext ctx, Document doc) - { - NativeArray output = default(NativeArray); - - List layerIndex = new List(); - List spriteNameHash = new List(); - var oldPsdLayers = GetPSDLayers(); - try - { - var psdLayers = new List(); - ExtractLayerTask.Execute(psdLayers, doc.Layers, m_ImportHiddenLayers); - var removedLayersSprite = oldPsdLayers.Where(x => psdLayers.FirstOrDefault(y => y.layerID == x.layerID) == null).Select(z => z.spriteID).ToArray(); - for (int i = 0; i < psdLayers.Count; ++i) - { - int j = 0; - var psdLayer = psdLayers[i]; - for (; j < oldPsdLayers.Count; ++j) - { - if (psdLayer.layerID == oldPsdLayers[j].layerID) - { - psdLayer.spriteID = oldPsdLayers[j].spriteID; - psdLayer.spriteName = oldPsdLayers[j].spriteName; - psdLayer.mosaicPosition = oldPsdLayers[j].mosaicPosition; - break; - } - } - } - - int expectedBufferLength = doc.width * doc.height; - var layerBuffers = new List>(); - for (int i = 0; i < psdLayers.Count; ++i) - { - var l = psdLayers[i]; - if (l.texture.IsCreated && l.texture.Length == expectedBufferLength) - { - layerBuffers.Add(l.texture); - layerIndex.Add(i); - } - } - - RectInt[] spritedata; - int width, height; - int padding = 4; - Vector2Int[] uvTransform; - ImagePacker.Pack(layerBuffers.ToArray(), doc.width, doc.height, padding, out output, out width, out height, out spritedata, out uvTransform); - var spriteImportData = GetSpriteImportData(); - if (spriteImportData.Count <= 0 || shouldResliceFromLayer) - { - var newSpriteMeta = new List(); - - for (int i = 0; i < spritedata.Length && i < layerIndex.Count; ++i) - { - var spriteSheet = spriteImportData.FirstOrDefault(x => x.spriteID == psdLayers[layerIndex[i]].spriteID); - if (spriteSheet == null) - { - spriteSheet = new SpriteMetaData(); - spriteSheet.border = Vector4.zero; - spriteSheet.alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; - spriteSheet.pivot = m_TextureImporterSettings.spritePivot; - } - - psdLayers[layerIndex[i]].spriteName = GetUniqueSpriteName(psdLayers[layerIndex[i]].name, spriteNameHash); - spriteSheet.name = psdLayers[layerIndex[i]].spriteName; - spriteSheet.rect = new Rect(spritedata[i].x, spritedata[i].y, spritedata[i].width, spritedata[i].height); - spriteSheet.uvTransform = uvTransform[i]; - - psdLayers[layerIndex[i]].spriteID = spriteSheet.spriteID; - psdLayers[layerIndex[i]].mosaicPosition = spritedata[i].position; - newSpriteMeta.Add(spriteSheet); - } - spriteImportData.Clear(); - spriteImportData.AddRange(newSpriteMeta); - } - else - { - spriteImportData.RemoveAll(x => removedLayersSprite.Contains(x.spriteID)); - - // First look for any user created SpriteRect and add those into the name hash - foreach (var spriteData in spriteImportData) - { - var psdLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteData.spriteID); - if (psdLayer == null) - spriteNameHash.Add(GetStringHash(spriteData.name)); - } - - foreach (var spriteData in spriteImportData) - { - var psdLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteData.spriteID); - if (psdLayer == null) - spriteData.uvTransform = new Vector2Int((int)spriteData.rect.position.x, (int)spriteData.rect.position.y); - // If it is user created rect or the name has been changed before - // add it into the spriteNameHash and we don't copy it over from the layer - if (psdLayer == null || psdLayer.spriteName != spriteData.name) - spriteNameHash.Add(GetStringHash(spriteData.name)); - - // If the sprite name has not been changed, we ensure the new - // layer name is still unique and use it as the sprite name - if (psdLayer != null && psdLayer.spriteName == spriteData.name) - { - psdLayer.spriteName = GetUniqueSpriteName(psdLayer.name, spriteNameHash); - spriteData.name = psdLayer.spriteName; - } - } - - //Update names for those user has not changed and add new sprite rect based on PSD file. - for (int k = 0; k < layerIndex.Count; ++k) - { - int i = layerIndex[k]; - var spriteSheet = spriteImportData.FirstOrDefault(x => x.spriteID == psdLayers[i].spriteID); - var inOldLayer = oldPsdLayers.FindIndex(x => x.layerID == psdLayers[i].layerID) != -1; - if (spriteSheet == null && !inOldLayer) - { - spriteSheet = new SpriteMetaData(); - spriteImportData.Add(spriteSheet); - spriteSheet.rect = new Rect(spritedata[k].x, spritedata[k].y, spritedata[k].width, spritedata[k].height); - spriteSheet.border = Vector4.zero; - spriteSheet.alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; - spriteSheet.pivot = m_TextureImporterSettings.spritePivot; - psdLayers[i].spriteName = GetUniqueSpriteName(psdLayers[i].name, spriteNameHash); - spriteSheet.name = psdLayers[i].spriteName; - } - else if (spriteSheet != null) - { - var r = spriteSheet.rect; - r.position = spriteSheet.rect.position - psdLayers[i].mosaicPosition + spritedata[k].position; - spriteSheet.rect = r; - } - - if (spriteSheet != null) - { - spriteSheet.uvTransform = uvTransform[k]; - psdLayers[i].spriteID = spriteSheet.spriteID; - psdLayers[i].mosaicPosition = spritedata[k].position; - } - } - } - - foreach (var l in oldPsdLayers) - l.Dispose(); - oldPsdLayers.Clear(); - - oldPsdLayers.AddRange(psdLayers); - m_ImportedTextureHeight = textureActualHeight = height; - m_ImportedTextureWidth = textureActualWidth = width; - var generatedTexture = ImportTexture(ctx, output, width, height, 0, spriteImportData.Count); - - if (generatedTexture.texture) - { - m_ImportedTextureHeight = generatedTexture.texture.height; - m_ImportedTextureWidth = generatedTexture.texture.width; - } - - RegisterAssets(ctx, generatedTexture); - } - finally - { - if (output.IsCreated) - output.Dispose(); - foreach (var l in oldPsdLayers) - l.Dispose(); - } - } - - void EnsureSingleSpriteExist() - { - if (m_SpriteImportData.Count <= 0) - m_SpriteImportData.Add(new SpriteMetaData()); // insert default for single sprite mode - } - - internal TextureImporterPlatformSettings GetPlatformTextureSettings(BuildTarget buildTarget) - { - var buildTargetName = TexturePlatformSettingsHelper.GetBuildTargetName(buildTarget); - TextureImporterPlatformSettings platformSettings = null; - platformSettings = m_PlatformSettings.SingleOrDefault(x => x.name == buildTargetName && x.overridden == true); - platformSettings = platformSettings ?? m_PlatformSettings.SingleOrDefault(x => x.name == TexturePlatformSettingsHelper.defaultPlatformName); - - if (platformSettings == null) - { - platformSettings = new TextureImporterPlatformSettings(); - platformSettings.name = buildTargetName; - platformSettings.overridden = false; - } - return platformSettings; - } - - void RegisterAssets(AssetImportContext ctx, TextureGenerationOutput output) - { - List assetNameHash = new List(); - if (!string.IsNullOrEmpty(output.importInspectorWarnings)) - { - Debug.LogWarning(output.importInspectorWarnings); - } - if (output.importWarnings != null && output.importWarnings.Length != 0) - { - foreach (var warning in output.importWarnings) - Debug.LogWarning(warning); - } - if (output.thumbNail == null) - Debug.LogWarning("Thumbnail generation fail"); - if (output.texture == null) - { - throw new Exception("Texture import fail"); - } - - var assetName = GetUniqueName(System.IO.Path.GetFileNameWithoutExtension(ctx.assetPath), assetNameHash, true); - // Setup all fixed name on the hash table - if (string.IsNullOrEmpty(m_TextureAssetName)) - m_TextureAssetName = GetUniqueName(string.Format("{0} Texture",assetName), assetNameHash, true); - if (string.IsNullOrEmpty(m_PrefabAssetName)) - m_PrefabAssetName = GetUniqueName(string.Format("{0} Prefab", assetName), assetNameHash, true); - if (string.IsNullOrEmpty(m_SpriteLibAssetName)) - m_SpriteLibAssetName = GetUniqueName(string.Format("{0} Sprite Lib", assetName), assetNameHash, true); - if (string.IsNullOrEmpty(m_SkeletonAssetName)) - m_SkeletonAssetName = GetUniqueName(string.Format("{0} Skeleton", assetName), assetNameHash, true); - - output.texture.name = assetName; - ctx.AddObjectToAsset(m_TextureAssetName, output.texture, output.thumbNail); - UnityEngine.Object mainAsset = output.texture; - - - if (output.sprites != null) - { - var slAsset = ProduceSpriteLibAsset(output.sprites); - - if (shouldProduceGameObject) - { - GameObject prefab = null; - if (m_PaperDollMode) - prefab = OnProducePaperDollPrefab(m_TextureAssetName, output.sprites, slAsset); - else - prefab = OnProducePrefab(m_TextureAssetName, output.sprites, slAsset); - if (prefab != null) - { - ctx.AddObjectToAsset(m_PrefabAssetName, prefab); - mainAsset = prefab; - } - } - - foreach (var s in output.sprites) - { - var spriteAssetName = GetUniqueName(s.GetSpriteID().ToString(), assetNameHash, false, s); - ctx.AddObjectToAsset(spriteAssetName, s); - } - - if (slAsset != null) - { - slAsset.name = assetName; - ctx.AddObjectToAsset(m_SpriteLibAssetName, slAsset); - } - - if (characterMode && skeletonAsset == null) - { - var characterRig = ScriptableObject.CreateInstance(); - characterRig.name = assetName + " Skeleton"; - var bones = GetDataProvider().GetCharacterData().bones; - characterRig.SetSpriteBones(bones); - ctx.AddObjectToAsset(m_SkeletonAssetName, characterRig); - } - } - ctx.SetMainObject(mainAsset); - } - - bool SpriteIsMainFromSpriteLib(string spriteId, out string categoryName) - { - categoryName = ""; - if (m_SpriteCategoryList.categories != null) - { - foreach (var category in m_SpriteCategoryList.categories) - { - var index = category.labels.FindIndex(x => x.spriteId == spriteId); - if (index == 0) - { - categoryName = category.name; - return true; - } - if (index > 0) - return false; - } - } - return true; - } - - void BuildGroupGameObject(List psdGroup, int index, Transform root) - { - var spriteData = GetSpriteImportData().FirstOrDefault(x => x.spriteID == psdGroup[index].spriteID); - if (psdGroup[index].gameObject == null) - { - if (m_GenerateGOHierarchy || (!psdGroup[index].spriteID.Empty() && psdGroup[index].isGroup == false)) - { - // Determine if need to create GameObject i.e. if the sprite is not in a SpriteLib or if it is the first one - string categoryName; - var b = SpriteIsMainFromSpriteLib(psdGroup[index].spriteID.ToString(), out categoryName); - string goName = string.IsNullOrEmpty(categoryName) ? spriteData != null ? spriteData.name : psdGroup[index].name : categoryName; - if (b) - psdGroup[index].gameObject = m_GameObjectFactory.CreateGameObject(goName); - } - if (psdGroup[index].parentIndex >= 0 && m_GenerateGOHierarchy) - { - BuildGroupGameObject(psdGroup, psdGroup[index].parentIndex, root); - root = psdGroup[psdGroup[index].parentIndex].gameObject.transform; - } - - if (psdGroup[index].gameObject != null) - psdGroup[index].gameObject.transform.SetParent(root); - } - } - - bool shouldProduceGameObject - { - get { return m_CharacterMode && m_MosaicLayers && spriteImportMode == SpriteImportMode.Multiple; } - } - - bool shouldResliceFromLayer - { - get { return m_ResliceFromLayer && m_MosaicLayers && spriteImportMode == SpriteImportMode.Multiple; } - } - - bool characterMode - { - get { return mosaicMode && m_CharacterMode; } - } - - float definitionScale - { - get - { - float definitionScaleW = m_ImportedTextureWidth / (float)textureActualWidth; - float definitionScaleH = m_ImportedTextureHeight / (float)textureActualHeight; - return Mathf.Min(definitionScaleW, definitionScaleH); - } - } - - private Vector2 GetPivotPoint(Rect rect, SpriteAlignment alignment) - { - switch (alignment) - { - case SpriteAlignment.TopLeft: - return new Vector2(rect.xMin, rect.yMax); - - case SpriteAlignment.TopCenter: - return new Vector2(rect.center.x, rect.yMax); - - case SpriteAlignment.TopRight: - return new Vector2(rect.xMax, rect.yMax); - - case SpriteAlignment.LeftCenter: - return new Vector2(rect.xMin, rect.center.y); - - case SpriteAlignment.Center: - return new Vector2(rect.center.x, rect.center.y); - - case SpriteAlignment.RightCenter: - return new Vector2(rect.xMax, rect.center.y); - - case SpriteAlignment.BottomLeft: - return new Vector2(rect.xMin, rect.yMin); - - case SpriteAlignment.BottomCenter: - return new Vector2(rect.center.x, rect.yMin); - - case SpriteAlignment.BottomRight: - return new Vector2(rect.xMax, rect.yMin); - - case SpriteAlignment.Custom: - return new Vector2(m_DocumentPivot.x * rect.width, m_DocumentPivot.y * rect.height); - } - return Vector2.zero; - } - - void CreateBoneGO(int index, SpriteBone[] bones, BoneGO[] bonesGO, Transform defaultRoot) - { - if (bonesGO[index].go != null) - return; - var bone = bones[index]; - if (bone.parentId != -1 && bonesGO[bone.parentId].go == null) - CreateBoneGO(bone.parentId, bones, bonesGO, defaultRoot); - - var go = m_GameObjectFactory.CreateGameObject(bone.name); - if (bone.parentId == -1) - go.transform.SetParent(defaultRoot); - else - go.transform.SetParent(bonesGO[bone.parentId].go.transform); - go.transform.localPosition = bone.position * 1 / pixelsPerUnit; - go.transform.localRotation = bone.rotation; - bonesGO[index] = new BoneGO() - { - go = go, - index = index - }; - } - - BoneGO[] CreateBonesGO(Transform root) - { - if (characterMode) - { - var characterSkeleton = GetDataProvider().GetCharacterData(); - var bones = characterSkeleton.bones; - if (bones != null) - { - var boneGOs = new BoneGO[bones.Length]; - for (int i = 0; i < bones.Length; ++i) - { - CreateBoneGO(i, bones, boneGOs, root); - } - return boneGOs; - } - } - return new BoneGO[0]; - } - - void GetSpriteLiblabel(string spriteId, out string category, out string label) - { - category = ""; - label = ""; - var index = -1; - foreach (var cat in m_SpriteCategoryList.categories) - { - index = cat.labels.FindIndex(x => x.spriteId == spriteId); - if (index != -1) - { - category = cat.name; - label = cat.labels[index].name; - break; - } - } - } - - GameObject OnProducePaperDollPrefab(string assetname, Sprite[] sprites, SpriteLibraryAsset spriteLib) - { - GameObject root = null; - CharacterData? characterSkeleton = characterMode ? new CharacterData ? (GetDataProvider().GetCharacterData()) : null; - if (sprites != null && sprites.Length > 0) - { - root = new GameObject(); - root.name = assetname + "_GO"; - var spriteImportData = GetSpriteImportData(); - var psdLayers = GetPSDLayers(); - var boneGOs = CreateBonesGO(root.transform); - if (spriteLib != null) - root.AddComponent().spriteLibraryAsset = spriteLib; - var currentCharacterData = characterData; - for (int i = 0; i < sprites.Length; ++i) - { - string categoryName; - if (SpriteIsMainFromSpriteLib(sprites[i].GetSpriteID().ToString(), out categoryName)) - { - var spriteBones = currentCharacterData.parts.FirstOrDefault(x => new GUID(x.spriteId) == sprites[i].GetSpriteID()).bones; - var rootBone = root; - if (spriteBones != null && spriteBones.Any()) - { - var b = spriteBones.Where(x => x >= 0 && x < boneGOs.Length).Select(x => boneGOs[x]).OrderBy(x => x.index); - if (b.Any()) - rootBone = b.First().go; - } - - var srGameObject = m_GameObjectFactory.CreateGameObject(string.IsNullOrEmpty(categoryName) ? sprites[i].name : categoryName); - var sr = srGameObject.AddComponent(); - sr.sprite = sprites[i]; - sr.sortingOrder = psdLayers.Count - psdLayers.FindIndex(x => x.spriteID == sprites[i].GetSpriteID()); - srGameObject.transform.parent = rootBone.transform; - var spriteMetaData = spriteImportData.FirstOrDefault(x => x.spriteID == sprites[i].GetSpriteID()); - if (spriteMetaData != null) - { - var uvTransform = spriteMetaData.uvTransform; - var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x + (spriteMetaData.pivot.x * spriteMetaData.rect.width), - spriteMetaData.rect.y - uvTransform.y + (spriteMetaData.pivot.y * spriteMetaData.rect.height)) * definitionScale / sprites[i].pixelsPerUnit; - srGameObject.transform.position = new Vector3(outlineOffset.x, outlineOffset.y, 0); - } - var category = ""; - var labelName = ""; - GetSpriteLiblabel(sprites[i].GetSpriteID().ToString(), out category, out labelName); - if (!string.IsNullOrEmpty(category) && !string.IsNullOrEmpty(labelName)) - { - var sresolver = srGameObject.AddComponent(); - sresolver.SetCategoryAndLabel(category, labelName); - sresolver.ResolveSpriteToSpriteRenderer(); - } - } - } - } - return root; - } - - internal void SetPlatformTextureSettings(TextureImporterPlatformSettings platformSettings) - { - var index = m_PlatformSettings.FindIndex(x => x.name == platformSettings.name); - if(index < 0) - m_PlatformSettings.Add(platformSettings); - else - m_PlatformSettings[index] = platformSettings; - } - - internal TextureImporterPlatformSettings[] GetAllPlatformSettings() - { - return m_PlatformSettings.ToArray(); - } - - GameObject OnProducePrefab(string assetname, Sprite[] sprites, SpriteLibraryAsset spriteLib) - { - GameObject root = null; - CharacterData? characterSkeleton = characterMode ? new CharacterData ? (GetDataProvider().GetCharacterData()) : null; - if (sprites != null && sprites.Length > 0) - { - var currentCharacterData = characterData; - var spriteImportData = GetSpriteImportData(); - root = new GameObject(); - root.name = assetname + "_GO"; - if (spriteLib != null) - root.AddComponent().spriteLibraryAsset = spriteLib; - - var psdLayers = GetPSDLayers(); - for (int i = 0; i < psdLayers.Count; ++i) - { - BuildGroupGameObject(psdLayers, i, root.transform); - } - var boneGOs = CreateBonesGO(root.transform); - for (int i = 0; i < psdLayers.Count; ++i) - { - var l = psdLayers[i]; - GUID layerSpriteID = l.spriteID; - var sprite = sprites.FirstOrDefault(x => x.GetSpriteID() == layerSpriteID); - var spriteMetaData = spriteImportData.FirstOrDefault(x => x.spriteID == layerSpriteID); - if (sprite != null && spriteMetaData != null && l.gameObject != null) - { - var spriteRenderer = l.gameObject.AddComponent(); - spriteRenderer.sprite = sprite; - spriteRenderer.sortingOrder = psdLayers.Count - i; - var uvTransform = spriteMetaData.uvTransform; - var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x + (spriteMetaData.pivot.x * spriteMetaData.rect.width), - spriteMetaData.rect.y - uvTransform.y + (spriteMetaData.pivot.y * spriteMetaData.rect.height)) * definitionScale / sprite.pixelsPerUnit; - l.gameObject.transform.position = new Vector3(outlineOffset.x, outlineOffset.y, 0); - - if (characterSkeleton != null) - { - var part = characterSkeleton.Value.parts.FirstOrDefault(x => x.spriteId == spriteMetaData.spriteID.ToString()); - if (part.bones != null && part.bones.Length > 0) - { - var spriteSkin = l.gameObject.AddComponent(); - if (spriteRenderer.sprite != null && spriteRenderer.sprite.GetBindPoses().Length > 0) - { - var spriteBones = currentCharacterData.parts.FirstOrDefault(x => new GUID(x.spriteId) == spriteRenderer.sprite.GetSpriteID()).bones.Where(x => x >= 0 && x < boneGOs.Length).Select(x => boneGOs[x]); - if (spriteBones.Any()) - { - spriteSkin.rootBone = spriteBones.OrderBy(x => x.index).First().go.transform; - spriteSkin.boneTransforms = spriteBones.Select(x => x.go.transform).ToArray(); - if (spriteSkin.isValid) - spriteSkin.CalculateBounds(); - } - } - } - } - - var category = ""; - var labelName = ""; - GetSpriteLiblabel(layerSpriteID.ToString(), out category, out labelName); - if (!string.IsNullOrEmpty(category) && !string.IsNullOrEmpty(labelName)) - { - var sresolver = l.gameObject.AddComponent(); - sresolver.SetCategoryAndLabel(category, labelName); - sresolver.ResolveSpriteToSpriteRenderer(); - } - } - } - - var prefabBounds = new Rect(0 , 0, m_DocumentSize.x / pixelsPerUnit, m_DocumentSize.y / pixelsPerUnit); - var documentPivot = (Vector3)GetPivotPoint(prefabBounds, m_DocumentAlignment); - for (int i = 0; i < psdLayers.Count; ++i) - { - var l = psdLayers[i]; - if (l.gameObject == null || l.gameObject.GetComponent() == null) - continue; - var p = l.gameObject.transform.localPosition; - p -= documentPivot; - l.gameObject.transform.localPosition = p; - } - for (int i = 0; i < boneGOs.Length; ++i) - { - if (boneGOs[i].go.transform.parent != root.transform) - continue; - var p = boneGOs[i].go.transform.position; - p -= documentPivot; - boneGOs[i].go.transform.position = p; - } - } - - return root; - } - - Bounds? GetBoundingBox(GameObject root) - { - Bounds? prefabBounds1 = null; - var sr = root.GetComponent(); - if (sr != null) - { - prefabBounds1 = sr.bounds; - } - for (int i = 0; i < root.transform.childCount; ++i) - { - var b = GetBoundingBox(root.transform.GetChild(i).gameObject); - if (prefabBounds1 == null) - prefabBounds1 = b; - else - { - if (b.HasValue) - { - var bb = prefabBounds1.Value; - bb.Encapsulate(b.Value); - prefabBounds1 = bb; - } - } - } - return prefabBounds1; - } - - bool CleanUpGameobjectsWithOutRig(GameObject root) - { - var sr = root.GetComponent(); - var canDelete = true; - if (sr != null && sr.sprite != null) - { - try - { - var bones = GetDataProvider().GetBones(sr.sprite.GetSpriteID()); - canDelete = bones == null || bones.Count == 0; - } - catch (Exception e) - { - Debug.LogError(e); - } - } - - - List cleanup = new List(); - for (int i = 0; i < root.transform.childCount; ++i) - { - var go = root.transform.GetChild(i); - if (CleanUpGameobjectsWithOutRig(go.gameObject)) - cleanup.Add(go.gameObject); - } - - for (int i = 0; i < cleanup.Count; ++i) - GameObject.DestroyImmediate(cleanup[i]); - cleanup.Clear(); - - if (root.transform.childCount == 0 && canDelete) - return true; - - return false; - } - - static string SanitizeName(string name) - { - name = name.Replace('\0', ' '); - string newName = null; - // We can't create asset name with these name. - if ((name.Length == 2 && name[0] == '.' && name[1] == '.') - || (name.Length == 1 && name[0] == '.') - || (name.Length == 1 && name[0] == '/')) - newName += name + "_"; - - if (!string.IsNullOrEmpty(newName)) - { - Debug.LogWarning(string.Format("File contains layer with invalid name for generating asset. {0} is renamed to {1}", name, newName)); - return newName; - } - return name; - } - - static int GetStringHash(string str) - { - MD5 md5Hasher = MD5.Create(); - var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); - return BitConverter.ToInt32(hashed, 0); - } - - static string GetUniqueName(string name, List stringHash, bool logNewNameGenerated = false, UnityEngine.Object context = null) - { - var sanitizedName = string.Copy(SanitizeName(name)); - string uniqueName = sanitizedName; - int index = 1; - while (true) - { - var hash = GetStringHash(uniqueName); - if (!stringHash.Contains(hash)) - { - stringHash.Add(hash); - if (logNewNameGenerated && sanitizedName != uniqueName) - Debug.Log(string.Format("Asset name {0} is changed to {1} to ensure uniqueness", name, uniqueName), context); - return uniqueName; - } - uniqueName = string.Format("{0}_{1}", sanitizedName, index); - ++index; - } - } - - // ISpriteEditorDataProvider interface - internal SpriteImportMode spriteImportMode - { - get - { - return m_TextureImporterSettings.textureType != TextureImporterType.Sprite ? - SpriteImportMode.None : - (SpriteImportMode)m_TextureImporterSettings.spriteMode; - } - } - - SpriteImportMode ISpriteEditorDataProvider.spriteImportMode => spriteImportMode; - - internal int spriteDataCount - { - get - { - var spriteImportData = GetSpriteImportData(); - if (mosaicMode) - return spriteImportData.Count; - if (spriteImportMode != SpriteImportMode.Multiple) - return 1; - return spriteImportData.Count - 1; - } - } - - internal UnityEngine.Object targetObject - { - get { return this; } - } - UnityEngine.Object ISpriteEditorDataProvider.targetObject => targetObject; - - internal float pixelsPerUnit - { - get { return m_TextureImporterSettings.spritePixelsPerUnit; } - } - - float ISpriteEditorDataProvider.pixelsPerUnit =>pixelsPerUnit; - - internal T GetDataProvider() where T : class - { - if (typeof(T) == typeof(ISpriteBoneDataProvider)) - { - return new SpriteBoneDataProvider { dataProvider = this } as T; - } - if (typeof(T) == typeof(ISpriteMeshDataProvider)) - { - return new SpriteMeshDataProvider { dataProvider = this } as T; - } - if (typeof(T) == typeof(ISpriteOutlineDataProvider)) - { - return new SpriteOutlineDataProvider { dataProvider = this } as T; - } - if (typeof(T) == typeof(ISpritePhysicsOutlineDataProvider)) - { - return new SpritePhysicsOutlineProvider { dataProvider = this } as T; - } - if (typeof(T) == typeof(ITextureDataProvider)) - { - return new TextureDataProvider { dataProvider = this } as T; - } - if (typeof(T) == typeof(ICharacterDataProvider)) - { - return characterMode ? new CharacterDataProvider { dataProvider = this } as T : null; - } - if (typeof(T) == typeof(IMainSkeletonDataProvider)) - { - return characterMode && skeletonAsset != null ? new MainSkeletonDataProvider() { dataProvider = this } as T : null; - } - if (typeof(T) == typeof(ISecondaryTextureDataProvider)) - { - return new SecondaryTextureDataProvider() { dataProvider = this } as T; - } - else - return this as T; - } - - T ISpriteEditorDataProvider.GetDataProvider() - { - return GetDataProvider(); - } - - internal bool HasDataProvider(Type type) - { - if (characterMode) - { - if (type == typeof(ICharacterDataProvider)) - return true; - if (type == typeof(IMainSkeletonDataProvider) && skeletonAsset != null) - return true; - } - if (type == typeof(ISpriteBoneDataProvider) || - type == typeof(ISpriteMeshDataProvider) || - type == typeof(ISpriteOutlineDataProvider) || - type == typeof(ISpritePhysicsOutlineDataProvider) || - type == typeof(ITextureDataProvider) || - type == typeof(ISecondaryTextureDataProvider)) - { - return true; - } - else - return type.IsAssignableFrom(GetType()); - } - - bool ISpriteEditorDataProvider.HasDataProvider(Type type) - { - return HasDataProvider(type); - } - - internal void AddSpriteData(SpriteRect spriteRect) - { - if (spriteImportMode != SpriteImportMode.Multiple) - Debug.LogWarning("Can only add sprite data when import mode is multiple"); - else - { - GetSpriteImportData().Add(new SpriteMetaData(spriteRect)); - } - } - - internal void DeleteSpriteData(SpriteRect spriteRect) - { - if (spriteImportMode != SpriteImportMode.Multiple) - Debug.LogWarning("Can only add sprite data when import mode is multiple"); - else - { - var spriteImportData = GetSpriteImportData(); - int index = spriteImportData.FindIndex(x => x.spriteID == spriteRect.spriteID); - Assert.AreEqual(0, index, "Cannot delete Sprite from single sprite mode"); - spriteImportData.RemoveAt(index); - } - } - - internal int GetSpriteDataIndex(GUID guid) - { - switch (spriteImportMode) - { - case SpriteImportMode.Single: - case SpriteImportMode.Polygon: - return 0; - case SpriteImportMode.Multiple: - { - var spriteImportData = GetSpriteImportData(); - return spriteImportData.FindIndex(x => x.spriteID == guid); - } - default: - throw new InvalidOperationException("GUID not found"); - } - } - - internal void Apply() - { - // Do this so that asset change save dialog will not show - var originalValue = EditorPrefs.GetBool("VerifySavingAssets", false); - EditorPrefs.SetBool("VerifySavingAssets", false); - AssetDatabase.ForceReserializeAssets(new string[] { assetPath }, ForceReserializeAssetsOptions.ReserializeMetadata); - EditorPrefs.SetBool("VerifySavingAssets", originalValue); - } - - void ISpriteEditorDataProvider.Apply() - { - Apply(); - } - - internal void InitSpriteEditorDataProvider() {} - void ISpriteEditorDataProvider.InitSpriteEditorDataProvider() - { - InitSpriteEditorDataProvider(); - } - - internal SpriteRect[] GetSpriteRects() - { - var spriteImportData = GetSpriteImportData(); - var skip = mosaicMode ? 0 : 1; - return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).Select(x => new SpriteMetaData(x) as SpriteRect).ToArray() : new[] {new SpriteMetaData(spriteImportData[0]) }; - } - - SpriteRect[] ISpriteEditorDataProvider.GetSpriteRects() - { - return GetSpriteRects(); - } - - List GetSpriteImportData() - { - if (mosaicMode) - { - if (characterMode) - { - if (skeletonAsset != null) - { - return m_SharedRigSpriteImportData; - } - return m_RigSpriteImportData; - } - return m_MosaicSpriteImportData; - } - return m_SpriteImportData; - } - - private SkeletonAsset skeletonAsset => - AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID)); - - internal List GetPSDLayers() - { - if (mosaicMode) - { - if (characterMode) - { - if (skeletonAsset != null) - return m_SharedRigPSDLayers; - else - return m_RigPSDLayers; - } - return m_MosaicPSDLayers; - } - return null; - } - - internal SpriteMetaData[] GetSpriteMetaData() - { - var spriteImportData = GetSpriteImportData(); - var skip = mosaicMode ? 0 : 1; - return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).ToArray() : new[] { new SpriteMetaData(spriteImportData[0]) }; - } - - internal SpriteRect GetSpriteDataFromAllMode(GUID guid) - { - var spriteMetaData = m_RigSpriteImportData.FirstOrDefault(x => x.spriteID == guid); - if(spriteMetaData == null) - spriteMetaData = m_SharedRigSpriteImportData.FirstOrDefault(x => x.spriteID == guid); - if(spriteMetaData == null) - spriteMetaData = m_MosaicSpriteImportData.FirstOrDefault(x => x.spriteID == guid); - if(spriteMetaData == null) - spriteMetaData = m_SpriteImportData.FirstOrDefault(x => x.spriteID == guid); - return spriteMetaData; - } - - internal SpriteRect GetSpriteData(GUID guid) - { - var spriteImportData = GetSpriteImportData(); - var skip = mosaicMode ? 0 : 1; - return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).FirstOrDefault(x => x.spriteID == guid) : spriteImportData[0]; - } - - internal void SetSpriteRects(SpriteRect[] spriteRects) - { - var spriteImportData = GetSpriteImportData(); - if (spriteImportMode == SpriteImportMode.Multiple) - { - var singleSpriteID = mosaicMode ? new GUID() : spriteImportData[0].spriteID; - spriteImportData.RemoveAll(data => data.spriteID != singleSpriteID && spriteRects.FirstOrDefault(x => x.spriteID == data.spriteID) == null); - foreach (var sr in spriteRects) - { - var importData = spriteImportData.FirstOrDefault(x => x.spriteID == sr.spriteID); - if (importData == null) - spriteImportData.Add(new SpriteMetaData(sr)); - else - { - importData.name = sr.name; - importData.alignment = sr.alignment; - importData.border = sr.border; - importData.pivot = sr.pivot; - importData.rect = sr.rect; - } - } - } - else if (spriteRects.Length == 1 && (spriteImportMode == SpriteImportMode.Single || spriteImportMode == SpriteImportMode.Polygon)) - { - if (spriteImportData[0].spriteID == spriteRects[0].spriteID) - { - spriteImportData[0].name = spriteRects[0].name; - spriteImportData[0].alignment = spriteRects[0].alignment; - m_TextureImporterSettings.spriteAlignment = (int)spriteRects[0].alignment; - m_TextureImporterSettings.spriteBorder = spriteImportData[0].border = spriteRects[0].border; - m_TextureImporterSettings.spritePivot = spriteImportData[0].pivot = spriteRects[0].pivot; - spriteImportData[0].rect = spriteRects[0].rect; - } - else - { - spriteImportData[0] = new SpriteMetaData(spriteRects[0]); - } - } - } - - void ISpriteEditorDataProvider.SetSpriteRects(SpriteRect[] spriteRects) - { - SetSpriteRects(spriteRects); - } - - bool mosaicMode - { - get { return spriteImportMode == SpriteImportMode.Multiple && m_MosaicLayers; } - } - - internal CharacterData characterData - { - get - { - if (skeletonAsset != null) - return m_SharedRigCharacterData; - return m_CharacterData; - } - set - { - if (skeletonAsset != null) - m_SharedRigCharacterData = value; - else - m_CharacterData = value; - } - } - - internal Vector2Int documentSize - { - get { return m_DocumentSize; } - } - - SpriteLibraryAsset ProduceSpriteLibAsset(Sprite[] sprites) - { - if (!characterMode || m_SpriteCategoryList.categories == null) - return null; - var sla = ScriptableObject.CreateInstance(); - sla.name = "Sprite Lib"; - sla.categories = m_SpriteCategoryList.categories.Select(x => - new SpriteLibCategory() - { - name = x.name, - categoryList = x.labels.Select(y => - { - var sprite = sprites.FirstOrDefault(z => z.GetSpriteID().ToString() == y.spriteId); - return new SpriteCategoryEntry() - { - name = y.name, - sprite = sprite - }; - }).ToList() - }).ToList(); - sla.categories.RemoveAll(x => x.categoryList.Count == 0); - if (sla.categories.Count > 0) - { - sla.UpdateHashes(); - return sla; - } - return null; - } - - internal SecondarySpriteTexture[] secondaryTextures - { - get { return m_SecondarySpriteTextures; } - set { m_SecondarySpriteTextures = value; } - } - - internal void ReadTextureSettings(TextureImporterSettings dest) - { - m_TextureImporterSettings.CopyTo(dest); - } - - internal SpriteBone[] mainSkeletonBones - { - get - { - var skeleton = skeletonAsset; - return skeleton != null ? skeleton.GetSpriteBones() : null; - } - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using PDNWrapper; +using UnityEngine; +using Unity.Collections; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using UnityEditor.AssetImporters; +using UnityEditor.U2D.Animation; +using UnityEditor.U2D.Common; +using UnityEditor.U2D.Sprites; +using UnityEngine.Assertions; +using UnityEngine.U2D; +using UnityEngine.U2D.Animation; +using UnityEngine.Scripting.APIUpdating; + +namespace UnityEditor.U2D.PSD +{ + /// + /// ScriptedImporter to import Photoshop files + /// + [ScriptedImporter(5, "psb")] + [HelpURL("https://docs.unity3d.com/Packages/com.unity.2d.psdimporter@latest")] + [MovedFrom("UnityEditor.Experimental.AssetImporters")] + public class PSDImporter : ScriptedImporter, ISpriteEditorDataProvider + { + internal enum ELayerMappingOption + { + UseLayerName, + UseLayerNameCaseSensitive, + UseLayerId + } + + IPSDLayerMappingStrategy[] m_MappingCompare = + { + new LayerMappingUseLayerName(), + new LayerMappingUseLayerNameCaseSensitive(), + new LayerMappingUserLayerID(), + }; + + internal class FlattenLayerData + { + public int layerId; + public string name; + } + + class UniqueNameGenerator + { + List m_NameHash = new List(); + + public bool ContainHash(int i) + { + return m_NameHash.Contains(i); + } + + public void AddHash(int i) + { + m_NameHash.Add(i); + } + + public string GetUniqueName(string name) + { + return PSDImporter.GetUniqueName(name, m_NameHash); + } + } + + class GameObjectCreationFactory : UniqueNameGenerator + { + + public GameObject CreateGameObject(string name, params System.Type[] components) + { + var newName = GetUniqueName(name); + return new GameObject(newName, components); + } + } + + struct BoneGO + { + public GameObject go; + public int index; + } + + [SerializeField] + TextureImporterSettings m_TextureImporterSettings = new TextureImporterSettings() { + mipmapEnabled = true, + mipmapFilter = TextureImporterMipFilter.BoxFilter, + sRGBTexture = true, + borderMipmap = false, + mipMapsPreserveCoverage = false, + alphaTestReferenceValue = 0.5f, + readable = false, + +#if ENABLE_TEXTURE_STREAMING + streamingMipmaps = true, +#endif + + fadeOut = false, + mipmapFadeDistanceStart = 1, + mipmapFadeDistanceEnd = 3, + + convertToNormalMap = false, + heightmapScale = 0.25F, + normalMapFilter = 0, + + generateCubemap = TextureImporterGenerateCubemap.AutoCubemap, + cubemapConvolution = 0, + + seamlessCubemap = false, + + npotScale = TextureImporterNPOTScale.ToNearest, + + spriteMode = (int)SpriteImportMode.Multiple, + spriteExtrude = 1, + spriteMeshType = SpriteMeshType.Tight, + spriteAlignment = (int)SpriteAlignment.Center, + spritePivot = new Vector2(0.5f, 0.5f), + spritePixelsPerUnit = 100.0f, + spriteBorder = new Vector4(0.0f, 0.0f, 0.0f, 0.0f), + + alphaSource = TextureImporterAlphaSource.FromInput, + alphaIsTransparency = true, + spriteTessellationDetail = -1.0f, + + textureType = TextureImporterType.Sprite, + textureShape = TextureImporterShape.Texture2D, + + filterMode = FilterMode.Bilinear, + aniso = 1, + mipmapBias = 0.0f, + wrapModeU = TextureWrapMode.Repeat, + wrapModeV = TextureWrapMode.Repeat, + wrapModeW = TextureWrapMode.Repeat, + }; + + [SerializeField] + // SpriteData for both single and multiple mode + List m_SpriteImportData = new List(); // we use index 0 for single sprite and the rest for multiple sprites + [SerializeField] + // SpriteData for Mosaic mode + List m_MosaicSpriteImportData = new List(); + [SerializeField] + // SpriteData for Rig mode + List m_RigSpriteImportData = new List(); + [SerializeField] + // CharacterData for Rig mode + CharacterData m_CharacterData = new CharacterData(); + [SerializeField] + // SpriteData for shared rig mode + List m_SharedRigSpriteImportData = new List(); + [SerializeField] + // CharacterData for shared rig mode + CharacterData m_SharedRigCharacterData = new CharacterData(); + + [SerializeField] + List m_PlatformSettings = new List(); + [SerializeField] + bool m_MosaicLayers = true; + [SerializeField] + bool m_CharacterMode = true; + [SerializeField] + Vector2 m_DocumentPivot = Vector2.zero; + [SerializeField] + SpriteAlignment m_DocumentAlignment = SpriteAlignment.BottomCenter; + [SerializeField] + bool m_ImportHiddenLayers = false; + [SerializeField] + int m_ImportedTextureWidth; + [SerializeField] + int m_ImportedTextureHeight; + [SerializeField] + Vector2Int m_DocumentSize; + [SerializeField] + ELayerMappingOption m_LayerMappingOption = ELayerMappingOption.UseLayerId; + [SerializeField] + bool m_GeneratePhysicsShape = false; + + [SerializeField] + bool m_PaperDollMode = false; + + [SerializeField] + bool m_KeepDupilcateSpriteName = true; + + [SerializeField] + private string m_SkeletonAssetReferenceID = null; + + [SerializeField] + SpriteCategoryList m_SpriteCategoryList = new SpriteCategoryList() {categories = new List()}; + GameObjectCreationFactory m_GameObjectFactory = new GameObjectCreationFactory(); + + internal SpriteCategoryList spriteCategoryList { get { return m_SpriteCategoryList; } set { m_SpriteCategoryList = value; } } + + [SerializeField] + int m_TextureActualWidth; + internal int textureActualWidth + { + get { return m_TextureActualWidth; } + private set { m_TextureActualWidth = value; } + } + + [SerializeField] + int m_TextureActualHeight; + internal int textureActualHeight + { + get { return m_TextureActualHeight; } + private set { m_TextureActualHeight = value; } + } + + [SerializeField] + string m_SpritePackingTag = ""; + + [SerializeField] + bool m_ResliceFromLayer = false; + + [SerializeField] + List m_MosaicPSDLayers = new List(); + [SerializeField] + List m_RigPSDLayers = new List(); + [SerializeField] + List m_SharedRigPSDLayers = new List(); + + [SerializeField] + bool m_GenerateGOHierarchy = false; + + [SerializeField] + string m_TextureAssetName = null; + + [SerializeField] + string m_PrefabAssetName = null; + + [SerializeField] + string m_SpriteLibAssetName = null; + + [SerializeField] + string m_SkeletonAssetName = null; + + [SerializeField] + SecondarySpriteTexture[] m_SecondarySpriteTextures; + + /// + /// Implementation of ScriptedImporter.OnImportAsset + /// + /// + /// This argument contains all the contextual information needed to process the import + /// event and is also used by the custom importer to store the resulting Unity Asset. + /// + public override void OnImportAsset(AssetImportContext ctx) + { + FileStream fileStream = new FileStream(ctx.assetPath, FileMode.Open, FileAccess.Read); + Document doc = null; + try + { + UnityEngine.Profiling.Profiler.BeginSample("OnImportAsset"); + + UnityEngine.Profiling.Profiler.BeginSample("PsdLoad"); + doc = PaintDotNet.Data.PhotoshopFileType.PsdLoad.Load(fileStream); + UnityEngine.Profiling.Profiler.EndSample(); + + ValidatePSDLayerId(doc); + + m_DocumentSize = new Vector2Int(doc.width, doc.height); + bool singleSpriteMode = m_TextureImporterSettings.textureType == TextureImporterType.Sprite && m_TextureImporterSettings.spriteMode != (int)SpriteImportMode.Multiple; + EnsureSingleSpriteExist(); + + if (m_TextureImporterSettings.textureType != TextureImporterType.Sprite || + m_MosaicLayers == false || singleSpriteMode) + { + var image = new NativeArray(doc.width * doc.height, Allocator.Persistent); + try + { + var spriteImportData = GetSpriteImportData(); + FlattenImageTask.Execute(doc.Layers, m_ImportHiddenLayers, doc.width, doc.height, image); + + int spriteCount = spriteDataCount; + int spriteIndexStart = 1; + + if (spriteImportData.Count <= 0 || spriteImportData[0] == null) + { + spriteImportData.Add(new SpriteMetaData()); + } + spriteImportData[0].name = System.IO.Path.GetFileNameWithoutExtension(ctx.assetPath) + "_1"; + spriteImportData[0].alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; + spriteImportData[0].border = m_TextureImporterSettings.spriteBorder; + spriteImportData[0].pivot = m_TextureImporterSettings.spritePivot; + spriteImportData[0].rect = new Rect(0, 0, doc.width, doc.height); + if (singleSpriteMode) + { + spriteCount = 1; + spriteIndexStart = 0; + } + m_ImportedTextureWidth = textureActualWidth = doc.width; + m_ImportedTextureHeight = textureActualHeight = doc.height; + var output = ImportTexture(ctx, image, doc.width, doc.height, spriteIndexStart, spriteCount); + m_ImportedTextureWidth = output.texture.width; + m_ImportedTextureHeight = output.texture.height; + RegisterAssets(ctx, output); + } + finally + { + image.Dispose(); + } + } + else + { + ImportFromLayers(ctx, doc); + } + + if (!string.IsNullOrEmpty(m_SkeletonAssetReferenceID)) + { + var primaryAssetPath = AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID); + if(!string.IsNullOrEmpty(primaryAssetPath) && primaryAssetPath != assetPath) + { + ctx.DependsOnArtifact(primaryAssetPath); + } + } + } + finally + { + fileStream.Close(); + if (doc != null) + doc.Dispose(); + UnityEngine.Profiling.Profiler.EndSample(); + EditorUtility.SetDirty(this); + } + + } + + static void ValidatePSDLayerId(IEnumerable oldPsdLayer, List layers, UniqueNameGenerator uniqueNameGenerator) + { + // first check if all layers are unique. If not, we use back the previous layer id based on name match + HashSet uniqueIdSet = new HashSet(); + bool useOldID = false; + foreach(var layer in layers) + { + if (uniqueIdSet.Contains(layer.LayerID)) + { + useOldID = true; + break; + } + uniqueIdSet.Add(layer.LayerID); + } + + for (int i = 0; i < layers.Count; ++i) + { + // fix case 1291323 + if (useOldID) + { + var oldLayers = oldPsdLayer.Where(x => x.name == layers[i].Name); + // pick one that is not already on the list + foreach (var ol in oldLayers) + { + if (!uniqueNameGenerator.ContainHash(ol.layerID)) + { + layers[i].LayerID = ol.layerID; + break; + } + } + } + + if (uniqueNameGenerator.ContainHash(layers[i].LayerID)) + { + var importWarning = string.Format("Layer {0}: LayerId is not unique. Mapping will be done by Layer's name.", layers[i].Name); + var layerName = uniqueNameGenerator.GetUniqueName(layers[i].Name); + if (layerName != layers[i].Name) + importWarning += "\nLayer names are not unique. Please ensure they are unique to for SpriteRect to be mapped back correctly."; + layers[i].LayerID = layerName.GetHashCode(); + Debug.LogWarning(importWarning); + } + else + uniqueNameGenerator.AddHash(layers[i].LayerID); + if (layers[i].ChildLayer != null) + { + ValidatePSDLayerId(oldPsdLayer, layers[i].ChildLayer, uniqueNameGenerator); + } + } + } + + + void ValidatePSDLayerId(Document doc) + { + if (m_LayerMappingOption == ELayerMappingOption.UseLayerId) + { + UniqueNameGenerator uniqueNameGenerator = new UniqueNameGenerator(); + ValidatePSDLayerId(GetPSDLayers(), doc.Layers, uniqueNameGenerator); + } + } + + TextureGenerationOutput ImportTexture(AssetImportContext ctx, NativeArray imageData, int textureWidth, int textureHeight, int spriteStart, int spriteCount) + { + if (!imageData.IsCreated || imageData.Length == 0) + return new TextureGenerationOutput(); + + UnityEngine.Profiling.Profiler.BeginSample("ImportTexture"); + var platformSettings = GetPlatformTextureSettings(ctx.selectedBuildTarget); + + var textureSettings = m_TextureImporterSettings.ExtractTextureSettings(); + textureSettings.assetPath = ctx.assetPath; + textureSettings.enablePostProcessor = true; + textureSettings.containsAlpha = true; + textureSettings.hdr = false; + + var textureAlphaSettings = m_TextureImporterSettings.ExtractTextureAlphaSettings(); + var textureMipmapSettings = m_TextureImporterSettings.ExtractTextureMipmapSettings(); + var textureCubemapSettings = m_TextureImporterSettings.ExtractTextureCubemapSettings(); + var textureWrapSettings = m_TextureImporterSettings.ExtractTextureWrapSettings(); + + TextureGenerationOutput output; + switch (m_TextureImporterSettings.textureType) + { + case TextureImporterType.Default: + output = TextureGeneratorHelper.GenerateTextureDefault(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); + break; + case TextureImporterType.NormalMap: + var textureNormalSettings = m_TextureImporterSettings.ExtractTextureNormalSettings(); + output = TextureGeneratorHelper.GenerateNormalMap(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureNormalSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); + break; + case TextureImporterType.GUI: + output = TextureGeneratorHelper.GenerateTextureGUI(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); + break; + case TextureImporterType.Sprite: + var textureSpriteSettings = m_TextureImporterSettings.ExtractTextureSpriteSettings(); + textureSpriteSettings.packingTag = m_SpritePackingTag; + textureSpriteSettings.qualifyForPacking = !string.IsNullOrEmpty(m_SpritePackingTag); + textureSpriteSettings.spriteSheetData = new UnityEditor.AssetImporters.SpriteImportData[spriteCount]; + textureSettings.npotScale = TextureImporterNPOTScale.None; + textureSettings.secondaryTextures = secondaryTextures; + var spriteImportData = GetSpriteImportData(); + for (int i = 0; i < spriteCount; ++i) + { + //AutoGenerateSpriteSkinData(m_SpriteImportData[spriteStart + i]); + textureSpriteSettings.spriteSheetData[i] = spriteImportData[spriteStart + i]; + } + output = TextureGeneratorHelper.GenerateTextureSprite(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureSpriteSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); + break; + case TextureImporterType.Cursor: + output = TextureGeneratorHelper.GenerateTextureCursor(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureWrapSettings); + break; + case TextureImporterType.Cookie: + output = TextureGeneratorHelper.GenerateCookie(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); + break; + case TextureImporterType.Lightmap: + output = TextureGeneratorHelper.GenerateLightmap(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureMipmapSettings, textureWrapSettings); + break; + case TextureImporterType.SingleChannel: + output = TextureGeneratorHelper.GenerateTextureSingleChannel(imageData, textureWidth, textureHeight, textureSettings, platformSettings, textureAlphaSettings, textureMipmapSettings, textureCubemapSettings, textureWrapSettings); + break; + default: + Debug.LogAssertion("Unknown texture type for import"); + output = default(TextureGenerationOutput); + break; + } + UnityEngine.Profiling.Profiler.EndSample(); + return output; + } + + void AutoGenerateSpriteSkinData(SpriteMetaData metaData) + { + //If bone data exist but skinning data doesn't exist, auto generate them + if (metaData.spriteBone != null && metaData.spriteBone.Count > 0 && + (metaData.vertices == null || metaData.vertices.Count == 0)) + { + var spriteMeshDataController = new SpriteMeshDataController(); + var smd = new SpriteMeshData(); + smd.spriteID = metaData.spriteID; + smd.frame = metaData.rect; + smd.pivot = metaData.pivot; + smd.bones = ModuleUtility.CreateSpriteBoneData(metaData.spriteBone.ToArray(), Matrix4x4.TRS(metaData.rect.position, Quaternion.identity, Vector3.one)); + spriteMeshDataController.spriteMeshData = smd; + spriteMeshDataController.OutlineFromAlpha(new OutlineGenerator(), GetDataProvider(), 0.05f, 200); + spriteMeshDataController.Triangulate(new Triangulator()); + spriteMeshDataController.Subdivide(new Triangulator(), 0.25f); + spriteMeshDataController.CalculateWeights(new BoundedBiharmonicWeightsGenerator(), null, 0.01f); + spriteMeshDataController.SortTrianglesByDepth(); + + List vmd = new List(smd.vertices.Count); + foreach (var v in smd.vertices) + vmd.Add(new Vertex2DMetaData() { position = v.position - smd.frame.position, boneWeight = v.editableBoneWeight.ToBoneWeight(true) }); + List emd = new List(smd.edges.Count); + foreach (var e in smd.edges) + emd.Add(new Vector2Int(e.index1, e.index2)); + + metaData.vertices = vmd; + metaData.indices = smd.indices.ToArray(); + metaData.edges = emd.ToArray(); + } + } + + string GetUniqueSpriteName(string name, List namehash) + { + if (m_KeepDupilcateSpriteName) + return name; + return GetUniqueName(name, namehash); + } + + void ImportFromLayers(AssetImportContext ctx, Document doc) + { + NativeArray output = default(NativeArray); + + List layerIndex = new List(); + List spriteNameHash = new List(); + var oldPsdLayers = GetPSDLayers(); + try + { + var psdLayers = new List(); + var mappingStrategy = GetLayerMappingStrategy(); + var flattenLayerData = oldPsdLayers.Where(x => x.flatten).Select(y => new FlattenLayerData() + { + layerId = y.layerID, + name = y.name + }).ToArray(); + ExtractLayerTask.Execute(psdLayers, doc.Layers, m_ImportHiddenLayers, flattenLayerData, mappingStrategy); + var layerUnique = mappingStrategy.LayersUnique(psdLayers); + if (!string.IsNullOrEmpty(layerUnique)) + { + Debug.LogWarning(layerUnique,this); + } + var removedLayersSprite = oldPsdLayers.Where(x => psdLayers.FirstOrDefault(y => mappingStrategy.Compare(y, x)) == null).Select(z => z.spriteID).ToArray(); + bool hasNewLayer = false; + for (int i = 0; i < psdLayers.Count; ++i) + { + int j = 0; + var psdLayer = psdLayers[i]; + for (; j < oldPsdLayers.Count; ++j) + { + if (mappingStrategy.Compare(psdLayer, oldPsdLayers[j])) + { + if(oldPsdLayers[j].spriteID.Empty()) + oldPsdLayers[j].spriteID = GUID.Generate(); + psdLayer.spriteID = oldPsdLayers[j].spriteID; + psdLayer.spriteName = oldPsdLayers[j].spriteName; + psdLayer.mosaicPosition = oldPsdLayers[j].mosaicPosition; + psdLayer.flatten = oldPsdLayers[j].flatten; + if (psdLayer.isImported != oldPsdLayers[j].isImported) + hasNewLayer = true; + break; + } + } + + if(j >= oldPsdLayers.Count) + hasNewLayer = true; + } + + int expectedBufferLength = doc.width * doc.height; + var layerBuffers = new List>(); + for (int i = 0; i < psdLayers.Count; ++i) + { + var l = psdLayers[i]; + if (l.texture.IsCreated && l.texture.Length == expectedBufferLength && l.isImported) + { + layerBuffers.Add(l.texture); + layerIndex.Add(i); + } + } + + RectInt[] spritedata; + int width, height; + int padding = 4; + Vector2Int[] uvTransform; + ImagePacker.Pack(layerBuffers.ToArray(), doc.width, doc.height, padding, out output, out width, out height, out spritedata, out uvTransform); + var spriteImportData = GetSpriteImportData(); + if (spriteImportData.Count <= 0 || shouldResliceFromLayer || hasNewLayer) + { + var newSpriteMeta = new List(); + + for (int i = 0; i < spritedata.Length && i < layerIndex.Count; ++i) + { + var spriteSheet = spriteImportData.FirstOrDefault(x => x.spriteID == psdLayers[layerIndex[i]].spriteID); + if (spriteSheet == null) + { + spriteSheet = new SpriteMetaData(); + spriteSheet.border = Vector4.zero; + spriteSheet.alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; + spriteSheet.pivot = m_TextureImporterSettings.spritePivot; + } + + psdLayers[layerIndex[i]].spriteName = GetUniqueSpriteName(psdLayers[layerIndex[i]].name, spriteNameHash); + spriteSheet.name = psdLayers[layerIndex[i]].spriteName; + spriteSheet.rect = new Rect(spritedata[i].x, spritedata[i].y, spritedata[i].width, spritedata[i].height); + spriteSheet.uvTransform = uvTransform[i]; + + psdLayers[layerIndex[i]].spriteID = spriteSheet.spriteID; + psdLayers[layerIndex[i]].mosaicPosition = spritedata[i].position; + newSpriteMeta.Add(spriteSheet); + } + spriteImportData.Clear(); + spriteImportData.AddRange(newSpriteMeta); + } + else + { + spriteImportData.RemoveAll(x => removedLayersSprite.Contains(x.spriteID)); + + // First look for any user created SpriteRect and add those into the name hash + foreach (var spriteData in spriteImportData) + { + var psdLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteData.spriteID); + if (psdLayer == null) + spriteNameHash.Add(GetStringHash(spriteData.name)); + } + + foreach (var spriteData in spriteImportData) + { + var psdLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteData.spriteID); + if (psdLayer == null) + spriteData.uvTransform = new Vector2Int((int)spriteData.rect.position.x, (int)spriteData.rect.position.y); + // If it is user created rect or the name has been changed before + // add it into the spriteNameHash and we don't copy it over from the layer + if (psdLayer == null || psdLayer.spriteName != spriteData.name) + spriteNameHash.Add(GetStringHash(spriteData.name)); + + // If the sprite name has not been changed, we ensure the new + // layer name is still unique and use it as the sprite name + if (psdLayer != null && psdLayer.spriteName == spriteData.name) + { + psdLayer.spriteName = GetUniqueSpriteName(psdLayer.name, spriteNameHash); + spriteData.name = psdLayer.spriteName; + } + } + + //Update names for those user has not changed and add new sprite rect based on PSD file. + for (int k = 0; k < layerIndex.Count; ++k) + { + int i = layerIndex[k]; + var spriteSheet = spriteImportData.FirstOrDefault(x => x.spriteID == psdLayers[i].spriteID); + var inOldLayer = oldPsdLayers.FindIndex(x => mappingStrategy.Compare(x,psdLayers[i])) != -1; + if (spriteSheet == null && !inOldLayer) + { + spriteSheet = new SpriteMetaData(); + spriteImportData.Add(spriteSheet); + spriteSheet.rect = new Rect(spritedata[k].x, spritedata[k].y, spritedata[k].width, spritedata[k].height); + spriteSheet.border = Vector4.zero; + spriteSheet.alignment = (SpriteAlignment)m_TextureImporterSettings.spriteAlignment; + spriteSheet.pivot = m_TextureImporterSettings.spritePivot; + psdLayers[i].spriteName = GetUniqueSpriteName(psdLayers[i].name, spriteNameHash); + spriteSheet.name = psdLayers[i].spriteName; + } + else if (spriteSheet != null) + { + var r = spriteSheet.rect; + r.position = spriteSheet.rect.position - psdLayers[i].mosaicPosition + spritedata[k].position; + spriteSheet.rect = r; + } + + if (spriteSheet != null) + { + spriteSheet.uvTransform = uvTransform[k]; + psdLayers[i].spriteID = spriteSheet.spriteID; + psdLayers[i].mosaicPosition = spritedata[k].position; + } + } + } + + foreach (var l in oldPsdLayers) + l.Dispose(); + oldPsdLayers.Clear(); + + oldPsdLayers.AddRange(psdLayers); + m_ImportedTextureHeight = textureActualHeight = height; + m_ImportedTextureWidth = textureActualWidth = width; + var generatedTexture = ImportTexture(ctx, output, width, height, 0, spriteImportData.Count); + + if (generatedTexture.texture) + { + m_ImportedTextureHeight = generatedTexture.texture.height; + m_ImportedTextureWidth = generatedTexture.texture.width; + } + + RegisterAssets(ctx, generatedTexture); + } + finally + { + if (output.IsCreated) + output.Dispose(); + foreach (var l in oldPsdLayers) + l.Dispose(); + } + } + + void EnsureSingleSpriteExist() + { + if (m_SpriteImportData.Count <= 0) + m_SpriteImportData.Add(new SpriteMetaData()); // insert default for single sprite mode + } + + internal TextureImporterPlatformSettings GetPlatformTextureSettings(BuildTarget buildTarget) + { + var buildTargetName = TexturePlatformSettingsHelper.GetBuildTargetName(buildTarget); + TextureImporterPlatformSettings platformSettings = null; + platformSettings = m_PlatformSettings.SingleOrDefault(x => x.name == buildTargetName && x.overridden == true); + platformSettings = platformSettings ?? m_PlatformSettings.SingleOrDefault(x => x.name == TexturePlatformSettingsHelper.defaultPlatformName); + + if (platformSettings == null) + { + platformSettings = new TextureImporterPlatformSettings(); + platformSettings.name = buildTargetName; + platformSettings.overridden = false; + } + return platformSettings; + } + + void RegisterAssets(AssetImportContext ctx, TextureGenerationOutput output) + { + if ((output.sprites == null || output.sprites.Length == 0) && output.texture == null) + { + Debug.LogWarning("No Sprites or Texture are generated. Possibly because all layers in file are hidden", this); + return; + } + + SetPhysicsOutline(output.texture, output.sprites); + + List assetNameHash = new List(); + if (!string.IsNullOrEmpty(output.importInspectorWarnings)) + { + Debug.LogWarning(output.importInspectorWarnings); + } + if (output.importWarnings != null && output.importWarnings.Length != 0) + { + foreach (var warning in output.importWarnings) + Debug.LogWarning(warning); + } + if (output.thumbNail == null) + Debug.LogWarning("Thumbnail generation fail"); + if (output.texture == null) + { + throw new Exception("Texture import fail"); + } + + var assetName = GetUniqueName(System.IO.Path.GetFileNameWithoutExtension(ctx.assetPath), assetNameHash, true); + // Setup all fixed name on the hash table + if (string.IsNullOrEmpty(m_TextureAssetName)) + m_TextureAssetName = GetUniqueName(string.Format("{0} Texture",assetName), assetNameHash, true); + if (string.IsNullOrEmpty(m_PrefabAssetName)) + m_PrefabAssetName = GetUniqueName(string.Format("{0} Prefab", assetName), assetNameHash, true); + if (string.IsNullOrEmpty(m_SpriteLibAssetName)) + m_SpriteLibAssetName = GetUniqueName(string.Format("{0} Sprite Lib", assetName), assetNameHash, true); + if (string.IsNullOrEmpty(m_SkeletonAssetName)) + m_SkeletonAssetName = GetUniqueName(string.Format("{0} Skeleton", assetName), assetNameHash, true); + + output.texture.name = assetName; + ctx.AddObjectToAsset(m_TextureAssetName, output.texture, output.thumbNail); + UnityEngine.Object mainAsset = output.texture; + + + if (output.sprites != null) + { + var slAsset = ProduceSpriteLibAsset(output.sprites); + + if (shouldProduceGameObject) + { + GameObject prefab = null; + if (m_PaperDollMode) + prefab = OnProducePaperDollPrefab(m_TextureAssetName, output.sprites, slAsset); + else + prefab = OnProducePrefab(m_TextureAssetName, output.sprites, slAsset); + if (prefab != null) + { + ctx.AddObjectToAsset(m_PrefabAssetName, prefab); + mainAsset = prefab; + } + } + + foreach (var s in output.sprites) + { + var spriteAssetName = GetUniqueName(s.GetSpriteID().ToString(), assetNameHash, false, s); + ctx.AddObjectToAsset(spriteAssetName, s); + } + + if (slAsset != null) + { + slAsset.name = assetName; + ctx.AddObjectToAsset(m_SpriteLibAssetName, slAsset); + } + + if (characterMode && skeletonAsset == null) + { + var characterRig = ScriptableObject.CreateInstance(); + characterRig.name = assetName + " Skeleton"; + var bones = GetDataProvider().GetCharacterData().bones; + characterRig.SetSpriteBones(bones); + ctx.AddObjectToAsset(m_SkeletonAssetName, characterRig); + } + } + ctx.SetMainObject(mainAsset); + } + + bool SpriteIsMainFromSpriteLib(string spriteId, out string categoryName) + { + categoryName = ""; + if (m_SpriteCategoryList.categories != null) + { + foreach (var category in m_SpriteCategoryList.categories) + { + var index = category.labels.FindIndex(x => x.spriteId == spriteId); + if (index == 0) + { + categoryName = category.name; + return true; + } + if (index > 0) + return false; + } + } + return true; + } + + bool VisibleInHierarchy(List psdGroup, int index) + { + var psdLayer = psdGroup[index]; + var parentVisible = true; + if (psdLayer.parentIndex >= 0) + parentVisible = VisibleInHierarchy(psdGroup, psdLayer.parentIndex); + return parentVisible && psdLayer.isVisible; + } + + void BuildGroupGameObject(List psdGroup, int index, Transform root) + { + var psdData = psdGroup[index]; + if (psdData.gameObject == null) + { + var spriteImported = !psdGroup[index].spriteID.Empty() && psdGroup[index].isImported; + var isVisibleGroup = psdData.isGroup && (VisibleInHierarchy(psdGroup, index) || m_ImportHiddenLayers) && m_GenerateGOHierarchy; + if (spriteImported || isVisibleGroup) + { + var spriteData = GetSpriteImportData().FirstOrDefault(x => x.spriteID == psdData.spriteID); + // Determine if need to create GameObject i.e. if the sprite is not in a SpriteLib or if it is the first one + string categoryName; + var b = SpriteIsMainFromSpriteLib(psdData.spriteID.ToString(), out categoryName); + string goName = string.IsNullOrEmpty(categoryName) ? spriteData != null ? spriteData.name : psdData.name : categoryName; + if (b) + psdData.gameObject = m_GameObjectFactory.CreateGameObject(goName); + } + if (psdData.parentIndex >= 0 && m_GenerateGOHierarchy && psdData.gameObject != null) + { + BuildGroupGameObject(psdGroup, psdData.parentIndex, root); + root = psdGroup[psdData.parentIndex].gameObject.transform; + } + + if (psdData.gameObject != null) + psdData.gameObject.transform.SetParent(root); + } + } + + bool shouldProduceGameObject + { + get { return m_CharacterMode && m_MosaicLayers && spriteImportMode == SpriteImportMode.Multiple; } + } + + bool shouldResliceFromLayer + { + get { return m_ResliceFromLayer && m_MosaicLayers && spriteImportMode == SpriteImportMode.Multiple; } + } + + bool characterMode + { + get { return mosaicMode && m_CharacterMode; } + } + + float definitionScale + { + get + { + float definitionScaleW = m_ImportedTextureWidth / (float)textureActualWidth; + float definitionScaleH = m_ImportedTextureHeight / (float)textureActualHeight; + return Mathf.Min(definitionScaleW, definitionScaleH); + } + } + + private Vector2 GetPivotPoint(Rect rect, SpriteAlignment alignment) + { + switch (alignment) + { + case SpriteAlignment.TopLeft: + return new Vector2(rect.xMin, rect.yMax); + + case SpriteAlignment.TopCenter: + return new Vector2(rect.center.x, rect.yMax); + + case SpriteAlignment.TopRight: + return new Vector2(rect.xMax, rect.yMax); + + case SpriteAlignment.LeftCenter: + return new Vector2(rect.xMin, rect.center.y); + + case SpriteAlignment.Center: + return new Vector2(rect.center.x, rect.center.y); + + case SpriteAlignment.RightCenter: + return new Vector2(rect.xMax, rect.center.y); + + case SpriteAlignment.BottomLeft: + return new Vector2(rect.xMin, rect.yMin); + + case SpriteAlignment.BottomCenter: + return new Vector2(rect.center.x, rect.yMin); + + case SpriteAlignment.BottomRight: + return new Vector2(rect.xMax, rect.yMin); + + case SpriteAlignment.Custom: + return new Vector2(m_DocumentPivot.x * rect.width, m_DocumentPivot.y * rect.height); + } + return Vector2.zero; + } + + void CreateBoneGO(int index, SpriteBone[] bones, BoneGO[] bonesGO, Transform defaultRoot) + { + if (bonesGO[index].go != null) + return; + var bone = bones[index]; + if (bone.parentId != -1 && bonesGO[bone.parentId].go == null) + CreateBoneGO(bone.parentId, bones, bonesGO, defaultRoot); + + var go = m_GameObjectFactory.CreateGameObject(bone.name); + if (bone.parentId == -1) + go.transform.SetParent(defaultRoot); + else + go.transform.SetParent(bonesGO[bone.parentId].go.transform); + go.transform.localPosition = bone.position * 1 / pixelsPerUnit; + go.transform.localRotation = bone.rotation; + bonesGO[index] = new BoneGO() + { + go = go, + index = index + }; + } + + BoneGO[] CreateBonesGO(Transform root) + { + if (characterMode) + { + var characterSkeleton = GetDataProvider().GetCharacterData(); + var bones = characterSkeleton.bones; + if (bones != null) + { + var boneGOs = new BoneGO[bones.Length]; + for (int i = 0; i < bones.Length; ++i) + { + CreateBoneGO(i, bones, boneGOs, root); + } + return boneGOs; + } + } + return new BoneGO[0]; + } + + void GetSpriteLiblabel(string spriteId, out string category, out string label) + { + category = ""; + label = ""; + var index = -1; + foreach (var cat in m_SpriteCategoryList.categories) + { + index = cat.labels.FindIndex(x => x.spriteId == spriteId); + if (index != -1) + { + category = cat.name; + label = cat.labels[index].name; + break; + } + } + } + + GameObject OnProducePaperDollPrefab(string assetname, Sprite[] sprites, SpriteLibraryAsset spriteLib) + { + GameObject root = null; + CharacterData? characterSkeleton = characterMode ? new CharacterData ? (GetDataProvider().GetCharacterData()) : null; + if (sprites != null && sprites.Length > 0) + { + root = new GameObject(); + root.name = assetname + "_GO"; + var spriteImportData = GetSpriteImportData(); + var psdLayers = GetPSDLayers(); + var boneGOs = CreateBonesGO(root.transform); + if (spriteLib != null) + root.AddComponent().spriteLibraryAsset = spriteLib; + var currentCharacterData = characterData; + for (int i = 0; i < sprites.Length; ++i) + { + string categoryName; + if (SpriteIsMainFromSpriteLib(sprites[i].GetSpriteID().ToString(), out categoryName)) + { + var spriteBones = currentCharacterData.parts.FirstOrDefault(x => new GUID(x.spriteId) == sprites[i].GetSpriteID()).bones; + var rootBone = root; + if (spriteBones != null && spriteBones.Any()) + { + var b = spriteBones.Where(x => x >= 0 && x < boneGOs.Length).Select(x => boneGOs[x]).OrderBy(x => x.index); + if (b.Any()) + rootBone = b.First().go; + } + + var srGameObject = m_GameObjectFactory.CreateGameObject(string.IsNullOrEmpty(categoryName) ? sprites[i].name : categoryName); + var sr = srGameObject.AddComponent(); + sr.sprite = sprites[i]; + sr.sortingOrder = psdLayers.Count - psdLayers.FindIndex(x => x.spriteID == sprites[i].GetSpriteID()); + srGameObject.transform.parent = rootBone.transform; + var spriteMetaData = spriteImportData.FirstOrDefault(x => x.spriteID == sprites[i].GetSpriteID()); + if (spriteMetaData != null) + { + var uvTransform = spriteMetaData.uvTransform; + var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x + (spriteMetaData.pivot.x * spriteMetaData.rect.width), + spriteMetaData.rect.y - uvTransform.y + (spriteMetaData.pivot.y * spriteMetaData.rect.height)) * definitionScale / sprites[i].pixelsPerUnit; + srGameObject.transform.position = new Vector3(outlineOffset.x, outlineOffset.y, 0); + } + var category = ""; + var labelName = ""; + GetSpriteLiblabel(sprites[i].GetSpriteID().ToString(), out category, out labelName); + if (!string.IsNullOrEmpty(category) && !string.IsNullOrEmpty(labelName)) + { + var sresolver = srGameObject.AddComponent(); + sresolver.SetCategoryAndLabel(category, labelName); + sresolver.ResolveSpriteToSpriteRenderer(); + } + } + } + } + return root; + } + + internal void SetPlatformTextureSettings(TextureImporterPlatformSettings platformSettings) + { + var index = m_PlatformSettings.FindIndex(x => x.name == platformSettings.name); + if(index < 0) + m_PlatformSettings.Add(platformSettings); + else + m_PlatformSettings[index] = platformSettings; + } + + internal TextureImporterPlatformSettings[] GetAllPlatformSettings() + { + return m_PlatformSettings.ToArray(); + } + + GameObject OnProducePrefab(string assetname, Sprite[] sprites, SpriteLibraryAsset spriteLib) + { + GameObject root = null; + CharacterData? characterSkeleton = characterMode ? new CharacterData ? (GetDataProvider().GetCharacterData()) : null; + if (sprites != null && sprites.Length > 0) + { + var currentCharacterData = characterData; + var spriteImportData = GetSpriteImportData(); + root = new GameObject(); + root.name = assetname + "_GO"; + if (spriteLib != null) + root.AddComponent().spriteLibraryAsset = spriteLib; + + var psdLayers = GetPSDLayers(); + for (int i = 0; i < psdLayers.Count; ++i) + { + BuildGroupGameObject(psdLayers, i, root.transform); + } + var boneGOs = CreateBonesGO(root.transform); + for (int i = 0; i < psdLayers.Count; ++i) + { + var l = psdLayers[i]; + GUID layerSpriteID = l.spriteID; + var sprite = sprites.FirstOrDefault(x => x.GetSpriteID() == layerSpriteID); + var spriteMetaData = spriteImportData.FirstOrDefault(x => x.spriteID == layerSpriteID); + if (sprite != null && spriteMetaData != null && l.gameObject != null) + { + var spriteRenderer = l.gameObject.AddComponent(); + spriteRenderer.sprite = sprite; + spriteRenderer.sortingOrder = psdLayers.Count - i; + var uvTransform = spriteMetaData.uvTransform; + var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x + (spriteMetaData.pivot.x * spriteMetaData.rect.width), + spriteMetaData.rect.y - uvTransform.y + (spriteMetaData.pivot.y * spriteMetaData.rect.height)) * definitionScale / sprite.pixelsPerUnit; + l.gameObject.transform.position = new Vector3(outlineOffset.x, outlineOffset.y, 0); + + if (characterSkeleton != null) + { + var part = characterSkeleton.Value.parts.FirstOrDefault(x => x.spriteId == spriteMetaData.spriteID.ToString()); + if (part.bones != null && part.bones.Length > 0) + { + var spriteSkin = l.gameObject.AddComponent(); + if (spriteRenderer.sprite != null && spriteRenderer.sprite.GetBindPoses().Length > 0) + { + var spriteBones = currentCharacterData.parts.FirstOrDefault(x => new GUID(x.spriteId) == spriteRenderer.sprite.GetSpriteID()).bones.Where(x => x >= 0 && x < boneGOs.Length).Select(x => boneGOs[x]); + if (spriteBones.Any()) + { + spriteSkin.rootBone = spriteBones.OrderBy(x => x.index).First().go.transform; + spriteSkin.boneTransforms = spriteBones.Select(x => x.go.transform).ToArray(); + if (spriteSkin.isValid) + spriteSkin.CalculateBounds(); + } + } + } + } + + var category = ""; + var labelName = ""; + GetSpriteLiblabel(layerSpriteID.ToString(), out category, out labelName); + if (!string.IsNullOrEmpty(category) && !string.IsNullOrEmpty(labelName)) + { + var sresolver = l.gameObject.AddComponent(); + sresolver.SetCategoryAndLabel(category, labelName); + sresolver.ResolveSpriteToSpriteRenderer(); + } + } + } + + var prefabBounds = new Rect(0 , 0, m_DocumentSize.x / pixelsPerUnit, m_DocumentSize.y / pixelsPerUnit); + var documentPivot = (Vector3)GetPivotPoint(prefabBounds, m_DocumentAlignment); + for (int i = 0; i < psdLayers.Count; ++i) + { + var l = psdLayers[i]; + if (l.gameObject == null || l.gameObject.GetComponent() == null) + continue; + var p = l.gameObject.transform.localPosition; + p -= documentPivot; + l.gameObject.transform.localPosition = p; + } + for (int i = 0; i < boneGOs.Length; ++i) + { + if (boneGOs[i].go.transform.parent != root.transform) + continue; + var p = boneGOs[i].go.transform.position; + p -= documentPivot; + boneGOs[i].go.transform.position = p; + } + } + + return root; + } + + Bounds? GetBoundingBox(GameObject root) + { + Bounds? prefabBounds1 = null; + var sr = root.GetComponent(); + if (sr != null) + { + prefabBounds1 = sr.bounds; + } + for (int i = 0; i < root.transform.childCount; ++i) + { + var b = GetBoundingBox(root.transform.GetChild(i).gameObject); + if (prefabBounds1 == null) + prefabBounds1 = b; + else + { + if (b.HasValue) + { + var bb = prefabBounds1.Value; + bb.Encapsulate(b.Value); + prefabBounds1 = bb; + } + } + } + return prefabBounds1; + } + + bool CleanUpGameobjectsWithOutRig(GameObject root) + { + var sr = root.GetComponent(); + var canDelete = true; + if (sr != null && sr.sprite != null) + { + try + { + var bones = GetDataProvider().GetBones(sr.sprite.GetSpriteID()); + canDelete = bones == null || bones.Count == 0; + } + catch (Exception e) + { + Debug.LogError(e); + } + } + + + List cleanup = new List(); + for (int i = 0; i < root.transform.childCount; ++i) + { + var go = root.transform.GetChild(i); + if (CleanUpGameobjectsWithOutRig(go.gameObject)) + cleanup.Add(go.gameObject); + } + + for (int i = 0; i < cleanup.Count; ++i) + GameObject.DestroyImmediate(cleanup[i]); + cleanup.Clear(); + + if (root.transform.childCount == 0 && canDelete) + return true; + + return false; + } + + static string SanitizeName(string name) + { + name = name.Replace('\0', ' '); + string newName = null; + // We can't create asset name with these name. + if ((name.Length == 2 && name[0] == '.' && name[1] == '.') + || (name.Length == 1 && name[0] == '.') + || (name.Length == 1 && name[0] == '/')) + newName += name + "_"; + + if (!string.IsNullOrEmpty(newName)) + { + Debug.LogWarning(string.Format("File contains layer with invalid name for generating asset. {0} is renamed to {1}", name, newName)); + return newName; + } + return name; + } + + static int GetStringHash(string str) + { + MD5 md5Hasher = MD5.Create(); + var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); + return BitConverter.ToInt32(hashed, 0); + } + + static string GetUniqueName(string name, List stringHash, bool logNewNameGenerated = false, UnityEngine.Object context = null) + { + var sanitizedName = string.Copy(SanitizeName(name)); + string uniqueName = sanitizedName; + int index = 1; + while (true) + { + var hash = GetStringHash(uniqueName); + if (!stringHash.Contains(hash)) + { + stringHash.Add(hash); + if (logNewNameGenerated && sanitizedName != uniqueName) + Debug.Log(string.Format("Asset name {0} is changed to {1} to ensure uniqueness", name, uniqueName), context); + return uniqueName; + } + uniqueName = string.Format("{0}_{1}", sanitizedName, index); + ++index; + } + } + + // ISpriteEditorDataProvider interface + internal SpriteImportMode spriteImportMode + { + get + { + return m_TextureImporterSettings.textureType != TextureImporterType.Sprite ? + SpriteImportMode.None : + (SpriteImportMode)m_TextureImporterSettings.spriteMode; + } + } + + SpriteImportMode ISpriteEditorDataProvider.spriteImportMode => spriteImportMode; + + internal int spriteDataCount + { + get + { + var spriteImportData = GetSpriteImportData(); + if (mosaicMode) + return spriteImportData.Count; + if (spriteImportMode != SpriteImportMode.Multiple) + return 1; + return spriteImportData.Count - 1; + } + } + + internal UnityEngine.Object targetObject + { + get { return this; } + } + UnityEngine.Object ISpriteEditorDataProvider.targetObject => targetObject; + + internal float pixelsPerUnit + { + get { return m_TextureImporterSettings.spritePixelsPerUnit; } + } + + float ISpriteEditorDataProvider.pixelsPerUnit =>pixelsPerUnit; + + internal T GetDataProvider() where T : class + { + if (typeof(T) == typeof(ISpriteBoneDataProvider)) + { + return new SpriteBoneDataProvider { dataProvider = this } as T; + } + if (typeof(T) == typeof(ISpriteMeshDataProvider)) + { + return new SpriteMeshDataProvider { dataProvider = this } as T; + } + if (typeof(T) == typeof(ISpriteOutlineDataProvider)) + { + return new SpriteOutlineDataProvider { dataProvider = this } as T; + } + if (typeof(T) == typeof(ISpritePhysicsOutlineDataProvider)) + { + return new SpritePhysicsOutlineProvider { dataProvider = this } as T; + } + if (typeof(T) == typeof(ITextureDataProvider)) + { + return new TextureDataProvider { dataProvider = this } as T; + } + if (typeof(T) == typeof(ICharacterDataProvider)) + { + return characterMode ? new CharacterDataProvider { dataProvider = this } as T : null; + } + if (typeof(T) == typeof(IMainSkeletonDataProvider)) + { + return characterMode && skeletonAsset != null ? new MainSkeletonDataProvider() { dataProvider = this } as T : null; + } + if (typeof(T) == typeof(ISecondaryTextureDataProvider)) + { + return new SecondaryTextureDataProvider() { dataProvider = this } as T; + } + else + return this as T; + } + + T ISpriteEditorDataProvider.GetDataProvider() + { + return GetDataProvider(); + } + + internal bool HasDataProvider(Type type) + { + if (characterMode) + { + if (type == typeof(ICharacterDataProvider)) + return true; + if (type == typeof(IMainSkeletonDataProvider) && skeletonAsset != null) + return true; + } + if (type == typeof(ISpriteBoneDataProvider) || + type == typeof(ISpriteMeshDataProvider) || + type == typeof(ISpriteOutlineDataProvider) || + type == typeof(ISpritePhysicsOutlineDataProvider) || + type == typeof(ITextureDataProvider) || + type == typeof(ISecondaryTextureDataProvider)) + { + return true; + } + else + return type.IsAssignableFrom(GetType()); + } + + bool ISpriteEditorDataProvider.HasDataProvider(Type type) + { + return HasDataProvider(type); + } + + internal void AddSpriteData(SpriteRect spriteRect) + { + if (spriteImportMode != SpriteImportMode.Multiple) + Debug.LogWarning("Can only add sprite data when import mode is multiple"); + else + { + GetSpriteImportData().Add(new SpriteMetaData(spriteRect)); + } + } + + internal void DeleteSpriteData(SpriteRect spriteRect) + { + if (spriteImportMode != SpriteImportMode.Multiple) + Debug.LogWarning("Can only add sprite data when import mode is multiple"); + else + { + var spriteImportData = GetSpriteImportData(); + int index = spriteImportData.FindIndex(x => x.spriteID == spriteRect.spriteID); + Assert.AreEqual(0, index, "Cannot delete Sprite from single sprite mode"); + spriteImportData.RemoveAt(index); + } + } + + internal int GetSpriteDataIndex(GUID guid) + { + switch (spriteImportMode) + { + case SpriteImportMode.Single: + case SpriteImportMode.Polygon: + return 0; + case SpriteImportMode.Multiple: + { + var spriteImportData = GetSpriteImportData(); + return spriteImportData.FindIndex(x => x.spriteID == guid); + } + default: + throw new InvalidOperationException("GUID not found"); + } + } + + internal void Apply() + { + // Do this so that asset change save dialog will not show + var originalValue = EditorPrefs.GetBool("VerifySavingAssets", false); + EditorPrefs.SetBool("VerifySavingAssets", false); + AssetDatabase.ForceReserializeAssets(new string[] { assetPath }, ForceReserializeAssetsOptions.ReserializeMetadata); + EditorPrefs.SetBool("VerifySavingAssets", originalValue); + } + + void ISpriteEditorDataProvider.Apply() + { + Apply(); + } + + internal void InitSpriteEditorDataProvider() {} + void ISpriteEditorDataProvider.InitSpriteEditorDataProvider() + { + InitSpriteEditorDataProvider(); + } + + internal SpriteRect[] GetSpriteRects() + { + var spriteImportData = GetSpriteImportData(); + var skip = mosaicMode ? 0 : 1; + return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).Select(x => new SpriteMetaData(x) as SpriteRect).ToArray() : new[] {new SpriteMetaData(spriteImportData[0]) }; + } + + SpriteRect[] ISpriteEditorDataProvider.GetSpriteRects() + { + return GetSpriteRects(); + } + + internal List GetSpriteImportData() + { + if (mosaicMode) + { + if (characterMode) + { + if (skeletonAsset != null) + { + return m_SharedRigSpriteImportData; + } + return m_RigSpriteImportData; + } + return m_MosaicSpriteImportData; + } + return m_SpriteImportData; + } + + private SkeletonAsset skeletonAsset => + AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID)); + + internal List GetPSDLayers() + { + if (mosaicMode) + { + if (characterMode) + { + if (skeletonAsset != null) + return m_SharedRigPSDLayers; + else + return m_RigPSDLayers; + } + return m_MosaicPSDLayers; + } + return null; + } + + internal SpriteMetaData[] GetSpriteMetaData() + { + var spriteImportData = GetSpriteImportData(); + var skip = mosaicMode ? 0 : 1; + return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).ToArray() : new[] { new SpriteMetaData(spriteImportData[0]) }; + } + + internal SpriteRect GetSpriteDataFromAllMode(GUID guid) + { + var spriteMetaData = m_RigSpriteImportData.FirstOrDefault(x => x.spriteID == guid); + if(spriteMetaData == null) + spriteMetaData = m_SharedRigSpriteImportData.FirstOrDefault(x => x.spriteID == guid); + if(spriteMetaData == null) + spriteMetaData = m_MosaicSpriteImportData.FirstOrDefault(x => x.spriteID == guid); + if(spriteMetaData == null) + spriteMetaData = m_SpriteImportData.FirstOrDefault(x => x.spriteID == guid); + return spriteMetaData; + } + + internal SpriteRect GetSpriteData(GUID guid) + { + var spriteImportData = GetSpriteImportData(); + var skip = mosaicMode ? 0 : 1; + return spriteImportMode == SpriteImportMode.Multiple ? spriteImportData.Skip(skip).FirstOrDefault(x => x.spriteID == guid) : spriteImportData[0]; + } + + internal void SetSpriteRects(SpriteRect[] spriteRects) + { + var spriteImportData = GetSpriteImportData(); + if (spriteImportMode == SpriteImportMode.Multiple) + { + var singleSpriteID = mosaicMode ? new GUID() : spriteImportData[0].spriteID; + spriteImportData.RemoveAll(data => data.spriteID != singleSpriteID && spriteRects.FirstOrDefault(x => x.spriteID == data.spriteID) == null); + foreach (var sr in spriteRects) + { + var importData = spriteImportData.FirstOrDefault(x => x.spriteID == sr.spriteID); + if (importData == null) + spriteImportData.Add(new SpriteMetaData(sr)); + else + { + importData.name = sr.name; + importData.alignment = sr.alignment; + importData.border = sr.border; + importData.pivot = sr.pivot; + importData.rect = sr.rect; + } + } + } + else if (spriteRects.Length == 1 && (spriteImportMode == SpriteImportMode.Single || spriteImportMode == SpriteImportMode.Polygon)) + { + if (spriteImportData[0].spriteID == spriteRects[0].spriteID) + { + spriteImportData[0].name = spriteRects[0].name; + spriteImportData[0].alignment = spriteRects[0].alignment; + m_TextureImporterSettings.spriteAlignment = (int)spriteRects[0].alignment; + m_TextureImporterSettings.spriteBorder = spriteImportData[0].border = spriteRects[0].border; + m_TextureImporterSettings.spritePivot = spriteImportData[0].pivot = spriteRects[0].pivot; + spriteImportData[0].rect = spriteRects[0].rect; + } + else + { + spriteImportData[0] = new SpriteMetaData(spriteRects[0]); + } + } + } + + void ISpriteEditorDataProvider.SetSpriteRects(SpriteRect[] spriteRects) + { + SetSpriteRects(spriteRects); + } + + bool mosaicMode + { + get { return spriteImportMode == SpriteImportMode.Multiple && m_MosaicLayers; } + } + + internal CharacterData characterData + { + get + { + if (skeletonAsset != null) + return m_SharedRigCharacterData; + return m_CharacterData; + } + set + { + if (skeletonAsset != null) + m_SharedRigCharacterData = value; + else + m_CharacterData = value; + } + } + + internal Vector2Int documentSize + { + get { return m_DocumentSize; } + } + + SpriteLibraryAsset ProduceSpriteLibAsset(Sprite[] sprites) + { + if (!characterMode || m_SpriteCategoryList.categories == null) + return null; + var sla = ScriptableObject.CreateInstance(); + sla.name = "Sprite Lib"; + sla.categories = m_SpriteCategoryList.categories.Select(x => + new SpriteLibCategory() + { + name = x.name, + categoryList = x.labels.Select(y => + { + var sprite = sprites.FirstOrDefault(z => z.GetSpriteID().ToString() == y.spriteId); + return new SpriteCategoryEntry() + { + name = y.name, + sprite = sprite + }; + }).ToList() + }).ToList(); + sla.categories.RemoveAll(x => x.categoryList.Count == 0); + if (sla.categories.Count > 0) + { + sla.UpdateHashes(); + return sla; + } + return null; + } + + internal SecondarySpriteTexture[] secondaryTextures + { + get { return m_SecondarySpriteTextures; } + set { m_SecondarySpriteTextures = value; } + } + + internal void ReadTextureSettings(TextureImporterSettings dest) + { + m_TextureImporterSettings.CopyTo(dest); + } + + internal SpriteBone[] mainSkeletonBones + { + get + { + var skeleton = skeletonAsset; + return skeleton != null ? skeleton.GetSpriteBones() : null; + } + } + + IPSDLayerMappingStrategy GetLayerMappingStrategy() + { + return m_MappingCompare[(int)m_LayerMappingOption]; + } + + internal bool generatePhysicsOutline + { + get => m_GeneratePhysicsShape; + } + + void SetPhysicsOutline(Texture2D texture, Sprite[] sprites) + { + var scale = definitionScale; + var physicsOutlineDataProvider = GetDataProvider(); + foreach (var sprite in sprites) + { + var guid = sprite.GetSpriteID(); + var outline = physicsOutlineDataProvider.GetOutlines(guid); + + var outlineOffset = sprite.rect.size / 2; + bool generated = false; + if ((outline == null || outline.Count == 0) && generatePhysicsOutline) + { + Vector2[][] defaultOutline; + InternalEditorBridge.GenerateOutlineFromSprite(sprite, 0.25f, 200, true, out defaultOutline); + outline = new List(defaultOutline.Length); + for (int i = 0; i < defaultOutline.Length; ++i) + { + outline.Add(defaultOutline[i]); + } + + generated = true; + } + if (outline != null && outline.Count > 0) + { + // Ensure that outlines are all valid. + int validOutlineCount = 0; + for (int i = 0; i < outline.Count; ++i) + validOutlineCount = validOutlineCount + ( (outline[i].Length > 2) ? 1 : 0 ); + + int index = 0; + var convertedOutline = new Vector2[validOutlineCount][]; + var useScale = generated ? pixelsPerUnit * scale : scale; + var useOutlineOffset = generated ? Vector2.zero : outlineOffset; + for (int i = 0; i < outline.Count; ++i) + { + if (outline[i].Length > 2) + { + convertedOutline[index] = new Vector2[outline[i].Length]; + for (int j = 0; j < outline[i].Length; ++j) + { + convertedOutline[index][j] = outline[i][j] * useScale + outlineOffset; + } + index++; + } + } + sprite.OverridePhysicsShape(convertedOutline); + } + } + } + } +} diff --git a/Editor/PSDImporter.cs.meta b/Editor/PSDImporter.cs.meta index c4c99ed..d44cb68 100644 --- a/Editor/PSDImporter.cs.meta +++ b/Editor/PSDImporter.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: b2a9591990af98743ba3ff7cf1000886 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: b2a9591990af98743ba3ff7cf1000886 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDImporterDataProvider.cs b/Editor/PSDImporterDataProvider.cs index 1c11e9f..15b5f76 100644 --- a/Editor/PSDImporterDataProvider.cs +++ b/Editor/PSDImporterDataProvider.cs @@ -1,294 +1,303 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using UnityEngine.Assertions; -using UnityEditor.U2D.Common; -using UnityEditor.U2D.Animation; -using System; -using UnityEditor.U2D.Sprites; -using UnityEngine.U2D; - -namespace UnityEditor.U2D.PSD -{ - internal abstract class PSDDataProvider - { - public PSDImporter dataProvider; - } - - internal class SpriteBoneDataProvider : PSDDataProvider, ISpriteBoneDataProvider - { - public List GetBones(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - return sprite.spriteBone != null ? sprite.spriteBone.ToList() : new List(); - } - - public void SetBones(GUID guid, List bones) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).spriteBone = bones; - } - } - - internal class TextureDataProvider : PSDDataProvider, ITextureDataProvider - { - Texture2D m_ReadableTexture; - Texture2D m_OriginalTexture; - - PSDImporter textureImporter { get { return (PSDImporter)dataProvider.targetObject; } } - - public Texture2D texture - { - get - { - if (m_OriginalTexture == null) - m_OriginalTexture = AssetDatabase.LoadAssetAtPath(textureImporter.assetPath); - return m_OriginalTexture; - } - } - - public Texture2D previewTexture - { - get { return texture; } - } - - public Texture2D GetReadableTexture2D() - { - if (m_ReadableTexture == null) - { - m_ReadableTexture = InternalEditorBridge.CreateTemporaryDuplicate(texture, texture.width, texture.height); - if (m_ReadableTexture != null) - m_ReadableTexture.filterMode = texture.filterMode; - } - return m_ReadableTexture; - } - - public void GetTextureActualWidthAndHeight(out int width, out int height) - { - width = dataProvider.textureActualWidth; - height = dataProvider.textureActualHeight; - } - } - - internal class SecondaryTextureDataProvider : PSDDataProvider, ISecondaryTextureDataProvider - { - public SecondarySpriteTexture[] textures - { - get { return dataProvider.secondaryTextures; } - set { dataProvider.secondaryTextures = value; } - } - } - - internal class SpriteOutlineDataProvider : PSDDataProvider, ISpriteOutlineDataProvider - { - public List GetOutlines(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - - var outline = sprite.spriteOutline; - if (outline != null) - return outline.Select(x => x.outline).ToList(); - return new List(); - } - - public void SetOutlines(GUID guid, List data) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).spriteOutline = data.Select(x => new SpriteOutline() {outline = x}).ToList(); - } - - public float GetTessellationDetail(GUID guid) - { - return ((SpriteMetaData)dataProvider.GetSpriteData(guid)).tessellationDetail; - } - - public void SetTessellationDetail(GUID guid, float value) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).tessellationDetail = value; - } - } - - internal class SpritePhysicsOutlineProvider : PSDDataProvider, ISpritePhysicsOutlineDataProvider - { - public List GetOutlines(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - var outline = sprite.spritePhysicsOutline; - if (outline != null) - return outline.Select(x => x.outline).ToList(); - - return new List(); - } - - public void SetOutlines(GUID guid, List data) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).spritePhysicsOutline = data.Select(x => new SpriteOutline() { outline = x }).ToList(); - } - - public float GetTessellationDetail(GUID guid) - { - return ((SpriteMetaData)dataProvider.GetSpriteData(guid)).tessellationDetail; - } - - public void SetTessellationDetail(GUID guid, float value) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).tessellationDetail = value; - } - } - - internal class SpriteMeshDataProvider : PSDDataProvider, ISpriteMeshDataProvider - { - public Vertex2DMetaData[] GetVertices(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - var v = sprite.vertices; - if (v != null) - return v.ToArray(); - - return new Vertex2DMetaData[0]; - } - - public void SetVertices(GUID guid, Vertex2DMetaData[] vertices) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).vertices = vertices.ToList(); - } - - public int[] GetIndices(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - var v = sprite.indices; - if (v != null) - return v; - - return new int[0]; - } - - public void SetIndices(GUID guid, int[] indices) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).indices = indices; - } - - public Vector2Int[] GetEdges(GUID guid) - { - var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); - Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); - var v = sprite.edges; - if (v != null) - return v; - - return new Vector2Int[0]; - } - - public void SetEdges(GUID guid, Vector2Int[] edges) - { - var sprite = dataProvider.GetSpriteDataFromAllMode(guid); - if (sprite != null) - ((SpriteMetaData)sprite).edges = edges; - } - } - - - internal class CharacterDataProvider : PSDDataProvider, ICharacterDataProvider - { - int ParentGroupInFlatten(int parentIndex, List psdLayers) - { - int group = -1; - for (int i = 0; i <= parentIndex; ++i) - if (psdLayers[i].isGroup) - ++group; - - return group; - } - - public CharacterData GetCharacterData() - { - var psdLayers = dataProvider.GetPSDLayers(); - var groups = new List(); - for (int i = 0; i < psdLayers.Count; ++i) - { - if (psdLayers[i].isGroup) - { - groups.Add(new CharacterGroup() - { - name = psdLayers[i].name, - parentGroup = ParentGroupInFlatten(psdLayers[i].parentIndex, psdLayers), - order = i - }); - } - } - - var cd = dataProvider.characterData; - - var parts = cd.parts == null ? new List() : cd.parts.ToList(); - var spriteRects = dataProvider.GetSpriteMetaData(); - parts.RemoveAll(x => Array.FindIndex(spriteRects, y => y.spriteID == new GUID(x.spriteId)) == -1); - foreach (var spriteMetaData in spriteRects) - { - var srIndex = parts.FindIndex(x => new GUID(x.spriteId) == spriteMetaData.spriteID); - CharacterPart cp = srIndex == -1 ? new CharacterPart() : parts[srIndex]; - cp.spriteId = spriteMetaData.spriteID.ToString(); - cp.order = psdLayers.FindIndex(l => l.spriteID == spriteMetaData.spriteID); - cp.spritePosition = new RectInt(); - var uvTransform = spriteMetaData.uvTransform; - var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x, spriteMetaData.rect.y - uvTransform.y); - cp.spritePosition.position = new Vector2Int((int)outlineOffset.x, (int)outlineOffset.y); - cp.spritePosition.size = new Vector2Int((int)spriteMetaData.rect.width, (int)spriteMetaData.rect.height); - cp.parentGroup = -1; - //Find group - var spritePSDLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteMetaData.spriteID); - if (spritePSDLayer != null) - { - cp.parentGroup = ParentGroupInFlatten(spritePSDLayer.parentIndex, psdLayers); - } - - - if (srIndex == -1) - parts.Add(cp); - else - parts[srIndex] = cp; - } - - parts.Sort((x, y) => - { - return x.order.CompareTo(y.order); - }); - - parts.Reverse(); - cd.parts = parts.ToArray(); - cd.dimension = dataProvider.documentSize; - cd.characterGroups = groups.ToArray(); - return cd; - } - - public void SetCharacterData(CharacterData characterData) - { - characterData.parts = characterData.parts.Reverse().ToArray(); - dataProvider.characterData = characterData; - } - } - - internal class MainSkeletonDataProvider : PSDDataProvider, IMainSkeletonDataProvider - { - public MainSkeletonData GetMainSkeletonData() - { - return new MainSkeletonData { bones = dataProvider.mainSkeletonBones }; - } - } -} +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.Assertions; +using UnityEditor.U2D.Common; +using UnityEditor.U2D.Animation; +using System; +using UnityEditor.U2D.Sprites; +using UnityEngine.U2D; + +namespace UnityEditor.U2D.PSD +{ + internal abstract class PSDDataProvider + { + public PSDImporter dataProvider; + } + + internal class SpriteBoneDataProvider : PSDDataProvider, ISpriteBoneDataProvider + { + public List GetBones(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + return sprite.spriteBone != null ? sprite.spriteBone.ToList() : new List(); + } + + public void SetBones(GUID guid, List bones) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).spriteBone = bones; + } + } + + internal class TextureDataProvider : PSDDataProvider, ITextureDataProvider + { + Texture2D m_ReadableTexture; + Texture2D m_OriginalTexture; + + PSDImporter textureImporter { get { return (PSDImporter)dataProvider.targetObject; } } + + public Texture2D texture + { + get + { + if (m_OriginalTexture == null) + m_OriginalTexture = AssetDatabase.LoadAssetAtPath(textureImporter.assetPath); + return m_OriginalTexture; + } + } + + public Texture2D previewTexture + { + get { return texture; } + } + + public Texture2D GetReadableTexture2D() + { + if (m_ReadableTexture == null) + { + m_ReadableTexture = InternalEditorBridge.CreateTemporaryDuplicate(texture, texture.width, texture.height); + if (m_ReadableTexture != null) + m_ReadableTexture.filterMode = texture.filterMode; + } + return m_ReadableTexture; + } + + public void GetTextureActualWidthAndHeight(out int width, out int height) + { + width = dataProvider.textureActualWidth; + height = dataProvider.textureActualHeight; + } + } + + internal class SecondaryTextureDataProvider : PSDDataProvider, ISecondaryTextureDataProvider + { + public SecondarySpriteTexture[] textures + { + get { return dataProvider.secondaryTextures; } + set { dataProvider.secondaryTextures = value; } + } + } + + internal class SpriteOutlineDataProvider : PSDDataProvider, ISpriteOutlineDataProvider + { + public List GetOutlines(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + + var outline = sprite.spriteOutline; + if (outline != null) + return outline.Select(x => x.outline).ToList(); + return new List(); + } + + public void SetOutlines(GUID guid, List data) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).spriteOutline = data.Select(x => new SpriteOutline() {outline = x}).ToList(); + } + + public float GetTessellationDetail(GUID guid) + { + return ((SpriteMetaData)dataProvider.GetSpriteData(guid)).tessellationDetail; + } + + public void SetTessellationDetail(GUID guid, float value) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).tessellationDetail = value; + } + } + + internal class SpritePhysicsOutlineProvider : PSDDataProvider, ISpritePhysicsOutlineDataProvider + { + public List GetOutlines(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + var outline = sprite.spritePhysicsOutline; + if (outline != null) + return outline.Select(x => x.outline).ToList(); + + return new List(); + } + + public void SetOutlines(GUID guid, List data) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).spritePhysicsOutline = data.Select(x => new SpriteOutline() { outline = x }).ToList(); + } + + public float GetTessellationDetail(GUID guid) + { + return ((SpriteMetaData)dataProvider.GetSpriteData(guid)).tessellationDetail; + } + + public void SetTessellationDetail(GUID guid, float value) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).tessellationDetail = value; + } + } + + internal class SpriteMeshDataProvider : PSDDataProvider, ISpriteMeshDataProvider + { + public Vertex2DMetaData[] GetVertices(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + var v = sprite.vertices; + if (v != null) + return v.ToArray(); + + return new Vertex2DMetaData[0]; + } + + public void SetVertices(GUID guid, Vertex2DMetaData[] vertices) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).vertices = vertices.ToList(); + } + + public int[] GetIndices(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + var v = sprite.indices; + if (v != null) + return v; + + return new int[0]; + } + + public void SetIndices(GUID guid, int[] indices) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).indices = indices; + } + + public Vector2Int[] GetEdges(GUID guid) + { + var sprite = ((SpriteMetaData)dataProvider.GetSpriteData(guid)); + Assert.IsNotNull(sprite, string.Format("Sprite not found for GUID:{0}", guid.ToString())); + var v = sprite.edges; + if (v != null) + return v; + + return new Vector2Int[0]; + } + + public void SetEdges(GUID guid, Vector2Int[] edges) + { + var sprite = dataProvider.GetSpriteDataFromAllMode(guid); + if (sprite != null) + ((SpriteMetaData)sprite).edges = edges; + } + } + + + internal class CharacterDataProvider : PSDDataProvider, ICharacterDataProvider + { + int ParentGroupInFlatten(int parentIndex, List psdLayers) + { + int group = -1; + for (int i = 0; i <= parentIndex; ++i) + if (GenerateNodeForGroup(i, psdLayers)) + ++group; + + return group; + } + + bool GenerateNodeForGroup(int index, List psdLayers) + { + var layer = psdLayers[index]; + var parentGroup = true; + if (layer.parentIndex >= 0) + parentGroup = GenerateNodeForGroup(layer.parentIndex, psdLayers); + return psdLayers[index].isGroup && !psdLayers[index].flatten && parentGroup; + } + + public CharacterData GetCharacterData() + { + var psdLayers = dataProvider.GetPSDLayers(); + var groups = new List(); + for (int i = 0; i < psdLayers.Count; ++i) + { + if (GenerateNodeForGroup(i, psdLayers)) + { + groups.Add(new CharacterGroup() + { + name = psdLayers[i].name, + parentGroup = ParentGroupInFlatten(psdLayers[i].parentIndex, psdLayers), + order = i + }); + } + } + + var cd = dataProvider.characterData; + + var parts = cd.parts == null ? new List() : cd.parts.ToList(); + var spriteRects = dataProvider.GetSpriteMetaData(); + parts.RemoveAll(x => Array.FindIndex(spriteRects, y => y.spriteID == new GUID(x.spriteId)) == -1); + foreach (var spriteMetaData in spriteRects) + { + var srIndex = parts.FindIndex(x => new GUID(x.spriteId) == spriteMetaData.spriteID); + CharacterPart cp = srIndex == -1 ? new CharacterPart() : parts[srIndex]; + cp.spriteId = spriteMetaData.spriteID.ToString(); + cp.order = psdLayers.FindIndex(l => l.spriteID == spriteMetaData.spriteID); + cp.spritePosition = new RectInt(); + var uvTransform = spriteMetaData.uvTransform; + var outlineOffset = new Vector2(spriteMetaData.rect.x - uvTransform.x, spriteMetaData.rect.y - uvTransform.y); + cp.spritePosition.position = new Vector2Int((int)outlineOffset.x, (int)outlineOffset.y); + cp.spritePosition.size = new Vector2Int((int)spriteMetaData.rect.width, (int)spriteMetaData.rect.height); + cp.parentGroup = -1; + //Find group + var spritePSDLayer = psdLayers.FirstOrDefault(x => x.spriteID == spriteMetaData.spriteID); + if (spritePSDLayer != null) + { + cp.parentGroup = ParentGroupInFlatten(spritePSDLayer.parentIndex, psdLayers); + } + + + if (srIndex == -1) + parts.Add(cp); + else + parts[srIndex] = cp; + } + + parts.Sort((x, y) => + { + return x.order.CompareTo(y.order); + }); + + parts.Reverse(); + cd.parts = parts.ToArray(); + cd.dimension = dataProvider.documentSize; + cd.characterGroups = groups.ToArray(); + return cd; + } + + public void SetCharacterData(CharacterData characterData) + { + characterData.parts = characterData.parts.Reverse().ToArray(); + dataProvider.characterData = characterData; + } + } + + internal class MainSkeletonDataProvider : PSDDataProvider, IMainSkeletonDataProvider + { + public MainSkeletonData GetMainSkeletonData() + { + return new MainSkeletonData { bones = dataProvider.mainSkeletonBones }; + } + } +} diff --git a/Editor/PSDImporterDataProvider.cs.meta b/Editor/PSDImporterDataProvider.cs.meta index 2aa6f07..6a6d8bd 100644 --- a/Editor/PSDImporterDataProvider.cs.meta +++ b/Editor/PSDImporterDataProvider.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: d38b7c3f9a7064947a8e162797ea2fa8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: d38b7c3f9a7064947a8e162797ea2fa8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDImporterEditor.cs b/Editor/PSDImporterEditor.cs index 5c7b842..0256b89 100644 --- a/Editor/PSDImporterEditor.cs +++ b/Editor/PSDImporterEditor.cs @@ -1,1141 +1,1426 @@ -using System; -using System.Collections.Generic; -using System.IO; -using PhotoshopFile; -using UnityEditor.AssetImporters; -using UnityEditor.U2D.Animation; -using UnityEditor.U2D.Common; -using UnityEditor.U2D.Sprites; -using UnityEngine; -using UnityEngine.Scripting.APIUpdating; -using UnityEngine.U2D.Animation; - -namespace UnityEditor.U2D.PSD -{ - /// - /// Inspector for PSDImporter - /// - [CustomEditor(typeof(PSDImporter))] - [MovedFrom("UnityEditor.Experimental.AssetImporters")] - public class PSDImporterEditor : ScriptedImporterEditor, ITexturePlatformSettingsDataProvider - { - SerializedProperty m_TextureType; - SerializedProperty m_TextureShape; - SerializedProperty m_SpriteMode; - SerializedProperty m_SpritePixelsToUnits; - SerializedProperty m_SpriteMeshType; - SerializedProperty m_SpriteExtrude; - SerializedProperty m_Alignment; - SerializedProperty m_SpritePivot; - SerializedProperty m_NPOTScale; - SerializedProperty m_IsReadable; - SerializedProperty m_sRGBTexture; - SerializedProperty m_AlphaSource; - SerializedProperty m_MipMapMode; - SerializedProperty m_EnableMipMap; - SerializedProperty m_FadeOut; - SerializedProperty m_BorderMipMap; - SerializedProperty m_MipMapsPreserveCoverage; - SerializedProperty m_AlphaTestReferenceValue; - SerializedProperty m_MipMapFadeDistanceStart; - SerializedProperty m_MipMapFadeDistanceEnd; - SerializedProperty m_AlphaIsTransparency; - SerializedProperty m_FilterMode; - SerializedProperty m_Aniso; - - SerializedProperty m_WrapU; - SerializedProperty m_WrapV; - SerializedProperty m_WrapW; - SerializedProperty m_ConvertToNormalMap; - SerializedProperty m_MosaicLayers; - SerializedProperty m_ImportHiddenLayers; - SerializedProperty m_ResliceFromLayer; - SerializedProperty m_CharacterMode; - SerializedProperty m_DocumentPivot; - SerializedProperty m_DocumentAlignment; - SerializedProperty m_GenerateGOHierarchy; - SerializedProperty m_PaperDollMode; - SerializedProperty m_KeepDupilcateSpriteName; - SerializedProperty m_SkeletonAssetReferenceID; - - private SkeletonAsset m_SkeletonAsset; - readonly int[] m_FilterModeOptions = (int[])(Enum.GetValues(typeof(FilterMode))); - - bool m_IsPOT = false; - bool m_ShowAdvanced = false; - Dictionary m_AdvanceInspectorGUI = new Dictionary(); - int m_PlatformSettingsIndex; - bool m_ShowPerAxisWrapModes = false; - - TexturePlatformSettingsHelper m_TexturePlatformSettingsHelper; - - TexturePlatformSettingsView m_TexturePlatformSettingsView = new TexturePlatformSettingsView(); - TexturePlatformSettingsController m_TexturePlatformSettingsController = new TexturePlatformSettingsController(); - - /// - /// Implementation of AssetImporterEditor.OnEnable - /// - public override void OnEnable() - { - base.OnEnable(); - m_MosaicLayers = serializedObject.FindProperty("m_MosaicLayers"); - m_ImportHiddenLayers = serializedObject.FindProperty("m_ImportHiddenLayers"); - m_ResliceFromLayer = serializedObject.FindProperty("m_ResliceFromLayer"); - m_CharacterMode = serializedObject.FindProperty("m_CharacterMode"); - m_DocumentPivot = serializedObject.FindProperty("m_DocumentPivot"); - m_DocumentAlignment = serializedObject.FindProperty("m_DocumentAlignment"); - m_GenerateGOHierarchy = serializedObject.FindProperty("m_GenerateGOHierarchy"); - m_PaperDollMode = serializedObject.FindProperty("m_PaperDollMode"); - m_KeepDupilcateSpriteName = serializedObject.FindProperty("m_KeepDupilcateSpriteName"); - m_SkeletonAssetReferenceID = serializedObject.FindProperty("m_SkeletonAssetReferenceID"); - - var textureImporterSettingsSP = serializedObject.FindProperty("m_TextureImporterSettings"); - m_TextureType = textureImporterSettingsSP.FindPropertyRelative("m_TextureType"); - m_TextureShape = textureImporterSettingsSP.FindPropertyRelative("m_TextureShape"); - m_ConvertToNormalMap = textureImporterSettingsSP.FindPropertyRelative("m_ConvertToNormalMap"); - m_SpriteMode = textureImporterSettingsSP.FindPropertyRelative("m_SpriteMode"); - m_SpritePixelsToUnits = textureImporterSettingsSP.FindPropertyRelative("m_SpritePixelsToUnits"); - m_SpriteMeshType = textureImporterSettingsSP.FindPropertyRelative("m_SpriteMeshType"); - m_SpriteExtrude = textureImporterSettingsSP.FindPropertyRelative("m_SpriteExtrude"); - m_Alignment = textureImporterSettingsSP.FindPropertyRelative("m_Alignment"); - m_SpritePivot = textureImporterSettingsSP.FindPropertyRelative("m_SpritePivot"); - m_NPOTScale = textureImporterSettingsSP.FindPropertyRelative("m_NPOTScale"); - m_IsReadable = textureImporterSettingsSP.FindPropertyRelative("m_IsReadable"); - m_sRGBTexture = textureImporterSettingsSP.FindPropertyRelative("m_sRGBTexture"); - m_AlphaSource = textureImporterSettingsSP.FindPropertyRelative("m_AlphaSource"); - m_MipMapMode = textureImporterSettingsSP.FindPropertyRelative("m_MipMapMode"); - m_EnableMipMap = textureImporterSettingsSP.FindPropertyRelative("m_EnableMipMap"); - m_FadeOut = textureImporterSettingsSP.FindPropertyRelative("m_FadeOut"); - m_BorderMipMap = textureImporterSettingsSP.FindPropertyRelative("m_BorderMipMap"); - m_MipMapsPreserveCoverage = textureImporterSettingsSP.FindPropertyRelative("m_MipMapsPreserveCoverage"); - m_AlphaTestReferenceValue = textureImporterSettingsSP.FindPropertyRelative("m_AlphaTestReferenceValue"); - m_MipMapFadeDistanceStart = textureImporterSettingsSP.FindPropertyRelative("m_MipMapFadeDistanceStart"); - m_MipMapFadeDistanceEnd = textureImporterSettingsSP.FindPropertyRelative("m_MipMapFadeDistanceEnd"); - m_AlphaIsTransparency = textureImporterSettingsSP.FindPropertyRelative("m_AlphaIsTransparency"); - m_FilterMode = textureImporterSettingsSP.FindPropertyRelative("m_FilterMode"); - m_Aniso = textureImporterSettingsSP.FindPropertyRelative("m_Aniso"); - m_WrapU = textureImporterSettingsSP.FindPropertyRelative("m_WrapU"); - m_WrapV = textureImporterSettingsSP.FindPropertyRelative("m_WrapV"); - m_WrapW = textureImporterSettingsSP.FindPropertyRelative("m_WrapW"); - - var textureWidth = serializedObject.FindProperty("m_TextureActualWidth"); - var textureHeight = serializedObject.FindProperty("m_TextureActualHeight"); - m_IsPOT = Mathf.IsPowerOfTwo(textureWidth.intValue) && Mathf.IsPowerOfTwo(textureHeight.intValue); - - var assetPath = AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID.stringValue); - m_SkeletonAsset = AssetDatabase.LoadAssetAtPath(assetPath); - - var advanceGUIAction = new Action[] - { - ColorSpaceGUI, - AlphaHandlingGUI, - POTScaleGUI, - ReadableGUI, - MipMapGUI - }; - m_AdvanceInspectorGUI.Add(TextureImporterType.Sprite, advanceGUIAction); - - advanceGUIAction = new Action[] - { - POTScaleGUI, - ReadableGUI, - MipMapGUI - }; - m_AdvanceInspectorGUI.Add(TextureImporterType.Default, advanceGUIAction); - LoadPlatformSettings(); - m_TexturePlatformSettingsHelper = new TexturePlatformSettingsHelper(this); - } - - /// - /// Implementation of AssetImporterEditor.OnInspectorGUI - /// - public override void OnInspectorGUI() - { - serializedObject.Update(); - if (s_Styles == null) - s_Styles = new Styles(); - - EditorGUI.showMixedValue = m_TextureType.hasMultipleDifferentValues; - m_TextureType.intValue = EditorGUILayout.IntPopup(s_Styles.textureTypeTitle, m_TextureType.intValue, s_Styles.textureTypeOptions, s_Styles.textureTypeValues); - EditorGUI.showMixedValue = false; - - switch ((TextureImporterType)m_TextureType.intValue) - { - case TextureImporterType.Sprite: - DoSpriteInspector(); - break; - case TextureImporterType.Default: - DoTextureDefaultInspector(); - break; - default: - Debug.LogWarning("We only support Default or Sprite texture type for now. Texture type is set to default."); - m_TextureType.intValue = (int)TextureImporterType.Default; - break; - } - - DoAdvanceInspector(); - CommonTextureSettingsGUI(); - GUILayout.Space(10); - DoPlatformSettings(); - serializedObject.ApplyModifiedProperties(); - ApplyRevertGUI(); - } - - void MainRigPropertyField() - { - EditorGUI.BeginChangeCheck(); - m_SkeletonAsset = EditorGUILayout.ObjectField(s_Styles.mainSkeletonName, m_SkeletonAsset, typeof(SkeletonAsset), false) as SkeletonAsset; - if (EditorGUI.EndChangeCheck()) - { - var referencePath = AssetDatabase.GetAssetPath(m_SkeletonAsset); - if (referencePath == ((AssetImporter) target).assetPath) - m_SkeletonAssetReferenceID.stringValue = ""; - else - m_SkeletonAssetReferenceID.stringValue = AssetDatabase.GUIDFromAssetPath(referencePath).ToString(); - } - } - - /// - /// Implementation of AssetImporterEditor.Apply - /// - protected override void Apply() - { - FileStream fileStream = new FileStream(((AssetImporter)target).assetPath, FileMode.Open, FileAccess.Read); - var doc = PaintDotNet.Data.PhotoshopFileType.PsdLoad.Load(fileStream, ELoadFlag.Header | ELoadFlag.ColorMode); - - PSDApplyEvent evt = new PSDApplyEvent() - { - instance_id = target.GetInstanceID(), - texture_type = m_TextureType.intValue, - sprite_mode = m_SpriteMode.intValue, - mosaic_layer = m_MosaicLayers.boolValue, - import_hidden_layer = m_ImportHiddenLayers.boolValue, - character_mode = m_CharacterMode.boolValue, - generate_go_hierarchy = m_GenerateGOHierarchy.boolValue, - reslice_from_layer = m_ResliceFromLayer.boolValue, - is_character_rigged = IsCharacterRigged(), - is_psd = IsPSD(doc), - color_mode = FileColorMode(doc) - }; - doc.Cleanup(); - AnalyticFactory.analytics.SendApplyEvent(evt); - m_TexturePlatformSettingsHelper.Apply(); - base.Apply(); - Selection.activeObject = null; - Unsupported.SceneTrackerFlushDirty(); - PSDImportPostProcessor.currentApplyAssetPath = ((PSDImporter) target).assetPath; - } - - static bool IsPSD(PsdFile doc) - { - return !doc.IsLargeDocument; - } - - static PsdColorMode FileColorMode(PsdFile doc) - { - return doc.ColorMode; - } - - bool IsCharacterRigged() - { - var importer = target as PSDImporter; - if (importer != null) - { - var characterProvider = importer.GetDataProvider(); - var meshDataProvider = importer.GetDataProvider(); - if (characterProvider != null && meshDataProvider != null) - { - var character = characterProvider.GetCharacterData(); - foreach (var parts in character.parts) - { - var vert = meshDataProvider.GetVertices(new GUID(parts.spriteId)); - var indices = meshDataProvider.GetIndices(new GUID(parts.spriteId)); - if (parts.bones != null && parts.bones.Length > 0 && - vert != null && vert.Length > 0 && - indices != null && indices.Length > 0) - return true; - } - } - } - return false; - } - - Dictionary> m_PlatfromSettings = new Dictionary>(); - void LoadPlatformSettings() - { - foreach (var t in targets) - { - var importer = ((PSDImporter)t); - var importerPlatformSettings = importer.GetAllPlatformSettings(); - for (int i = 0; i < importerPlatformSettings.Length; ++i) - { - var tip = importerPlatformSettings[i]; - List platformSettings = null; - m_PlatfromSettings.TryGetValue(tip.name, out platformSettings); - if (platformSettings == null) - { - platformSettings = new List(); - m_PlatfromSettings.Add(tip.name, platformSettings); - } - platformSettings.Add(tip); - } - } - } - - void StorePlatformSettings() - { - var platformSettingsSP = serializedObject.FindProperty("m_PlatformSettings"); - platformSettingsSP.ClearArray(); - foreach (var keyValue in m_PlatfromSettings) - { - if (!keyValue.Value[0].overridden) - continue; - - SerializedProperty platformSettingSP = null; - for (int i = 0; i < platformSettingsSP.arraySize; ++i) - { - var sp = platformSettingsSP.GetArrayElementAtIndex(i); - if (sp.FindPropertyRelative("m_Name").stringValue == keyValue.Key) - platformSettingSP = sp; - } - if (platformSettingSP == null) - { - platformSettingsSP.InsertArrayElementAtIndex(platformSettingsSP.arraySize); - platformSettingSP = platformSettingsSP.GetArrayElementAtIndex(platformSettingsSP.arraySize - 1); - } - - var tip = keyValue.Value[0]; - platformSettingSP.FindPropertyRelative("m_Name").stringValue = tip.name; - platformSettingSP.FindPropertyRelative("m_Overridden").intValue = tip.overridden ? 1 : 0; - platformSettingSP.FindPropertyRelative("m_MaxTextureSize").intValue = tip.maxTextureSize; - platformSettingSP.FindPropertyRelative("m_ResizeAlgorithm").intValue = (int)tip.resizeAlgorithm; - platformSettingSP.FindPropertyRelative("m_TextureFormat").intValue = (int)tip.format; - platformSettingSP.FindPropertyRelative("m_TextureCompression").intValue = (int)tip.textureCompression; - platformSettingSP.FindPropertyRelative("m_CompressionQuality").intValue = tip.compressionQuality; - platformSettingSP.FindPropertyRelative("m_CrunchedCompression").intValue = tip.crunchedCompression ? 1 : 0; - platformSettingSP.FindPropertyRelative("m_AllowsAlphaSplitting").intValue = tip.allowsAlphaSplitting ? 1 : 0; - } - } - - void DoPlatformSettings() - { - m_TexturePlatformSettingsHelper.ShowPlatformSpecificSettings(); - } - - void DoAdvanceInspector() - { - if (!m_TextureType.hasMultipleDifferentValues) - { - if (m_AdvanceInspectorGUI.ContainsKey((TextureImporterType)m_TextureType.intValue)) - { - EditorGUILayout.Space(); - - m_ShowAdvanced = EditorGUILayout.Foldout(m_ShowAdvanced, s_Styles.showAdvanced, true); - if (m_ShowAdvanced) - { - foreach (var action in m_AdvanceInspectorGUI[(TextureImporterType)m_TextureType.intValue]) - { - action(); - } - } - } - } - EditorGUILayout.Space(); - } - - void CommonTextureSettingsGUI() - { - EditorGUI.BeginChangeCheck(); - - // Wrap mode - bool isVolume = false; - WrapModePopup(m_WrapU, m_WrapV, m_WrapW, isVolume, ref m_ShowPerAxisWrapModes); - - - // Display warning about repeat wrap mode on restricted npot emulation - if (m_NPOTScale.intValue == (int)TextureImporterNPOTScale.None && - (m_WrapU.intValue == (int)TextureWrapMode.Repeat || m_WrapV.intValue == (int)TextureWrapMode.Repeat) && - !InternalEditorBridge.DoesHardwareSupportsFullNPOT()) - { - bool displayWarning = false; - foreach (var target in targets) - { - var imp = (PSDImporter)target; - int w = imp.textureActualWidth; - int h = imp.textureActualHeight; - if (!Mathf.IsPowerOfTwo(w) || !Mathf.IsPowerOfTwo(h)) - { - displayWarning = true; - break; - } - } - - if (displayWarning) - { - EditorGUILayout.HelpBox(s_Styles.warpNotSupportWarning.text, MessageType.Warning, true); - } - } - - // Filter mode - EditorGUI.showMixedValue = m_FilterMode.hasMultipleDifferentValues; - FilterMode filter = (FilterMode)m_FilterMode.intValue; - if ((int)filter == -1) - { - if (m_FadeOut.intValue > 0 || m_ConvertToNormalMap.intValue > 0) - filter = FilterMode.Trilinear; - else - filter = FilterMode.Bilinear; - } - filter = (FilterMode)EditorGUILayout.IntPopup(s_Styles.filterMode, (int)filter, s_Styles.filterModeOptions, m_FilterModeOptions); - EditorGUI.showMixedValue = false; - if (EditorGUI.EndChangeCheck()) - m_FilterMode.intValue = (int)filter; - - // Aniso - bool showAniso = (FilterMode)m_FilterMode.intValue != FilterMode.Point - && m_EnableMipMap.intValue > 0 - && (TextureImporterShape)m_TextureShape.intValue != TextureImporterShape.TextureCube; - using (new EditorGUI.DisabledScope(!showAniso)) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = m_Aniso.hasMultipleDifferentValues; - int aniso = m_Aniso.intValue; - if (aniso == -1) - aniso = 1; - aniso = EditorGUILayout.IntSlider(s_Styles.anisoLevelLabel, aniso, 0, 16); - EditorGUI.showMixedValue = false; - if (EditorGUI.EndChangeCheck()) - m_Aniso.intValue = aniso; - - if (aniso > 1) - { - if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.Disable) - EditorGUILayout.HelpBox(s_Styles.anisotropicDisableInfo.text, MessageType.Info); - else if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.ForceEnable) - EditorGUILayout.HelpBox(s_Styles.anisotropicForceEnableInfo.text, MessageType.Info); - } - } - } - - private static bool IsAnyTextureObjectUsingPerAxisWrapMode(UnityEngine.Object[] objects, bool isVolumeTexture) - { - foreach (var o in objects) - { - int u = 0, v = 0, w = 0; - // the objects can be Textures themselves, or texture-related importers - if (o is Texture) - { - var ti = (Texture)o; - u = (int)ti.wrapModeU; - v = (int)ti.wrapModeV; - w = (int)ti.wrapModeW; - } - if (o is TextureImporter) - { - var ti = (TextureImporter)o; - u = (int)ti.wrapModeU; - v = (int)ti.wrapModeV; - w = (int)ti.wrapModeW; - } - if (o is IHVImageFormatImporter) - { - var ti = (IHVImageFormatImporter)o; - u = (int)ti.wrapModeU; - v = (int)ti.wrapModeV; - w = (int)ti.wrapModeW; - } - u = Mathf.Max(0, u); - v = Mathf.Max(0, v); - w = Mathf.Max(0, w); - if (u != v) - { - return true; - } - if (isVolumeTexture) - { - if (u != w || v != w) - { - return true; - } - } - } - return false; - } - - // showPerAxisWrapModes is state of whether "Per-Axis" mode should be active in the main dropdown. - // It is set automatically if wrap modes in UVW are different, or if user explicitly picks "Per-Axis" option -- when that one is picked, - // then it should stay true even if UVW wrap modes will initially be the same. - // - // Note: W wrapping mode is only shown when isVolumeTexture is true. - internal static void WrapModePopup(SerializedProperty wrapU, SerializedProperty wrapV, SerializedProperty wrapW, bool isVolumeTexture, ref bool showPerAxisWrapModes) - { - if (s_Styles == null) - s_Styles = new Styles(); - - // In texture importer settings, serialized properties for things like wrap modes can contain -1; - // that seems to indicate "use defaults, user has not changed them to anything" but not totally sure. - // Show them as Repeat wrap modes in the popups. - var wu = (TextureWrapMode)Mathf.Max(wrapU.intValue, 0); - var wv = (TextureWrapMode)Mathf.Max(wrapV.intValue, 0); - var ww = (TextureWrapMode)Mathf.Max(wrapW.intValue, 0); - - // automatically go into per-axis mode if values are already different - if (wu != wv) - showPerAxisWrapModes = true; - if (isVolumeTexture) - { - if (wu != ww || wv != ww) - showPerAxisWrapModes = true; - } - - // It's not possible to determine whether any single texture in the whole selection is using per-axis wrap modes - // just from SerializedProperty values. They can only tell if "some values in whole selection are different" (e.g. - // wrap value on U axis is not the same among all textures), and can return value of "some" object in the selection - // (typically based on object loading order). So in order for more intuitive behavior with multi-selection, - // we go over the actual objects when there's >1 object selected and some wrap modes are different. - if (!showPerAxisWrapModes) - { - if (wrapU.hasMultipleDifferentValues || wrapV.hasMultipleDifferentValues || (isVolumeTexture && wrapW.hasMultipleDifferentValues)) - { - if (IsAnyTextureObjectUsingPerAxisWrapMode(wrapU.serializedObject.targetObjects, isVolumeTexture)) - { - showPerAxisWrapModes = true; - } - } - } - - int value = showPerAxisWrapModes ? -1 : (int)wu; - - // main wrap mode popup - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = !showPerAxisWrapModes && (wrapU.hasMultipleDifferentValues || wrapV.hasMultipleDifferentValues || (isVolumeTexture && wrapW.hasMultipleDifferentValues)); - value = EditorGUILayout.IntPopup(s_Styles.wrapModeLabel, value, s_Styles.wrapModeContents, s_Styles.wrapModeValues); - if (EditorGUI.EndChangeCheck() && value != -1) - { - // assign the same wrap mode to all axes, and hide per-axis popups - wrapU.intValue = value; - wrapV.intValue = value; - wrapW.intValue = value; - showPerAxisWrapModes = false; - } - - // show per-axis popups if needed - if (value == -1) - { - showPerAxisWrapModes = true; - EditorGUI.indentLevel++; - WrapModeAxisPopup(s_Styles.wrapU, wrapU); - WrapModeAxisPopup(s_Styles.wrapV, wrapV); - if (isVolumeTexture) - { - WrapModeAxisPopup(s_Styles.wrapW, wrapW); - } - EditorGUI.indentLevel--; - } - EditorGUI.showMixedValue = false; - } - - static void WrapModeAxisPopup(GUIContent label, SerializedProperty wrapProperty) - { - // In texture importer settings, serialized properties for wrap modes can contain -1, which means "use default". - var wrap = (TextureWrapMode)Mathf.Max(wrapProperty.intValue, 0); - Rect rect = EditorGUILayout.GetControlRect(); - EditorGUI.BeginChangeCheck(); - EditorGUI.BeginProperty(rect, label, wrapProperty); - wrap = (TextureWrapMode)EditorGUI.EnumPopup(rect, label, wrap); - EditorGUI.EndProperty(); - if (EditorGUI.EndChangeCheck()) - { - wrapProperty.intValue = (int)wrap; - } - } - - void DoWrapModePopup() - { - WrapModePopup(m_WrapU, m_WrapV, m_WrapW, IsVolume(), ref m_ShowPerAxisWrapModes); - } - - bool IsVolume() - { - var t = target as Texture; - return t != null && t.dimension == UnityEngine.Rendering.TextureDimension.Tex3D; - } - - void DoSpriteInspector() - { - EditorGUI.BeginChangeCheck(); - EditorGUILayout.IntPopup(m_SpriteMode, s_Styles.spriteModeOptions, new[] { 1, 2, 3 }, s_Styles.spriteMode); - - // Ensure that PropertyField focus will be cleared when we change spriteMode. - if (EditorGUI.EndChangeCheck()) - { - GUIUtility.keyboardControl = 0; - } - - EditorGUI.indentLevel++; - - // Show generic attributes - if (m_SpriteMode.intValue != 0) - { - EditorGUILayout.PropertyField(m_SpritePixelsToUnits, s_Styles.spritePixelsPerUnit); - - if (m_SpriteMode.intValue != (int)SpriteImportMode.Polygon && !m_SpriteMode.hasMultipleDifferentValues) - { - EditorGUILayout.IntPopup(m_SpriteMeshType, s_Styles.spriteMeshTypeOptions, new[] { 0, 1 }, s_Styles.spriteMeshType); - } - - EditorGUILayout.IntSlider(m_SpriteExtrude, 0, 32, s_Styles.spriteExtrude); - - if (m_SpriteMode.intValue == 1) - { - EditorGUILayout.IntPopup(m_Alignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.spriteAlignment); - - if (m_Alignment.intValue == (int)SpriteAlignment.Custom) - { - GUILayout.BeginHorizontal(); - EditorGUILayout.PropertyField(m_SpritePivot, new GUIContent()); - GUILayout.EndHorizontal(); - } - } - } - - EditorGUILayout.PropertyField(m_ImportHiddenLayers, s_Styles.importHiddenLayer); - if (m_SpriteMode.intValue == (int)SpriteImportMode.Multiple && !m_SpriteMode.hasMultipleDifferentValues) - { - EditorGUILayout.PropertyField(m_MosaicLayers, s_Styles.mosaicLayers); - using (new EditorGUI.DisabledScope(!m_MosaicLayers.boolValue)) - { - EditorGUILayout.PropertyField(m_CharacterMode, s_Styles.characterMode); - using (new EditorGUI.DisabledScope(!m_CharacterMode.boolValue)) - { - EditorGUILayout.PropertyField(m_GenerateGOHierarchy, s_Styles.generateGOHierarchy); - EditorGUILayout.IntPopup(m_DocumentAlignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.characterAlignment); - if (m_DocumentAlignment.intValue == (int)SpriteAlignment.Custom) - { - GUILayout.BeginHorizontal(); - GUILayout.Space(EditorGUIUtility.labelWidth); - EditorGUILayout.PropertyField(m_DocumentPivot, new GUIContent()); - GUILayout.EndHorizontal(); - } - //EditorGUILayout.PropertyField(m_PaperDollMode, s_Styles.paperDollMode); - MainRigPropertyField(); - } - - - EditorGUILayout.PropertyField(m_ResliceFromLayer, s_Styles.resliceFromLayer); - if (m_ResliceFromLayer.boolValue) - { - EditorGUILayout.HelpBox(s_Styles.resliceFromLayerWarning.text, MessageType.Info, true); - } - } - - EditorGUILayout.PropertyField(m_KeepDupilcateSpriteName, s_Styles.keepDuplicateSpriteName); - } - - using (new EditorGUI.DisabledScope(targets.Length != 1)) - { - GUILayout.BeginHorizontal(); - - GUILayout.FlexibleSpace(); - if (GUILayout.Button(s_Styles.spriteEditorButtonLabel)) - { - if (HasModified()) - { - // To ensure Sprite Editor Window to have the latest texture import setting, - // We must applied those modified values first. - string dialogText = string.Format(s_Styles.unappliedSettingsDialogContent.text, ((AssetImporter)target).assetPath); - if (EditorUtility.DisplayDialog(s_Styles.unappliedSettingsDialogTitle.text, - dialogText, s_Styles.applyButtonLabel.text, s_Styles.revertButtonLabel.text)) - { - ApplyAndImport(); - InternalEditorBridge.ShowSpriteEditorWindow(this.assetTarget); - - // We reimported the asset which destroyed the editor, so we can't keep running the UI here. - GUIUtility.ExitGUI(); - } - } - else - { - InternalEditorBridge.ShowSpriteEditorWindow(this.assetTarget); - } - } - GUILayout.EndHorizontal(); - } - EditorGUI.indentLevel--; - } - - void DoTextureDefaultInspector() - { - ColorSpaceGUI(); - AlphaHandlingGUI(); - } - - void ColorSpaceGUI() - { - ToggleFromInt(m_sRGBTexture, s_Styles.sRGBTexture); - } - - void POTScaleGUI() - { - using (new EditorGUI.DisabledScope(m_IsPOT || m_TextureType.intValue == (int)TextureImporterType.Sprite)) - { - EnumPopup(m_NPOTScale, typeof(TextureImporterNPOTScale), s_Styles.npot); - } - } - - void ReadableGUI() - { - ToggleFromInt(m_IsReadable, s_Styles.readWrite); - } - - void AlphaHandlingGUI() - { - EditorGUI.showMixedValue = m_AlphaSource.hasMultipleDifferentValues; - EditorGUI.BeginChangeCheck(); - int newAlphaUsage = EditorGUILayout.IntPopup(s_Styles.alphaSource, m_AlphaSource.intValue, s_Styles.alphaSourceOptions, s_Styles.alphaSourceValues); - - EditorGUI.showMixedValue = false; - if (EditorGUI.EndChangeCheck()) - { - m_AlphaSource.intValue = newAlphaUsage; - } - - bool showAlphaIsTransparency = (TextureImporterAlphaSource)m_AlphaSource.intValue != TextureImporterAlphaSource.None; - using (new EditorGUI.DisabledScope(!showAlphaIsTransparency)) - { - ToggleFromInt(m_AlphaIsTransparency, s_Styles.alphaIsTransparency); - } - } - - void MipMapGUI() - { - ToggleFromInt(m_EnableMipMap, s_Styles.generateMipMaps); - - if (m_EnableMipMap.boolValue && !m_EnableMipMap.hasMultipleDifferentValues) - { - EditorGUI.indentLevel++; - ToggleFromInt(m_BorderMipMap, s_Styles.borderMipMaps); - EditorGUILayout.Popup(s_Styles.mipMapFilter, m_MipMapMode.intValue, s_Styles.mipMapFilterOptions); - - ToggleFromInt(m_MipMapsPreserveCoverage, s_Styles.mipMapsPreserveCoverage); - if (m_MipMapsPreserveCoverage.intValue != 0 && !m_MipMapsPreserveCoverage.hasMultipleDifferentValues) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(m_AlphaTestReferenceValue, s_Styles.alphaTestReferenceValue); - EditorGUI.indentLevel--; - } - - // Mipmap fadeout - ToggleFromInt(m_FadeOut, s_Styles.mipmapFadeOutToggle); - if (m_FadeOut.intValue > 0) - { - EditorGUI.indentLevel++; - EditorGUI.BeginChangeCheck(); - float min = m_MipMapFadeDistanceStart.intValue; - float max = m_MipMapFadeDistanceEnd.intValue; - EditorGUILayout.MinMaxSlider(s_Styles.mipmapFadeOut, ref min, ref max, 0, 10); - if (EditorGUI.EndChangeCheck()) - { - m_MipMapFadeDistanceStart.intValue = Mathf.RoundToInt(min); - m_MipMapFadeDistanceEnd.intValue = Mathf.RoundToInt(max); - } - EditorGUI.indentLevel--; - } - EditorGUI.indentLevel--; - } - } - - void ToggleFromInt(SerializedProperty property, GUIContent label) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = property.hasMultipleDifferentValues; - int value = EditorGUILayout.Toggle(label, property.intValue > 0) ? 1 : 0; - EditorGUI.showMixedValue = false; - if (EditorGUI.EndChangeCheck()) - property.intValue = value; - } - - void EnumPopup(SerializedProperty property, System.Type type, GUIContent label) - { - EditorGUILayout.IntPopup(label.text, property.intValue, - System.Enum.GetNames(type), - System.Enum.GetValues(type) as int[]); - } - - void ExportMosaicTexture() - { - var assetPath = ((AssetImporter)target).assetPath; - var texture2D = AssetDatabase.LoadAssetAtPath(assetPath); - if (texture2D == null) - return; - if (!texture2D.isReadable) - texture2D = InternalEditorBridge.CreateTemporaryDuplicate(texture2D, texture2D.width, texture2D.height); - var pixelData = texture2D.GetPixels(); - texture2D = new Texture2D(texture2D.width, texture2D.height); - texture2D.SetPixels(pixelData); - texture2D.Apply(); - byte[] bytes = texture2D.EncodeToPNG(); - var fileName = Path.GetFileNameWithoutExtension(assetPath); - var filePath = Path.GetDirectoryName(assetPath); - var savePath = Path.Combine(filePath, fileName + ".png"); - File.WriteAllBytes(savePath, bytes); - AssetDatabase.Refresh(); - } - - protected override void ResetValues() - { - base.ResetValues(); - LoadPlatformSettings(); - m_TexturePlatformSettingsHelper = new TexturePlatformSettingsHelper(this); - } - - public int GetTargetCount() - { - return targets.Length; - } - - public TextureImporterPlatformSettings GetPlatformTextureSettings(int i, string name) - { - if(m_PlatfromSettings.ContainsKey(name)) - if(m_PlatfromSettings[name].Count > i) - return m_PlatfromSettings[name][i]; - return new TextureImporterPlatformSettings() - { - name = name, - overridden = false - }; - } - - public bool ShowPresetSettings() - { - return assetTarget == null; - } - - public bool DoesSourceTextureHaveAlpha(int v) - { - return true; - } - - public bool IsSourceTextureHDR(int v) - { - return false; - } - - public void SetPlatformTextureSettings(int i, TextureImporterPlatformSettings platformSettings) - { - var psdImporter = ((PSDImporter)targets[i]); - psdImporter.SetPlatformTextureSettings(platformSettings); - psdImporter.Apply(); - } - - public void GetImporterSettings(int i, TextureImporterSettings settings) - { - ((PSDImporter)targets[i]).ReadTextureSettings(settings); - // Get settings that have been changed in the inspector - GetSerializedPropertySettings(settings); - } - - internal TextureImporterSettings GetSerializedPropertySettings(TextureImporterSettings settings) - { - if (!m_AlphaSource.hasMultipleDifferentValues) - settings.alphaSource = (TextureImporterAlphaSource)m_AlphaSource.intValue; - - if (!m_ConvertToNormalMap.hasMultipleDifferentValues) - settings.convertToNormalMap = m_ConvertToNormalMap.intValue > 0; - - if (!m_BorderMipMap.hasMultipleDifferentValues) - settings.borderMipmap = m_BorderMipMap.intValue > 0; - - if (!m_MipMapsPreserveCoverage.hasMultipleDifferentValues) - settings.mipMapsPreserveCoverage = m_MipMapsPreserveCoverage.intValue > 0; - - if (!m_AlphaTestReferenceValue.hasMultipleDifferentValues) - settings.alphaTestReferenceValue = m_AlphaTestReferenceValue.floatValue; - - if (!m_NPOTScale.hasMultipleDifferentValues) - settings.npotScale = (TextureImporterNPOTScale)m_NPOTScale.intValue; - - if (!m_IsReadable.hasMultipleDifferentValues) - settings.readable = m_IsReadable.intValue > 0; - - if (!m_sRGBTexture.hasMultipleDifferentValues) - settings.sRGBTexture = m_sRGBTexture.intValue > 0; - - if (!m_EnableMipMap.hasMultipleDifferentValues) - settings.mipmapEnabled = m_EnableMipMap.intValue > 0; - - if (!m_MipMapMode.hasMultipleDifferentValues) - settings.mipmapFilter = (TextureImporterMipFilter)m_MipMapMode.intValue; - - if (!m_FadeOut.hasMultipleDifferentValues) - settings.fadeOut = m_FadeOut.intValue > 0; - - if (!m_MipMapFadeDistanceStart.hasMultipleDifferentValues) - settings.mipmapFadeDistanceStart = m_MipMapFadeDistanceStart.intValue; - - if (!m_MipMapFadeDistanceEnd.hasMultipleDifferentValues) - settings.mipmapFadeDistanceEnd = m_MipMapFadeDistanceEnd.intValue; - - if (!m_SpriteMode.hasMultipleDifferentValues) - settings.spriteMode = m_SpriteMode.intValue; - - if (!m_SpritePixelsToUnits.hasMultipleDifferentValues) - settings.spritePixelsPerUnit = m_SpritePixelsToUnits.floatValue; - - if (!m_SpriteExtrude.hasMultipleDifferentValues) - settings.spriteExtrude = (uint)m_SpriteExtrude.intValue; - - if (!m_SpriteMeshType.hasMultipleDifferentValues) - settings.spriteMeshType = (SpriteMeshType)m_SpriteMeshType.intValue; - - if (!m_Alignment.hasMultipleDifferentValues) - settings.spriteAlignment = m_Alignment.intValue; - - if (!m_SpritePivot.hasMultipleDifferentValues) - settings.spritePivot = m_SpritePivot.vector2Value; - - if (!m_WrapU.hasMultipleDifferentValues) - settings.wrapModeU = (TextureWrapMode)m_WrapU.intValue; - if (!m_WrapV.hasMultipleDifferentValues) - settings.wrapModeU = (TextureWrapMode)m_WrapV.intValue; - if (!m_WrapW.hasMultipleDifferentValues) - settings.wrapModeU = (TextureWrapMode)m_WrapW.intValue; - - if (!m_FilterMode.hasMultipleDifferentValues) - settings.filterMode = (FilterMode)m_FilterMode.intValue; - - if (!m_Aniso.hasMultipleDifferentValues) - settings.aniso = m_Aniso.intValue; - - - if (!m_AlphaIsTransparency.hasMultipleDifferentValues) - settings.alphaIsTransparency = m_AlphaIsTransparency.intValue > 0; - - if (!m_TextureType.hasMultipleDifferentValues) - settings.textureType = (TextureImporterType)m_TextureType.intValue; - - if (!m_TextureShape.hasMultipleDifferentValues) - settings.textureShape = (TextureImporterShape)m_TextureShape.intValue; - - return settings; - } - /// - /// Override of AssetImporterEditor.showImportedObject - /// The property always returns false so that imported objects does not show up in the Inspector. - /// - /// false - public override bool showImportedObject - { - get { return false; } - } - - public bool textureTypeHasMultipleDifferentValues - { - get { return m_TextureType.hasMultipleDifferentValues; } - } - - public TextureImporterType textureType - { - get { return (TextureImporterType)m_TextureType.intValue; } - } - - public SpriteImportMode spriteImportMode - { - get { return (SpriteImportMode)m_SpriteMode.intValue; } - } - - public override bool HasModified() - { - if (base.HasModified()) - return true; - - return m_TexturePlatformSettingsHelper.HasModified(); - } - - internal class Styles - { - public readonly GUIContent textureTypeTitle = new GUIContent("Texture Type", "What will this texture be used for?"); - public readonly GUIContent[] textureTypeOptions = - { - new GUIContent("Default", "Texture is a normal image such as a diffuse texture or other."), - new GUIContent("Sprite (2D and UI)", "Texture is used for a sprite."), - }; - public readonly int[] textureTypeValues = - { - (int)TextureImporterType.Default, - (int)TextureImporterType.Sprite, - }; - - public readonly GUIContent textureShape = new GUIContent("Texture Shape", "What shape is this texture?"); - private readonly GUIContent textureShape2D = new GUIContent("2D, Texture is 2D."); - private readonly GUIContent textureShapeCube = new GUIContent("Cube", "Texture is a Cubemap."); - public readonly Dictionary textureShapeOptionsDictionnary = new Dictionary(); - public readonly Dictionary textureShapeValuesDictionnary = new Dictionary(); - - - public readonly GUIContent filterMode = new GUIContent("Filter Mode"); - public readonly GUIContent[] filterModeOptions = - { - new GUIContent("Point (no filter)"), - new GUIContent("Bilinear"), - new GUIContent("Trilinear") - }; - - public readonly GUIContent textureFormat = new GUIContent("Format"); - - public readonly GUIContent defaultPlatform = new GUIContent("Default"); - public readonly GUIContent mipmapFadeOutToggle = new GUIContent("Fadeout Mip Maps"); - public readonly GUIContent mipmapFadeOut = new GUIContent("Fade Range"); - public readonly GUIContent readWrite = new GUIContent("Read/Write Enabled", "Enable to be able to access the raw pixel data from code."); - - public readonly GUIContent alphaSource = new GUIContent("Alpha Source", "How is the alpha generated for the imported texture."); - public readonly GUIContent[] alphaSourceOptions = - { - new GUIContent("None", "No Alpha will be used."), - new GUIContent("Input Texture Alpha", "Use Alpha from the input texture if one is provided."), - new GUIContent("From Gray Scale", "Generate Alpha from image gray scale."), - }; - public readonly int[] alphaSourceValues = - { - (int)TextureImporterAlphaSource.None, - (int)TextureImporterAlphaSource.FromInput, - (int)TextureImporterAlphaSource.FromGrayScale, - }; - - public readonly GUIContent generateMipMaps = new GUIContent("Generate Mip Maps"); - public readonly GUIContent sRGBTexture = new GUIContent("sRGB (Color Texture)", "Texture content is stored in gamma space. Non-HDR color textures should enable this flag (except if used for IMGUI)."); - public readonly GUIContent borderMipMaps = new GUIContent("Border Mip Maps"); - public readonly GUIContent mipMapsPreserveCoverage = new GUIContent("Mip Maps Preserve Coverage", "The alpha channel of generated Mip Maps will preserve coverage during the alpha test."); - public readonly GUIContent alphaTestReferenceValue = new GUIContent("Alpha Cutoff Value", "The reference value used during the alpha test. Controls Mip Map coverage."); - public readonly GUIContent mipMapFilter = new GUIContent("Mip Map Filtering"); - public readonly GUIContent[] mipMapFilterOptions = - { - new GUIContent("Box"), - new GUIContent("Kaiser"), - }; - public readonly GUIContent npot = new GUIContent("Non Power of 2", "How non-power-of-two textures are scaled on import."); - - public readonly GUIContent compressionQuality = new GUIContent("Compressor Quality"); - public readonly GUIContent compressionQualitySlider = new GUIContent("Compressor Quality", "Use the slider to adjust compression quality from 0 (Fastest) to 100 (Best)"); - public readonly GUIContent[] mobileCompressionQualityOptions = - { - new GUIContent("Fast"), - new GUIContent("Normal"), - new GUIContent("Best") - }; - - public readonly GUIContent spriteMode = new GUIContent("Sprite Mode"); - public readonly GUIContent[] spriteModeOptions = - { - new GUIContent("Single"), - new GUIContent("Multiple"), - new GUIContent("Polygon"), - }; - public readonly GUIContent[] spriteMeshTypeOptions = - { - new GUIContent("Full Rect"), - new GUIContent("Tight"), - }; - - public readonly GUIContent spritePackingTag = new GUIContent("Packing Tag", "Tag for the Sprite Packing system."); - public readonly GUIContent spritePixelsPerUnit = new GUIContent("Pixels Per Unit", "How many pixels in the sprite correspond to one unit in the world."); - public readonly GUIContent spriteExtrude = new GUIContent("Extrude Edges", "How much empty area to leave around the sprite in the generated mesh."); - public readonly GUIContent spriteMeshType = new GUIContent("Mesh Type", "Type of sprite mesh to generate."); - public readonly GUIContent spriteAlignment = new GUIContent("Pivot", "Sprite pivot point in its local space. May be used for syncing animation frames of different sizes."); - public readonly GUIContent characterAlignment = new GUIContent("Pivot", "Character pivot point in its local space using normalized value i.e. 0 - 1"); - - public readonly GUIContent[] spriteAlignmentOptions = - { - new GUIContent("Center"), - new GUIContent("Top Left"), - new GUIContent("Top"), - new GUIContent("Top Right"), - new GUIContent("Left"), - new GUIContent("Right"), - new GUIContent("Bottom Left"), - new GUIContent("Bottom"), - new GUIContent("Bottom Right"), - new GUIContent("Custom"), - }; - - public readonly GUIContent warpNotSupportWarning = new GUIContent("Graphics device doesn't support Repeat wrap mode on NPOT textures. Falling back to Clamp."); - public readonly GUIContent anisoLevelLabel = new GUIContent("Aniso Level"); - public readonly GUIContent anisotropicDisableInfo = new GUIContent("Anisotropic filtering is disabled for all textures in Quality Settings."); - public readonly GUIContent anisotropicForceEnableInfo = new GUIContent("Anisotropic filtering is enabled for all textures in Quality Settings."); - public readonly GUIContent unappliedSettingsDialogTitle = new GUIContent("Unapplied import settings"); - public readonly GUIContent unappliedSettingsDialogContent = new GUIContent("Unapplied import settings for \'{0}\'.\nApply and continue to sprite editor or cancel."); - public readonly GUIContent applyButtonLabel = new GUIContent("Apply"); - public readonly GUIContent revertButtonLabel = new GUIContent("Revert"); - public readonly GUIContent spriteEditorButtonLabel = new GUIContent("Sprite Editor"); - public readonly GUIContent resliceFromLayerWarning = new GUIContent("This will reinitialize and recreate all Sprites based on the file’s layer data. Existing Sprite metadata from previously generated Sprites are copied over."); - public readonly GUIContent alphaIsTransparency = new GUIContent("Alpha Is Transparency", "If the provided alpha channel is transparency, enable this to pre-filter the color to avoid texture filtering artifacts. This is not supported for HDR textures."); - public readonly GUIContent etc1Compression = new GUIContent("Compress using ETC1 (split alpha channel)|Alpha for this texture will be preserved by splitting the alpha channel to another texture, and both resulting textures will be compressed using ETC1."); - public readonly GUIContent crunchedCompression = new GUIContent("Use Crunch Compression", "Texture is crunch-compressed to save space on disk when applicable."); - - public readonly GUIContent showAdvanced = new GUIContent("Advanced", "Show advanced settings."); - - public readonly GUIContent platformSettingsLabel = new GUIContent("Platform Setttings"); - - public readonly GUIContent[] platformSettingsSelection; - - public readonly GUIContent wrapModeLabel = new GUIContent("Wrap Mode"); - public readonly GUIContent wrapU = new GUIContent("U axis"); - public readonly GUIContent wrapV = new GUIContent("V axis"); - public readonly GUIContent wrapW = new GUIContent("W axis"); - - - public readonly GUIContent[] wrapModeContents = - { - new GUIContent("Repeat"), - new GUIContent("Clamp"), - new GUIContent("Mirror"), - new GUIContent("Mirror Once"), - new GUIContent("Per-axis") - }; - public readonly int[] wrapModeValues = - { - (int)TextureWrapMode.Repeat, - (int)TextureWrapMode.Clamp, - (int)TextureWrapMode.Mirror, - (int)TextureWrapMode.MirrorOnce, - -1 - }; - - public readonly GUIContent importHiddenLayer = new GUIContent(L10n.Tr("Import Hidden"), L10n.Tr("Import hidden layers")); - public readonly GUIContent mosaicLayers = new GUIContent(L10n.Tr("Mosaic"), L10n.Tr("Layers will be imported as individual Sprites")); - public readonly GUIContent characterMode = new GUIContent(L10n.Tr("Character Rig"), L10n.Tr("Enable to support 2D Animation character rigging")); - public readonly GUIContent generateGOHierarchy = new GUIContent(L10n.Tr("Use Layer Grouping"), L10n.Tr("GameObjects are grouped according to source file layer grouping")); - public readonly GUIContent resliceFromLayer = new GUIContent(L10n.Tr("Reslice"), L10n.Tr("Recreate Sprite rects from file")); - public readonly GUIContent paperDollMode = new GUIContent(L10n.Tr("Paper Doll Mode"), L10n.Tr("Special mode to generate a Prefab for Paper Doll use case")); - public readonly GUIContent keepDuplicateSpriteName = new GUIContent(L10n.Tr("Keep Duplicate Name"), L10n.Tr("Keep Sprite name same as Layer Name even if there are duplicated Layer Name")); - public readonly GUIContent mainSkeletonName = new GUIContent(L10n.Tr("Main Skeleton"), L10n.Tr("Main Skeleton to use for Rigging")); - - public Styles() - { - // This is far from ideal, but it's better than having tons of logic in the GUI code itself. - // The combination should not grow too much anyway since only Texture3D will be added later. - GUIContent[] s2D_Options = { textureShape2D }; - GUIContent[] sCube_Options = { textureShapeCube }; - GUIContent[] s2D_Cube_Options = { textureShape2D, textureShapeCube }; - textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D, s2D_Options); - textureShapeOptionsDictionnary.Add(TextureImporterShape.TextureCube, sCube_Options); - textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Options); - - int[] s2D_Values = { (int)TextureImporterShape.Texture2D }; - int[] sCube_Values = { (int)TextureImporterShape.TextureCube }; - int[] s2D_Cube_Values = { (int)TextureImporterShape.Texture2D, (int)TextureImporterShape.TextureCube }; - textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D, s2D_Values); - textureShapeValuesDictionnary.Add(TextureImporterShape.TextureCube, sCube_Values); - textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Values); - - platformSettingsSelection = new GUIContent[TexturePlatformSettingsModal.kValidBuildPlatform.Length]; - for (int i = 0; i < TexturePlatformSettingsModal.kValidBuildPlatform.Length; ++i) - { - platformSettingsSelection[i] = new GUIContent(TexturePlatformSettingsModal.kValidBuildPlatform[i].buildTargetName); - } - } - } - - internal static Styles s_Styles; - } -} +using System; +using System.Collections.Generic; +using System.IO; +using PhotoshopFile; +using UnityEditor.AssetImporters; +using UnityEditor.IMGUI.Controls; +using UnityEditor.U2D.Animation; +using UnityEditor.U2D.Common; +using UnityEditor.U2D.Sprites; +using UnityEngine; +using UnityEngine.Scripting.APIUpdating; +using UnityEngine.U2D.Animation; +using UnityEngine.UIElements; +using UnityEngine.U2D.Common; + +namespace UnityEditor.U2D.PSD +{ + /// + /// Inspector for PSDImporter + /// + [CustomEditor(typeof(PSDImporter))] + [MovedFrom("UnityEditor.Experimental.AssetImporters")] + public class PSDImporterEditor : ScriptedImporterEditor, ITexturePlatformSettingsDataProvider + { + SerializedProperty m_TextureType; + SerializedProperty m_TextureShape; + SerializedProperty m_SpriteMode; + SerializedProperty m_SpritePixelsToUnits; + SerializedProperty m_SpriteMeshType; + SerializedProperty m_SpriteExtrude; + SerializedProperty m_Alignment; + SerializedProperty m_SpritePivot; + SerializedProperty m_NPOTScale; + SerializedProperty m_IsReadable; + SerializedProperty m_sRGBTexture; + SerializedProperty m_AlphaSource; + SerializedProperty m_MipMapMode; + SerializedProperty m_EnableMipMap; + SerializedProperty m_FadeOut; + SerializedProperty m_BorderMipMap; + SerializedProperty m_MipMapsPreserveCoverage; + SerializedProperty m_AlphaTestReferenceValue; + SerializedProperty m_MipMapFadeDistanceStart; + SerializedProperty m_MipMapFadeDistanceEnd; + SerializedProperty m_AlphaIsTransparency; + SerializedProperty m_FilterMode; + SerializedProperty m_Aniso; + + SerializedProperty m_WrapU; + SerializedProperty m_WrapV; + SerializedProperty m_WrapW; + SerializedProperty m_ConvertToNormalMap; + SerializedProperty m_MosaicLayers; + SerializedProperty m_ImportHiddenLayers; + SerializedProperty m_ResliceFromLayer; + SerializedProperty m_CharacterMode; + SerializedProperty m_DocumentPivot; + SerializedProperty m_DocumentAlignment; + SerializedProperty m_GenerateGOHierarchy; + SerializedProperty m_PaperDollMode; + SerializedProperty m_KeepDupilcateSpriteName; + SerializedProperty m_SkeletonAssetReferenceID; + SerializedProperty m_GeneratePhysicsShape; + SerializedProperty m_LayerMappingOption; + + private SkeletonAsset m_SkeletonAsset; + readonly int[] m_FilterModeOptions = (int[])(Enum.GetValues(typeof(FilterMode))); + + bool m_IsPOT = false; + Dictionary m_AdvanceInspectorGUI = new Dictionary(); + int m_PlatformSettingsIndex; + bool m_ShowPerAxisWrapModes = false; + int m_ActiveEditorIndex = 0; + + TexturePlatformSettingsHelper m_TexturePlatformSettingsHelper; + + TexturePlatformSettingsView m_TexturePlatformSettingsView = new TexturePlatformSettingsView(); + TexturePlatformSettingsController m_TexturePlatformSettingsController = new TexturePlatformSettingsController(); + + PSDImporterEditorFoldOutState m_EditorFoldOutState = new PSDImporterEditorFoldOutState(); + Action[] m_InspectorUI; + PSDImporterEditorLayerTreeView m_LayerTreeView; + TreeViewState m_TreeViewState; + PSDImporter m_CurrentTarget; + /// + /// Implementation of AssetImporterEditor.OnEnable + /// + public override void OnEnable() + { + base.OnEnable(); + m_MosaicLayers = serializedObject.FindProperty("m_MosaicLayers"); + m_ImportHiddenLayers = serializedObject.FindProperty("m_ImportHiddenLayers"); + m_ResliceFromLayer = serializedObject.FindProperty("m_ResliceFromLayer"); + m_CharacterMode = serializedObject.FindProperty("m_CharacterMode"); + m_DocumentPivot = serializedObject.FindProperty("m_DocumentPivot"); + m_DocumentAlignment = serializedObject.FindProperty("m_DocumentAlignment"); + m_GenerateGOHierarchy = serializedObject.FindProperty("m_GenerateGOHierarchy"); + m_PaperDollMode = serializedObject.FindProperty("m_PaperDollMode"); + m_KeepDupilcateSpriteName = serializedObject.FindProperty("m_KeepDupilcateSpriteName"); + m_SkeletonAssetReferenceID = serializedObject.FindProperty("m_SkeletonAssetReferenceID"); + m_GeneratePhysicsShape = serializedObject.FindProperty("m_GeneratePhysicsShape"); + m_LayerMappingOption = serializedObject.FindProperty("m_LayerMappingOption"); + + var textureImporterSettingsSP = serializedObject.FindProperty("m_TextureImporterSettings"); + m_TextureType = textureImporterSettingsSP.FindPropertyRelative("m_TextureType"); + m_TextureShape = textureImporterSettingsSP.FindPropertyRelative("m_TextureShape"); + m_ConvertToNormalMap = textureImporterSettingsSP.FindPropertyRelative("m_ConvertToNormalMap"); + m_SpriteMode = textureImporterSettingsSP.FindPropertyRelative("m_SpriteMode"); + m_SpritePixelsToUnits = textureImporterSettingsSP.FindPropertyRelative("m_SpritePixelsToUnits"); + m_SpriteMeshType = textureImporterSettingsSP.FindPropertyRelative("m_SpriteMeshType"); + m_SpriteExtrude = textureImporterSettingsSP.FindPropertyRelative("m_SpriteExtrude"); + m_Alignment = textureImporterSettingsSP.FindPropertyRelative("m_Alignment"); + m_SpritePivot = textureImporterSettingsSP.FindPropertyRelative("m_SpritePivot"); + m_NPOTScale = textureImporterSettingsSP.FindPropertyRelative("m_NPOTScale"); + m_IsReadable = textureImporterSettingsSP.FindPropertyRelative("m_IsReadable"); + m_sRGBTexture = textureImporterSettingsSP.FindPropertyRelative("m_sRGBTexture"); + m_AlphaSource = textureImporterSettingsSP.FindPropertyRelative("m_AlphaSource"); + m_MipMapMode = textureImporterSettingsSP.FindPropertyRelative("m_MipMapMode"); + m_EnableMipMap = textureImporterSettingsSP.FindPropertyRelative("m_EnableMipMap"); + m_FadeOut = textureImporterSettingsSP.FindPropertyRelative("m_FadeOut"); + m_BorderMipMap = textureImporterSettingsSP.FindPropertyRelative("m_BorderMipMap"); + m_MipMapsPreserveCoverage = textureImporterSettingsSP.FindPropertyRelative("m_MipMapsPreserveCoverage"); + m_AlphaTestReferenceValue = textureImporterSettingsSP.FindPropertyRelative("m_AlphaTestReferenceValue"); + m_MipMapFadeDistanceStart = textureImporterSettingsSP.FindPropertyRelative("m_MipMapFadeDistanceStart"); + m_MipMapFadeDistanceEnd = textureImporterSettingsSP.FindPropertyRelative("m_MipMapFadeDistanceEnd"); + m_AlphaIsTransparency = textureImporterSettingsSP.FindPropertyRelative("m_AlphaIsTransparency"); + m_FilterMode = textureImporterSettingsSP.FindPropertyRelative("m_FilterMode"); + m_Aniso = textureImporterSettingsSP.FindPropertyRelative("m_Aniso"); + m_WrapU = textureImporterSettingsSP.FindPropertyRelative("m_WrapU"); + m_WrapV = textureImporterSettingsSP.FindPropertyRelative("m_WrapV"); + m_WrapW = textureImporterSettingsSP.FindPropertyRelative("m_WrapW"); + + var textureWidth = serializedObject.FindProperty("m_TextureActualWidth"); + var textureHeight = serializedObject.FindProperty("m_TextureActualHeight"); + m_IsPOT = Mathf.IsPowerOfTwo(textureWidth.intValue) && Mathf.IsPowerOfTwo(textureHeight.intValue); + + var assetPath = AssetDatabase.GUIDToAssetPath(m_SkeletonAssetReferenceID.stringValue); + m_SkeletonAsset = AssetDatabase.LoadAssetAtPath(assetPath); + + var advanceGUIAction = new Action[] + { + ColorSpaceGUI, + AlphaHandlingGUI, + POTScaleGUI, + ReadableGUI, + MipMapGUI + }; + m_AdvanceInspectorGUI.Add(TextureImporterType.Sprite, advanceGUIAction); + + advanceGUIAction = new Action[] + { + POTScaleGUI, + ReadableGUI, + MipMapGUI + }; + m_AdvanceInspectorGUI.Add(TextureImporterType.Default, advanceGUIAction); + LoadPlatformSettings(); + m_TexturePlatformSettingsHelper = new TexturePlatformSettingsHelper(this); + + m_ActiveEditorIndex = EditorPrefs.GetInt(this.GetType().Name + "ActiveEditorIndex", 0); + m_InspectorUI = new Action[] + { + DoSettingsUI, + DoLayerManagementUI + }; + m_TreeViewState = new TreeViewState(); + UpdateLayerTreeView(); + } + + void UpdateLayerTreeView() + { + if (!ReferenceEquals(m_CurrentTarget,target) || m_LayerTreeView == null) + { + m_CurrentTarget = (PSDImporter)target; + m_LayerTreeView = new PSDImporterEditorLayerTreeView(m_TreeViewState, m_CurrentTarget.GetPSDLayers(), m_ImportHiddenLayers.boolValue); + } + } + + /// + /// Implementation of AssetImporterEditor.OnInspectorGUI + /// + public override void OnInspectorGUI() + { + serializedObject.Update(); + if (s_Styles == null) + s_Styles = new Styles(); + + UpdateLayerTreeView(); + + using (new GUILayout.HorizontalScope()) + { + GUILayout.FlexibleSpace(); + using (var check = new EditorGUI.ChangeCheckScope()) + { + m_ActiveEditorIndex = GUILayout.Toolbar(m_ActiveEditorIndex, s_Styles.editorTabNames, "LargeButton", GUI.ToolbarButtonSize.FitToContents); + if (check.changed) + { + EditorPrefs.SetInt(GetType().Name + "ActiveEditorIndex", m_ActiveEditorIndex); + } + } + GUILayout.FlexibleSpace(); + } + + + m_InspectorUI[m_ActiveEditorIndex](); + + serializedObject.ApplyModifiedProperties(); + ApplyRevertGUI(); + Repaint(); + } + + public override VisualElement CreateInspectorGUI() + { + var ve = new IMGUIContainer(OnInspectorGUI); + ve.AddToClassList("unity-imgui-container"); + ve.AddToClassList("unity-inspector-element_custom-inspector-container"); + ve.AddToClassList("unity-inspector-element__imgui-container"); + return null; + } + + void DoLayerManagementUI() + { + var rect = InternalEngineBridge.GetGUIClipVisibleRect(); + //Magic number. 54 is for header. The rest no idea. + rect = GUILayoutUtility.GetRect(0,rect.height - (54 + 30 + 30 + 20), GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); + m_LayerTreeView.OnGUI(rect); + if (m_LayerTreeView.GetHasChangeAndClear()) + serializedObject.Update(); + } + + void DoSettingsUI() + { + if (m_EditorFoldOutState.DoGeneralUI(s_Styles.generalHeaderText)) + { + EditorGUI.showMixedValue = m_TextureType.hasMultipleDifferentValues; + m_TextureType.intValue = EditorGUILayout.IntPopup(s_Styles.textureTypeTitle, m_TextureType.intValue, s_Styles.textureTypeOptions, s_Styles.textureTypeValues); + EditorGUI.showMixedValue = false; + } + + + switch ((TextureImporterType)m_TextureType.intValue) + { + case TextureImporterType.Sprite: + DoSpriteInspector(); + break; + case TextureImporterType.Default: + DoTextureDefaultInspector(); + break; + default: + Debug.LogWarning("We only support Default or Sprite texture type for now. Texture type is set to default."); + m_TextureType.intValue = (int)TextureImporterType.Default; + break; + } + + CommonTextureSettingsGUI(); + DoPlatformSettings(); + DoAdvanceInspector(); + + } + + void MainRigPropertyField() + { + EditorGUI.BeginChangeCheck(); + m_SkeletonAsset = EditorGUILayout.ObjectField(s_Styles.mainSkeletonName, m_SkeletonAsset, typeof(SkeletonAsset), false) as SkeletonAsset; + if (EditorGUI.EndChangeCheck()) + { + var referencePath = AssetDatabase.GetAssetPath(m_SkeletonAsset); + if (referencePath == ((AssetImporter) target).assetPath) + m_SkeletonAssetReferenceID.stringValue = ""; + else + m_SkeletonAssetReferenceID.stringValue = AssetDatabase.GUIDFromAssetPath(referencePath).ToString(); + } + } + + /// + /// Implementation of AssetImporterEditor.Apply + /// + protected override void Apply() + { + FileStream fileStream = new FileStream(((AssetImporter)target).assetPath, FileMode.Open, FileAccess.Read); + var doc = PaintDotNet.Data.PhotoshopFileType.PsdLoad.Load(fileStream, ELoadFlag.Header | ELoadFlag.ColorMode); + + PSDApplyEvent evt = new PSDApplyEvent() + { + instance_id = target.GetInstanceID(), + texture_type = m_TextureType.intValue, + sprite_mode = m_SpriteMode.intValue, + mosaic_layer = m_MosaicLayers.boolValue, + import_hidden_layer = m_ImportHiddenLayers.boolValue, + character_mode = m_CharacterMode.boolValue, + generate_go_hierarchy = m_GenerateGOHierarchy.boolValue, + reslice_from_layer = m_ResliceFromLayer.boolValue, + is_character_rigged = IsCharacterRigged(), + is_psd = IsPSD(doc), + color_mode = FileColorMode(doc) + }; + doc.Cleanup(); + AnalyticFactory.analytics.SendApplyEvent(evt); + m_TexturePlatformSettingsHelper.Apply(); + base.Apply(); + Selection.activeObject = null; + Unsupported.SceneTrackerFlushDirty(); + PSDImportPostProcessor.currentApplyAssetPath = ((PSDImporter) target).assetPath; + } + + static bool IsPSD(PsdFile doc) + { + return !doc.IsLargeDocument; + } + + static PsdColorMode FileColorMode(PsdFile doc) + { + return doc.ColorMode; + } + + bool IsCharacterRigged() + { + var importer = target as PSDImporter; + if (importer != null) + { + var characterProvider = importer.GetDataProvider(); + var meshDataProvider = importer.GetDataProvider(); + if (characterProvider != null && meshDataProvider != null) + { + var character = characterProvider.GetCharacterData(); + foreach (var parts in character.parts) + { + var vert = meshDataProvider.GetVertices(new GUID(parts.spriteId)); + var indices = meshDataProvider.GetIndices(new GUID(parts.spriteId)); + if (parts.bones != null && parts.bones.Length > 0 && + vert != null && vert.Length > 0 && + indices != null && indices.Length > 0) + return true; + } + } + } + return false; + } + + Dictionary> m_PlatfromSettings = new Dictionary>(); + void LoadPlatformSettings() + { + foreach (var t in targets) + { + var importer = ((PSDImporter)t); + var importerPlatformSettings = importer.GetAllPlatformSettings(); + for (int i = 0; i < importerPlatformSettings.Length; ++i) + { + var tip = importerPlatformSettings[i]; + List platformSettings = null; + m_PlatfromSettings.TryGetValue(tip.name, out platformSettings); + if (platformSettings == null) + { + platformSettings = new List(); + m_PlatfromSettings.Add(tip.name, platformSettings); + } + platformSettings.Add(tip); + } + } + } + + void StorePlatformSettings() + { + var platformSettingsSP = serializedObject.FindProperty("m_PlatformSettings"); + platformSettingsSP.ClearArray(); + foreach (var keyValue in m_PlatfromSettings) + { + if (!keyValue.Value[0].overridden) + continue; + + SerializedProperty platformSettingSP = null; + for (int i = 0; i < platformSettingsSP.arraySize; ++i) + { + var sp = platformSettingsSP.GetArrayElementAtIndex(i); + if (sp.FindPropertyRelative("m_Name").stringValue == keyValue.Key) + platformSettingSP = sp; + } + if (platformSettingSP == null) + { + platformSettingsSP.InsertArrayElementAtIndex(platformSettingsSP.arraySize); + platformSettingSP = platformSettingsSP.GetArrayElementAtIndex(platformSettingsSP.arraySize - 1); + } + + var tip = keyValue.Value[0]; + platformSettingSP.FindPropertyRelative("m_Name").stringValue = tip.name; + platformSettingSP.FindPropertyRelative("m_Overridden").intValue = tip.overridden ? 1 : 0; + platformSettingSP.FindPropertyRelative("m_MaxTextureSize").intValue = tip.maxTextureSize; + platformSettingSP.FindPropertyRelative("m_ResizeAlgorithm").intValue = (int)tip.resizeAlgorithm; + platformSettingSP.FindPropertyRelative("m_TextureFormat").intValue = (int)tip.format; + platformSettingSP.FindPropertyRelative("m_TextureCompression").intValue = (int)tip.textureCompression; + platformSettingSP.FindPropertyRelative("m_CompressionQuality").intValue = tip.compressionQuality; + platformSettingSP.FindPropertyRelative("m_CrunchedCompression").intValue = tip.crunchedCompression ? 1 : 0; + platformSettingSP.FindPropertyRelative("m_AllowsAlphaSplitting").intValue = tip.allowsAlphaSplitting ? 1 : 0; + } + } + + void DoPlatformSettings() + { + if (m_EditorFoldOutState.DoPlatformSettingsUI(s_Styles.platformSettingsHeaderText)) + { + m_TexturePlatformSettingsHelper.ShowPlatformSpecificSettings(); + GUILayout.Space(10); + } + } + + void DoAdvanceInspector() + { + if (!m_TextureType.hasMultipleDifferentValues) + { + if (m_AdvanceInspectorGUI.ContainsKey((TextureImporterType)m_TextureType.intValue)) + { + if (m_EditorFoldOutState.DoAdvancedUI(s_Styles.advancedHeaderText)) + { + foreach (var action in m_AdvanceInspectorGUI[(TextureImporterType)m_TextureType.intValue]) + { + action(); + } + } + } + } + } + + void CommonTextureSettingsGUI() + { + if (m_EditorFoldOutState.DoTextureUI(s_Styles.textureHeaderText)) + { + EditorGUI.BeginChangeCheck(); + + // Wrap mode + bool isVolume = false; + WrapModePopup(m_WrapU, m_WrapV, m_WrapW, isVolume, ref m_ShowPerAxisWrapModes); + + + // Display warning about repeat wrap mode on restricted npot emulation + if (m_NPOTScale.intValue == (int)TextureImporterNPOTScale.None && + (m_WrapU.intValue == (int)TextureWrapMode.Repeat || m_WrapV.intValue == (int)TextureWrapMode.Repeat) && + !InternalEditorBridge.DoesHardwareSupportsFullNPOT()) + { + bool displayWarning = false; + foreach (var target in targets) + { + var imp = (PSDImporter)target; + int w = imp.textureActualWidth; + int h = imp.textureActualHeight; + if (!Mathf.IsPowerOfTwo(w) || !Mathf.IsPowerOfTwo(h)) + { + displayWarning = true; + break; + } + } + + if (displayWarning) + { + EditorGUILayout.HelpBox(s_Styles.warpNotSupportWarning.text, MessageType.Warning, true); + } + } + + // Filter mode + EditorGUI.showMixedValue = m_FilterMode.hasMultipleDifferentValues; + FilterMode filter = (FilterMode)m_FilterMode.intValue; + if ((int)filter == -1) + { + if (m_FadeOut.intValue > 0 || m_ConvertToNormalMap.intValue > 0) + filter = FilterMode.Trilinear; + else + filter = FilterMode.Bilinear; + } + filter = (FilterMode)EditorGUILayout.IntPopup(s_Styles.filterMode, (int)filter, s_Styles.filterModeOptions, m_FilterModeOptions); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) + m_FilterMode.intValue = (int)filter; + + // Aniso + bool showAniso = (FilterMode)m_FilterMode.intValue != FilterMode.Point + && m_EnableMipMap.intValue > 0 + && (TextureImporterShape)m_TextureShape.intValue != TextureImporterShape.TextureCube; + using (new EditorGUI.DisabledScope(!showAniso)) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = m_Aniso.hasMultipleDifferentValues; + int aniso = m_Aniso.intValue; + if (aniso == -1) + aniso = 1; + aniso = EditorGUILayout.IntSlider(s_Styles.anisoLevelLabel, aniso, 0, 16); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) + m_Aniso.intValue = aniso; + + if (aniso > 1) + { + if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.Disable) + EditorGUILayout.HelpBox(s_Styles.anisotropicDisableInfo.text, MessageType.Info); + else if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.ForceEnable) + EditorGUILayout.HelpBox(s_Styles.anisotropicForceEnableInfo.text, MessageType.Info); + } + } + } + } + + private static bool IsAnyTextureObjectUsingPerAxisWrapMode(UnityEngine.Object[] objects, bool isVolumeTexture) + { + foreach (var o in objects) + { + int u = 0, v = 0, w = 0; + // the objects can be Textures themselves, or texture-related importers + if (o is Texture) + { + var ti = (Texture)o; + u = (int)ti.wrapModeU; + v = (int)ti.wrapModeV; + w = (int)ti.wrapModeW; + } + if (o is TextureImporter) + { + var ti = (TextureImporter)o; + u = (int)ti.wrapModeU; + v = (int)ti.wrapModeV; + w = (int)ti.wrapModeW; + } + if (o is IHVImageFormatImporter) + { + var ti = (IHVImageFormatImporter)o; + u = (int)ti.wrapModeU; + v = (int)ti.wrapModeV; + w = (int)ti.wrapModeW; + } + u = Mathf.Max(0, u); + v = Mathf.Max(0, v); + w = Mathf.Max(0, w); + if (u != v) + { + return true; + } + if (isVolumeTexture) + { + if (u != w || v != w) + { + return true; + } + } + } + return false; + } + + // showPerAxisWrapModes is state of whether "Per-Axis" mode should be active in the main dropdown. + // It is set automatically if wrap modes in UVW are different, or if user explicitly picks "Per-Axis" option -- when that one is picked, + // then it should stay true even if UVW wrap modes will initially be the same. + // + // Note: W wrapping mode is only shown when isVolumeTexture is true. + internal static void WrapModePopup(SerializedProperty wrapU, SerializedProperty wrapV, SerializedProperty wrapW, bool isVolumeTexture, ref bool showPerAxisWrapModes) + { + if (s_Styles == null) + s_Styles = new Styles(); + + // In texture importer settings, serialized properties for things like wrap modes can contain -1; + // that seems to indicate "use defaults, user has not changed them to anything" but not totally sure. + // Show them as Repeat wrap modes in the popups. + var wu = (TextureWrapMode)Mathf.Max(wrapU.intValue, 0); + var wv = (TextureWrapMode)Mathf.Max(wrapV.intValue, 0); + var ww = (TextureWrapMode)Mathf.Max(wrapW.intValue, 0); + + // automatically go into per-axis mode if values are already different + if (wu != wv) + showPerAxisWrapModes = true; + if (isVolumeTexture) + { + if (wu != ww || wv != ww) + showPerAxisWrapModes = true; + } + + // It's not possible to determine whether any single texture in the whole selection is using per-axis wrap modes + // just from SerializedProperty values. They can only tell if "some values in whole selection are different" (e.g. + // wrap value on U axis is not the same among all textures), and can return value of "some" object in the selection + // (typically based on object loading order). So in order for more intuitive behavior with multi-selection, + // we go over the actual objects when there's >1 object selected and some wrap modes are different. + if (!showPerAxisWrapModes) + { + if (wrapU.hasMultipleDifferentValues || wrapV.hasMultipleDifferentValues || (isVolumeTexture && wrapW.hasMultipleDifferentValues)) + { + if (IsAnyTextureObjectUsingPerAxisWrapMode(wrapU.serializedObject.targetObjects, isVolumeTexture)) + { + showPerAxisWrapModes = true; + } + } + } + + int value = showPerAxisWrapModes ? -1 : (int)wu; + + // main wrap mode popup + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = !showPerAxisWrapModes && (wrapU.hasMultipleDifferentValues || wrapV.hasMultipleDifferentValues || (isVolumeTexture && wrapW.hasMultipleDifferentValues)); + value = EditorGUILayout.IntPopup(s_Styles.wrapModeLabel, value, s_Styles.wrapModeContents, s_Styles.wrapModeValues); + if (EditorGUI.EndChangeCheck() && value != -1) + { + // assign the same wrap mode to all axes, and hide per-axis popups + wrapU.intValue = value; + wrapV.intValue = value; + wrapW.intValue = value; + showPerAxisWrapModes = false; + } + + // show per-axis popups if needed + if (value == -1) + { + showPerAxisWrapModes = true; + EditorGUI.indentLevel++; + WrapModeAxisPopup(s_Styles.wrapU, wrapU); + WrapModeAxisPopup(s_Styles.wrapV, wrapV); + if (isVolumeTexture) + { + WrapModeAxisPopup(s_Styles.wrapW, wrapW); + } + EditorGUI.indentLevel--; + } + EditorGUI.showMixedValue = false; + } + + static void WrapModeAxisPopup(GUIContent label, SerializedProperty wrapProperty) + { + // In texture importer settings, serialized properties for wrap modes can contain -1, which means "use default". + var wrap = (TextureWrapMode)Mathf.Max(wrapProperty.intValue, 0); + Rect rect = EditorGUILayout.GetControlRect(); + EditorGUI.BeginChangeCheck(); + EditorGUI.BeginProperty(rect, label, wrapProperty); + wrap = (TextureWrapMode)EditorGUI.EnumPopup(rect, label, wrap); + EditorGUI.EndProperty(); + if (EditorGUI.EndChangeCheck()) + { + wrapProperty.intValue = (int)wrap; + } + } + + void DoWrapModePopup() + { + WrapModePopup(m_WrapU, m_WrapV, m_WrapW, IsVolume(), ref m_ShowPerAxisWrapModes); + } + + bool IsVolume() + { + var t = target as Texture; + return t != null && t.dimension == UnityEngine.Rendering.TextureDimension.Tex3D; + } + + void DoSpriteInspector() + { + if(m_EditorFoldOutState.DoSpriteUI(s_Styles.spriteHeaderText)) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.IntPopup(m_SpriteMode, s_Styles.spriteModeOptions, new[] { 1, 2, 3 }, s_Styles.spriteMode); + + // Ensure that PropertyField focus will be cleared when we change spriteMode. + if (EditorGUI.EndChangeCheck()) + { + GUIUtility.keyboardControl = 0; + } + + // Show generic attributes + using (new EditorGUI.DisabledScope(m_SpriteMode.intValue == 0)) + { + EditorGUILayout.PropertyField(m_SpritePixelsToUnits, s_Styles.spritePixelsPerUnit); + + if (m_SpriteMode.intValue != (int)SpriteImportMode.Polygon && !m_SpriteMode.hasMultipleDifferentValues) + { + EditorGUILayout.IntPopup(m_SpriteMeshType, s_Styles.spriteMeshTypeOptions, new[] { 0, 1 }, s_Styles.spriteMeshType); + } + + EditorGUILayout.IntSlider(m_SpriteExtrude, 0, 32, s_Styles.spriteExtrude); + + if (m_SpriteMode.intValue == 1) + { + EditorGUILayout.IntPopup(m_Alignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.spriteAlignment); + + if (m_Alignment.intValue == (int)SpriteAlignment.Custom) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(m_SpritePivot, new GUIContent()); + GUILayout.EndHorizontal(); + } + } + } + EditorGUILayout.PropertyField(m_GeneratePhysicsShape, s_Styles.generatePhysicsShape); + using (new EditorGUI.DisabledScope(!m_MosaicLayers.boolValue)) + { + EditorGUILayout.PropertyField(m_ResliceFromLayer, s_Styles.resliceFromLayer); + if (m_ResliceFromLayer.boolValue) + { + EditorGUILayout.HelpBox(s_Styles.resliceFromLayerWarning.text, MessageType.Info, true); + } + } + } + + DoOpenSpriteEditorButton(); + + if (m_EditorFoldOutState.DoLayerImportUI(s_Styles.layerImportHeaderText)) + { + using (new EditorGUI.DisabledScope(m_SpriteMode.intValue != (int)SpriteImportMode.Multiple || m_SpriteMode.hasMultipleDifferentValues)) + { + int boolToInt = !m_MosaicLayers.boolValue ? 1 : 0; + EditorGUI.BeginChangeCheck(); + boolToInt = EditorGUILayout.IntPopup(s_Styles.mosaicLayers, boolToInt, s_Styles.importModeOptions, s_Styles.falseTrueOptionValue); + if (EditorGUI.EndChangeCheck()) + m_MosaicLayers.boolValue = boolToInt != 1; + + using (new EditorGUI.DisabledScope(m_MosaicLayers.boolValue == false)) + { + boolToInt = m_KeepDupilcateSpriteName.boolValue ? 1 : 0; + EditorGUI.BeginChangeCheck(); + boolToInt = EditorGUILayout.IntPopup(s_Styles.keepDuplicateSpriteName, boolToInt, s_Styles.dupllicateNameOption, s_Styles.falseTrueOptionValue); + if (EditorGUI.EndChangeCheck()) + m_KeepDupilcateSpriteName.boolValue = boolToInt == 1; + + boolToInt = m_ImportHiddenLayers.boolValue ? 1 : 0; + EditorGUI.BeginChangeCheck(); + boolToInt = EditorGUILayout.IntPopup(s_Styles.importHiddenLayer, boolToInt, s_Styles.layerOptions, s_Styles.falseTrueOptionValue); + if (EditorGUI.EndChangeCheck()) + { + m_ImportHiddenLayers.boolValue = boolToInt == 1; + m_LayerTreeView.showHidden = m_ImportHiddenLayers.boolValue; + } + + EditorGUILayout.IntPopup(m_LayerMappingOption, s_Styles.layerMappingOption, s_Styles.layerMappingOptionValues, s_Styles.layerMapping); + + using (new EditorGUI.DisabledScope(!m_MosaicLayers.boolValue || !m_CharacterMode.boolValue)) + { + boolToInt = m_GenerateGOHierarchy.boolValue ? 1 : 0; + boolToInt = EditorGUILayout.IntPopup(s_Styles.layerGroupLabel, boolToInt, s_Styles.layerGroupOption, s_Styles.falseTrueOptionValue); + m_GenerateGOHierarchy.boolValue = boolToInt == 1; + } + } + } + } + + if (m_EditorFoldOutState.DoCharacterRigUI(s_Styles.characterRigHeaderText)) + { + using (new EditorGUI.DisabledScope(m_SpriteMode.intValue != (int)SpriteImportMode.Multiple || m_SpriteMode.hasMultipleDifferentValues || m_MosaicLayers.boolValue == false)) + { + EditorGUILayout.PropertyField(m_CharacterMode, s_Styles.characterMode); + using (new EditorGUI.DisabledScope(!m_CharacterMode.boolValue)) + { + MainRigPropertyField(); + EditorGUILayout.IntPopup(m_DocumentAlignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.characterAlignment); + if (m_DocumentAlignment.intValue == (int)SpriteAlignment.Custom) + { + GUILayout.BeginHorizontal(); + GUILayout.Space(EditorGUIUtility.labelWidth); + EditorGUILayout.PropertyField(m_DocumentPivot, new GUIContent()); + GUILayout.EndHorizontal(); + } + } + } + //EditorGUILayout.PropertyField(m_PaperDollMode, s_Styles.paperDollMode); + } + } + + void DoOpenSpriteEditorButton() + { + using (new EditorGUI.DisabledScope(targets.Length != 1)) + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button(s_Styles.spriteEditorButtonLabel)) + { + if (HasModified()) + { + // To ensure Sprite Editor Window to have the latest texture import setting, + // We must applied those modified values first. + string dialogText = string.Format(s_Styles.unappliedSettingsDialogContent.text, ((AssetImporter)target).assetPath); + if (EditorUtility.DisplayDialog(s_Styles.unappliedSettingsDialogTitle.text, + dialogText, s_Styles.applyButtonLabel.text, s_Styles.revertButtonLabel.text)) + { + ApplyAndImport(); + InternalEditorBridge.ShowSpriteEditorWindow(this.assetTarget); + + // We reimported the asset which destroyed the editor, so we can't keep running the UI here. + GUIUtility.ExitGUI(); + } + } + else + { + InternalEditorBridge.ShowSpriteEditorWindow(this.assetTarget); + } + } + GUILayout.EndHorizontal(); + } + } + + void DoTextureDefaultInspector() + { + if (m_EditorFoldOutState.DoDefaultTypeUI(s_Styles.defaultHeaderText)) + { + ColorSpaceGUI(); + AlphaHandlingGUI(); + } + } + + void ColorSpaceGUI() + { + ToggleFromInt(m_sRGBTexture, s_Styles.sRGBTexture); + } + + void POTScaleGUI() + { + using (new EditorGUI.DisabledScope(m_IsPOT || m_TextureType.intValue == (int)TextureImporterType.Sprite)) + { + EnumPopup(m_NPOTScale, typeof(TextureImporterNPOTScale), s_Styles.npot); + } + } + + void ReadableGUI() + { + ToggleFromInt(m_IsReadable, s_Styles.readWrite); + } + + void AlphaHandlingGUI() + { + EditorGUI.showMixedValue = m_AlphaSource.hasMultipleDifferentValues; + EditorGUI.BeginChangeCheck(); + int newAlphaUsage = EditorGUILayout.IntPopup(s_Styles.alphaSource, m_AlphaSource.intValue, s_Styles.alphaSourceOptions, s_Styles.alphaSourceValues); + + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) + { + m_AlphaSource.intValue = newAlphaUsage; + } + + bool showAlphaIsTransparency = (TextureImporterAlphaSource)m_AlphaSource.intValue != TextureImporterAlphaSource.None; + using (new EditorGUI.DisabledScope(!showAlphaIsTransparency)) + { + ToggleFromInt(m_AlphaIsTransparency, s_Styles.alphaIsTransparency); + } + } + + void MipMapGUI() + { + ToggleFromInt(m_EnableMipMap, s_Styles.generateMipMaps); + + if (m_EnableMipMap.boolValue && !m_EnableMipMap.hasMultipleDifferentValues) + { + EditorGUI.indentLevel++; + ToggleFromInt(m_BorderMipMap, s_Styles.borderMipMaps); + EditorGUILayout.Popup(s_Styles.mipMapFilter, m_MipMapMode.intValue, s_Styles.mipMapFilterOptions); + + ToggleFromInt(m_MipMapsPreserveCoverage, s_Styles.mipMapsPreserveCoverage); + if (m_MipMapsPreserveCoverage.intValue != 0 && !m_MipMapsPreserveCoverage.hasMultipleDifferentValues) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(m_AlphaTestReferenceValue, s_Styles.alphaTestReferenceValue); + EditorGUI.indentLevel--; + } + + // Mipmap fadeout + ToggleFromInt(m_FadeOut, s_Styles.mipmapFadeOutToggle); + if (m_FadeOut.intValue > 0) + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + float min = m_MipMapFadeDistanceStart.intValue; + float max = m_MipMapFadeDistanceEnd.intValue; + EditorGUILayout.MinMaxSlider(s_Styles.mipmapFadeOut, ref min, ref max, 0, 10); + if (EditorGUI.EndChangeCheck()) + { + m_MipMapFadeDistanceStart.intValue = Mathf.RoundToInt(min); + m_MipMapFadeDistanceEnd.intValue = Mathf.RoundToInt(max); + } + EditorGUI.indentLevel--; + } + EditorGUI.indentLevel--; + } + } + + void ToggleFromInt(SerializedProperty property, GUIContent label) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = property.hasMultipleDifferentValues; + int value = EditorGUILayout.Toggle(label, property.intValue > 0) ? 1 : 0; + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) + property.intValue = value; + } + + void EnumPopup(SerializedProperty property, System.Type type, GUIContent label) + { + EditorGUILayout.IntPopup(label.text, property.intValue, + System.Enum.GetNames(type), + System.Enum.GetValues(type) as int[]); + } + + void ExportMosaicTexture() + { + var assetPath = ((AssetImporter)target).assetPath; + var texture2D = AssetDatabase.LoadAssetAtPath(assetPath); + if (texture2D == null) + return; + if (!texture2D.isReadable) + texture2D = InternalEditorBridge.CreateTemporaryDuplicate(texture2D, texture2D.width, texture2D.height); + var pixelData = texture2D.GetPixels(); + texture2D = new Texture2D(texture2D.width, texture2D.height); + texture2D.SetPixels(pixelData); + texture2D.Apply(); + byte[] bytes = texture2D.EncodeToPNG(); + var fileName = Path.GetFileNameWithoutExtension(assetPath); + var filePath = Path.GetDirectoryName(assetPath); + var savePath = Path.Combine(filePath, fileName + ".png"); + File.WriteAllBytes(savePath, bytes); + AssetDatabase.Refresh(); + } + + protected override void ResetValues() + { + base.ResetValues(); + LoadPlatformSettings(); + m_TexturePlatformSettingsHelper = new TexturePlatformSettingsHelper(this); + } + + public int GetTargetCount() + { + return targets.Length; + } + + public TextureImporterPlatformSettings GetPlatformTextureSettings(int i, string name) + { + if(m_PlatfromSettings.ContainsKey(name)) + if(m_PlatfromSettings[name].Count > i) + return m_PlatfromSettings[name][i]; + return new TextureImporterPlatformSettings() + { + name = name, + overridden = false + }; + } + + public bool ShowPresetSettings() + { + return assetTarget == null; + } + + public bool DoesSourceTextureHaveAlpha(int v) + { + return true; + } + + public bool IsSourceTextureHDR(int v) + { + return false; + } + + public void SetPlatformTextureSettings(int i, TextureImporterPlatformSettings platformSettings) + { + var psdImporter = ((PSDImporter)targets[i]); + psdImporter.SetPlatformTextureSettings(platformSettings); + psdImporter.Apply(); + } + + public void GetImporterSettings(int i, TextureImporterSettings settings) + { + ((PSDImporter)targets[i]).ReadTextureSettings(settings); + // Get settings that have been changed in the inspector + GetSerializedPropertySettings(settings); + } + + internal TextureImporterSettings GetSerializedPropertySettings(TextureImporterSettings settings) + { + if (!m_AlphaSource.hasMultipleDifferentValues) + settings.alphaSource = (TextureImporterAlphaSource)m_AlphaSource.intValue; + + if (!m_ConvertToNormalMap.hasMultipleDifferentValues) + settings.convertToNormalMap = m_ConvertToNormalMap.intValue > 0; + + if (!m_BorderMipMap.hasMultipleDifferentValues) + settings.borderMipmap = m_BorderMipMap.intValue > 0; + + if (!m_MipMapsPreserveCoverage.hasMultipleDifferentValues) + settings.mipMapsPreserveCoverage = m_MipMapsPreserveCoverage.intValue > 0; + + if (!m_AlphaTestReferenceValue.hasMultipleDifferentValues) + settings.alphaTestReferenceValue = m_AlphaTestReferenceValue.floatValue; + + if (!m_NPOTScale.hasMultipleDifferentValues) + settings.npotScale = (TextureImporterNPOTScale)m_NPOTScale.intValue; + + if (!m_IsReadable.hasMultipleDifferentValues) + settings.readable = m_IsReadable.intValue > 0; + + if (!m_sRGBTexture.hasMultipleDifferentValues) + settings.sRGBTexture = m_sRGBTexture.intValue > 0; + + if (!m_EnableMipMap.hasMultipleDifferentValues) + settings.mipmapEnabled = m_EnableMipMap.intValue > 0; + + if (!m_MipMapMode.hasMultipleDifferentValues) + settings.mipmapFilter = (TextureImporterMipFilter)m_MipMapMode.intValue; + + if (!m_FadeOut.hasMultipleDifferentValues) + settings.fadeOut = m_FadeOut.intValue > 0; + + if (!m_MipMapFadeDistanceStart.hasMultipleDifferentValues) + settings.mipmapFadeDistanceStart = m_MipMapFadeDistanceStart.intValue; + + if (!m_MipMapFadeDistanceEnd.hasMultipleDifferentValues) + settings.mipmapFadeDistanceEnd = m_MipMapFadeDistanceEnd.intValue; + + if (!m_SpriteMode.hasMultipleDifferentValues) + settings.spriteMode = m_SpriteMode.intValue; + + if (!m_SpritePixelsToUnits.hasMultipleDifferentValues) + settings.spritePixelsPerUnit = m_SpritePixelsToUnits.floatValue; + + if (!m_SpriteExtrude.hasMultipleDifferentValues) + settings.spriteExtrude = (uint)m_SpriteExtrude.intValue; + + if (!m_SpriteMeshType.hasMultipleDifferentValues) + settings.spriteMeshType = (SpriteMeshType)m_SpriteMeshType.intValue; + + if (!m_Alignment.hasMultipleDifferentValues) + settings.spriteAlignment = m_Alignment.intValue; + + if (!m_SpritePivot.hasMultipleDifferentValues) + settings.spritePivot = m_SpritePivot.vector2Value; + + if (!m_WrapU.hasMultipleDifferentValues) + settings.wrapModeU = (TextureWrapMode)m_WrapU.intValue; + if (!m_WrapV.hasMultipleDifferentValues) + settings.wrapModeU = (TextureWrapMode)m_WrapV.intValue; + if (!m_WrapW.hasMultipleDifferentValues) + settings.wrapModeU = (TextureWrapMode)m_WrapW.intValue; + + if (!m_FilterMode.hasMultipleDifferentValues) + settings.filterMode = (FilterMode)m_FilterMode.intValue; + + if (!m_Aniso.hasMultipleDifferentValues) + settings.aniso = m_Aniso.intValue; + + + if (!m_AlphaIsTransparency.hasMultipleDifferentValues) + settings.alphaIsTransparency = m_AlphaIsTransparency.intValue > 0; + + if (!m_TextureType.hasMultipleDifferentValues) + settings.textureType = (TextureImporterType)m_TextureType.intValue; + + if (!m_TextureShape.hasMultipleDifferentValues) + settings.textureShape = (TextureImporterShape)m_TextureShape.intValue; + + return settings; + } + /// + /// Override of AssetImporterEditor.showImportedObject + /// The property always returns false so that imported objects does not show up in the Inspector. + /// + /// false + public override bool showImportedObject + { + get { return false; } + } + + public bool textureTypeHasMultipleDifferentValues + { + get { return m_TextureType.hasMultipleDifferentValues; } + } + + public TextureImporterType textureType + { + get { return (TextureImporterType)m_TextureType.intValue; } + } + + public SpriteImportMode spriteImportMode + { + get { return (SpriteImportMode)m_SpriteMode.intValue; } + } + + public override bool HasModified() + { + if (base.HasModified()) + return true; + + return m_TexturePlatformSettingsHelper.HasModified(); + } + + internal class Styles + { + public readonly GUIContent textureTypeTitle = new GUIContent("Texture Type", "What will this texture be used for?"); + public readonly GUIContent[] textureTypeOptions = + { + new GUIContent("Default", "Texture is a normal image such as a diffuse texture or other."), + new GUIContent("Sprite (2D and UI)", "Texture is used for a sprite."), + }; + public readonly int[] textureTypeValues = + { + (int)TextureImporterType.Default, + (int)TextureImporterType.Sprite, + }; + + private readonly GUIContent textureShape2D = new GUIContent("2D, Texture is 2D."); + private readonly GUIContent textureShapeCube = new GUIContent("Cube", "Texture is a Cubemap."); + public readonly Dictionary textureShapeOptionsDictionnary = new Dictionary(); + public readonly Dictionary textureShapeValuesDictionnary = new Dictionary(); + + + public readonly GUIContent filterMode = new GUIContent("Filter Mode"); + public readonly GUIContent[] filterModeOptions = + { + new GUIContent("Point (no filter)"), + new GUIContent("Bilinear"), + new GUIContent("Trilinear") + }; + + public readonly GUIContent mipmapFadeOutToggle = new GUIContent("Fadeout Mip Maps"); + public readonly GUIContent mipmapFadeOut = new GUIContent("Fade Range"); + public readonly GUIContent readWrite = new GUIContent("Read/Write Enabled", "Enable to be able to access the raw pixel data from code."); + + public readonly GUIContent alphaSource = new GUIContent("Alpha Source", "How is the alpha generated for the imported texture."); + public readonly GUIContent[] alphaSourceOptions = + { + new GUIContent("None", "No Alpha will be used."), + new GUIContent("Input Texture Alpha", "Use Alpha from the input texture if one is provided."), + new GUIContent("From Gray Scale", "Generate Alpha from image gray scale."), + }; + public readonly int[] alphaSourceValues = + { + (int)TextureImporterAlphaSource.None, + (int)TextureImporterAlphaSource.FromInput, + (int)TextureImporterAlphaSource.FromGrayScale, + }; + + public readonly GUIContent generateMipMaps = new GUIContent("Generate Mip Maps"); + public readonly GUIContent sRGBTexture = new GUIContent("sRGB (Color Texture)", "Texture content is stored in gamma space. Non-HDR color textures should enable this flag (except if used for IMGUI)."); + public readonly GUIContent borderMipMaps = new GUIContent("Border Mip Maps"); + public readonly GUIContent mipMapsPreserveCoverage = new GUIContent("Mip Maps Preserve Coverage", "The alpha channel of generated Mip Maps will preserve coverage during the alpha test."); + public readonly GUIContent alphaTestReferenceValue = new GUIContent("Alpha Cutoff Value", "The reference value used during the alpha test. Controls Mip Map coverage."); + public readonly GUIContent mipMapFilter = new GUIContent("Mip Map Filtering"); + public readonly GUIContent[] mipMapFilterOptions = + { + new GUIContent("Box"), + new GUIContent("Kaiser"), + }; + public readonly GUIContent npot = new GUIContent("Non Power of 2", "How non-power-of-two textures are scaled on import."); + + public readonly GUIContent spriteMode = new GUIContent("Sprite Mode"); + public readonly GUIContent[] spriteModeOptions = + { + new GUIContent("Single"), + new GUIContent("Multiple"), + new GUIContent("Polygon"), + }; + public readonly GUIContent[] spriteMeshTypeOptions = + { + new GUIContent("Full Rect"), + new GUIContent("Tight"), + }; + + public readonly GUIContent spritePixelsPerUnit = new GUIContent("Pixels Per Unit", "How many pixels in the sprite correspond to one unit in the world."); + public readonly GUIContent spriteExtrude = new GUIContent("Extrude Edges", "How much empty area to leave around the sprite in the generated mesh."); + public readonly GUIContent spriteMeshType = new GUIContent("Mesh Type", "Type of sprite mesh to generate."); + public readonly GUIContent spriteAlignment = new GUIContent("Pivot", "Sprite pivot point in its local space. May be used for syncing animation frames of different sizes."); + public readonly GUIContent characterAlignment = new GUIContent("Pivot", "Character pivot point in its local space using normalized value i.e. 0 - 1"); + + public readonly GUIContent[] spriteAlignmentOptions = + { + new GUIContent("Center"), + new GUIContent("Top Left"), + new GUIContent("Top"), + new GUIContent("Top Right"), + new GUIContent("Left"), + new GUIContent("Right"), + new GUIContent("Bottom Left"), + new GUIContent("Bottom"), + new GUIContent("Bottom Right"), + new GUIContent("Custom"), + }; + + public readonly GUIContent warpNotSupportWarning = new GUIContent("Graphics device doesn't support Repeat wrap mode on NPOT textures. Falling back to Clamp."); + public readonly GUIContent anisoLevelLabel = new GUIContent("Aniso Level"); + public readonly GUIContent anisotropicDisableInfo = new GUIContent("Anisotropic filtering is disabled for all textures in Quality Settings."); + public readonly GUIContent anisotropicForceEnableInfo = new GUIContent("Anisotropic filtering is enabled for all textures in Quality Settings."); + public readonly GUIContent unappliedSettingsDialogTitle = new GUIContent("Unapplied import settings"); + public readonly GUIContent unappliedSettingsDialogContent = new GUIContent("Unapplied import settings for \'{0}\'.\nApply and continue to sprite editor or cancel."); + public readonly GUIContent applyButtonLabel = new GUIContent("Apply"); + public readonly GUIContent revertButtonLabel = new GUIContent("Revert"); + public readonly GUIContent spriteEditorButtonLabel = new GUIContent("Open Sprite Editor"); + public readonly GUIContent resliceFromLayerWarning = new GUIContent("This will reinitialize and recreate all Sprites based on the file’s layer data. Existing Sprite metadata from previously generated Sprites are copied over."); + public readonly GUIContent alphaIsTransparency = new GUIContent("Alpha Is Transparency", "If the provided alpha channel is transparency, enable this to pre-filter the color to avoid texture filtering artifacts. This is not supported for HDR textures."); + + public readonly GUIContent advancedHeaderText = new GUIContent("Advanced", "Show advanced settings."); + + public readonly GUIContent platformSettingsHeaderText = new GUIContent("Platform Setttings"); + + public readonly GUIContent[] platformSettingsSelection; + + public readonly GUIContent wrapModeLabel = new GUIContent("Wrap Mode"); + public readonly GUIContent wrapU = new GUIContent("U axis"); + public readonly GUIContent wrapV = new GUIContent("V axis"); + public readonly GUIContent wrapW = new GUIContent("W axis"); + + + public readonly GUIContent[] wrapModeContents = + { + new GUIContent("Repeat"), + new GUIContent("Clamp"), + new GUIContent("Mirror"), + new GUIContent("Mirror Once"), + new GUIContent("Per-axis") + }; + public readonly int[] wrapModeValues = + { + (int)TextureWrapMode.Repeat, + (int)TextureWrapMode.Clamp, + (int)TextureWrapMode.Mirror, + (int)TextureWrapMode.MirrorOnce, + -1 + }; + + public readonly GUIContent layerMapping = EditorGUIUtility.TrTextContent("Layer Mapping", "Options for indicating how layer to Sprite mapping."); + public readonly GUIContent generatePhysicsShape = EditorGUIUtility.TrTextContent("Generate Physics Shape", "Generates a default physics shape from the outline of the Sprite/s when a physics shape has not been set in the Sprite Editor."); + public readonly GUIContent importHiddenLayer = EditorGUIUtility.TrTextContent("Layer", "Import hidden layers."); + public readonly GUIContent mosaicLayers = EditorGUIUtility.TrTextContent("Import Mode", "Layers will be imported as individual Sprites."); + public readonly GUIContent characterMode = EditorGUIUtility.TrTextContent("Use as Rig","Enable to support 2D Animation character rigging."); + public readonly GUIContent layerGroupLabel = EditorGUIUtility.TrTextContent("Layer Group", "GameObjects are grouped according to source file layer grouping."); + public readonly GUIContent resliceFromLayer = EditorGUIUtility.TrTextContent("Automatic Reslice", "Recreate Sprite rects from file."); + public readonly GUIContent paperDollMode = EditorGUIUtility.TrTextContent("Paper Doll Mode", "Special mode to generate a Prefab for Paper Doll use case."); + public readonly GUIContent keepDuplicateSpriteName = EditorGUIUtility.TrTextContent("Layer Name", "Keep Sprite name same as Layer Name even if there are duplicated Layer Name."); + public readonly GUIContent mainSkeletonName = EditorGUIUtility.TrTextContent("Main Skeleton", "Main Skeleton to use for Rigging."); + public readonly GUIContent generalHeaderText = EditorGUIUtility.TrTextContent("General", "General settings."); + public readonly GUIContent spriteHeaderText = EditorGUIUtility.TrTextContent("Sprite","Sprite settings."); + public readonly GUIContent layerImportHeaderText = EditorGUIUtility.TrTextContent("Layer Import","Layer Import settings."); + public readonly GUIContent characterRigHeaderText = EditorGUIUtility.TrTextContent("Character Rig","Character Rig settings."); + public readonly GUIContent textureHeaderText = EditorGUIUtility.TrTextContent("Texture","Texture settings."); + public readonly GUIContent defaultHeaderText = EditorGUIUtility.TrTextContent("Default","Default Texture settings."); + + + public readonly int[] falseTrueOptionValue = + { + 0, + 1 + }; + + public readonly GUIContent[] layerOptions = + { + EditorGUIUtility.TrTextContent("Visible Layers Only", "Import only layers that are visible."), + EditorGUIUtility.TrTextContent("Include Hidden Layers","Import all layers, including hidden layers.") + }; + + public readonly GUIContent[] importModeOptions= + { + EditorGUIUtility.TrTextContent("Individual Sprites (Mosaic)","Import individual Photoshop layers as Sprites."), + new GUIContent("Merged","Merge Photoshop layers and import as single Sprite.") + }; + + public readonly GUIContent[] dupllicateNameOption= + { + EditorGUIUtility.TrTextContent("Resolve Duplicate Names","Ensure Sprite names are unique."), + EditorGUIUtility.TrTextContent("Keep Duplicate Names","Keep layer's name even if duplicate.") + }; + + public readonly GUIContent[] layerMappingOption= + { + EditorGUIUtility.TrTextContent("Use Layer ID","Use layer's ID to identify layer and Sprite mapping."), + EditorGUIUtility.TrTextContent("Use Layer Name","Use layer's name to identify layer and Sprite mapping."), + EditorGUIUtility.TrTextContent("Use Layer Name (Case Sensitive)","Use layer's name to identify layer and Sprite mapping."), + }; + + public readonly int[] layerMappingOptionValues = + { + (int)PSDImporter.ELayerMappingOption.UseLayerId, + (int)PSDImporter.ELayerMappingOption.UseLayerName, + (int)PSDImporter.ELayerMappingOption.UseLayerNameCaseSensitive + }; + + public readonly GUIContent[] layerGroupOption= + { + EditorGUIUtility.TrTextContent("Ignore Layer Groups","Only layers will generate GameObjects."), + EditorGUIUtility.TrTextContent("As Per Source File", "Group GameObjects according to source file's layer grouping") + }; + + public readonly GUIContent[] editorTabNames = + { + EditorGUIUtility.TrTextContent("Settings", "Importer Settings."), + EditorGUIUtility.TrTextContent("Layer Management", "Layer merge settings.") + }; + + public Styles() + { + // This is far from ideal, but it's better than having tons of logic in the GUI code itself. + // The combination should not grow too much anyway since only Texture3D will be added later. + GUIContent[] s2D_Options = { textureShape2D }; + GUIContent[] sCube_Options = { textureShapeCube }; + GUIContent[] s2D_Cube_Options = { textureShape2D, textureShapeCube }; + textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D, s2D_Options); + textureShapeOptionsDictionnary.Add(TextureImporterShape.TextureCube, sCube_Options); + textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Options); + + int[] s2D_Values = { (int)TextureImporterShape.Texture2D }; + int[] sCube_Values = { (int)TextureImporterShape.TextureCube }; + int[] s2D_Cube_Values = { (int)TextureImporterShape.Texture2D, (int)TextureImporterShape.TextureCube }; + textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D, s2D_Values); + textureShapeValuesDictionnary.Add(TextureImporterShape.TextureCube, sCube_Values); + textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Values); + + platformSettingsSelection = new GUIContent[TexturePlatformSettingsModal.kValidBuildPlatform.Length]; + for (int i = 0; i < TexturePlatformSettingsModal.kValidBuildPlatform.Length; ++i) + { + platformSettingsSelection[i] = new GUIContent(TexturePlatformSettingsModal.kValidBuildPlatform[i].buildTargetName); + } + } + } + + internal static Styles s_Styles; + } + + class PSDImporterEditorFoldOutState + { + SavedBool m_GeneralFoldout; + SavedBool m_DefaultTypeFoldout; + SavedBool m_SpriteFoldout; + SavedBool m_LayerImportFoldout; + SavedBool m_CharacterRigFoldout; + SavedBool m_AdvancedFoldout; + SavedBool m_TextureFoldout; + SavedBool m_PlatformSettingsFoldout; + + public PSDImporterEditorFoldOutState() + { + m_GeneralFoldout = new SavedBool("PSDImporterEditor.m_GeneralFoldout", true); + m_DefaultTypeFoldout = new SavedBool("PSDImporterEditor.m_DefaultTypeFoldout", true); + m_SpriteFoldout = new SavedBool("PSDImporterEditor.m_SpriteFoldout", true); + m_LayerImportFoldout = new SavedBool("PSDImporterEditor.m_LayerImportFoldout", true); + m_CharacterRigFoldout = new SavedBool("PSDImporterEditor.m_CharacterRigFoldout", false); + m_AdvancedFoldout = new SavedBool("PSDImporterEditor.m_AdvancedFoldout", false); + m_TextureFoldout = new SavedBool("PSDImporterEditor.m_TextureFoldout", false); + m_PlatformSettingsFoldout = new SavedBool("PSDImporterEditor.m_PlatformSettingsFoldout", false); + } + + bool DoFoldout(GUIContent title, bool state) + { + InspectorUtils.DrawSplitter(); + return InspectorUtils.DrawHeaderFoldout(title, state); + } + + public bool DoGeneralUI(GUIContent title) + { + m_GeneralFoldout.value = DoFoldout(title, m_GeneralFoldout.value); + return m_GeneralFoldout.value; + } + + public bool DoDefaultTypeUI(GUIContent title) + { + m_DefaultTypeFoldout.value = DoFoldout(title, m_DefaultTypeFoldout.value); + return m_DefaultTypeFoldout.value; + } + + public bool DoSpriteUI(GUIContent title) + { + m_SpriteFoldout.value = DoFoldout(title, m_SpriteFoldout.value); + return m_SpriteFoldout.value; + } + + public bool DoLayerImportUI(GUIContent title) + { + m_LayerImportFoldout.value = DoFoldout(title, m_LayerImportFoldout.value); + return m_LayerImportFoldout.value; + } + + public bool DoCharacterRigUI(GUIContent title) + { + m_CharacterRigFoldout.value = DoFoldout(title, m_CharacterRigFoldout.value); + return m_CharacterRigFoldout.value; + } + + public bool DoAdvancedUI(GUIContent title) + { + m_AdvancedFoldout.value = DoFoldout(title, m_AdvancedFoldout.value); + return m_AdvancedFoldout.value; + } + + public bool DoPlatformSettingsUI(GUIContent title) + { + m_PlatformSettingsFoldout.value = DoFoldout(title, m_PlatformSettingsFoldout.value); + return m_PlatformSettingsFoldout.value; + } + + public bool DoTextureUI(GUIContent title) + { + m_TextureFoldout.value = DoFoldout(title, m_TextureFoldout.value); + return m_TextureFoldout.value; + } + + class SavedBool + { + bool m_Value; + string m_Name; + bool m_Loaded; + + public SavedBool(string name, bool value) + { + m_Name = name; + m_Loaded = false; + m_Value = value; + } + + private void Load() + { + if (m_Loaded) + return; + + m_Loaded = true; + m_Value = EditorPrefs.GetBool(m_Name, m_Value); + } + + public bool value + { + get { Load(); return m_Value; } + set + { + Load(); + if (m_Value == value) + return; + m_Value = value; + EditorPrefs.SetBool(m_Name, value); + } + } + + public static implicit operator bool(SavedBool s) + { + return s.value; + } + } + } +} diff --git a/Editor/PSDImporterEditor.cs.meta b/Editor/PSDImporterEditor.cs.meta index eb174d7..b9895fe 100644 --- a/Editor/PSDImporterEditor.cs.meta +++ b/Editor/PSDImporterEditor.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 18bf2b24e4cf52b4db1d73f71d4bd76b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 18bf2b24e4cf52b4db1d73f71d4bd76b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDImporterEditorLayerTreeView.cs b/Editor/PSDImporterEditorLayerTreeView.cs new file mode 100644 index 0000000..c897062 --- /dev/null +++ b/Editor/PSDImporterEditorLayerTreeView.cs @@ -0,0 +1,289 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor.Experimental; +using UnityEditor.IMGUI.Controls; +using UnityEngine; +using UnityEngine.UIElements; + +namespace UnityEditor.U2D.PSD +{ + class PSDNode : TreeViewItem + { + public PSDLayer layer; + bool m_Disable = false; + + public bool disable + { + get => m_Disable; + set => m_Disable = value; + } + + public PSDNode() + { + id = 1; + displayName = ""; + } + + public PSDNode(PSDLayer layer, int id) + { + this.layer = layer; + displayName = layer.name; + this.id = id; + } + + public virtual void ChildGroupFlatten(bool flatten) { } + public virtual void FlattenStateChange() { } + public virtual void NotifyParentOnFlattenChange() { } + } + + class PSDLayerNode : PSDNode + { + public PSDLayerNode(PSDLayer layer, int id):base(layer, id) + { } + } + + class PSDLayerGroupNode : PSDNode + { + int m_ChildFlattenCount; + public PSDLayerGroupNode(PSDLayer layer, int id) + : base(layer, id) + { + this.icon = EditorGUIUtility.FindTexture(EditorResources.folderIconName); + m_ChildFlattenCount = 0; + } + + public int childFlattenCount => m_ChildFlattenCount; + + public override void NotifyParentOnFlattenChange() + { + var pp = parent as PSDNode; + if(pp != null) + pp.ChildGroupFlatten(layer.flatten); + } + + public override void ChildGroupFlatten(bool flatten) + { + m_ChildFlattenCount += flatten ? 1 : -1; + var pp = parent as PSDNode; + if(pp != null) + pp.ChildGroupFlatten(flatten); + } + + public override void FlattenStateChange() + { + if (children != null) + { + foreach (var child in children) + { + var p = ((PSDNode)child); + if (p != null) + { + p.disable = layer.flatten || this.disable; + p.FlattenStateChange(); + } + } + } + } + } + + static class Style + { + static public GUIStyle hoverLine = "TV Selection"; + static public GUIStyle flattenToggleStyle = "MultiColumnHeaderCenter"; + static public readonly string k_LightIconResourcePath = "Icons/Light"; + static public readonly string k_DarkIconResourcePath = "Icons/Dark"; + static public readonly string k_SelectedIconResourcePath = "Icons/Selected"; + static public GUIContent visibilityIcon = EditorGUIUtility.IconContent("animationvisibilitytoggleoff", L10n.Tr("|Layer is not visible in source file")); + public static readonly GUIContent[] collapsedIcon = + { + new GUIContent(LoadIconResource("Layers Separated", k_LightIconResourcePath, k_DarkIconResourcePath), L10n.Tr("Layers Separated. Click to collapse them.")), + new GUIContent(LoadIconResource("Layers Separated", k_SelectedIconResourcePath, k_SelectedIconResourcePath), L10n.Tr("Layers Separated. Click to collapse them.")) + }; + public static readonly GUIContent[] separateIcon = + { + new GUIContent(LoadIconResource("Layers Collapsed", k_LightIconResourcePath, k_DarkIconResourcePath), L10n.Tr("Layers collapsed. Click to separate them.")), + new GUIContent(LoadIconResource("Layers Collapsed", k_SelectedIconResourcePath, k_SelectedIconResourcePath), L10n.Tr("Layers collapsed. Click to separate them.")) + }; + public static readonly GUIContent[] collapseMix = + { + new GUIContent(LoadIconResource("Layers Mixed", k_LightIconResourcePath, k_DarkIconResourcePath), L10n.Tr("Group contains child groups that are collapsed.")), + new GUIContent(LoadIconResource("Layers Mixed", k_SelectedIconResourcePath, k_SelectedIconResourcePath), L10n.Tr("Group contains child groups that are collapsed.")) + }; + + const string k_ResourcePath = "Packages/com.unity.2d.psdimporter/Editor/Assets"; + + public static int iconSize = 16; + public static int iconPadding = 6; + public static Texture2D LoadIconResource(string name, string personalPath, string proPath) + { + string iconPath = ""; + + if (EditorGUIUtility.isProSkin && !string.IsNullOrEmpty(proPath)) + iconPath = Path.Combine(proPath, name); + else + iconPath = Path.Combine(personalPath, name); + if (EditorGUIUtility.pixelsPerPoint > 1.0f) + { + var icon2x = Load(iconPath + "@4x.png"); + if (icon2x != null) + return icon2x; + } + + return Load(iconPath+"@2x.png"); + } + + internal static T Load(string path) where T : Object + { + var assetPath = Path.Combine(k_ResourcePath, path); + var asset = AssetDatabase.LoadAssetAtPath(assetPath); + return asset; + } + + static Style() + { + flattenToggleStyle.border = new RectOffset(); + flattenToggleStyle.margin = new RectOffset(); + flattenToggleStyle.padding = new RectOffset(); + } + } + + internal class PSDImporterEditorLayerTreeView : TreeView + { + List m_Layers; + bool m_ShowHidden; + bool m_HasChanged; + public PSDImporterEditorLayerTreeView(TreeViewState treeViewState, List layers, bool showHidden) + : base(treeViewState) + { + m_Layers = layers; + showAlternatingRowBackgrounds = true; + showBorder = true; + m_ShowHidden = showHidden; + m_HasChanged = false; + baseIndent = 32; + useScrollView = true; + Reload(); + } + + public bool showHidden + { + get => m_ShowHidden; + set + { + if (m_ShowHidden != value) + { + m_ShowHidden = value; + Reload(); + } + } + } + + protected override TreeViewItem BuildRoot() + { + var root = new TreeViewItem { id = 0, depth = -1, displayName = "Root" }; + if (m_Layers != null) + { + PSDNode[] nodes = new PSDNode[m_Layers.Count]; + for(int i = 0; i < m_Layers.Count; ++i) + { + var l = m_Layers[i]; + if (l!= null && l.isGroup) + nodes[i] = new PSDLayerGroupNode(l, i); + else + nodes[i] = new PSDLayerNode(l, i); + } + foreach (var node in nodes) + { + if (showHidden || node.layer.isVisible) + { + if (node.layer.parentIndex == -1) + { + root.AddChild(node); + } + else + { + nodes[node.layer.parentIndex].AddChild(node); + node.disable = nodes[node.layer.parentIndex].layer.flatten || nodes[node.layer.parentIndex].disable; + if(node.layer.flatten) + nodes[node.layer.parentIndex].ChildGroupFlatten(node.layer.flatten); + } + } + } + } + if(root.children == null) + root.children = new List(); + SetupDepthsFromParentsAndChildren(root); + + return root; + } + + + protected override void RowGUI(RowGUIArgs args) + { + var node = (PSDNode)args.item; + var rowRect = args.rowRect; + using (new EditorGUI.DisabledScope(node.disable)) + { + var hover = rowRect.Contains(Event.current.mousePosition); + var a1 = args.focused; + var a2 = args.selected; + if (hover && Event.current.type == EventType.Repaint) + { + args.selected = args.focused = true; + Style.hoverLine.Draw(rowRect, false, false, a2, true); + } + + base.RowGUI(args); + args.focused = a1; + args.selected = a2; + + if (node.layer != null && !node.layer.isVisible) + { + GUI.Box(new Rect(rowRect.x, rowRect.y, Style.iconSize, Style.iconSize), Style.visibilityIcon, Style.flattenToggleStyle); + } + + if (args.item is PSDLayerGroupNode) + { + var group = (PSDLayerGroupNode)args.item; + Rect toggleRect = new Rect(rowRect.x + foldoutWidth + Style.iconPadding + args.item.depth * this.depthIndentWidth, rowRect.y, Style.iconSize, Style.iconSize); + EditorGUI.BeginChangeCheck(); + GUIContent[] icon = null; + if (group.childFlattenCount != 0) + icon = Style.collapseMix; + if (hover) + { + if(group.layer.flatten) + icon = Style.separateIcon; + else + icon = Style.collapsedIcon; + } + else if(group.layer.flatten) + icon = Style.collapsedIcon; + + if (icon != null) + { + var iconIndex = args.selected ? 1 : 0; + group.layer.flatten = GUI.Toggle(toggleRect, group.layer.flatten, icon[iconIndex], Style.flattenToggleStyle); + } + + + if (EditorGUI.EndChangeCheck()) + { + group.FlattenStateChange(); + group.NotifyParentOnFlattenChange(); + m_HasChanged = true; + } + } + } + } + + public bool GetHasChangeAndClear() + { + var v = m_HasChanged; + m_HasChanged = false; + return v; + } + } +} + diff --git a/Editor/PSDImporterEditorLayerTreeView.cs.meta b/Editor/PSDImporterEditorLayerTreeView.cs.meta new file mode 100644 index 0000000..5625a99 --- /dev/null +++ b/Editor/PSDImporterEditorLayerTreeView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 80017cefa3a2d420e8b94e85e260a4f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDLayer.cs b/Editor/PSDLayer.cs index 57f6cc5..3db17e4 100644 --- a/Editor/PSDLayer.cs +++ b/Editor/PSDLayer.cs @@ -1,59 +1,82 @@ -using System; -using Unity.Collections; -using UnityEngine; - -namespace UnityEditor.U2D.PSD -{ - [Serializable] - class PSDLayer - { - [SerializeField] - string m_Name; - [SerializeField] - string m_SpriteName; - [SerializeField] - bool m_IsGroup; - [SerializeField] - int m_ParentIndex; - [SerializeField] - string m_SpriteID; - [SerializeField] - int m_LayerID; - [SerializeField] - Vector2Int m_MosaicPosition; - - [NonSerialized] - GameObject m_GameObject; - - public PSDLayer(NativeArray tex, int parent, bool group, string layerName, int width, int height, int id) - { - isGroup = group; - parentIndex = parent; - texture = tex; - name = layerName; - this.width = width; - this.height = height; - layerID = id; - } - - public int layerID { get { return m_LayerID; } private set { m_LayerID = value; } } - - public string name { get { return m_Name; } private set { m_Name = value; } } - public string spriteName { get { return m_SpriteName; } set { m_SpriteName = value; } } - public bool isGroup { get { return m_IsGroup; } private set { m_IsGroup = value; } } - public int parentIndex { get { return m_ParentIndex; } private set { m_ParentIndex = value; } } - public Vector2Int mosaicPosition { get { return m_MosaicPosition; } set { m_MosaicPosition = value; } } - public GUID spriteID { get { return new GUID(m_SpriteID); } set { m_SpriteID = value.ToString(); } } - public GameObject gameObject { get { return m_GameObject; } set { m_GameObject = value; } } - - public NativeArray texture { get; set; } - public int width { get; private set; } - public int height { get; private set; } - - public void Dispose() - { - if (texture.IsCreated) - texture.Dispose(); - } - } -} +using System; +using Unity.Collections; +using UnityEngine; + +namespace UnityEditor.U2D.PSD +{ + [Serializable] + class PSDLayer + { + [SerializeField] + string m_Name; + [SerializeField] + string m_SpriteName; + [SerializeField] + bool m_IsGroup; + [SerializeField] + int m_ParentIndex; + [SerializeField] + string m_SpriteID; + [SerializeField] + int m_LayerID; + [SerializeField] + Vector2Int m_MosaicPosition; + [SerializeField] + bool m_Flatten; + [SerializeField] + bool m_IsImported; + [SerializeField] + bool m_IsVisible; + + [NonSerialized] + GameObject m_GameObject; + + public PSDLayer(NativeArray tex, int parent, bool group, string layerName, int width, int height, int id, bool hidden) + { + isGroup = group; + parentIndex = parent; + texture = tex; + name = layerName; + this.width = width; + this.height = height; + layerID = id; + m_Flatten = false; + m_IsImported = false; + m_IsVisible = hidden; + m_SpriteID = new GUID().ToString(); + } + + public bool isVisible => m_IsVisible; + public int layerID { get { return m_LayerID; } private set { m_LayerID = value; } } + + public string name { get { return m_Name; } private set { m_Name = value; } } + public string spriteName { get { return m_SpriteName; } set { m_SpriteName = value; } } + public bool isGroup { get { return m_IsGroup; } private set { m_IsGroup = value; } } + public int parentIndex { get { return m_ParentIndex; } private set { m_ParentIndex = value; } } + public Vector2Int mosaicPosition { get { return m_MosaicPosition; } set { m_MosaicPosition = value; } } + public GUID spriteID { get { return new GUID(m_SpriteID); } set { m_SpriteID = value.ToString(); } } + public GameObject gameObject { get { return m_GameObject; } set { m_GameObject = value; } } + + public bool flatten + { + get => m_Flatten; + set => m_Flatten = value; + } + + public bool isImported + { + get => m_IsImported; + set => m_IsImported = value; + } + + public NativeArray texture { get; set; } + public int width { get; private set; } + public int height { get; private set; } + + public void Dispose() + { + if (texture.IsCreated) + texture.Dispose(); + } + } +} diff --git a/Editor/PSDLayer.cs.meta b/Editor/PSDLayer.cs.meta index 4d8cf68..b602270 100644 --- a/Editor/PSDLayer.cs.meta +++ b/Editor/PSDLayer.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: a775ce65fe4b55c46a628fa416f319d3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: a775ce65fe4b55c46a628fa416f319d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDLayerMappingStrategy.cs b/Editor/PSDLayerMappingStrategy.cs new file mode 100644 index 0000000..72f631a --- /dev/null +++ b/Editor/PSDLayerMappingStrategy.cs @@ -0,0 +1,131 @@ +using System.Collections; +using System.Collections.Generic; +using PDNWrapper; +using UnityEngine; + +namespace UnityEditor.U2D.PSD +{ + internal interface IPSDLayerMappingStrategy + { + bool Compare(PSDLayer a, PSDLayer b); + bool Compare(PSDImporter.FlattenLayerData a, BitmapLayer b); + string LayersUnique(IEnumerable layers); + } + + internal abstract class LayerMappingStrategy : IPSDLayerMappingStrategy + { + string m_DuplicatedStringError = L10n.Tr("The following layers have duplicated identifier."); + protected abstract T GetID(PSDLayer layer); + protected abstract T GetID(BitmapLayer layer); + protected abstract T GetID(PSDImporter.FlattenLayerData layer); + + protected virtual bool IsGroup(PSDLayer layer) + { + return layer.isGroup; + } + + protected virtual bool IsGroup(BitmapLayer layer) + { + return layer.IsGroup; + } + + protected virtual bool IsGroup(PSDImporter.FlattenLayerData layer) + { + return true; + } + + public bool Compare(PSDImporter.FlattenLayerData x, BitmapLayer y) + { + return Comparer.Default.Compare(GetID(x), GetID(y)) == 0 && IsGroup(x) == IsGroup(y); + } + + public bool Compare(PSDLayer x, PSDLayer y) + { + return Comparer.Default.Compare(GetID(x), GetID(y)) == 0 && IsGroup(x) == IsGroup(y); + } + + public string LayersUnique(IEnumerable layers) + { + var layerNameHash = new HashSet(); + var layerGroupHash = new HashSet(); + return LayersUnique(layers, layerNameHash, layerGroupHash); + } + + string LayersUnique(IEnumerable layers, HashSet layerNameHash, HashSet layerGroupHash) + { + List duplicateLayerName = new List(); + string duplicatedStringError = null; + foreach (var layer in layers) + { + var id = GetID(layer); + var hash = layer.isGroup ? layerGroupHash : layerNameHash; + if (hash.Contains(id)) + duplicateLayerName.Add(layer.name); + else + hash.Add(id); + } + + if (duplicateLayerName.Count > 0) + { + duplicatedStringError = m_DuplicatedStringError + "\n"; + duplicatedStringError += string.Join(", ", duplicateLayerName); + } + return duplicatedStringError; + } + } + + internal class LayerMappingUseLayerName : LayerMappingStrategy + { + protected override string GetID(PSDLayer x) + { + return x.name.ToLower(); + } + + protected override string GetID(BitmapLayer x) + { + return x.Name.ToLower(); + } + + protected override string GetID(PSDImporter.FlattenLayerData x) + { + return x.name.ToLower(); + } + } + + internal class LayerMappingUseLayerNameCaseSensitive : LayerMappingStrategy + { + protected override string GetID(PSDLayer x) + { + return x.name; + } + + protected override string GetID(BitmapLayer x) + { + return x.Name; + } + + protected override string GetID(PSDImporter.FlattenLayerData x) + { + return x.name; + } + } + + internal class LayerMappingUserLayerID : LayerMappingStrategy + { + protected override int GetID(PSDLayer x) + { + return x.layerID; + } + + protected override int GetID(BitmapLayer x) + { + return x.LayerID; + } + + protected override int GetID(PSDImporter.FlattenLayerData x) + { + return x.layerId; + } + } +} + diff --git a/Editor/PSDLayerMappingStrategy.cs.meta b/Editor/PSDLayerMappingStrategy.cs.meta new file mode 100644 index 0000000..858b059 --- /dev/null +++ b/Editor/PSDLayerMappingStrategy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 593105009190643a2a3408a3cfdd0a14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin.meta b/Editor/PSDPlugin.meta index ad5c91f..b78ae1c 100644 --- a/Editor/PSDPlugin.meta +++ b/Editor/PSDPlugin.meta @@ -1,10 +1,10 @@ -fileFormatVersion: 2 -guid: c21e2663cf9e69a40b8ac0838a3f9ae1 -folderAsset: yes -timeCreated: 1502356798 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: c21e2663cf9e69a40b8ac0838a3f9ae1 +folderAsset: yes +timeCreated: 1502356798 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/AssemblyInfo.cs b/Editor/PSDPlugin/AssemblyInfo.cs index 320536a..8ebf792 100644 --- a/Editor/PSDPlugin/AssemblyInfo.cs +++ b/Editor/PSDPlugin/AssemblyInfo.cs @@ -1,3 +1,3 @@ -using System.Runtime.CompilerServices; - +using System.Runtime.CompilerServices; + [assembly: InternalsVisibleTo("Unity.2D.PsdImporter.Editor")] \ No newline at end of file diff --git a/Editor/PSDPlugin/AssemblyInfo.cs.meta b/Editor/PSDPlugin/AssemblyInfo.cs.meta index 48fc37f..ce1ab1d 100644 --- a/Editor/PSDPlugin/AssemblyInfo.cs.meta +++ b/Editor/PSDPlugin/AssemblyInfo.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 86edfd93afbfbfd4a9dd8afefbb6ba14 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 86edfd93afbfbfd4a9dd8afefbb6ba14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper.meta b/Editor/PSDPlugin/PDNWrapper.meta index 9bac7a1..62a7895 100644 --- a/Editor/PSDPlugin/PDNWrapper.meta +++ b/Editor/PSDPlugin/PDNWrapper.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: 9fcfe7284d9f34b4eae286b83227271d -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9fcfe7284d9f34b4eae286b83227271d +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs b/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs index c824dc0..a6f2521 100644 --- a/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs +++ b/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs @@ -1,50 +1,50 @@ -using System.Collections; -using System.Collections.Generic; - -namespace PDNWrapper -{ - internal static class Layer - { - public static BitmapLayer CreateBackgroundLayer(int w, int h) - { - return new BitmapLayer(w, h); - } - } - - internal class BitmapLayer - { - int width, height; - - public Rectangle Bounds - { - get {return new Rectangle(0, 0, width, height); } - } - - public void Dispose() - { - Surface.Dispose(); - foreach (var layer in ChildLayer) - layer.Dispose(); - } - - public BitmapLayer(int w, int h) - { - Surface = new Surface(w, h); - width = w; - height = h; - ChildLayer = new List(); - IsGroup = false; - } - public int LayerID { get; set; } - - public bool IsGroup {get; set; } - public BitmapLayer ParentLayer {get; set; } - public List ChildLayer { get; set; } - public string Name { get; set; } - public byte Opacity { get; set; } - public bool Visible { get; set; } - public LayerBlendMode BlendMode { get; set; } - - public Surface Surface { get; set; } - } -} +using System.Collections; +using System.Collections.Generic; + +namespace PDNWrapper +{ + internal static class Layer + { + public static BitmapLayer CreateBackgroundLayer(int w, int h) + { + return new BitmapLayer(w, h); + } + } + + internal class BitmapLayer + { + int width, height; + + public Rectangle Bounds + { + get {return new Rectangle(0, 0, width, height); } + } + + public void Dispose() + { + Surface.Dispose(); + foreach (var layer in ChildLayer) + layer.Dispose(); + } + + public BitmapLayer(int w, int h) + { + Surface = new Surface(w, h); + width = w; + height = h; + ChildLayer = new List(); + IsGroup = false; + } + public int LayerID { get; set; } + + public bool IsGroup {get; set; } + public BitmapLayer ParentLayer {get; set; } + public List ChildLayer { get; set; } + public string Name { get; set; } + public byte Opacity { get; set; } + public bool Visible { get; set; } + public LayerBlendMode BlendMode { get; set; } + + public Surface Surface { get; set; } + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs.meta b/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs.meta index c427cbf..395afd5 100644 --- a/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/BitmapLayer.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 43a7a92da0ad89c40b5a39ed87329536 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 43a7a92da0ad89c40b5a39ed87329536 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/Document.cs b/Editor/PSDPlugin/PDNWrapper/Document.cs index 8cd1304..f0fd977 100644 --- a/Editor/PSDPlugin/PDNWrapper/Document.cs +++ b/Editor/PSDPlugin/PDNWrapper/Document.cs @@ -1,30 +1,30 @@ -using System.Collections; -using System.Collections.Generic; - -namespace PDNWrapper -{ - internal class Document - { - public int width, height; - - public Document(int w, int h) - { - width = w; - height = h; - Layers = new List(); - } - - public void Dispose() - { - foreach (var layer in Layers) - layer.Dispose(); - } - - public List Layers { get; set; } - - public MeasurementUnit DpuUnit { get; set; } - - public double DpuX { get; set; } - public double DpuY { get; set; } - } -} +using System.Collections; +using System.Collections.Generic; + +namespace PDNWrapper +{ + internal class Document + { + public int width, height; + + public Document(int w, int h) + { + width = w; + height = h; + Layers = new List(); + } + + public void Dispose() + { + foreach (var layer in Layers) + layer.Dispose(); + } + + public List Layers { get; set; } + + public MeasurementUnit DpuUnit { get; set; } + + public double DpuX { get; set; } + public double DpuY { get; set; } + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/Document.cs.meta b/Editor/PSDPlugin/PDNWrapper/Document.cs.meta index b727bea..c26664a 100644 --- a/Editor/PSDPlugin/PDNWrapper/Document.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/Document.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 5d036cb10363b5f4b94b39c7afb3e2d0 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 5d036cb10363b5f4b94b39c7afb3e2d0 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/Enums.cs b/Editor/PSDPlugin/PDNWrapper/Enums.cs index 100e09c..c7c18d9 100644 --- a/Editor/PSDPlugin/PDNWrapper/Enums.cs +++ b/Editor/PSDPlugin/PDNWrapper/Enums.cs @@ -1,27 +1,27 @@ -namespace PDNWrapper -{ - internal enum MeasurementUnit - { - Pixel = 1, - Inch = 2, - Centimeter = 3 - } - - internal enum LayerBlendMode - { - Normal = 0, - Multiply = 1, - Additive = 2, - ColorBurn = 3, - ColorDodge = 4, - Reflect = 5, - Glow = 6, - Overlay = 7, - Difference = 8, - Negation = 9, - Lighten = 10, - Darken = 11, - Screen = 12, - Xor = 13 - } -} +namespace PDNWrapper +{ + internal enum MeasurementUnit + { + Pixel = 1, + Inch = 2, + Centimeter = 3 + } + + internal enum LayerBlendMode + { + Normal = 0, + Multiply = 1, + Additive = 2, + ColorBurn = 3, + ColorDodge = 4, + Reflect = 5, + Glow = 6, + Overlay = 7, + Difference = 8, + Negation = 9, + Lighten = 10, + Darken = 11, + Screen = 12, + Xor = 13 + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/Enums.cs.meta b/Editor/PSDPlugin/PDNWrapper/Enums.cs.meta index 3a307e6..b1cb66e 100644 --- a/Editor/PSDPlugin/PDNWrapper/Enums.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/Enums.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: f396654a3007906488e747d54ae80913 -timeCreated: 1495006554 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: f396654a3007906488e747d54ae80913 +timeCreated: 1495006554 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs b/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs index 76fb3e7..292b358 100644 --- a/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs +++ b/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs @@ -1,624 +1,624 @@ -using System.Collections; -using System.Collections.Generic; -using Unity.Jobs; -using UnityEngine; -using Unity.Collections; -using System; -using Unity.Collections.LowLevel.Unsafe; - -namespace PaintDotNet.Data.PhotoshopFileType -{ - - #region PDNDecodeJob - - internal struct PDNDecoderData - { - // Inputs. - public PDNWrapper.Rectangle Rect; - public PDNWrapper.Rectangle LayerRect; - public PDNWrapper.Rectangle ClippedRect; - public int SurfaceWidth; - public int SurfaceHeight; - public int SurfaceByteDepth; - public DecodeType DecoderType; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray ColorChannel0; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray ColorChannel1; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray ColorChannel2; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray ColorChannel3; - - [NativeDisableParallelForRestriction] - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray ColorModeData; - - // Outputs - [NativeDisableParallelForRestriction] - public NativeArray DecodedImage; - - } - - internal struct PDNDecoderJob : IJobParallelFor - { - - public PDNDecoderData Data; - - public void Execute(int index) - { - - int idx = Data.Rect.Top + index; - { - // Calculate index into ImageData source from row and column. - int idxSrcPixel = (idx - Data.LayerRect.Top) * Data.LayerRect.Width + (Data.Rect.Left - Data.LayerRect.Left); - int idxSrcBytes = idxSrcPixel * Data.SurfaceByteDepth; - - // Calculate pointers to destination Surface. - var idxDstStart = idx * Data.SurfaceWidth + Data.ClippedRect.Left; - var idxDstStops = idx * Data.SurfaceWidth + Data.ClippedRect.Right; - - // For 16-bit images, take the higher-order byte from the image data, which is now in little-endian order. - if (Data.SurfaceByteDepth == 2) - { - idxSrcBytes++; - } - - switch (Data.DecoderType) - { - case DecodeType.RGB32: - { - SetPDNRowRgb32(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.Grayscale32: - { - SetPDNRowGrayscale32(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.RGB: - { - SetPDNRowRgb(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.CMYK: - { - SetPDNRowCmyk(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.Bitmap: - { - SetPDNRowBitmap(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.Grayscale: - { - SetPDNRowGrayscale(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.Indexed: - { - SetPDNRowIndexed(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - case DecodeType.Lab: - { - SetPDNRowLab(idxDstStart, idxDstStops, idxSrcBytes); - } - break; - } - - } - - } - - // Case 0: - private void SetPDNRowRgb32(int dstStart, int dstStops, int idxSrc) - { - NativeArray cR = Data.ColorChannel0.Reinterpret(1); - NativeArray cG = Data.ColorChannel1.Reinterpret(1); - NativeArray cB = Data.ColorChannel2.Reinterpret(1); - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - c.r = ImageDecoderPdn.RGBByteFromHDRFloat(cR[idxSrc / 4]); - c.g = ImageDecoderPdn.RGBByteFromHDRFloat(cG[idxSrc / 4]); - c.b = ImageDecoderPdn.RGBByteFromHDRFloat(cB[idxSrc / 4]); - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += 4; - } - } - - // Case 1: - private void SetPDNRowGrayscale32(int dstStart, int dstStops, int idxSrc) - { - NativeArray channel = Data.ColorChannel0.Reinterpret(1); - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - byte rgbValue = ImageDecoderPdn.RGBByteFromHDRFloat(channel[idxSrc / 4]); - c.r = rgbValue; - c.g = rgbValue; - c.b = rgbValue; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += 4; - } - } - - // Case 2: - private void SetPDNRowRgb(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - c.r = Data.ColorChannel0[idxSrc]; - c.g = Data.ColorChannel1[idxSrc]; - c.b = Data.ColorChannel2[idxSrc]; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - - // Case 3: - /////////////////////////////////////////////////////////////////////////////// - // - // The color-conversion formulas come from the Colour Space Conversions FAQ: - // http://www.poynton.com/PDFs/coloureq.pdf - // - // RGB --> CMYK CMYK --> RGB - // --------------------------------------- -------------------------------------------- - // Black = minimum(1-Red,1-Green,1-Blue) Red = 1-minimum(1,Cyan*(1-Black)+Black) - // Cyan = (1-Red-Black)/(1-Black) Green = 1-minimum(1,Magenta*(1-Black)+Black) - // Magenta = (1-Green-Black)/(1-Black) Blue = 1-minimum(1,Yellow*(1-Black)+Black) - // Yellow = (1-Blue-Black)/(1-Black) - // - /////////////////////////////////////////////////////////////////////////////// - private void SetPDNRowCmyk(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - // CMYK values are stored as complements, presumably to allow for some - // measure of compatibility with RGB-only applications. - var C = 255 - Data.ColorChannel0[idxSrc]; - var M = 255 - Data.ColorChannel1[idxSrc]; - var Y = 255 - Data.ColorChannel2[idxSrc]; - var K = 255 - Data.ColorChannel3[idxSrc]; - - int R = 255 - Math.Min(255, C * (255 - K) / 255 + K); - int G = 255 - Math.Min(255, M * (255 - K) / 255 + K); - int B = 255 - Math.Min(255, Y * (255 - K) / 255 + K); - - c.r = (byte)R; - c.g = (byte)G; - c.b = (byte)B; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - - // Case 4: - private void SetPDNRowBitmap(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - byte mask = (byte)(0x80 >> (idxSrc % 8)); - byte bwValue = (byte)(Data.ColorChannel0[idxSrc / 8] & mask); - bwValue = (bwValue == 0) ? (byte)255 : (byte)0; - - c.r = bwValue; - c.g = bwValue; - c.b = bwValue; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - - // Case 5: - private void SetPDNRowGrayscale(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - - c.r = Data.ColorChannel0[idxSrc]; - c.g = Data.ColorChannel0[idxSrc]; - c.b = Data.ColorChannel0[idxSrc]; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - - // Case 6: - private void SetPDNRowIndexed(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - int index = (int)Data.ColorChannel0[idxSrc]; - while (dstStart < dstStops) - { - c.r = Data.ColorModeData[index]; - c.g = Data.ColorModeData[index + 256]; - c.b = Data.ColorModeData[index + 2 * 256]; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - - // Case 7: - private void SetPDNRowLab(int dstStart, int dstStops, int idxSrc) - { - var c = Data.DecodedImage[dstStart]; - while (dstStart < dstStops) - { - double exL, exA, exB; - exL = (double)Data.ColorChannel0[idxSrc]; - exA = (double)Data.ColorChannel1[idxSrc]; - exB = (double)Data.ColorChannel2[idxSrc]; - - int L = (int)(exL / 2.55); - int a = (int)(exA - 127.5); - int b = (int)(exB - 127.5); - - // First, convert from Lab to XYZ. - // Standards used Observer = 2, Illuminant = D65 - - const double ref_X = 95.047; - const double ref_Y = 100.000; - const double ref_Z = 108.883; - - double var_Y = ((double)L + 16.0) / 116.0; - double var_X = (double)a / 500.0 + var_Y; - double var_Z = var_Y - (double)b / 200.0; - - double var_X3 = var_X * var_X * var_X; - double var_Y3 = var_Y * var_Y * var_Y; - double var_Z3 = var_Z * var_Z * var_Z; - - if (var_Y3 > 0.008856) - var_Y = var_Y3; - else - var_Y = (var_Y - 16 / 116) / 7.787; - - if (var_X3 > 0.008856) - var_X = var_X3; - else - var_X = (var_X - 16 / 116) / 7.787; - - if (var_Z3 > 0.008856) - var_Z = var_Z3; - else - var_Z = (var_Z - 16 / 116) / 7.787; - - double X = ref_X * var_X; - double Y = ref_Y * var_Y; - double Z = ref_Z * var_Z; - - // Then, convert from XYZ to RGB. - // Standards used Observer = 2, Illuminant = D65 - // ref_X = 95.047, ref_Y = 100.000, ref_Z = 108.883 - - double var_R = X * 0.032406 + Y * (-0.015372) + Z * (-0.004986); - double var_G = X * (-0.009689) + Y * 0.018758 + Z * 0.000415; - double var_B = X * 0.000557 + Y * (-0.002040) + Z * 0.010570; - - if (var_R > 0.0031308) - var_R = 1.055 * (Math.Pow(var_R, 1 / 2.4)) - 0.055; - else - var_R = 12.92 * var_R; - - if (var_G > 0.0031308) - var_G = 1.055 * (Math.Pow(var_G, 1 / 2.4)) - 0.055; - else - var_G = 12.92 * var_G; - - if (var_B > 0.0031308) - var_B = 1.055 * (Math.Pow(var_B, 1 / 2.4)) - 0.055; - else - var_B = 12.92 * var_B; - - int nRed = (int)(var_R * 256.0); - int nGreen = (int)(var_G * 256.0); - int nBlue = (int)(var_B * 256.0); - - if (nRed < 0) - nRed = 0; - else if (nRed > 255) - nRed = 255; - if (nGreen < 0) - nGreen = 0; - else if (nGreen > 255) - nGreen = 255; - if (nBlue < 0) - nBlue = 0; - else if (nBlue > 255) - nBlue = 255; - - c.r = (byte)nRed; - c.g = (byte)nGreen; - c.b = (byte)nBlue; - Data.DecodedImage[dstStart] = c; - - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - } - - #endregion - - #region AlphaDecodeJob - - internal struct PDNAlphaMaskData - { - // Inputs. - public PDNWrapper.Rectangle Rect; - public PDNWrapper.Rectangle LayerRect; - public PDNWrapper.Rectangle ClippedRect; - public int SurfaceWidth; - public int SurfaceHeight; - public int SurfaceByteDepth; - - public int HasAlphaChannel; - public int HasUserAlphaMask; - public int UserMaskInvertOnBlend; - public PDNWrapper.Rectangle UserMaskRect; - public PDNWrapper.Rectangle UserMaskContextRect; - public int HasLayerAlphaMask; - public int LayerMaskInvertOnBlend; - public PDNWrapper.Rectangle LayerMaskRect; - public PDNWrapper.Rectangle LayerMaskContextRect; - - [NativeDisableParallelForRestriction] - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray AlphaChannel0; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray UserMask; - - [DeallocateOnJobCompletion] - [NativeDisableParallelForRestriction] - public NativeArray UserAlphaMask; - - [DeallocateOnJobCompletion] - [NativeDisableParallelForRestriction] - public NativeArray UserAlphaMaskEmpty; - - [NativeDisableParallelForRestriction] - [ReadOnly] - public NativeArray LayerMask; - - [DeallocateOnJobCompletion] - [NativeDisableParallelForRestriction] - public NativeArray LayerAlphaMask; - - [DeallocateOnJobCompletion] - [NativeDisableParallelForRestriction] - public NativeArray LayerAlphaMaskEmpty; - - // Outputs - [NativeDisableParallelForRestriction] - public NativeArray DecodedImage; - - // Colors. - public byte UserMaskBackgroundColor; - public byte LayerMaskBackgroundColor; - } - - internal struct PDNAlphaMaskJob : IJob - { - - public PDNAlphaMaskData Data; - - public void Execute() - { - - for (int idx = Data.Rect.Top; idx < Data.Rect.Bottom; idx++) - { - // Calculate index into ImageData source from row and column. - int idxSrcPixel = (idx - Data.LayerRect.Top) * Data.LayerRect.Width + (Data.Rect.Left - Data.LayerRect.Left); - int idxSrcBytes = idxSrcPixel * Data.SurfaceByteDepth; - - // Calculate pointers to destination Surface. - var idxDstStart = idx * Data.SurfaceWidth + Data.ClippedRect.Left; - var idxDstStops = idx * Data.SurfaceWidth + Data.ClippedRect.Right; - - // For 16-bit images, take the higher-order byte from the image data, which is now in little-endian order. - if (Data.SurfaceByteDepth == 2) - { - idxSrcBytes++; - } - - SetPDNAlphaRow(idxDstStart, idxDstStops, idxSrcBytes); - if (0 != Data.HasLayerAlphaMask) - { - GetMaskAlphaRow(idx, Data.LayerAlphaMask, Data.LayerAlphaMaskEmpty, Data.LayerMask, Data.LayerMaskInvertOnBlend, Data.LayerMaskBackgroundColor, Data.LayerMaskContextRect, Data.LayerMaskRect); - } - if (0 != Data.HasUserAlphaMask) - { - GetMaskAlphaRow(idx, Data.UserAlphaMask, Data.UserAlphaMaskEmpty, Data.UserMask, Data.UserMaskInvertOnBlend, Data.UserMaskBackgroundColor, Data.UserMaskContextRect, Data.UserMaskRect); - } - ApplyPDNMask(idxDstStart, idxDstStops); - - } - } - - private void SetPDNAlphaRow(int dstStart, int dstStops, int idxSrc) - { - // Set alpha to fully-opaque if there is no alpha channel - if (0 == Data.HasAlphaChannel) - { - while (dstStart < dstStops) - { - var c = Data.DecodedImage[dstStart]; - c.a = 255; - Data.DecodedImage[dstStart] = c; - dstStart++; - } - } - // Set the alpha channel data - else - { - NativeArray srcAlphaChannel = Data.AlphaChannel0.Reinterpret(1); - { - while (dstStart < dstStops) - { - var c = Data.DecodedImage[dstStart]; - c.a = (Data.SurfaceByteDepth < 4) ? Data.AlphaChannel0[idxSrc] : ImageDecoderPdn.RGBByteFromHDRFloat(srcAlphaChannel[idxSrc / 4]); - - Data.DecodedImage[dstStart] = c; - dstStart++; - idxSrc += Data.SurfaceByteDepth; - } - } - } - } - - private void ApplyPDNMask(int dstStart, int dstStops) - { - // Do nothing if there are no masks - if (0 == Data.HasLayerAlphaMask && 0 == Data.HasUserAlphaMask) - { - return; - } - - // Apply one mask - else if (0 == Data.HasLayerAlphaMask || 0 == Data.HasUserAlphaMask) - { - var maskAlpha = (0 == Data.HasLayerAlphaMask) ? Data.UserAlphaMask : Data.LayerAlphaMask; - var maskStart = 0; - { - while (dstStart < dstStops) - { - var c = Data.DecodedImage[dstStart]; - c.a = (byte)(Data.DecodedImage[dstStart].a * maskAlpha[maskStart] / 255); - Data.DecodedImage[dstStart] = c; - - dstStart++; - maskStart++; - } - } - } - // Apply both masks in one pass, to minimize rounding error - else - { - var maskStart = 0; - { - while (dstStart < dstStops) - { - var c = Data.DecodedImage[dstStart]; - var alphaFactor = (Data.LayerAlphaMask[maskStart]) * (Data.UserAlphaMask[maskStart]); - c.a = (byte)(Data.DecodedImage[dstStart].a * alphaFactor / 65025); - Data.DecodedImage[dstStart] = c; - - dstStart++; - maskStart++; - } - } - } - } - - private void DecodeMaskAlphaRow32(NativeArray Alpha, int dstStart, int dstStops, NativeArray Mask, int maskStart) - { - NativeArray floatArray = Mask.Reinterpret(1); - - while (dstStart < dstStops) - { - Alpha[dstStart] = ImageDecoderPdn.RGBByteFromHDRFloat(floatArray[maskStart / 4]); - - dstStart++; - maskStart += 4; - } - } - - private void DecodeMaskAlphaRow(NativeArray Alpha, int dstStart, int dstStops, NativeArray Mask, int maskStart, int byteDepth) - { - while (dstStart < dstStops) - { - Alpha[dstStart] = Mask[maskStart]; - - dstStart++; - maskStart += byteDepth; - } - } - - private unsafe void GetMaskAlphaRow(int idxSrc, NativeArray alphaBuffer, NativeArray alphaBufferEmpty, NativeArray maskChannel, int MaskInvertOnBlend, byte MaskBackgroundColor, PDNWrapper.Rectangle MaskContextRect, PDNWrapper.Rectangle MaskRect) - { - ////////////////////////////////////// - // Transfer mask into the alpha array - // Background color for areas not covered by the mask - byte backgroundColor = (0 != MaskInvertOnBlend) ? (byte)(255 - MaskBackgroundColor) : MaskBackgroundColor; - { - var alphaBufferPtr = NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(alphaBuffer); - UnsafeUtility.MemSet(alphaBufferPtr, backgroundColor, alphaBuffer.Length); - } - // Only process if not Empty. - if (alphaBufferEmpty[idxSrc] == 0) - { - // Get pointers to starting positions - int alphaColumn = MaskContextRect.X; - // It's possible that the layer's rect is larger than the clip and it's offset. - // Since we only copy out the alpha based on the MaskContext size - // The copy will start from where the MaskContextRect is - if(Data.LayerRect.X > 0) - alphaColumn = MaskContextRect.X - Data.LayerRect.X; - var pAlpha = alphaColumn; - var pAlphaEnd = pAlpha + MaskContextRect.Width; - - int maskRow = idxSrc - MaskRect.Y; - int maskColumn = MaskContextRect.X - MaskRect.X; - int idxMaskPixel = (maskRow * MaskRect.Width) + maskColumn; - var pMask = idxMaskPixel * Data.SurfaceByteDepth; - - // Take the high-order byte if values are 16-bit (little-endian) - if (Data.SurfaceByteDepth == 2) - { - pMask++; - } - - // Decode mask into the alpha array. - if (Data.SurfaceByteDepth == 4) - { - DecodeMaskAlphaRow32(alphaBuffer, pAlpha, pAlphaEnd, maskChannel, pMask); - } - else - { - DecodeMaskAlphaRow(alphaBuffer, pAlpha, pAlphaEnd, maskChannel, pMask, Data.SurfaceByteDepth); - } - - // Obsolete since Photoshop CS6, but retained for compatibility with older versions. Note that the background has already been inverted. - if (0 != MaskInvertOnBlend) - { - PhotoshopFile.Util.Invert(alphaBuffer, pAlpha, pAlphaEnd); - } - } - } - } - - #endregion +using System.Collections; +using System.Collections.Generic; +using Unity.Jobs; +using UnityEngine; +using Unity.Collections; +using System; +using Unity.Collections.LowLevel.Unsafe; + +namespace PaintDotNet.Data.PhotoshopFileType +{ + + #region PDNDecodeJob + + internal struct PDNDecoderData + { + // Inputs. + public PDNWrapper.Rectangle Rect; + public PDNWrapper.Rectangle LayerRect; + public PDNWrapper.Rectangle ClippedRect; + public int SurfaceWidth; + public int SurfaceHeight; + public int SurfaceByteDepth; + public DecodeType DecoderType; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray ColorChannel0; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray ColorChannel1; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray ColorChannel2; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray ColorChannel3; + + [NativeDisableParallelForRestriction] + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray ColorModeData; + + // Outputs + [NativeDisableParallelForRestriction] + public NativeArray DecodedImage; + + } + + internal struct PDNDecoderJob : IJobParallelFor + { + + public PDNDecoderData Data; + + public void Execute(int index) + { + + int idx = Data.Rect.Top + index; + { + // Calculate index into ImageData source from row and column. + int idxSrcPixel = (idx - Data.LayerRect.Top) * Data.LayerRect.Width + (Data.Rect.Left - Data.LayerRect.Left); + int idxSrcBytes = idxSrcPixel * Data.SurfaceByteDepth; + + // Calculate pointers to destination Surface. + var idxDstStart = idx * Data.SurfaceWidth + Data.ClippedRect.Left; + var idxDstStops = idx * Data.SurfaceWidth + Data.ClippedRect.Right; + + // For 16-bit images, take the higher-order byte from the image data, which is now in little-endian order. + if (Data.SurfaceByteDepth == 2) + { + idxSrcBytes++; + } + + switch (Data.DecoderType) + { + case DecodeType.RGB32: + { + SetPDNRowRgb32(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.Grayscale32: + { + SetPDNRowGrayscale32(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.RGB: + { + SetPDNRowRgb(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.CMYK: + { + SetPDNRowCmyk(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.Bitmap: + { + SetPDNRowBitmap(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.Grayscale: + { + SetPDNRowGrayscale(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.Indexed: + { + SetPDNRowIndexed(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + case DecodeType.Lab: + { + SetPDNRowLab(idxDstStart, idxDstStops, idxSrcBytes); + } + break; + } + + } + + } + + // Case 0: + private void SetPDNRowRgb32(int dstStart, int dstStops, int idxSrc) + { + NativeArray cR = Data.ColorChannel0.Reinterpret(1); + NativeArray cG = Data.ColorChannel1.Reinterpret(1); + NativeArray cB = Data.ColorChannel2.Reinterpret(1); + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + c.r = ImageDecoderPdn.RGBByteFromHDRFloat(cR[idxSrc / 4]); + c.g = ImageDecoderPdn.RGBByteFromHDRFloat(cG[idxSrc / 4]); + c.b = ImageDecoderPdn.RGBByteFromHDRFloat(cB[idxSrc / 4]); + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += 4; + } + } + + // Case 1: + private void SetPDNRowGrayscale32(int dstStart, int dstStops, int idxSrc) + { + NativeArray channel = Data.ColorChannel0.Reinterpret(1); + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + byte rgbValue = ImageDecoderPdn.RGBByteFromHDRFloat(channel[idxSrc / 4]); + c.r = rgbValue; + c.g = rgbValue; + c.b = rgbValue; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += 4; + } + } + + // Case 2: + private void SetPDNRowRgb(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + c.r = Data.ColorChannel0[idxSrc]; + c.g = Data.ColorChannel1[idxSrc]; + c.b = Data.ColorChannel2[idxSrc]; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + + // Case 3: + /////////////////////////////////////////////////////////////////////////////// + // + // The color-conversion formulas come from the Colour Space Conversions FAQ: + // http://www.poynton.com/PDFs/coloureq.pdf + // + // RGB --> CMYK CMYK --> RGB + // --------------------------------------- -------------------------------------------- + // Black = minimum(1-Red,1-Green,1-Blue) Red = 1-minimum(1,Cyan*(1-Black)+Black) + // Cyan = (1-Red-Black)/(1-Black) Green = 1-minimum(1,Magenta*(1-Black)+Black) + // Magenta = (1-Green-Black)/(1-Black) Blue = 1-minimum(1,Yellow*(1-Black)+Black) + // Yellow = (1-Blue-Black)/(1-Black) + // + /////////////////////////////////////////////////////////////////////////////// + private void SetPDNRowCmyk(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + // CMYK values are stored as complements, presumably to allow for some + // measure of compatibility with RGB-only applications. + var C = 255 - Data.ColorChannel0[idxSrc]; + var M = 255 - Data.ColorChannel1[idxSrc]; + var Y = 255 - Data.ColorChannel2[idxSrc]; + var K = 255 - Data.ColorChannel3[idxSrc]; + + int R = 255 - Math.Min(255, C * (255 - K) / 255 + K); + int G = 255 - Math.Min(255, M * (255 - K) / 255 + K); + int B = 255 - Math.Min(255, Y * (255 - K) / 255 + K); + + c.r = (byte)R; + c.g = (byte)G; + c.b = (byte)B; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + + // Case 4: + private void SetPDNRowBitmap(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + byte mask = (byte)(0x80 >> (idxSrc % 8)); + byte bwValue = (byte)(Data.ColorChannel0[idxSrc / 8] & mask); + bwValue = (bwValue == 0) ? (byte)255 : (byte)0; + + c.r = bwValue; + c.g = bwValue; + c.b = bwValue; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + + // Case 5: + private void SetPDNRowGrayscale(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + + c.r = Data.ColorChannel0[idxSrc]; + c.g = Data.ColorChannel0[idxSrc]; + c.b = Data.ColorChannel0[idxSrc]; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + + // Case 6: + private void SetPDNRowIndexed(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + int index = (int)Data.ColorChannel0[idxSrc]; + while (dstStart < dstStops) + { + c.r = Data.ColorModeData[index]; + c.g = Data.ColorModeData[index + 256]; + c.b = Data.ColorModeData[index + 2 * 256]; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + + // Case 7: + private void SetPDNRowLab(int dstStart, int dstStops, int idxSrc) + { + var c = Data.DecodedImage[dstStart]; + while (dstStart < dstStops) + { + double exL, exA, exB; + exL = (double)Data.ColorChannel0[idxSrc]; + exA = (double)Data.ColorChannel1[idxSrc]; + exB = (double)Data.ColorChannel2[idxSrc]; + + int L = (int)(exL / 2.55); + int a = (int)(exA - 127.5); + int b = (int)(exB - 127.5); + + // First, convert from Lab to XYZ. + // Standards used Observer = 2, Illuminant = D65 + + const double ref_X = 95.047; + const double ref_Y = 100.000; + const double ref_Z = 108.883; + + double var_Y = ((double)L + 16.0) / 116.0; + double var_X = (double)a / 500.0 + var_Y; + double var_Z = var_Y - (double)b / 200.0; + + double var_X3 = var_X * var_X * var_X; + double var_Y3 = var_Y * var_Y * var_Y; + double var_Z3 = var_Z * var_Z * var_Z; + + if (var_Y3 > 0.008856) + var_Y = var_Y3; + else + var_Y = (var_Y - 16 / 116) / 7.787; + + if (var_X3 > 0.008856) + var_X = var_X3; + else + var_X = (var_X - 16 / 116) / 7.787; + + if (var_Z3 > 0.008856) + var_Z = var_Z3; + else + var_Z = (var_Z - 16 / 116) / 7.787; + + double X = ref_X * var_X; + double Y = ref_Y * var_Y; + double Z = ref_Z * var_Z; + + // Then, convert from XYZ to RGB. + // Standards used Observer = 2, Illuminant = D65 + // ref_X = 95.047, ref_Y = 100.000, ref_Z = 108.883 + + double var_R = X * 0.032406 + Y * (-0.015372) + Z * (-0.004986); + double var_G = X * (-0.009689) + Y * 0.018758 + Z * 0.000415; + double var_B = X * 0.000557 + Y * (-0.002040) + Z * 0.010570; + + if (var_R > 0.0031308) + var_R = 1.055 * (Math.Pow(var_R, 1 / 2.4)) - 0.055; + else + var_R = 12.92 * var_R; + + if (var_G > 0.0031308) + var_G = 1.055 * (Math.Pow(var_G, 1 / 2.4)) - 0.055; + else + var_G = 12.92 * var_G; + + if (var_B > 0.0031308) + var_B = 1.055 * (Math.Pow(var_B, 1 / 2.4)) - 0.055; + else + var_B = 12.92 * var_B; + + int nRed = (int)(var_R * 256.0); + int nGreen = (int)(var_G * 256.0); + int nBlue = (int)(var_B * 256.0); + + if (nRed < 0) + nRed = 0; + else if (nRed > 255) + nRed = 255; + if (nGreen < 0) + nGreen = 0; + else if (nGreen > 255) + nGreen = 255; + if (nBlue < 0) + nBlue = 0; + else if (nBlue > 255) + nBlue = 255; + + c.r = (byte)nRed; + c.g = (byte)nGreen; + c.b = (byte)nBlue; + Data.DecodedImage[dstStart] = c; + + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + } + + #endregion + + #region AlphaDecodeJob + + internal struct PDNAlphaMaskData + { + // Inputs. + public PDNWrapper.Rectangle Rect; + public PDNWrapper.Rectangle LayerRect; + public PDNWrapper.Rectangle ClippedRect; + public int SurfaceWidth; + public int SurfaceHeight; + public int SurfaceByteDepth; + + public int HasAlphaChannel; + public int HasUserAlphaMask; + public int UserMaskInvertOnBlend; + public PDNWrapper.Rectangle UserMaskRect; + public PDNWrapper.Rectangle UserMaskContextRect; + public int HasLayerAlphaMask; + public int LayerMaskInvertOnBlend; + public PDNWrapper.Rectangle LayerMaskRect; + public PDNWrapper.Rectangle LayerMaskContextRect; + + [NativeDisableParallelForRestriction] + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray AlphaChannel0; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray UserMask; + + [DeallocateOnJobCompletion] + [NativeDisableParallelForRestriction] + public NativeArray UserAlphaMask; + + [DeallocateOnJobCompletion] + [NativeDisableParallelForRestriction] + public NativeArray UserAlphaMaskEmpty; + + [NativeDisableParallelForRestriction] + [ReadOnly] + public NativeArray LayerMask; + + [DeallocateOnJobCompletion] + [NativeDisableParallelForRestriction] + public NativeArray LayerAlphaMask; + + [DeallocateOnJobCompletion] + [NativeDisableParallelForRestriction] + public NativeArray LayerAlphaMaskEmpty; + + // Outputs + [NativeDisableParallelForRestriction] + public NativeArray DecodedImage; + + // Colors. + public byte UserMaskBackgroundColor; + public byte LayerMaskBackgroundColor; + } + + internal struct PDNAlphaMaskJob : IJob + { + + public PDNAlphaMaskData Data; + + public void Execute() + { + + for (int idx = Data.Rect.Top; idx < Data.Rect.Bottom; idx++) + { + // Calculate index into ImageData source from row and column. + int idxSrcPixel = (idx - Data.LayerRect.Top) * Data.LayerRect.Width + (Data.Rect.Left - Data.LayerRect.Left); + int idxSrcBytes = idxSrcPixel * Data.SurfaceByteDepth; + + // Calculate pointers to destination Surface. + var idxDstStart = idx * Data.SurfaceWidth + Data.ClippedRect.Left; + var idxDstStops = idx * Data.SurfaceWidth + Data.ClippedRect.Right; + + // For 16-bit images, take the higher-order byte from the image data, which is now in little-endian order. + if (Data.SurfaceByteDepth == 2) + { + idxSrcBytes++; + } + + SetPDNAlphaRow(idxDstStart, idxDstStops, idxSrcBytes); + if (0 != Data.HasLayerAlphaMask) + { + GetMaskAlphaRow(idx, Data.LayerAlphaMask, Data.LayerAlphaMaskEmpty, Data.LayerMask, Data.LayerMaskInvertOnBlend, Data.LayerMaskBackgroundColor, Data.LayerMaskContextRect, Data.LayerMaskRect); + } + if (0 != Data.HasUserAlphaMask) + { + GetMaskAlphaRow(idx, Data.UserAlphaMask, Data.UserAlphaMaskEmpty, Data.UserMask, Data.UserMaskInvertOnBlend, Data.UserMaskBackgroundColor, Data.UserMaskContextRect, Data.UserMaskRect); + } + ApplyPDNMask(idxDstStart, idxDstStops); + + } + } + + private void SetPDNAlphaRow(int dstStart, int dstStops, int idxSrc) + { + // Set alpha to fully-opaque if there is no alpha channel + if (0 == Data.HasAlphaChannel) + { + while (dstStart < dstStops) + { + var c = Data.DecodedImage[dstStart]; + c.a = 255; + Data.DecodedImage[dstStart] = c; + dstStart++; + } + } + // Set the alpha channel data + else + { + NativeArray srcAlphaChannel = Data.AlphaChannel0.Reinterpret(1); + { + while (dstStart < dstStops) + { + var c = Data.DecodedImage[dstStart]; + c.a = (Data.SurfaceByteDepth < 4) ? Data.AlphaChannel0[idxSrc] : ImageDecoderPdn.RGBByteFromHDRFloat(srcAlphaChannel[idxSrc / 4]); + + Data.DecodedImage[dstStart] = c; + dstStart++; + idxSrc += Data.SurfaceByteDepth; + } + } + } + } + + private void ApplyPDNMask(int dstStart, int dstStops) + { + // Do nothing if there are no masks + if (0 == Data.HasLayerAlphaMask && 0 == Data.HasUserAlphaMask) + { + return; + } + + // Apply one mask + else if (0 == Data.HasLayerAlphaMask || 0 == Data.HasUserAlphaMask) + { + var maskAlpha = (0 == Data.HasLayerAlphaMask) ? Data.UserAlphaMask : Data.LayerAlphaMask; + var maskStart = 0; + { + while (dstStart < dstStops) + { + var c = Data.DecodedImage[dstStart]; + c.a = (byte)(Data.DecodedImage[dstStart].a * maskAlpha[maskStart] / 255); + Data.DecodedImage[dstStart] = c; + + dstStart++; + maskStart++; + } + } + } + // Apply both masks in one pass, to minimize rounding error + else + { + var maskStart = 0; + { + while (dstStart < dstStops) + { + var c = Data.DecodedImage[dstStart]; + var alphaFactor = (Data.LayerAlphaMask[maskStart]) * (Data.UserAlphaMask[maskStart]); + c.a = (byte)(Data.DecodedImage[dstStart].a * alphaFactor / 65025); + Data.DecodedImage[dstStart] = c; + + dstStart++; + maskStart++; + } + } + } + } + + private void DecodeMaskAlphaRow32(NativeArray Alpha, int dstStart, int dstStops, NativeArray Mask, int maskStart) + { + NativeArray floatArray = Mask.Reinterpret(1); + + while (dstStart < dstStops) + { + Alpha[dstStart] = ImageDecoderPdn.RGBByteFromHDRFloat(floatArray[maskStart / 4]); + + dstStart++; + maskStart += 4; + } + } + + private void DecodeMaskAlphaRow(NativeArray Alpha, int dstStart, int dstStops, NativeArray Mask, int maskStart, int byteDepth) + { + while (dstStart < dstStops) + { + Alpha[dstStart] = Mask[maskStart]; + + dstStart++; + maskStart += byteDepth; + } + } + + private unsafe void GetMaskAlphaRow(int idxSrc, NativeArray alphaBuffer, NativeArray alphaBufferEmpty, NativeArray maskChannel, int MaskInvertOnBlend, byte MaskBackgroundColor, PDNWrapper.Rectangle MaskContextRect, PDNWrapper.Rectangle MaskRect) + { + ////////////////////////////////////// + // Transfer mask into the alpha array + // Background color for areas not covered by the mask + byte backgroundColor = (0 != MaskInvertOnBlend) ? (byte)(255 - MaskBackgroundColor) : MaskBackgroundColor; + { + var alphaBufferPtr = NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(alphaBuffer); + UnsafeUtility.MemSet(alphaBufferPtr, backgroundColor, alphaBuffer.Length); + } + // Only process if not Empty. + if (alphaBufferEmpty[idxSrc] == 0) + { + // Get pointers to starting positions + int alphaColumn = MaskContextRect.X; + // It's possible that the layer's rect is larger than the clip and it's offset. + // Since we only copy out the alpha based on the MaskContext size + // The copy will start from where the MaskContextRect is + if(Data.LayerRect.X > 0) + alphaColumn = MaskContextRect.X - Data.LayerRect.X; + var pAlpha = alphaColumn; + var pAlphaEnd = pAlpha + MaskContextRect.Width; + + int maskRow = idxSrc - MaskRect.Y; + int maskColumn = MaskContextRect.X - MaskRect.X; + int idxMaskPixel = (maskRow * MaskRect.Width) + maskColumn; + var pMask = idxMaskPixel * Data.SurfaceByteDepth; + + // Take the high-order byte if values are 16-bit (little-endian) + if (Data.SurfaceByteDepth == 2) + { + pMask++; + } + + // Decode mask into the alpha array. + if (Data.SurfaceByteDepth == 4) + { + DecodeMaskAlphaRow32(alphaBuffer, pAlpha, pAlphaEnd, maskChannel, pMask); + } + else + { + DecodeMaskAlphaRow(alphaBuffer, pAlpha, pAlphaEnd, maskChannel, pMask, Data.SurfaceByteDepth); + } + + // Obsolete since Photoshop CS6, but retained for compatibility with older versions. Note that the background has already been inverted. + if (0 != MaskInvertOnBlend) + { + PhotoshopFile.Util.Invert(alphaBuffer, pAlpha, pAlphaEnd); + } + } + } + } + + #endregion } \ No newline at end of file diff --git a/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs.meta b/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs.meta index 5d1015d..5769e3e 100644 --- a/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/PDNDecodeJob.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 806458e67991c7449a38f7d942188a0e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 806458e67991c7449a38f7d942188a0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/Rectangle.cs b/Editor/PSDPlugin/PDNWrapper/Rectangle.cs index ce4b4f3..967d783 100644 --- a/Editor/PSDPlugin/PDNWrapper/Rectangle.cs +++ b/Editor/PSDPlugin/PDNWrapper/Rectangle.cs @@ -1,258 +1,258 @@ -using System; - -namespace PDNWrapper -{ - // Mimics System.Drawing.Rectangle - internal struct Rectangle - { - public static readonly Rectangle Empty = new Rectangle(); - - private int x; - private int y; - private int width; - private int height; - - public Rectangle(int x, int y, int width, int height) - { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - public static Rectangle FromLTRB(int left, int top, int right, int bottom) - { - return new Rectangle(left, - top, - right - left, - bottom - top); - } - - public Size Size - { - get - { - return new Size(Width, Height); - } - set - { - this.Width = value.Width; - this.Height = value.Height; - } - } - - public int X - { - get - { - return x; - } - set - { - x = value; - } - } - - public int Y - { - get - { - return y; - } - set - { - y = value; - } - } - - public int Width - { - get - { - return width; - } - set - { - width = value; - } - } - - public int Height - { - get - { - return height; - } - set - { - height = value; - } - } - - public int Left - { - get - { - return X; - } - } - - public int Top - { - get - { - return Y; - } - } - - public int Right - { - get - { - return X + Width; - } - } - - public int Bottom - { - get - { - return Y + Height; - } - } - - public bool IsEmpty - { - get - { - return height == 0 && width == 0 && x == 0 && y == 0; - } - } - - public override bool Equals(object obj) - { - if (!(obj is Rectangle)) - return false; - - Rectangle comp = (Rectangle)obj; - - return (comp.X == this.X) && - (comp.Y == this.Y) && - (comp.Width == this.Width) && - (comp.Height == this.Height); - } - - public static bool operator==(Rectangle left, Rectangle right) - { - return (left.X == right.X - && left.Y == right.Y - && left.Width == right.Width - && left.Height == right.Height); - } - - public static bool operator!=(Rectangle left, Rectangle right) - { - return !(left == right); - } - - public bool Contains(int x, int y) - { - return this.X <= x && - x < this.X + this.Width && - this.Y <= y && - y < this.Y + this.Height; - } - - public bool Contains(Rectangle rect) - { - return (this.X <= rect.X) && - ((rect.X + rect.Width) <= (this.X + this.Width)) && - (this.Y <= rect.Y) && - ((rect.Y + rect.Height) <= (this.Y + this.Height)); - } - - public override int GetHashCode() - { - return (int)((UInt32)X ^ - (((UInt32)Y << 13) | ((UInt32)Y >> 19)) ^ - (((UInt32)Width << 26) | ((UInt32)Width >> 6)) ^ - (((UInt32)Height << 7) | ((UInt32)Height >> 25))); - } - - public void Inflate(int width, int height) - { - this.X -= width; - this.Y -= height; - this.Width += 2 * width; - this.Height += 2 * height; - } - - public void Inflate(Size size) - { - Inflate(size.Width, size.Height); - } - - public static Rectangle Inflate(Rectangle rect, int x, int y) - { - Rectangle r = rect; - r.Inflate(x, y); - return r; - } - - public void Intersect(Rectangle rect) - { - Rectangle result = Rectangle.Intersect(rect, this); - - this.X = result.X; - this.Y = result.Y; - this.Width = result.Width; - this.Height = result.Height; - } - - public static Rectangle Intersect(Rectangle a, Rectangle b) - { - int x1 = Math.Max(a.X, b.X); - int x2 = Math.Min(a.X + a.Width, b.X + b.Width); - int y1 = Math.Max(a.Y, b.Y); - int y2 = Math.Min(a.Y + a.Height, b.Y + b.Height); - - if (x2 >= x1 - && y2 >= y1) - { - return new Rectangle(x1, y1, x2 - x1, y2 - y1); - } - return Rectangle.Empty; - } - - public bool IntersectsWith(Rectangle rect) - { - return (rect.X < this.X + this.Width) && - (this.X < (rect.X + rect.Width)) && - (rect.Y < this.Y + this.Height) && - (this.Y < rect.Y + rect.Height); - } - - public static Rectangle Union(Rectangle a, Rectangle b) - { - int x1 = Math.Min(a.X, b.X); - int x2 = Math.Max(a.X + a.Width, b.X + b.Width); - int y1 = Math.Min(a.Y, b.Y); - int y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); - - return new Rectangle(x1, y1, x2 - x1, y2 - y1); - } - - public void Offset(int x, int y) - { - this.X += x; - this.Y += y; - } - - public override string ToString() - { - return "{X=" + X.ToString() + ",Y=" + Y.ToString() + - ",Width=" + Width.ToString() + - ",Height=" + Height.ToString() + "}"; - } - } -} +using System; + +namespace PDNWrapper +{ + // Mimics System.Drawing.Rectangle + internal struct Rectangle + { + public static readonly Rectangle Empty = new Rectangle(); + + private int x; + private int y; + private int width; + private int height; + + public Rectangle(int x, int y, int width, int height) + { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + public static Rectangle FromLTRB(int left, int top, int right, int bottom) + { + return new Rectangle(left, + top, + right - left, + bottom - top); + } + + public Size Size + { + get + { + return new Size(Width, Height); + } + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + public int X + { + get + { + return x; + } + set + { + x = value; + } + } + + public int Y + { + get + { + return y; + } + set + { + y = value; + } + } + + public int Width + { + get + { + return width; + } + set + { + width = value; + } + } + + public int Height + { + get + { + return height; + } + set + { + height = value; + } + } + + public int Left + { + get + { + return X; + } + } + + public int Top + { + get + { + return Y; + } + } + + public int Right + { + get + { + return X + Width; + } + } + + public int Bottom + { + get + { + return Y + Height; + } + } + + public bool IsEmpty + { + get + { + return height == 0 && width == 0 && x == 0 && y == 0; + } + } + + public override bool Equals(object obj) + { + if (!(obj is Rectangle)) + return false; + + Rectangle comp = (Rectangle)obj; + + return (comp.X == this.X) && + (comp.Y == this.Y) && + (comp.Width == this.Width) && + (comp.Height == this.Height); + } + + public static bool operator==(Rectangle left, Rectangle right) + { + return (left.X == right.X + && left.Y == right.Y + && left.Width == right.Width + && left.Height == right.Height); + } + + public static bool operator!=(Rectangle left, Rectangle right) + { + return !(left == right); + } + + public bool Contains(int x, int y) + { + return this.X <= x && + x < this.X + this.Width && + this.Y <= y && + y < this.Y + this.Height; + } + + public bool Contains(Rectangle rect) + { + return (this.X <= rect.X) && + ((rect.X + rect.Width) <= (this.X + this.Width)) && + (this.Y <= rect.Y) && + ((rect.Y + rect.Height) <= (this.Y + this.Height)); + } + + public override int GetHashCode() + { + return (int)((UInt32)X ^ + (((UInt32)Y << 13) | ((UInt32)Y >> 19)) ^ + (((UInt32)Width << 26) | ((UInt32)Width >> 6)) ^ + (((UInt32)Height << 7) | ((UInt32)Height >> 25))); + } + + public void Inflate(int width, int height) + { + this.X -= width; + this.Y -= height; + this.Width += 2 * width; + this.Height += 2 * height; + } + + public void Inflate(Size size) + { + Inflate(size.Width, size.Height); + } + + public static Rectangle Inflate(Rectangle rect, int x, int y) + { + Rectangle r = rect; + r.Inflate(x, y); + return r; + } + + public void Intersect(Rectangle rect) + { + Rectangle result = Rectangle.Intersect(rect, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + public static Rectangle Intersect(Rectangle a, Rectangle b) + { + int x1 = Math.Max(a.X, b.X); + int x2 = Math.Min(a.X + a.Width, b.X + b.Width); + int y1 = Math.Max(a.Y, b.Y); + int y2 = Math.Min(a.Y + a.Height, b.Y + b.Height); + + if (x2 >= x1 + && y2 >= y1) + { + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + return Rectangle.Empty; + } + + public bool IntersectsWith(Rectangle rect) + { + return (rect.X < this.X + this.Width) && + (this.X < (rect.X + rect.Width)) && + (rect.Y < this.Y + this.Height) && + (this.Y < rect.Y + rect.Height); + } + + public static Rectangle Union(Rectangle a, Rectangle b) + { + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.X + a.Width, b.X + b.Width); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + public void Offset(int x, int y) + { + this.X += x; + this.Y += y; + } + + public override string ToString() + { + return "{X=" + X.ToString() + ",Y=" + Y.ToString() + + ",Width=" + Width.ToString() + + ",Height=" + Height.ToString() + "}"; + } + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/Rectangle.cs.meta b/Editor/PSDPlugin/PDNWrapper/Rectangle.cs.meta index 0e44c83..392d0b4 100644 --- a/Editor/PSDPlugin/PDNWrapper/Rectangle.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/Rectangle.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: e8fe32ddfd1506f47955dad6247df316 -timeCreated: 1495006554 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: e8fe32ddfd1506f47955dad6247df316 +timeCreated: 1495006554 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/Size.cs b/Editor/PSDPlugin/PDNWrapper/Size.cs index d08414f..b6a6bf2 100644 --- a/Editor/PSDPlugin/PDNWrapper/Size.cs +++ b/Editor/PSDPlugin/PDNWrapper/Size.cs @@ -1,49 +1,49 @@ -namespace PDNWrapper -{ - // Mimics System.Drawing.Size - internal struct Size - { - public static readonly Size Empty = new Size(); - - private int width; - private int height; - - public Size(int width, int height) - { - this.width = width; - this.height = height; - } - - public bool IsEmpty - { - get - { - return width == 0 && height == 0; - } - } - - public int Width - { - get - { - return width; - } - set - { - width = value; - } - } - - public int Height - { - get - { - return height; - } - set - { - height = value; - } - } - } -} +namespace PDNWrapper +{ + // Mimics System.Drawing.Size + internal struct Size + { + public static readonly Size Empty = new Size(); + + private int width; + private int height; + + public Size(int width, int height) + { + this.width = width; + this.height = height; + } + + public bool IsEmpty + { + get + { + return width == 0 && height == 0; + } + } + + public int Width + { + get + { + return width; + } + set + { + width = value; + } + } + + public int Height + { + get + { + return height; + } + set + { + height = value; + } + } + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/Size.cs.meta b/Editor/PSDPlugin/PDNWrapper/Size.cs.meta index 98d5ce3..0821485 100644 --- a/Editor/PSDPlugin/PDNWrapper/Size.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/Size.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: a81bd8318454c4f4f9e22a9e00bb9e3d -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: a81bd8318454c4f4f9e22a9e00bb9e3d +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PDNWrapper/Surface.cs b/Editor/PSDPlugin/PDNWrapper/Surface.cs index 7bee37a..e8587c4 100644 --- a/Editor/PSDPlugin/PDNWrapper/Surface.cs +++ b/Editor/PSDPlugin/PDNWrapper/Surface.cs @@ -1,29 +1,33 @@ -using Unity.Collections; -using UnityEngine; - -namespace PDNWrapper -{ - internal class Surface - { - NativeArray m_Color; - public Surface(int w, int h) - { - width = w; - height = h; - m_Color = new NativeArray(width * height, Allocator.Persistent); - } - - public void Dispose() - { - m_Color.Dispose(); - } - - public NativeArray color - { - get { return m_Color; } - } - - public int width { get; private set; } - public int height { get; private set; } - } -} +using Unity.Collections; +using UnityEngine; + +namespace PDNWrapper +{ + internal class Surface + { + NativeArray m_Color; + public Surface(int w, int h) + { + width = w; + height = h; + m_Color = new NativeArray(width * height, Allocator.Persistent); + } + + public void Dispose() + { + if (m_Color.IsCreated) + { + m_Color.Dispose(); + m_Color = default; + } + } + + public NativeArray color + { + get { return m_Color; } + } + + public int width { get; private set; } + public int height { get; private set; } + } +} diff --git a/Editor/PSDPlugin/PDNWrapper/Surface.cs.meta b/Editor/PSDPlugin/PDNWrapper/Surface.cs.meta index f837d86..f398ebb 100644 --- a/Editor/PSDPlugin/PDNWrapper/Surface.cs.meta +++ b/Editor/PSDPlugin/PDNWrapper/Surface.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 1b467712e18b40c4f90510e9d0364faf -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 1b467712e18b40c4f90510e9d0364faf +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PhotoShopFileType.meta b/Editor/PSDPlugin/PhotoShopFileType.meta index b3f8a8b..9ce96c6 100644 --- a/Editor/PSDPlugin/PhotoShopFileType.meta +++ b/Editor/PSDPlugin/PhotoShopFileType.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: 36a1cbeb5badf2a4abdcb1dcefa0efb6 -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 36a1cbeb5badf2a4abdcb1dcefa0efb6 +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs b/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs index b5a6f1d..937b42e 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs +++ b/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs @@ -1,107 +1,107 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; - -using PaintDotNet; -using PhotoshopFile; -using PDNWrapper; - -namespace PaintDotNet.Data.PhotoshopFileType -{ - internal static class BlendModeMapping - { - /// - /// Convert between Paint.NET and Photoshop blend modes. - /// - public static string ToPsdBlendMode(this LayerBlendMode pdnBlendMode) - { - switch (pdnBlendMode) - { - case LayerBlendMode.Normal: - return PsdBlendMode.Normal; - - case LayerBlendMode.Multiply: - return PsdBlendMode.Multiply; - case LayerBlendMode.Additive: - return PsdBlendMode.LinearDodge; - case LayerBlendMode.ColorBurn: - return PsdBlendMode.ColorBurn; - case LayerBlendMode.ColorDodge: - return PsdBlendMode.ColorDodge; - case LayerBlendMode.Overlay: - return PsdBlendMode.Overlay; - case LayerBlendMode.Difference: - return PsdBlendMode.Difference; - case LayerBlendMode.Lighten: - return PsdBlendMode.Lighten; - case LayerBlendMode.Darken: - return PsdBlendMode.Darken; - case LayerBlendMode.Screen: - return PsdBlendMode.Screen; - - // Paint.NET blend modes without a Photoshop equivalent are saved - // as Normal. - case LayerBlendMode.Glow: - case LayerBlendMode.Negation: - case LayerBlendMode.Reflect: - case LayerBlendMode.Xor: - return PsdBlendMode.Normal; - - default: - Debug.Fail("Unknown Paint.NET blend mode."); - return PsdBlendMode.Normal; - } - } - - /// - /// Convert a Photoshop blend mode to a Paint.NET BlendOp. - /// - public static LayerBlendMode FromPsdBlendMode(string blendModeKey) - { - switch (blendModeKey) - { - case PsdBlendMode.Normal: - return LayerBlendMode.Normal; - - case PsdBlendMode.Multiply: - return LayerBlendMode.Multiply; - case PsdBlendMode.LinearDodge: - return LayerBlendMode.Additive; - case PsdBlendMode.ColorBurn: - return LayerBlendMode.ColorBurn; - case PsdBlendMode.ColorDodge: - return LayerBlendMode.ColorDodge; - case PsdBlendMode.Overlay: - return LayerBlendMode.Overlay; - case PsdBlendMode.Difference: - return LayerBlendMode.Difference; - case PsdBlendMode.Lighten: - return LayerBlendMode.Lighten; - case PsdBlendMode.Darken: - return LayerBlendMode.Darken; - case PsdBlendMode.Screen: - return LayerBlendMode.Screen; - - // Photoshop blend modes without a Paint.NET equivalent are loaded - // as Normal. - default: - return LayerBlendMode.Normal; - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +using PaintDotNet; +using PhotoshopFile; +using PDNWrapper; + +namespace PaintDotNet.Data.PhotoshopFileType +{ + internal static class BlendModeMapping + { + /// + /// Convert between Paint.NET and Photoshop blend modes. + /// + public static string ToPsdBlendMode(this LayerBlendMode pdnBlendMode) + { + switch (pdnBlendMode) + { + case LayerBlendMode.Normal: + return PsdBlendMode.Normal; + + case LayerBlendMode.Multiply: + return PsdBlendMode.Multiply; + case LayerBlendMode.Additive: + return PsdBlendMode.LinearDodge; + case LayerBlendMode.ColorBurn: + return PsdBlendMode.ColorBurn; + case LayerBlendMode.ColorDodge: + return PsdBlendMode.ColorDodge; + case LayerBlendMode.Overlay: + return PsdBlendMode.Overlay; + case LayerBlendMode.Difference: + return PsdBlendMode.Difference; + case LayerBlendMode.Lighten: + return PsdBlendMode.Lighten; + case LayerBlendMode.Darken: + return PsdBlendMode.Darken; + case LayerBlendMode.Screen: + return PsdBlendMode.Screen; + + // Paint.NET blend modes without a Photoshop equivalent are saved + // as Normal. + case LayerBlendMode.Glow: + case LayerBlendMode.Negation: + case LayerBlendMode.Reflect: + case LayerBlendMode.Xor: + return PsdBlendMode.Normal; + + default: + Debug.Fail("Unknown Paint.NET blend mode."); + return PsdBlendMode.Normal; + } + } + + /// + /// Convert a Photoshop blend mode to a Paint.NET BlendOp. + /// + public static LayerBlendMode FromPsdBlendMode(string blendModeKey) + { + switch (blendModeKey) + { + case PsdBlendMode.Normal: + return LayerBlendMode.Normal; + + case PsdBlendMode.Multiply: + return LayerBlendMode.Multiply; + case PsdBlendMode.LinearDodge: + return LayerBlendMode.Additive; + case PsdBlendMode.ColorBurn: + return LayerBlendMode.ColorBurn; + case PsdBlendMode.ColorDodge: + return LayerBlendMode.ColorDodge; + case PsdBlendMode.Overlay: + return LayerBlendMode.Overlay; + case PsdBlendMode.Difference: + return LayerBlendMode.Difference; + case PsdBlendMode.Lighten: + return LayerBlendMode.Lighten; + case PsdBlendMode.Darken: + return LayerBlendMode.Darken; + case PsdBlendMode.Screen: + return LayerBlendMode.Screen; + + // Photoshop blend modes without a Paint.NET equivalent are loaded + // as Normal. + default: + return LayerBlendMode.Normal; + } + } + } +} diff --git a/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs.meta b/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs.meta index ebc52d8..9eac4c8 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs.meta +++ b/Editor/PSDPlugin/PhotoShopFileType/BlendModeMapping.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 3045ca2469fb18a48a1b874587e1df9e -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3045ca2469fb18a48a1b874587e1df9e +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs b/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs index 502d173..292b402 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs +++ b/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs @@ -1,46 +1,46 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using PhotoshopFile; - -namespace PaintDotNet.Data.PhotoshopFileType -{ - /// - /// Controls the loading of a PSD file into a Paint.NET Document. - /// - internal class DocumentLoadContext : LoadContext - { - public DocumentLoadContext() : base() - { - } - - public override void OnLoadLayersHeader(PsdFile psdFile) - { - PsdLoad.CheckSufficientMemory(psdFile); - } - - public override void OnLoadLayerHeader(PhotoshopFile.Layer layer) - { - var psdFile = layer.PsdFile; - if (psdFile.ColorMode == PsdColorMode.Multichannel) - { - PsdLoad.CheckSufficientMemory(psdFile); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using PhotoshopFile; + +namespace PaintDotNet.Data.PhotoshopFileType +{ + /// + /// Controls the loading of a PSD file into a Paint.NET Document. + /// + internal class DocumentLoadContext : LoadContext + { + public DocumentLoadContext() : base() + { + } + + public override void OnLoadLayersHeader(PsdFile psdFile) + { + PsdLoad.CheckSufficientMemory(psdFile); + } + + public override void OnLoadLayerHeader(PhotoshopFile.Layer layer) + { + var psdFile = layer.PsdFile; + if (psdFile.ColorMode == PsdColorMode.Multichannel) + { + PsdLoad.CheckSufficientMemory(psdFile); + } + } + } +} diff --git a/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs.meta b/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs.meta index 5c3873a..c9a6de6 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs.meta +++ b/Editor/PSDPlugin/PhotoShopFileType/DocumentLoadContext.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 138d3cdf8c274dd4c995e7ec72539d1b -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 138d3cdf8c274dd4c995e7ec72539d1b +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs b/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs index 184949e..9c3a0e2 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs +++ b/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs @@ -1,807 +1,807 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using PaintDotNet; - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using PDNWrapper; -using System.Text; - -using PhotoshopFile; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using UnityEngine; -using Debug = UnityEngine.Debug; -using Unity.Jobs; - -namespace PaintDotNet.Data.PhotoshopFileType -{ - - internal enum DecodeType - { - RGB32 = 0, - Grayscale32 = 1, - RGB = 2, - CMYK = 3, - Bitmap = 4, - Grayscale = 5, - Indexed = 6, - Lab = 7 - }; - - internal static class ImageDecoderPdn - { - private static double rgbExponent = 1 / 2.19921875; - - private class DecodeContext - { - public PhotoshopFile.Layer Layer { get; private set; } - public int ByteDepth { get; private set; } - public int HasAlphaChannel { get; private set; } - public Channel[] Channels { get; private set; } - public NativeArray AlphaChannel { get; private set; } - public PsdColorMode ColorMode { get; private set; } - public NativeArray ColorModeData { get; private set; } - - public Rectangle Rectangle { get; private set; } - public MaskDecodeContext LayerMaskContext { get; private set; } - public MaskDecodeContext UserMaskContext { get; private set; } - - public DecodeContext(PhotoshopFile.Layer layer, Rectangle bounds) - { - Layer = layer; - ByteDepth = Util.BytesFromBitDepth(layer.PsdFile.BitDepth); - HasAlphaChannel = 0; - Channels = layer.Channels.ToIdArray(); - - var alphaSize = 4; - if (layer.AlphaChannel != null && layer.AlphaChannel.ImageData.Length > 0) - { - HasAlphaChannel = 1; - alphaSize = layer.AlphaChannel.ImageData.Length; - alphaSize = (alphaSize / 4) + (alphaSize % 4 > 0 ? 1 : 0); - alphaSize = alphaSize * 4; - } - AlphaChannel = new NativeArray(alphaSize, Allocator.TempJob); - if (HasAlphaChannel > 0) - NativeArray.Copy(layer.AlphaChannel.ImageData, AlphaChannel, layer.AlphaChannel.ImageData.Length); - ColorMode = layer.PsdFile.ColorMode; - ColorModeData = new NativeArray(layer.PsdFile.ColorModeData, Allocator.TempJob); - - // Clip the layer to the specified bounds - Rectangle = Layer.Rect.IntersectWith(bounds); - - if (layer.Masks != null) - { - LayerMaskContext = GetMaskContext(layer.Masks.LayerMask); - UserMaskContext = GetMaskContext(layer.Masks.UserMask); - } - } - - internal void Cleanup() - { - AlphaChannel.Dispose(); - ColorModeData.Dispose(); - } - - private MaskDecodeContext GetMaskContext(Mask mask) - { - if ((mask == null) || (mask.Disabled)) - { - return null; - } - - return new MaskDecodeContext(mask, this); - } - } - - private class MaskDecodeContext - { - public Mask Mask { get; private set; } - public Rectangle Rectangle { get; private set; } - public MaskDecodeContext(Mask mask, DecodeContext layerContext) - { - Mask = mask; - - // The PositionVsLayer flag is documented to indicate a position - // relative to the layer, but Photoshop treats the position as - // absolute. So that's what we do, too. - Rectangle = mask.Rect.IntersectWith(layerContext.Rectangle); - } - - public bool IsRowEmpty(int row) - { - return (Mask.ImageData == null) - || (Mask.ImageData.Length == 0) - || (Rectangle.Size.IsEmpty) - || (row < Rectangle.Top) - || (row >= Rectangle.Bottom); - } - } - - /////////////////////////////////////////////////////////////////////////////// - - internal static byte RGBByteFromHDRFloat(float ptr) - { - var result = (byte)(255 * Math.Pow(ptr, rgbExponent)); - return result; - } - - private static DecodeDelegate GetDecodeDelegate(PsdColorMode psdColorMode, ref DecodeType decoderType) - { - switch (psdColorMode) - { - case PsdColorMode.Bitmap: - decoderType = DecodeType.Bitmap; - return SetPDNRowBitmap; - case PsdColorMode.Grayscale: - case PsdColorMode.Duotone: - decoderType = DecodeType.Grayscale; - return SetPDNRowGrayscale; - case PsdColorMode.Indexed: - decoderType = DecodeType.Indexed; - return SetPDNRowIndexed; - case PsdColorMode.RGB: - decoderType = DecodeType.RGB; - return SetPDNRowRgb; - case PsdColorMode.CMYK: - decoderType = DecodeType.CMYK; - return SetPDNRowCmyk; - case PsdColorMode.Lab: - decoderType = DecodeType.Lab; - return SetPDNRowLab; - case PsdColorMode.Multichannel: - throw new Exception("Cannot decode multichannel."); - default: - throw new Exception("Unknown color mode."); - } - } - - private static DecodeDelegate GetDecodeDelegate32(PsdColorMode psdColorMode, ref DecodeType decoderType) - { - switch (psdColorMode) - { - case PsdColorMode.Grayscale: - decoderType = DecodeType.Grayscale32; - return SetPDNRowGrayscale32; - case PsdColorMode.RGB: - decoderType = DecodeType.RGB32; - return SetPDNRowRgb32; - default: - throw new PsdInvalidException( - "32-bit HDR images must be either RGB or grayscale."); - } - } - - /// - /// Decode image from Photoshop's channel-separated formats to BGRA. - /// - public static JobHandle DecodeImage(BitmapLayer pdnLayer, PhotoshopFile.Layer psdLayer, JobHandle inputDeps) - { - UnityEngine.Profiling.Profiler.BeginSample("DecodeImage"); - var decodeContext = new DecodeContext(psdLayer, pdnLayer.Bounds); - DecodeDelegate decoder = null; - DecodeType decoderType = 0; - - if (decodeContext.ByteDepth == 4) - decoder = GetDecodeDelegate32(decodeContext.ColorMode, ref decoderType); - else - decoder = GetDecodeDelegate(decodeContext.ColorMode, ref decoderType); - - JobHandle jobHandle = DecodeImage(pdnLayer, decodeContext, decoderType, inputDeps); - UnityEngine.Profiling.Profiler.EndSample(); - return jobHandle; - } - - /// - /// Decode image from Photoshop's channel-separated formats to BGRA, - /// using the specified decode delegate on each row. - /// - private static JobHandle DecodeImage(BitmapLayer pdnLayer, DecodeContext decodeContext, DecodeType decoderType, JobHandle inputDeps) - { - - var psdLayer = decodeContext.Layer; - var surface = pdnLayer.Surface; - var rect = decodeContext.Rectangle; - - // Convert rows from the Photoshop representation, writing the - // resulting ARGB values to to the Paint.NET Surface. - - int jobCount = Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobWorkerMaximumCount; - int execCount = (rect.Bottom - rect.Top); - int sliceCount = execCount / jobCount; - PDNDecoderJob decoderJob = new PDNDecoderJob(); - - decoderJob.Data.Rect = rect; - decoderJob.Data.LayerRect = psdLayer.Rect; - decoderJob.Data.ClippedRect = rect; - decoderJob.Data.SurfaceWidth = surface.width; - decoderJob.Data.SurfaceHeight = surface.height; - decoderJob.Data.SurfaceByteDepth = decodeContext.ByteDepth; - decoderJob.Data.DecoderType = decoderType; - - decoderJob.Data.ColorChannel0 = decodeContext.Channels[0].ImageData; - decoderJob.Data.ColorChannel1 = decodeContext.Channels.Length > 1 ? decodeContext.Channels[1].ImageData : decodeContext.Channels[0].ImageData; - decoderJob.Data.ColorChannel2 = decodeContext.Channels.Length > 2 ? decodeContext.Channels[2].ImageData : decodeContext.Channels[0].ImageData; - decoderJob.Data.ColorChannel3 = decodeContext.Channels.Length > 3 ? decodeContext.Channels[3].ImageData : decodeContext.Channels[0].ImageData; - decoderJob.Data.ColorModeData = decodeContext.ColorModeData; - decoderJob.Data.DecodedImage = surface.color; - - // Schedule the job, returns the JobHandle which can be waited upon later on - JobHandle jobHandle = decoderJob.Schedule(execCount, sliceCount, inputDeps); - - // Mask and Alpha. - int userMaskContextSize = decodeContext.UserMaskContext != null ? decodeContext.Rectangle.Width : 1; - int layerMaskContextSize = decodeContext.LayerMaskContext != null ? decodeContext.Rectangle.Width : 1; - var userAlphaMask = new NativeArray(userMaskContextSize, Allocator.TempJob); - var layerAlphaMask = new NativeArray(layerMaskContextSize, Allocator.TempJob); - var userAlphaMaskEmpty = new NativeArray(rect.Bottom, Allocator.TempJob); - var layerAlphaMaskEmpty = new NativeArray(rect.Bottom, Allocator.TempJob); - - PDNAlphaMaskJob alphaMaskJob = new PDNAlphaMaskJob(); - - for (int y = rect.Top; y < rect.Bottom; ++y) - { - if (decodeContext.UserMaskContext != null) - userAlphaMaskEmpty[y] = decodeContext.UserMaskContext.IsRowEmpty(y) ? (byte)1 : (byte)0; - if (decodeContext.LayerMaskContext != null) - layerAlphaMaskEmpty[y] = decodeContext.LayerMaskContext.IsRowEmpty(y) ? (byte)1 : (byte)0; - } - - alphaMaskJob.Data.Rect = rect; - alphaMaskJob.Data.LayerRect = psdLayer.Rect; - alphaMaskJob.Data.ClippedRect = rect; - alphaMaskJob.Data.SurfaceWidth = surface.width; - alphaMaskJob.Data.SurfaceHeight = surface.height; - alphaMaskJob.Data.SurfaceByteDepth = decodeContext.ByteDepth; - alphaMaskJob.Data.HasAlphaChannel = decodeContext.HasAlphaChannel; - - alphaMaskJob.Data.HasUserAlphaMask = decodeContext.UserMaskContext != null ? 1 : 0; - alphaMaskJob.Data.UserMaskInvertOnBlend = decodeContext.UserMaskContext != null ? (decodeContext.UserMaskContext.Mask.InvertOnBlend ? 1 : 0) : 0; - alphaMaskJob.Data.UserMaskRect = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.Rect : rect; - alphaMaskJob.Data.UserMaskContextRect = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Rectangle : rect; - alphaMaskJob.Data.HasLayerAlphaMask = decodeContext.LayerMaskContext != null ? 1 : 0; - alphaMaskJob.Data.LayerMaskInvertOnBlend = decodeContext.LayerMaskContext != null ? (decodeContext.LayerMaskContext.Mask.InvertOnBlend ? 1 : 0) : 0; - alphaMaskJob.Data.LayerMaskRect = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.Rect : rect; - alphaMaskJob.Data.LayerMaskContextRect = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Rectangle : rect; - - alphaMaskJob.Data.AlphaChannel0 = decodeContext.AlphaChannel; - alphaMaskJob.Data.UserMask = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.ImageData : decodeContext.AlphaChannel; - alphaMaskJob.Data.UserAlphaMask = userAlphaMask; - alphaMaskJob.Data.UserAlphaMaskEmpty = userAlphaMaskEmpty; - alphaMaskJob.Data.LayerMask = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.ImageData : decodeContext.AlphaChannel; - alphaMaskJob.Data.LayerAlphaMask = layerAlphaMask; - alphaMaskJob.Data.LayerAlphaMaskEmpty = layerAlphaMaskEmpty; - alphaMaskJob.Data.DecodedImage = surface.color; - alphaMaskJob.Data.UserMaskBackgroundColor = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.BackgroundColor : (byte)0; - alphaMaskJob.Data.LayerMaskBackgroundColor = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.BackgroundColor : (byte)0; - - jobHandle = alphaMaskJob.Schedule(jobHandle); - return jobHandle; - - } - - /////////////////////////////////////////////////////////////////////////// - /// SINGLE THREADED - KEPT FOR REFERENCE - /////////////////////////////////////////////////////////////////////////// - - /// - /// Decode image from Photoshop's channel-separated formats to BGRA. - /// - public static void DecodeImage(BitmapLayer pdnLayer, PhotoshopFile.Layer psdLayer) - { - UnityEngine.Profiling.Profiler.BeginSample("DecodeImage"); - var decodeContext = new DecodeContext(psdLayer, pdnLayer.Bounds); - DecodeDelegate decoder = null; - DecodeType decoderType = 0; - - if (decodeContext.ByteDepth == 4) - decoder = GetDecodeDelegate32(decodeContext.ColorMode, ref decoderType); - else - decoder = GetDecodeDelegate(decodeContext.ColorMode, ref decoderType); - - DecodeImage(pdnLayer, decodeContext, decoder); - decodeContext.Cleanup(); - UnityEngine.Profiling.Profiler.EndSample(); - } - - private delegate void DecodeDelegate(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context); - - /// - /// Decode image from Photoshop's channel-separated formats to BGRA, - /// using the specified decode delegate on each row. - /// - private static void DecodeImage(BitmapLayer pdnLayer, DecodeContext decodeContext, DecodeDelegate decoder) - { - - var psdLayer = decodeContext.Layer; - var surface = pdnLayer.Surface; - var rect = decodeContext.Rectangle; - - // Convert rows from the Photoshop representation, writing the - // resulting ARGB values to to the Paint.NET Surface. - for (int y = rect.Top; y < rect.Bottom; y++) - { - // Calculate index into ImageData source from row and column. - int idxSrcPixel = (y - psdLayer.Rect.Top) * psdLayer.Rect.Width - + (rect.Left - psdLayer.Rect.Left); - int idxSrcByte = idxSrcPixel * decodeContext.ByteDepth; - - // Calculate pointers to destination Surface. - //var pDestRow = surface.GetRowAddress(y); - //var pDestStart = pDestRow + decodeContext.Rectangle.Left; - //var pDestEnd = pDestRow + decodeContext.Rectangle.Right; - var pDestStart = y * surface.width + decodeContext.Rectangle.Left; - var pDestEnd = y * surface.width + decodeContext.Rectangle.Right; - - // For 16-bit images, take the higher-order byte from the image - // data, which is now in little-endian order. - if (decodeContext.ByteDepth == 2) - idxSrcByte++; - - // Decode the color and alpha channels - decoder(pDestStart, pDestEnd, surface.width, surface.color, idxSrcByte, decodeContext); - } - - // Mask and Alpha. - int userMaskContextSize = decodeContext.UserMaskContext != null ? decodeContext.Rectangle.Width : 1; - int layerMaskContextSize = decodeContext.LayerMaskContext != null ? decodeContext.Rectangle.Width : 1; - var userAlphaMask = new NativeArray(userMaskContextSize, Allocator.TempJob); - var layerAlphaMask = new NativeArray(layerMaskContextSize, Allocator.TempJob); - - for (int y = rect.Top; y < rect.Bottom; y++) - { - // Calculate index into ImageData source from row and column. - int idxSrcPixel = (y - psdLayer.Rect.Top) * psdLayer.Rect.Width + (rect.Left - psdLayer.Rect.Left); - int idxSrcByte = idxSrcPixel * decodeContext.ByteDepth; - - // Calculate pointers to destination Surface. - //var pDestRow = surface.GetRowAddress(y); - //var pDestStart = pDestRow + decodeContext.Rectangle.Left; - //var pDestEnd = pDestRow + decodeContext.Rectangle.Right; - var pDestStart = y * surface.width + decodeContext.Rectangle.Left; - var pDestEnd = y * surface.width + decodeContext.Rectangle.Right; - - // For 16-bit images, take the higher-order byte from the image - // data, which is now in little-endian order. - if (decodeContext.ByteDepth == 2) - idxSrcByte++; - - // Decode the color and alpha channels - SetPDNAlphaRow(pDestStart, pDestEnd, surface.width, surface.color, idxSrcByte, decodeContext.ByteDepth, decodeContext.HasAlphaChannel, decodeContext.AlphaChannel); - // Apply layer masks(s) to the alpha channel - GetMaskAlphaRow(y, decodeContext, decodeContext.LayerMaskContext, ref layerAlphaMask); - GetMaskAlphaRow(y, decodeContext, decodeContext.UserMaskContext, ref userAlphaMask); - ApplyPDNMask(pDestStart, pDestEnd, surface.width, surface.color, layerAlphaMask, userAlphaMask); - } - userAlphaMask.Dispose(); - layerAlphaMask.Dispose(); - } - - private static unsafe void GetMaskAlphaRow(int y, DecodeContext layerContext, MaskDecodeContext maskContext, ref NativeArray alphaBuffer) - { - if (maskContext == null) - return; - var mask = maskContext.Mask; - - // Background color for areas not covered by the mask - byte backgroundColor = mask.InvertOnBlend - ? (byte)(255 - mask.BackgroundColor) - : mask.BackgroundColor; - { - var alphaBufferPtr = NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(alphaBuffer); - UnsafeUtility.MemSet(alphaBufferPtr, backgroundColor, alphaBuffer.Length); - } - if (maskContext.IsRowEmpty(y)) - { - return; - } - - ////////////////////////////////////// - // Transfer mask into the alpha array - var pMaskData = mask.ImageData; - { - // Get pointers to starting positions - int alphaColumn = maskContext.Rectangle.X - layerContext.Rectangle.X; - var pAlpha = alphaColumn; - var pAlphaEnd = pAlpha + maskContext.Rectangle.Width; - - int maskRow = y - mask.Rect.Y; - int maskColumn = maskContext.Rectangle.X - mask.Rect.X; - int idxMaskPixel = (maskRow * mask.Rect.Width) + maskColumn; - var pMask = idxMaskPixel * layerContext.ByteDepth; - - // Take the high-order byte if values are 16-bit (little-endian) - if (layerContext.ByteDepth == 2) - pMask++; - - // Decode mask into the alpha array. - if (layerContext.ByteDepth == 4) - { - DecodeMaskAlphaRow32(alphaBuffer, pAlpha, pAlphaEnd, pMaskData, pMask); - } - else - { - DecodeMaskAlphaRow(alphaBuffer, pAlpha, pAlphaEnd, pMaskData, pMask, layerContext.ByteDepth); - } - - // Obsolete since Photoshop CS6, but retained for compatibility with - // older versions. Note that the background has already been inverted. - if (mask.InvertOnBlend) - { - Util.Invert(alphaBuffer, pAlpha, pAlphaEnd); - } - } - } - - private static void SetPDNAlphaRow(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, int byteDepth, int hasAlphaChannel, NativeArray alphaChannel) - { - // Set alpha to fully-opaque if there is no alpha channel - if (0 == hasAlphaChannel) - { - var pDest = pDestStart; - while (pDest < pDestEnd) - { - var c = color[pDest]; - c.a = 255; - color[pDest] = c; - pDest++; - } - } - // Set the alpha channel data - else - { - NativeArray srcAlphaChannel = alphaChannel.Reinterpret(1); - { - var pDest = pDestStart; - while (pDest < pDestEnd) - { - var c = color[pDest]; - c.a = (byteDepth < 4) ? alphaChannel[idxSrc] : RGBByteFromHDRFloat(srcAlphaChannel[idxSrc / 4]); - - color[pDest] = c; - pDest++; - idxSrc += byteDepth; - } - } - } - } - - private static void DecodeMaskAlphaRow32(NativeArray pAlpha, int pAlphaStart, int pAlphaEnd, NativeArray pMask, int pMaskStart) - { - - NativeArray floatArray = pMask.Reinterpret(1); - - while (pAlphaStart < pAlphaEnd) - { - pAlpha[pAlphaStart] = RGBByteFromHDRFloat(floatArray[pMaskStart * 4]); - - pAlphaStart++; - pMaskStart += 4; - } - } - - private static void DecodeMaskAlphaRow(NativeArray pAlpha, int pAlphaStart, int pAlphaEnd, NativeArray pMask, int pMaskStart, int byteDepth) - { - while (pAlphaStart < pAlphaEnd) - { - pAlpha[pAlphaStart] = pMask[pMaskStart]; - - pAlphaStart++; - pMaskStart += byteDepth; - } - } - - private static void ApplyPDNMask(int pDestStart, int pDestEnd, int width, NativeArray color, NativeArray layerMaskAlpha, NativeArray userMaskAlpha) - { - // Do nothing if there are no masks - if ((layerMaskAlpha.Length <= 1) && (userMaskAlpha.Length <= 1)) - { - return; - } - // Apply one mask - else if ((layerMaskAlpha.Length <= 1) || (userMaskAlpha.Length <= 1)) - { - var maskAlpha = (layerMaskAlpha.Length <= 1) ? userMaskAlpha : layerMaskAlpha; - var maskStart = 0; - { - while (pDestStart < pDestEnd) - { - var c = color[pDestStart]; - c.a = (byte)(color[pDestStart].a * maskAlpha[maskStart] / 255); - color[pDestStart] = c; - pDestStart++; - maskStart++; - } - } - } - // Apply both masks in one pass, to minimize rounding error - else - { - //fixed (byte* pLayerMaskAlpha = &layerMaskAlpha[0], - // pUserMaskAlpha = &userMaskAlpha[0]) - { - var maskStart = 0; - while (pDestStart < pDestEnd) - { - var alphaFactor = (layerMaskAlpha[maskStart]) * (userMaskAlpha[maskStart]); - var c = color[pDestStart]; - c.a = (byte)(color[pDestStart].a * alphaFactor / 65025); - color[pDestStart] = c; - - pDestStart++; - maskStart++; - } - } - } - } - - /////////////////////////////////////////////////////////////////////////// - - #region Decode 32-bit HDR channels - - private static void SetPDNRowRgb32(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - NativeArray redChannel = context.Channels[0].ImageData.Reinterpret(1); - NativeArray greenChannel = context.Channels[1].ImageData.Reinterpret(1); - NativeArray blueChannel = context.Channels[2].ImageData.Reinterpret(1); - - { - while (pDestStart < pDestEnd) - { - var c = color[pDestStart]; - c.r = RGBByteFromHDRFloat(redChannel[idxSrc / 4]); - c.g = RGBByteFromHDRFloat(greenChannel[idxSrc / 4]); - c.b = RGBByteFromHDRFloat(blueChannel[idxSrc / 4]); - color[pDestStart] = c; - pDestStart++; - idxSrc += 4; - } - } - } - - private static void SetPDNRowGrayscale32(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - NativeArray channel = context.Channels[0].ImageData.Reinterpret(1); - { - while (pDestStart < pDestEnd) - { - byte rgbValue = RGBByteFromHDRFloat(channel[idxSrc / 4]); - var c = color[pDestStart]; - c.r = rgbValue; - c.g = rgbValue; - c.b = rgbValue; - color[pDestStart] = c; - - pDestStart++; - idxSrc += 4; - } - } - } - - #endregion - - /////////////////////////////////////////////////////////////////////////// - - #region Decode 8-bit and 16-bit channels - - private static void SetPDNRowRgb(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - while (pDestStart < pDestEnd) - { - var c = color[pDestStart]; - c.r = context.Channels[0].ImageData[idxSrc]; - c.g = context.Channels[1].ImageData[idxSrc]; - c.b = context.Channels[2].ImageData[idxSrc]; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - /////////////////////////////////////////////////////////////////////////////// - // - // The color-conversion formulas come from the Colour Space Conversions FAQ: - // http://www.poynton.com/PDFs/coloureq.pdf - // - // RGB --> CMYK CMYK --> RGB - // --------------------------------------- -------------------------------------------- - // Black = minimum(1-Red,1-Green,1-Blue) Red = 1-minimum(1,Cyan*(1-Black)+Black) - // Cyan = (1-Red-Black)/(1-Black) Green = 1-minimum(1,Magenta*(1-Black)+Black) - // Magenta = (1-Green-Black)/(1-Black) Blue = 1-minimum(1,Yellow*(1-Black)+Black) - // Yellow = (1-Blue-Black)/(1-Black) - // - /////////////////////////////////////////////////////////////////////////////// - - private static void SetPDNRowCmyk(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - while (pDestStart < pDestEnd) - { - // CMYK values are stored as complements, presumably to allow for some - // measure of compatibility with RGB-only applications. - var C = 255 - context.Channels[0].ImageData[idxSrc]; - var M = 255 - context.Channels[1].ImageData[idxSrc]; - var Y = 255 - context.Channels[2].ImageData[idxSrc]; - var K = 255 - context.Channels[3].ImageData[idxSrc]; - - int nRed = 255 - Math.Min(255, C * (255 - K) / 255 + K); - int nGreen = 255 - Math.Min(255, M * (255 - K) / 255 + K); - int nBlue = 255 - Math.Min(255, Y * (255 - K) / 255 + K); - - var c = color[pDestStart]; - c.r = (byte)nRed; - c.g = (byte)nGreen; - c.b = (byte)nBlue; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - private static void SetPDNRowBitmap(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - var bitmap = context.Channels[0].ImageData; - while (pDestStart < pDestEnd) - { - byte mask = (byte)(0x80 >> (idxSrc % 8)); - byte bwValue = (byte)(bitmap[idxSrc / 8] & mask); - bwValue = (bwValue == 0) ? (byte)255 : (byte)0; - - var c = color[pDestStart]; - c.r = bwValue; - c.g = bwValue; - c.b = bwValue; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - private static void SetPDNRowGrayscale(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - while (pDestStart < pDestEnd) - { - var level = context.Channels[0].ImageData[idxSrc]; - var c = color[pDestStart]; - c.r = level; - c.g = level; - c.b = level; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - private static void SetPDNRowIndexed(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - while (pDestStart < pDestEnd) - { - int index = (int)context.Channels[0].ImageData[idxSrc]; - var c = color[pDestStart]; - c.r = (byte)context.ColorModeData[index]; - c.g = context.ColorModeData[index + 256]; - c.b = context.ColorModeData[index + 2 * 256]; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - private static void SetPDNRowLab(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) - { - while (pDestStart < pDestEnd) - { - double exL, exA, exB; - exL = (double)context.Channels[0].ImageData[idxSrc]; - exA = (double)context.Channels[1].ImageData[idxSrc]; - exB = (double)context.Channels[2].ImageData[idxSrc]; - - int L = (int)(exL / 2.55); - int a = (int)(exA - 127.5); - int b = (int)(exB - 127.5); - - // First, convert from Lab to XYZ. - // Standards used Observer = 2, Illuminant = D65 - - const double ref_X = 95.047; - const double ref_Y = 100.000; - const double ref_Z = 108.883; - - double var_Y = ((double)L + 16.0) / 116.0; - double var_X = (double)a / 500.0 + var_Y; - double var_Z = var_Y - (double)b / 200.0; - - double var_X3 = var_X * var_X * var_X; - double var_Y3 = var_Y * var_Y * var_Y; - double var_Z3 = var_Z * var_Z * var_Z; - - if (var_Y3 > 0.008856) - var_Y = var_Y3; - else - var_Y = (var_Y - 16 / 116) / 7.787; - - if (var_X3 > 0.008856) - var_X = var_X3; - else - var_X = (var_X - 16 / 116) / 7.787; - - if (var_Z3 > 0.008856) - var_Z = var_Z3; - else - var_Z = (var_Z - 16 / 116) / 7.787; - - double X = ref_X * var_X; - double Y = ref_Y * var_Y; - double Z = ref_Z * var_Z; - - // Then, convert from XYZ to RGB. - // Standards used Observer = 2, Illuminant = D65 - // ref_X = 95.047, ref_Y = 100.000, ref_Z = 108.883 - - double var_R = X * 0.032406 + Y * (-0.015372) + Z * (-0.004986); - double var_G = X * (-0.009689) + Y * 0.018758 + Z * 0.000415; - double var_B = X * 0.000557 + Y * (-0.002040) + Z * 0.010570; - - if (var_R > 0.0031308) - var_R = 1.055 * (Math.Pow(var_R, 1 / 2.4)) - 0.055; - else - var_R = 12.92 * var_R; - - if (var_G > 0.0031308) - var_G = 1.055 * (Math.Pow(var_G, 1 / 2.4)) - 0.055; - else - var_G = 12.92 * var_G; - - if (var_B > 0.0031308) - var_B = 1.055 * (Math.Pow(var_B, 1 / 2.4)) - 0.055; - else - var_B = 12.92 * var_B; - - int nRed = (int)(var_R * 256.0); - int nGreen = (int)(var_G * 256.0); - int nBlue = (int)(var_B * 256.0); - - if (nRed < 0) - nRed = 0; - else if (nRed > 255) - nRed = 255; - if (nGreen < 0) - nGreen = 0; - else if (nGreen > 255) - nGreen = 255; - if (nBlue < 0) - nBlue = 0; - else if (nBlue > 255) - nBlue = 255; - - var c = color[pDestStart]; - c.r = (byte)nRed; - c.g = (byte)nGreen; - c.b = (byte)nBlue; - color[pDestStart] = c; - - pDestStart++; - idxSrc += context.ByteDepth; - } - } - - #endregion - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using PaintDotNet; + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using PDNWrapper; +using System.Text; + +using PhotoshopFile; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using UnityEngine; +using Debug = UnityEngine.Debug; +using Unity.Jobs; + +namespace PaintDotNet.Data.PhotoshopFileType +{ + + internal enum DecodeType + { + RGB32 = 0, + Grayscale32 = 1, + RGB = 2, + CMYK = 3, + Bitmap = 4, + Grayscale = 5, + Indexed = 6, + Lab = 7 + }; + + internal static class ImageDecoderPdn + { + private static double rgbExponent = 1 / 2.19921875; + + private class DecodeContext + { + public PhotoshopFile.Layer Layer { get; private set; } + public int ByteDepth { get; private set; } + public int HasAlphaChannel { get; private set; } + public Channel[] Channels { get; private set; } + public NativeArray AlphaChannel { get; private set; } + public PsdColorMode ColorMode { get; private set; } + public NativeArray ColorModeData { get; private set; } + + public Rectangle Rectangle { get; private set; } + public MaskDecodeContext LayerMaskContext { get; private set; } + public MaskDecodeContext UserMaskContext { get; private set; } + + public DecodeContext(PhotoshopFile.Layer layer, Rectangle bounds) + { + Layer = layer; + ByteDepth = Util.BytesFromBitDepth(layer.PsdFile.BitDepth); + HasAlphaChannel = 0; + Channels = layer.Channels.ToIdArray(); + + var alphaSize = 4; + if (layer.AlphaChannel != null && layer.AlphaChannel.ImageData.Length > 0) + { + HasAlphaChannel = 1; + alphaSize = layer.AlphaChannel.ImageData.Length; + alphaSize = (alphaSize / 4) + (alphaSize % 4 > 0 ? 1 : 0); + alphaSize = alphaSize * 4; + } + AlphaChannel = new NativeArray(alphaSize, Allocator.TempJob); + if (HasAlphaChannel > 0) + NativeArray.Copy(layer.AlphaChannel.ImageData, AlphaChannel, layer.AlphaChannel.ImageData.Length); + ColorMode = layer.PsdFile.ColorMode; + ColorModeData = new NativeArray(layer.PsdFile.ColorModeData, Allocator.TempJob); + + // Clip the layer to the specified bounds + Rectangle = Layer.Rect.IntersectWith(bounds); + + if (layer.Masks != null) + { + LayerMaskContext = GetMaskContext(layer.Masks.LayerMask); + UserMaskContext = GetMaskContext(layer.Masks.UserMask); + } + } + + internal void Cleanup() + { + AlphaChannel.Dispose(); + ColorModeData.Dispose(); + } + + private MaskDecodeContext GetMaskContext(Mask mask) + { + if ((mask == null) || (mask.Disabled)) + { + return null; + } + + return new MaskDecodeContext(mask, this); + } + } + + private class MaskDecodeContext + { + public Mask Mask { get; private set; } + public Rectangle Rectangle { get; private set; } + public MaskDecodeContext(Mask mask, DecodeContext layerContext) + { + Mask = mask; + + // The PositionVsLayer flag is documented to indicate a position + // relative to the layer, but Photoshop treats the position as + // absolute. So that's what we do, too. + Rectangle = mask.Rect.IntersectWith(layerContext.Rectangle); + } + + public bool IsRowEmpty(int row) + { + return (Mask.ImageData == null) + || (Mask.ImageData.Length == 0) + || (Rectangle.Size.IsEmpty) + || (row < Rectangle.Top) + || (row >= Rectangle.Bottom); + } + } + + /////////////////////////////////////////////////////////////////////////////// + + internal static byte RGBByteFromHDRFloat(float ptr) + { + var result = (byte)(255 * Math.Pow(ptr, rgbExponent)); + return result; + } + + private static DecodeDelegate GetDecodeDelegate(PsdColorMode psdColorMode, ref DecodeType decoderType) + { + switch (psdColorMode) + { + case PsdColorMode.Bitmap: + decoderType = DecodeType.Bitmap; + return SetPDNRowBitmap; + case PsdColorMode.Grayscale: + case PsdColorMode.Duotone: + decoderType = DecodeType.Grayscale; + return SetPDNRowGrayscale; + case PsdColorMode.Indexed: + decoderType = DecodeType.Indexed; + return SetPDNRowIndexed; + case PsdColorMode.RGB: + decoderType = DecodeType.RGB; + return SetPDNRowRgb; + case PsdColorMode.CMYK: + decoderType = DecodeType.CMYK; + return SetPDNRowCmyk; + case PsdColorMode.Lab: + decoderType = DecodeType.Lab; + return SetPDNRowLab; + case PsdColorMode.Multichannel: + throw new Exception("Cannot decode multichannel."); + default: + throw new Exception("Unknown color mode."); + } + } + + private static DecodeDelegate GetDecodeDelegate32(PsdColorMode psdColorMode, ref DecodeType decoderType) + { + switch (psdColorMode) + { + case PsdColorMode.Grayscale: + decoderType = DecodeType.Grayscale32; + return SetPDNRowGrayscale32; + case PsdColorMode.RGB: + decoderType = DecodeType.RGB32; + return SetPDNRowRgb32; + default: + throw new PsdInvalidException( + "32-bit HDR images must be either RGB or grayscale."); + } + } + + /// + /// Decode image from Photoshop's channel-separated formats to BGRA. + /// + public static JobHandle DecodeImage(BitmapLayer pdnLayer, PhotoshopFile.Layer psdLayer, JobHandle inputDeps) + { + UnityEngine.Profiling.Profiler.BeginSample("DecodeImage"); + var decodeContext = new DecodeContext(psdLayer, pdnLayer.Bounds); + DecodeDelegate decoder = null; + DecodeType decoderType = 0; + + if (decodeContext.ByteDepth == 4) + decoder = GetDecodeDelegate32(decodeContext.ColorMode, ref decoderType); + else + decoder = GetDecodeDelegate(decodeContext.ColorMode, ref decoderType); + + JobHandle jobHandle = DecodeImage(pdnLayer, decodeContext, decoderType, inputDeps); + UnityEngine.Profiling.Profiler.EndSample(); + return jobHandle; + } + + /// + /// Decode image from Photoshop's channel-separated formats to BGRA, + /// using the specified decode delegate on each row. + /// + private static JobHandle DecodeImage(BitmapLayer pdnLayer, DecodeContext decodeContext, DecodeType decoderType, JobHandle inputDeps) + { + + var psdLayer = decodeContext.Layer; + var surface = pdnLayer.Surface; + var rect = decodeContext.Rectangle; + + // Convert rows from the Photoshop representation, writing the + // resulting ARGB values to to the Paint.NET Surface. + + int jobCount = Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobWorkerMaximumCount; + int execCount = (rect.Bottom - rect.Top); + int sliceCount = execCount / jobCount; + PDNDecoderJob decoderJob = new PDNDecoderJob(); + + decoderJob.Data.Rect = rect; + decoderJob.Data.LayerRect = psdLayer.Rect; + decoderJob.Data.ClippedRect = rect; + decoderJob.Data.SurfaceWidth = surface.width; + decoderJob.Data.SurfaceHeight = surface.height; + decoderJob.Data.SurfaceByteDepth = decodeContext.ByteDepth; + decoderJob.Data.DecoderType = decoderType; + + decoderJob.Data.ColorChannel0 = decodeContext.Channels[0].ImageData; + decoderJob.Data.ColorChannel1 = decodeContext.Channels.Length > 1 ? decodeContext.Channels[1].ImageData : decodeContext.Channels[0].ImageData; + decoderJob.Data.ColorChannel2 = decodeContext.Channels.Length > 2 ? decodeContext.Channels[2].ImageData : decodeContext.Channels[0].ImageData; + decoderJob.Data.ColorChannel3 = decodeContext.Channels.Length > 3 ? decodeContext.Channels[3].ImageData : decodeContext.Channels[0].ImageData; + decoderJob.Data.ColorModeData = decodeContext.ColorModeData; + decoderJob.Data.DecodedImage = surface.color; + + // Schedule the job, returns the JobHandle which can be waited upon later on + JobHandle jobHandle = decoderJob.Schedule(execCount, sliceCount, inputDeps); + + // Mask and Alpha. + int userMaskContextSize = decodeContext.UserMaskContext != null ? decodeContext.Rectangle.Width : 1; + int layerMaskContextSize = decodeContext.LayerMaskContext != null ? decodeContext.Rectangle.Width : 1; + var userAlphaMask = new NativeArray(userMaskContextSize, Allocator.TempJob); + var layerAlphaMask = new NativeArray(layerMaskContextSize, Allocator.TempJob); + var userAlphaMaskEmpty = new NativeArray(rect.Bottom, Allocator.TempJob); + var layerAlphaMaskEmpty = new NativeArray(rect.Bottom, Allocator.TempJob); + + PDNAlphaMaskJob alphaMaskJob = new PDNAlphaMaskJob(); + + for (int y = rect.Top; y < rect.Bottom; ++y) + { + if (decodeContext.UserMaskContext != null) + userAlphaMaskEmpty[y] = decodeContext.UserMaskContext.IsRowEmpty(y) ? (byte)1 : (byte)0; + if (decodeContext.LayerMaskContext != null) + layerAlphaMaskEmpty[y] = decodeContext.LayerMaskContext.IsRowEmpty(y) ? (byte)1 : (byte)0; + } + + alphaMaskJob.Data.Rect = rect; + alphaMaskJob.Data.LayerRect = psdLayer.Rect; + alphaMaskJob.Data.ClippedRect = rect; + alphaMaskJob.Data.SurfaceWidth = surface.width; + alphaMaskJob.Data.SurfaceHeight = surface.height; + alphaMaskJob.Data.SurfaceByteDepth = decodeContext.ByteDepth; + alphaMaskJob.Data.HasAlphaChannel = decodeContext.HasAlphaChannel; + + alphaMaskJob.Data.HasUserAlphaMask = decodeContext.UserMaskContext != null ? 1 : 0; + alphaMaskJob.Data.UserMaskInvertOnBlend = decodeContext.UserMaskContext != null ? (decodeContext.UserMaskContext.Mask.InvertOnBlend ? 1 : 0) : 0; + alphaMaskJob.Data.UserMaskRect = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.Rect : rect; + alphaMaskJob.Data.UserMaskContextRect = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Rectangle : rect; + alphaMaskJob.Data.HasLayerAlphaMask = decodeContext.LayerMaskContext != null ? 1 : 0; + alphaMaskJob.Data.LayerMaskInvertOnBlend = decodeContext.LayerMaskContext != null ? (decodeContext.LayerMaskContext.Mask.InvertOnBlend ? 1 : 0) : 0; + alphaMaskJob.Data.LayerMaskRect = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.Rect : rect; + alphaMaskJob.Data.LayerMaskContextRect = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Rectangle : rect; + + alphaMaskJob.Data.AlphaChannel0 = decodeContext.AlphaChannel; + alphaMaskJob.Data.UserMask = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.ImageData : decodeContext.AlphaChannel; + alphaMaskJob.Data.UserAlphaMask = userAlphaMask; + alphaMaskJob.Data.UserAlphaMaskEmpty = userAlphaMaskEmpty; + alphaMaskJob.Data.LayerMask = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.ImageData : decodeContext.AlphaChannel; + alphaMaskJob.Data.LayerAlphaMask = layerAlphaMask; + alphaMaskJob.Data.LayerAlphaMaskEmpty = layerAlphaMaskEmpty; + alphaMaskJob.Data.DecodedImage = surface.color; + alphaMaskJob.Data.UserMaskBackgroundColor = decodeContext.UserMaskContext != null ? decodeContext.UserMaskContext.Mask.BackgroundColor : (byte)0; + alphaMaskJob.Data.LayerMaskBackgroundColor = decodeContext.LayerMaskContext != null ? decodeContext.LayerMaskContext.Mask.BackgroundColor : (byte)0; + + jobHandle = alphaMaskJob.Schedule(jobHandle); + return jobHandle; + + } + + /////////////////////////////////////////////////////////////////////////// + /// SINGLE THREADED - KEPT FOR REFERENCE + /////////////////////////////////////////////////////////////////////////// + + /// + /// Decode image from Photoshop's channel-separated formats to BGRA. + /// + public static void DecodeImage(BitmapLayer pdnLayer, PhotoshopFile.Layer psdLayer) + { + UnityEngine.Profiling.Profiler.BeginSample("DecodeImage"); + var decodeContext = new DecodeContext(psdLayer, pdnLayer.Bounds); + DecodeDelegate decoder = null; + DecodeType decoderType = 0; + + if (decodeContext.ByteDepth == 4) + decoder = GetDecodeDelegate32(decodeContext.ColorMode, ref decoderType); + else + decoder = GetDecodeDelegate(decodeContext.ColorMode, ref decoderType); + + DecodeImage(pdnLayer, decodeContext, decoder); + decodeContext.Cleanup(); + UnityEngine.Profiling.Profiler.EndSample(); + } + + private delegate void DecodeDelegate(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context); + + /// + /// Decode image from Photoshop's channel-separated formats to BGRA, + /// using the specified decode delegate on each row. + /// + private static void DecodeImage(BitmapLayer pdnLayer, DecodeContext decodeContext, DecodeDelegate decoder) + { + + var psdLayer = decodeContext.Layer; + var surface = pdnLayer.Surface; + var rect = decodeContext.Rectangle; + + // Convert rows from the Photoshop representation, writing the + // resulting ARGB values to to the Paint.NET Surface. + for (int y = rect.Top; y < rect.Bottom; y++) + { + // Calculate index into ImageData source from row and column. + int idxSrcPixel = (y - psdLayer.Rect.Top) * psdLayer.Rect.Width + + (rect.Left - psdLayer.Rect.Left); + int idxSrcByte = idxSrcPixel * decodeContext.ByteDepth; + + // Calculate pointers to destination Surface. + //var pDestRow = surface.GetRowAddress(y); + //var pDestStart = pDestRow + decodeContext.Rectangle.Left; + //var pDestEnd = pDestRow + decodeContext.Rectangle.Right; + var pDestStart = y * surface.width + decodeContext.Rectangle.Left; + var pDestEnd = y * surface.width + decodeContext.Rectangle.Right; + + // For 16-bit images, take the higher-order byte from the image + // data, which is now in little-endian order. + if (decodeContext.ByteDepth == 2) + idxSrcByte++; + + // Decode the color and alpha channels + decoder(pDestStart, pDestEnd, surface.width, surface.color, idxSrcByte, decodeContext); + } + + // Mask and Alpha. + int userMaskContextSize = decodeContext.UserMaskContext != null ? decodeContext.Rectangle.Width : 1; + int layerMaskContextSize = decodeContext.LayerMaskContext != null ? decodeContext.Rectangle.Width : 1; + var userAlphaMask = new NativeArray(userMaskContextSize, Allocator.TempJob); + var layerAlphaMask = new NativeArray(layerMaskContextSize, Allocator.TempJob); + + for (int y = rect.Top; y < rect.Bottom; y++) + { + // Calculate index into ImageData source from row and column. + int idxSrcPixel = (y - psdLayer.Rect.Top) * psdLayer.Rect.Width + (rect.Left - psdLayer.Rect.Left); + int idxSrcByte = idxSrcPixel * decodeContext.ByteDepth; + + // Calculate pointers to destination Surface. + //var pDestRow = surface.GetRowAddress(y); + //var pDestStart = pDestRow + decodeContext.Rectangle.Left; + //var pDestEnd = pDestRow + decodeContext.Rectangle.Right; + var pDestStart = y * surface.width + decodeContext.Rectangle.Left; + var pDestEnd = y * surface.width + decodeContext.Rectangle.Right; + + // For 16-bit images, take the higher-order byte from the image + // data, which is now in little-endian order. + if (decodeContext.ByteDepth == 2) + idxSrcByte++; + + // Decode the color and alpha channels + SetPDNAlphaRow(pDestStart, pDestEnd, surface.width, surface.color, idxSrcByte, decodeContext.ByteDepth, decodeContext.HasAlphaChannel, decodeContext.AlphaChannel); + // Apply layer masks(s) to the alpha channel + GetMaskAlphaRow(y, decodeContext, decodeContext.LayerMaskContext, ref layerAlphaMask); + GetMaskAlphaRow(y, decodeContext, decodeContext.UserMaskContext, ref userAlphaMask); + ApplyPDNMask(pDestStart, pDestEnd, surface.width, surface.color, layerAlphaMask, userAlphaMask); + } + userAlphaMask.Dispose(); + layerAlphaMask.Dispose(); + } + + private static unsafe void GetMaskAlphaRow(int y, DecodeContext layerContext, MaskDecodeContext maskContext, ref NativeArray alphaBuffer) + { + if (maskContext == null) + return; + var mask = maskContext.Mask; + + // Background color for areas not covered by the mask + byte backgroundColor = mask.InvertOnBlend + ? (byte)(255 - mask.BackgroundColor) + : mask.BackgroundColor; + { + var alphaBufferPtr = NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(alphaBuffer); + UnsafeUtility.MemSet(alphaBufferPtr, backgroundColor, alphaBuffer.Length); + } + if (maskContext.IsRowEmpty(y)) + { + return; + } + + ////////////////////////////////////// + // Transfer mask into the alpha array + var pMaskData = mask.ImageData; + { + // Get pointers to starting positions + int alphaColumn = maskContext.Rectangle.X - layerContext.Rectangle.X; + var pAlpha = alphaColumn; + var pAlphaEnd = pAlpha + maskContext.Rectangle.Width; + + int maskRow = y - mask.Rect.Y; + int maskColumn = maskContext.Rectangle.X - mask.Rect.X; + int idxMaskPixel = (maskRow * mask.Rect.Width) + maskColumn; + var pMask = idxMaskPixel * layerContext.ByteDepth; + + // Take the high-order byte if values are 16-bit (little-endian) + if (layerContext.ByteDepth == 2) + pMask++; + + // Decode mask into the alpha array. + if (layerContext.ByteDepth == 4) + { + DecodeMaskAlphaRow32(alphaBuffer, pAlpha, pAlphaEnd, pMaskData, pMask); + } + else + { + DecodeMaskAlphaRow(alphaBuffer, pAlpha, pAlphaEnd, pMaskData, pMask, layerContext.ByteDepth); + } + + // Obsolete since Photoshop CS6, but retained for compatibility with + // older versions. Note that the background has already been inverted. + if (mask.InvertOnBlend) + { + Util.Invert(alphaBuffer, pAlpha, pAlphaEnd); + } + } + } + + private static void SetPDNAlphaRow(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, int byteDepth, int hasAlphaChannel, NativeArray alphaChannel) + { + // Set alpha to fully-opaque if there is no alpha channel + if (0 == hasAlphaChannel) + { + var pDest = pDestStart; + while (pDest < pDestEnd) + { + var c = color[pDest]; + c.a = 255; + color[pDest] = c; + pDest++; + } + } + // Set the alpha channel data + else + { + NativeArray srcAlphaChannel = alphaChannel.Reinterpret(1); + { + var pDest = pDestStart; + while (pDest < pDestEnd) + { + var c = color[pDest]; + c.a = (byteDepth < 4) ? alphaChannel[idxSrc] : RGBByteFromHDRFloat(srcAlphaChannel[idxSrc / 4]); + + color[pDest] = c; + pDest++; + idxSrc += byteDepth; + } + } + } + } + + private static void DecodeMaskAlphaRow32(NativeArray pAlpha, int pAlphaStart, int pAlphaEnd, NativeArray pMask, int pMaskStart) + { + + NativeArray floatArray = pMask.Reinterpret(1); + + while (pAlphaStart < pAlphaEnd) + { + pAlpha[pAlphaStart] = RGBByteFromHDRFloat(floatArray[pMaskStart * 4]); + + pAlphaStart++; + pMaskStart += 4; + } + } + + private static void DecodeMaskAlphaRow(NativeArray pAlpha, int pAlphaStart, int pAlphaEnd, NativeArray pMask, int pMaskStart, int byteDepth) + { + while (pAlphaStart < pAlphaEnd) + { + pAlpha[pAlphaStart] = pMask[pMaskStart]; + + pAlphaStart++; + pMaskStart += byteDepth; + } + } + + private static void ApplyPDNMask(int pDestStart, int pDestEnd, int width, NativeArray color, NativeArray layerMaskAlpha, NativeArray userMaskAlpha) + { + // Do nothing if there are no masks + if ((layerMaskAlpha.Length <= 1) && (userMaskAlpha.Length <= 1)) + { + return; + } + // Apply one mask + else if ((layerMaskAlpha.Length <= 1) || (userMaskAlpha.Length <= 1)) + { + var maskAlpha = (layerMaskAlpha.Length <= 1) ? userMaskAlpha : layerMaskAlpha; + var maskStart = 0; + { + while (pDestStart < pDestEnd) + { + var c = color[pDestStart]; + c.a = (byte)(color[pDestStart].a * maskAlpha[maskStart] / 255); + color[pDestStart] = c; + pDestStart++; + maskStart++; + } + } + } + // Apply both masks in one pass, to minimize rounding error + else + { + //fixed (byte* pLayerMaskAlpha = &layerMaskAlpha[0], + // pUserMaskAlpha = &userMaskAlpha[0]) + { + var maskStart = 0; + while (pDestStart < pDestEnd) + { + var alphaFactor = (layerMaskAlpha[maskStart]) * (userMaskAlpha[maskStart]); + var c = color[pDestStart]; + c.a = (byte)(color[pDestStart].a * alphaFactor / 65025); + color[pDestStart] = c; + + pDestStart++; + maskStart++; + } + } + } + } + + /////////////////////////////////////////////////////////////////////////// + + #region Decode 32-bit HDR channels + + private static void SetPDNRowRgb32(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + NativeArray redChannel = context.Channels[0].ImageData.Reinterpret(1); + NativeArray greenChannel = context.Channels[1].ImageData.Reinterpret(1); + NativeArray blueChannel = context.Channels[2].ImageData.Reinterpret(1); + + { + while (pDestStart < pDestEnd) + { + var c = color[pDestStart]; + c.r = RGBByteFromHDRFloat(redChannel[idxSrc / 4]); + c.g = RGBByteFromHDRFloat(greenChannel[idxSrc / 4]); + c.b = RGBByteFromHDRFloat(blueChannel[idxSrc / 4]); + color[pDestStart] = c; + pDestStart++; + idxSrc += 4; + } + } + } + + private static void SetPDNRowGrayscale32(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + NativeArray channel = context.Channels[0].ImageData.Reinterpret(1); + { + while (pDestStart < pDestEnd) + { + byte rgbValue = RGBByteFromHDRFloat(channel[idxSrc / 4]); + var c = color[pDestStart]; + c.r = rgbValue; + c.g = rgbValue; + c.b = rgbValue; + color[pDestStart] = c; + + pDestStart++; + idxSrc += 4; + } + } + } + + #endregion + + /////////////////////////////////////////////////////////////////////////// + + #region Decode 8-bit and 16-bit channels + + private static void SetPDNRowRgb(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + while (pDestStart < pDestEnd) + { + var c = color[pDestStart]; + c.r = context.Channels[0].ImageData[idxSrc]; + c.g = context.Channels[1].ImageData[idxSrc]; + c.b = context.Channels[2].ImageData[idxSrc]; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + /////////////////////////////////////////////////////////////////////////////// + // + // The color-conversion formulas come from the Colour Space Conversions FAQ: + // http://www.poynton.com/PDFs/coloureq.pdf + // + // RGB --> CMYK CMYK --> RGB + // --------------------------------------- -------------------------------------------- + // Black = minimum(1-Red,1-Green,1-Blue) Red = 1-minimum(1,Cyan*(1-Black)+Black) + // Cyan = (1-Red-Black)/(1-Black) Green = 1-minimum(1,Magenta*(1-Black)+Black) + // Magenta = (1-Green-Black)/(1-Black) Blue = 1-minimum(1,Yellow*(1-Black)+Black) + // Yellow = (1-Blue-Black)/(1-Black) + // + /////////////////////////////////////////////////////////////////////////////// + + private static void SetPDNRowCmyk(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + while (pDestStart < pDestEnd) + { + // CMYK values are stored as complements, presumably to allow for some + // measure of compatibility with RGB-only applications. + var C = 255 - context.Channels[0].ImageData[idxSrc]; + var M = 255 - context.Channels[1].ImageData[idxSrc]; + var Y = 255 - context.Channels[2].ImageData[idxSrc]; + var K = 255 - context.Channels[3].ImageData[idxSrc]; + + int nRed = 255 - Math.Min(255, C * (255 - K) / 255 + K); + int nGreen = 255 - Math.Min(255, M * (255 - K) / 255 + K); + int nBlue = 255 - Math.Min(255, Y * (255 - K) / 255 + K); + + var c = color[pDestStart]; + c.r = (byte)nRed; + c.g = (byte)nGreen; + c.b = (byte)nBlue; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + private static void SetPDNRowBitmap(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + var bitmap = context.Channels[0].ImageData; + while (pDestStart < pDestEnd) + { + byte mask = (byte)(0x80 >> (idxSrc % 8)); + byte bwValue = (byte)(bitmap[idxSrc / 8] & mask); + bwValue = (bwValue == 0) ? (byte)255 : (byte)0; + + var c = color[pDestStart]; + c.r = bwValue; + c.g = bwValue; + c.b = bwValue; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + private static void SetPDNRowGrayscale(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + while (pDestStart < pDestEnd) + { + var level = context.Channels[0].ImageData[idxSrc]; + var c = color[pDestStart]; + c.r = level; + c.g = level; + c.b = level; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + private static void SetPDNRowIndexed(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + while (pDestStart < pDestEnd) + { + int index = (int)context.Channels[0].ImageData[idxSrc]; + var c = color[pDestStart]; + c.r = (byte)context.ColorModeData[index]; + c.g = context.ColorModeData[index + 256]; + c.b = context.ColorModeData[index + 2 * 256]; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + private static void SetPDNRowLab(int pDestStart, int pDestEnd, int width, NativeArray color, int idxSrc, DecodeContext context) + { + while (pDestStart < pDestEnd) + { + double exL, exA, exB; + exL = (double)context.Channels[0].ImageData[idxSrc]; + exA = (double)context.Channels[1].ImageData[idxSrc]; + exB = (double)context.Channels[2].ImageData[idxSrc]; + + int L = (int)(exL / 2.55); + int a = (int)(exA - 127.5); + int b = (int)(exB - 127.5); + + // First, convert from Lab to XYZ. + // Standards used Observer = 2, Illuminant = D65 + + const double ref_X = 95.047; + const double ref_Y = 100.000; + const double ref_Z = 108.883; + + double var_Y = ((double)L + 16.0) / 116.0; + double var_X = (double)a / 500.0 + var_Y; + double var_Z = var_Y - (double)b / 200.0; + + double var_X3 = var_X * var_X * var_X; + double var_Y3 = var_Y * var_Y * var_Y; + double var_Z3 = var_Z * var_Z * var_Z; + + if (var_Y3 > 0.008856) + var_Y = var_Y3; + else + var_Y = (var_Y - 16 / 116) / 7.787; + + if (var_X3 > 0.008856) + var_X = var_X3; + else + var_X = (var_X - 16 / 116) / 7.787; + + if (var_Z3 > 0.008856) + var_Z = var_Z3; + else + var_Z = (var_Z - 16 / 116) / 7.787; + + double X = ref_X * var_X; + double Y = ref_Y * var_Y; + double Z = ref_Z * var_Z; + + // Then, convert from XYZ to RGB. + // Standards used Observer = 2, Illuminant = D65 + // ref_X = 95.047, ref_Y = 100.000, ref_Z = 108.883 + + double var_R = X * 0.032406 + Y * (-0.015372) + Z * (-0.004986); + double var_G = X * (-0.009689) + Y * 0.018758 + Z * 0.000415; + double var_B = X * 0.000557 + Y * (-0.002040) + Z * 0.010570; + + if (var_R > 0.0031308) + var_R = 1.055 * (Math.Pow(var_R, 1 / 2.4)) - 0.055; + else + var_R = 12.92 * var_R; + + if (var_G > 0.0031308) + var_G = 1.055 * (Math.Pow(var_G, 1 / 2.4)) - 0.055; + else + var_G = 12.92 * var_G; + + if (var_B > 0.0031308) + var_B = 1.055 * (Math.Pow(var_B, 1 / 2.4)) - 0.055; + else + var_B = 12.92 * var_B; + + int nRed = (int)(var_R * 256.0); + int nGreen = (int)(var_G * 256.0); + int nBlue = (int)(var_B * 256.0); + + if (nRed < 0) + nRed = 0; + else if (nRed > 255) + nRed = 255; + if (nGreen < 0) + nGreen = 0; + else if (nGreen > 255) + nGreen = 255; + if (nBlue < 0) + nBlue = 0; + else if (nBlue > 255) + nBlue = 255; + + var c = color[pDestStart]; + c.r = (byte)nRed; + c.g = (byte)nGreen; + c.b = (byte)nBlue; + color[pDestStart] = c; + + pDestStart++; + idxSrc += context.ByteDepth; + } + } + + #endregion + } +} diff --git a/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs.meta b/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs.meta index 35d0cc1..1346286 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs.meta +++ b/Editor/PSDPlugin/PhotoShopFileType/ImageDecoderPdn.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 812b92369e1c26c4eb12b733b257bd85 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 812b92369e1c26c4eb12b733b257bd85 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs b/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs index 9b93e4d..7efbef9 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs +++ b/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs @@ -1,301 +1,301 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; - -using PhotoshopFile; -using UnityEngine; -using PDNWrapper; -using Unity.Collections; -using Unity.Jobs; - -namespace PaintDotNet.Data.PhotoshopFileType -{ - internal static class PsdLoad - { - public static PsdFile Load(System.IO.Stream input, ELoadFlag loadFlag) - { - var loadContext = new DocumentLoadContext(); - return new PsdFile(input, loadContext, loadFlag); - } - - public static Document Load(System.IO.Stream input) - { - // Load and decompress Photoshop file structures - var loadContext = new DocumentLoadContext(); - var psdFile = new PsdFile(input, loadContext); - - // Multichannel images are loaded by processing each channel as a - // grayscale layer. - if (psdFile.ColorMode == PsdColorMode.Multichannel) - { - CreateLayersFromChannels(psdFile); - psdFile.ColorMode = PsdColorMode.Grayscale; - } - - // Convert into Paint.NET internal representation - var document = new Document(psdFile.ColumnCount, psdFile.RowCount); - - if (psdFile.Layers.Count == 0) - { - psdFile.BaseLayer.CreateMissingChannels(); - var layer = PDNWrapper.Layer.CreateBackgroundLayer(psdFile.ColumnCount, psdFile.RowCount); - ImageDecoderPdn.DecodeImage(layer, psdFile.BaseLayer); - layer.Name = String.IsNullOrEmpty(psdFile.BaseLayer.Name)? "Background" : psdFile.BaseLayer.Name; - layer.Opacity = psdFile.BaseLayer.Opacity; - layer.Visible = psdFile.BaseLayer.Visible; - layer.IsGroup = psdFile.BaseLayer.IsGroup; - layer.LayerID = psdFile.BaseLayer.LayerID; - layer.BlendMode = BlendModeMapping.FromPsdBlendMode(psdFile.BaseLayer.BlendModeKey); - document.Layers.Add(layer); - } - else - { - psdFile.VerifyLayerSections(); - ApplyLayerSections(psdFile.Layers); - - //var pdnLayers = psdFile.Layers.AsParallel().AsOrdered() - // .Select(psdLayer => psdLayer.DecodeToPdnLayer()) - // .ToList(); - //document.Layers.AddRange(pdnLayers); - /* - foreach (var l in psdFile.Layers) - { - document.Layers.Add(l.DecodeToPdnLayer()); - } - */ - BitmapLayer parent = null; - JobHandle jobHandle = default(JobHandle); - foreach (var l in Enumerable.Reverse(psdFile.Layers)) - { - if (l.IsEndGroupMarker) - { - parent = parent != null ? parent.ParentLayer : null; - continue; - } - BitmapLayer b = null; - jobHandle = l.DecodeToPdnLayer(jobHandle, out b); - b.ParentLayer = parent; - if (parent != null) - parent.ChildLayer.Add(b); - else - document.Layers.Add(b); - - if (b.IsGroup) - parent = b; - } - jobHandle.Complete(); - } - SetPdnResolutionInfo(psdFile, document); - psdFile.Cleanup(); - return document; - } - - internal static JobHandle DecodeToPdnLayer(this PhotoshopFile.Layer psdLayer, JobHandle inputDeps, out BitmapLayer pdnLayer) - { - var psdFile = psdLayer.PsdFile; - psdLayer.CreateMissingChannels(); - - pdnLayer = new BitmapLayer(psdFile.ColumnCount, psdFile.RowCount); - pdnLayer.Name = psdLayer.Name; - pdnLayer.Opacity = psdLayer.Opacity; - pdnLayer.Visible = psdLayer.Visible; - pdnLayer.IsGroup = psdLayer.IsGroup; - pdnLayer.LayerID = psdLayer.LayerID; - pdnLayer.BlendMode = BlendModeMapping.FromPsdBlendMode(psdLayer.BlendModeKey); - return ImageDecoderPdn.DecodeImage(pdnLayer, psdLayer, inputDeps); - } - - /// - /// Creates a layer for each channel in a multichannel image. - /// - private static void CreateLayersFromChannels(PsdFile psdFile) - { - if (psdFile.ColorMode != PsdColorMode.Multichannel) - throw new Exception("Not a multichannel image."); - if (psdFile.Layers.Count > 0) - throw new PsdInvalidException("Multichannel image should not have layers."); - - // Get alpha channel names, preferably in Unicode. - var alphaChannelNames = (AlphaChannelNames)psdFile.ImageResources - .Get(ResourceID.AlphaChannelNames); - var unicodeAlphaNames = (UnicodeAlphaNames)psdFile.ImageResources - .Get(ResourceID.UnicodeAlphaNames); - if ((alphaChannelNames == null) && (unicodeAlphaNames == null)) - throw new PsdInvalidException("No channel names found."); - - var channelNames = (unicodeAlphaNames != null) - ? unicodeAlphaNames.ChannelNames - : alphaChannelNames.ChannelNames; - var channels = psdFile.BaseLayer.Channels; - if (channels.Count > channelNames.Count) - throw new PsdInvalidException("More channels than channel names."); - - // Channels are stored from top to bottom, but layers are stored from - // bottom to top. - for (int i = channels.Count - 1; i >= 0; i--) - { - var channel = channels[i]; - var channelName = channelNames[i]; - - // Copy metadata over from base layer - var layer = new PhotoshopFile.Layer(psdFile); - layer.Rect = psdFile.BaseLayer.Rect; - layer.Visible = true; - layer.Masks = new MaskInfo(); - layer.BlendingRangesData = new BlendingRanges(layer); - - // We do not attempt to reconstruct the appearance of the image, but - // only to provide access to the channels image data. - layer.Name = channelName; - layer.BlendModeKey = PsdBlendMode.Darken; - layer.Opacity = 255; - - // Copy channel image data into the new grayscale layer - var layerChannel = new Channel(0, layer); - layerChannel.ImageCompression = channel.ImageCompression; - layerChannel.ImageData = new NativeArray(channel.ImageData, Allocator.Persistent); - layer.Channels.Add(layerChannel); - - psdFile.Layers.Add(layer); - } - } - - /// - /// Transform Photoshop's layer tree to Paint.NET's flat layer list. - /// Indicate where layer sections begin and end, and hide all layers within - /// hidden layer sections. - /// - private static void ApplyLayerSections(List layers) - { - // BUG: PsdPluginResources.GetString will always return English resource, - // because Paint.NET does not set the CurrentUICulture when OnLoad is - // called. This situation should be resolved with Paint.NET 4.0, which - // will provide an alternative mechanism to retrieve the UI language. - - // Track the depth of the topmost hidden section. Any nested sections - // will be hidden, whether or not they themselves have the flag set. - int topHiddenSectionDepth = Int32.MaxValue; - var layerSectionNames = new Stack(); - - // Layers are stored bottom-to-top, but layer sections are specified - // top-to-bottom. - foreach (var layer in Enumerable.Reverse(layers)) - { - // Leo: Since we are importing, we don't care if the group is collapsed - // Apply to all layers within the layer section, as well as the - // closing layer. - //if (layerSectionNames.Count > topHiddenSectionDepth) - // layer.Visible = false; - - var sectionInfo = (LayerSectionInfo)layer.AdditionalInfo - .SingleOrDefault(x => x is LayerSectionInfo); - if (sectionInfo == null) - continue; - - switch (sectionInfo.SectionType) - { - case LayerSectionType.OpenFolder: - case LayerSectionType.ClosedFolder: - // Start a new layer section - if ((!layer.Visible) && (topHiddenSectionDepth == Int32.MaxValue)) - topHiddenSectionDepth = layerSectionNames.Count; - layerSectionNames.Push(layer.Name); - layer.IsGroup = true; - //layer.Name = String.Format(beginSectionWrapper, layer.Name); - break; - - case LayerSectionType.SectionDivider: - // End the current layer section - //var layerSectionName = layerSectionNames.Pop (); - if (layerSectionNames.Count == topHiddenSectionDepth) - topHiddenSectionDepth = Int32.MaxValue; - layer.IsEndGroupMarker = true; - //layer.Name = String.Format(endSectionWrapper, layerSectionName); - break; - } - } - } - - /// - /// Set the resolution on the Paint.NET Document to match the PSD file. - /// - private static void SetPdnResolutionInfo(PsdFile psdFile, Document document) - { - if (psdFile.Resolution != null) - { - // PSD files always specify the resolution in DPI. When loading and - // saving cm, we will have to round-trip the conversion, but doubles - // have plenty of precision to spare vs. PSD's 16/16 fixed-point. - - if ((psdFile.Resolution.HResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm) - && (psdFile.Resolution.VResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm)) - { - document.DpuUnit = MeasurementUnit.Centimeter; - - // HACK: Paint.NET truncates DpuX and DpuY to three decimal places, - // so add 0.0005 to get a rounded value instead. - document.DpuX = psdFile.Resolution.HDpi / 2.54 + 0.0005; - document.DpuY = psdFile.Resolution.VDpi / 2.54 + 0.0005; - } - else - { - document.DpuUnit = MeasurementUnit.Inch; - document.DpuX = psdFile.Resolution.HDpi; - document.DpuY = psdFile.Resolution.VDpi; - } - } - } - - /// - /// Verify that the PSD file will fit into physical memory once loaded - /// and converted to Paint.NET format. - /// - /// - /// This check is necessary because layers in Paint.NET have the same - /// dimensions as the canvas. Thus, PSD files that contain lots of - /// tiny adjustment layers may blow up in size by several - /// orders of magnitude. - /// - internal static void CheckSufficientMemory(PsdFile psdFile) - { - // Multichannel images have channels converted to layers - var numLayers = (psdFile.ColorMode == PsdColorMode.Multichannel) - ? psdFile.BaseLayer.Channels.Count - : Math.Max(psdFile.Layers.Count, 1); - - // Paint.NET also requires a scratch layer and composite layer - numLayers += 2; - - long numPixels = (long)psdFile.ColumnCount * psdFile.RowCount; - ulong bytesRequired = (ulong)(checked(4 * numPixels * numLayers)); - - // Check that the file will fit entirely into physical memory, so that we - // do not thrash and make the Paint.NET UI nonresponsive. We also have - // to check against virtual memory address space because 32-bit processes - // cannot access all 4 GB. - //var computerInfo = new Microsoft.VisualBasic.Devices.ComputerInfo(); - //var accessibleMemory = Math.Min(computerInfo.TotalPhysicalMemory, - // computerInfo.TotalVirtualMemory); - var accessibleMemory = (ulong)SystemInfo.systemMemorySize * 1024 * 1024; - if (bytesRequired > accessibleMemory) - { - throw new OutOfMemoryException(); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +using PhotoshopFile; +using UnityEngine; +using PDNWrapper; +using Unity.Collections; +using Unity.Jobs; + +namespace PaintDotNet.Data.PhotoshopFileType +{ + internal static class PsdLoad + { + public static PsdFile Load(System.IO.Stream input, ELoadFlag loadFlag) + { + var loadContext = new DocumentLoadContext(); + return new PsdFile(input, loadContext, loadFlag); + } + + public static Document Load(System.IO.Stream input) + { + // Load and decompress Photoshop file structures + var loadContext = new DocumentLoadContext(); + var psdFile = new PsdFile(input, loadContext); + + // Multichannel images are loaded by processing each channel as a + // grayscale layer. + if (psdFile.ColorMode == PsdColorMode.Multichannel) + { + CreateLayersFromChannels(psdFile); + psdFile.ColorMode = PsdColorMode.Grayscale; + } + + // Convert into Paint.NET internal representation + var document = new Document(psdFile.ColumnCount, psdFile.RowCount); + + if (psdFile.Layers.Count == 0) + { + psdFile.BaseLayer.CreateMissingChannels(); + var layer = PDNWrapper.Layer.CreateBackgroundLayer(psdFile.ColumnCount, psdFile.RowCount); + ImageDecoderPdn.DecodeImage(layer, psdFile.BaseLayer); + layer.Name = String.IsNullOrEmpty(psdFile.BaseLayer.Name)? "Background" : psdFile.BaseLayer.Name; + layer.Opacity = psdFile.BaseLayer.Opacity; + layer.Visible = psdFile.BaseLayer.Visible; + layer.IsGroup = psdFile.BaseLayer.IsGroup; + layer.LayerID = psdFile.BaseLayer.LayerID; + layer.BlendMode = BlendModeMapping.FromPsdBlendMode(psdFile.BaseLayer.BlendModeKey); + document.Layers.Add(layer); + } + else + { + psdFile.VerifyLayerSections(); + ApplyLayerSections(psdFile.Layers); + + //var pdnLayers = psdFile.Layers.AsParallel().AsOrdered() + // .Select(psdLayer => psdLayer.DecodeToPdnLayer()) + // .ToList(); + //document.Layers.AddRange(pdnLayers); + /* + foreach (var l in psdFile.Layers) + { + document.Layers.Add(l.DecodeToPdnLayer()); + } + */ + BitmapLayer parent = null; + JobHandle jobHandle = default(JobHandle); + foreach (var l in Enumerable.Reverse(psdFile.Layers)) + { + if (l.IsEndGroupMarker) + { + parent = parent != null ? parent.ParentLayer : null; + continue; + } + BitmapLayer b = null; + jobHandle = l.DecodeToPdnLayer(jobHandle, out b); + b.ParentLayer = parent; + if (parent != null) + parent.ChildLayer.Add(b); + else + document.Layers.Add(b); + + if (b.IsGroup) + parent = b; + } + jobHandle.Complete(); + } + SetPdnResolutionInfo(psdFile, document); + psdFile.Cleanup(); + return document; + } + + internal static JobHandle DecodeToPdnLayer(this PhotoshopFile.Layer psdLayer, JobHandle inputDeps, out BitmapLayer pdnLayer) + { + var psdFile = psdLayer.PsdFile; + psdLayer.CreateMissingChannels(); + + pdnLayer = new BitmapLayer(psdFile.ColumnCount, psdFile.RowCount); + pdnLayer.Name = psdLayer.Name; + pdnLayer.Opacity = psdLayer.Opacity; + pdnLayer.Visible = psdLayer.Visible; + pdnLayer.IsGroup = psdLayer.IsGroup; + pdnLayer.LayerID = psdLayer.LayerID; + pdnLayer.BlendMode = BlendModeMapping.FromPsdBlendMode(psdLayer.BlendModeKey); + return ImageDecoderPdn.DecodeImage(pdnLayer, psdLayer, inputDeps); + } + + /// + /// Creates a layer for each channel in a multichannel image. + /// + private static void CreateLayersFromChannels(PsdFile psdFile) + { + if (psdFile.ColorMode != PsdColorMode.Multichannel) + throw new Exception("Not a multichannel image."); + if (psdFile.Layers.Count > 0) + throw new PsdInvalidException("Multichannel image should not have layers."); + + // Get alpha channel names, preferably in Unicode. + var alphaChannelNames = (AlphaChannelNames)psdFile.ImageResources + .Get(ResourceID.AlphaChannelNames); + var unicodeAlphaNames = (UnicodeAlphaNames)psdFile.ImageResources + .Get(ResourceID.UnicodeAlphaNames); + if ((alphaChannelNames == null) && (unicodeAlphaNames == null)) + throw new PsdInvalidException("No channel names found."); + + var channelNames = (unicodeAlphaNames != null) + ? unicodeAlphaNames.ChannelNames + : alphaChannelNames.ChannelNames; + var channels = psdFile.BaseLayer.Channels; + if (channels.Count > channelNames.Count) + throw new PsdInvalidException("More channels than channel names."); + + // Channels are stored from top to bottom, but layers are stored from + // bottom to top. + for (int i = channels.Count - 1; i >= 0; i--) + { + var channel = channels[i]; + var channelName = channelNames[i]; + + // Copy metadata over from base layer + var layer = new PhotoshopFile.Layer(psdFile); + layer.Rect = psdFile.BaseLayer.Rect; + layer.Visible = true; + layer.Masks = new MaskInfo(); + layer.BlendingRangesData = new BlendingRanges(layer); + + // We do not attempt to reconstruct the appearance of the image, but + // only to provide access to the channels image data. + layer.Name = channelName; + layer.BlendModeKey = PsdBlendMode.Darken; + layer.Opacity = 255; + + // Copy channel image data into the new grayscale layer + var layerChannel = new Channel(0, layer); + layerChannel.ImageCompression = channel.ImageCompression; + layerChannel.ImageData = new NativeArray(channel.ImageData, Allocator.Persistent); + layer.Channels.Add(layerChannel); + + psdFile.Layers.Add(layer); + } + } + + /// + /// Transform Photoshop's layer tree to Paint.NET's flat layer list. + /// Indicate where layer sections begin and end, and hide all layers within + /// hidden layer sections. + /// + private static void ApplyLayerSections(List layers) + { + // BUG: PsdPluginResources.GetString will always return English resource, + // because Paint.NET does not set the CurrentUICulture when OnLoad is + // called. This situation should be resolved with Paint.NET 4.0, which + // will provide an alternative mechanism to retrieve the UI language. + + // Track the depth of the topmost hidden section. Any nested sections + // will be hidden, whether or not they themselves have the flag set. + int topHiddenSectionDepth = Int32.MaxValue; + var layerSectionNames = new Stack(); + + // Layers are stored bottom-to-top, but layer sections are specified + // top-to-bottom. + foreach (var layer in Enumerable.Reverse(layers)) + { + // Leo: Since we are importing, we don't care if the group is collapsed + // Apply to all layers within the layer section, as well as the + // closing layer. + //if (layerSectionNames.Count > topHiddenSectionDepth) + // layer.Visible = false; + + var sectionInfo = (LayerSectionInfo)layer.AdditionalInfo + .SingleOrDefault(x => x is LayerSectionInfo); + if (sectionInfo == null) + continue; + + switch (sectionInfo.SectionType) + { + case LayerSectionType.OpenFolder: + case LayerSectionType.ClosedFolder: + // Start a new layer section + if ((!layer.Visible) && (topHiddenSectionDepth == Int32.MaxValue)) + topHiddenSectionDepth = layerSectionNames.Count; + layerSectionNames.Push(layer.Name); + layer.IsGroup = true; + //layer.Name = String.Format(beginSectionWrapper, layer.Name); + break; + + case LayerSectionType.SectionDivider: + // End the current layer section + //var layerSectionName = layerSectionNames.Pop (); + if (layerSectionNames.Count == topHiddenSectionDepth) + topHiddenSectionDepth = Int32.MaxValue; + layer.IsEndGroupMarker = true; + //layer.Name = String.Format(endSectionWrapper, layerSectionName); + break; + } + } + } + + /// + /// Set the resolution on the Paint.NET Document to match the PSD file. + /// + private static void SetPdnResolutionInfo(PsdFile psdFile, Document document) + { + if (psdFile.Resolution != null) + { + // PSD files always specify the resolution in DPI. When loading and + // saving cm, we will have to round-trip the conversion, but doubles + // have plenty of precision to spare vs. PSD's 16/16 fixed-point. + + if ((psdFile.Resolution.HResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm) + && (psdFile.Resolution.VResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm)) + { + document.DpuUnit = MeasurementUnit.Centimeter; + + // HACK: Paint.NET truncates DpuX and DpuY to three decimal places, + // so add 0.0005 to get a rounded value instead. + document.DpuX = psdFile.Resolution.HDpi / 2.54 + 0.0005; + document.DpuY = psdFile.Resolution.VDpi / 2.54 + 0.0005; + } + else + { + document.DpuUnit = MeasurementUnit.Inch; + document.DpuX = psdFile.Resolution.HDpi; + document.DpuY = psdFile.Resolution.VDpi; + } + } + } + + /// + /// Verify that the PSD file will fit into physical memory once loaded + /// and converted to Paint.NET format. + /// + /// + /// This check is necessary because layers in Paint.NET have the same + /// dimensions as the canvas. Thus, PSD files that contain lots of + /// tiny adjustment layers may blow up in size by several + /// orders of magnitude. + /// + internal static void CheckSufficientMemory(PsdFile psdFile) + { + // Multichannel images have channels converted to layers + var numLayers = (psdFile.ColorMode == PsdColorMode.Multichannel) + ? psdFile.BaseLayer.Channels.Count + : Math.Max(psdFile.Layers.Count, 1); + + // Paint.NET also requires a scratch layer and composite layer + numLayers += 2; + + long numPixels = (long)psdFile.ColumnCount * psdFile.RowCount; + ulong bytesRequired = (ulong)(checked(4 * numPixels * numLayers)); + + // Check that the file will fit entirely into physical memory, so that we + // do not thrash and make the Paint.NET UI nonresponsive. We also have + // to check against virtual memory address space because 32-bit processes + // cannot access all 4 GB. + //var computerInfo = new Microsoft.VisualBasic.Devices.ComputerInfo(); + //var accessibleMemory = Math.Min(computerInfo.TotalPhysicalMemory, + // computerInfo.TotalVirtualMemory); + var accessibleMemory = (ulong)SystemInfo.systemMemorySize * 1024 * 1024; + if (bytesRequired > accessibleMemory) + { + throw new OutOfMemoryException(); + } + } + } +} diff --git a/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs.meta b/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs.meta index 8f57c51..00a5360 100644 --- a/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs.meta +++ b/Editor/PSDPlugin/PhotoShopFileType/PsdLoad.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: da02470271ab86841bf9d88cc0bed2ec -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: da02470271ab86841bf9d88cc0bed2ec +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile.meta b/Editor/PSDPlugin/PsdFile.meta index ad53108..78ac90c 100644 --- a/Editor/PSDPlugin/PsdFile.meta +++ b/Editor/PSDPlugin/PsdFile.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: e59e9fe7abf273d468dc9e55f8a8acaa -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: e59e9fe7abf273d468dc9e55f8a8acaa +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression.meta b/Editor/PSDPlugin/PsdFile/Compression.meta index 330f7f1..d89d125 100644 --- a/Editor/PSDPlugin/PsdFile/Compression.meta +++ b/Editor/PSDPlugin/PsdFile/Compression.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: cea9a02ce8d970946b9534af754bfda1 -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: cea9a02ce8d970946b9534af754bfda1 +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs b/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs index e5408f3..38808eb 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs @@ -1,50 +1,50 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; - -namespace PhotoshopFile.Compression -{ - internal class EndianReverser : ImageData - { - private ImageData imageData; - - protected override bool AltersWrittenData - { - get { return true; } - } - - public EndianReverser(ImageData imageData) - : base(imageData.Size, imageData.BitDepth) - { - this.imageData = imageData; - } - - internal override void Read(byte[] buffer) - { - imageData.Read(buffer); - - var numPixels = Size.Width * Size.Height; - if (numPixels == 0) - { - return; - } - Util.SwapByteArray(BitDepth, buffer, 0, numPixels); - } - - public override byte[] ReadCompressed() - { - return imageData.ReadCompressed(); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; + +namespace PhotoshopFile.Compression +{ + internal class EndianReverser : ImageData + { + private ImageData imageData; + + protected override bool AltersWrittenData + { + get { return true; } + } + + public EndianReverser(ImageData imageData) + : base(imageData.Size, imageData.BitDepth) + { + this.imageData = imageData; + } + + internal override void Read(byte[] buffer) + { + imageData.Read(buffer); + + var numPixels = Size.Width * Size.Height; + if (numPixels == 0) + { + return; + } + Util.SwapByteArray(BitDepth, buffer, 0, numPixels); + } + + public override byte[] ReadCompressed() + { + return imageData.ReadCompressed(); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs.meta index c4631c1..f85a03b 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/EndianReverser.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 1a1cbf26300dbdd4ebaf8e0a92b67db6 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 1a1cbf26300dbdd4ebaf8e0a92b67db6 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs b/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs index 39fed98..7b3b009 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs @@ -1,57 +1,57 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; -using System.IO.Compression; - -namespace PhotoshopFile.Compression -{ - internal abstract class ImageData - { - public int BitDepth { get; private set; } - - public int BytesPerRow { get; private set; } - - public Size Size { get; private set; } - - protected abstract bool AltersWrittenData { get; } - - protected ImageData(Size size, int bitDepth) - { - Size = size; - BitDepth = bitDepth; - BytesPerRow = Util.BytesPerRow(size, bitDepth); - } - - /// - /// Reads decompressed image data. - /// - public virtual byte[] Read() - { - var imageLongLength = (long)BytesPerRow * Size.Height; - Util.CheckByteArrayLength(imageLongLength); - - var buffer = new byte[imageLongLength]; - Read(buffer); - return buffer; - } - - internal abstract void Read(byte[] buffer); - - /// - /// Reads compressed image data. - /// - public abstract byte[] ReadCompressed(); - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; +using System.IO.Compression; + +namespace PhotoshopFile.Compression +{ + internal abstract class ImageData + { + public int BitDepth { get; private set; } + + public int BytesPerRow { get; private set; } + + public Size Size { get; private set; } + + protected abstract bool AltersWrittenData { get; } + + protected ImageData(Size size, int bitDepth) + { + Size = size; + BitDepth = bitDepth; + BytesPerRow = Util.BytesPerRow(size, bitDepth); + } + + /// + /// Reads decompressed image data. + /// + public virtual byte[] Read() + { + var imageLongLength = (long)BytesPerRow * Size.Height; + Util.CheckByteArrayLength(imageLongLength); + + var buffer = new byte[imageLongLength]; + Read(buffer); + return buffer; + } + + internal abstract void Read(byte[] buffer); + + /// + /// Reads compressed image data. + /// + public abstract byte[] ReadCompressed(); + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs.meta index e5c74cf..e1c944c 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/ImageData.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 23318de62729646489ccb1545e7c5bbf -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 23318de62729646489ccb1545e7c5bbf +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs b/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs index 1d4aec4..98cac8b 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs @@ -1,96 +1,96 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.IO.Compression; -using PDNWrapper; - -namespace PhotoshopFile.Compression -{ - internal static class ImageDataFactory - { - /// - /// Creates an ImageData object to compress or decompress image data. - /// - /// The Channel associated with the image data. - /// The image data to be decompressed, or null if - /// image data is to be compressed. - public static ImageData Create(Channel channel, byte[] data) - { - var bitDepth = channel.Layer.PsdFile.BitDepth; - ImageData imageData; - switch (channel.ImageCompression) - { - case ImageCompression.Raw: - imageData = new RawImage(data, channel.Rect.Size, bitDepth); - break; - - case ImageCompression.Rle: - imageData = new RleImage(data, channel.RleRowLengths, - channel.Rect.Size, bitDepth); - break; - - case ImageCompression.Zip: - // Photoshop treats 32-bit Zip as 32-bit ZipPrediction - imageData = (bitDepth == 32) - ? CreateZipPredict(data, channel.Rect.Size, bitDepth) - : new ZipImage(data, channel.Rect.Size, bitDepth); - break; - - case ImageCompression.ZipPrediction: - imageData = CreateZipPredict(data, channel.Rect.Size, bitDepth); - break; - - default: - throw new PsdInvalidException("Unknown image compression method."); - } - - // Reverse endianness of multi-byte image data - imageData = WrapEndianness(imageData); - - return imageData; - } - - private static ImageData CreateZipPredict(byte[] data, Size size, - int bitDepth) - { - switch (bitDepth) - { - case 16: - return new ZipPredict16Image(data, size); - case 32: - return new ZipPredict32Image(data, size); - default: - throw new PsdInvalidException( - "ZIP with prediction is only available for 16 and 32 bit depths."); - } - } - - private static ImageData WrapEndianness(ImageData imageData) - { - // Single-byte image does not require endianness reversal - if (imageData.BitDepth <= 8) - { - return imageData; - } - - // Bytes will be reordered by the compressor, so no wrapper is needed - if ((imageData is ZipPredict16Image) || (imageData is ZipPredict32Image)) - { - return imageData; - } - - return new EndianReverser(imageData); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.IO.Compression; +using PDNWrapper; + +namespace PhotoshopFile.Compression +{ + internal static class ImageDataFactory + { + /// + /// Creates an ImageData object to compress or decompress image data. + /// + /// The Channel associated with the image data. + /// The image data to be decompressed, or null if + /// image data is to be compressed. + public static ImageData Create(Channel channel, byte[] data) + { + var bitDepth = channel.Layer.PsdFile.BitDepth; + ImageData imageData; + switch (channel.ImageCompression) + { + case ImageCompression.Raw: + imageData = new RawImage(data, channel.Rect.Size, bitDepth); + break; + + case ImageCompression.Rle: + imageData = new RleImage(data, channel.RleRowLengths, + channel.Rect.Size, bitDepth); + break; + + case ImageCompression.Zip: + // Photoshop treats 32-bit Zip as 32-bit ZipPrediction + imageData = (bitDepth == 32) + ? CreateZipPredict(data, channel.Rect.Size, bitDepth) + : new ZipImage(data, channel.Rect.Size, bitDepth); + break; + + case ImageCompression.ZipPrediction: + imageData = CreateZipPredict(data, channel.Rect.Size, bitDepth); + break; + + default: + throw new PsdInvalidException("Unknown image compression method."); + } + + // Reverse endianness of multi-byte image data + imageData = WrapEndianness(imageData); + + return imageData; + } + + private static ImageData CreateZipPredict(byte[] data, Size size, + int bitDepth) + { + switch (bitDepth) + { + case 16: + return new ZipPredict16Image(data, size); + case 32: + return new ZipPredict32Image(data, size); + default: + throw new PsdInvalidException( + "ZIP with prediction is only available for 16 and 32 bit depths."); + } + } + + private static ImageData WrapEndianness(ImageData imageData) + { + // Single-byte image does not require endianness reversal + if (imageData.BitDepth <= 8) + { + return imageData; + } + + // Bytes will be reordered by the compressor, so no wrapper is needed + if ((imageData is ZipPredict16Image) || (imageData is ZipPredict32Image)) + { + return imageData; + } + + return new EndianReverser(imageData); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs.meta index c05ad0f..67988a5 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/ImageDataFactory.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 3a37c02e17e67be44b01952ad661991c -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3a37c02e17e67be44b01952ad661991c +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs b/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs index 7c1e763..4c4ddb3 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs @@ -1,44 +1,44 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; - -namespace PhotoshopFile.Compression -{ - internal class RawImage : ImageData - { - private byte[] data; - - protected override bool AltersWrittenData - { - get { return false; } - } - - public RawImage(byte[] data, Size size, int bitDepth) - : base(size, bitDepth) - { - this.data = data; - } - - internal override void Read(byte[] buffer) - { - Array.Copy(data, buffer, data.Length); - } - - public override byte[] ReadCompressed() - { - return data; - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; + +namespace PhotoshopFile.Compression +{ + internal class RawImage : ImageData + { + private byte[] data; + + protected override bool AltersWrittenData + { + get { return false; } + } + + public RawImage(byte[] data, Size size, int bitDepth) + : base(size, bitDepth) + { + this.data = data; + } + + internal override void Read(byte[] buffer) + { + Array.Copy(data, buffer, data.Length); + } + + public override byte[] ReadCompressed() + { + return data; + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs.meta index ece1327..c8ad3bd 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/RawImage.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: b976ddccf1109574c922e1aa8cdd48fb -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: b976ddccf1109574c922e1aa8cdd48fb +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs b/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs index c255005..35ed8f7 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs @@ -1,61 +1,61 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is ptortorovided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; -using PDNWrapper; -using System.IO; -using System.Linq; - -namespace PhotoshopFile.Compression -{ - internal class RleImage : ImageData - { - private byte[] rleData; - private RleRowLengths rleRowLengths; - - protected override bool AltersWrittenData - { - get { return false; } - } - - public RleImage(byte[] rleData, RleRowLengths rleRowLengths, - Size size, int bitDepth) - : base(size, bitDepth) - { - this.rleData = rleData; - this.rleRowLengths = rleRowLengths; - } - - internal override void Read(byte[] buffer) - { - var rleStream = new MemoryStream(rleData); - var rleReader = new RleReader(rleStream); - var bufferIndex = 0; - for (int i = 0; i < Size.Height; i++) - { - var bytesRead = rleReader.Read(buffer, bufferIndex, BytesPerRow); - if (bytesRead != BytesPerRow) - { - throw new Exception("RLE row decompressed to unexpected length."); - } - bufferIndex += bytesRead; - } - } - - public override byte[] ReadCompressed() - { - return rleData; - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is ptortorovided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; +using PDNWrapper; +using System.IO; +using System.Linq; + +namespace PhotoshopFile.Compression +{ + internal class RleImage : ImageData + { + private byte[] rleData; + private RleRowLengths rleRowLengths; + + protected override bool AltersWrittenData + { + get { return false; } + } + + public RleImage(byte[] rleData, RleRowLengths rleRowLengths, + Size size, int bitDepth) + : base(size, bitDepth) + { + this.rleData = rleData; + this.rleRowLengths = rleRowLengths; + } + + internal override void Read(byte[] buffer) + { + var rleStream = new MemoryStream(rleData); + var rleReader = new RleReader(rleStream); + var bufferIndex = 0; + for (int i = 0; i < Size.Height; i++) + { + var bytesRead = rleReader.Read(buffer, bufferIndex, BytesPerRow); + if (bytesRead != BytesPerRow) + { + throw new Exception("RLE row decompressed to unexpected length."); + } + bufferIndex += bytesRead; + } + } + + public override byte[] ReadCompressed() + { + return rleData; + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs.meta index 128ec65..d63feae 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/RleImage.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 66819b54b3c858446a1518b135b6514b -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 66819b54b3c858446a1518b135b6514b +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs b/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs index 3a6cae6..1a526f6 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs @@ -1,101 +1,101 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; -using System.IO; -using System.IO.Compression; - -namespace PhotoshopFile.Compression -{ - internal class ZipImage : ImageData - { - private MemoryStream zipDataStream; - private DeflateStream zipStream; - - protected override bool AltersWrittenData - { - get { return false; } - } - - public ZipImage(byte[] data, Size size, int bitDepth) - : base(size, bitDepth) - { - if (data == null) - { - InitCompress(); - } - else - { - InitDecompress(data); - } - } - - private void InitCompress() - { - zipDataStream = new MemoryStream(); - - // Write 2-byte zlib (RFC 1950) header - // - // CMF Compression Method and flags: - // CM 0:3 = 8 = deflate - // CINFO 4:7 = 4 = undefined, RFC 1950 only defines CINFO = 8 - // - // FLG Flags: - // FCHECK 0:4 = 9 = check bits for CMF and FLG - // FDICT 5 = 0 = no preset dictionary - // FLEVEL 6:7 = 2 = default compression level - - zipDataStream.WriteByte(0x48); - zipDataStream.WriteByte(0x89); - zipStream = new DeflateStream(zipDataStream, CompressionMode.Compress, - true); - } - - private void InitDecompress(byte[] data) - { - zipDataStream = new MemoryStream(data); - - // .NET implements Deflate (RFC 1951) but not zlib (RFC 1950), - // so we have to skip the first two bytes. - zipDataStream.ReadByte(); - zipDataStream.ReadByte(); - zipStream = new DeflateStream(zipDataStream, CompressionMode.Decompress, - true); - } - - internal override void Read(byte[] buffer) - { - var bytesToRead = (long)Size.Height * BytesPerRow; - Util.CheckByteArrayLength(bytesToRead); - - var bytesRead = zipStream.Read(buffer, 0, (int)bytesToRead); - if (bytesRead != bytesToRead) - { - throw new Exception("ZIP stream was not fully decompressed."); - } - } - - public override byte[] ReadCompressed() - { - // Write out the last block. (Flush leaves the last block open.) - zipStream.Close(); - - // Do not write the zlib header when the image data is empty - var result = (zipDataStream.Length == 2) - ? new byte[0] - : zipDataStream.ToArray(); - return result; - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; +using System.IO; +using System.IO.Compression; + +namespace PhotoshopFile.Compression +{ + internal class ZipImage : ImageData + { + private MemoryStream zipDataStream; + private DeflateStream zipStream; + + protected override bool AltersWrittenData + { + get { return false; } + } + + public ZipImage(byte[] data, Size size, int bitDepth) + : base(size, bitDepth) + { + if (data == null) + { + InitCompress(); + } + else + { + InitDecompress(data); + } + } + + private void InitCompress() + { + zipDataStream = new MemoryStream(); + + // Write 2-byte zlib (RFC 1950) header + // + // CMF Compression Method and flags: + // CM 0:3 = 8 = deflate + // CINFO 4:7 = 4 = undefined, RFC 1950 only defines CINFO = 8 + // + // FLG Flags: + // FCHECK 0:4 = 9 = check bits for CMF and FLG + // FDICT 5 = 0 = no preset dictionary + // FLEVEL 6:7 = 2 = default compression level + + zipDataStream.WriteByte(0x48); + zipDataStream.WriteByte(0x89); + zipStream = new DeflateStream(zipDataStream, CompressionMode.Compress, + true); + } + + private void InitDecompress(byte[] data) + { + zipDataStream = new MemoryStream(data); + + // .NET implements Deflate (RFC 1951) but not zlib (RFC 1950), + // so we have to skip the first two bytes. + zipDataStream.ReadByte(); + zipDataStream.ReadByte(); + zipStream = new DeflateStream(zipDataStream, CompressionMode.Decompress, + true); + } + + internal override void Read(byte[] buffer) + { + var bytesToRead = (long)Size.Height * BytesPerRow; + Util.CheckByteArrayLength(bytesToRead); + + var bytesRead = zipStream.Read(buffer, 0, (int)bytesToRead); + if (bytesRead != bytesToRead) + { + throw new Exception("ZIP stream was not fully decompressed."); + } + } + + public override byte[] ReadCompressed() + { + // Write out the last block. (Flush leaves the last block open.) + zipStream.Close(); + + // Do not write the zlib header when the image data is empty + var result = (zipDataStream.Length == 2) + ? new byte[0] + : zipDataStream.ToArray(); + return result; + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs.meta index 88523db..3381e49 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipImage.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 87da90d1a63b1174cb56810e4d9f769e -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 87da90d1a63b1174cb56810e4d9f769e +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs index d585676..591a3fd 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs @@ -1,113 +1,113 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; -using System.IO.Compression; - -namespace PhotoshopFile.Compression -{ - internal class ZipPredict16Image : ImageData - { - private ImageData zipImage; - - protected override bool AltersWrittenData - { - get { return true; } - } - - public ZipPredict16Image(byte[] zipData, Size size) - : base(size, 16) - { - // 16-bitdepth images are delta-encoded word-by-word. The deltas - // are thus big-endian and must be reversed for further processing. - var zipRawImage = new ZipImage(zipData, size, 16); - zipImage = new EndianReverser(zipRawImage); - } - - internal override void Read(byte[] buffer) - { - if (buffer.Length == 0) - { - return; - } - - zipImage.Read(buffer); - - { - { - Unpredict(buffer); - } - } - } - - public override byte[] ReadCompressed() - { - return zipImage.ReadCompressed(); - } - - private void Predict(/*UInt16**/ byte[] ptrData) - { - int size = sizeof(UInt16); - // Delta-encode each row - for (int i = 0; i < Size.Height; i++) - { - int rowOffset = Size.Width * i * size; - //UInt16* ptrDataRow = ptrData; - var ptrDataRowEnd = Size.Width - 1; - - // Start with the last column in the row - while (ptrDataRowEnd > 0) - { - var v = BitConverter.ToUInt16(ptrData, ptrDataRowEnd * size + rowOffset); - var v1 = BitConverter.ToUInt16(ptrData, (ptrDataRowEnd - 1) * size + rowOffset); - v -= v1; - var b = BitConverter.GetBytes(v); - for (int c = 0; c < b.Length; ++c) - { - ptrData[ptrDataRowEnd * size + rowOffset + c] = b[c]; - } - ptrDataRowEnd--; - } - } - } - - /// - /// Unpredicts the decompressed, native-endian image data. - /// - private void Unpredict(byte[] ptrData) - { - int size = sizeof(UInt16); - // Delta-decode each row - for (int i = 0; i < Size.Height; i++) - { - //UInt16* ptrDataRowEnd = ptrData + Size.Width; - int rowOffset = Size.Width * i * size; - // Start with column index 1 on each row - int start = 1; - while (start < Size.Width) - { - var v = BitConverter.ToUInt16(ptrData, start * size + rowOffset); - var v1 = BitConverter.ToUInt16(ptrData, (start - 1) * size + rowOffset); - v += v1; - var b = BitConverter.GetBytes(v); - for (int c = 0; c < b.Length; ++c) - { - ptrData[start * size + rowOffset + c] = b[c]; - } - start++; - } - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; +using System.IO.Compression; + +namespace PhotoshopFile.Compression +{ + internal class ZipPredict16Image : ImageData + { + private ImageData zipImage; + + protected override bool AltersWrittenData + { + get { return true; } + } + + public ZipPredict16Image(byte[] zipData, Size size) + : base(size, 16) + { + // 16-bitdepth images are delta-encoded word-by-word. The deltas + // are thus big-endian and must be reversed for further processing. + var zipRawImage = new ZipImage(zipData, size, 16); + zipImage = new EndianReverser(zipRawImage); + } + + internal override void Read(byte[] buffer) + { + if (buffer.Length == 0) + { + return; + } + + zipImage.Read(buffer); + + { + { + Unpredict(buffer); + } + } + } + + public override byte[] ReadCompressed() + { + return zipImage.ReadCompressed(); + } + + private void Predict(/*UInt16**/ byte[] ptrData) + { + int size = sizeof(UInt16); + // Delta-encode each row + for (int i = 0; i < Size.Height; i++) + { + int rowOffset = Size.Width * i * size; + //UInt16* ptrDataRow = ptrData; + var ptrDataRowEnd = Size.Width - 1; + + // Start with the last column in the row + while (ptrDataRowEnd > 0) + { + var v = BitConverter.ToUInt16(ptrData, ptrDataRowEnd * size + rowOffset); + var v1 = BitConverter.ToUInt16(ptrData, (ptrDataRowEnd - 1) * size + rowOffset); + v -= v1; + var b = BitConverter.GetBytes(v); + for (int c = 0; c < b.Length; ++c) + { + ptrData[ptrDataRowEnd * size + rowOffset + c] = b[c]; + } + ptrDataRowEnd--; + } + } + } + + /// + /// Unpredicts the decompressed, native-endian image data. + /// + private void Unpredict(byte[] ptrData) + { + int size = sizeof(UInt16); + // Delta-decode each row + for (int i = 0; i < Size.Height; i++) + { + //UInt16* ptrDataRowEnd = ptrData + Size.Width; + int rowOffset = Size.Width * i * size; + // Start with column index 1 on each row + int start = 1; + while (start < Size.Width) + { + var v = BitConverter.ToUInt16(ptrData, start * size + rowOffset); + var v1 = BitConverter.ToUInt16(ptrData, (start - 1) * size + rowOffset); + v += v1; + var b = BitConverter.GetBytes(v); + for (int c = 0; c < b.Length; ++c) + { + ptrData[start * size + rowOffset + c] = b[c]; + } + start++; + } + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs.meta index 823cfcb..e930d0a 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict16Image.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 6259913e8d526e447bf2ff536882fa6c -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 6259913e8d526e447bf2ff536882fa6c +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs index 1e248dd..f9f142f 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs @@ -1,175 +1,175 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; - -namespace PhotoshopFile.Compression -{ - internal class ZipPredict32Image : ImageData - { - private ZipImage zipImage; - - protected override bool AltersWrittenData - { - // Prediction will pack the data into a temporary buffer, so the - // original data will remain unchanged. - get { return false; } - } - - public ZipPredict32Image(byte[] zipData, Size size) - : base(size, 32) - { - zipImage = new ZipImage(zipData, size, 32); - } - - internal override void Read(byte[] buffer) - { - if (buffer.Length == 0) - { - return; - } - - var predictedData = new byte[buffer.Length]; - zipImage.Read(predictedData); - - - { - //fixed (byte* ptrData = &predictedData[0]) - //fixed (byte* ptrOutput = &buffer[0]) - { - Unpredict(predictedData, buffer); - } - } - } - - public override byte[] ReadCompressed() - { - return zipImage.ReadCompressed(); - } - - private void Predict(byte[] ptrData, byte[] ptrOutput /*Int32* ptrData, byte* ptrOutput*/) - { - int size = sizeof(Int32); - int inputIndex = 0; - int outputIndex = 0; - for (int i = 0; i < Size.Height; i++) - { - // Pack together the individual bytes of the 32-bit words, high-order - // bytes before low-order bytes. - int offset1 = Size.Width; - int offset2 = 2 * offset1; - int offset3 = 3 * offset1; - - //Int32* ptrDataRow = ptrData; - //Int32* ptrDataRowEnd = ptrDataRow + Size.Width; - int start = 0, end = Size.Width; - //while (ptrData < ptrDataRowEnd) - while (start < end) - { - Int32 data = BitConverter.ToInt32(ptrData, inputIndex); - ptrOutput[start + outputIndex] = (byte)(data >> 24); - ptrOutput[start + outputIndex + offset1] = (byte)(data >> 16); - ptrOutput[start + outputIndex + offset2] = (byte)(data >> 8); - ptrOutput[start + outputIndex + offset3] = (byte)(data); - - //ptrData++; - //ptrOutput++; - start++; - inputIndex += size; - } - - // Delta-encode the row - //byte* ptrOutputRow = ptrOutput; - //byte* ptrOutputRowEnd = ptrOutputRow + BytesPerRow; - - //ptrOutput = ptrOutputRowEnd - 1; - start = BytesPerRow - 1; - while (start > 0) - { - ptrOutput[start + outputIndex] -= ptrOutput[start + outputIndex - 1]; - start--; - } - outputIndex += BytesPerRow; - // Advance pointer to next row - //ptrOutput = ptrOutputRowEnd; - //Debug.Assert(ptrData == ptrDataRowEnd); - } - } - - /// - /// Unpredicts the raw decompressed image data into a 32-bpp bitmap with - /// native endianness. - /// - private void Unpredict(byte[] ptrData, byte[] ptrOutput /*byte* ptrData, Int32* ptrOutput*/) - { - int inputIndex = 0; - int outputIndex = 0; - for (int i = 0; i < Size.Height; i++) - { - //byte* ptrDataRow = ptrData; - //byte* ptrDataRowEnd = ptrDataRow + BytesPerRow; - - // Delta-decode each row - //ptrData++; - //while (ptrData < ptrDataRowEnd) - int startIndex = 1; - while (startIndex < BytesPerRow) - { - //*ptrData += *(ptrData - 1); - //ptrData++; - ptrData[inputIndex + startIndex] += ptrData[inputIndex + startIndex - 1]; - startIndex++; - } - - // Within each row, the individual bytes of the 32-bit words are - // packed together, high-order bytes before low-order bytes. - // We now unpack them into words. - int offset1 = Size.Width; - int offset2 = 2 * offset1; - int offset3 = 3 * offset1; - - //ptrData = ptrDataRow; - //Int32* ptrOutputRowEnd = ptrOutput + Size.Width; - //while (ptrOutput < ptrOutputRowEnd) - startIndex = 0; - while (startIndex < Size.Width) - { - Int32 pp = (Int32)ptrData[inputIndex + startIndex] << 24; - pp |= (Int32)ptrData[inputIndex + startIndex + offset1] << 16; - pp |= (Int32)ptrData[inputIndex + startIndex + offset2] << 8; - pp |= (Int32)ptrData[inputIndex + startIndex + offset3]; - byte[] rr = BitConverter.GetBytes(pp); - for (int k = 0; k < rr.Length; ++k) - { - ptrOutput[outputIndex] = rr[k]; - outputIndex++; - } - startIndex++; - //*ptrOutput = *(ptrData) << 24 - // | *(ptrData + offset1) << 16 - // | *(ptrData + offset2) << 8 - // | *(ptrData + offset3); - - //ptrData++; - //ptrOutput++; - } - - // Advance pointer to next row - //ptrData = ptrDataRowEnd; - //Debug.Assert(ptrOutput == ptrOutputRowEnd); - inputIndex += BytesPerRow; - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; + +namespace PhotoshopFile.Compression +{ + internal class ZipPredict32Image : ImageData + { + private ZipImage zipImage; + + protected override bool AltersWrittenData + { + // Prediction will pack the data into a temporary buffer, so the + // original data will remain unchanged. + get { return false; } + } + + public ZipPredict32Image(byte[] zipData, Size size) + : base(size, 32) + { + zipImage = new ZipImage(zipData, size, 32); + } + + internal override void Read(byte[] buffer) + { + if (buffer.Length == 0) + { + return; + } + + var predictedData = new byte[buffer.Length]; + zipImage.Read(predictedData); + + + { + //fixed (byte* ptrData = &predictedData[0]) + //fixed (byte* ptrOutput = &buffer[0]) + { + Unpredict(predictedData, buffer); + } + } + } + + public override byte[] ReadCompressed() + { + return zipImage.ReadCompressed(); + } + + private void Predict(byte[] ptrData, byte[] ptrOutput /*Int32* ptrData, byte* ptrOutput*/) + { + int size = sizeof(Int32); + int inputIndex = 0; + int outputIndex = 0; + for (int i = 0; i < Size.Height; i++) + { + // Pack together the individual bytes of the 32-bit words, high-order + // bytes before low-order bytes. + int offset1 = Size.Width; + int offset2 = 2 * offset1; + int offset3 = 3 * offset1; + + //Int32* ptrDataRow = ptrData; + //Int32* ptrDataRowEnd = ptrDataRow + Size.Width; + int start = 0, end = Size.Width; + //while (ptrData < ptrDataRowEnd) + while (start < end) + { + Int32 data = BitConverter.ToInt32(ptrData, inputIndex); + ptrOutput[start + outputIndex] = (byte)(data >> 24); + ptrOutput[start + outputIndex + offset1] = (byte)(data >> 16); + ptrOutput[start + outputIndex + offset2] = (byte)(data >> 8); + ptrOutput[start + outputIndex + offset3] = (byte)(data); + + //ptrData++; + //ptrOutput++; + start++; + inputIndex += size; + } + + // Delta-encode the row + //byte* ptrOutputRow = ptrOutput; + //byte* ptrOutputRowEnd = ptrOutputRow + BytesPerRow; + + //ptrOutput = ptrOutputRowEnd - 1; + start = BytesPerRow - 1; + while (start > 0) + { + ptrOutput[start + outputIndex] -= ptrOutput[start + outputIndex - 1]; + start--; + } + outputIndex += BytesPerRow; + // Advance pointer to next row + //ptrOutput = ptrOutputRowEnd; + //Debug.Assert(ptrData == ptrDataRowEnd); + } + } + + /// + /// Unpredicts the raw decompressed image data into a 32-bpp bitmap with + /// native endianness. + /// + private void Unpredict(byte[] ptrData, byte[] ptrOutput /*byte* ptrData, Int32* ptrOutput*/) + { + int inputIndex = 0; + int outputIndex = 0; + for (int i = 0; i < Size.Height; i++) + { + //byte* ptrDataRow = ptrData; + //byte* ptrDataRowEnd = ptrDataRow + BytesPerRow; + + // Delta-decode each row + //ptrData++; + //while (ptrData < ptrDataRowEnd) + int startIndex = 1; + while (startIndex < BytesPerRow) + { + //*ptrData += *(ptrData - 1); + //ptrData++; + ptrData[inputIndex + startIndex] += ptrData[inputIndex + startIndex - 1]; + startIndex++; + } + + // Within each row, the individual bytes of the 32-bit words are + // packed together, high-order bytes before low-order bytes. + // We now unpack them into words. + int offset1 = Size.Width; + int offset2 = 2 * offset1; + int offset3 = 3 * offset1; + + //ptrData = ptrDataRow; + //Int32* ptrOutputRowEnd = ptrOutput + Size.Width; + //while (ptrOutput < ptrOutputRowEnd) + startIndex = 0; + while (startIndex < Size.Width) + { + Int32 pp = (Int32)ptrData[inputIndex + startIndex] << 24; + pp |= (Int32)ptrData[inputIndex + startIndex + offset1] << 16; + pp |= (Int32)ptrData[inputIndex + startIndex + offset2] << 8; + pp |= (Int32)ptrData[inputIndex + startIndex + offset3]; + byte[] rr = BitConverter.GetBytes(pp); + for (int k = 0; k < rr.Length; ++k) + { + ptrOutput[outputIndex] = rr[k]; + outputIndex++; + } + startIndex++; + //*ptrOutput = *(ptrData) << 24 + // | *(ptrData + offset1) << 16 + // | *(ptrData + offset2) << 8 + // | *(ptrData + offset3); + + //ptrData++; + //ptrOutput++; + } + + // Advance pointer to next row + //ptrData = ptrDataRowEnd; + //Debug.Assert(ptrOutput == ptrOutputRowEnd); + inputIndex += BytesPerRow; + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs.meta b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs.meta index c824185..4212af7 100644 --- a/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Compression/ZipPredict32Image.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 2bb49ac2cee975745af2d48523e135c9 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2bb49ac2cee975745af2d48523e135c9 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Exceptions.cs b/Editor/PSDPlugin/PsdFile/Exceptions.cs index 3bce07d..538d234 100644 --- a/Editor/PSDPlugin/PsdFile/Exceptions.cs +++ b/Editor/PSDPlugin/PsdFile/Exceptions.cs @@ -1,43 +1,43 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is perovided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2012 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using PDNWrapper; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - [Serializable] - internal class PsdInvalidException : Exception - { - public PsdInvalidException() - { - } - - public PsdInvalidException(string message) - : base(message) - { - } - } - - [Serializable] - internal class RleException : Exception - { - public RleException() {} - - public RleException(string message) : base(message) {} - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is perovided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2012 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using PDNWrapper; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + [Serializable] + internal class PsdInvalidException : Exception + { + public PsdInvalidException() + { + } + + public PsdInvalidException(string message) + : base(message) + { + } + } + + [Serializable] + internal class RleException : Exception + { + public RleException() {} + + public RleException(string message) : base(message) {} + } +} diff --git a/Editor/PSDPlugin/PsdFile/Exceptions.cs.meta b/Editor/PSDPlugin/PsdFile/Exceptions.cs.meta index c0444bb..5ca1b9b 100644 --- a/Editor/PSDPlugin/PsdFile/Exceptions.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Exceptions.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 1359900d9d213c641b1d44f49de5281d -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 1359900d9d213c641b1d44f49de5281d +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResource.cs b/Editor/PSDPlugin/PsdFile/ImageResource.cs index 8b7d321..bc57e35 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResource.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResource.cs @@ -1,234 +1,234 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2015 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace PhotoshopFile -{ - internal enum ResourceID - { - Undefined = 0, - MacPrintInfo = 1001, - ResolutionInfo = 1005, - AlphaChannelNames = 1006, - DisplayInfo = 1007, - Caption = 1008, - BorderInfo = 1009, - BackgroundColor = 1010, - PrintFlags = 1011, - MultichannelHalftoneInfo = 1012, - ColorHalftoneInfo = 1013, - DuotoneHalftoneInfo = 1014, - MultichannelTransferFunctions = 1015, - ColorTransferFunctions = 1016, - DuotoneTransferFunctions = 1017, - DuotoneImageInfo = 1018, - BlackWhiteRange = 1019, - EpsOptions = 1021, - QuickMaskInfo = 1022, - LayerStateInfo = 1024, - WorkingPathUnsaved = 1025, - LayersGroupInfo = 1026, - IptcNaa = 1028, - RawFormatImageMode = 1029, - JpegQuality = 1030, - GridGuidesInfo = 1032, - ThumbnailBgr = 1033, - CopyrightInfo = 1034, - Url = 1035, - ThumbnailRgb = 1036, - GlobalAngle = 1037, - ColorSamplersObsolete = 1038, - IccProfile = 1039, - Watermark = 1040, - IccUntagged = 1041, - EffectsVisible = 1042, - SpotHalftone = 1043, - DocumentSpecific = 1044, - UnicodeAlphaNames = 1045, - IndexedColorTableCount = 1046, - TransparentIndex = 1047, - GlobalAltitude = 1049, - Slices = 1050, - WorkflowUrl = 1051, - JumpToXpep = 1052, - AlphaIdentifiers = 1053, - UrlList = 1054, - VersionInfo = 1057, - ExifData1 = 1058, - ExifData3 = 1059, - XmpMetadata = 1060, - CaptionDigest = 1061, - PrintScale = 1062, - PixelAspectRatio = 1064, - LayerComps = 1065, - AlternateDuotoneColors = 1066, - AlternateSpotColors = 1067, - LayerSelectionIDs = 1069, - HdrToningInfo = 1070, - PrintInfo = 1071, - LayerGroupsEnabled = 1072, - ColorSamplers = 1073, - MeasurementScale = 1074, - TimelineInfo = 1075, - SheetDisclosure = 1076, - FloatDisplayInfo = 1077, - OnionSkins = 1078, - CountInfo = 1080, - PrintSettingsInfo = 1082, - PrintStyle = 1083, - MacNSPrintInfo = 1084, - WinDevMode = 1085, - AutoSaveFilePath = 1086, - AutoSaveFormat = 1087, - PathInfo = 2000, // 2000-2999: Path Information - ClippingPathName = 2999, - LightroomWorkflow = 8000, - PrintFlagsInfo = 10000 - } - - /// - /// Abstract class for Image Resources - /// - internal abstract class ImageResource - { - private string signature; - public string Signature - { - get { return signature; } - set - { - if (value.Length != 4) - { - throw new ArgumentException( - "Signature must be 4 characters in length."); - } - signature = value; - } - } - - public string Name { get; set; } - - public abstract ResourceID ID { get; } - - protected ImageResource(string name) - { - Signature = "8BIM"; - Name = name; - } - } - - /// - /// Creates the appropriate subclass of ImageResource. - /// - internal static class ImageResourceFactory - { - public static ImageResource CreateImageResource(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, ImageResource"); - - var signature = reader.ReadAsciiChars(4); - var resourceIdInt = reader.ReadUInt16(); - var name = reader.ReadPascalString(2); - var dataLength = (int)reader.ReadUInt32(); - - var dataPaddedLength = Util.RoundUp(dataLength, 2); - var endPosition = reader.BaseStream.Position + dataPaddedLength; - - ImageResource resource = null; - var resourceId = (ResourceID)resourceIdInt; - switch (resourceId) - { - case ResourceID.ResolutionInfo: - resource = new ResolutionInfo(reader, name); - break; - case ResourceID.ThumbnailRgb: - case ResourceID.ThumbnailBgr: - resource = new Thumbnail(reader, resourceId, name, dataLength); - break; - case ResourceID.AlphaChannelNames: - resource = new AlphaChannelNames(reader, name, dataLength); - break; - case ResourceID.UnicodeAlphaNames: - resource = new UnicodeAlphaNames(reader, name, dataLength); - break; - case ResourceID.VersionInfo: - resource = new VersionInfo(reader, name); - break; - default: - resource = new RawImageResource(reader, signature, resourceId, name, dataLength); - break; - } - - Util.DebugMessage(reader.BaseStream, "Load, End, ImageResource, {0}", - resourceId); - - // Reposition the reader if we do not consume the full resource block. - // This takes care of the even-padding, and also preserves forward- - // compatibility in case a resource block is later extended with - // additional properties. - if (reader.BaseStream.Position < endPosition) - reader.BaseStream.Position = endPosition; - - // However, overruns are definitely an error. - if (reader.BaseStream.Position > endPosition) - throw new PsdInvalidException("Corruption detected in resource."); - - return resource; - } - } - - internal class ImageResources : List - { - public ImageResources() : base() - { - } - - public ImageResource Get(ResourceID id) - { - return Find(x => x.ID == id); - } - - public void Set(ImageResource resource) - { - Predicate matchId = delegate(ImageResource res) - { - return res.ID == resource.ID; - }; - var itemIdx = this.FindIndex(matchId); - var lastItemIdx = this.FindLastIndex(matchId); - - if (itemIdx == -1) - { - Add(resource); - } - else if (itemIdx != lastItemIdx) - { - RemoveAll(matchId); - Insert(itemIdx, resource); - } - else - { - this[itemIdx] = resource; - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2015 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; + +namespace PhotoshopFile +{ + internal enum ResourceID + { + Undefined = 0, + MacPrintInfo = 1001, + ResolutionInfo = 1005, + AlphaChannelNames = 1006, + DisplayInfo = 1007, + Caption = 1008, + BorderInfo = 1009, + BackgroundColor = 1010, + PrintFlags = 1011, + MultichannelHalftoneInfo = 1012, + ColorHalftoneInfo = 1013, + DuotoneHalftoneInfo = 1014, + MultichannelTransferFunctions = 1015, + ColorTransferFunctions = 1016, + DuotoneTransferFunctions = 1017, + DuotoneImageInfo = 1018, + BlackWhiteRange = 1019, + EpsOptions = 1021, + QuickMaskInfo = 1022, + LayerStateInfo = 1024, + WorkingPathUnsaved = 1025, + LayersGroupInfo = 1026, + IptcNaa = 1028, + RawFormatImageMode = 1029, + JpegQuality = 1030, + GridGuidesInfo = 1032, + ThumbnailBgr = 1033, + CopyrightInfo = 1034, + Url = 1035, + ThumbnailRgb = 1036, + GlobalAngle = 1037, + ColorSamplersObsolete = 1038, + IccProfile = 1039, + Watermark = 1040, + IccUntagged = 1041, + EffectsVisible = 1042, + SpotHalftone = 1043, + DocumentSpecific = 1044, + UnicodeAlphaNames = 1045, + IndexedColorTableCount = 1046, + TransparentIndex = 1047, + GlobalAltitude = 1049, + Slices = 1050, + WorkflowUrl = 1051, + JumpToXpep = 1052, + AlphaIdentifiers = 1053, + UrlList = 1054, + VersionInfo = 1057, + ExifData1 = 1058, + ExifData3 = 1059, + XmpMetadata = 1060, + CaptionDigest = 1061, + PrintScale = 1062, + PixelAspectRatio = 1064, + LayerComps = 1065, + AlternateDuotoneColors = 1066, + AlternateSpotColors = 1067, + LayerSelectionIDs = 1069, + HdrToningInfo = 1070, + PrintInfo = 1071, + LayerGroupsEnabled = 1072, + ColorSamplers = 1073, + MeasurementScale = 1074, + TimelineInfo = 1075, + SheetDisclosure = 1076, + FloatDisplayInfo = 1077, + OnionSkins = 1078, + CountInfo = 1080, + PrintSettingsInfo = 1082, + PrintStyle = 1083, + MacNSPrintInfo = 1084, + WinDevMode = 1085, + AutoSaveFilePath = 1086, + AutoSaveFormat = 1087, + PathInfo = 2000, // 2000-2999: Path Information + ClippingPathName = 2999, + LightroomWorkflow = 8000, + PrintFlagsInfo = 10000 + } + + /// + /// Abstract class for Image Resources + /// + internal abstract class ImageResource + { + private string signature; + public string Signature + { + get { return signature; } + set + { + if (value.Length != 4) + { + throw new ArgumentException( + "Signature must be 4 characters in length."); + } + signature = value; + } + } + + public string Name { get; set; } + + public abstract ResourceID ID { get; } + + protected ImageResource(string name) + { + Signature = "8BIM"; + Name = name; + } + } + + /// + /// Creates the appropriate subclass of ImageResource. + /// + internal static class ImageResourceFactory + { + public static ImageResource CreateImageResource(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, ImageResource"); + + var signature = reader.ReadAsciiChars(4); + var resourceIdInt = reader.ReadUInt16(); + var name = reader.ReadPascalString(2); + var dataLength = (int)reader.ReadUInt32(); + + var dataPaddedLength = Util.RoundUp(dataLength, 2); + var endPosition = reader.BaseStream.Position + dataPaddedLength; + + ImageResource resource = null; + var resourceId = (ResourceID)resourceIdInt; + switch (resourceId) + { + case ResourceID.ResolutionInfo: + resource = new ResolutionInfo(reader, name); + break; + case ResourceID.ThumbnailRgb: + case ResourceID.ThumbnailBgr: + resource = new Thumbnail(reader, resourceId, name, dataLength); + break; + case ResourceID.AlphaChannelNames: + resource = new AlphaChannelNames(reader, name, dataLength); + break; + case ResourceID.UnicodeAlphaNames: + resource = new UnicodeAlphaNames(reader, name, dataLength); + break; + case ResourceID.VersionInfo: + resource = new VersionInfo(reader, name); + break; + default: + resource = new RawImageResource(reader, signature, resourceId, name, dataLength); + break; + } + + Util.DebugMessage(reader.BaseStream, "Load, End, ImageResource, {0}", + resourceId); + + // Reposition the reader if we do not consume the full resource block. + // This takes care of the even-padding, and also preserves forward- + // compatibility in case a resource block is later extended with + // additional properties. + if (reader.BaseStream.Position < endPosition) + reader.BaseStream.Position = endPosition; + + // However, overruns are definitely an error. + if (reader.BaseStream.Position > endPosition) + throw new PsdInvalidException("Corruption detected in resource."); + + return resource; + } + } + + internal class ImageResources : List + { + public ImageResources() : base() + { + } + + public ImageResource Get(ResourceID id) + { + return Find(x => x.ID == id); + } + + public void Set(ImageResource resource) + { + Predicate matchId = delegate(ImageResource res) + { + return res.ID == resource.ID; + }; + var itemIdx = this.FindIndex(matchId); + var lastItemIdx = this.FindLastIndex(matchId); + + if (itemIdx == -1) + { + Add(resource); + } + else if (itemIdx != lastItemIdx) + { + RemoveAll(matchId); + Insert(itemIdx, resource); + } + else + { + this[itemIdx] = resource; + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResource.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResource.cs.meta index e6e38a4..bc65b62 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResource.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResource.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 4bdfc57c0f4c65947a6971d815bd7ea7 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4bdfc57c0f4c65947a6971d815bd7ea7 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources.meta b/Editor/PSDPlugin/PsdFile/ImageResources.meta index 8d4acf4..c49386b 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: f6b2d5715ac4ed8478b3819e8fe5918a -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: f6b2d5715ac4ed8478b3819e8fe5918a +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs b/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs index 964e5d6..d73a1e5 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs @@ -1,52 +1,52 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2013 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; - -namespace PhotoshopFile -{ - /// - /// The names of the alpha channels - /// - internal class AlphaChannelNames : ImageResource - { - public override ResourceID ID - { - get { return ResourceID.AlphaChannelNames; } - } - - private List channelNames = new List(); - public List ChannelNames - { - get { return channelNames; } - } - - public AlphaChannelNames() : base(String.Empty) - { - } - - public AlphaChannelNames(PsdBinaryReader reader, string name, int resourceDataLength) - : base(name) - { - var endPosition = reader.BaseStream.Position + resourceDataLength; - - // Alpha channel names are Pascal strings, with no padding in-between. - while (reader.BaseStream.Position < endPosition) - { - var channelName = reader.ReadPascalString(1); - ChannelNames.Add(channelName); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2013 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; + +namespace PhotoshopFile +{ + /// + /// The names of the alpha channels + /// + internal class AlphaChannelNames : ImageResource + { + public override ResourceID ID + { + get { return ResourceID.AlphaChannelNames; } + } + + private List channelNames = new List(); + public List ChannelNames + { + get { return channelNames; } + } + + public AlphaChannelNames() : base(String.Empty) + { + } + + public AlphaChannelNames(PsdBinaryReader reader, string name, int resourceDataLength) + : base(name) + { + var endPosition = reader.BaseStream.Position + resourceDataLength; + + // Alpha channel names are Pascal strings, with no padding in-between. + while (reader.BaseStream.Position < endPosition) + { + var channelName = reader.ReadPascalString(1); + ChannelNames.Add(channelName); + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs.meta index 7d3939e..ebc598c 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources/AlphaChannelNames.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 3e90381151086314691cd7a595ba9a62 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3e90381151086314691cd7a595ba9a62 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs b/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs index e7f646b..efe54e5 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs @@ -1,48 +1,48 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2013 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.IO; -using PDNWrapper; - -namespace PhotoshopFile -{ - /// - /// Stores the raw data for unimplemented image resource types. - /// - internal class RawImageResource : ImageResource - { - public byte[] Data { get; private set; } - - private ResourceID id; - public override ResourceID ID - { - get { return id; } - } - - public RawImageResource(ResourceID resourceId, string name) - : base(name) - { - this.id = resourceId; - } - - public RawImageResource(PsdBinaryReader reader, string signature, - ResourceID resourceId, string name, int numBytes) - : base(name) - { - this.Signature = signature; - this.id = resourceId; - Data = reader.ReadBytes(numBytes); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2013 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.IO; +using PDNWrapper; + +namespace PhotoshopFile +{ + /// + /// Stores the raw data for unimplemented image resource types. + /// + internal class RawImageResource : ImageResource + { + public byte[] Data { get; private set; } + + private ResourceID id; + public override ResourceID ID + { + get { return id; } + } + + public RawImageResource(ResourceID resourceId, string name) + : base(name) + { + this.id = resourceId; + } + + public RawImageResource(PsdBinaryReader reader, string signature, + ResourceID resourceId, string name, int numBytes) + : base(name) + { + this.Signature = signature; + this.id = resourceId; + Data = reader.ReadBytes(numBytes); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs.meta index 24f100e..fe8ef81 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources/RawImageResource.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 764df10adc2353a47a5ae0e9649e51a6 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 764df10adc2353a47a5ae0e9649e51a6 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs b/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs index 18de7b3..ce86574 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs @@ -1,94 +1,94 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2012 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; - -namespace PhotoshopFile -{ - /// - /// Summary description for ResolutionInfo. - /// - internal class ResolutionInfo : ImageResource - { - public override ResourceID ID - { - get { return ResourceID.ResolutionInfo; } - } - - /// - /// Horizontal DPI. - /// - public UFixed16_16 HDpi { get; set; } - - /// - /// Vertical DPI. - /// - public UFixed16_16 VDpi { get; set; } - - /// - /// 1 = pixels per inch, 2 = pixels per centimeter - /// - internal enum ResUnit - { - PxPerInch = 1, - PxPerCm = 2 - } - - /// - /// Display units for horizontal resolution. This only affects the - /// user interface; the resolution is still stored in the PSD file - /// as pixels/inch. - /// - public ResUnit HResDisplayUnit { get; set; } - - /// - /// Display units for vertical resolution. - /// - public ResUnit VResDisplayUnit { get; set; } - - /// - /// Physical units. - /// - internal enum Unit - { - Inches = 1, - Centimeters = 2, - Points = 3, - Picas = 4, - Columns = 5 - } - - public Unit WidthDisplayUnit { get; set; } - - public Unit HeightDisplayUnit { get; set; } - - public ResolutionInfo() : base(String.Empty) - { - } - - public ResolutionInfo(PsdBinaryReader reader, string name) - : base(name) - { - this.HDpi = new UFixed16_16(reader.ReadUInt32()); - this.HResDisplayUnit = (ResUnit)reader.ReadInt16(); - this.WidthDisplayUnit = (Unit)reader.ReadInt16(); - - this.VDpi = new UFixed16_16(reader.ReadUInt32()); - this.VResDisplayUnit = (ResUnit)reader.ReadInt16(); - this.HeightDisplayUnit = (Unit)reader.ReadInt16(); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2012 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; + +namespace PhotoshopFile +{ + /// + /// Summary description for ResolutionInfo. + /// + internal class ResolutionInfo : ImageResource + { + public override ResourceID ID + { + get { return ResourceID.ResolutionInfo; } + } + + /// + /// Horizontal DPI. + /// + public UFixed16_16 HDpi { get; set; } + + /// + /// Vertical DPI. + /// + public UFixed16_16 VDpi { get; set; } + + /// + /// 1 = pixels per inch, 2 = pixels per centimeter + /// + internal enum ResUnit + { + PxPerInch = 1, + PxPerCm = 2 + } + + /// + /// Display units for horizontal resolution. This only affects the + /// user interface; the resolution is still stored in the PSD file + /// as pixels/inch. + /// + public ResUnit HResDisplayUnit { get; set; } + + /// + /// Display units for vertical resolution. + /// + public ResUnit VResDisplayUnit { get; set; } + + /// + /// Physical units. + /// + internal enum Unit + { + Inches = 1, + Centimeters = 2, + Points = 3, + Picas = 4, + Columns = 5 + } + + public Unit WidthDisplayUnit { get; set; } + + public Unit HeightDisplayUnit { get; set; } + + public ResolutionInfo() : base(String.Empty) + { + } + + public ResolutionInfo(PsdBinaryReader reader, string name) + : base(name) + { + this.HDpi = new UFixed16_16(reader.ReadUInt32()); + this.HResDisplayUnit = (ResUnit)reader.ReadInt16(); + this.WidthDisplayUnit = (Unit)reader.ReadInt16(); + + this.VDpi = new UFixed16_16(reader.ReadUInt32()); + this.VResDisplayUnit = (ResUnit)reader.ReadInt16(); + this.HeightDisplayUnit = (Unit)reader.ReadInt16(); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs.meta index edf38bb..976a44e 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources/ResolutionInfo.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 285de09dadd2d3048a1028754eda2fa1 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 285de09dadd2d3048a1028754eda2fa1 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/Thumbnail.cs b/Editor/PSDPlugin/PsdFile/ImageResources/Thumbnail.cs index b5e875f..d17aafb 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/Thumbnail.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResources/Thumbnail.cs @@ -1,85 +1,85 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2013 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.IO; -using System.Diagnostics; -using PDNWrapper; -//using PDNWrapper.Imaging; - -namespace PhotoshopFile -{ - /// - /// Summary description for Thumbnail. - /// - internal class Thumbnail : RawImageResource - { - public Thumbnail(ResourceID id, string name) - : base(id, name) - { - } - - public Thumbnail(PsdBinaryReader psdReader, ResourceID id, string name, int numBytes) - : base(psdReader, "8BIM", id, name, numBytes) - { - using (var memoryStream = new MemoryStream(Data)) - using (var reader = new PsdBinaryReader(memoryStream, psdReader)) - { - const int HEADER_LENGTH = 28; - var format = reader.ReadUInt32(); - //var width = reader.ReadUInt32(); - //var height = reader.ReadUInt32(); - //var widthBytes = reader.ReadUInt32(); - //var size = reader.ReadUInt32(); - //var compressedSize = reader.ReadUInt32(); - //var bitPerPixel = reader.ReadUInt16(); - //var planes = reader.ReadUInt16(); - - // Raw RGB bitmap - if (format == 0) - { - //Image = new Bitmap((int)width, (int)height, PixelFormat.Format24bppRgb); - } - // JPEG bitmap - else if (format == 1) - { - byte[] imgData = reader.ReadBytes(numBytes - HEADER_LENGTH); - using (MemoryStream stream = new MemoryStream(imgData)) - { - //var bitmap = new Bitmap(stream); - //Image = (Bitmap)bitmap.Clone(); - } - - // Reverse BGR pixels from old thumbnail format - if (id == ResourceID.ThumbnailBgr) - { - //for(int y=0;y + /// Summary description for Thumbnail. + /// + internal class Thumbnail : RawImageResource + { + public Thumbnail(ResourceID id, string name) + : base(id, name) + { + } + + public Thumbnail(PsdBinaryReader psdReader, ResourceID id, string name, int numBytes) + : base(psdReader, "8BIM", id, name, numBytes) + { + using (var memoryStream = new MemoryStream(Data)) + using (var reader = new PsdBinaryReader(memoryStream, psdReader)) + { + const int HEADER_LENGTH = 28; + var format = reader.ReadUInt32(); + //var width = reader.ReadUInt32(); + //var height = reader.ReadUInt32(); + //var widthBytes = reader.ReadUInt32(); + //var size = reader.ReadUInt32(); + //var compressedSize = reader.ReadUInt32(); + //var bitPerPixel = reader.ReadUInt16(); + //var planes = reader.ReadUInt16(); + + // Raw RGB bitmap + if (format == 0) + { + //Image = new Bitmap((int)width, (int)height, PixelFormat.Format24bppRgb); + } + // JPEG bitmap + else if (format == 1) + { + byte[] imgData = reader.ReadBytes(numBytes - HEADER_LENGTH); + using (MemoryStream stream = new MemoryStream(imgData)) + { + //var bitmap = new Bitmap(stream); + //Image = (Bitmap)bitmap.Clone(); + } + + // Reverse BGR pixels from old thumbnail format + if (id == ResourceID.ThumbnailBgr) + { + //for(int y=0;y - /// The names of the alpha channels. - /// - internal class UnicodeAlphaNames : ImageResource - { - public override ResourceID ID - { - get { return ResourceID.UnicodeAlphaNames; } - } - - private List channelNames = new List(); - public List ChannelNames - { - get { return channelNames; } - } - - public UnicodeAlphaNames() - : base(String.Empty) - { - } - - public UnicodeAlphaNames(PsdBinaryReader reader, string name, int resourceDataLength) - : base(name) - { - var endPosition = reader.BaseStream.Position + resourceDataLength; - - while (reader.BaseStream.Position < endPosition) - { - var channelName = reader.ReadUnicodeString(); - - // Photoshop writes out a null terminator for Unicode alpha names. - // There is no null terminator on other Unicode strings in PSD files. - if (channelName.EndsWith("\0")) - { - channelName = channelName.Substring(0, channelName.Length - 1); - } - ChannelNames.Add(channelName); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; + +namespace PhotoshopFile +{ + /// + /// The names of the alpha channels. + /// + internal class UnicodeAlphaNames : ImageResource + { + public override ResourceID ID + { + get { return ResourceID.UnicodeAlphaNames; } + } + + private List channelNames = new List(); + public List ChannelNames + { + get { return channelNames; } + } + + public UnicodeAlphaNames() + : base(String.Empty) + { + } + + public UnicodeAlphaNames(PsdBinaryReader reader, string name, int resourceDataLength) + : base(name) + { + var endPosition = reader.BaseStream.Position + resourceDataLength; + + while (reader.BaseStream.Position < endPosition) + { + var channelName = reader.ReadUnicodeString(); + + // Photoshop writes out a null terminator for Unicode alpha names. + // There is no null terminator on other Unicode strings in PSD files. + if (channelName.EndsWith("\0")) + { + channelName = channelName.Substring(0, channelName.Length - 1); + } + ChannelNames.Add(channelName); + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/UnicodeAlphaNames.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResources/UnicodeAlphaNames.cs.meta index 08d54c5..a715a46 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/UnicodeAlphaNames.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources/UnicodeAlphaNames.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 8ba836b7a6b0c9a4a94c1d6c540b8962 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 8ba836b7a6b0c9a4a94c1d6c540b8962 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs b/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs index 78796d6..3e1e787 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs +++ b/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs @@ -1,53 +1,53 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2012 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - internal class VersionInfo : ImageResource - { - public override ResourceID ID - { - get { return ResourceID.VersionInfo; } - } - - public UInt32 Version { get; set; } - - public bool HasRealMergedData { get; set; } - - public string ReaderName { get; set; } - - public string WriterName { get; set; } - - public UInt32 FileVersion { get; set; } - - - public VersionInfo() : base(String.Empty) - { - } - - public VersionInfo(PsdBinaryReader reader, string name) - : base(name) - { - Version = reader.ReadUInt32(); - HasRealMergedData = reader.ReadBoolean(); - ReaderName = reader.ReadUnicodeString(); - WriterName = reader.ReadUnicodeString(); - FileVersion = reader.ReadUInt32(); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2012 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + internal class VersionInfo : ImageResource + { + public override ResourceID ID + { + get { return ResourceID.VersionInfo; } + } + + public UInt32 Version { get; set; } + + public bool HasRealMergedData { get; set; } + + public string ReaderName { get; set; } + + public string WriterName { get; set; } + + public UInt32 FileVersion { get; set; } + + + public VersionInfo() : base(String.Empty) + { + } + + public VersionInfo(PsdBinaryReader reader, string name) + : base(name) + { + Version = reader.ReadUInt32(); + HasRealMergedData = reader.ReadBoolean(); + ReaderName = reader.ReadUnicodeString(); + WriterName = reader.ReadUnicodeString(); + FileVersion = reader.ReadUInt32(); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs.meta b/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs.meta index 3a2e7d1..23105d0 100644 --- a/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs.meta +++ b/Editor/PSDPlugin/PsdFile/ImageResources/VersionInfo.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 948f26d9a8b009540b6574d5b592248d -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 948f26d9a8b009540b6574d5b592248d +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers.meta b/Editor/PSDPlugin/PsdFile/Layers.meta index 3681cfd..eb3f3a3 100644 --- a/Editor/PSDPlugin/PsdFile/Layers.meta +++ b/Editor/PSDPlugin/PsdFile/Layers.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: a2b81847c6b672747861b07e47320717 -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: a2b81847c6b672747861b07e47320717 +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs b/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs index bfc784d..c62dc86 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs @@ -1,56 +1,56 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; -using System.Globalization; - -namespace PhotoshopFile -{ - internal class BlendingRanges - { - /// - /// The layer to which this channel belongs - /// - public Layer Layer { get; private set; } - - public byte[] Data { get; set; } - - /////////////////////////////////////////////////////////////////////////// - - public BlendingRanges(Layer layer) - { - Layer = layer; - Data = new byte[0]; - } - - /////////////////////////////////////////////////////////////////////////// - - public BlendingRanges(PsdBinaryReader reader, Layer layer) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, BlendingRanges"); - - Layer = layer; - var dataLength = reader.ReadInt32(); - if (dataLength <= 0) - return; - - Data = reader.ReadBytes(dataLength); - - Util.DebugMessage(reader.BaseStream, "Load, End, BlendingRanges"); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; +using System.Globalization; + +namespace PhotoshopFile +{ + internal class BlendingRanges + { + /// + /// The layer to which this channel belongs + /// + public Layer Layer { get; private set; } + + public byte[] Data { get; set; } + + /////////////////////////////////////////////////////////////////////////// + + public BlendingRanges(Layer layer) + { + Layer = layer; + Data = new byte[0]; + } + + /////////////////////////////////////////////////////////////////////////// + + public BlendingRanges(PsdBinaryReader reader, Layer layer) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, BlendingRanges"); + + Layer = layer; + var dataLength = reader.ReadInt32(); + if (dataLength <= 0) + return; + + Data = reader.ReadBytes(dataLength); + + Util.DebugMessage(reader.BaseStream, "Load, End, BlendingRanges"); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs.meta index 52d120b..af10960 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/BlendingRanges.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 9f4a47927e764174fa3984b07f9d4b58 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9f4a47927e764174fa3984b07f9d4b58 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/Channel.cs b/Editor/PSDPlugin/PsdFile/Layers/Channel.cs index f35a350..0e49d48 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Channel.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/Channel.cs @@ -1,232 +1,232 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using PDNWrapper; -using System.Linq; -using Unity.Collections; -using PhotoshopFile.Compression; - -namespace PhotoshopFile -{ - internal class ChannelList : List - { - /// - /// Returns channels with nonnegative IDs as an array, so that accessing - /// a channel by Id can be optimized into pointer arithmetic rather than - /// being implemented as a List scan. - /// - /// - /// This optimization is crucial for blitting lots of pixels back and - /// forth between Photoshop's per-channel representation, and Paint.NET's - /// per-pixel BGRA representation. - /// - public Channel[] ToIdArray() - { - var maxId = this.Max(x => x.ID); - var idArray = new Channel[maxId + 1]; - foreach (var channel in this) - { - if (channel.ID >= 0) - idArray[channel.ID] = channel; - } - return idArray; - } - - public ChannelList() - : base() - { - } - - public Channel GetId(int id) - { - return this.Single(x => x.ID == id); - } - - public bool ContainsId(int id) - { - return this.Exists(x => x.ID == id); - } - } - - /////////////////////////////////////////////////////////////////////////// - - [DebuggerDisplay("ID = {ID}")] - internal class Channel - { - /// - /// The layer to which this channel belongs - /// - public Layer Layer { get; private set; } - - /// - /// Channel ID. - /// - /// -1 = transparency mask - /// -2 = user-supplied layer mask, or vector mask - /// -3 = user-supplied layer mask, if channel -2 contains a vector mask - /// - /// Nonnegative channel IDs give the actual image channels, in the - /// order defined by the colormode. For example, 0, 1, 2 = R, G, B. - /// - /// - /// - public short ID { get; set; } - - public Rectangle Rect - { - get - { - switch (ID) - { - case -2: - return Layer.Masks.LayerMask.Rect; - case -3: - return Layer.Masks.UserMask.Rect; - default: - return Layer.Rect; - } - } - } - - /// - /// Total length of the channel data, including compression headers. - /// - public long Length { get; set; } - - /// - /// Raw image data for this color channel, in compressed on-disk format. - /// - /// - /// If null, the ImageData will be automatically compressed during save. - /// - public byte[] ImageDataRaw { get; set; } - - /// - /// Decompressed image data for this color channel. - /// - /// - /// When making changes to the ImageData, set ImageDataRaw to null so that - /// the correct data will be compressed during save. - /// - public NativeArray ImageData { get; set; } - - /// - /// Image compression method used. - /// - public ImageCompression ImageCompression { get; set; } - - /// - /// RLE-compressed length of each row. - /// - public RleRowLengths RleRowLengths { get; set; } - - ////////////////////////////////////////////////////////////////// - - internal Channel(short id, Layer layer) - { - ID = id; - Layer = layer; - } - - internal Channel(PsdBinaryReader reader, Layer layer) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel"); - - ID = reader.ReadInt16(); - Length = (layer.PsdFile.IsLargeDocument) - ? reader.ReadInt64() - : reader.ReadInt32(); - Layer = layer; - - Util.DebugMessage(reader.BaseStream, "Load, End, Channel, {0}", ID); - } - - internal void Cleanup() - { - if (ImageData.IsCreated) - ImageData.Dispose(); - } - ////////////////////////////////////////////////////////////////// - - internal void LoadPixelData(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image"); - - if (Length == 0) - { - ImageCompression = ImageCompression.Raw; - ImageDataRaw = new byte[0]; - return; - } - - var endPosition = reader.BaseStream.Position + this.Length; - ImageCompression = (ImageCompression)reader.ReadInt16(); - var longDataLength = this.Length - 2; - Util.CheckByteArrayLength(longDataLength); - var dataLength = (int)longDataLength; - - switch (ImageCompression) - { - case ImageCompression.Raw: - ImageDataRaw = reader.ReadBytes(dataLength); - break; - case ImageCompression.Rle: - // RLE row lengths - RleRowLengths = new RleRowLengths(reader, Rect.Height, Layer.PsdFile.IsLargeDocument); - var rleDataLength = (int)(endPosition - reader.BaseStream.Position); - Debug.Assert(rleDataLength == RleRowLengths.Total, - "RLE row lengths do not sum to length of channel image data."); - - // The PSD specification states that rows are padded to even sizes. - // However, Photoshop doesn't actually do this. RLE rows can have - // odd lengths in the header, and there is no padding between rows. - ImageDataRaw = reader.ReadBytes(rleDataLength); - break; - case ImageCompression.Zip: - case ImageCompression.ZipPrediction: - ImageDataRaw = reader.ReadBytes(dataLength); - break; - } - - Util.DebugMessage(reader.BaseStream, "Load, End, Channel image, {0}", ID, Layer.Name); - Debug.Assert(reader.BaseStream.Position == endPosition, "Pixel data was not fully read in."); - } - - /// - /// Decodes the raw image data from the compressed on-disk format into - /// an uncompressed bitmap, in native byte order. - /// - public void DecodeImageData() - { - if ((ImageCompression == ImageCompression.Raw) && (Layer.PsdFile.BitDepth <= 8)) - { - ImageData = new NativeArray(ImageDataRaw, Allocator.TempJob); - return; - } - - var image = ImageDataFactory.Create(this, ImageDataRaw); - var longLength = (long)image.BytesPerRow * Rect.Height; - Util.CheckByteArrayLength(longLength); - var LocalImageData = new byte[longLength]; - image.Read(LocalImageData); - ImageData = new NativeArray(LocalImageData, Allocator.TempJob); - ImageDataRaw = null; // no longer needed. - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using PDNWrapper; +using System.Linq; +using Unity.Collections; +using PhotoshopFile.Compression; + +namespace PhotoshopFile +{ + internal class ChannelList : List + { + /// + /// Returns channels with nonnegative IDs as an array, so that accessing + /// a channel by Id can be optimized into pointer arithmetic rather than + /// being implemented as a List scan. + /// + /// + /// This optimization is crucial for blitting lots of pixels back and + /// forth between Photoshop's per-channel representation, and Paint.NET's + /// per-pixel BGRA representation. + /// + public Channel[] ToIdArray() + { + var maxId = this.Max(x => x.ID); + var idArray = new Channel[maxId + 1]; + foreach (var channel in this) + { + if (channel.ID >= 0) + idArray[channel.ID] = channel; + } + return idArray; + } + + public ChannelList() + : base() + { + } + + public Channel GetId(int id) + { + return this.Single(x => x.ID == id); + } + + public bool ContainsId(int id) + { + return this.Exists(x => x.ID == id); + } + } + + /////////////////////////////////////////////////////////////////////////// + + [DebuggerDisplay("ID = {ID}")] + internal class Channel + { + /// + /// The layer to which this channel belongs + /// + public Layer Layer { get; private set; } + + /// + /// Channel ID. + /// + /// -1 = transparency mask + /// -2 = user-supplied layer mask, or vector mask + /// -3 = user-supplied layer mask, if channel -2 contains a vector mask + /// + /// Nonnegative channel IDs give the actual image channels, in the + /// order defined by the colormode. For example, 0, 1, 2 = R, G, B. + /// + /// + /// + public short ID { get; set; } + + public Rectangle Rect + { + get + { + switch (ID) + { + case -2: + return Layer.Masks.LayerMask.Rect; + case -3: + return Layer.Masks.UserMask.Rect; + default: + return Layer.Rect; + } + } + } + + /// + /// Total length of the channel data, including compression headers. + /// + public long Length { get; set; } + + /// + /// Raw image data for this color channel, in compressed on-disk format. + /// + /// + /// If null, the ImageData will be automatically compressed during save. + /// + public byte[] ImageDataRaw { get; set; } + + /// + /// Decompressed image data for this color channel. + /// + /// + /// When making changes to the ImageData, set ImageDataRaw to null so that + /// the correct data will be compressed during save. + /// + public NativeArray ImageData { get; set; } + + /// + /// Image compression method used. + /// + public ImageCompression ImageCompression { get; set; } + + /// + /// RLE-compressed length of each row. + /// + public RleRowLengths RleRowLengths { get; set; } + + ////////////////////////////////////////////////////////////////// + + internal Channel(short id, Layer layer) + { + ID = id; + Layer = layer; + } + + internal Channel(PsdBinaryReader reader, Layer layer) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel"); + + ID = reader.ReadInt16(); + Length = (layer.PsdFile.IsLargeDocument) + ? reader.ReadInt64() + : reader.ReadInt32(); + Layer = layer; + + Util.DebugMessage(reader.BaseStream, "Load, End, Channel, {0}", ID); + } + + internal void Cleanup() + { + if (ImageData.IsCreated) + ImageData.Dispose(); + } + ////////////////////////////////////////////////////////////////// + + internal void LoadPixelData(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image"); + + if (Length == 0) + { + ImageCompression = ImageCompression.Raw; + ImageDataRaw = new byte[0]; + return; + } + + var endPosition = reader.BaseStream.Position + this.Length; + ImageCompression = (ImageCompression)reader.ReadInt16(); + var longDataLength = this.Length - 2; + Util.CheckByteArrayLength(longDataLength); + var dataLength = (int)longDataLength; + + switch (ImageCompression) + { + case ImageCompression.Raw: + ImageDataRaw = reader.ReadBytes(dataLength); + break; + case ImageCompression.Rle: + // RLE row lengths + RleRowLengths = new RleRowLengths(reader, Rect.Height, Layer.PsdFile.IsLargeDocument); + var rleDataLength = (int)(endPosition - reader.BaseStream.Position); + Debug.Assert(rleDataLength == RleRowLengths.Total, + "RLE row lengths do not sum to length of channel image data."); + + // The PSD specification states that rows are padded to even sizes. + // However, Photoshop doesn't actually do this. RLE rows can have + // odd lengths in the header, and there is no padding between rows. + ImageDataRaw = reader.ReadBytes(rleDataLength); + break; + case ImageCompression.Zip: + case ImageCompression.ZipPrediction: + ImageDataRaw = reader.ReadBytes(dataLength); + break; + } + + Util.DebugMessage(reader.BaseStream, "Load, End, Channel image, {0}", ID, Layer.Name); + Debug.Assert(reader.BaseStream.Position == endPosition, "Pixel data was not fully read in."); + } + + /// + /// Decodes the raw image data from the compressed on-disk format into + /// an uncompressed bitmap, in native byte order. + /// + public void DecodeImageData() + { + if ((ImageCompression == ImageCompression.Raw) && (Layer.PsdFile.BitDepth <= 8)) + { + ImageData = new NativeArray(ImageDataRaw, Allocator.TempJob); + return; + } + + var image = ImageDataFactory.Create(this, ImageDataRaw); + var longLength = (long)image.BytesPerRow * Rect.Height; + Util.CheckByteArrayLength(longLength); + var LocalImageData = new byte[longLength]; + image.Read(LocalImageData); + ImageData = new NativeArray(LocalImageData, Allocator.TempJob); + ImageDataRaw = null; // no longer needed. + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/Channel.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/Channel.cs.meta index 22be46b..db7841f 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Channel.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/Channel.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: c12f761461a76f44eab4f22f85e988b1 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: c12f761461a76f44eab4f22f85e988b1 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/Layer.cs b/Editor/PSDPlugin/PsdFile/Layers/Layer.cs index f46354c..59a6e42 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Layer.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/Layer.cs @@ -1,240 +1,240 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics; -using PDNWrapper; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; - -namespace PhotoshopFile -{ - [DebuggerDisplay("Name = {Name}")] - internal class Layer - { - internal PsdFile PsdFile { get; private set; } - - /// - /// The rectangle containing the contents of the layer. - /// - public Rectangle Rect { get; set; } - - public bool IsGroup { get; set; } - public bool IsEndGroupMarker { get; set; } - public Layer ParentLayer {get; set; } - // ID from Key "lyid" - public int LayerID { get; set; } - - /// - /// Image channels. - /// - public ChannelList Channels { get; private set; } - - /// - /// Returns alpha channel if it exists, otherwise null. - /// - public Channel AlphaChannel - { - get - { - if (Channels.ContainsId(-1)) - return Channels.GetId(-1); - else - return null; - } - } - - private string blendModeKey; - /// - /// Photoshop blend mode key for the layer - /// - public string BlendModeKey - { - get { return blendModeKey; } - set - { - if (value.Length != 4) - { - throw new ArgumentException( - "BlendModeKey must be 4 characters in length."); - } - blendModeKey = value; - } - } - - /// - /// 0 = transparent ... 255 = opaque - /// - public byte Opacity { get; set; } - - /// - /// false = base, true = non-base - /// - public bool Clipping { get; set; } - - private static int protectTransBit = BitVector32.CreateMask(); - private static int visibleBit = BitVector32.CreateMask(protectTransBit); - BitVector32 flags = new BitVector32(); - - /// - /// If true, the layer is visible. - /// - public bool Visible - { - get { return !flags[visibleBit]; } - set { flags[visibleBit] = !value; } - } - - /// - /// Protect the transparency - /// - public bool ProtectTrans - { - get { return flags[protectTransBit]; } - set { flags[protectTransBit] = value; } - } - - /// - /// The descriptive layer name - /// - public string Name { get; set; } - - public BlendingRanges BlendingRangesData { get; set; } - - public MaskInfo Masks { get; set; } - - public List AdditionalInfo { get; set; } - - /////////////////////////////////////////////////////////////////////////// - - public Layer(PsdFile psdFile) - { - PsdFile = psdFile; - Rect = Rectangle.Empty; - Channels = new ChannelList(); - BlendModeKey = PsdBlendMode.Normal; - AdditionalInfo = new List(); - IsGroup = false; - ParentLayer = null; - IsEndGroupMarker = false; - } - - public Layer(PsdBinaryReader reader, PsdFile psdFile) - : this(psdFile) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Layer"); - - Rect = reader.ReadRectangle(); - - //----------------------------------------------------------------------- - // Read channel headers. Image data comes later, after the layer header. - - int numberOfChannels = reader.ReadUInt16(); - for (int channel = 0; channel < numberOfChannels; channel++) - { - var ch = new Channel(reader, this); - Channels.Add(ch); - } - - //----------------------------------------------------------------------- - // - - var signature = reader.ReadAsciiChars(4); - if (signature != "8BIM") - throw (new PsdInvalidException("Invalid signature in layer header.")); - - BlendModeKey = reader.ReadAsciiChars(4); - Opacity = reader.ReadByte(); - Clipping = reader.ReadBoolean(); - - var flagsByte = reader.ReadByte(); - flags = new BitVector32(flagsByte); - reader.ReadByte(); //padding - - //----------------------------------------------------------------------- - - // This is the total size of the MaskData, the BlendingRangesData, the - // Name and the AdjustmentLayerInfo. - var extraDataSize = reader.ReadUInt32(); - var extraDataStartPosition = reader.BaseStream.Position; - - Masks = new MaskInfo(reader, this); - BlendingRangesData = new BlendingRanges(reader, this); - Name = reader.ReadPascalString(4); - - //----------------------------------------------------------------------- - // Process Additional Layer Information - - long adjustmentLayerEndPos = extraDataStartPosition + extraDataSize; - while (reader.BaseStream.Position < adjustmentLayerEndPos) - { - var layerInfo = LayerInfoFactory.Load(reader, this.PsdFile, false, adjustmentLayerEndPos); - AdditionalInfo.Add(layerInfo); - } - - foreach (var adjustmentInfo in AdditionalInfo) - { - switch (adjustmentInfo.Key) - { - case "luni": - Name = ((LayerUnicodeName)adjustmentInfo).Name; - break; - case "lyid": - LayerID = ((LayerId)adjustmentInfo).ID; - break; - } - } - - Util.DebugMessage(reader.BaseStream, "Load, End, Layer, {0}", Name); - - PsdFile.LoadContext.OnLoadLayerHeader(this); - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Create ImageData for any missing channels. - /// - public void CreateMissingChannels() - { - var channelCount = this.PsdFile.ColorMode.MinChannelCount(); - for (short id = 0; id < channelCount; id++) - { - if (!this.Channels.ContainsId(id)) - { - var size = this.Rect.Height * this.Rect.Width; - - var ch = new Channel(id, this); - ch.ImageData = new NativeArray(size, Allocator.TempJob); - unsafe - { - UnsafeUtility.MemSet(ch.ImageData.GetUnsafePtr(), (byte)255, size); - } - this.Channels.Add(ch); - } - } - } - - /////////////////////////////////////////////////////////////////////////// - - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Diagnostics; +using PDNWrapper; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; + +namespace PhotoshopFile +{ + [DebuggerDisplay("Name = {Name}")] + internal class Layer + { + internal PsdFile PsdFile { get; private set; } + + /// + /// The rectangle containing the contents of the layer. + /// + public Rectangle Rect { get; set; } + + public bool IsGroup { get; set; } + public bool IsEndGroupMarker { get; set; } + public Layer ParentLayer {get; set; } + // ID from Key "lyid" + public int LayerID { get; set; } + + /// + /// Image channels. + /// + public ChannelList Channels { get; private set; } + + /// + /// Returns alpha channel if it exists, otherwise null. + /// + public Channel AlphaChannel + { + get + { + if (Channels.ContainsId(-1)) + return Channels.GetId(-1); + else + return null; + } + } + + private string blendModeKey; + /// + /// Photoshop blend mode key for the layer + /// + public string BlendModeKey + { + get { return blendModeKey; } + set + { + if (value.Length != 4) + { + throw new ArgumentException( + "BlendModeKey must be 4 characters in length."); + } + blendModeKey = value; + } + } + + /// + /// 0 = transparent ... 255 = opaque + /// + public byte Opacity { get; set; } + + /// + /// false = base, true = non-base + /// + public bool Clipping { get; set; } + + private static int protectTransBit = BitVector32.CreateMask(); + private static int visibleBit = BitVector32.CreateMask(protectTransBit); + BitVector32 flags = new BitVector32(); + + /// + /// If true, the layer is visible. + /// + public bool Visible + { + get { return !flags[visibleBit]; } + set { flags[visibleBit] = !value; } + } + + /// + /// Protect the transparency + /// + public bool ProtectTrans + { + get { return flags[protectTransBit]; } + set { flags[protectTransBit] = value; } + } + + /// + /// The descriptive layer name + /// + public string Name { get; set; } + + public BlendingRanges BlendingRangesData { get; set; } + + public MaskInfo Masks { get; set; } + + public List AdditionalInfo { get; set; } + + /////////////////////////////////////////////////////////////////////////// + + public Layer(PsdFile psdFile) + { + PsdFile = psdFile; + Rect = Rectangle.Empty; + Channels = new ChannelList(); + BlendModeKey = PsdBlendMode.Normal; + AdditionalInfo = new List(); + IsGroup = false; + ParentLayer = null; + IsEndGroupMarker = false; + } + + public Layer(PsdBinaryReader reader, PsdFile psdFile) + : this(psdFile) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Layer"); + + Rect = reader.ReadRectangle(); + + //----------------------------------------------------------------------- + // Read channel headers. Image data comes later, after the layer header. + + int numberOfChannels = reader.ReadUInt16(); + for (int channel = 0; channel < numberOfChannels; channel++) + { + var ch = new Channel(reader, this); + Channels.Add(ch); + } + + //----------------------------------------------------------------------- + // + + var signature = reader.ReadAsciiChars(4); + if (signature != "8BIM") + throw (new PsdInvalidException("Invalid signature in layer header.")); + + BlendModeKey = reader.ReadAsciiChars(4); + Opacity = reader.ReadByte(); + Clipping = reader.ReadBoolean(); + + var flagsByte = reader.ReadByte(); + flags = new BitVector32(flagsByte); + reader.ReadByte(); //padding + + //----------------------------------------------------------------------- + + // This is the total size of the MaskData, the BlendingRangesData, the + // Name and the AdjustmentLayerInfo. + var extraDataSize = reader.ReadUInt32(); + var extraDataStartPosition = reader.BaseStream.Position; + + Masks = new MaskInfo(reader, this); + BlendingRangesData = new BlendingRanges(reader, this); + Name = reader.ReadPascalString(4); + + //----------------------------------------------------------------------- + // Process Additional Layer Information + + long adjustmentLayerEndPos = extraDataStartPosition + extraDataSize; + while (reader.BaseStream.Position < adjustmentLayerEndPos) + { + var layerInfo = LayerInfoFactory.Load(reader, this.PsdFile, false, adjustmentLayerEndPos); + AdditionalInfo.Add(layerInfo); + } + + foreach (var adjustmentInfo in AdditionalInfo) + { + switch (adjustmentInfo.Key) + { + case "luni": + Name = ((LayerUnicodeName)adjustmentInfo).Name; + break; + case "lyid": + LayerID = ((LayerId)adjustmentInfo).ID; + break; + } + } + + Util.DebugMessage(reader.BaseStream, "Load, End, Layer, {0}", Name); + + PsdFile.LoadContext.OnLoadLayerHeader(this); + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Create ImageData for any missing channels. + /// + public void CreateMissingChannels() + { + var channelCount = this.PsdFile.ColorMode.MinChannelCount(); + for (short id = 0; id < channelCount; id++) + { + if (!this.Channels.ContainsId(id)) + { + var size = this.Rect.Height * this.Rect.Width; + + var ch = new Channel(id, this); + ch.ImageData = new NativeArray(size, Allocator.TempJob); + unsafe + { + UnsafeUtility.MemSet(ch.ImageData.GetUnsafePtr(), (byte)255, size); + } + this.Channels.Add(ch); + } + } + } + + /////////////////////////////////////////////////////////////////////////// + + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/Layer.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/Layer.cs.meta index 17aac1b..03d1c5c 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Layer.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/Layer.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 2dff4719950c8914097f7b77c9b07de9 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2dff4719950c8914097f7b77c9b07de9 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs index f984202..f1af051 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs @@ -1,168 +1,168 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; -using System.IO; - -namespace PhotoshopFile -{ - internal static class LayerInfoFactory - { - /// - /// Loads the next LayerInfo record. - /// - /// The file reader - /// The PSD file. - /// True if the LayerInfo record is being - /// loaded from the end of the Layer and Mask Information section; - /// false if it is being loaded from the end of a Layer record. - public static LayerInfo Load(PsdBinaryReader reader, PsdFile psdFile, - bool globalLayerInfo, long fileEndPos) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, LayerInfo"); - - // Some keys use a signature of 8B64, but the identity of these keys - // is undocumented. We will therefore accept either signature. - var signature = reader.ReadAsciiChars(4); - if ((signature != "8BIM") && (signature != "8B64")) - { - throw new PsdInvalidException( - "LayerInfo signature invalid, must be 8BIM or 8B64."); - } - - var key = reader.ReadAsciiChars(4); - var hasLongLength = LayerInfoUtil.HasLongLength(key, psdFile.IsLargeDocument); - LayerInfo result = new RawLayerInfo("dummy"); - bool breakFromLoop = false; - while (!breakFromLoop) - { - var baseStartPosition = reader.BaseStream.Position; - var length = hasLongLength - ? reader.ReadInt64() - : reader.ReadInt32(); - var startPosition = reader.BaseStream.Position; - - - switch (key) - { - case "Layr": - case "Lr16": - case "Lr32": - result = new InfoLayers(reader, psdFile, key, length); - break; - case "lsct": - case "lsdk": - result = new LayerSectionInfo(reader, key, (int)length); - break; - case "luni": - result = new LayerUnicodeName(reader); - break; - case "lyid": - result = new LayerId(reader, key, length); - break; - default: - result = new RawLayerInfo(reader, signature, key, length); - break; - } - - // May have additional padding applied. - var endPosition = startPosition + length; - if (reader.BaseStream.Position < endPosition) - reader.BaseStream.Position = endPosition; - - // Documentation states that the length is even-padded. Actually: - // 1. Most keys have 4-padded lengths. - // 2. However, some keys (LMsk) have even-padded lengths. - // 3. Other keys (Txt2, Lr16, Lr32) have unpadded lengths. - // - // Photoshop writes data that is always 4-padded, even when the stated - // length is not a multiple of 4. The length mismatch seems to occur - // only on global layer info. We do not read extra padding in other - // cases because third-party programs are likely to follow the spec. - - if (globalLayerInfo) - { - reader.ReadPadding(startPosition, 4); - } - - //try if we can read the next signature - if (reader.BaseStream.Position < fileEndPos) - { - var nowPosition = reader.BaseStream.Position; - signature = reader.ReadAsciiChars(4); - if ((signature != "8BIM") && (signature != "8B64")) - { - hasLongLength = true; - reader.BaseStream.Position = baseStartPosition; - } - else - { - reader.BaseStream.Position = nowPosition; - breakFromLoop = true; - } - } - else - breakFromLoop = true; - } - - - Util.DebugMessage(reader.BaseStream, "Load, End, LayerInfo, {0}, {1}", - result.Signature, result.Key); - return result; - } - } - - internal static class LayerInfoUtil - { - internal static bool HasLongLength(string key, bool isLargeDocument) - { - if (!isLargeDocument) - { - return false; - } - //return false; - - switch (key) - { - case "LMsk": - case "Lr16": - case "Lr32": - case "Layr": - case "Mt16": - case "Mt32": - case "Mtrn": - case "Alph": - case "FMsk": - case "lnk2": - case "FEid": - case "FXid": - case "PxSD": - case "lnkE": // Undocumented - case "extn": // Undocumented - case "cinf": // Undocumented - return true; - - default: - return false; - } - } - } - - internal abstract class LayerInfo - { - public abstract string Signature { get; } - - public abstract string Key { get; } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; +using System.IO; + +namespace PhotoshopFile +{ + internal static class LayerInfoFactory + { + /// + /// Loads the next LayerInfo record. + /// + /// The file reader + /// The PSD file. + /// True if the LayerInfo record is being + /// loaded from the end of the Layer and Mask Information section; + /// false if it is being loaded from the end of a Layer record. + public static LayerInfo Load(PsdBinaryReader reader, PsdFile psdFile, + bool globalLayerInfo, long fileEndPos) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, LayerInfo"); + + // Some keys use a signature of 8B64, but the identity of these keys + // is undocumented. We will therefore accept either signature. + var signature = reader.ReadAsciiChars(4); + if ((signature != "8BIM") && (signature != "8B64")) + { + throw new PsdInvalidException( + "LayerInfo signature invalid, must be 8BIM or 8B64."); + } + + var key = reader.ReadAsciiChars(4); + var hasLongLength = LayerInfoUtil.HasLongLength(key, psdFile.IsLargeDocument); + LayerInfo result = new RawLayerInfo("dummy"); + bool breakFromLoop = false; + while (!breakFromLoop) + { + var baseStartPosition = reader.BaseStream.Position; + var length = hasLongLength + ? reader.ReadInt64() + : reader.ReadInt32(); + var startPosition = reader.BaseStream.Position; + + + switch (key) + { + case "Layr": + case "Lr16": + case "Lr32": + result = new InfoLayers(reader, psdFile, key, length); + break; + case "lsct": + case "lsdk": + result = new LayerSectionInfo(reader, key, (int)length); + break; + case "luni": + result = new LayerUnicodeName(reader); + break; + case "lyid": + result = new LayerId(reader, key, length); + break; + default: + result = new RawLayerInfo(reader, signature, key, length); + break; + } + + // May have additional padding applied. + var endPosition = startPosition + length; + if (reader.BaseStream.Position < endPosition) + reader.BaseStream.Position = endPosition; + + // Documentation states that the length is even-padded. Actually: + // 1. Most keys have 4-padded lengths. + // 2. However, some keys (LMsk) have even-padded lengths. + // 3. Other keys (Txt2, Lr16, Lr32) have unpadded lengths. + // + // Photoshop writes data that is always 4-padded, even when the stated + // length is not a multiple of 4. The length mismatch seems to occur + // only on global layer info. We do not read extra padding in other + // cases because third-party programs are likely to follow the spec. + + if (globalLayerInfo) + { + reader.ReadPadding(startPosition, 4); + } + + //try if we can read the next signature + if (reader.BaseStream.Position < fileEndPos) + { + var nowPosition = reader.BaseStream.Position; + signature = reader.ReadAsciiChars(4); + if ((signature != "8BIM") && (signature != "8B64")) + { + hasLongLength = true; + reader.BaseStream.Position = baseStartPosition; + } + else + { + reader.BaseStream.Position = nowPosition; + breakFromLoop = true; + } + } + else + breakFromLoop = true; + } + + + Util.DebugMessage(reader.BaseStream, "Load, End, LayerInfo, {0}, {1}", + result.Signature, result.Key); + return result; + } + } + + internal static class LayerInfoUtil + { + internal static bool HasLongLength(string key, bool isLargeDocument) + { + if (!isLargeDocument) + { + return false; + } + //return false; + + switch (key) + { + case "LMsk": + case "Lr16": + case "Lr32": + case "Layr": + case "Mt16": + case "Mt32": + case "Mtrn": + case "Alph": + case "FMsk": + case "lnk2": + case "FEid": + case "FXid": + case "PxSD": + case "lnkE": // Undocumented + case "extn": // Undocumented + case "cinf": // Undocumented + return true; + + default: + return false; + } + } + } + + internal abstract class LayerInfo + { + public abstract string Signature { get; } + + public abstract string Key { get; } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs.meta index c7745b0..8b538fd 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 5bf52a9b627c3374385cbd0ccc5caacd -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 5bf52a9b627c3374385cbd0ccc5caacd +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.meta index 407e1fc..a3a3326 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo.meta @@ -1,9 +1,9 @@ -fileFormatVersion: 2 -guid: 45831abf313417241b91683b30dedf45 -folderAsset: yes -timeCreated: 1495006553 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 45831abf313417241b91683b30dedf45 +folderAsset: yes +timeCreated: 1495006553 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs index bd5bcce..43c3719 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs @@ -1,87 +1,87 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - /// - /// Layers that are stored as Additional Info, rather than in the main - /// Layers section of the PSD file. - /// - /// - /// Photoshop stores layers in the Additional Info section for 16-bit and - /// 32-bit depth images. The Layers section in the PSD file is left empty. - /// - /// This appears to be for backward-compatibility purposes, but it is not - /// required. Photoshop will successfully load a high-bitdepth image that - /// puts the layers in the Layers section. - /// - internal class InfoLayers : LayerInfo - { - public override string Signature - { - get { return "8BIM"; } - } - - private string key; - public override string Key - { - get { return key; } - } - - public PsdFile PsdFile { get; set; } - - public InfoLayers(PsdFile psdFile, string key) - { - PsdFile = psdFile; - - switch (key) - { - // The key does not have to match the bit depth, but it does have to - // be one of the known values. - case "Layr": - case "Lr16": - case "Lr32": - this.key = key; - break; - default: - throw new PsdInvalidException( - "InfoLayers key must be Layr, Lr16, or Lr32."); - } - } - - public InfoLayers(PsdBinaryReader reader, PsdFile psdFile, - string key, long dataLength) - : this(psdFile, key) - { - if (psdFile.Layers.Count > 0) - { - throw new PsdInvalidException( - "Cannot have both regular layers and Additional Info layers"); - } - - var endPosition = reader.BaseStream.Position + dataLength; - psdFile.LoadLayers(reader, false); - - if (reader.BaseStream.Position != endPosition) - { - throw new PsdInvalidException( - "Incorrect length for InfoLayers."); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + /// + /// Layers that are stored as Additional Info, rather than in the main + /// Layers section of the PSD file. + /// + /// + /// Photoshop stores layers in the Additional Info section for 16-bit and + /// 32-bit depth images. The Layers section in the PSD file is left empty. + /// + /// This appears to be for backward-compatibility purposes, but it is not + /// required. Photoshop will successfully load a high-bitdepth image that + /// puts the layers in the Layers section. + /// + internal class InfoLayers : LayerInfo + { + public override string Signature + { + get { return "8BIM"; } + } + + private string key; + public override string Key + { + get { return key; } + } + + public PsdFile PsdFile { get; set; } + + public InfoLayers(PsdFile psdFile, string key) + { + PsdFile = psdFile; + + switch (key) + { + // The key does not have to match the bit depth, but it does have to + // be one of the known values. + case "Layr": + case "Lr16": + case "Lr32": + this.key = key; + break; + default: + throw new PsdInvalidException( + "InfoLayers key must be Layr, Lr16, or Lr32."); + } + } + + public InfoLayers(PsdBinaryReader reader, PsdFile psdFile, + string key, long dataLength) + : this(psdFile, key) + { + if (psdFile.Layers.Count > 0) + { + throw new PsdInvalidException( + "Cannot have both regular layers and Additional Info layers"); + } + + var endPosition = reader.BaseStream.Position + dataLength; + psdFile.LoadLayers(reader, false); + + if (reader.BaseStream.Position != endPosition) + { + throw new PsdInvalidException( + "Incorrect length for InfoLayers."); + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs.meta index 15bd023..b3dc005 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/InfoLayers.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 81ec2894805ff534395009ab7c13ea4c -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 81ec2894805ff534395009ab7c13ea4c +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs index 8c5b0a4..5bb0e67 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs @@ -1,71 +1,71 @@ -///////////////////////////////////////////////////////////////////////////////// -// Author : leoyaik@unity3d.com -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - /// - /// Layers that are stored as Additional Info, rather than in the main - /// Layers section of the PSD file. - /// - /// - /// Photoshop stores layers in the Additional Info section for 16-bit and - /// 32-bit depth images. The Layers section in the PSD file is left empty. - /// - /// This appears to be for backward-compatibility purposes, but it is not - /// required. Photoshop will successfully load a high-bitdepth image that - /// puts the layers in the Layers section. - /// - internal class LayerId : LayerInfo - { - public override string Signature - { - get { return "8BIM"; } - } - - private string key; - public override string Key - { - get { return key; } - } - - private int id = 0; - public int ID - { - get { return id; } - } - - - public LayerId(string key) - { - switch (key) - { - // The key does not have to match the bit depth, but it does have to - // be one of the known values. - case "lyid": - case "lnsr": - this.key = key; - break; - default: - throw new PsdInvalidException( - "LayerId key should be lyid or lnsr"); - } - } - - public LayerId(PsdBinaryReader reader, - string key, long dataLength) - : this(key) - { - if (dataLength == 4) - id = reader.ReadInt32(); - else - throw new PsdInvalidException("LayerId data length should be 4"); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// Author : leoyaik@unity3d.com +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + /// + /// Layers that are stored as Additional Info, rather than in the main + /// Layers section of the PSD file. + /// + /// + /// Photoshop stores layers in the Additional Info section for 16-bit and + /// 32-bit depth images. The Layers section in the PSD file is left empty. + /// + /// This appears to be for backward-compatibility purposes, but it is not + /// required. Photoshop will successfully load a high-bitdepth image that + /// puts the layers in the Layers section. + /// + internal class LayerId : LayerInfo + { + public override string Signature + { + get { return "8BIM"; } + } + + private string key; + public override string Key + { + get { return key; } + } + + private int id = 0; + public int ID + { + get { return id; } + } + + + public LayerId(string key) + { + switch (key) + { + // The key does not have to match the bit depth, but it does have to + // be one of the known values. + case "lyid": + case "lnsr": + this.key = key; + break; + default: + throw new PsdInvalidException( + "LayerId key should be lyid or lnsr"); + } + } + + public LayerId(PsdBinaryReader reader, + string key, long dataLength) + : this(key) + { + if (dataLength == 4) + id = reader.ReadInt32(); + else + throw new PsdInvalidException("LayerId data length should be 4"); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs.meta index cd8c7c3..362e4ba 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerId.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 4c40067c9a690e44ca098f5e4ed763e7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4c40067c9a690e44ca098f5e4ed763e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs index 5d9993f..425d53e 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs @@ -1,94 +1,94 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2015 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; - -namespace PhotoshopFile -{ - internal enum LayerSectionType - { - Layer = 0, - OpenFolder = 1, - ClosedFolder = 2, - SectionDivider = 3 - } - - internal enum LayerSectionSubtype - { - Normal = 0, - SceneGroup = 1 - } - - /// - /// Layer sections are known as Groups in the Photoshop UI. - /// - internal class LayerSectionInfo : LayerInfo - { - public override string Signature - { - get { return "8BIM"; } - } - - private string key; - public override string Key - { - get { return key; } - } - - public LayerSectionType SectionType { get; set; } - - private LayerSectionSubtype? subtype; - public LayerSectionSubtype Subtype - { - get { return subtype ?? LayerSectionSubtype.Normal; } - set { subtype = value; } - } - - private string blendModeKey; - public string BlendModeKey - { - get { return blendModeKey; } - set - { - if (value.Length != 4) - { - throw new ArgumentException( - "BlendModeKey must be 4 characters in length."); - } - blendModeKey = value; - } - } - - public LayerSectionInfo(PsdBinaryReader reader, string key, int dataLength) - { - // The key for layer section info is documented to be "lsct". However, - // some Photoshop files use the undocumented key "lsdk", with apparently - // the same data format. - this.key = key; - - SectionType = (LayerSectionType)reader.ReadInt32(); - if (dataLength >= 12) - { - var signature = reader.ReadAsciiChars(4); - if (signature != "8BIM") - throw new PsdInvalidException("Invalid section divider signature."); - - BlendModeKey = reader.ReadAsciiChars(4); - if (dataLength >= 16) - { - Subtype = (LayerSectionSubtype)reader.ReadInt32(); - } - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2015 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; + +namespace PhotoshopFile +{ + internal enum LayerSectionType + { + Layer = 0, + OpenFolder = 1, + ClosedFolder = 2, + SectionDivider = 3 + } + + internal enum LayerSectionSubtype + { + Normal = 0, + SceneGroup = 1 + } + + /// + /// Layer sections are known as Groups in the Photoshop UI. + /// + internal class LayerSectionInfo : LayerInfo + { + public override string Signature + { + get { return "8BIM"; } + } + + private string key; + public override string Key + { + get { return key; } + } + + public LayerSectionType SectionType { get; set; } + + private LayerSectionSubtype? subtype; + public LayerSectionSubtype Subtype + { + get { return subtype ?? LayerSectionSubtype.Normal; } + set { subtype = value; } + } + + private string blendModeKey; + public string BlendModeKey + { + get { return blendModeKey; } + set + { + if (value.Length != 4) + { + throw new ArgumentException( + "BlendModeKey must be 4 characters in length."); + } + blendModeKey = value; + } + } + + public LayerSectionInfo(PsdBinaryReader reader, string key, int dataLength) + { + // The key for layer section info is documented to be "lsct". However, + // some Photoshop files use the undocumented key "lsdk", with apparently + // the same data format. + this.key = key; + + SectionType = (LayerSectionType)reader.ReadInt32(); + if (dataLength >= 12) + { + var signature = reader.ReadAsciiChars(4); + if (signature != "8BIM") + throw new PsdInvalidException("Invalid section divider signature."); + + BlendModeKey = reader.ReadAsciiChars(4); + if (dataLength >= 16) + { + Subtype = (LayerSectionSubtype)reader.ReadInt32(); + } + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs.meta index 29098d9..2808ce9 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerSectionInfo.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 4ca20fe44ab2bfd4d8a1c3547b4a136f -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4ca20fe44ab2bfd4d8a1c3547b4a136f +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs index 201d1bf..9de1c63 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs @@ -1,42 +1,42 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; - -namespace PhotoshopFile -{ - internal class LayerUnicodeName : LayerInfo - { - public override string Signature - { - get { return "8BIM"; } - } - - public override string Key - { - get { return "luni"; } - } - - public string Name { get; set; } - - public LayerUnicodeName(string name) - { - Name = name; - } - - public LayerUnicodeName(PsdBinaryReader reader) - { - Name = reader.ReadUnicodeString(); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; + +namespace PhotoshopFile +{ + internal class LayerUnicodeName : LayerInfo + { + public override string Signature + { + get { return "8BIM"; } + } + + public override string Key + { + get { return "luni"; } + } + + public string Name { get; set; } + + public LayerUnicodeName(string name) + { + Name = name; + } + + public LayerUnicodeName(PsdBinaryReader reader) + { + Name = reader.ReadUnicodeString(); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs.meta index ea48643..5f3ce04 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/LayerUnicodeName.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 277ac9726bb060c48860d92018fc06cf -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 277ac9726bb060c48860d92018fc06cf +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs index d3a141e..06f7a2a 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs @@ -1,52 +1,52 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; - -namespace PhotoshopFile -{ - [DebuggerDisplay("Layer Info: { key }")] - internal class RawLayerInfo : LayerInfo - { - private string signature; - public override string Signature - { - get { return signature; } - } - - private string key; - public override string Key - { - get { return key; } - } - - public byte[] Data { get; private set; } - - public RawLayerInfo(string key, string signature = "8BIM") - { - this.signature = signature; - this.key = key; - } - - public RawLayerInfo(PsdBinaryReader reader, string signature, string key, - long dataLength) - { - this.signature = signature; - this.key = key; - - Util.CheckByteArrayLength(dataLength); - Data = reader.ReadBytes((int)dataLength); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; + +namespace PhotoshopFile +{ + [DebuggerDisplay("Layer Info: { key }")] + internal class RawLayerInfo : LayerInfo + { + private string signature; + public override string Signature + { + get { return signature; } + } + + private string key; + public override string Key + { + get { return key; } + } + + public byte[] Data { get; private set; } + + public RawLayerInfo(string key, string signature = "8BIM") + { + this.signature = signature; + this.key = key; + } + + public RawLayerInfo(PsdBinaryReader reader, string signature, string key, + long dataLength) + { + this.signature = signature; + this.key = key; + + Util.CheckByteArrayLength(dataLength); + Data = reader.ReadBytes((int)dataLength); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs.meta index d61de6f..45db884 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/LayerInfo/RawLayerInfo.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 8b73fc997c117d641a1673cd96fc8a07 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 8b73fc997c117d641a1673cd96fc8a07 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Layers/Mask.cs b/Editor/PSDPlugin/PsdFile/Layers/Mask.cs index 1191e93..b99a924 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Mask.cs +++ b/Editor/PSDPlugin/PsdFile/Layers/Mask.cs @@ -1,149 +1,149 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Specialized; -using System.Diagnostics; -using PDNWrapper; -using System.Globalization; -using Unity.Collections; - -namespace PhotoshopFile -{ - internal class Mask - { - /// - /// The layer to which this mask belongs - /// - public Layer Layer { get; private set; } - - /// - /// The rectangle enclosing the mask. - /// - public Rectangle Rect { get; set; } - - private byte backgroundColor; - public byte BackgroundColor - { - get { return backgroundColor; } - set - { - if ((value != 0) && (value != 255)) - throw new PsdInvalidException("Mask background must be fully-opaque or fully-transparent."); - backgroundColor = value; - } - } - - private static int positionVsLayerBit = BitVector32.CreateMask(); - private static int disabledBit = BitVector32.CreateMask(positionVsLayerBit); - private static int invertOnBlendBit = BitVector32.CreateMask(disabledBit); - - private BitVector32 flags; - public BitVector32 Flags { get { return flags; } } - - /// - /// If true, the position of the mask is relative to the layer. - /// - public bool PositionVsLayer - { - get { return flags[positionVsLayerBit]; } - set { flags[positionVsLayerBit] = value; } - } - - public bool Disabled - { - get { return flags[disabledBit]; } - set { flags[disabledBit] = value; } - } - - /// - /// if true, invert the mask when blending. - /// - public bool InvertOnBlend - { - get { return flags[invertOnBlendBit]; } - set { flags[invertOnBlendBit] = value; } - } - - /// - /// Mask image data. - /// - public NativeArray ImageData { get; set; } - - public Mask(Layer layer) - { - Layer = layer; - this.flags = new BitVector32(); - } - - public Mask(Layer layer, Rectangle rect, byte color, BitVector32 flags) - { - Layer = layer; - Rect = rect; - BackgroundColor = color; - this.flags = flags; - } - } - - /// - /// Mask info for a layer. Contains both the layer and user masks. - /// - internal class MaskInfo - { - public Mask LayerMask { get; set; } - - public Mask UserMask { get; set; } - - /// - /// Construct MaskInfo with null masks. - /// - public MaskInfo() - { - } - - public MaskInfo(PsdBinaryReader reader, Layer layer) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, MaskInfo"); - - var maskLength = reader.ReadUInt32(); - if (maskLength <= 0) - return; - - var startPosition = reader.BaseStream.Position; - var endPosition = startPosition + maskLength; - - // Read layer mask - var rectangle = reader.ReadRectangle(); - var backgroundColor = reader.ReadByte(); - var flagsByte = reader.ReadByte(); - LayerMask = new Mask(layer, rectangle, backgroundColor, new BitVector32(flagsByte)); - - // User mask is supplied separately when there is also a vector mask. - if (maskLength == 36) - { - var userFlagsByte = reader.ReadByte(); - var userBackgroundColor = reader.ReadByte(); - var userRectangle = reader.ReadRectangle(); - UserMask = new Mask(layer, userRectangle, userBackgroundColor, new BitVector32(userFlagsByte)); - } - - // 20-byte mask data will end with padding. - reader.BaseStream.Position = endPosition; - - Util.DebugMessage(reader.BaseStream, "Load, End, MaskInfo"); - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Specialized; +using System.Diagnostics; +using PDNWrapper; +using System.Globalization; +using Unity.Collections; + +namespace PhotoshopFile +{ + internal class Mask + { + /// + /// The layer to which this mask belongs + /// + public Layer Layer { get; private set; } + + /// + /// The rectangle enclosing the mask. + /// + public Rectangle Rect { get; set; } + + private byte backgroundColor; + public byte BackgroundColor + { + get { return backgroundColor; } + set + { + if ((value != 0) && (value != 255)) + throw new PsdInvalidException("Mask background must be fully-opaque or fully-transparent."); + backgroundColor = value; + } + } + + private static int positionVsLayerBit = BitVector32.CreateMask(); + private static int disabledBit = BitVector32.CreateMask(positionVsLayerBit); + private static int invertOnBlendBit = BitVector32.CreateMask(disabledBit); + + private BitVector32 flags; + public BitVector32 Flags { get { return flags; } } + + /// + /// If true, the position of the mask is relative to the layer. + /// + public bool PositionVsLayer + { + get { return flags[positionVsLayerBit]; } + set { flags[positionVsLayerBit] = value; } + } + + public bool Disabled + { + get { return flags[disabledBit]; } + set { flags[disabledBit] = value; } + } + + /// + /// if true, invert the mask when blending. + /// + public bool InvertOnBlend + { + get { return flags[invertOnBlendBit]; } + set { flags[invertOnBlendBit] = value; } + } + + /// + /// Mask image data. + /// + public NativeArray ImageData { get; set; } + + public Mask(Layer layer) + { + Layer = layer; + this.flags = new BitVector32(); + } + + public Mask(Layer layer, Rectangle rect, byte color, BitVector32 flags) + { + Layer = layer; + Rect = rect; + BackgroundColor = color; + this.flags = flags; + } + } + + /// + /// Mask info for a layer. Contains both the layer and user masks. + /// + internal class MaskInfo + { + public Mask LayerMask { get; set; } + + public Mask UserMask { get; set; } + + /// + /// Construct MaskInfo with null masks. + /// + public MaskInfo() + { + } + + public MaskInfo(PsdBinaryReader reader, Layer layer) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, MaskInfo"); + + var maskLength = reader.ReadUInt32(); + if (maskLength <= 0) + return; + + var startPosition = reader.BaseStream.Position; + var endPosition = startPosition + maskLength; + + // Read layer mask + var rectangle = reader.ReadRectangle(); + var backgroundColor = reader.ReadByte(); + var flagsByte = reader.ReadByte(); + LayerMask = new Mask(layer, rectangle, backgroundColor, new BitVector32(flagsByte)); + + // User mask is supplied separately when there is also a vector mask. + if (maskLength == 36) + { + var userFlagsByte = reader.ReadByte(); + var userBackgroundColor = reader.ReadByte(); + var userRectangle = reader.ReadRectangle(); + UserMask = new Mask(layer, userRectangle, userBackgroundColor, new BitVector32(userFlagsByte)); + } + + // 20-byte mask data will end with padding. + reader.BaseStream.Position = endPosition; + + Util.DebugMessage(reader.BaseStream, "Load, End, MaskInfo"); + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Layers/Mask.cs.meta b/Editor/PSDPlugin/PsdFile/Layers/Mask.cs.meta index 85be818..57b01e5 100644 --- a/Editor/PSDPlugin/PsdFile/Layers/Mask.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Layers/Mask.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 2b6148b9ac6738b4999b4686f3820560 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2b6148b9ac6738b4999b4686f3820560 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/LoadContext.cs b/Editor/PSDPlugin/PsdFile/LoadContext.cs index fef5093..513103c 100644 --- a/Editor/PSDPlugin/PsdFile/LoadContext.cs +++ b/Editor/PSDPlugin/PsdFile/LoadContext.cs @@ -1,44 +1,44 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - /// - /// Contains settings and callbacks that affect the loading of a PSD file. - /// - internal class LoadContext - { - public Encoding Encoding { get; set; } - - public LoadContext() - { - Encoding = Encoding.Default; - } - - public virtual void OnLoadLayersHeader(PsdFile psdFile) - { - } - - public virtual void OnLoadLayerHeader(Layer layer) - { - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + /// + /// Contains settings and callbacks that affect the loading of a PSD file. + /// + internal class LoadContext + { + public Encoding Encoding { get; set; } + + public LoadContext() + { + Encoding = Encoding.Default; + } + + public virtual void OnLoadLayersHeader(PsdFile psdFile) + { + } + + public virtual void OnLoadLayerHeader(Layer layer) + { + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/LoadContext.cs.meta b/Editor/PSDPlugin/PsdFile/LoadContext.cs.meta index 4df0ca7..a090b12 100644 --- a/Editor/PSDPlugin/PsdFile/LoadContext.cs.meta +++ b/Editor/PSDPlugin/PsdFile/LoadContext.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 3b268b1ee06ace349a872a7d95498aba -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3b268b1ee06ace349a872a7d95498aba +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs b/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs index e3a2725..224554c 100644 --- a/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs +++ b/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs @@ -1,229 +1,229 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2013 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using PDNWrapper; -using System.IO; -using System.Text; - -namespace PhotoshopFile -{ - /// - /// Reads PSD data types in big-endian byte order. - /// - internal class PsdBinaryReader : IDisposable - { - private BinaryReader reader; - private Encoding encoding; - - public Stream BaseStream - { - get { return reader.BaseStream; } - } - - public PsdBinaryReader(Stream stream, PsdBinaryReader reader) - : this(stream, reader.encoding) - { - } - - public PsdBinaryReader(Stream stream, Encoding encoding) - { - this.encoding = encoding; - - // ReadPascalString and ReadUnicodeString handle encoding explicitly. - // BinaryReader.ReadString() is never called, so it is constructed with - // ASCII encoding to make accidental usage obvious. - reader = new BinaryReader(stream, Encoding.ASCII); - } - - public byte ReadByte() - { - return reader.ReadByte(); - } - - public byte[] ReadBytes(int count) - { - return reader.ReadBytes(count); - } - - public bool ReadBoolean() - { - return reader.ReadBoolean(); - } - - public Int16 ReadInt16() - { - var val = reader.ReadInt16(); - byte[] b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 2); - } - val = BitConverter.ToInt16(b, 0); - return val; - } - - public Int32 ReadInt32() - { - var val = reader.ReadInt32(); - byte[] b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 4); - } - val = BitConverter.ToInt32(b, 0); - return val; - } - - public Int64 ReadInt64() - { - var val = reader.ReadInt64(); - var b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 8); - } - val = BitConverter.ToInt64(b, 0); - return val; - } - - public UInt16 ReadUInt16() - { - var val = reader.ReadUInt16(); - var b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 2); - } - val = BitConverter.ToUInt16(b, 0); - return val; - } - - public UInt32 ReadUInt32() - { - var val = reader.ReadUInt32(); - var b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 4); - } - val = BitConverter.ToUInt32(b, 0); - return val; - } - - public UInt64 ReadUInt64() - { - var val = reader.ReadUInt64(); - var b = BitConverter.GetBytes(val); - { - Util.SwapBytes(b, 0, 8); - } - val = BitConverter.ToUInt64(b, 0); - return val; - } - - ////////////////////////////////////////////////////////////////// - - /// - /// Read padding to get to the byte multiple for the block. - /// - /// Starting position of the padded block. - /// Byte multiple that the block is padded to. - public void ReadPadding(long startPosition, int padMultiple) - { - // Pad to specified byte multiple - var totalLength = reader.BaseStream.Position - startPosition; - var padBytes = Util.GetPadding((int)totalLength, padMultiple); - ReadBytes(padBytes); - } - - public Rectangle ReadRectangle() - { - var rect = new Rectangle(); - rect.Y = ReadInt32(); - rect.X = ReadInt32(); - rect.Height = ReadInt32() - rect.Y; - rect.Width = ReadInt32() - rect.X; - return rect; - } - - /// - /// Read a fixed-length ASCII string. - /// - public string ReadAsciiChars(int count) - { - var bytes = reader.ReadBytes(count); - var s = Encoding.ASCII.GetString(bytes); - return s; - } - - /// - /// Read a Pascal string using the specified encoding. - /// - /// Byte multiple that the Pascal string is padded to. - public string ReadPascalString(int padMultiple) - { - var startPosition = reader.BaseStream.Position; - - byte stringLength = ReadByte(); - var bytes = ReadBytes(stringLength); - ReadPadding(startPosition, padMultiple); - - // Default decoder uses best-fit fallback, so it will not throw any - // exceptions if unknown characters are encountered. - var str = encoding.GetString(bytes); - return str; - } - - public string ReadUnicodeString() - { - var numChars = ReadInt32(); - var length = 2 * numChars; - var data = ReadBytes(length); - var str = Encoding.BigEndianUnicode.GetString(data, 0, length); - - return str; - } - - ////////////////////////////////////////////////////////////////// - - #region IDisposable - - private bool disposed = false; - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - // Check to see if Dispose has already been called. - if (disposed) - return; - - if (disposing) - { - if (reader != null) - { - // BinaryReader.Dispose() is protected. - reader.Close(); - reader = null; - } - } - - disposed = true; - } - - #endregion - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2013 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using PDNWrapper; +using System.IO; +using System.Text; + +namespace PhotoshopFile +{ + /// + /// Reads PSD data types in big-endian byte order. + /// + internal class PsdBinaryReader : IDisposable + { + private BinaryReader reader; + private Encoding encoding; + + public Stream BaseStream + { + get { return reader.BaseStream; } + } + + public PsdBinaryReader(Stream stream, PsdBinaryReader reader) + : this(stream, reader.encoding) + { + } + + public PsdBinaryReader(Stream stream, Encoding encoding) + { + this.encoding = encoding; + + // ReadPascalString and ReadUnicodeString handle encoding explicitly. + // BinaryReader.ReadString() is never called, so it is constructed with + // ASCII encoding to make accidental usage obvious. + reader = new BinaryReader(stream, Encoding.ASCII); + } + + public byte ReadByte() + { + return reader.ReadByte(); + } + + public byte[] ReadBytes(int count) + { + return reader.ReadBytes(count); + } + + public bool ReadBoolean() + { + return reader.ReadBoolean(); + } + + public Int16 ReadInt16() + { + var val = reader.ReadInt16(); + byte[] b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 2); + } + val = BitConverter.ToInt16(b, 0); + return val; + } + + public Int32 ReadInt32() + { + var val = reader.ReadInt32(); + byte[] b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 4); + } + val = BitConverter.ToInt32(b, 0); + return val; + } + + public Int64 ReadInt64() + { + var val = reader.ReadInt64(); + var b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 8); + } + val = BitConverter.ToInt64(b, 0); + return val; + } + + public UInt16 ReadUInt16() + { + var val = reader.ReadUInt16(); + var b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 2); + } + val = BitConverter.ToUInt16(b, 0); + return val; + } + + public UInt32 ReadUInt32() + { + var val = reader.ReadUInt32(); + var b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 4); + } + val = BitConverter.ToUInt32(b, 0); + return val; + } + + public UInt64 ReadUInt64() + { + var val = reader.ReadUInt64(); + var b = BitConverter.GetBytes(val); + { + Util.SwapBytes(b, 0, 8); + } + val = BitConverter.ToUInt64(b, 0); + return val; + } + + ////////////////////////////////////////////////////////////////// + + /// + /// Read padding to get to the byte multiple for the block. + /// + /// Starting position of the padded block. + /// Byte multiple that the block is padded to. + public void ReadPadding(long startPosition, int padMultiple) + { + // Pad to specified byte multiple + var totalLength = reader.BaseStream.Position - startPosition; + var padBytes = Util.GetPadding((int)totalLength, padMultiple); + ReadBytes(padBytes); + } + + public Rectangle ReadRectangle() + { + var rect = new Rectangle(); + rect.Y = ReadInt32(); + rect.X = ReadInt32(); + rect.Height = ReadInt32() - rect.Y; + rect.Width = ReadInt32() - rect.X; + return rect; + } + + /// + /// Read a fixed-length ASCII string. + /// + public string ReadAsciiChars(int count) + { + var bytes = reader.ReadBytes(count); + var s = Encoding.ASCII.GetString(bytes); + return s; + } + + /// + /// Read a Pascal string using the specified encoding. + /// + /// Byte multiple that the Pascal string is padded to. + public string ReadPascalString(int padMultiple) + { + var startPosition = reader.BaseStream.Position; + + byte stringLength = ReadByte(); + var bytes = ReadBytes(stringLength); + ReadPadding(startPosition, padMultiple); + + // Default decoder uses best-fit fallback, so it will not throw any + // exceptions if unknown characters are encountered. + var str = encoding.GetString(bytes); + return str; + } + + public string ReadUnicodeString() + { + var numChars = ReadInt32(); + var length = 2 * numChars; + var data = ReadBytes(length); + var str = Encoding.BigEndianUnicode.GetString(data, 0, length); + + return str; + } + + ////////////////////////////////////////////////////////////////// + + #region IDisposable + + private bool disposed = false; + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (disposed) + return; + + if (disposing) + { + if (reader != null) + { + // BinaryReader.Dispose() is protected. + reader.Close(); + reader = null; + } + } + + disposed = true; + } + + #endregion + } +} diff --git a/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs.meta b/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs.meta index 747b9d9..42b28fe 100644 --- a/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs.meta +++ b/Editor/PSDPlugin/PsdFile/PsdBinaryReader.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 9614f1c9b6a2eb5499429bfab13a0c09 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9614f1c9b6a2eb5499429bfab13a0c09 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs b/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs index 8ebbeb9..daeeffc 100644 --- a/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs +++ b/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs @@ -1,52 +1,52 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2012 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace PhotoshopFile -{ - internal static class PsdBlendMode - { - public const string Normal = "norm"; - public const string Darken = "dark"; - public const string Lighten = "lite"; - public const string Hue = "hue "; - public const string Saturation = "sat "; - public const string Color = "colr"; - public const string Luminosity = "lum "; - public const string Multiply = "mul "; - public const string Screen = "scrn"; - public const string Dissolve = "diss"; - public const string Overlay = "over"; - public const string HardLight = "hLit"; - public const string SoftLight = "sLit"; - public const string Difference = "diff"; - public const string Exclusion = "smud"; - public const string ColorDodge = "div "; - public const string ColorBurn = "idiv"; - public const string LinearBurn = "lbrn"; - public const string LinearDodge = "lddg"; - public const string VividLight = "vLit"; - public const string LinearLight = "lLit"; - public const string PinLight = "pLit"; - public const string HardMix = "hMix"; - public const string PassThrough = "pass"; - public const string DarkerColor = "dkCl"; - public const string LighterColor = "lgCl"; - public const string Subtract = "fsub"; - public const string Divide = "fdiv"; - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2012 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PhotoshopFile +{ + internal static class PsdBlendMode + { + public const string Normal = "norm"; + public const string Darken = "dark"; + public const string Lighten = "lite"; + public const string Hue = "hue "; + public const string Saturation = "sat "; + public const string Color = "colr"; + public const string Luminosity = "lum "; + public const string Multiply = "mul "; + public const string Screen = "scrn"; + public const string Dissolve = "diss"; + public const string Overlay = "over"; + public const string HardLight = "hLit"; + public const string SoftLight = "sLit"; + public const string Difference = "diff"; + public const string Exclusion = "smud"; + public const string ColorDodge = "div "; + public const string ColorBurn = "idiv"; + public const string LinearBurn = "lbrn"; + public const string LinearDodge = "lddg"; + public const string VividLight = "vLit"; + public const string LinearLight = "lLit"; + public const string PinLight = "pLit"; + public const string HardMix = "hMix"; + public const string PassThrough = "pass"; + public const string DarkerColor = "dkCl"; + public const string LighterColor = "lgCl"; + public const string Subtract = "fsub"; + public const string Divide = "fdiv"; + } +} diff --git a/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs.meta b/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs.meta index 3352bf5..222bcbc 100644 --- a/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs.meta +++ b/Editor/PSDPlugin/PsdFile/PsdBlendMode.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: c4e78ec955914854d9c9c68fa7af1742 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: c4e78ec955914854d9c9c68fa7af1742 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/PsdFile.cs b/Editor/PSDPlugin/PsdFile/PsdFile.cs index 8092b4a..9e46e43 100644 --- a/Editor/PSDPlugin/PsdFile/PsdFile.cs +++ b/Editor/PSDPlugin/PsdFile/PsdFile.cs @@ -1,708 +1,708 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using PDNWrapper; -using System.IO; -using System.Linq; -using System.Text; -using PaintDotNet.Data.PhotoshopFileType; - -namespace PhotoshopFile -{ - [Flags] - internal enum ELoadFlag - { - Header = 1, - ColorMode = Header | 1 << 2, - ImageData = ColorMode | 1 << 3, - All = Header | ColorMode | ImageData - } - - - internal enum PsdColorMode - { - Bitmap = 0, - Grayscale = 1, - Indexed = 2, - RGB = 3, - CMYK = 4, - Multichannel = 7, - Duotone = 8, - Lab = 9 - }; - - internal enum PsdFileVersion : short - { - Psd = 1, - PsbLargeDocument = 2 - } - - internal class PsdFile - { - #region Constructors - - ELoadFlag m_LoadFlag; - - public PsdFile(PsdFileVersion version = PsdFileVersion.Psd) - { - Version = version; - - BaseLayer = new Layer(this); - ImageResources = new ImageResources(); - Layers = new List(); - AdditionalInfo = new List(); - } - - public PsdFile(string filename, LoadContext loadContext, ELoadFlag loadFlag = ELoadFlag.All) - : this() - { - using (var stream = new FileStream(filename, FileMode.Open)) - { - Load(stream, loadContext, loadFlag); - } - } - - public PsdFile(Stream stream, LoadContext loadContext, ELoadFlag loadFlag = ELoadFlag.All) - : this() - { - Load(stream, loadContext, loadFlag); - } - - #endregion - - #region Load and save - - internal LoadContext LoadContext { get; private set; } - - private void Load(Stream stream, LoadContext loadContext, ELoadFlag loadFlag) - { - LoadContext = loadContext; - var reader = new PsdBinaryReader(stream, loadContext.Encoding); - - if ((loadFlag & ELoadFlag.Header) == ELoadFlag.Header) - LoadHeader(reader); - - if ((loadFlag & ELoadFlag.ColorMode) == ELoadFlag.ColorMode) - LoadColorModeData(reader); - - if ((loadFlag & ELoadFlag.ImageData) == ELoadFlag.ImageData) - { - LoadImageResources(reader); - LoadLayerAndMaskInfo(reader); - - LoadImage(reader); - DecompressImages(); - } - } - - #endregion - - #region Header - - /// - /// Photoshop file format version. - /// - public PsdFileVersion Version { get; private set; } - - public bool IsLargeDocument - { - get { return Version == PsdFileVersion.PsbLargeDocument; } - } - - private Int16 channelCount; - /// - /// The number of channels in the image, including any alpha channels. - /// - public Int16 ChannelCount - { - get { return channelCount; } - set - { - if (value < 1 || value > 56) - throw new ArgumentException("Number of channels must be from 1 to 56."); - channelCount = value; - } - } - - private void CheckDimension(int dimension) - { - if (dimension < 1) - { - throw new ArgumentException("Image dimension must be at least 1."); - } - if ((Version == PsdFileVersion.Psd) && (dimension > 30000)) - { - throw new ArgumentException("PSD image dimension cannot exceed 30000."); - } - if ((Version == PsdFileVersion.PsbLargeDocument) && (dimension > 300000)) - { - throw new ArgumentException("PSB image dimension cannot exceed 300000."); - } - } - - /// - /// The height of the image in pixels. - /// - public int RowCount - { - get { return this.BaseLayer.Rect.Height; } - set - { - CheckDimension(value); - BaseLayer.Rect = new Rectangle(0, 0, BaseLayer.Rect.Width, value); - } - } - - - /// - /// The width of the image in pixels. - /// - public int ColumnCount - { - get { return this.BaseLayer.Rect.Width; } - set - { - CheckDimension(value); - BaseLayer.Rect = new Rectangle(0, 0, value, BaseLayer.Rect.Height); - } - } - - private int bitDepth; - /// - /// The number of bits per channel. Supported values are 1, 8, 16, and 32. - /// - public int BitDepth - { - get { return bitDepth; } - set - { - switch (value) - { - case 1: - case 8: - case 16: - case 32: - bitDepth = value; - break; - default: - throw new NotImplementedException("Invalid bit depth."); - } - } - } - - /// - /// The color mode of the file. - /// - public PsdColorMode ColorMode { get; set; } - - /////////////////////////////////////////////////////////////////////////// - - private void LoadHeader(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, File header"); - - var signature = reader.ReadAsciiChars(4); - if (signature != "8BPS") - throw new PsdInvalidException("The given stream is not a valid PSD file"); - - Version = (PsdFileVersion)reader.ReadInt16(); - Util.DebugMessage(reader.BaseStream, "Load, Info, Version {0}", (int)Version); - if ((Version != PsdFileVersion.Psd) - && (Version != PsdFileVersion.PsbLargeDocument)) - { - throw new PsdInvalidException("The PSD file has an unknown version"); - } - - //6 bytes reserved - reader.BaseStream.Position += 6; - - this.ChannelCount = reader.ReadInt16(); - this.RowCount = reader.ReadInt32(); - this.ColumnCount = reader.ReadInt32(); - BitDepth = reader.ReadInt16(); - ColorMode = (PsdColorMode)reader.ReadInt16(); - - Util.DebugMessage(reader.BaseStream, "Load, End, File header"); - } - - #endregion - - /////////////////////////////////////////////////////////////////////////// - - #region ColorModeData - - /// - /// If ColorMode is ColorModes.Indexed, the following 768 bytes will contain - /// a 256-color palette. If the ColorMode is ColorModes.Duotone, the data - /// following presumably consists of screen parameters and other related information. - /// Unfortunately, it is intentionally not documented by Adobe, and non-Photoshop - /// readers are advised to treat duotone images as gray-scale images. - /// - public byte[] ColorModeData = new byte[0]; - - private void LoadColorModeData(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, ColorModeData"); - - var paletteLength = reader.ReadUInt32(); - if (paletteLength > 0) - { - ColorModeData = reader.ReadBytes((int)paletteLength); - } - - Util.DebugMessage(reader.BaseStream, "Load, End, ColorModeData"); - } - - #endregion - - /////////////////////////////////////////////////////////////////////////// - - #region ImageResources - - /// - /// The Image resource blocks for the file - /// - public ImageResources ImageResources { get; set; } - - public ResolutionInfo Resolution - { - get - { - return (ResolutionInfo)ImageResources.Get(ResourceID.ResolutionInfo); - } - - set - { - ImageResources.Set(value); - } - } - - - /////////////////////////////////////////////////////////////////////////// - - private void LoadImageResources(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, ImageResources"); - - var imageResourcesLength = reader.ReadUInt32(); - if (imageResourcesLength <= 0) - return; - - var startPosition = reader.BaseStream.Position; - var endPosition = startPosition + imageResourcesLength; - while (reader.BaseStream.Position < endPosition) - { - var imageResource = ImageResourceFactory.CreateImageResource(reader); - ImageResources.Add(imageResource); - } - - Util.DebugMessage(reader.BaseStream, "Load, End, ImageResources"); - - //----------------------------------------------------------------------- - // make sure we are not on a wrong offset, so set the stream position - // manually - reader.BaseStream.Position = startPosition + imageResourcesLength; - } - - #endregion - - /////////////////////////////////////////////////////////////////////////// - - #region LayerAndMaskInfo - - public List Layers { get; private set; } - - public List AdditionalInfo { get; private set; } - - public bool AbsoluteAlpha { get; set; } - - /////////////////////////////////////////////////////////////////////////// - - private void LoadLayerAndMaskInfo(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Layer and mask info"); - - var layersAndMaskLength = IsLargeDocument - ? reader.ReadInt64() - : reader.ReadUInt32(); - if (layersAndMaskLength <= 0) - return; - - var startPosition = reader.BaseStream.Position; - var endPosition = startPosition + layersAndMaskLength; - - LoadLayers(reader, true); - LoadGlobalLayerMask(reader); - - //----------------------------------------------------------------------- - // Load Additional Layer Information - - while (reader.BaseStream.Position < endPosition) - { - var info = LayerInfoFactory.Load(reader, this, true, endPosition); - AdditionalInfo.Add(info); - - if (info is RawLayerInfo) - { - var layerInfo = (RawLayerInfo)info; - switch (info.Key) - { - case "LMsk": - m_GlobalLayerMaskData = layerInfo.Data; - break; - } - } - } - - Util.DebugMessage(reader.BaseStream, "Load, End, Layer and mask info"); - - //----------------------------------------------------------------------- - // make sure we are not on a wrong offset, so set the stream position - // manually - reader.BaseStream.Position = startPosition + layersAndMaskLength; - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Load Layers Info section, including image data. - /// - /// PSD reader. - /// Whether the Layers Info section has a length header. - internal void LoadLayers(PsdBinaryReader reader, bool hasHeader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Layers Info section"); - - long sectionLength = 0; - if (hasHeader) - { - sectionLength = IsLargeDocument - ? reader.ReadInt64() - : reader.ReadUInt32(); - - if (sectionLength <= 0) - { - // The callback may take action when there are 0 layers, so it must - // be called even though the Layers Info section is empty. - LoadContext.OnLoadLayersHeader(this); - Util.DebugMessage(reader.BaseStream, "Load, End, Layers Info section"); - return; - } - } - - var startPosition = reader.BaseStream.Position; - var numLayers = reader.ReadInt16(); - - // If numLayers < 0, then number of layers is absolute value, - // and the first alpha channel contains the transparency data for - // the merged result. - if (numLayers < 0) - { - AbsoluteAlpha = true; - numLayers = Math.Abs(numLayers); - } - - for (int i = 0; i < numLayers; i++) - { - var layer = new Layer(reader, this); - Layers.Add(layer); - } - - // Header is complete just before loading pixel data - LoadContext.OnLoadLayersHeader(this); - - //----------------------------------------------------------------------- - - // Load image data for all channels. - foreach (var layer in Layers) - { - Util.DebugMessage(reader.BaseStream, - "Load, Begin, Layer image, layer.Name"); - foreach (var channel in layer.Channels) - { - channel.LoadPixelData(reader); - } - Util.DebugMessage(reader.BaseStream, - "Load, End, Layer image, layer.Name"); - } - - // Length is set to 0 when called on higher bitdepth layers. - if (sectionLength > 0) - { - // Layers Info section is documented to be even-padded, but Photoshop - // actually pads to 4 bytes. - var endPosition = startPosition + sectionLength; - var positionOffset = reader.BaseStream.Position - endPosition; - Debug.Assert(positionOffset > -4, - "LoadLayers did not read the full length of the Layers Info section."); - Debug.Assert(positionOffset <= 0, - "LoadLayers read past the end of the Layers Info section."); - - - if (reader.BaseStream.Position < endPosition) - reader.BaseStream.Position = endPosition; - } - - Util.DebugMessage(reader.BaseStream, "Load, End, Layers"); - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Cleanup - /// - public void Cleanup() - { - var layersAndComposite = Layers.Concat(new[] { BaseLayer }); - - foreach (var lac in layersAndComposite) - { - foreach (var c in lac.Channels) - { - c.Cleanup(); - } - } - } - /////////////////////////////////////////////////////////////////////////// - - /// - /// Decompress the document image data and all the layers' image data, in parallel. - /// - private void DecompressImages() - { - var layersAndComposite = Layers.Concat(new[] { BaseLayer }); - //var channels = layersAndComposite.SelectMany(x => x.Channels); - //Parallel.ForEach(channels, channel => - //{ - // channel.DecodeImageData(); - //}); - foreach (var lac in layersAndComposite) - { - foreach (var c in lac.Channels) - { - c.DecodeImageData(); - } - } - - foreach (var layer in Layers) - { - foreach (var channel in layer.Channels) - { - if (channel.ID == -2) - layer.Masks.LayerMask.ImageData = channel.ImageData; - else if (channel.ID == -3) - layer.Masks.UserMask.ImageData = channel.ImageData; - } - } - } - - /// - /// Verifies that any Additional Info layers are consistent. - /// - private void VerifyInfoLayers() - { - var infoLayersCount = AdditionalInfo.Count(x => x is InfoLayers); - if (infoLayersCount > 1) - { - throw new PsdInvalidException( - "Cannot have more than one InfoLayers in a PSD file."); - } - if ((infoLayersCount > 0) && (Layers.Count == 0)) - { - throw new PsdInvalidException( - "InfoLayers cannot exist when there are 0 layers."); - } - } - - /// - /// Verify validity of layer sections. Each start marker should have a - /// matching end marker. - /// - internal void VerifyLayerSections() - { - int depth = 0; - foreach (var layer in Enumerable.Reverse(Layers)) - { - var layerSectionInfo = layer.AdditionalInfo.SingleOrDefault( - x => x is LayerSectionInfo); - if (layerSectionInfo == null) - continue; - - var sectionInfo = (LayerSectionInfo)layerSectionInfo; - switch (sectionInfo.SectionType) - { - case LayerSectionType.OpenFolder: - case LayerSectionType.ClosedFolder: - depth++; - break; - - case LayerSectionType.SectionDivider: - depth--; - if (depth < 0) - throw new PsdInvalidException("Layer section ended without matching start marker."); - break; - - default: - throw new PsdInvalidException("Unrecognized layer section type."); - } - } - - if (depth != 0) - throw new PsdInvalidException("Layer section not closed by end marker."); - } - - /// - /// Set the VersionInfo resource on the file. - /// - public void SetVersionInfo() - { - var versionInfo = (VersionInfo)ImageResources.Get(ResourceID.VersionInfo); - if (versionInfo == null) - { - versionInfo = new VersionInfo(); - ImageResources.Set(versionInfo); - - // Get the version string. We don't use the fourth part (revision). - var assembly = System.Reflection.Assembly.GetExecutingAssembly(); - var version = assembly.GetName().Version; - var versionString = version.Major + "." + version.Minor + "." + version.Build; - - // Strings are not localized since they are not shown to the user. - versionInfo.Version = 1; - versionInfo.HasRealMergedData = true; - versionInfo.ReaderName = "Paint.NET PSD Plugin"; - versionInfo.WriterName = "Paint.NET PSD Plugin " + versionString; - versionInfo.FileVersion = 1; - } - } - - - /////////////////////////////////////////////////////////////////////////// - - byte[] m_GlobalLayerMaskData; - - private void LoadGlobalLayerMask(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, GlobalLayerMask"); - - var maskLength = reader.ReadUInt32(); - if (maskLength <= 0) - { - Util.DebugMessage(reader.BaseStream, "Load, End, GlobalLayerMask"); - return; - } - - m_GlobalLayerMaskData = reader.ReadBytes((int)maskLength); - - Util.DebugMessage(reader.BaseStream, "Load, End, GlobalLayerMask"); - } - - public byte[] globalLayerMaskData - { - get { return m_GlobalLayerMaskData; } - } - - #endregion - - /////////////////////////////////////////////////////////////////////////// - - #region Composite image - - /// - /// Represents the composite image. - /// - public Layer BaseLayer { get; set; } - - public ImageCompression ImageCompression { get; set; } - - private void LoadImage(PsdBinaryReader reader) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Composite image"); - - ImageCompression = (ImageCompression)reader.ReadInt16(); - - // Create channels - for (Int16 i = 0; i < ChannelCount; i++) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image data"); - - var channel = new Channel(i, this.BaseLayer); - channel.ImageCompression = ImageCompression; - channel.Length = this.RowCount - * Util.BytesPerRow(BaseLayer.Rect.Size, BitDepth); - - // The composite image stores all RLE headers up-front, rather than - // with each channel. - if (ImageCompression == ImageCompression.Rle) - { - channel.RleRowLengths = new RleRowLengths(reader, RowCount, IsLargeDocument); - channel.Length = channel.RleRowLengths.Total; - } - - BaseLayer.Channels.Add(channel); - Util.DebugMessage(reader.BaseStream, "Load, End, Channel image data"); - } - - foreach (var channel in this.BaseLayer.Channels) - { - Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image data"); - Util.CheckByteArrayLength(channel.Length); - channel.ImageDataRaw = reader.ReadBytes((int)channel.Length); - Util.DebugMessage(reader.BaseStream, "Load, End, Channel image data"); - } - - // If there is exactly one more channel than we need, then it is the - // alpha channel. - if ((ColorMode != PsdColorMode.Multichannel) - && (ChannelCount == ColorMode.MinChannelCount() + 1)) - { - var alphaChannel = BaseLayer.Channels.Last(); - alphaChannel.ID = -1; - } - - Util.DebugMessage(reader.BaseStream, "Load, End, Composite image"); - } - - #endregion - } - - - /// - /// The possible Compression methods. - /// - internal enum ImageCompression - { - /// - /// Raw data - /// - Raw = 0, - /// - /// RLE compressed - /// - Rle = 1, - /// - /// ZIP without prediction. - /// - Zip = 2, - /// - /// ZIP with prediction. - /// - ZipPrediction = 3 - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using PDNWrapper; +using System.IO; +using System.Linq; +using System.Text; +using PaintDotNet.Data.PhotoshopFileType; + +namespace PhotoshopFile +{ + [Flags] + internal enum ELoadFlag + { + Header = 1, + ColorMode = Header | 1 << 2, + ImageData = ColorMode | 1 << 3, + All = Header | ColorMode | ImageData + } + + + internal enum PsdColorMode + { + Bitmap = 0, + Grayscale = 1, + Indexed = 2, + RGB = 3, + CMYK = 4, + Multichannel = 7, + Duotone = 8, + Lab = 9 + }; + + internal enum PsdFileVersion : short + { + Psd = 1, + PsbLargeDocument = 2 + } + + internal class PsdFile + { + #region Constructors + + ELoadFlag m_LoadFlag; + + public PsdFile(PsdFileVersion version = PsdFileVersion.Psd) + { + Version = version; + + BaseLayer = new Layer(this); + ImageResources = new ImageResources(); + Layers = new List(); + AdditionalInfo = new List(); + } + + public PsdFile(string filename, LoadContext loadContext, ELoadFlag loadFlag = ELoadFlag.All) + : this() + { + using (var stream = new FileStream(filename, FileMode.Open)) + { + Load(stream, loadContext, loadFlag); + } + } + + public PsdFile(Stream stream, LoadContext loadContext, ELoadFlag loadFlag = ELoadFlag.All) + : this() + { + Load(stream, loadContext, loadFlag); + } + + #endregion + + #region Load and save + + internal LoadContext LoadContext { get; private set; } + + private void Load(Stream stream, LoadContext loadContext, ELoadFlag loadFlag) + { + LoadContext = loadContext; + var reader = new PsdBinaryReader(stream, loadContext.Encoding); + + if ((loadFlag & ELoadFlag.Header) == ELoadFlag.Header) + LoadHeader(reader); + + if ((loadFlag & ELoadFlag.ColorMode) == ELoadFlag.ColorMode) + LoadColorModeData(reader); + + if ((loadFlag & ELoadFlag.ImageData) == ELoadFlag.ImageData) + { + LoadImageResources(reader); + LoadLayerAndMaskInfo(reader); + + LoadImage(reader); + DecompressImages(); + } + } + + #endregion + + #region Header + + /// + /// Photoshop file format version. + /// + public PsdFileVersion Version { get; private set; } + + public bool IsLargeDocument + { + get { return Version == PsdFileVersion.PsbLargeDocument; } + } + + private Int16 channelCount; + /// + /// The number of channels in the image, including any alpha channels. + /// + public Int16 ChannelCount + { + get { return channelCount; } + set + { + if (value < 1 || value > 56) + throw new ArgumentException("Number of channels must be from 1 to 56."); + channelCount = value; + } + } + + private void CheckDimension(int dimension) + { + if (dimension < 1) + { + throw new ArgumentException("Image dimension must be at least 1."); + } + if ((Version == PsdFileVersion.Psd) && (dimension > 30000)) + { + throw new ArgumentException("PSD image dimension cannot exceed 30000."); + } + if ((Version == PsdFileVersion.PsbLargeDocument) && (dimension > 300000)) + { + throw new ArgumentException("PSB image dimension cannot exceed 300000."); + } + } + + /// + /// The height of the image in pixels. + /// + public int RowCount + { + get { return this.BaseLayer.Rect.Height; } + set + { + CheckDimension(value); + BaseLayer.Rect = new Rectangle(0, 0, BaseLayer.Rect.Width, value); + } + } + + + /// + /// The width of the image in pixels. + /// + public int ColumnCount + { + get { return this.BaseLayer.Rect.Width; } + set + { + CheckDimension(value); + BaseLayer.Rect = new Rectangle(0, 0, value, BaseLayer.Rect.Height); + } + } + + private int bitDepth; + /// + /// The number of bits per channel. Supported values are 1, 8, 16, and 32. + /// + public int BitDepth + { + get { return bitDepth; } + set + { + switch (value) + { + case 1: + case 8: + case 16: + case 32: + bitDepth = value; + break; + default: + throw new NotImplementedException("Invalid bit depth."); + } + } + } + + /// + /// The color mode of the file. + /// + public PsdColorMode ColorMode { get; set; } + + /////////////////////////////////////////////////////////////////////////// + + private void LoadHeader(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, File header"); + + var signature = reader.ReadAsciiChars(4); + if (signature != "8BPS") + throw new PsdInvalidException("The given stream is not a valid PSD file"); + + Version = (PsdFileVersion)reader.ReadInt16(); + Util.DebugMessage(reader.BaseStream, "Load, Info, Version {0}", (int)Version); + if ((Version != PsdFileVersion.Psd) + && (Version != PsdFileVersion.PsbLargeDocument)) + { + throw new PsdInvalidException("The PSD file has an unknown version"); + } + + //6 bytes reserved + reader.BaseStream.Position += 6; + + this.ChannelCount = reader.ReadInt16(); + this.RowCount = reader.ReadInt32(); + this.ColumnCount = reader.ReadInt32(); + BitDepth = reader.ReadInt16(); + ColorMode = (PsdColorMode)reader.ReadInt16(); + + Util.DebugMessage(reader.BaseStream, "Load, End, File header"); + } + + #endregion + + /////////////////////////////////////////////////////////////////////////// + + #region ColorModeData + + /// + /// If ColorMode is ColorModes.Indexed, the following 768 bytes will contain + /// a 256-color palette. If the ColorMode is ColorModes.Duotone, the data + /// following presumably consists of screen parameters and other related information. + /// Unfortunately, it is intentionally not documented by Adobe, and non-Photoshop + /// readers are advised to treat duotone images as gray-scale images. + /// + public byte[] ColorModeData = new byte[0]; + + private void LoadColorModeData(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, ColorModeData"); + + var paletteLength = reader.ReadUInt32(); + if (paletteLength > 0) + { + ColorModeData = reader.ReadBytes((int)paletteLength); + } + + Util.DebugMessage(reader.BaseStream, "Load, End, ColorModeData"); + } + + #endregion + + /////////////////////////////////////////////////////////////////////////// + + #region ImageResources + + /// + /// The Image resource blocks for the file + /// + public ImageResources ImageResources { get; set; } + + public ResolutionInfo Resolution + { + get + { + return (ResolutionInfo)ImageResources.Get(ResourceID.ResolutionInfo); + } + + set + { + ImageResources.Set(value); + } + } + + + /////////////////////////////////////////////////////////////////////////// + + private void LoadImageResources(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, ImageResources"); + + var imageResourcesLength = reader.ReadUInt32(); + if (imageResourcesLength <= 0) + return; + + var startPosition = reader.BaseStream.Position; + var endPosition = startPosition + imageResourcesLength; + while (reader.BaseStream.Position < endPosition) + { + var imageResource = ImageResourceFactory.CreateImageResource(reader); + ImageResources.Add(imageResource); + } + + Util.DebugMessage(reader.BaseStream, "Load, End, ImageResources"); + + //----------------------------------------------------------------------- + // make sure we are not on a wrong offset, so set the stream position + // manually + reader.BaseStream.Position = startPosition + imageResourcesLength; + } + + #endregion + + /////////////////////////////////////////////////////////////////////////// + + #region LayerAndMaskInfo + + public List Layers { get; private set; } + + public List AdditionalInfo { get; private set; } + + public bool AbsoluteAlpha { get; set; } + + /////////////////////////////////////////////////////////////////////////// + + private void LoadLayerAndMaskInfo(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Layer and mask info"); + + var layersAndMaskLength = IsLargeDocument + ? reader.ReadInt64() + : reader.ReadUInt32(); + if (layersAndMaskLength <= 0) + return; + + var startPosition = reader.BaseStream.Position; + var endPosition = startPosition + layersAndMaskLength; + + LoadLayers(reader, true); + LoadGlobalLayerMask(reader); + + //----------------------------------------------------------------------- + // Load Additional Layer Information + + while (reader.BaseStream.Position < endPosition) + { + var info = LayerInfoFactory.Load(reader, this, true, endPosition); + AdditionalInfo.Add(info); + + if (info is RawLayerInfo) + { + var layerInfo = (RawLayerInfo)info; + switch (info.Key) + { + case "LMsk": + m_GlobalLayerMaskData = layerInfo.Data; + break; + } + } + } + + Util.DebugMessage(reader.BaseStream, "Load, End, Layer and mask info"); + + //----------------------------------------------------------------------- + // make sure we are not on a wrong offset, so set the stream position + // manually + reader.BaseStream.Position = startPosition + layersAndMaskLength; + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Load Layers Info section, including image data. + /// + /// PSD reader. + /// Whether the Layers Info section has a length header. + internal void LoadLayers(PsdBinaryReader reader, bool hasHeader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Layers Info section"); + + long sectionLength = 0; + if (hasHeader) + { + sectionLength = IsLargeDocument + ? reader.ReadInt64() + : reader.ReadUInt32(); + + if (sectionLength <= 0) + { + // The callback may take action when there are 0 layers, so it must + // be called even though the Layers Info section is empty. + LoadContext.OnLoadLayersHeader(this); + Util.DebugMessage(reader.BaseStream, "Load, End, Layers Info section"); + return; + } + } + + var startPosition = reader.BaseStream.Position; + var numLayers = reader.ReadInt16(); + + // If numLayers < 0, then number of layers is absolute value, + // and the first alpha channel contains the transparency data for + // the merged result. + if (numLayers < 0) + { + AbsoluteAlpha = true; + numLayers = Math.Abs(numLayers); + } + + for (int i = 0; i < numLayers; i++) + { + var layer = new Layer(reader, this); + Layers.Add(layer); + } + + // Header is complete just before loading pixel data + LoadContext.OnLoadLayersHeader(this); + + //----------------------------------------------------------------------- + + // Load image data for all channels. + foreach (var layer in Layers) + { + Util.DebugMessage(reader.BaseStream, + "Load, Begin, Layer image, layer.Name"); + foreach (var channel in layer.Channels) + { + channel.LoadPixelData(reader); + } + Util.DebugMessage(reader.BaseStream, + "Load, End, Layer image, layer.Name"); + } + + // Length is set to 0 when called on higher bitdepth layers. + if (sectionLength > 0) + { + // Layers Info section is documented to be even-padded, but Photoshop + // actually pads to 4 bytes. + var endPosition = startPosition + sectionLength; + var positionOffset = reader.BaseStream.Position - endPosition; + Debug.Assert(positionOffset > -4, + "LoadLayers did not read the full length of the Layers Info section."); + Debug.Assert(positionOffset <= 0, + "LoadLayers read past the end of the Layers Info section."); + + + if (reader.BaseStream.Position < endPosition) + reader.BaseStream.Position = endPosition; + } + + Util.DebugMessage(reader.BaseStream, "Load, End, Layers"); + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Cleanup + /// + public void Cleanup() + { + var layersAndComposite = Layers.Concat(new[] { BaseLayer }); + + foreach (var lac in layersAndComposite) + { + foreach (var c in lac.Channels) + { + c.Cleanup(); + } + } + } + /////////////////////////////////////////////////////////////////////////// + + /// + /// Decompress the document image data and all the layers' image data, in parallel. + /// + private void DecompressImages() + { + var layersAndComposite = Layers.Concat(new[] { BaseLayer }); + //var channels = layersAndComposite.SelectMany(x => x.Channels); + //Parallel.ForEach(channels, channel => + //{ + // channel.DecodeImageData(); + //}); + foreach (var lac in layersAndComposite) + { + foreach (var c in lac.Channels) + { + c.DecodeImageData(); + } + } + + foreach (var layer in Layers) + { + foreach (var channel in layer.Channels) + { + if (channel.ID == -2) + layer.Masks.LayerMask.ImageData = channel.ImageData; + else if (channel.ID == -3) + layer.Masks.UserMask.ImageData = channel.ImageData; + } + } + } + + /// + /// Verifies that any Additional Info layers are consistent. + /// + private void VerifyInfoLayers() + { + var infoLayersCount = AdditionalInfo.Count(x => x is InfoLayers); + if (infoLayersCount > 1) + { + throw new PsdInvalidException( + "Cannot have more than one InfoLayers in a PSD file."); + } + if ((infoLayersCount > 0) && (Layers.Count == 0)) + { + throw new PsdInvalidException( + "InfoLayers cannot exist when there are 0 layers."); + } + } + + /// + /// Verify validity of layer sections. Each start marker should have a + /// matching end marker. + /// + internal void VerifyLayerSections() + { + int depth = 0; + foreach (var layer in Enumerable.Reverse(Layers)) + { + var layerSectionInfo = layer.AdditionalInfo.SingleOrDefault( + x => x is LayerSectionInfo); + if (layerSectionInfo == null) + continue; + + var sectionInfo = (LayerSectionInfo)layerSectionInfo; + switch (sectionInfo.SectionType) + { + case LayerSectionType.OpenFolder: + case LayerSectionType.ClosedFolder: + depth++; + break; + + case LayerSectionType.SectionDivider: + depth--; + if (depth < 0) + throw new PsdInvalidException("Layer section ended without matching start marker."); + break; + + default: + throw new PsdInvalidException("Unrecognized layer section type."); + } + } + + if (depth != 0) + throw new PsdInvalidException("Layer section not closed by end marker."); + } + + /// + /// Set the VersionInfo resource on the file. + /// + public void SetVersionInfo() + { + var versionInfo = (VersionInfo)ImageResources.Get(ResourceID.VersionInfo); + if (versionInfo == null) + { + versionInfo = new VersionInfo(); + ImageResources.Set(versionInfo); + + // Get the version string. We don't use the fourth part (revision). + var assembly = System.Reflection.Assembly.GetExecutingAssembly(); + var version = assembly.GetName().Version; + var versionString = version.Major + "." + version.Minor + "." + version.Build; + + // Strings are not localized since they are not shown to the user. + versionInfo.Version = 1; + versionInfo.HasRealMergedData = true; + versionInfo.ReaderName = "Paint.NET PSD Plugin"; + versionInfo.WriterName = "Paint.NET PSD Plugin " + versionString; + versionInfo.FileVersion = 1; + } + } + + + /////////////////////////////////////////////////////////////////////////// + + byte[] m_GlobalLayerMaskData; + + private void LoadGlobalLayerMask(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, GlobalLayerMask"); + + var maskLength = reader.ReadUInt32(); + if (maskLength <= 0) + { + Util.DebugMessage(reader.BaseStream, "Load, End, GlobalLayerMask"); + return; + } + + m_GlobalLayerMaskData = reader.ReadBytes((int)maskLength); + + Util.DebugMessage(reader.BaseStream, "Load, End, GlobalLayerMask"); + } + + public byte[] globalLayerMaskData + { + get { return m_GlobalLayerMaskData; } + } + + #endregion + + /////////////////////////////////////////////////////////////////////////// + + #region Composite image + + /// + /// Represents the composite image. + /// + public Layer BaseLayer { get; set; } + + public ImageCompression ImageCompression { get; set; } + + private void LoadImage(PsdBinaryReader reader) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Composite image"); + + ImageCompression = (ImageCompression)reader.ReadInt16(); + + // Create channels + for (Int16 i = 0; i < ChannelCount; i++) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image data"); + + var channel = new Channel(i, this.BaseLayer); + channel.ImageCompression = ImageCompression; + channel.Length = this.RowCount + * Util.BytesPerRow(BaseLayer.Rect.Size, BitDepth); + + // The composite image stores all RLE headers up-front, rather than + // with each channel. + if (ImageCompression == ImageCompression.Rle) + { + channel.RleRowLengths = new RleRowLengths(reader, RowCount, IsLargeDocument); + channel.Length = channel.RleRowLengths.Total; + } + + BaseLayer.Channels.Add(channel); + Util.DebugMessage(reader.BaseStream, "Load, End, Channel image data"); + } + + foreach (var channel in this.BaseLayer.Channels) + { + Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image data"); + Util.CheckByteArrayLength(channel.Length); + channel.ImageDataRaw = reader.ReadBytes((int)channel.Length); + Util.DebugMessage(reader.BaseStream, "Load, End, Channel image data"); + } + + // If there is exactly one more channel than we need, then it is the + // alpha channel. + if ((ColorMode != PsdColorMode.Multichannel) + && (ChannelCount == ColorMode.MinChannelCount() + 1)) + { + var alphaChannel = BaseLayer.Channels.Last(); + alphaChannel.ID = -1; + } + + Util.DebugMessage(reader.BaseStream, "Load, End, Composite image"); + } + + #endregion + } + + + /// + /// The possible Compression methods. + /// + internal enum ImageCompression + { + /// + /// Raw data + /// + Raw = 0, + /// + /// RLE compressed + /// + Rle = 1, + /// + /// ZIP without prediction. + /// + Zip = 2, + /// + /// ZIP with prediction. + /// + ZipPrediction = 3 + } +} diff --git a/Editor/PSDPlugin/PsdFile/PsdFile.cs.meta b/Editor/PSDPlugin/PsdFile/PsdFile.cs.meta index 1a2cffa..73bfbb3 100644 --- a/Editor/PSDPlugin/PsdFile/PsdFile.cs.meta +++ b/Editor/PSDPlugin/PsdFile/PsdFile.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 3de656e186ce0704e8676716fcaf733f -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3de656e186ce0704e8676716fcaf733f +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/RleReader.cs b/Editor/PSDPlugin/PsdFile/RleReader.cs index 67f9725..008d3be 100644 --- a/Editor/PSDPlugin/PsdFile/RleReader.cs +++ b/Editor/PSDPlugin/PsdFile/RleReader.cs @@ -1,106 +1,106 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2013 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; -using System.IO; - - -namespace PhotoshopFile -{ - internal class RleReader - { - private Stream stream; - - public RleReader(Stream stream) - { - this.stream = stream; - } - - /// - /// Decodes a PackBits RLE stream. - /// - /// Output buffer for decoded data. - /// Offset at which to begin writing. - /// Number of bytes to decode from the stream. - public int Read(byte[] buffer, int offset, int count) - { - if (!Util.CheckBufferBounds(buffer, offset, count)) - throw new ArgumentOutOfRangeException(); - - // Pin the entire buffer now, so that we don't keep pinning and unpinning - // for each RLE packet. - var ptrBuffer = buffer; - //fixed (byte* ptrBuffer = &buffer[0]) - { - int bytesLeft = count; - int bufferIdx = offset; - while (bytesLeft > 0) - { - // ReadByte returns an unsigned byte, but we want a signed byte. - var flagCounter = unchecked((sbyte)stream.ReadByte()); - - // Raw packet - if (flagCounter > 0) - { - var readLength = flagCounter + 1; - if (bytesLeft < readLength) - throw new RleException("Raw packet overruns the decode window."); - - stream.Read(buffer, bufferIdx, readLength); - - bufferIdx += readLength; - bytesLeft -= readLength; - } - // RLE packet - else if (flagCounter > -128) - { - var runLength = 1 - flagCounter; - var byteValue = (byte)stream.ReadByte(); - if (runLength > bytesLeft) - throw new RleException("RLE packet overruns the decode window."); - - //byte* ptr = ptrBuffer + bufferIdx; - //byte* ptrEnd = ptr + runLength; - //while (ptr < ptrEnd) - //{ - // *ptr = byteValue; - // ptr++; - //} - - int start = 0; - while (start < runLength) - { - ptrBuffer[bufferIdx + start] = byteValue; - start++; - } - - bufferIdx += runLength; - bytesLeft -= runLength; - } - else - { - // The canonical PackBits algorithm will never emit 0x80 (-128), but - // some programs do. Simply skip over the byte. - } - } - - Debug.Assert(bytesLeft == 0); - return count - bytesLeft; - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2013 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; +using System.IO; + + +namespace PhotoshopFile +{ + internal class RleReader + { + private Stream stream; + + public RleReader(Stream stream) + { + this.stream = stream; + } + + /// + /// Decodes a PackBits RLE stream. + /// + /// Output buffer for decoded data. + /// Offset at which to begin writing. + /// Number of bytes to decode from the stream. + public int Read(byte[] buffer, int offset, int count) + { + if (!Util.CheckBufferBounds(buffer, offset, count)) + throw new ArgumentOutOfRangeException(); + + // Pin the entire buffer now, so that we don't keep pinning and unpinning + // for each RLE packet. + var ptrBuffer = buffer; + //fixed (byte* ptrBuffer = &buffer[0]) + { + int bytesLeft = count; + int bufferIdx = offset; + while (bytesLeft > 0) + { + // ReadByte returns an unsigned byte, but we want a signed byte. + var flagCounter = unchecked((sbyte)stream.ReadByte()); + + // Raw packet + if (flagCounter > 0) + { + var readLength = flagCounter + 1; + if (bytesLeft < readLength) + throw new RleException("Raw packet overruns the decode window."); + + stream.Read(buffer, bufferIdx, readLength); + + bufferIdx += readLength; + bytesLeft -= readLength; + } + // RLE packet + else if (flagCounter > -128) + { + var runLength = 1 - flagCounter; + var byteValue = (byte)stream.ReadByte(); + if (runLength > bytesLeft) + throw new RleException("RLE packet overruns the decode window."); + + //byte* ptr = ptrBuffer + bufferIdx; + //byte* ptrEnd = ptr + runLength; + //while (ptr < ptrEnd) + //{ + // *ptr = byteValue; + // ptr++; + //} + + int start = 0; + while (start < runLength) + { + ptrBuffer[bufferIdx + start] = byteValue; + start++; + } + + bufferIdx += runLength; + bytesLeft -= runLength; + } + else + { + // The canonical PackBits algorithm will never emit 0x80 (-128), but + // some programs do. Simply skip over the byte. + } + } + + Debug.Assert(bytesLeft == 0); + return count - bytesLeft; + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/RleReader.cs.meta b/Editor/PSDPlugin/PsdFile/RleReader.cs.meta index eb7a81b..01cfc72 100644 --- a/Editor/PSDPlugin/PsdFile/RleReader.cs.meta +++ b/Editor/PSDPlugin/PsdFile/RleReader.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: f9404b28690a74b4f918e7006968dd80 -timeCreated: 1495006554 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: f9404b28690a74b4f918e7006968dd80 +timeCreated: 1495006554 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/RleRowLengths.cs b/Editor/PSDPlugin/PsdFile/RleRowLengths.cs index 57dbb0f..4ef6c37 100644 --- a/Editor/PSDPlugin/PsdFile/RleRowLengths.cs +++ b/Editor/PSDPlugin/PsdFile/RleRowLengths.cs @@ -1,50 +1,50 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2014 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Linq; - -namespace PhotoshopFile -{ - internal class RleRowLengths - { - public int[] Values { get; private set; } - - public long Total - { - get { return Values.Sum(x => (long)x); } - } - - public int this[int i] - { - get { return Values[i]; } - set { Values[i] = value; } - } - - public RleRowLengths(int rowCount) - { - Values = new int[rowCount]; - } - - public RleRowLengths(PsdBinaryReader reader, int rowCount, bool isLargeDocument) - : this(rowCount) - { - for (int i = 0; i < rowCount; i++) - { - Values[i] = isLargeDocument - ? reader.ReadInt32() - : reader.ReadUInt16(); - } - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2014 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Linq; + +namespace PhotoshopFile +{ + internal class RleRowLengths + { + public int[] Values { get; private set; } + + public long Total + { + get { return Values.Sum(x => (long)x); } + } + + public int this[int i] + { + get { return Values[i]; } + set { Values[i] = value; } + } + + public RleRowLengths(int rowCount) + { + Values = new int[rowCount]; + } + + public RleRowLengths(PsdBinaryReader reader, int rowCount, bool isLargeDocument) + : this(rowCount) + { + for (int i = 0; i < rowCount; i++) + { + Values[i] = isLargeDocument + ? reader.ReadInt32() + : reader.ReadUInt16(); + } + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/RleRowLengths.cs.meta b/Editor/PSDPlugin/PsdFile/RleRowLengths.cs.meta index 36bebe0..a063a83 100644 --- a/Editor/PSDPlugin/PsdFile/RleRowLengths.cs.meta +++ b/Editor/PSDPlugin/PsdFile/RleRowLengths.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: ef0d2c47c58545249b479bc1706d89b7 -timeCreated: 1495006554 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ef0d2c47c58545249b479bc1706d89b7 +timeCreated: 1495006554 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/RleWriter.cs b/Editor/PSDPlugin/PsdFile/RleWriter.cs index f53a768..11486fa 100644 --- a/Editor/PSDPlugin/PsdFile/RleWriter.cs +++ b/Editor/PSDPlugin/PsdFile/RleWriter.cs @@ -1,230 +1,230 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2015 Tao Yue -// -// Portions of this file are provided under the BSD 3-clause License: -// Copyright (c) 2006, Jonas Beckeman -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Diagnostics; -using System.IO; -using UnityEngine.Assertions; - -namespace PhotoshopFile -{ - internal class RleWriter - { - private int maxPacketLength = 128; - - // Current task - private object rleLock; - private Stream stream; - private byte[] data; - private int offset; - - // Current packet - private bool isRepeatPacket; - private int idxPacketStart; - private int packetLength; - - private byte runValue; - private int runLength; - - public RleWriter(Stream stream) - { - rleLock = new object(); - this.stream = stream; - } - - /// - /// Encodes byte data using PackBits RLE compression. - /// - /// Raw data to be encoded. - /// Offset at which to begin transferring data. - /// Number of bytes of data to transfer. - /// Number of compressed bytes written to the stream. - /// - /// There are multiple ways to encode two-byte runs: - /// 1. Apple PackBits only encodes three-byte runs as repeats. - /// 2. Adobe Photoshop encodes two-byte runs as repeats, unless preceded - /// by literals. - /// 3. TIFF PackBits recommends that two-byte runs be encoded as repeats, - /// unless preceded *and* followed by literals. - /// - /// This class adopts the Photoshop behavior, as it has slightly better - /// compression efficiency than Apple PackBits, and is easier to implement - /// than TIFF PackBits. - /// - public int Write(byte[] data, int offset, int count) - { - if (!Util.CheckBufferBounds(data, offset, count)) - throw new ArgumentOutOfRangeException(); - - // We cannot encode a count of 0, because the PackBits flag-counter byte - // uses 0 to indicate a length of 1. - if (count == 0) - { - throw new ArgumentOutOfRangeException("count"); - } - - lock (rleLock) - { - var startPosition = stream.Position; - - this.data = data; - this.offset = offset; - //fixed (byte* ptrData = &data[0]) - { - //byte* ptr = ptrData + offset; - //byte* ptrEnd = ptr + count; - //var bytesEncoded = EncodeToStream(ptr, ptrEnd); - //Debug.Assert(bytesEncoded == count, "Encoded byte count should match the argument."); - var bytesEncoded = EncodeToStream(data, offset, offset + count); - Assert.AreEqual(bytesEncoded, count, "Encoded byte count should match the argument."); - } - - return (int)(stream.Position - startPosition); - } - } - - private void ClearPacket() - { - this.isRepeatPacket = false; - this.packetLength = 0; - } - - private void WriteRepeatPacket(int length) - { - var header = unchecked((byte)(1 - length)); - stream.WriteByte(header); - stream.WriteByte(runValue); - } - - private void WriteLiteralPacket(int length) - { - var header = unchecked((byte)(length - 1)); - stream.WriteByte(header); - stream.Write(data, idxPacketStart, length); - } - - private void WritePacket() - { - if (isRepeatPacket) - WriteRepeatPacket(packetLength); - else - WriteLiteralPacket(packetLength); - } - - private void StartPacket(int count, - bool isRepeatPacket, int runLength, byte value) - { - this.isRepeatPacket = isRepeatPacket; - - this.packetLength = runLength; - this.runLength = runLength; - this.runValue = value; - - this.idxPacketStart = offset + count; - } - - private void ExtendPacketAndRun(byte value) - { - packetLength++; - runLength++; - } - - private void ExtendPacketStartNewRun(byte value) - { - packetLength++; - runLength = 1; - runValue = value; - } - - private int EncodeToStream(byte[] ptr, int start, int end /*byte* ptr, byte* ptrEnd*/) - { - // Begin the first packet. - StartPacket(0, false, 1, ptr[start]); - int numBytesEncoded = 1; - start++; - - // Loop invariant: Packet is never empty. - while (start < end) - { - var value = ptr[start]; - - if (packetLength == 1) - { - isRepeatPacket = (value == runValue); - if (isRepeatPacket) - ExtendPacketAndRun(value); - else - ExtendPacketStartNewRun(value); - } - else if (packetLength == maxPacketLength) - { - // Packet is full, so write it out and start a new one. - WritePacket(); - StartPacket(numBytesEncoded, false, 1, value); - } - else if (isRepeatPacket) - { - // Decide whether to continue the repeat packet. - if (value == runValue) - ExtendPacketAndRun(value); - else - { - // Different color, so terminate the run and start a new packet. - WriteRepeatPacket(packetLength); - StartPacket(numBytesEncoded, false, 1, value); - } - } - else - { - // Decide whether to continue the literal packet. - if (value == runValue) - { - ExtendPacketAndRun(value); - - // A 3-byte run terminates the literal and starts a new repeat - // packet. That's because the 3-byte run can be encoded as a - // 2-byte repeat. So even if the run ends at 3, we've already - // paid for the next flag-counter byte. - if (runLength == 3) - { - // The 3-byte run can come in the middle of a literal packet, - // but not at the beginning. The first 2 bytes of the run - // should've triggered a repeat packet. - Debug.Assert(packetLength > 3); - - // -2 because numBytesEncoded has not yet been incremented - WriteLiteralPacket(packetLength - 3); - StartPacket(numBytesEncoded - 2, true, 3, value); - } - } - else - { - ExtendPacketStartNewRun(value); - } - } - - start++; - numBytesEncoded++; - } - - // Loop terminates with a non-empty packet waiting to be written out. - WritePacket(); - ClearPacket(); - - return numBytesEncoded; - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2015 Tao Yue +// +// Portions of this file are provided under the BSD 3-clause License: +// Copyright (c) 2006, Jonas Beckeman +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Diagnostics; +using System.IO; +using UnityEngine.Assertions; + +namespace PhotoshopFile +{ + internal class RleWriter + { + private int maxPacketLength = 128; + + // Current task + private object rleLock; + private Stream stream; + private byte[] data; + private int offset; + + // Current packet + private bool isRepeatPacket; + private int idxPacketStart; + private int packetLength; + + private byte runValue; + private int runLength; + + public RleWriter(Stream stream) + { + rleLock = new object(); + this.stream = stream; + } + + /// + /// Encodes byte data using PackBits RLE compression. + /// + /// Raw data to be encoded. + /// Offset at which to begin transferring data. + /// Number of bytes of data to transfer. + /// Number of compressed bytes written to the stream. + /// + /// There are multiple ways to encode two-byte runs: + /// 1. Apple PackBits only encodes three-byte runs as repeats. + /// 2. Adobe Photoshop encodes two-byte runs as repeats, unless preceded + /// by literals. + /// 3. TIFF PackBits recommends that two-byte runs be encoded as repeats, + /// unless preceded *and* followed by literals. + /// + /// This class adopts the Photoshop behavior, as it has slightly better + /// compression efficiency than Apple PackBits, and is easier to implement + /// than TIFF PackBits. + /// + public int Write(byte[] data, int offset, int count) + { + if (!Util.CheckBufferBounds(data, offset, count)) + throw new ArgumentOutOfRangeException(); + + // We cannot encode a count of 0, because the PackBits flag-counter byte + // uses 0 to indicate a length of 1. + if (count == 0) + { + throw new ArgumentOutOfRangeException("count"); + } + + lock (rleLock) + { + var startPosition = stream.Position; + + this.data = data; + this.offset = offset; + //fixed (byte* ptrData = &data[0]) + { + //byte* ptr = ptrData + offset; + //byte* ptrEnd = ptr + count; + //var bytesEncoded = EncodeToStream(ptr, ptrEnd); + //Debug.Assert(bytesEncoded == count, "Encoded byte count should match the argument."); + var bytesEncoded = EncodeToStream(data, offset, offset + count); + Assert.AreEqual(bytesEncoded, count, "Encoded byte count should match the argument."); + } + + return (int)(stream.Position - startPosition); + } + } + + private void ClearPacket() + { + this.isRepeatPacket = false; + this.packetLength = 0; + } + + private void WriteRepeatPacket(int length) + { + var header = unchecked((byte)(1 - length)); + stream.WriteByte(header); + stream.WriteByte(runValue); + } + + private void WriteLiteralPacket(int length) + { + var header = unchecked((byte)(length - 1)); + stream.WriteByte(header); + stream.Write(data, idxPacketStart, length); + } + + private void WritePacket() + { + if (isRepeatPacket) + WriteRepeatPacket(packetLength); + else + WriteLiteralPacket(packetLength); + } + + private void StartPacket(int count, + bool isRepeatPacket, int runLength, byte value) + { + this.isRepeatPacket = isRepeatPacket; + + this.packetLength = runLength; + this.runLength = runLength; + this.runValue = value; + + this.idxPacketStart = offset + count; + } + + private void ExtendPacketAndRun(byte value) + { + packetLength++; + runLength++; + } + + private void ExtendPacketStartNewRun(byte value) + { + packetLength++; + runLength = 1; + runValue = value; + } + + private int EncodeToStream(byte[] ptr, int start, int end /*byte* ptr, byte* ptrEnd*/) + { + // Begin the first packet. + StartPacket(0, false, 1, ptr[start]); + int numBytesEncoded = 1; + start++; + + // Loop invariant: Packet is never empty. + while (start < end) + { + var value = ptr[start]; + + if (packetLength == 1) + { + isRepeatPacket = (value == runValue); + if (isRepeatPacket) + ExtendPacketAndRun(value); + else + ExtendPacketStartNewRun(value); + } + else if (packetLength == maxPacketLength) + { + // Packet is full, so write it out and start a new one. + WritePacket(); + StartPacket(numBytesEncoded, false, 1, value); + } + else if (isRepeatPacket) + { + // Decide whether to continue the repeat packet. + if (value == runValue) + ExtendPacketAndRun(value); + else + { + // Different color, so terminate the run and start a new packet. + WriteRepeatPacket(packetLength); + StartPacket(numBytesEncoded, false, 1, value); + } + } + else + { + // Decide whether to continue the literal packet. + if (value == runValue) + { + ExtendPacketAndRun(value); + + // A 3-byte run terminates the literal and starts a new repeat + // packet. That's because the 3-byte run can be encoded as a + // 2-byte repeat. So even if the run ends at 3, we've already + // paid for the next flag-counter byte. + if (runLength == 3) + { + // The 3-byte run can come in the middle of a literal packet, + // but not at the beginning. The first 2 bytes of the run + // should've triggered a repeat packet. + Debug.Assert(packetLength > 3); + + // -2 because numBytesEncoded has not yet been incremented + WriteLiteralPacket(packetLength - 3); + StartPacket(numBytesEncoded - 2, true, 3, value); + } + } + else + { + ExtendPacketStartNewRun(value); + } + } + + start++; + numBytesEncoded++; + } + + // Loop terminates with a non-empty packet waiting to be written out. + WritePacket(); + ClearPacket(); + + return numBytesEncoded; + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/RleWriter.cs.meta b/Editor/PSDPlugin/PsdFile/RleWriter.cs.meta index 109b125..e5878f0 100644 --- a/Editor/PSDPlugin/PsdFile/RleWriter.cs.meta +++ b/Editor/PSDPlugin/PsdFile/RleWriter.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 6fcbb5d3e3f3adf479ac8a933b929a8a -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 6fcbb5d3e3f3adf479ac8a933b929a8a +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdFile/Util.cs b/Editor/PSDPlugin/PsdFile/Util.cs index e33ab26..c6fadc7 100644 --- a/Editor/PSDPlugin/PsdFile/Util.cs +++ b/Editor/PSDPlugin/PsdFile/Util.cs @@ -1,390 +1,390 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Photoshop PSD FileType Plugin for Paint.NET -// http://psdplugin.codeplex.com/ -// -// This software is provided under the MIT License: -// Copyright (c) 2006-2007 Frank Blumenberg -// Copyright (c) 2010-2016 Tao Yue -// -// See LICENSE.txt for complete licensing and attribution information. -// -///////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using PDNWrapper; -using System.IO; -using System.Linq; -using System.Text; -using Unity.Collections; - -namespace PhotoshopFile -{ - internal static class Util - { - [DebuggerDisplay("Top = {Top}, Bottom = {Bottom}, Left = {Left}, Right = {Right}")] - internal struct RectanglePosition - { - public int Top { get; set; } - public int Bottom { get; set; } - public int Left { get; set; } - public int Right { get; set; } - } - - public static Rectangle IntersectWith( - this Rectangle thisRect, Rectangle rect) - { - thisRect.Intersect(rect); - return thisRect; - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Fills a buffer with a byte value. - /// - static public void Fill(byte[] ptr, int start, int end, byte value) - { - while (start < end) - { - ptr[start] = value; - start++; - } - } - - static public void Invert(byte[] ptr, int ptrStart, int ptrEnd) - { - while (ptrStart < ptrEnd) - { - ptr[ptrStart] = (byte)(ptr[ptrStart] ^ 0xff); - ptrStart++; - } - } - - /// - /// Fills a buffer with a byte value. - /// - static public void Fill(NativeArray ptr, int start, int end, byte value) - { - while (start < end) - { - ptr[start] = value; - start++; - } - } - - static public void Invert(NativeArray ptr, int ptrStart, int ptrEnd) - { - while (ptrStart < ptrEnd) - { - ptr[ptrStart] = (byte)(ptr[ptrStart] ^ 0xff); - ptrStart++; - } - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Reverses the endianness of a 2-byte word. - /// - static public void SwapBytes2(byte[] ptr, int start) - { - byte byte0 = ptr[start]; - ptr[start] = ptr[start + 1]; - ptr[start + 1] = byte0; - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Reverses the endianness of a 4-byte word. - /// - static public void SwapBytes4(byte[] ptr, int start) - { - byte byte0 = ptr[start]; - byte byte1 = ptr[start + 1]; - - ptr[start] = ptr[start + 3]; - ptr[start + 1] = ptr[start + 2]; - ptr[start + 2] = byte1; - ptr[start + 3] = byte0; - } - - /// - /// Reverses the endianness of a word of arbitrary length. - /// - static public void SwapBytes(byte[] ptr, int start, int nLength) - { - for (long i = 0; i < nLength / 2; ++i) - { - byte t = ptr[start + i]; - ptr[start + i] = ptr[start + nLength - i - 1]; - ptr[start + nLength - i - 1] = t; - } - } - - /////////////////////////////////////////////////////////////////////////// - - public static void SwapByteArray(int bitDepth, - byte[] byteArray, int startIdx, int count) - { - switch (bitDepth) - { - case 1: - case 8: - break; - - case 16: - SwapByteArray2(byteArray, startIdx, count); - break; - - case 32: - SwapByteArray4(byteArray, startIdx, count); - break; - - default: - throw new Exception( - "Byte-swapping implemented only for 16-bit and 32-bit depths."); - } - } - - /// - /// Reverses the endianness of 2-byte words in a byte array. - /// - /// Byte array containing the sequence on which to swap endianness - /// Byte index of the first word to swap - /// Number of words to swap - public static void SwapByteArray2(byte[] byteArray, int startIdx, int count) - { - int endIdx = startIdx + count * 2; - if (byteArray.Length < endIdx) - throw new IndexOutOfRangeException(); - - - { - //fixed (byte* arrayPtr = &byteArray[0]) - { - //byte* ptr = arrayPtr + startIdx; - //byte* endPtr = arrayPtr + endIdx; - while (startIdx < endIdx) - { - SwapBytes2(byteArray, startIdx); - startIdx += 2; - } - } - } - } - - /// - /// Reverses the endianness of 4-byte words in a byte array. - /// - /// Byte array containing the sequence on which to swap endianness - /// Byte index of the first word to swap - /// Number of words to swap - public static void SwapByteArray4(byte[] byteArray, int startIdx, int count) - { - int endIdx = startIdx + count * 4; - if (byteArray.Length < endIdx) - throw new IndexOutOfRangeException(); - - - { - //fixed (byte* arrayPtr = &byteArray[0]) - { - //byte* ptr = arrayPtr + startIdx; - //byte* endPtr = arrayPtr + endIdx; - while (startIdx < endIdx) - { - SwapBytes4(byteArray, startIdx); - startIdx += 4; - } - } - } - } - - /////////////////////////////////////////////////////////////////////////// - - /// - /// Calculates the number of bytes required to store a row of an image - /// with the specified bit depth. - /// - /// The size of the image in pixels. - /// The bit depth of the image. - /// The number of bytes needed to store a row of the image. - public static int BytesPerRow(Size size, int bitDepth) - { - switch (bitDepth) - { - case 1: - return (size.Width + 7) / 8; - default: - return size.Width * BytesFromBitDepth(bitDepth); - } - } - - /// - /// Round the integer to a multiple. - /// - public static int RoundUp(int value, int multiple) - { - if (value == 0) - return 0; - - if (Math.Sign(value) != Math.Sign(multiple)) - { - throw new ArgumentException( - "value and multiple cannot have opposite signs."); - } - - var remainder = value % multiple; - if (remainder > 0) - { - value += (multiple - remainder); - } - return value; - } - - /// - /// Get number of bytes required to pad to the specified multiple. - /// - public static int GetPadding(int length, int padMultiple) - { - if ((length < 0) || (padMultiple < 0)) - throw new ArgumentException(); - - var remainder = length % padMultiple; - if (remainder == 0) - return 0; - - var padding = padMultiple - remainder; - return padding; - } - - /// - /// Returns the number of bytes needed to store a single pixel of the - /// specified bit depth. - /// - public static int BytesFromBitDepth(int depth) - { - switch (depth) - { - case 1: - case 8: - return 1; - case 16: - return 2; - case 32: - return 4; - default: - throw new ArgumentException("Invalid bit depth."); - } - } - - public static short MinChannelCount(this PsdColorMode colorMode) - { - switch (colorMode) - { - case PsdColorMode.Bitmap: - case PsdColorMode.Duotone: - case PsdColorMode.Grayscale: - case PsdColorMode.Indexed: - case PsdColorMode.Multichannel: - return 1; - case PsdColorMode.Lab: - case PsdColorMode.RGB: - return 3; - case PsdColorMode.CMYK: - return 4; - } - - throw new ArgumentException("Unknown color mode."); - } - - /// - /// Verify that the offset and count will remain within the bounds of the - /// buffer. - /// - /// True if in bounds, false if out of bounds. - public static bool CheckBufferBounds(byte[] data, int offset, int count) - { - if (offset < 0) - return false; - if (count < 0) - return false; - if (offset + count > data.Length) - return false; - - return true; - } - - public static void CheckByteArrayLength(long length) - { - if (length < 0) - { - throw new Exception("Byte array cannot have a negative length."); - } - if (length > 0x7fffffc7) - { - throw new OutOfMemoryException( - "Byte array cannot exceed 2,147,483,591 in length."); - } - } - - /// - /// Writes a message to the debug console, indicating the current position - /// in the stream in both decimal and hexadecimal formats. - /// - [Conditional("DEBUG")] - public static void DebugMessage(Stream stream, string message, - params object[] args) - { - //var formattedMessage = String.Format(message, args); - //Debug.WriteLine("0x{0:x}, {0}, {1}", - //stream.Position, formattedMessage); - } - } - - /// - /// Fixed-point decimal, with 16-bit integer and 16-bit fraction. - /// - internal class UFixed16_16 - { - public UInt16 Integer { get; set; } - public UInt16 Fraction { get; set; } - - public UFixed16_16(UInt16 integer, UInt16 fraction) - { - Integer = integer; - Fraction = fraction; - } - - /// - /// Split the high and low words of a 32-bit unsigned integer into a - /// fixed-point number. - /// - public UFixed16_16(UInt32 value) - { - Integer = (UInt16)(value >> 16); - Fraction = (UInt16)(value & 0x0000ffff); - } - - public UFixed16_16(double value) - { - if (value >= 65536.0) throw new OverflowException(); - if (value < 0) throw new OverflowException(); - - Integer = (UInt16)value; - - // Round instead of truncate, because doubles may not represent the - // fraction exactly. - Fraction = (UInt16)((value - Integer) * 65536 + 0.5); - } - - public static implicit operator double(UFixed16_16 value) - { - return (double)value.Integer + value.Fraction / 65536.0; - } - } -} +///////////////////////////////////////////////////////////////////////////////// +// +// Photoshop PSD FileType Plugin for Paint.NET +// http://psdplugin.codeplex.com/ +// +// This software is provided under the MIT License: +// Copyright (c) 2006-2007 Frank Blumenberg +// Copyright (c) 2010-2016 Tao Yue +// +// See LICENSE.txt for complete licensing and attribution information. +// +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using PDNWrapper; +using System.IO; +using System.Linq; +using System.Text; +using Unity.Collections; + +namespace PhotoshopFile +{ + internal static class Util + { + [DebuggerDisplay("Top = {Top}, Bottom = {Bottom}, Left = {Left}, Right = {Right}")] + internal struct RectanglePosition + { + public int Top { get; set; } + public int Bottom { get; set; } + public int Left { get; set; } + public int Right { get; set; } + } + + public static Rectangle IntersectWith( + this Rectangle thisRect, Rectangle rect) + { + thisRect.Intersect(rect); + return thisRect; + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Fills a buffer with a byte value. + /// + static public void Fill(byte[] ptr, int start, int end, byte value) + { + while (start < end) + { + ptr[start] = value; + start++; + } + } + + static public void Invert(byte[] ptr, int ptrStart, int ptrEnd) + { + while (ptrStart < ptrEnd) + { + ptr[ptrStart] = (byte)(ptr[ptrStart] ^ 0xff); + ptrStart++; + } + } + + /// + /// Fills a buffer with a byte value. + /// + static public void Fill(NativeArray ptr, int start, int end, byte value) + { + while (start < end) + { + ptr[start] = value; + start++; + } + } + + static public void Invert(NativeArray ptr, int ptrStart, int ptrEnd) + { + while (ptrStart < ptrEnd) + { + ptr[ptrStart] = (byte)(ptr[ptrStart] ^ 0xff); + ptrStart++; + } + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Reverses the endianness of a 2-byte word. + /// + static public void SwapBytes2(byte[] ptr, int start) + { + byte byte0 = ptr[start]; + ptr[start] = ptr[start + 1]; + ptr[start + 1] = byte0; + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Reverses the endianness of a 4-byte word. + /// + static public void SwapBytes4(byte[] ptr, int start) + { + byte byte0 = ptr[start]; + byte byte1 = ptr[start + 1]; + + ptr[start] = ptr[start + 3]; + ptr[start + 1] = ptr[start + 2]; + ptr[start + 2] = byte1; + ptr[start + 3] = byte0; + } + + /// + /// Reverses the endianness of a word of arbitrary length. + /// + static public void SwapBytes(byte[] ptr, int start, int nLength) + { + for (long i = 0; i < nLength / 2; ++i) + { + byte t = ptr[start + i]; + ptr[start + i] = ptr[start + nLength - i - 1]; + ptr[start + nLength - i - 1] = t; + } + } + + /////////////////////////////////////////////////////////////////////////// + + public static void SwapByteArray(int bitDepth, + byte[] byteArray, int startIdx, int count) + { + switch (bitDepth) + { + case 1: + case 8: + break; + + case 16: + SwapByteArray2(byteArray, startIdx, count); + break; + + case 32: + SwapByteArray4(byteArray, startIdx, count); + break; + + default: + throw new Exception( + "Byte-swapping implemented only for 16-bit and 32-bit depths."); + } + } + + /// + /// Reverses the endianness of 2-byte words in a byte array. + /// + /// Byte array containing the sequence on which to swap endianness + /// Byte index of the first word to swap + /// Number of words to swap + public static void SwapByteArray2(byte[] byteArray, int startIdx, int count) + { + int endIdx = startIdx + count * 2; + if (byteArray.Length < endIdx) + throw new IndexOutOfRangeException(); + + + { + //fixed (byte* arrayPtr = &byteArray[0]) + { + //byte* ptr = arrayPtr + startIdx; + //byte* endPtr = arrayPtr + endIdx; + while (startIdx < endIdx) + { + SwapBytes2(byteArray, startIdx); + startIdx += 2; + } + } + } + } + + /// + /// Reverses the endianness of 4-byte words in a byte array. + /// + /// Byte array containing the sequence on which to swap endianness + /// Byte index of the first word to swap + /// Number of words to swap + public static void SwapByteArray4(byte[] byteArray, int startIdx, int count) + { + int endIdx = startIdx + count * 4; + if (byteArray.Length < endIdx) + throw new IndexOutOfRangeException(); + + + { + //fixed (byte* arrayPtr = &byteArray[0]) + { + //byte* ptr = arrayPtr + startIdx; + //byte* endPtr = arrayPtr + endIdx; + while (startIdx < endIdx) + { + SwapBytes4(byteArray, startIdx); + startIdx += 4; + } + } + } + } + + /////////////////////////////////////////////////////////////////////////// + + /// + /// Calculates the number of bytes required to store a row of an image + /// with the specified bit depth. + /// + /// The size of the image in pixels. + /// The bit depth of the image. + /// The number of bytes needed to store a row of the image. + public static int BytesPerRow(Size size, int bitDepth) + { + switch (bitDepth) + { + case 1: + return (size.Width + 7) / 8; + default: + return size.Width * BytesFromBitDepth(bitDepth); + } + } + + /// + /// Round the integer to a multiple. + /// + public static int RoundUp(int value, int multiple) + { + if (value == 0) + return 0; + + if (Math.Sign(value) != Math.Sign(multiple)) + { + throw new ArgumentException( + "value and multiple cannot have opposite signs."); + } + + var remainder = value % multiple; + if (remainder > 0) + { + value += (multiple - remainder); + } + return value; + } + + /// + /// Get number of bytes required to pad to the specified multiple. + /// + public static int GetPadding(int length, int padMultiple) + { + if ((length < 0) || (padMultiple < 0)) + throw new ArgumentException(); + + var remainder = length % padMultiple; + if (remainder == 0) + return 0; + + var padding = padMultiple - remainder; + return padding; + } + + /// + /// Returns the number of bytes needed to store a single pixel of the + /// specified bit depth. + /// + public static int BytesFromBitDepth(int depth) + { + switch (depth) + { + case 1: + case 8: + return 1; + case 16: + return 2; + case 32: + return 4; + default: + throw new ArgumentException("Invalid bit depth."); + } + } + + public static short MinChannelCount(this PsdColorMode colorMode) + { + switch (colorMode) + { + case PsdColorMode.Bitmap: + case PsdColorMode.Duotone: + case PsdColorMode.Grayscale: + case PsdColorMode.Indexed: + case PsdColorMode.Multichannel: + return 1; + case PsdColorMode.Lab: + case PsdColorMode.RGB: + return 3; + case PsdColorMode.CMYK: + return 4; + } + + throw new ArgumentException("Unknown color mode."); + } + + /// + /// Verify that the offset and count will remain within the bounds of the + /// buffer. + /// + /// True if in bounds, false if out of bounds. + public static bool CheckBufferBounds(byte[] data, int offset, int count) + { + if (offset < 0) + return false; + if (count < 0) + return false; + if (offset + count > data.Length) + return false; + + return true; + } + + public static void CheckByteArrayLength(long length) + { + if (length < 0) + { + throw new Exception("Byte array cannot have a negative length."); + } + if (length > 0x7fffffc7) + { + throw new OutOfMemoryException( + "Byte array cannot exceed 2,147,483,591 in length."); + } + } + + /// + /// Writes a message to the debug console, indicating the current position + /// in the stream in both decimal and hexadecimal formats. + /// + [Conditional("DEBUG")] + public static void DebugMessage(Stream stream, string message, + params object[] args) + { + //var formattedMessage = String.Format(message, args); + //Debug.WriteLine("0x{0:x}, {0}, {1}", + //stream.Position, formattedMessage); + } + } + + /// + /// Fixed-point decimal, with 16-bit integer and 16-bit fraction. + /// + internal class UFixed16_16 + { + public UInt16 Integer { get; set; } + public UInt16 Fraction { get; set; } + + public UFixed16_16(UInt16 integer, UInt16 fraction) + { + Integer = integer; + Fraction = fraction; + } + + /// + /// Split the high and low words of a 32-bit unsigned integer into a + /// fixed-point number. + /// + public UFixed16_16(UInt32 value) + { + Integer = (UInt16)(value >> 16); + Fraction = (UInt16)(value & 0x0000ffff); + } + + public UFixed16_16(double value) + { + if (value >= 65536.0) throw new OverflowException(); + if (value < 0) throw new OverflowException(); + + Integer = (UInt16)value; + + // Round instead of truncate, because doubles may not represent the + // fraction exactly. + Fraction = (UInt16)((value - Integer) * 65536 + 0.5); + } + + public static implicit operator double(UFixed16_16 value) + { + return (double)value.Integer + value.Fraction / 65536.0; + } + } +} diff --git a/Editor/PSDPlugin/PsdFile/Util.cs.meta b/Editor/PSDPlugin/PsdFile/Util.cs.meta index 96ce21e..de257f9 100644 --- a/Editor/PSDPlugin/PsdFile/Util.cs.meta +++ b/Editor/PSDPlugin/PsdFile/Util.cs.meta @@ -1,12 +1,12 @@ -fileFormatVersion: 2 -guid: 2bab0d96ebe77084d97602af7f3fd124 -timeCreated: 1495006553 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2bab0d96ebe77084d97602af7f3fd124 +timeCreated: 1495006553 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDPlugin/PsdPlugin.asmdef b/Editor/PSDPlugin/PsdPlugin.asmdef index f415b4e..7ae1f06 100644 --- a/Editor/PSDPlugin/PsdPlugin.asmdef +++ b/Editor/PSDPlugin/PsdPlugin.asmdef @@ -1,9 +1,9 @@ -{ - "name": "PsdPlugin", - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true -} +{ + "name": "PsdPlugin", + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": true +} diff --git a/Editor/PSDPlugin/PsdPlugin.asmdef.meta b/Editor/PSDPlugin/PsdPlugin.asmdef.meta index 66a0138..bbeb791 100644 --- a/Editor/PSDPlugin/PsdPlugin.asmdef.meta +++ b/Editor/PSDPlugin/PsdPlugin.asmdef.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 73a61a380edacb34795f31a3ec21c2ef -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 73a61a380edacb34795f31a3ec21c2ef +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/SpriteData.cs b/Editor/SpriteData.cs index 2cbdf53..86cf51d 100644 --- a/Editor/SpriteData.cs +++ b/Editor/SpriteData.cs @@ -1,94 +1,94 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEditor.U2D.Sprites; -using UnityEngine; -using UnityEngine.U2D; - -namespace UnityEditor.U2D.PSD -{ - [Serializable] - internal class SpriteMetaData : SpriteRect - { - public List spriteBone; - public List spriteOutline; - public List vertices; - public List spritePhysicsOutline; - public int[] indices; - public Vector2Int[] edges; - public float tessellationDetail; - public int parentGroupIndex = -1; - public Vector2Int uvTransform = Vector2Int.zero; - - public SpriteMetaData() {} - - public SpriteMetaData(SpriteRect sr) - { - alignment = sr.alignment; - border = sr.border; - name = sr.name; - pivot = GetPivotValue(sr.alignment, sr.pivot); - rect = sr.rect; - spriteID = sr.spriteID; - } - - public static GUID GetGUIDFromSerializedProperty(SerializedProperty sp) - { - return new GUID(sp.FindPropertyRelative("m_SpriteID").stringValue); - } - - public static Vector2 GetPivotValue(SpriteAlignment alignment, Vector2 customOffset) - { - switch (alignment) - { - case SpriteAlignment.BottomLeft: - return new Vector2(0f, 0f); - case SpriteAlignment.BottomCenter: - return new Vector2(0.5f, 0f); - case SpriteAlignment.BottomRight: - return new Vector2(1f, 0f); - - case SpriteAlignment.LeftCenter: - return new Vector2(0f, 0.5f); - case SpriteAlignment.Center: - return new Vector2(0.5f, 0.5f); - case SpriteAlignment.RightCenter: - return new Vector2(1f, 0.5f); - - case SpriteAlignment.TopLeft: - return new Vector2(0f, 1f); - case SpriteAlignment.TopCenter: - return new Vector2(0.5f, 1f); - case SpriteAlignment.TopRight: - return new Vector2(1f, 1f); - - case SpriteAlignment.Custom: - return customOffset; - } - return Vector2.zero; - } - - public static implicit operator UnityEditor.AssetImporters.SpriteImportData(SpriteMetaData value) - { - var output = new UnityEditor.AssetImporters.SpriteImportData(); - output.name = value.name; - output.alignment = value.alignment; - output.rect = value.rect; - output.border = value.border; - output.pivot = value.pivot; - output.tessellationDetail = value.tessellationDetail; - output.spriteID = value.spriteID.ToString(); - if (value.spriteOutline != null) - output.outline = value.spriteOutline.Select(x => x.outline).ToList(); - - return output; - } - } - - [Serializable] - internal class SpriteOutline - { - [SerializeField] - public Vector2[] outline; - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.U2D.Sprites; +using UnityEngine; +using UnityEngine.U2D; + +namespace UnityEditor.U2D.PSD +{ + [Serializable] + internal class SpriteMetaData : SpriteRect + { + public List spriteBone; + public List spriteOutline; + public List vertices; + public List spritePhysicsOutline; + public int[] indices; + public Vector2Int[] edges; + public float tessellationDetail; + public int parentGroupIndex = -1; + public Vector2Int uvTransform = Vector2Int.zero; + + public SpriteMetaData() {} + + public SpriteMetaData(SpriteRect sr) + { + alignment = sr.alignment; + border = sr.border; + name = sr.name; + pivot = GetPivotValue(sr.alignment, sr.pivot); + rect = sr.rect; + spriteID = sr.spriteID; + } + + public static GUID GetGUIDFromSerializedProperty(SerializedProperty sp) + { + return new GUID(sp.FindPropertyRelative("m_SpriteID").stringValue); + } + + public static Vector2 GetPivotValue(SpriteAlignment alignment, Vector2 customOffset) + { + switch (alignment) + { + case SpriteAlignment.BottomLeft: + return new Vector2(0f, 0f); + case SpriteAlignment.BottomCenter: + return new Vector2(0.5f, 0f); + case SpriteAlignment.BottomRight: + return new Vector2(1f, 0f); + + case SpriteAlignment.LeftCenter: + return new Vector2(0f, 0.5f); + case SpriteAlignment.Center: + return new Vector2(0.5f, 0.5f); + case SpriteAlignment.RightCenter: + return new Vector2(1f, 0.5f); + + case SpriteAlignment.TopLeft: + return new Vector2(0f, 1f); + case SpriteAlignment.TopCenter: + return new Vector2(0.5f, 1f); + case SpriteAlignment.TopRight: + return new Vector2(1f, 1f); + + case SpriteAlignment.Custom: + return customOffset; + } + return Vector2.zero; + } + + public static implicit operator UnityEditor.AssetImporters.SpriteImportData(SpriteMetaData value) + { + var output = new UnityEditor.AssetImporters.SpriteImportData(); + output.name = value.name; + output.alignment = value.alignment; + output.rect = value.rect; + output.border = value.border; + output.pivot = value.pivot; + output.tessellationDetail = value.tessellationDetail; + output.spriteID = value.spriteID.ToString(); + if (value.spriteOutline != null) + output.outline = value.spriteOutline.Select(x => x.outline).ToList(); + + return output; + } + } + + [Serializable] + internal class SpriteOutline + { + [SerializeField] + public Vector2[] outline; + } +} diff --git a/Editor/SpriteData.cs.meta b/Editor/SpriteData.cs.meta index 48bd934..2ab203e 100644 --- a/Editor/SpriteData.cs.meta +++ b/Editor/SpriteData.cs.meta @@ -1,13 +1,13 @@ -fileFormatVersion: 2 -guid: 74fa967f55c32124c86b5f4f945e92f7 -timeCreated: 1502357841 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 74fa967f55c32124c86b5f4f945e92f7 +timeCreated: 1502357841 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Tasks.meta b/Editor/Tasks.meta index 84d9667..555c7d9 100644 --- a/Editor/Tasks.meta +++ b/Editor/Tasks.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: b1575b7a6ef047c4ab65d2fc455e5e22 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: b1575b7a6ef047c4ab65d2fc455e5e22 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Tasks/ExtractLayerTask.cs b/Editor/Tasks/ExtractLayerTask.cs index 6fb3154..7f518d1 100644 --- a/Editor/Tasks/ExtractLayerTask.cs +++ b/Editor/Tasks/ExtractLayerTask.cs @@ -1,103 +1,173 @@ -using System; -using System.Collections.Generic; -using PDNWrapper; -using UnityEngine; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; - -namespace UnityEditor.U2D.PSD -{ - class ExtractLayerTask - { - struct ConvertBufferJob : IJobParallelFor - { - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray original; - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray width; - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray height; - - [DeallocateOnJobCompletion] - public NativeArray output; - public unsafe void Execute(int index) - { - Color32* originalColor = (Color32*)original[index]; - Color32* otuputColor = (Color32*)output[index]; - for (int i = 0; i < height[index]; ++i) - { - int originalYOffset = i * width[index]; - int outputYOffset = (height[index] - i - 1) * width[index]; - for (int j = 0; j < width[index]; ++j) - { - otuputColor[j + outputYOffset] = originalColor[j + originalYOffset]; - } - } - } - } - - public static unsafe void Execute(List extractedLayer, List layers, bool importHiddenLayer) - { - UnityEngine.Profiling.Profiler.BeginSample("ExtractLayer_PrepareJob"); - var tempExtractLayer = new List(); - int layerWithBuffer = ExtractLayer(tempExtractLayer, layers, importHiddenLayer); - if (layerWithBuffer == 0) - return; - var job = new ConvertBufferJob(); - job.original = new NativeArray(layerWithBuffer, Allocator.TempJob); - job.output = new NativeArray(layerWithBuffer, Allocator.TempJob); - job.width = new NativeArray(layerWithBuffer, Allocator.TempJob); - job.height = new NativeArray(layerWithBuffer, Allocator.TempJob); - for (int i = 0, jobIndex = 0; i < tempExtractLayer.Count; ++i) - { - var el = tempExtractLayer[i]; - if (el.texture.Length == 0 || el.width == 0 || el.height == 0) - { - extractedLayer.Add(el); - continue; - } - - job.original[jobIndex] = new IntPtr(el.texture.GetUnsafeReadOnlyPtr()); - el.texture = new NativeArray(el.texture.Length, Allocator.Persistent); - extractedLayer.Add(el); - job.output[jobIndex] = new IntPtr(el.texture.GetUnsafePtr()); - job.width[jobIndex] = el.width; - job.height[jobIndex] = el.height; - ++jobIndex; - } - - var jobsPerThread = layerWithBuffer / (SystemInfo.processorCount == 0 ? 8 : SystemInfo.processorCount); - jobsPerThread = Mathf.Max(jobsPerThread, 1); - var handle = job.Schedule(layerWithBuffer, jobsPerThread); - UnityEngine.Profiling.Profiler.EndSample(); - handle.Complete(); - } - - static int ExtractLayer(List extractedLayer, List layers, bool importHiddenLayer) - { - // parent is the previous element in extracedLayer - int parentGroupIndex = extractedLayer.Count - 1; - int actualLayerWithBuffer = 0; - foreach (var l in layers) - { - if (!importHiddenLayer && !l.Visible) - continue; - if (l.IsGroup) - { - extractedLayer.Add(new PSDLayer(new NativeArray(0, Allocator.Persistent), parentGroupIndex, l.IsGroup, l.Name, 0, 0, l.LayerID)); - actualLayerWithBuffer += ExtractLayer(extractedLayer, l.ChildLayer, importHiddenLayer); - } - else - { - extractedLayer.Add(new PSDLayer(l.Surface.color, parentGroupIndex, l.IsGroup, l.Name, l.Surface.width, l.Surface.height, l.LayerID)); - ++actualLayerWithBuffer; - } - } - return actualLayerWithBuffer; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using PDNWrapper; +using UnityEngine; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using Unity.Jobs; + +namespace UnityEditor.U2D.PSD +{ + class ExtractLayerTask + { + struct LayerExtractData + { + public int start; + public int end; + public int width; + public int height; + } + + struct ConvertBufferJob : IJobParallelFor + { + + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray original; + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray flattenIndex; + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray width; + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray height; + + [DeallocateOnJobCompletion] + public NativeArray output; + public unsafe void Execute(int index) + { + Color32* outputColor = (Color32*)output[index]; + for (int i = flattenIndex[index].start; i <= flattenIndex[index].end; ++i) + { + if (original[i] == IntPtr.Zero) + continue; + Color32* originalColor = (Color32*)original[i]; + int bufferWidth = width[i]; + int bufferHeight = height[i]; + for (int h = 0; h < bufferHeight; ++h) + { + int originalYOffset = h * bufferWidth; + int outputYOffset = (bufferHeight - h - 1) * bufferWidth; + for (int w = 0; w < bufferWidth; ++w) + { + var outColor = outputColor[w + outputYOffset]; + var inColor = originalColor[w + originalYOffset]; + float alpha = outColor.a / 255.0f; + outColor.r = (byte)(alpha * (float)(outColor.r) + (float)((1.0f - alpha) * (float)inColor.r)); + outColor.g = (byte)(alpha * (float)(outColor.g) + (float)((1.0f - alpha) * (float)inColor.g)); + outColor.b = (byte)(alpha * (float)(outColor.b) + (float)((1.0f - alpha) * (float)inColor.b)); + outColor.a = (byte)(alpha * (float)(outColor.a) + (float)((1.0f - alpha) * (float)inColor.a)); + outputColor[w + outputYOffset] = outColor; + } + } + } + } + } + + public static unsafe void Execute(List extractedLayer, List layers, bool importHiddenLayer, PSDImporter.FlattenLayerData[] previousFlattenLayer, IPSDLayerMappingStrategy mappingStrategy) + { + UnityEngine.Profiling.Profiler.BeginSample("ExtractLayer_PrepareJob"); + List layerToExtract = new List(); + ExtractLayer(extractedLayer, layers, importHiddenLayer, false, layerToExtract, previousFlattenLayer, mappingStrategy, true); + if (layerToExtract.Count == 0) + { + foreach (var l in extractedLayer) + l.texture = default; + return; + } + + var job = new ConvertBufferJob(); + job.original = new NativeArray(extractedLayer.Count, Allocator.TempJob); + job.output = new NativeArray(layerToExtract.Count, Allocator.TempJob); + job.width = new NativeArray(extractedLayer.Count, Allocator.TempJob); + job.height = new NativeArray(extractedLayer.Count, Allocator.TempJob); + + for (int i = 0, extractLayerIndex = 0; i < extractedLayer.Count; ++i) + { + var el = extractedLayer[i]; + job.original[i] = el.texture.IsCreated ? new IntPtr(el.texture.GetUnsafePtr()) : IntPtr.Zero; + if (extractLayerIndex < layerToExtract.Count && layerToExtract[extractLayerIndex].start == i) + { + el.texture = new NativeArray(layerToExtract[extractLayerIndex].width * layerToExtract[extractLayerIndex].height, Allocator.Persistent); + job.output[extractLayerIndex] = el.texture.IsCreated ? new IntPtr(el.texture.GetUnsafePtr()) : IntPtr.Zero; + ++extractLayerIndex; + } + else + { + el.texture = default; + } + + job.width[i] = el.width; + job.height[i] = el.height; + } + job.flattenIndex = new NativeArray(layerToExtract.ToArray(), Allocator.TempJob); + + var jobsPerThread = layerToExtract.Count / (SystemInfo.processorCount == 0 ? 8 : SystemInfo.processorCount); + jobsPerThread = Mathf.Max(jobsPerThread, 1); + var handle = job.Schedule(layerToExtract.Count, jobsPerThread); + UnityEngine.Profiling.Profiler.EndSample(); + handle.Complete(); + } + + static (int width, int height) ExtractLayer(List extractedLayer, List layers, bool importHiddenLayer, bool flatten, List layerExtract, PSDImporter.FlattenLayerData[] previousFlatten, IPSDLayerMappingStrategy mappingStrategy, bool parentGroupVisible) + { + // parent is the previous element in extracedLayer + int parentGroupIndex = extractedLayer.Count - 1; + int maxWidth = 0, maxHeight = 0; + int width = 0, height = 0; + foreach (var l in layers) + { + bool layerVisible = l.Visible && parentGroupVisible; + if (l.IsGroup) + { + var layer = new PSDLayer(l.Surface.color, parentGroupIndex, l.IsGroup, l.Name, 0, 0, l.LayerID, l.Visible); + layer.flatten = previousFlatten.FirstOrDefault(x => mappingStrategy.Compare(x, l)) != null; + layer.isImported = (importHiddenLayer || layerVisible) && !flatten && layer.flatten; + int startIndex = extractedLayer.Count; + extractedLayer.Add(layer); + (width, height) = ExtractLayer(extractedLayer, l.ChildLayer, importHiddenLayer, flatten || layer.flatten, layerExtract, previousFlatten, mappingStrategy, layerVisible); + int endIndex = extractedLayer.Count - 1; + // If this group is to be flatten and there are flatten layers + if (flatten == false && layer.flatten && startIndex < endIndex) + { + layerExtract.Add(new LayerExtractData() + { + start = startIndex, + end = endIndex, + width = width, + height = height + }); + } + } + else + { + var surface = importHiddenLayer || l.Visible ? l.Surface.color : default; + var layer = new PSDLayer(surface, parentGroupIndex, l.IsGroup, l.Name, l.Surface.width, l.Surface.height, l.LayerID,l.Visible); + layer.isImported = (importHiddenLayer || layerVisible) && !flatten; + extractedLayer.Add(layer); + if (layer.isImported) + { + layerExtract.Add(new LayerExtractData() + { + start = extractedLayer.Count-1, + end = extractedLayer.Count-1, + width = l.Surface.width, + height = l.Surface.height, + }); + } + + width = l.Surface.width; + height = l.Surface.height; + } + if (maxWidth < width) + maxWidth = width; + if (maxHeight < height) + maxHeight = height; + } + return (maxWidth, maxHeight); + } + } +} diff --git a/Editor/Tasks/ExtractLayerTask.cs.meta b/Editor/Tasks/ExtractLayerTask.cs.meta index fbaa404..9dbfe19 100644 --- a/Editor/Tasks/ExtractLayerTask.cs.meta +++ b/Editor/Tasks/ExtractLayerTask.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 16af8882f4d64f641925549e4262327c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 16af8882f4d64f641925549e4262327c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Tasks/FlattenImageTask.cs b/Editor/Tasks/FlattenImageTask.cs index 434dc05..aa69bed 100644 --- a/Editor/Tasks/FlattenImageTask.cs +++ b/Editor/Tasks/FlattenImageTask.cs @@ -1,125 +1,125 @@ -using System; -using System.Collections.Generic; -using PDNWrapper; -using UnityEngine; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; - -namespace UnityEditor.U2D.PSD -{ - static class FlattenImageTask - { - static unsafe public void Execute(List layer, bool importHiddenLayer, int width, int height, NativeArray output) - { - UnityEngine.Profiling.Profiler.BeginSample("FlattenImage"); - List buffers = new List(); - for (int i = layer.Count - 1; i >= 0; --i) - { - GetBuffersToMergeFromLayer(layer[i], importHiddenLayer, buffers); - } - - if (buffers.Count == 0) - return; - - var layersPerJob = buffers.Count / (SystemInfo.processorCount == 0 ? 8 : SystemInfo.processorCount); - layersPerJob = Mathf.Max(layersPerJob, 1); - - var job = new FlattenImageInternalJob(); - var combineJob = new FlattenImageInternalJob(); - - job.buffers = new NativeArray(buffers.ToArray(), Allocator.TempJob); - for (int i = 0; i < buffers.Count; ++i) - job.buffers[i] = buffers[i]; - - combineJob.width = job.width = width; - combineJob.height = job.height = height; - - job.layersPerJob = layersPerJob; - job.flipY = false; - combineJob.flipY = true; - - int jobCount = buffers.Count / layersPerJob + (buffers.Count % layersPerJob > 0 ? 1 : 0); - combineJob.layersPerJob = jobCount; - - NativeArray[] premergedBuffer = new NativeArray[jobCount]; - job.output = new NativeArray(jobCount, Allocator.TempJob); - combineJob.buffers = new NativeArray(jobCount, Allocator.TempJob); - - for (int i = 0; i < jobCount; ++i) - { - premergedBuffer[i] = new NativeArray(width * height * 4, Allocator.TempJob); - job.output[i] = new IntPtr(premergedBuffer[i].GetUnsafePtr()); - combineJob.buffers[i] = new IntPtr(premergedBuffer[i].GetUnsafeReadOnlyPtr()); - } - combineJob.output = new NativeArray(new[] {new IntPtr(output.GetUnsafePtr()), }, Allocator.TempJob); - - var handle = job.Schedule(jobCount, 1); - combineJob.Schedule(1, 1, handle).Complete(); - foreach (var b in premergedBuffer) - { - if (b.IsCreated) - b.Dispose(); - } - UnityEngine.Profiling.Profiler.EndSample(); - } - - static unsafe void GetBuffersToMergeFromLayer(BitmapLayer layer, bool importHiddenLayer, List buffers) - { - if (!layer.Visible && importHiddenLayer == false) - return; - if (layer.IsGroup) - { - for (int i = layer.ChildLayer.Count - 1; i >= 0; --i) - GetBuffersToMergeFromLayer(layer.ChildLayer[i], importHiddenLayer, buffers); - } - if (layer.Surface != null) - buffers.Add(new IntPtr(layer.Surface.color.GetUnsafeReadOnlyPtr())); - else - Debug.LogWarning(string.Format("Layer {0} has no color buffer", layer.Name)); - } - - struct FlattenImageInternalJob : IJobParallelFor - { - [ReadOnly] - [DeallocateOnJobCompletion] - public NativeArray buffers; - [ReadOnly] - public int layersPerJob; - [ReadOnly] - public int width; - [ReadOnly] - public int height; - [ReadOnly] - public bool flipY; - [DeallocateOnJobCompletion] - public NativeArray output; - - public unsafe void Execute(int index) - { - var premerge = (Color32*)output[index].ToPointer(); - for (int layerIndex = index * layersPerJob; layerIndex < (index * layersPerJob) + layersPerJob; ++layerIndex) - { - if (buffers.Length <= layerIndex) - break; - var buffer = (Color32*)buffers[layerIndex].ToPointer(); - for (int i = 0; i < height; ++i) - { - int sourceYIndex = i * width; - int destYIndex = flipY ? (height - 1 - i) * width : sourceYIndex; - for (int j = 0; j < width; ++j) - { - int sourceIndex = sourceYIndex + j; - int destIndex = destYIndex + j; - float alpha = buffer[sourceIndex].a / 255.0f; - premerge[destIndex].r = (byte)(alpha * (float)(buffer[sourceIndex].r) + (float)((1.0f - alpha) * (float)premerge[destIndex].r)); - premerge[destIndex].g = (byte)(alpha * (float)(buffer[sourceIndex].g) + (float)((1.0f - alpha) * (float)premerge[destIndex].g)); - premerge[destIndex].b = (byte)(alpha * (float)(buffer[sourceIndex].b) + (float)((1.0f - alpha) * (float)premerge[destIndex].b)); - premerge[destIndex].a = (byte)(alpha * (float)(buffer[sourceIndex].a) + (float)((1.0f - alpha) * (float)premerge[destIndex].a)); - } - } - } - } - } - } -} +using System; +using System.Collections.Generic; +using PDNWrapper; +using UnityEngine; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using Unity.Jobs; + +namespace UnityEditor.U2D.PSD +{ + static class FlattenImageTask + { + static unsafe public void Execute(List layer, bool importHiddenLayer, int width, int height, NativeArray output) + { + UnityEngine.Profiling.Profiler.BeginSample("FlattenImage"); + List buffers = new List(); + for (int i = layer.Count - 1; i >= 0; --i) + { + GetBuffersToMergeFromLayer(layer[i], importHiddenLayer, buffers); + } + + if (buffers.Count == 0) + return; + + var layersPerJob = buffers.Count / (SystemInfo.processorCount == 0 ? 8 : SystemInfo.processorCount); + layersPerJob = Mathf.Max(layersPerJob, 1); + + var job = new FlattenImageInternalJob(); + var combineJob = new FlattenImageInternalJob(); + + job.buffers = new NativeArray(buffers.ToArray(), Allocator.TempJob); + for (int i = 0; i < buffers.Count; ++i) + job.buffers[i] = buffers[i]; + + combineJob.width = job.width = width; + combineJob.height = job.height = height; + + job.layersPerJob = layersPerJob; + job.flipY = false; + combineJob.flipY = true; + + int jobCount = buffers.Count / layersPerJob + (buffers.Count % layersPerJob > 0 ? 1 : 0); + combineJob.layersPerJob = jobCount; + + NativeArray[] premergedBuffer = new NativeArray[jobCount]; + job.output = new NativeArray(jobCount, Allocator.TempJob); + combineJob.buffers = new NativeArray(jobCount, Allocator.TempJob); + + for (int i = 0; i < jobCount; ++i) + { + premergedBuffer[i] = new NativeArray(width * height * 4, Allocator.TempJob); + job.output[i] = new IntPtr(premergedBuffer[i].GetUnsafePtr()); + combineJob.buffers[i] = new IntPtr(premergedBuffer[i].GetUnsafeReadOnlyPtr()); + } + combineJob.output = new NativeArray(new[] {new IntPtr(output.GetUnsafePtr()), }, Allocator.TempJob); + + var handle = job.Schedule(jobCount, 1); + combineJob.Schedule(1, 1, handle).Complete(); + foreach (var b in premergedBuffer) + { + if (b.IsCreated) + b.Dispose(); + } + UnityEngine.Profiling.Profiler.EndSample(); + } + + static unsafe void GetBuffersToMergeFromLayer(BitmapLayer layer, bool importHiddenLayer, List buffers) + { + if (!layer.Visible && importHiddenLayer == false) + return; + if (layer.IsGroup) + { + for (int i = layer.ChildLayer.Count - 1; i >= 0; --i) + GetBuffersToMergeFromLayer(layer.ChildLayer[i], importHiddenLayer, buffers); + } + if (layer.Surface != null) + buffers.Add(new IntPtr(layer.Surface.color.GetUnsafeReadOnlyPtr())); + else + Debug.LogWarning(string.Format("Layer {0} has no color buffer", layer.Name)); + } + + struct FlattenImageInternalJob : IJobParallelFor + { + [ReadOnly] + [DeallocateOnJobCompletion] + public NativeArray buffers; + [ReadOnly] + public int layersPerJob; + [ReadOnly] + public int width; + [ReadOnly] + public int height; + [ReadOnly] + public bool flipY; + [DeallocateOnJobCompletion] + public NativeArray output; + + public unsafe void Execute(int index) + { + var premerge = (Color32*)output[index].ToPointer(); + for (int layerIndex = index * layersPerJob; layerIndex < (index * layersPerJob) + layersPerJob; ++layerIndex) + { + if (buffers.Length <= layerIndex) + break; + var buffer = (Color32*)buffers[layerIndex].ToPointer(); + for (int i = 0; i < height; ++i) + { + int sourceYIndex = i * width; + int destYIndex = flipY ? (height - 1 - i) * width : sourceYIndex; + for (int j = 0; j < width; ++j) + { + int sourceIndex = sourceYIndex + j; + int destIndex = destYIndex + j; + float alpha = buffer[sourceIndex].a / 255.0f; + premerge[destIndex].r = (byte)(alpha * (float)(buffer[sourceIndex].r) + (float)((1.0f - alpha) * (float)premerge[destIndex].r)); + premerge[destIndex].g = (byte)(alpha * (float)(buffer[sourceIndex].g) + (float)((1.0f - alpha) * (float)premerge[destIndex].g)); + premerge[destIndex].b = (byte)(alpha * (float)(buffer[sourceIndex].b) + (float)((1.0f - alpha) * (float)premerge[destIndex].b)); + premerge[destIndex].a = (byte)(alpha * (float)(buffer[sourceIndex].a) + (float)((1.0f - alpha) * (float)premerge[destIndex].a)); + } + } + } + } + } + } +} diff --git a/Editor/Tasks/FlattenImageTask.cs.meta b/Editor/Tasks/FlattenImageTask.cs.meta index d9e8428..6ff52fd 100644 --- a/Editor/Tasks/FlattenImageTask.cs.meta +++ b/Editor/Tasks/FlattenImageTask.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 91006214ab79ae444b7ae4f0e018beb8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 91006214ab79ae444b7ae4f0e018beb8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/TexturePlatformSettingsController.cs b/Editor/TexturePlatformSettingsController.cs index 4fbdee8..9fd01e5 100644 --- a/Editor/TexturePlatformSettingsController.cs +++ b/Editor/TexturePlatformSettingsController.cs @@ -1,254 +1,254 @@ -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Assertions; - -namespace UnityEditor.U2D.PSD -{ - internal class TexturePlatformSettingsController - { - public bool HandleDefaultSettings(List platformSettings, TexturePlatformSettingsView view) - { - Assert.IsTrue(platformSettings.Count > 0, "At least 1 platform setting is needed to display the texture platform setting UI."); - - int allSize = platformSettings[0].maxTextureSize; - TextureImporterCompression allCompression = platformSettings[0].textureCompression; - bool allUseCrunchedCompression = platformSettings[0].crunchedCompression; - int allCompressionQuality = platformSettings[0].compressionQuality; - TextureResizeAlgorithm allResizeAlgorithm = platformSettings[0].resizeAlgorithm; - - var newSize = allSize; - var newCompression = allCompression; - var newUseCrunchedCompression = allUseCrunchedCompression; - var newCompressionQuality = allCompressionQuality; - var newResizeAlgorithm = allResizeAlgorithm; - - bool mixedSize = false; - bool mixedCompression = false; - bool mixedUseCrunchedCompression = false; - bool mixedCompressionQuality = false; - bool mixedResizeAlgorithm = false; - - bool sizeChanged = false; - bool compressionChanged = false; - bool useCrunchedCompressionChanged = false; - bool compressionQualityChanged = false; - bool resizedChanged = false; - - for (var i = 1; i < platformSettings.Count; ++i) - { - var settings = platformSettings[i]; - if (settings.maxTextureSize != allSize) - mixedSize = true; - if (settings.textureCompression != allCompression) - mixedCompression = true; - if (settings.crunchedCompression != allUseCrunchedCompression) - mixedUseCrunchedCompression = true; - if (settings.compressionQuality != allCompressionQuality) - mixedCompressionQuality = true; - if (settings.resizeAlgorithm != allResizeAlgorithm) - mixedResizeAlgorithm = true; - } - - EditorGUI.indentLevel++; - newSize = view.DrawMaxSize(allSize, mixedSize, false, out sizeChanged); - newResizeAlgorithm = view.DrawResizeAlgorithm(allResizeAlgorithm, mixedResizeAlgorithm, false, out resizedChanged); - newCompression = view.DrawCompression(allCompression, mixedCompression, out compressionChanged); - if (!mixedCompression && allCompression != TextureImporterCompression.Uncompressed) - { - newUseCrunchedCompression = view.DrawUseCrunchedCompression(allUseCrunchedCompression, mixedUseCrunchedCompression, out useCrunchedCompressionChanged); - - if (!mixedUseCrunchedCompression && allUseCrunchedCompression) - { - newCompressionQuality = view.DrawCompressionQualitySlider(allCompressionQuality, mixedCompressionQuality, out compressionQualityChanged); - } - } - EditorGUI.indentLevel--; - - if (sizeChanged || compressionChanged || useCrunchedCompressionChanged || compressionQualityChanged || resizedChanged) - { - for (var i = 0; i < platformSettings.Count; ++i) - { - if (sizeChanged) - platformSettings[i].maxTextureSize = newSize; - if (compressionChanged) - platformSettings[i].textureCompression = newCompression; - if (useCrunchedCompressionChanged) - platformSettings[i].crunchedCompression = newUseCrunchedCompression; - if (compressionQualityChanged) - platformSettings[i].compressionQuality = newCompressionQuality; - if (resizedChanged) - platformSettings[i].resizeAlgorithm = newResizeAlgorithm; - } - return true; - } - else - return false; - } - - public bool HandlePlatformSettings(BuildTarget buildTarget, List platformSettings, TexturePlatformSettingsView view) - { - if (buildTarget == BuildTarget.NoTarget) - { - return HandleDefaultSettings(platformSettings, view); - } - Assert.IsTrue(platformSettings.Count > 0, "At least 1 platform setting is needed to display the texture platform setting UI."); - - bool allOverride = platformSettings[0].overridden; - int allSize = platformSettings[0].maxTextureSize; - TextureImporterFormat allFormat = platformSettings[0].format; - int allCompressionQuality = platformSettings[0].compressionQuality; - TextureResizeAlgorithm allResizeAlgorithm = platformSettings[0].resizeAlgorithm; - var newResizeAlgorithm = allResizeAlgorithm; - - var newOverride = allOverride; - var newSize = allSize; - var newFormat = allFormat; - var newCompressionQuality = allCompressionQuality; - - bool mixedOverride = false; - bool mixedSize = false; - bool mixedFormat = false; - bool mixedCompression = false; - bool mixedResizeAlgorithm = false; - - bool overrideChanged = false; - bool sizeChanged = false; - bool formatChanged = false; - bool compressionChanged = false; - bool resizedChanged = false; - - for (var i = 1; i < platformSettings.Count; ++i) - { - var settings = platformSettings[i]; - if (settings.overridden != allOverride) - mixedOverride = true; - if (settings.maxTextureSize != allSize) - mixedSize = true; - if (settings.format != allFormat) - mixedFormat = true; - if (settings.compressionQuality != allCompressionQuality) - mixedCompression = true; - if (settings.resizeAlgorithm != allResizeAlgorithm) - mixedResizeAlgorithm = true; - } - - EditorGUI.indentLevel++; - newOverride = view.DrawOverride(allOverride, mixedOverride, out overrideChanged); - newResizeAlgorithm = view.DrawResizeAlgorithm(allResizeAlgorithm, mixedResizeAlgorithm, mixedOverride || !allOverride, out resizedChanged); - newSize = view.DrawMaxSize(allSize, mixedSize, mixedOverride || !allOverride, out sizeChanged); - - int[] formatValues = null; - string[] formatStrings = null; - AcquireTextureFormatValuesAndStrings(buildTarget, out formatValues, out formatStrings); - - newFormat = view.DrawFormat(allFormat, formatValues, formatStrings, mixedFormat, mixedOverride || !allOverride, out formatChanged); - - - if (!mixedFormat && !mixedOverride && allOverride && IsFormatRequireCompressionSetting(allFormat)) - { - bool showAsEnum = - buildTarget == BuildTarget.iOS || - buildTarget == BuildTarget.tvOS || - buildTarget == BuildTarget.Android - ; - - if (showAsEnum) - { - int compressionMode = 1; - if (allCompressionQuality == (int)TextureCompressionQuality.Fast) - compressionMode = 0; - else if (allCompressionQuality == (int)TextureCompressionQuality.Best) - compressionMode = 2; - - var returnValue = view.DrawCompressionQualityPopup(compressionMode, mixedCompression, out compressionChanged); - - if (compressionChanged) - { - switch (returnValue) - { - case 0: - newCompressionQuality = (int)TextureCompressionQuality.Fast; - break; - case 1: - newCompressionQuality = (int)TextureCompressionQuality.Normal; - break; - case 2: - newCompressionQuality = (int)TextureCompressionQuality.Best; - break; - - default: - Assert.IsTrue(false, "ITexturePlatformSettingsView.DrawCompressionQualityPopup should never return compression option value that's not 0, 1 or 2."); - break; - } - } - } - else - { - newCompressionQuality = view.DrawCompressionQualitySlider(allCompressionQuality, mixedCompression, out compressionChanged); - } - } - EditorGUI.indentLevel--; - - if (overrideChanged || sizeChanged || formatChanged || compressionChanged || resizedChanged) - { - for (var i = 0; i < platformSettings.Count; ++i) - { - if (overrideChanged) - platformSettings[i].overridden = newOverride; - if (sizeChanged) - platformSettings[i].maxTextureSize = newSize; - if (formatChanged) - platformSettings[i].format = newFormat; - if (compressionChanged) - platformSettings[i].compressionQuality = newCompressionQuality; - if (resizedChanged) - platformSettings[i].resizeAlgorithm = newResizeAlgorithm; - } - - return true; - } - else - return false; - } - - public void AcquireTextureFormatValuesAndStrings(BuildTarget buildTarget, out int[] formatValues, out string[] formatStrings) - { - if (IsGLESMobileTargetPlatform(buildTarget)) - { - if (buildTarget == BuildTarget.iOS || buildTarget == BuildTarget.tvOS) - { - formatValues = TexturePlatformSettingsModal.kTextureFormatsValueApplePVR; - formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsApplePVR; - } - else - { - formatValues = TexturePlatformSettingsModal.kTextureFormatsValueAndroid; - formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsAndroid; - } - } - else - { - if (buildTarget == BuildTarget.WebGL) - { - formatValues = TexturePlatformSettingsModal.kTextureFormatsValueWebGL; - formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsWebGL; - } - else - { - formatValues = TexturePlatformSettingsModal.kTextureFormatsValueDefault; - formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsDefault; - } - } - } - - internal static bool IsFormatRequireCompressionSetting(TextureImporterFormat format) - { - return ArrayUtility.Contains(TexturePlatformSettingsModal.kFormatsWithCompressionSettings, format); - } - - internal static bool IsGLESMobileTargetPlatform(BuildTarget target) - { - return target == BuildTarget.iOS || target == BuildTarget.tvOS || target == BuildTarget.Android; - } - } -} +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Assertions; + +namespace UnityEditor.U2D.PSD +{ + internal class TexturePlatformSettingsController + { + public bool HandleDefaultSettings(List platformSettings, TexturePlatformSettingsView view) + { + Assert.IsTrue(platformSettings.Count > 0, "At least 1 platform setting is needed to display the texture platform setting UI."); + + int allSize = platformSettings[0].maxTextureSize; + TextureImporterCompression allCompression = platformSettings[0].textureCompression; + bool allUseCrunchedCompression = platformSettings[0].crunchedCompression; + int allCompressionQuality = platformSettings[0].compressionQuality; + TextureResizeAlgorithm allResizeAlgorithm = platformSettings[0].resizeAlgorithm; + + var newSize = allSize; + var newCompression = allCompression; + var newUseCrunchedCompression = allUseCrunchedCompression; + var newCompressionQuality = allCompressionQuality; + var newResizeAlgorithm = allResizeAlgorithm; + + bool mixedSize = false; + bool mixedCompression = false; + bool mixedUseCrunchedCompression = false; + bool mixedCompressionQuality = false; + bool mixedResizeAlgorithm = false; + + bool sizeChanged = false; + bool compressionChanged = false; + bool useCrunchedCompressionChanged = false; + bool compressionQualityChanged = false; + bool resizedChanged = false; + + for (var i = 1; i < platformSettings.Count; ++i) + { + var settings = platformSettings[i]; + if (settings.maxTextureSize != allSize) + mixedSize = true; + if (settings.textureCompression != allCompression) + mixedCompression = true; + if (settings.crunchedCompression != allUseCrunchedCompression) + mixedUseCrunchedCompression = true; + if (settings.compressionQuality != allCompressionQuality) + mixedCompressionQuality = true; + if (settings.resizeAlgorithm != allResizeAlgorithm) + mixedResizeAlgorithm = true; + } + + EditorGUI.indentLevel++; + newSize = view.DrawMaxSize(allSize, mixedSize, false, out sizeChanged); + newResizeAlgorithm = view.DrawResizeAlgorithm(allResizeAlgorithm, mixedResizeAlgorithm, false, out resizedChanged); + newCompression = view.DrawCompression(allCompression, mixedCompression, out compressionChanged); + if (!mixedCompression && allCompression != TextureImporterCompression.Uncompressed) + { + newUseCrunchedCompression = view.DrawUseCrunchedCompression(allUseCrunchedCompression, mixedUseCrunchedCompression, out useCrunchedCompressionChanged); + + if (!mixedUseCrunchedCompression && allUseCrunchedCompression) + { + newCompressionQuality = view.DrawCompressionQualitySlider(allCompressionQuality, mixedCompressionQuality, out compressionQualityChanged); + } + } + EditorGUI.indentLevel--; + + if (sizeChanged || compressionChanged || useCrunchedCompressionChanged || compressionQualityChanged || resizedChanged) + { + for (var i = 0; i < platformSettings.Count; ++i) + { + if (sizeChanged) + platformSettings[i].maxTextureSize = newSize; + if (compressionChanged) + platformSettings[i].textureCompression = newCompression; + if (useCrunchedCompressionChanged) + platformSettings[i].crunchedCompression = newUseCrunchedCompression; + if (compressionQualityChanged) + platformSettings[i].compressionQuality = newCompressionQuality; + if (resizedChanged) + platformSettings[i].resizeAlgorithm = newResizeAlgorithm; + } + return true; + } + else + return false; + } + + public bool HandlePlatformSettings(BuildTarget buildTarget, List platformSettings, TexturePlatformSettingsView view) + { + if (buildTarget == BuildTarget.NoTarget) + { + return HandleDefaultSettings(platformSettings, view); + } + Assert.IsTrue(platformSettings.Count > 0, "At least 1 platform setting is needed to display the texture platform setting UI."); + + bool allOverride = platformSettings[0].overridden; + int allSize = platformSettings[0].maxTextureSize; + TextureImporterFormat allFormat = platformSettings[0].format; + int allCompressionQuality = platformSettings[0].compressionQuality; + TextureResizeAlgorithm allResizeAlgorithm = platformSettings[0].resizeAlgorithm; + var newResizeAlgorithm = allResizeAlgorithm; + + var newOverride = allOverride; + var newSize = allSize; + var newFormat = allFormat; + var newCompressionQuality = allCompressionQuality; + + bool mixedOverride = false; + bool mixedSize = false; + bool mixedFormat = false; + bool mixedCompression = false; + bool mixedResizeAlgorithm = false; + + bool overrideChanged = false; + bool sizeChanged = false; + bool formatChanged = false; + bool compressionChanged = false; + bool resizedChanged = false; + + for (var i = 1; i < platformSettings.Count; ++i) + { + var settings = platformSettings[i]; + if (settings.overridden != allOverride) + mixedOverride = true; + if (settings.maxTextureSize != allSize) + mixedSize = true; + if (settings.format != allFormat) + mixedFormat = true; + if (settings.compressionQuality != allCompressionQuality) + mixedCompression = true; + if (settings.resizeAlgorithm != allResizeAlgorithm) + mixedResizeAlgorithm = true; + } + + EditorGUI.indentLevel++; + newOverride = view.DrawOverride(allOverride, mixedOverride, out overrideChanged); + newResizeAlgorithm = view.DrawResizeAlgorithm(allResizeAlgorithm, mixedResizeAlgorithm, mixedOverride || !allOverride, out resizedChanged); + newSize = view.DrawMaxSize(allSize, mixedSize, mixedOverride || !allOverride, out sizeChanged); + + int[] formatValues = null; + string[] formatStrings = null; + AcquireTextureFormatValuesAndStrings(buildTarget, out formatValues, out formatStrings); + + newFormat = view.DrawFormat(allFormat, formatValues, formatStrings, mixedFormat, mixedOverride || !allOverride, out formatChanged); + + + if (!mixedFormat && !mixedOverride && allOverride && IsFormatRequireCompressionSetting(allFormat)) + { + bool showAsEnum = + buildTarget == BuildTarget.iOS || + buildTarget == BuildTarget.tvOS || + buildTarget == BuildTarget.Android + ; + + if (showAsEnum) + { + int compressionMode = 1; + if (allCompressionQuality == (int)TextureCompressionQuality.Fast) + compressionMode = 0; + else if (allCompressionQuality == (int)TextureCompressionQuality.Best) + compressionMode = 2; + + var returnValue = view.DrawCompressionQualityPopup(compressionMode, mixedCompression, out compressionChanged); + + if (compressionChanged) + { + switch (returnValue) + { + case 0: + newCompressionQuality = (int)TextureCompressionQuality.Fast; + break; + case 1: + newCompressionQuality = (int)TextureCompressionQuality.Normal; + break; + case 2: + newCompressionQuality = (int)TextureCompressionQuality.Best; + break; + + default: + Assert.IsTrue(false, "ITexturePlatformSettingsView.DrawCompressionQualityPopup should never return compression option value that's not 0, 1 or 2."); + break; + } + } + } + else + { + newCompressionQuality = view.DrawCompressionQualitySlider(allCompressionQuality, mixedCompression, out compressionChanged); + } + } + EditorGUI.indentLevel--; + + if (overrideChanged || sizeChanged || formatChanged || compressionChanged || resizedChanged) + { + for (var i = 0; i < platformSettings.Count; ++i) + { + if (overrideChanged) + platformSettings[i].overridden = newOverride; + if (sizeChanged) + platformSettings[i].maxTextureSize = newSize; + if (formatChanged) + platformSettings[i].format = newFormat; + if (compressionChanged) + platformSettings[i].compressionQuality = newCompressionQuality; + if (resizedChanged) + platformSettings[i].resizeAlgorithm = newResizeAlgorithm; + } + + return true; + } + else + return false; + } + + public void AcquireTextureFormatValuesAndStrings(BuildTarget buildTarget, out int[] formatValues, out string[] formatStrings) + { + if (IsGLESMobileTargetPlatform(buildTarget)) + { + if (buildTarget == BuildTarget.iOS || buildTarget == BuildTarget.tvOS) + { + formatValues = TexturePlatformSettingsModal.kTextureFormatsValueApplePVR; + formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsApplePVR; + } + else + { + formatValues = TexturePlatformSettingsModal.kTextureFormatsValueAndroid; + formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsAndroid; + } + } + else + { + if (buildTarget == BuildTarget.WebGL) + { + formatValues = TexturePlatformSettingsModal.kTextureFormatsValueWebGL; + formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsWebGL; + } + else + { + formatValues = TexturePlatformSettingsModal.kTextureFormatsValueDefault; + formatStrings = TexturePlatformSettingsModal.s_TextureFormatStringsDefault; + } + } + } + + internal static bool IsFormatRequireCompressionSetting(TextureImporterFormat format) + { + return ArrayUtility.Contains(TexturePlatformSettingsModal.kFormatsWithCompressionSettings, format); + } + + internal static bool IsGLESMobileTargetPlatform(BuildTarget target) + { + return target == BuildTarget.iOS || target == BuildTarget.tvOS || target == BuildTarget.Android; + } + } +} diff --git a/Editor/TexturePlatformSettingsController.cs.meta b/Editor/TexturePlatformSettingsController.cs.meta index e5a594e..0dc44b0 100644 --- a/Editor/TexturePlatformSettingsController.cs.meta +++ b/Editor/TexturePlatformSettingsController.cs.meta @@ -1,13 +1,13 @@ -fileFormatVersion: 2 -guid: bec0ba5e646aab9419f2d0e88304dbd0 -timeCreated: 1502357294 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: bec0ba5e646aab9419f2d0e88304dbd0 +timeCreated: 1502357294 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/TexturePlatformSettingsModal.cs b/Editor/TexturePlatformSettingsModal.cs index bdb8573..563bf61 100644 --- a/Editor/TexturePlatformSettingsModal.cs +++ b/Editor/TexturePlatformSettingsModal.cs @@ -1,380 +1,380 @@ -namespace UnityEditor.U2D.PSD -{ - internal static class TexturePlatformSettingsModal - { - public static readonly TextureImporterFormat[] kFormatsWithCompressionSettings = - { - TextureImporterFormat.PVRTC_RGB2, - TextureImporterFormat.PVRTC_RGB4, - TextureImporterFormat.PVRTC_RGBA2, - TextureImporterFormat.PVRTC_RGBA4, - TextureImporterFormat.ETC_RGB4, - TextureImporterFormat.ETC2_RGBA8, - TextureImporterFormat.ETC_RGB4, - TextureImporterFormat.ETC2_RGB4, - TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA, - TextureImporterFormat.ETC2_RGBA8, -#if UNITY_2019_1_OR_NEWER - TextureImporterFormat.ASTC_4x4, - TextureImporterFormat.ASTC_5x5, - TextureImporterFormat.ASTC_6x6, - TextureImporterFormat.ASTC_8x8, - TextureImporterFormat.ASTC_10x10, - TextureImporterFormat.ASTC_12x12, -#else - TextureImporterFormat.ASTC_RGB_4x4, - TextureImporterFormat.ASTC_RGB_5x5, - TextureImporterFormat.ASTC_RGB_6x6, - TextureImporterFormat.ASTC_RGB_8x8, - TextureImporterFormat.ASTC_RGB_10x10, - TextureImporterFormat.ASTC_RGB_12x12, - TextureImporterFormat.ASTC_RGBA_4x4, - TextureImporterFormat.ASTC_RGBA_5x5, - TextureImporterFormat.ASTC_RGBA_6x6, - TextureImporterFormat.ASTC_RGBA_8x8, - TextureImporterFormat.ASTC_RGBA_10x10, - TextureImporterFormat.ASTC_RGBA_12x12 - #endif - }; - - public struct BuildPlatformData - { - public string buildTargetName; - public TextureImporterFormat defaultTextureFormat; - public BuildTarget[] buildTarget; - } - - // Add new platforms here - public static readonly BuildPlatformData[] kValidBuildPlatform = new BuildPlatformData[] - { - new BuildPlatformData() - { - buildTargetName = "Default", - defaultTextureFormat = TextureImporterFormat.Automatic, - buildTarget = new[] - { - BuildTarget.NoTarget - } - }, - - new BuildPlatformData() - { - buildTargetName = "PC, Mac & Linux Standalone", - defaultTextureFormat = TextureImporterFormat.RGBA32, - buildTarget = new[] - { - BuildTarget.StandaloneWindows, - BuildTarget.StandaloneWindows64, - BuildTarget.StandaloneLinux64, - BuildTarget.StandaloneOSX, - } - }, - new BuildPlatformData() - { - buildTargetName = "iOS", - defaultTextureFormat = TextureImporterFormat.RGBA32, - buildTarget = new[] { BuildTarget.iOS } - }, - new BuildPlatformData() - { - buildTargetName = "tvOS", - defaultTextureFormat = TextureImporterFormat.RGBA32, - buildTarget = new[] { BuildTarget.tvOS } - }, - new BuildPlatformData() - { - buildTargetName = "Android", - defaultTextureFormat = TextureImporterFormat.RGBA32, - buildTarget = new[] { BuildTarget.Android } - }, - new BuildPlatformData() - { - buildTargetName = "Universal Windows Platform", - defaultTextureFormat = TextureImporterFormat.RGBA32, - buildTarget = new[] { BuildTarget.WSAPlayer } - }, - }; - - public static readonly int[] kTextureFormatsValueApplePVR = - { - (int)TextureImporterFormat.PVRTC_RGB2, - (int)TextureImporterFormat.PVRTC_RGBA2, - (int)TextureImporterFormat.PVRTC_RGB4, - (int)TextureImporterFormat.PVRTC_RGBA4, - -#if UNITY_2019_1_OR_NEWER - (int)TextureImporterFormat.ASTC_4x4, - (int)TextureImporterFormat.ASTC_5x5, - (int)TextureImporterFormat.ASTC_6x6, - (int)TextureImporterFormat.ASTC_8x8, - (int)TextureImporterFormat.ASTC_10x10, - (int)TextureImporterFormat.ASTC_12x12, -#else - (int)TextureImporterFormat.ASTC_RGB_4x4, - (int)TextureImporterFormat.ASTC_RGB_5x5, - (int)TextureImporterFormat.ASTC_RGB_6x6, - (int)TextureImporterFormat.ASTC_RGB_8x8, - (int)TextureImporterFormat.ASTC_RGB_10x10, - (int)TextureImporterFormat.ASTC_RGB_12x12, - (int)TextureImporterFormat.ASTC_RGBA_4x4, - (int)TextureImporterFormat.ASTC_RGBA_5x5, - (int)TextureImporterFormat.ASTC_RGBA_6x6, - (int)TextureImporterFormat.ASTC_RGBA_8x8, - (int)TextureImporterFormat.ASTC_RGBA_10x10, - (int)TextureImporterFormat.ASTC_RGBA_12x12, -#endif - - (int)TextureImporterFormat.RGB16, - (int)TextureImporterFormat.RGB24, - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.RGBA16, - (int)TextureImporterFormat.RGBA32 - }; - - public static readonly int[] kTextureFormatsValueAndroid = - { - (int)TextureImporterFormat.DXT1, - (int)TextureImporterFormat.DXT5, -#if ENABLE_CRUNCH_TEXTURE_COMPRESSION - (int)TextureImporterFormat.DXT1Crunched, - (int)TextureImporterFormat.DXT5Crunched, -#endif - - (int)TextureImporterFormat.ETC_RGB4, - - (int)TextureImporterFormat.ETC2_RGB4, - (int)TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA, - (int)TextureImporterFormat.ETC2_RGBA8, - - - (int)TextureImporterFormat.PVRTC_RGB2, - (int)TextureImporterFormat.PVRTC_RGBA2, - (int)TextureImporterFormat.PVRTC_RGB4, - (int)TextureImporterFormat.PVRTC_RGBA4, - - (int)TextureImporterFormat.ETC_RGB4, - (int)TextureImporterFormat.ETC2_RGBA8, - -#if UNITY_2019_1_OR_NEWER - (int)TextureImporterFormat.ASTC_4x4, - (int)TextureImporterFormat.ASTC_5x5, - (int)TextureImporterFormat.ASTC_6x6, - (int)TextureImporterFormat.ASTC_8x8, - (int)TextureImporterFormat.ASTC_10x10, - (int)TextureImporterFormat.ASTC_12x12, -#else - (int)TextureImporterFormat.ASTC_RGB_4x4, - (int)TextureImporterFormat.ASTC_RGB_5x5, - (int)TextureImporterFormat.ASTC_RGB_6x6, - (int)TextureImporterFormat.ASTC_RGB_8x8, - (int)TextureImporterFormat.ASTC_RGB_10x10, - (int)TextureImporterFormat.ASTC_RGB_12x12, - (int)TextureImporterFormat.ASTC_RGBA_4x4, - (int)TextureImporterFormat.ASTC_RGBA_5x5, - (int)TextureImporterFormat.ASTC_RGBA_6x6, - (int)TextureImporterFormat.ASTC_RGBA_8x8, - (int)TextureImporterFormat.ASTC_RGBA_10x10, - (int)TextureImporterFormat.ASTC_RGBA_12x12, -#endif - - (int)TextureImporterFormat.RGB16, - (int)TextureImporterFormat.RGB24, - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.RGBA16, - (int)TextureImporterFormat.RGBA32 - }; - - public static readonly int[] kTextureFormatsValueSTV = - { - (int)TextureImporterFormat.ETC_RGB4, - - (int)TextureImporterFormat.RGB16, - (int)TextureImporterFormat.RGB24, - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.RGBA16, - (int)TextureImporterFormat.RGBA32, - }; - - public static readonly int[] kTextureFormatsValueWebGL = - { - (int)TextureImporterFormat.DXT1, - (int)TextureImporterFormat.DXT5, -#if ENABLE_CRUNCH_TEXTURE_COMPRESSION - (int)TextureImporterFormat.DXT1Crunched, - (int)TextureImporterFormat.DXT5Crunched, -#endif - (int)TextureImporterFormat.RGB16, - (int)TextureImporterFormat.RGB24, - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.ARGB16, - (int)TextureImporterFormat.RGBA32 - }; - - public static readonly int[] kNormalFormatsValueDefault = - { - (int)TextureImporterFormat.BC5, - (int)TextureImporterFormat.BC7, - (int)TextureImporterFormat.DXT5, -#if ENABLE_CRUNCH_TEXTURE_COMPRESSION - (int)TextureImporterFormat.DXT5Crunched, -#endif - (int)TextureImporterFormat.ARGB16, - (int)TextureImporterFormat.RGBA32, - }; - public static readonly int[] kTextureFormatsValueDefault = - { - (int)TextureImporterFormat.DXT1, - (int)TextureImporterFormat.DXT5, -#if ENABLE_CRUNCH_TEXTURE_COMPRESSION - (int)TextureImporterFormat.DXT1Crunched, - (int)TextureImporterFormat.DXT5Crunched, -#endif - (int)TextureImporterFormat.RGB16, - (int)TextureImporterFormat.RGB24, - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.ARGB16, - (int)TextureImporterFormat.RGBA32, - (int)TextureImporterFormat.RGBAHalf, - (int)TextureImporterFormat.BC4, - (int)TextureImporterFormat.BC5, - (int)TextureImporterFormat.BC6H, - (int)TextureImporterFormat.BC7, - }; - public static readonly int[] kTextureFormatsValueSingleChannel = - { - (int)TextureImporterFormat.Alpha8, - (int)TextureImporterFormat.BC4, - }; - - internal static string[] s_TextureFormatStringsWebGL; - internal static string[] s_TextureFormatStringsApplePVR; - internal static string[] s_TextureFormatStringsAndroid; - internal static string[] s_TextureFormatStringsSTV; - internal static string[] s_TextureFormatStringsSingleChannel; - internal static string[] s_TextureFormatStringsDefault; - - static TexturePlatformSettingsModal() - { - s_TextureFormatStringsApplePVR = BuildTextureStrings(kTextureFormatsValueApplePVR); - s_TextureFormatStringsAndroid = BuildTextureStrings(kTextureFormatsValueAndroid); - s_TextureFormatStringsSTV = BuildTextureStrings(kTextureFormatsValueSTV); - s_TextureFormatStringsWebGL = BuildTextureStrings(kTextureFormatsValueWebGL); - s_TextureFormatStringsDefault = BuildTextureStrings(kTextureFormatsValueDefault); - s_TextureFormatStringsSingleChannel = BuildTextureStrings(kTextureFormatsValueSingleChannel); - } - - internal static string[] BuildTextureStrings(int[] texFormatValues) - { - string[] retval = new string[texFormatValues.Length]; - for (int i = 0; i < texFormatValues.Length; i++) - { - int val = texFormatValues[i]; - retval[i] = GetTextureFormatString((TextureImporterFormat)val); - } - return retval; - } - - static string GetTextureFormatString(TextureImporterFormat format) - { - switch (format) - { - case TextureImporterFormat.DXT1: - return "RGB Crunched DTX1"; - case TextureImporterFormat.DXT5: - return "RGB Crunched DTX5"; - case TextureImporterFormat.RGB16: - return "RGB 16 bit"; - case TextureImporterFormat.RGB24: - return "RGB 24 bit"; - case TextureImporterFormat.Alpha8: - return "Alpha 8"; - case TextureImporterFormat.ARGB16: - return "ARGB 16 bit"; - case TextureImporterFormat.RGBA32: - return "RGBA 32 bit"; - case TextureImporterFormat.ARGB32: - return "ARGB 32 bit"; - case TextureImporterFormat.RGBA16: - return "RGBA 16 bit"; - case TextureImporterFormat.RGBAHalf: - return "RGBA Half"; - - case TextureImporterFormat.BC4: - return "R Compressed BC4"; - case TextureImporterFormat.BC5: - return "RG Compressed BC5"; - case TextureImporterFormat.BC6H: - return "RGB HDR Compressed BC6H"; - case TextureImporterFormat.BC7: - return "RGB(A) Compressed BC7"; - case TextureImporterFormat.PVRTC_RGB2: - return "RGB Compressed PVRTC 2 bits"; - case TextureImporterFormat.PVRTC_RGBA2: - return "RGBA Compressed PVRTC 2 bits"; - case TextureImporterFormat.PVRTC_RGB4: - return "RGB Compressed PVRTC 4 bits"; - case TextureImporterFormat.PVRTC_RGBA4: - return "RGBA Compressed PVRTC 4 bits"; - case TextureImporterFormat.ETC_RGB4: - return "RGB Compressed ETC 4 bits"; - - case TextureImporterFormat.EAC_R: - return "11-bit R Compressed EAC 4 bit"; - case TextureImporterFormat.EAC_R_SIGNED: - return "11-bit signed R Compressed EAC 4 bit"; - case TextureImporterFormat.EAC_RG: - return "11-bit RG Compressed EAC 8 bit"; - case TextureImporterFormat.EAC_RG_SIGNED: - return "11-bit signed RG Compressed EAC 8 bit"; - - case TextureImporterFormat.ETC2_RGB4: - return "RGB Compressed ETC2 4 bits"; - case TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA: - return "RGB + 1-bit Alpha Compressed ETC2 4 bits"; - case TextureImporterFormat.ETC2_RGBA8: - return "RGBA Compressed ETC2 8 bits"; - -#if UNITY_2019_1_OR_NEWER - case TextureImporterFormat.ASTC_4x4: - return "RGB(A) Compressed ASTC 4 x 4 block"; - case TextureImporterFormat.ASTC_5x5: - return "RGB(A) Compressed ASTC 5 x 5 block"; - case TextureImporterFormat.ASTC_6x6: - return "RGB(A) Compressed ASTC 6 x 6 block"; - case TextureImporterFormat.ASTC_8x8: - return "RGB(A) Compressed ASTC 8 x 8 block"; - case TextureImporterFormat.ASTC_10x10: - return "RGB(A) Compressed ASTC 10 x 10 block"; - case TextureImporterFormat.ASTC_12x12: - return "RGB(A) Compressed ASTC 12 x 12 block"; -#else - case TextureImporterFormat.ASTC_RGB_4x4: - return "RGB Compressed ASTC 4 x 4 block"; - case TextureImporterFormat.ASTC_RGB_5x5: - return "RGB Compressed ASTC 5 x 5 block"; - case TextureImporterFormat.ASTC_RGB_6x6: - return "RGB Compressed ASTC 6 x 6 block"; - case TextureImporterFormat.ASTC_RGB_8x8: - return "RGB Compressed ASTC 8 x 8 block"; - case TextureImporterFormat.ASTC_RGB_10x10: - return "RGB Compressed ASTC 10 x 10 block"; - case TextureImporterFormat.ASTC_RGB_12x12: - return "RGB Compressed ASTC 12 x 12 block"; - case TextureImporterFormat.ASTC_RGBA_4x4: - return "RGBA Compressed ASTC 4 x 4 block"; - case TextureImporterFormat.ASTC_RGBA_5x5: - return "RGBA Compressed ASTC 5 x 5 block"; - case TextureImporterFormat.ASTC_RGBA_6x6: - return "RGBA Compressed ASTC 6 x 6 block"; - case TextureImporterFormat.ASTC_RGBA_8x8: - return "RGBA Compressed ASTC 8 x 8 block"; - case TextureImporterFormat.ASTC_RGBA_10x10: - return "RGBA Compressed ASTC 10 x 10 block"; - case TextureImporterFormat.ASTC_RGBA_12x12: - return "RGBA Compressed ASTC 12 x 12 block"; -#endif - } - return "Unsupported"; - } - } -} +namespace UnityEditor.U2D.PSD +{ + internal static class TexturePlatformSettingsModal + { + public static readonly TextureImporterFormat[] kFormatsWithCompressionSettings = + { + TextureImporterFormat.PVRTC_RGB2, + TextureImporterFormat.PVRTC_RGB4, + TextureImporterFormat.PVRTC_RGBA2, + TextureImporterFormat.PVRTC_RGBA4, + TextureImporterFormat.ETC_RGB4, + TextureImporterFormat.ETC2_RGBA8, + TextureImporterFormat.ETC_RGB4, + TextureImporterFormat.ETC2_RGB4, + TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA, + TextureImporterFormat.ETC2_RGBA8, +#if UNITY_2019_1_OR_NEWER + TextureImporterFormat.ASTC_4x4, + TextureImporterFormat.ASTC_5x5, + TextureImporterFormat.ASTC_6x6, + TextureImporterFormat.ASTC_8x8, + TextureImporterFormat.ASTC_10x10, + TextureImporterFormat.ASTC_12x12, +#else + TextureImporterFormat.ASTC_RGB_4x4, + TextureImporterFormat.ASTC_RGB_5x5, + TextureImporterFormat.ASTC_RGB_6x6, + TextureImporterFormat.ASTC_RGB_8x8, + TextureImporterFormat.ASTC_RGB_10x10, + TextureImporterFormat.ASTC_RGB_12x12, + TextureImporterFormat.ASTC_RGBA_4x4, + TextureImporterFormat.ASTC_RGBA_5x5, + TextureImporterFormat.ASTC_RGBA_6x6, + TextureImporterFormat.ASTC_RGBA_8x8, + TextureImporterFormat.ASTC_RGBA_10x10, + TextureImporterFormat.ASTC_RGBA_12x12 + #endif + }; + + public struct BuildPlatformData + { + public string buildTargetName; + public TextureImporterFormat defaultTextureFormat; + public BuildTarget[] buildTarget; + } + + // Add new platforms here + public static readonly BuildPlatformData[] kValidBuildPlatform = new BuildPlatformData[] + { + new BuildPlatformData() + { + buildTargetName = "Default", + defaultTextureFormat = TextureImporterFormat.Automatic, + buildTarget = new[] + { + BuildTarget.NoTarget + } + }, + + new BuildPlatformData() + { + buildTargetName = "PC, Mac & Linux Standalone", + defaultTextureFormat = TextureImporterFormat.RGBA32, + buildTarget = new[] + { + BuildTarget.StandaloneWindows, + BuildTarget.StandaloneWindows64, + BuildTarget.StandaloneLinux64, + BuildTarget.StandaloneOSX, + } + }, + new BuildPlatformData() + { + buildTargetName = "iOS", + defaultTextureFormat = TextureImporterFormat.RGBA32, + buildTarget = new[] { BuildTarget.iOS } + }, + new BuildPlatformData() + { + buildTargetName = "tvOS", + defaultTextureFormat = TextureImporterFormat.RGBA32, + buildTarget = new[] { BuildTarget.tvOS } + }, + new BuildPlatformData() + { + buildTargetName = "Android", + defaultTextureFormat = TextureImporterFormat.RGBA32, + buildTarget = new[] { BuildTarget.Android } + }, + new BuildPlatformData() + { + buildTargetName = "Universal Windows Platform", + defaultTextureFormat = TextureImporterFormat.RGBA32, + buildTarget = new[] { BuildTarget.WSAPlayer } + }, + }; + + public static readonly int[] kTextureFormatsValueApplePVR = + { + (int)TextureImporterFormat.PVRTC_RGB2, + (int)TextureImporterFormat.PVRTC_RGBA2, + (int)TextureImporterFormat.PVRTC_RGB4, + (int)TextureImporterFormat.PVRTC_RGBA4, + +#if UNITY_2019_1_OR_NEWER + (int)TextureImporterFormat.ASTC_4x4, + (int)TextureImporterFormat.ASTC_5x5, + (int)TextureImporterFormat.ASTC_6x6, + (int)TextureImporterFormat.ASTC_8x8, + (int)TextureImporterFormat.ASTC_10x10, + (int)TextureImporterFormat.ASTC_12x12, +#else + (int)TextureImporterFormat.ASTC_RGB_4x4, + (int)TextureImporterFormat.ASTC_RGB_5x5, + (int)TextureImporterFormat.ASTC_RGB_6x6, + (int)TextureImporterFormat.ASTC_RGB_8x8, + (int)TextureImporterFormat.ASTC_RGB_10x10, + (int)TextureImporterFormat.ASTC_RGB_12x12, + (int)TextureImporterFormat.ASTC_RGBA_4x4, + (int)TextureImporterFormat.ASTC_RGBA_5x5, + (int)TextureImporterFormat.ASTC_RGBA_6x6, + (int)TextureImporterFormat.ASTC_RGBA_8x8, + (int)TextureImporterFormat.ASTC_RGBA_10x10, + (int)TextureImporterFormat.ASTC_RGBA_12x12, +#endif + + (int)TextureImporterFormat.RGB16, + (int)TextureImporterFormat.RGB24, + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.RGBA16, + (int)TextureImporterFormat.RGBA32 + }; + + public static readonly int[] kTextureFormatsValueAndroid = + { + (int)TextureImporterFormat.DXT1, + (int)TextureImporterFormat.DXT5, +#if ENABLE_CRUNCH_TEXTURE_COMPRESSION + (int)TextureImporterFormat.DXT1Crunched, + (int)TextureImporterFormat.DXT5Crunched, +#endif + + (int)TextureImporterFormat.ETC_RGB4, + + (int)TextureImporterFormat.ETC2_RGB4, + (int)TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA, + (int)TextureImporterFormat.ETC2_RGBA8, + + + (int)TextureImporterFormat.PVRTC_RGB2, + (int)TextureImporterFormat.PVRTC_RGBA2, + (int)TextureImporterFormat.PVRTC_RGB4, + (int)TextureImporterFormat.PVRTC_RGBA4, + + (int)TextureImporterFormat.ETC_RGB4, + (int)TextureImporterFormat.ETC2_RGBA8, + +#if UNITY_2019_1_OR_NEWER + (int)TextureImporterFormat.ASTC_4x4, + (int)TextureImporterFormat.ASTC_5x5, + (int)TextureImporterFormat.ASTC_6x6, + (int)TextureImporterFormat.ASTC_8x8, + (int)TextureImporterFormat.ASTC_10x10, + (int)TextureImporterFormat.ASTC_12x12, +#else + (int)TextureImporterFormat.ASTC_RGB_4x4, + (int)TextureImporterFormat.ASTC_RGB_5x5, + (int)TextureImporterFormat.ASTC_RGB_6x6, + (int)TextureImporterFormat.ASTC_RGB_8x8, + (int)TextureImporterFormat.ASTC_RGB_10x10, + (int)TextureImporterFormat.ASTC_RGB_12x12, + (int)TextureImporterFormat.ASTC_RGBA_4x4, + (int)TextureImporterFormat.ASTC_RGBA_5x5, + (int)TextureImporterFormat.ASTC_RGBA_6x6, + (int)TextureImporterFormat.ASTC_RGBA_8x8, + (int)TextureImporterFormat.ASTC_RGBA_10x10, + (int)TextureImporterFormat.ASTC_RGBA_12x12, +#endif + + (int)TextureImporterFormat.RGB16, + (int)TextureImporterFormat.RGB24, + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.RGBA16, + (int)TextureImporterFormat.RGBA32 + }; + + public static readonly int[] kTextureFormatsValueSTV = + { + (int)TextureImporterFormat.ETC_RGB4, + + (int)TextureImporterFormat.RGB16, + (int)TextureImporterFormat.RGB24, + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.RGBA16, + (int)TextureImporterFormat.RGBA32, + }; + + public static readonly int[] kTextureFormatsValueWebGL = + { + (int)TextureImporterFormat.DXT1, + (int)TextureImporterFormat.DXT5, +#if ENABLE_CRUNCH_TEXTURE_COMPRESSION + (int)TextureImporterFormat.DXT1Crunched, + (int)TextureImporterFormat.DXT5Crunched, +#endif + (int)TextureImporterFormat.RGB16, + (int)TextureImporterFormat.RGB24, + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.ARGB16, + (int)TextureImporterFormat.RGBA32 + }; + + public static readonly int[] kNormalFormatsValueDefault = + { + (int)TextureImporterFormat.BC5, + (int)TextureImporterFormat.BC7, + (int)TextureImporterFormat.DXT5, +#if ENABLE_CRUNCH_TEXTURE_COMPRESSION + (int)TextureImporterFormat.DXT5Crunched, +#endif + (int)TextureImporterFormat.ARGB16, + (int)TextureImporterFormat.RGBA32, + }; + public static readonly int[] kTextureFormatsValueDefault = + { + (int)TextureImporterFormat.DXT1, + (int)TextureImporterFormat.DXT5, +#if ENABLE_CRUNCH_TEXTURE_COMPRESSION + (int)TextureImporterFormat.DXT1Crunched, + (int)TextureImporterFormat.DXT5Crunched, +#endif + (int)TextureImporterFormat.RGB16, + (int)TextureImporterFormat.RGB24, + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.ARGB16, + (int)TextureImporterFormat.RGBA32, + (int)TextureImporterFormat.RGBAHalf, + (int)TextureImporterFormat.BC4, + (int)TextureImporterFormat.BC5, + (int)TextureImporterFormat.BC6H, + (int)TextureImporterFormat.BC7, + }; + public static readonly int[] kTextureFormatsValueSingleChannel = + { + (int)TextureImporterFormat.Alpha8, + (int)TextureImporterFormat.BC4, + }; + + internal static string[] s_TextureFormatStringsWebGL; + internal static string[] s_TextureFormatStringsApplePVR; + internal static string[] s_TextureFormatStringsAndroid; + internal static string[] s_TextureFormatStringsSTV; + internal static string[] s_TextureFormatStringsSingleChannel; + internal static string[] s_TextureFormatStringsDefault; + + static TexturePlatformSettingsModal() + { + s_TextureFormatStringsApplePVR = BuildTextureStrings(kTextureFormatsValueApplePVR); + s_TextureFormatStringsAndroid = BuildTextureStrings(kTextureFormatsValueAndroid); + s_TextureFormatStringsSTV = BuildTextureStrings(kTextureFormatsValueSTV); + s_TextureFormatStringsWebGL = BuildTextureStrings(kTextureFormatsValueWebGL); + s_TextureFormatStringsDefault = BuildTextureStrings(kTextureFormatsValueDefault); + s_TextureFormatStringsSingleChannel = BuildTextureStrings(kTextureFormatsValueSingleChannel); + } + + internal static string[] BuildTextureStrings(int[] texFormatValues) + { + string[] retval = new string[texFormatValues.Length]; + for (int i = 0; i < texFormatValues.Length; i++) + { + int val = texFormatValues[i]; + retval[i] = GetTextureFormatString((TextureImporterFormat)val); + } + return retval; + } + + static string GetTextureFormatString(TextureImporterFormat format) + { + switch (format) + { + case TextureImporterFormat.DXT1: + return "RGB Crunched DTX1"; + case TextureImporterFormat.DXT5: + return "RGB Crunched DTX5"; + case TextureImporterFormat.RGB16: + return "RGB 16 bit"; + case TextureImporterFormat.RGB24: + return "RGB 24 bit"; + case TextureImporterFormat.Alpha8: + return "Alpha 8"; + case TextureImporterFormat.ARGB16: + return "ARGB 16 bit"; + case TextureImporterFormat.RGBA32: + return "RGBA 32 bit"; + case TextureImporterFormat.ARGB32: + return "ARGB 32 bit"; + case TextureImporterFormat.RGBA16: + return "RGBA 16 bit"; + case TextureImporterFormat.RGBAHalf: + return "RGBA Half"; + + case TextureImporterFormat.BC4: + return "R Compressed BC4"; + case TextureImporterFormat.BC5: + return "RG Compressed BC5"; + case TextureImporterFormat.BC6H: + return "RGB HDR Compressed BC6H"; + case TextureImporterFormat.BC7: + return "RGB(A) Compressed BC7"; + case TextureImporterFormat.PVRTC_RGB2: + return "RGB Compressed PVRTC 2 bits"; + case TextureImporterFormat.PVRTC_RGBA2: + return "RGBA Compressed PVRTC 2 bits"; + case TextureImporterFormat.PVRTC_RGB4: + return "RGB Compressed PVRTC 4 bits"; + case TextureImporterFormat.PVRTC_RGBA4: + return "RGBA Compressed PVRTC 4 bits"; + case TextureImporterFormat.ETC_RGB4: + return "RGB Compressed ETC 4 bits"; + + case TextureImporterFormat.EAC_R: + return "11-bit R Compressed EAC 4 bit"; + case TextureImporterFormat.EAC_R_SIGNED: + return "11-bit signed R Compressed EAC 4 bit"; + case TextureImporterFormat.EAC_RG: + return "11-bit RG Compressed EAC 8 bit"; + case TextureImporterFormat.EAC_RG_SIGNED: + return "11-bit signed RG Compressed EAC 8 bit"; + + case TextureImporterFormat.ETC2_RGB4: + return "RGB Compressed ETC2 4 bits"; + case TextureImporterFormat.ETC2_RGB4_PUNCHTHROUGH_ALPHA: + return "RGB + 1-bit Alpha Compressed ETC2 4 bits"; + case TextureImporterFormat.ETC2_RGBA8: + return "RGBA Compressed ETC2 8 bits"; + +#if UNITY_2019_1_OR_NEWER + case TextureImporterFormat.ASTC_4x4: + return "RGB(A) Compressed ASTC 4 x 4 block"; + case TextureImporterFormat.ASTC_5x5: + return "RGB(A) Compressed ASTC 5 x 5 block"; + case TextureImporterFormat.ASTC_6x6: + return "RGB(A) Compressed ASTC 6 x 6 block"; + case TextureImporterFormat.ASTC_8x8: + return "RGB(A) Compressed ASTC 8 x 8 block"; + case TextureImporterFormat.ASTC_10x10: + return "RGB(A) Compressed ASTC 10 x 10 block"; + case TextureImporterFormat.ASTC_12x12: + return "RGB(A) Compressed ASTC 12 x 12 block"; +#else + case TextureImporterFormat.ASTC_RGB_4x4: + return "RGB Compressed ASTC 4 x 4 block"; + case TextureImporterFormat.ASTC_RGB_5x5: + return "RGB Compressed ASTC 5 x 5 block"; + case TextureImporterFormat.ASTC_RGB_6x6: + return "RGB Compressed ASTC 6 x 6 block"; + case TextureImporterFormat.ASTC_RGB_8x8: + return "RGB Compressed ASTC 8 x 8 block"; + case TextureImporterFormat.ASTC_RGB_10x10: + return "RGB Compressed ASTC 10 x 10 block"; + case TextureImporterFormat.ASTC_RGB_12x12: + return "RGB Compressed ASTC 12 x 12 block"; + case TextureImporterFormat.ASTC_RGBA_4x4: + return "RGBA Compressed ASTC 4 x 4 block"; + case TextureImporterFormat.ASTC_RGBA_5x5: + return "RGBA Compressed ASTC 5 x 5 block"; + case TextureImporterFormat.ASTC_RGBA_6x6: + return "RGBA Compressed ASTC 6 x 6 block"; + case TextureImporterFormat.ASTC_RGBA_8x8: + return "RGBA Compressed ASTC 8 x 8 block"; + case TextureImporterFormat.ASTC_RGBA_10x10: + return "RGBA Compressed ASTC 10 x 10 block"; + case TextureImporterFormat.ASTC_RGBA_12x12: + return "RGBA Compressed ASTC 12 x 12 block"; +#endif + } + return "Unsupported"; + } + } +} diff --git a/Editor/TexturePlatformSettingsModal.cs.meta b/Editor/TexturePlatformSettingsModal.cs.meta index 769299e..bb86804 100644 --- a/Editor/TexturePlatformSettingsModal.cs.meta +++ b/Editor/TexturePlatformSettingsModal.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 82b98efb927566943b71cfb089627aa4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 82b98efb927566943b71cfb089627aa4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/TexturePlatformSettingsView.cs b/Editor/TexturePlatformSettingsView.cs index 1c1cac9..3bda239 100644 --- a/Editor/TexturePlatformSettingsView.cs +++ b/Editor/TexturePlatformSettingsView.cs @@ -1,155 +1,155 @@ -using UnityEngine; - -namespace UnityEditor.U2D.PSD -{ - internal class TexturePlatformSettingsView - { - class Styles - { - public readonly GUIContent textureFormatLabel = new GUIContent("Format"); - public readonly GUIContent maxTextureSizeLabel = new GUIContent("Max Texture Size", "Maximum size of the packed texture."); - public readonly GUIContent compressionLabel = new GUIContent("Compression", "How will this texture be compressed?"); - public readonly GUIContent resizeAlgorithmLabel = new GUIContent("Resize", "Algorithm to use when resizing texture"); - public readonly GUIContent useCrunchedCompressionLabel = new GUIContent("Use Crunch Compression", "Texture is crunch-compressed to save space on disk when applicable."); - public readonly GUIContent compressionQualityLabel = new GUIContent("Compressor Quality"); - public readonly GUIContent compressionQualitySliderLabel = new GUIContent("Compressor Quality", "Use the slider to adjust compression quality from 0 (Fastest) to 100 (Best)"); - - public readonly int[] kMaxTextureSizeValues = { 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; - public readonly GUIContent[] kMaxTextureSizeStrings; - - public readonly GUIContent[] kTextureCompressionOptions = - { - new GUIContent("None", "Texture is not compressed."), - new GUIContent("Low Quality", "Texture compressed with low quality but high performance, high compression format."), - new GUIContent("Normal Quality", "Texture is compressed with a standard format."), - new GUIContent("High Quality", "Texture compressed with a high quality format."), - }; - - public readonly GUIContent[] kResizeAlgoritmOptions = - { - new GUIContent(TextureResizeAlgorithm.Mitchell.ToString()), - new GUIContent(TextureResizeAlgorithm.Bilinear.ToString()), - }; - - public readonly int[] kTextureCompressionValues = - { - (int)TextureImporterCompression.Uncompressed, - (int)TextureImporterCompression.CompressedLQ, - (int)TextureImporterCompression.Compressed, - (int)TextureImporterCompression.CompressedHQ - }; - - public readonly GUIContent[] kMobileCompressionQualityOptions = - { - new GUIContent("Fast"), - new GUIContent("Normal"), - new GUIContent("Best") - }; - - public Styles() - { - kMaxTextureSizeStrings = new GUIContent[kMaxTextureSizeValues.Length]; - for (var i = 0; i < kMaxTextureSizeValues.Length; ++i) - kMaxTextureSizeStrings[i] = new GUIContent(string.Format("{0}", kMaxTextureSizeValues[i])); - } - } - - private static Styles s_Styles; - - public string buildPlatformTitle { get; set; } - - internal TexturePlatformSettingsView() - { - s_Styles = s_Styles ?? new Styles(); - } - - public virtual TextureResizeAlgorithm DrawResizeAlgorithm(TextureResizeAlgorithm defaultValue, bool isMixedValue, bool isDisabled, out bool changed) - { - using (new EditorGUI.DisabledScope(isDisabled)) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = (TextureResizeAlgorithm)EditorGUILayout.EnumPopup(s_Styles.resizeAlgorithmLabel, defaultValue); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - } - return defaultValue; - } - - public virtual TextureImporterCompression DrawCompression(TextureImporterCompression defaultValue, bool isMixedValue, out bool changed) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = (TextureImporterCompression)EditorGUILayout.IntPopup(s_Styles.compressionLabel, (int)defaultValue, s_Styles.kTextureCompressionOptions, s_Styles.kTextureCompressionValues); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - - public virtual bool DrawUseCrunchedCompression(bool defaultValue, bool isMixedValue, out bool changed) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = EditorGUILayout.Toggle(s_Styles.useCrunchedCompressionLabel, defaultValue); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - - public virtual bool DrawOverride(bool defaultValue, bool isMixedValue, out bool changed) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = EditorGUILayout.ToggleLeft(new GUIContent("Override"), defaultValue); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - - public virtual int DrawMaxSize(int defaultValue, bool isMixedValue, bool isDisabled, out bool changed) - { - using (new EditorGUI.DisabledScope(isDisabled)) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = EditorGUILayout.IntPopup(s_Styles.maxTextureSizeLabel, defaultValue, s_Styles.kMaxTextureSizeStrings, s_Styles.kMaxTextureSizeValues); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - } - - public virtual TextureImporterFormat DrawFormat(TextureImporterFormat defaultValue, int[] displayValues, string[] displayStrings, bool isMixedValue, bool isDisabled, out bool changed) - { - using (new EditorGUI.DisabledScope(isDisabled)) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = (TextureImporterFormat)EditorGUILayout.IntPopup(s_Styles.textureFormatLabel.text, (int)defaultValue, displayStrings, displayValues); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - } - - public virtual int DrawCompressionQualityPopup(int defaultValue, bool isMixedValue, out bool changed) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = EditorGUILayout.Popup(s_Styles.compressionQualityLabel, defaultValue, s_Styles.kMobileCompressionQualityOptions); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - - public virtual int DrawCompressionQualitySlider(int defaultValue, bool isMixedValue, out bool changed) - { - EditorGUI.BeginChangeCheck(); - EditorGUI.showMixedValue = isMixedValue; - defaultValue = EditorGUILayout.IntSlider(s_Styles.compressionQualitySliderLabel, defaultValue, 0, 100); - EditorGUI.showMixedValue = false; - changed = EditorGUI.EndChangeCheck(); - return defaultValue; - } - } -} +using UnityEngine; + +namespace UnityEditor.U2D.PSD +{ + internal class TexturePlatformSettingsView + { + class Styles + { + public readonly GUIContent textureFormatLabel = new GUIContent("Format"); + public readonly GUIContent maxTextureSizeLabel = new GUIContent("Max Texture Size", "Maximum size of the packed texture."); + public readonly GUIContent compressionLabel = new GUIContent("Compression", "How will this texture be compressed?"); + public readonly GUIContent resizeAlgorithmLabel = new GUIContent("Resize", "Algorithm to use when resizing texture"); + public readonly GUIContent useCrunchedCompressionLabel = new GUIContent("Use Crunch Compression", "Texture is crunch-compressed to save space on disk when applicable."); + public readonly GUIContent compressionQualityLabel = new GUIContent("Compressor Quality"); + public readonly GUIContent compressionQualitySliderLabel = new GUIContent("Compressor Quality", "Use the slider to adjust compression quality from 0 (Fastest) to 100 (Best)"); + + public readonly int[] kMaxTextureSizeValues = { 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + public readonly GUIContent[] kMaxTextureSizeStrings; + + public readonly GUIContent[] kTextureCompressionOptions = + { + new GUIContent("None", "Texture is not compressed."), + new GUIContent("Low Quality", "Texture compressed with low quality but high performance, high compression format."), + new GUIContent("Normal Quality", "Texture is compressed with a standard format."), + new GUIContent("High Quality", "Texture compressed with a high quality format."), + }; + + public readonly GUIContent[] kResizeAlgoritmOptions = + { + new GUIContent(TextureResizeAlgorithm.Mitchell.ToString()), + new GUIContent(TextureResizeAlgorithm.Bilinear.ToString()), + }; + + public readonly int[] kTextureCompressionValues = + { + (int)TextureImporterCompression.Uncompressed, + (int)TextureImporterCompression.CompressedLQ, + (int)TextureImporterCompression.Compressed, + (int)TextureImporterCompression.CompressedHQ + }; + + public readonly GUIContent[] kMobileCompressionQualityOptions = + { + new GUIContent("Fast"), + new GUIContent("Normal"), + new GUIContent("Best") + }; + + public Styles() + { + kMaxTextureSizeStrings = new GUIContent[kMaxTextureSizeValues.Length]; + for (var i = 0; i < kMaxTextureSizeValues.Length; ++i) + kMaxTextureSizeStrings[i] = new GUIContent(string.Format("{0}", kMaxTextureSizeValues[i])); + } + } + + private static Styles s_Styles; + + public string buildPlatformTitle { get; set; } + + internal TexturePlatformSettingsView() + { + s_Styles = s_Styles ?? new Styles(); + } + + public virtual TextureResizeAlgorithm DrawResizeAlgorithm(TextureResizeAlgorithm defaultValue, bool isMixedValue, bool isDisabled, out bool changed) + { + using (new EditorGUI.DisabledScope(isDisabled)) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = (TextureResizeAlgorithm)EditorGUILayout.EnumPopup(s_Styles.resizeAlgorithmLabel, defaultValue); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + } + return defaultValue; + } + + public virtual TextureImporterCompression DrawCompression(TextureImporterCompression defaultValue, bool isMixedValue, out bool changed) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = (TextureImporterCompression)EditorGUILayout.IntPopup(s_Styles.compressionLabel, (int)defaultValue, s_Styles.kTextureCompressionOptions, s_Styles.kTextureCompressionValues); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + + public virtual bool DrawUseCrunchedCompression(bool defaultValue, bool isMixedValue, out bool changed) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = EditorGUILayout.Toggle(s_Styles.useCrunchedCompressionLabel, defaultValue); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + + public virtual bool DrawOverride(bool defaultValue, bool isMixedValue, out bool changed) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = EditorGUILayout.ToggleLeft(new GUIContent("Override"), defaultValue); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + + public virtual int DrawMaxSize(int defaultValue, bool isMixedValue, bool isDisabled, out bool changed) + { + using (new EditorGUI.DisabledScope(isDisabled)) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = EditorGUILayout.IntPopup(s_Styles.maxTextureSizeLabel, defaultValue, s_Styles.kMaxTextureSizeStrings, s_Styles.kMaxTextureSizeValues); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + } + + public virtual TextureImporterFormat DrawFormat(TextureImporterFormat defaultValue, int[] displayValues, string[] displayStrings, bool isMixedValue, bool isDisabled, out bool changed) + { + using (new EditorGUI.DisabledScope(isDisabled)) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = (TextureImporterFormat)EditorGUILayout.IntPopup(s_Styles.textureFormatLabel.text, (int)defaultValue, displayStrings, displayValues); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + } + + public virtual int DrawCompressionQualityPopup(int defaultValue, bool isMixedValue, out bool changed) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = EditorGUILayout.Popup(s_Styles.compressionQualityLabel, defaultValue, s_Styles.kMobileCompressionQualityOptions); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + + public virtual int DrawCompressionQualitySlider(int defaultValue, bool isMixedValue, out bool changed) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = isMixedValue; + defaultValue = EditorGUILayout.IntSlider(s_Styles.compressionQualitySliderLabel, defaultValue, 0, 100); + EditorGUI.showMixedValue = false; + changed = EditorGUI.EndChangeCheck(); + return defaultValue; + } + } +} diff --git a/Editor/TexturePlatformSettingsView.cs.meta b/Editor/TexturePlatformSettingsView.cs.meta index 1599f27..d649936 100644 --- a/Editor/TexturePlatformSettingsView.cs.meta +++ b/Editor/TexturePlatformSettingsView.cs.meta @@ -1,13 +1,13 @@ -fileFormatVersion: 2 -guid: 6ba7b4ee1b04b5845a1bc6fbb53cf7bc -timeCreated: 1502357266 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 6ba7b4ee1b04b5845a1bc6fbb53cf7bc +timeCreated: 1502357266 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/TextureSettingsGUI.cs b/Editor/TextureSettingsGUI.cs index a26f3ff..cb2cc8c 100644 --- a/Editor/TextureSettingsGUI.cs +++ b/Editor/TextureSettingsGUI.cs @@ -1,383 +1,383 @@ -//using System; -//using System.Collections; -//using System.Collections.Generic; -//using UnityEditor; -//using UnityEngine; - -//namespace UnityEditor.U2D -//{ -// public class TextureSettingsGUI -// { -// public SerializedProperty colorTexture; -// public SerializedProperty readable; -// public SerializedProperty npotScale; -// public SerializedProperty filterMode; -// public SerializedProperty aniso; -// public SerializedProperty enablePostProcessor; - -// readonly int[] m_FilterModeOptions = (int[])(Enum.GetValues(typeof(FilterMode))); -// public TextureSettingsGUI(SerializedProperty sp) -// { -// colorTexture = sp.FindPropertyRelative("m_ColorTexture"); -// readable = sp.FindPropertyRelative("m_Readable"); -// npotScale = sp.FindPropertyRelative("m_NPOTScale"); -// filterMode = sp.FindPropertyRelative("m_FilterMode"); -// aniso = sp.FindPropertyRelative("m_Aniso"); -// enablePostProcessor = sp.FindPropertyRelative("m_EnablePostProcessor"); -// } - -// public void OnInspectorGUI(bool isPOT, bool isNormalMap, bool hasMipMap, bool isCubeMap, bool hasMipmapFadeout) -// { - -// TextureSettingsGUIUtils.ToggleFromInt(colorTexture, TextureSettingsGUIUtils.s_Styles.sRGBTexture); -// TextureSettingsGUIUtils.ToggleFromInt(readable, TextureSettingsGUIUtils.s_Styles.readWrite); -// using (new EditorGUI.DisabledScope(isPOT)) -// { -// TextureSettingsGUIUtils.EnumPopup(npotScale, typeof(TextureImporterNPOTScale), TextureSettingsGUIUtils.s_Styles.npot); -// } - -// EditorGUI.BeginChangeCheck(); -// // Filter mode -// EditorGUI.showMixedValue = filterMode.hasMultipleDifferentValues; -// FilterMode filter = (FilterMode)filterMode.intValue; -// if ((int)filter == -1) -// { -// if (hasMipmapFadeout || isNormalMap) -// filter = FilterMode.Trilinear; -// else -// filter = FilterMode.Bilinear; -// } -// filter = (FilterMode)EditorGUILayout.IntPopup(TextureSettingsGUIUtils.s_Styles.filterMode, (int)filter, TextureSettingsGUIUtils.s_Styles.filterModeOptions, m_FilterModeOptions); -// EditorGUI.showMixedValue = false; -// if (EditorGUI.EndChangeCheck()) -// filterMode.intValue = (int)filter; - -// // Aniso -// bool showAniso = (FilterMode)filter != FilterMode.Point && hasMipMap && isCubeMap; -// using (new EditorGUI.DisabledScope(!showAniso)) -// { -// EditorGUI.BeginChangeCheck(); -// EditorGUI.showMixedValue = aniso.hasMultipleDifferentValues; -// int anisoValue = aniso.intValue; -// if (anisoValue == -1) -// anisoValue = 1; -// //aniso = EditorGUILayout.IntSlider("Aniso Level", aniso, 0, 16); -// EditorGUI.showMixedValue = false; -// if (EditorGUI.EndChangeCheck()) -// aniso.intValue = anisoValue; - -// if (anisoValue > 1) -// { -// if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.Disable) -// EditorGUILayout.HelpBox("Anisotropic filtering is disabled for all textures in Quality Settings.", MessageType.Info); -// else if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.ForceEnable) -// EditorGUILayout.HelpBox("Anisotropic filtering is enabled for all textures in Quality Settings.", MessageType.Info); -// } -// } -// } -// } - -// public class TextureSpriteSettingsGUI -// { -// public SerializedProperty packingTag; -// public SerializedProperty ppu; -// public SerializedProperty meshType; -// public SerializedProperty extrudeEdges; - -// public TextureSpriteSettingsGUI(SerializedProperty sp) -// { -// packingTag = sp.FindPropertyRelative("m_PackingTag"); -// ppu = sp.FindPropertyRelative("m_PixelsPerUnit"); -// meshType = sp.FindPropertyRelative("m_MeshType"); -// extrudeEdges = sp.FindPropertyRelative("m_ExtrudeEdges"); -// } - -// public void OnInspectorGUI() -// { -// //// Show generic attributes -// //if (m_SpriteMode.intValue != 0) -// //{ -// // EditorGUILayout.PropertyField(m_SpritePackingTag, s_Styles.spritePackingTag); -// // EditorGUILayout.PropertyField(m_SpritePixelsToUnits, s_Styles.spritePixelsPerUnit); - -// // if (m_SpriteMode.intValue != (int)SpriteImportMode.Polygon && !m_SpriteMode.hasMultipleDifferentValues) -// // { -// // EditorGUILayout.IntPopup(m_SpriteMeshType, s_Styles.spriteMeshTypeOptions, new[] { 0, 1 }, s_Styles.spriteMeshType); -// // } -// // EditorGUILayout.EndFadeGroup(); - -// // EditorGUILayout.IntSlider(m_SpriteExtrude, 0, 32, s_Styles.spriteExtrude); - -// // if (m_SpriteMode.intValue == 1) -// // { -// // EditorGUILayout.IntPopup(m_Alignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.spriteAlignment); - -// // if (m_Alignment.intValue == (int)SpriteAlignment.Custom) -// // { -// // GUILayout.BeginHorizontal(); -// // EditorGUILayout.PropertyField(m_SpritePivot, new GUIContent()); -// // GUILayout.EndHorizontal(); -// // } -// // } -// //} -// } -// } - -// public class TextureWrapSettingsGUI -// { -// public SerializedProperty wrapMode; -// public SerializedProperty wrapModeU; -// public SerializedProperty wrapModeV; -// public SerializedProperty wrapModeW; - -// public TextureWrapSettingsGUI(SerializedProperty sp) -// { -// wrapMode = sp.FindPropertyRelative("m_WrapMode"); -// wrapModeU = sp.FindPropertyRelative("m_WrapModeU"); -// wrapModeV = sp.FindPropertyRelative("m_WrapModeV"); -// wrapModeW = sp.FindPropertyRelative("m_WrapModeW"); -// } - -// public void OnInspectorGUI() -// { - -// } -// } - - -// public class TextureAlphaSettingsGUI -// { -// public SerializedProperty tolerance; -// public SerializedProperty source; - -// public TextureAlphaSettingsGUI(SerializedProperty sp) -// { -// tolerance = sp.FindPropertyRelative("m_AlphaTolerance"); -// source = sp.FindPropertyRelative("m_AlphaSource"); -// } - -// public void OnInspectorGUI() -// { - -// } -// } - -// public class TextureMipmapSettingsGUI -// { -// public SerializedProperty filter; -// public SerializedProperty borderMipmap; -// public SerializedProperty fadeout; -// public SerializedProperty preserveCoverage; -// public SerializedProperty fadeDistanceStart; -// public SerializedProperty fadeDistanceEnd; - -// public TextureMipmapSettingsGUI(SerializedProperty sp) -// { -// filter = sp.FindPropertyRelative("m_Filter"); -// borderMipmap = sp.FindPropertyRelative("m_BorderMipmap"); -// fadeout = sp.FindPropertyRelative("m_Fadeout"); -// preserveCoverage = sp.FindPropertyRelative("m_PreserveCoverage"); -// fadeDistanceStart = sp.FindPropertyRelative("m_FadeDistanceStart"); -// fadeDistanceEnd = sp.FindPropertyRelative("m_FadeDistanceEnd"); -// } - -// public void OnInspectorGUI() -// { - -// } -// } - -// public class TextureNormalSettingsGUI -// { -// public SerializedProperty filter; -// public SerializedProperty generateFromGrayScale; -// public SerializedProperty bumpiness; - -// public TextureNormalSettingsGUI(SerializedProperty sp) -// { -// filter = sp.FindPropertyRelative("m_Filter"); -// generateFromGrayScale = sp.FindPropertyRelative("m_GenerateFromGrayScale"); -// bumpiness = sp.FindPropertyRelative("m_Bumpiness"); -// } - -// public void OnInspectorGUI() -// { - -// } -// } - - -// public class TextureCubemapSettingsGUI -// { -// public SerializedProperty convolution; -// public SerializedProperty mode; -// public SerializedProperty seamless; - -// public TextureCubemapSettingsGUI(SerializedProperty sp) -// { -// convolution = sp.FindPropertyRelative("m_Convolution"); -// mode = sp.FindPropertyRelative("m_Mode"); -// seamless = sp.FindPropertyRelative("m_Seamless"); -// } - -// public void OnInspectorGUI() -// { - -// } -// } - - -// static class TextureSettingsGUIUtils -// { -// public static void ToggleFromInt(SerializedProperty property, GUIContent label) -// { -// EditorGUI.BeginChangeCheck(); -// EditorGUI.showMixedValue = property.hasMultipleDifferentValues; -// int value = EditorGUILayout.Toggle(label, property.intValue > 0) ? 1 : 0; -// EditorGUI.showMixedValue = false; -// if (EditorGUI.EndChangeCheck()) -// property.intValue = value; -// } - -// public static void EnumPopup(SerializedProperty property, System.Type type, GUIContent label) -// { -// EditorGUILayout.IntPopup(label.text, property.intValue, -// System.Enum.GetNames(type), -// System.Enum.GetValues(type) as int[]); -// } - -// internal class Styles -// { -// public readonly GUIContent textureTypeTitle = new GUIContent("Texture Type", "What will this texture be used for?"); -// public readonly GUIContent[] textureTypeOptions = -// { -// new GUIContent("Default", "Texture is a normal image such as a diffuse texture or other."), -// new GUIContent("Sprite (2D and UI)", "Texture is used for a sprite."), -// }; -// public readonly int[] textureTypeValues = -// { -// (int)TextureImporterType.Default, -// (int)TextureImporterType.Sprite, -// }; - -// public readonly GUIContent textureShape = new GUIContent("Texture Shape", "What shape is this texture?"); -// private readonly GUIContent textureShape2D = new GUIContent("2D, Texture is 2D."); -// private readonly GUIContent textureShapeCube = new GUIContent("Cube", "Texture is a Cubemap."); -// public readonly Dictionary textureShapeOptionsDictionnary = new Dictionary(); -// public readonly Dictionary textureShapeValuesDictionnary = new Dictionary(); - - -// public readonly GUIContent filterMode = new GUIContent("Filter Mode"); -// public readonly GUIContent[] filterModeOptions = -// { -// new GUIContent("Point (no filter)"), -// new GUIContent("Bilinear"), -// new GUIContent("Trilinear") -// }; - -// public readonly GUIContent textureFormat = new GUIContent("Format"); - -// public readonly GUIContent defaultPlatform = new GUIContent("Default"); -// public readonly GUIContent mipmapFadeOutToggle = new GUIContent("Fadeout Mip Maps"); -// public readonly GUIContent mipmapFadeOut = new GUIContent("Fade Range"); -// public readonly GUIContent readWrite = new GUIContent("Read/Write Enabled", "Enable to be able to access the raw pixel data from code."); - -// public readonly GUIContent alphaSource = new GUIContent("Alpha Source", "How is the alpha generated for the imported texture."); -// public readonly GUIContent[] alphaSourceOptions = -// { -// new GUIContent("None", "No Alpha will be used."), -// new GUIContent("Input Texture Alpha", "Use Alpha from the input texture if one is provided."), -// new GUIContent("From Gray Scale", "Generate Alpha from image gray scale."), -// }; -// public readonly int[] alphaSourceValues = -// { -// (int)TextureImporterAlphaSource.None, -// (int)TextureImporterAlphaSource.FromInput, -// (int)TextureImporterAlphaSource.FromGrayScale, -// }; - -// public readonly GUIContent generateMipMaps = new GUIContent("Generate Mip Maps"); -// public readonly GUIContent sRGBTexture = new GUIContent("sRGB (Color Texture)", "Texture content is stored in gamma space. Non-HDR color textures should enable this flag (except if used for IMGUI)."); -// public readonly GUIContent borderMipMaps = new GUIContent("Border Mip Maps"); -// public readonly GUIContent mipMapsPreserveCoverage = new GUIContent("Mip Maps Preserve Coverage", "The alpha channel of generated Mip Maps will preserve coverage during the alpha test."); -// public readonly GUIContent alphaTestReferenceValue = new GUIContent("Alpha Cutoff Value", "The reference value used during the alpha test. Controls Mip Map coverage."); -// public readonly GUIContent mipMapFilter = new GUIContent("Mip Map Filtering"); -// public readonly GUIContent[] mipMapFilterOptions = -// { -// new GUIContent("Box"), -// new GUIContent("Kaiser"), -// }; -// public readonly GUIContent npot = new GUIContent("Non Power of 2", "How non-power-of-two textures are scaled on import."); - -// public readonly GUIContent compressionQuality = new GUIContent("Compressor Quality"); -// public readonly GUIContent compressionQualitySlider = new GUIContent("Compressor Quality", "Use the slider to adjust compression quality from 0 (Fastest) to 100 (Best)"); -// public readonly GUIContent[] mobileCompressionQualityOptions = -// { -// new GUIContent("Fast"), -// new GUIContent("Normal"), -// new GUIContent("Best") -// }; - -// public readonly GUIContent spriteMode = new GUIContent("Sprite Mode"); -// public readonly GUIContent[] spriteModeOptions = -// { -// new GUIContent("Single"), -// new GUIContent("Multiple"), -// new GUIContent("Polygon"), -// }; -// public readonly GUIContent[] spriteMeshTypeOptions = -// { -// new GUIContent("Full Rect"), -// new GUIContent("Tight"), -// }; - -// public readonly GUIContent spritePackingTag = new GUIContent("Packing Tag", "Tag for the Sprite Packing system."); -// public readonly GUIContent spritePixelsPerUnit = new GUIContent("Pixels Per Unit", "How many pixels in the sprite correspond to one unit in the world."); -// public readonly GUIContent spriteExtrude = new GUIContent("Extrude Edges", "How much empty area to leave around the sprite in the generated mesh."); -// public readonly GUIContent spriteMeshType = new GUIContent("Mesh Type", "Type of sprite mesh to generate."); -// public readonly GUIContent spriteAlignment = new GUIContent("Pivot", "Sprite pivot point in its localspace. May be used for syncing animation frames of different sizes."); -// public readonly GUIContent[] spriteAlignmentOptions = -// { -// new GUIContent("Center"), -// new GUIContent("Top Left"), -// new GUIContent("Top"), -// new GUIContent("Top Right"), -// new GUIContent("Left"), -// new GUIContent("Right"), -// new GUIContent("Bottom Left"), -// new GUIContent("Bottom"), -// new GUIContent("Bottom Right"), -// new GUIContent("Custom"), -// }; - -// public readonly GUIContent alphaIsTransparency = new GUIContent("Alpha Is Transparency", "If the provided alpha channel is transparency, enable this to pre-filter the color to avoid texture filtering artifacts. This is not supported for HDR textures."); -// public readonly GUIContent etc1Compression = new GUIContent("Compress using ETC1 (split alpha channel)|Alpha for this texture will be preserved by splitting the alpha channel to another texture, and both resulting textures will be compressed using ETC1."); - -// public readonly GUIContent crunchedCompression = new GUIContent("Use Crunch Compression", "Texture is crunch-compressed to save space on disk when applicable."); - -// public readonly GUIContent showAdvanced = new GUIContent("Advanced", "Show advanced settings."); - -// public Styles() -// { -// // This is far from ideal, but it's better than having tons of logic in the GUI code itself. -// // The combination should not grow too much anyway since only Texture3D will be added later. -// GUIContent[] s2D_Options = { textureShape2D }; -// GUIContent[] sCube_Options = { textureShapeCube }; -// GUIContent[] s2D_Cube_Options = { textureShape2D, textureShapeCube }; -// textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D, s2D_Options); -// textureShapeOptionsDictionnary.Add(TextureImporterShape.TextureCube, sCube_Options); -// textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Options); - -// int[] s2D_Values = { (int)TextureImporterShape.Texture2D }; -// int[] sCube_Values = { (int)TextureImporterShape.TextureCube }; -// int[] s2D_Cube_Values = { (int)TextureImporterShape.Texture2D, (int)TextureImporterShape.TextureCube }; -// textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D, s2D_Values); -// textureShapeValuesDictionnary.Add(TextureImporterShape.TextureCube, sCube_Values); -// textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Values); - -// } -// } - -// internal static Styles s_Styles; -// } -//} +//using System; +//using System.Collections; +//using System.Collections.Generic; +//using UnityEditor; +//using UnityEngine; + +//namespace UnityEditor.U2D +//{ +// public class TextureSettingsGUI +// { +// public SerializedProperty colorTexture; +// public SerializedProperty readable; +// public SerializedProperty npotScale; +// public SerializedProperty filterMode; +// public SerializedProperty aniso; +// public SerializedProperty enablePostProcessor; + +// readonly int[] m_FilterModeOptions = (int[])(Enum.GetValues(typeof(FilterMode))); +// public TextureSettingsGUI(SerializedProperty sp) +// { +// colorTexture = sp.FindPropertyRelative("m_ColorTexture"); +// readable = sp.FindPropertyRelative("m_Readable"); +// npotScale = sp.FindPropertyRelative("m_NPOTScale"); +// filterMode = sp.FindPropertyRelative("m_FilterMode"); +// aniso = sp.FindPropertyRelative("m_Aniso"); +// enablePostProcessor = sp.FindPropertyRelative("m_EnablePostProcessor"); +// } + +// public void OnInspectorGUI(bool isPOT, bool isNormalMap, bool hasMipMap, bool isCubeMap, bool hasMipmapFadeout) +// { + +// TextureSettingsGUIUtils.ToggleFromInt(colorTexture, TextureSettingsGUIUtils.s_Styles.sRGBTexture); +// TextureSettingsGUIUtils.ToggleFromInt(readable, TextureSettingsGUIUtils.s_Styles.readWrite); +// using (new EditorGUI.DisabledScope(isPOT)) +// { +// TextureSettingsGUIUtils.EnumPopup(npotScale, typeof(TextureImporterNPOTScale), TextureSettingsGUIUtils.s_Styles.npot); +// } + +// EditorGUI.BeginChangeCheck(); +// // Filter mode +// EditorGUI.showMixedValue = filterMode.hasMultipleDifferentValues; +// FilterMode filter = (FilterMode)filterMode.intValue; +// if ((int)filter == -1) +// { +// if (hasMipmapFadeout || isNormalMap) +// filter = FilterMode.Trilinear; +// else +// filter = FilterMode.Bilinear; +// } +// filter = (FilterMode)EditorGUILayout.IntPopup(TextureSettingsGUIUtils.s_Styles.filterMode, (int)filter, TextureSettingsGUIUtils.s_Styles.filterModeOptions, m_FilterModeOptions); +// EditorGUI.showMixedValue = false; +// if (EditorGUI.EndChangeCheck()) +// filterMode.intValue = (int)filter; + +// // Aniso +// bool showAniso = (FilterMode)filter != FilterMode.Point && hasMipMap && isCubeMap; +// using (new EditorGUI.DisabledScope(!showAniso)) +// { +// EditorGUI.BeginChangeCheck(); +// EditorGUI.showMixedValue = aniso.hasMultipleDifferentValues; +// int anisoValue = aniso.intValue; +// if (anisoValue == -1) +// anisoValue = 1; +// //aniso = EditorGUILayout.IntSlider("Aniso Level", aniso, 0, 16); +// EditorGUI.showMixedValue = false; +// if (EditorGUI.EndChangeCheck()) +// aniso.intValue = anisoValue; + +// if (anisoValue > 1) +// { +// if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.Disable) +// EditorGUILayout.HelpBox("Anisotropic filtering is disabled for all textures in Quality Settings.", MessageType.Info); +// else if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.ForceEnable) +// EditorGUILayout.HelpBox("Anisotropic filtering is enabled for all textures in Quality Settings.", MessageType.Info); +// } +// } +// } +// } + +// public class TextureSpriteSettingsGUI +// { +// public SerializedProperty packingTag; +// public SerializedProperty ppu; +// public SerializedProperty meshType; +// public SerializedProperty extrudeEdges; + +// public TextureSpriteSettingsGUI(SerializedProperty sp) +// { +// packingTag = sp.FindPropertyRelative("m_PackingTag"); +// ppu = sp.FindPropertyRelative("m_PixelsPerUnit"); +// meshType = sp.FindPropertyRelative("m_MeshType"); +// extrudeEdges = sp.FindPropertyRelative("m_ExtrudeEdges"); +// } + +// public void OnInspectorGUI() +// { +// //// Show generic attributes +// //if (m_SpriteMode.intValue != 0) +// //{ +// // EditorGUILayout.PropertyField(m_SpritePackingTag, s_Styles.spritePackingTag); +// // EditorGUILayout.PropertyField(m_SpritePixelsToUnits, s_Styles.spritePixelsPerUnit); + +// // if (m_SpriteMode.intValue != (int)SpriteImportMode.Polygon && !m_SpriteMode.hasMultipleDifferentValues) +// // { +// // EditorGUILayout.IntPopup(m_SpriteMeshType, s_Styles.spriteMeshTypeOptions, new[] { 0, 1 }, s_Styles.spriteMeshType); +// // } +// // EditorGUILayout.EndFadeGroup(); + +// // EditorGUILayout.IntSlider(m_SpriteExtrude, 0, 32, s_Styles.spriteExtrude); + +// // if (m_SpriteMode.intValue == 1) +// // { +// // EditorGUILayout.IntPopup(m_Alignment, s_Styles.spriteAlignmentOptions, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s_Styles.spriteAlignment); + +// // if (m_Alignment.intValue == (int)SpriteAlignment.Custom) +// // { +// // GUILayout.BeginHorizontal(); +// // EditorGUILayout.PropertyField(m_SpritePivot, new GUIContent()); +// // GUILayout.EndHorizontal(); +// // } +// // } +// //} +// } +// } + +// public class TextureWrapSettingsGUI +// { +// public SerializedProperty wrapMode; +// public SerializedProperty wrapModeU; +// public SerializedProperty wrapModeV; +// public SerializedProperty wrapModeW; + +// public TextureWrapSettingsGUI(SerializedProperty sp) +// { +// wrapMode = sp.FindPropertyRelative("m_WrapMode"); +// wrapModeU = sp.FindPropertyRelative("m_WrapModeU"); +// wrapModeV = sp.FindPropertyRelative("m_WrapModeV"); +// wrapModeW = sp.FindPropertyRelative("m_WrapModeW"); +// } + +// public void OnInspectorGUI() +// { + +// } +// } + + +// public class TextureAlphaSettingsGUI +// { +// public SerializedProperty tolerance; +// public SerializedProperty source; + +// public TextureAlphaSettingsGUI(SerializedProperty sp) +// { +// tolerance = sp.FindPropertyRelative("m_AlphaTolerance"); +// source = sp.FindPropertyRelative("m_AlphaSource"); +// } + +// public void OnInspectorGUI() +// { + +// } +// } + +// public class TextureMipmapSettingsGUI +// { +// public SerializedProperty filter; +// public SerializedProperty borderMipmap; +// public SerializedProperty fadeout; +// public SerializedProperty preserveCoverage; +// public SerializedProperty fadeDistanceStart; +// public SerializedProperty fadeDistanceEnd; + +// public TextureMipmapSettingsGUI(SerializedProperty sp) +// { +// filter = sp.FindPropertyRelative("m_Filter"); +// borderMipmap = sp.FindPropertyRelative("m_BorderMipmap"); +// fadeout = sp.FindPropertyRelative("m_Fadeout"); +// preserveCoverage = sp.FindPropertyRelative("m_PreserveCoverage"); +// fadeDistanceStart = sp.FindPropertyRelative("m_FadeDistanceStart"); +// fadeDistanceEnd = sp.FindPropertyRelative("m_FadeDistanceEnd"); +// } + +// public void OnInspectorGUI() +// { + +// } +// } + +// public class TextureNormalSettingsGUI +// { +// public SerializedProperty filter; +// public SerializedProperty generateFromGrayScale; +// public SerializedProperty bumpiness; + +// public TextureNormalSettingsGUI(SerializedProperty sp) +// { +// filter = sp.FindPropertyRelative("m_Filter"); +// generateFromGrayScale = sp.FindPropertyRelative("m_GenerateFromGrayScale"); +// bumpiness = sp.FindPropertyRelative("m_Bumpiness"); +// } + +// public void OnInspectorGUI() +// { + +// } +// } + + +// public class TextureCubemapSettingsGUI +// { +// public SerializedProperty convolution; +// public SerializedProperty mode; +// public SerializedProperty seamless; + +// public TextureCubemapSettingsGUI(SerializedProperty sp) +// { +// convolution = sp.FindPropertyRelative("m_Convolution"); +// mode = sp.FindPropertyRelative("m_Mode"); +// seamless = sp.FindPropertyRelative("m_Seamless"); +// } + +// public void OnInspectorGUI() +// { + +// } +// } + + +// static class TextureSettingsGUIUtils +// { +// public static void ToggleFromInt(SerializedProperty property, GUIContent label) +// { +// EditorGUI.BeginChangeCheck(); +// EditorGUI.showMixedValue = property.hasMultipleDifferentValues; +// int value = EditorGUILayout.Toggle(label, property.intValue > 0) ? 1 : 0; +// EditorGUI.showMixedValue = false; +// if (EditorGUI.EndChangeCheck()) +// property.intValue = value; +// } + +// public static void EnumPopup(SerializedProperty property, System.Type type, GUIContent label) +// { +// EditorGUILayout.IntPopup(label.text, property.intValue, +// System.Enum.GetNames(type), +// System.Enum.GetValues(type) as int[]); +// } + +// internal class Styles +// { +// public readonly GUIContent textureTypeTitle = new GUIContent("Texture Type", "What will this texture be used for?"); +// public readonly GUIContent[] textureTypeOptions = +// { +// new GUIContent("Default", "Texture is a normal image such as a diffuse texture or other."), +// new GUIContent("Sprite (2D and UI)", "Texture is used for a sprite."), +// }; +// public readonly int[] textureTypeValues = +// { +// (int)TextureImporterType.Default, +// (int)TextureImporterType.Sprite, +// }; + +// public readonly GUIContent textureShape = new GUIContent("Texture Shape", "What shape is this texture?"); +// private readonly GUIContent textureShape2D = new GUIContent("2D, Texture is 2D."); +// private readonly GUIContent textureShapeCube = new GUIContent("Cube", "Texture is a Cubemap."); +// public readonly Dictionary textureShapeOptionsDictionnary = new Dictionary(); +// public readonly Dictionary textureShapeValuesDictionnary = new Dictionary(); + + +// public readonly GUIContent filterMode = new GUIContent("Filter Mode"); +// public readonly GUIContent[] filterModeOptions = +// { +// new GUIContent("Point (no filter)"), +// new GUIContent("Bilinear"), +// new GUIContent("Trilinear") +// }; + +// public readonly GUIContent textureFormat = new GUIContent("Format"); + +// public readonly GUIContent defaultPlatform = new GUIContent("Default"); +// public readonly GUIContent mipmapFadeOutToggle = new GUIContent("Fadeout Mip Maps"); +// public readonly GUIContent mipmapFadeOut = new GUIContent("Fade Range"); +// public readonly GUIContent readWrite = new GUIContent("Read/Write Enabled", "Enable to be able to access the raw pixel data from code."); + +// public readonly GUIContent alphaSource = new GUIContent("Alpha Source", "How is the alpha generated for the imported texture."); +// public readonly GUIContent[] alphaSourceOptions = +// { +// new GUIContent("None", "No Alpha will be used."), +// new GUIContent("Input Texture Alpha", "Use Alpha from the input texture if one is provided."), +// new GUIContent("From Gray Scale", "Generate Alpha from image gray scale."), +// }; +// public readonly int[] alphaSourceValues = +// { +// (int)TextureImporterAlphaSource.None, +// (int)TextureImporterAlphaSource.FromInput, +// (int)TextureImporterAlphaSource.FromGrayScale, +// }; + +// public readonly GUIContent generateMipMaps = new GUIContent("Generate Mip Maps"); +// public readonly GUIContent sRGBTexture = new GUIContent("sRGB (Color Texture)", "Texture content is stored in gamma space. Non-HDR color textures should enable this flag (except if used for IMGUI)."); +// public readonly GUIContent borderMipMaps = new GUIContent("Border Mip Maps"); +// public readonly GUIContent mipMapsPreserveCoverage = new GUIContent("Mip Maps Preserve Coverage", "The alpha channel of generated Mip Maps will preserve coverage during the alpha test."); +// public readonly GUIContent alphaTestReferenceValue = new GUIContent("Alpha Cutoff Value", "The reference value used during the alpha test. Controls Mip Map coverage."); +// public readonly GUIContent mipMapFilter = new GUIContent("Mip Map Filtering"); +// public readonly GUIContent[] mipMapFilterOptions = +// { +// new GUIContent("Box"), +// new GUIContent("Kaiser"), +// }; +// public readonly GUIContent npot = new GUIContent("Non Power of 2", "How non-power-of-two textures are scaled on import."); + +// public readonly GUIContent compressionQuality = new GUIContent("Compressor Quality"); +// public readonly GUIContent compressionQualitySlider = new GUIContent("Compressor Quality", "Use the slider to adjust compression quality from 0 (Fastest) to 100 (Best)"); +// public readonly GUIContent[] mobileCompressionQualityOptions = +// { +// new GUIContent("Fast"), +// new GUIContent("Normal"), +// new GUIContent("Best") +// }; + +// public readonly GUIContent spriteMode = new GUIContent("Sprite Mode"); +// public readonly GUIContent[] spriteModeOptions = +// { +// new GUIContent("Single"), +// new GUIContent("Multiple"), +// new GUIContent("Polygon"), +// }; +// public readonly GUIContent[] spriteMeshTypeOptions = +// { +// new GUIContent("Full Rect"), +// new GUIContent("Tight"), +// }; + +// public readonly GUIContent spritePackingTag = new GUIContent("Packing Tag", "Tag for the Sprite Packing system."); +// public readonly GUIContent spritePixelsPerUnit = new GUIContent("Pixels Per Unit", "How many pixels in the sprite correspond to one unit in the world."); +// public readonly GUIContent spriteExtrude = new GUIContent("Extrude Edges", "How much empty area to leave around the sprite in the generated mesh."); +// public readonly GUIContent spriteMeshType = new GUIContent("Mesh Type", "Type of sprite mesh to generate."); +// public readonly GUIContent spriteAlignment = new GUIContent("Pivot", "Sprite pivot point in its localspace. May be used for syncing animation frames of different sizes."); +// public readonly GUIContent[] spriteAlignmentOptions = +// { +// new GUIContent("Center"), +// new GUIContent("Top Left"), +// new GUIContent("Top"), +// new GUIContent("Top Right"), +// new GUIContent("Left"), +// new GUIContent("Right"), +// new GUIContent("Bottom Left"), +// new GUIContent("Bottom"), +// new GUIContent("Bottom Right"), +// new GUIContent("Custom"), +// }; + +// public readonly GUIContent alphaIsTransparency = new GUIContent("Alpha Is Transparency", "If the provided alpha channel is transparency, enable this to pre-filter the color to avoid texture filtering artifacts. This is not supported for HDR textures."); +// public readonly GUIContent etc1Compression = new GUIContent("Compress using ETC1 (split alpha channel)|Alpha for this texture will be preserved by splitting the alpha channel to another texture, and both resulting textures will be compressed using ETC1."); + +// public readonly GUIContent crunchedCompression = new GUIContent("Use Crunch Compression", "Texture is crunch-compressed to save space on disk when applicable."); + +// public readonly GUIContent showAdvanced = new GUIContent("Advanced", "Show advanced settings."); + +// public Styles() +// { +// // This is far from ideal, but it's better than having tons of logic in the GUI code itself. +// // The combination should not grow too much anyway since only Texture3D will be added later. +// GUIContent[] s2D_Options = { textureShape2D }; +// GUIContent[] sCube_Options = { textureShapeCube }; +// GUIContent[] s2D_Cube_Options = { textureShape2D, textureShapeCube }; +// textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D, s2D_Options); +// textureShapeOptionsDictionnary.Add(TextureImporterShape.TextureCube, sCube_Options); +// textureShapeOptionsDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Options); + +// int[] s2D_Values = { (int)TextureImporterShape.Texture2D }; +// int[] sCube_Values = { (int)TextureImporterShape.TextureCube }; +// int[] s2D_Cube_Values = { (int)TextureImporterShape.Texture2D, (int)TextureImporterShape.TextureCube }; +// textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D, s2D_Values); +// textureShapeValuesDictionnary.Add(TextureImporterShape.TextureCube, sCube_Values); +// textureShapeValuesDictionnary.Add(TextureImporterShape.Texture2D | TextureImporterShape.TextureCube, s2D_Cube_Values); + +// } +// } + +// internal static Styles s_Styles; +// } +//} diff --git a/Editor/TextureSettingsGUI.cs.meta b/Editor/TextureSettingsGUI.cs.meta index a5df299..8edd893 100644 --- a/Editor/TextureSettingsGUI.cs.meta +++ b/Editor/TextureSettingsGUI.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 5fb78a2b3c5f4dc4394919dd6de6322b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 5fb78a2b3c5f4dc4394919dd6de6322b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Unity.2D.Psdimporter.Editor.asmdef b/Editor/Unity.2D.Psdimporter.Editor.asmdef index 595e8b8..b036028 100644 --- a/Editor/Unity.2D.Psdimporter.Editor.asmdef +++ b/Editor/Unity.2D.Psdimporter.Editor.asmdef @@ -1,22 +1,24 @@ -{ - "name": "Unity.2D.Psdimporter.Editor", - "references": [ - "PsdPlugin", - "Unity.InternalAPIEditorBridge.001", - "Unity.2D.Common.Editor", - "Unity.2D.Animation.Editor", - "Unity.2D.Animation.Runtime", - "Unity.2D.Sprite.Editor" - ], - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [] +{ + "name": "Unity.2D.Psdimporter.Editor", + "rootNamespace": "", + "references": [ + "PsdPlugin", + "Unity.InternalAPIEditorBridge.001", + "Unity.2D.Common.Editor", + "Unity.2D.Animation.Editor", + "Unity.2D.Animation.Runtime", + "Unity.2D.Sprite.Editor", + "Unity.InternalAPIEngineBridge.001" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Editor/Unity.2D.Psdimporter.Editor.asmdef.meta b/Editor/Unity.2D.Psdimporter.Editor.asmdef.meta index 8de13e1..140311e 100644 --- a/Editor/Unity.2D.Psdimporter.Editor.asmdef.meta +++ b/Editor/Unity.2D.Psdimporter.Editor.asmdef.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: bcb706ca0f6dd48449aa27a93faa899c -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: bcb706ca0f6dd48449aa27a93faa899c +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LICENSE.md b/LICENSE.md index 00294ef..e005341 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,5 @@ -com.unity.2d.psdimporter copyright © 2020 Unity Technologies ApS - -Licensed under the Unity Companion License for Unity-dependent projects (see https://unity3d.com/legal/licenses/unity_companion_license). - +com.unity.2d.psdimporter copyright © 2020 Unity Technologies ApS + +Licensed under the Unity Companion License for Unity-dependent projects (see https://unity3d.com/legal/licenses/unity_companion_license). + Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. \ No newline at end of file diff --git a/LICENSE.md.meta b/LICENSE.md.meta index 3a201dc..c7a5682 100644 --- a/LICENSE.md.meta +++ b/LICENSE.md.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 9ede9ea0212487346a6005ee7f37db0d -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9ede9ea0212487346a6005ee7f37db0d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md index 243822b..d0de79c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -PSB Importer - -ScriptedImporter to import Adobe Photoshop PSB file format - -Feature -- Generate texture and sprite by mosaicing layers -- Option to generate Prefab to reconstuct the image from generated Sprites -- Option to import hidden layers - +PSB Importer + +ScriptedImporter to import Adobe Photoshop PSB file format + +Feature +- Generate texture and sprite by mosaicing layers +- Option to generate Prefab to reconstuct the image from generated Sprites +- Option to import hidden layers + diff --git a/README.md.meta b/README.md.meta index 4d318ab..3b5ed8d 100644 --- a/README.md.meta +++ b/README.md.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: bacef98d5d5167242a24ec99d7304aad -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: bacef98d5d5167242a24ec99d7304aad +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests.meta b/Tests.meta index 8fcec38..06d5e9b 100644 --- a/Tests.meta +++ b/Tests.meta @@ -1,10 +1,10 @@ -fileFormatVersion: 2 -guid: ef286a7cdaafc8141b7eaa37314b76cf -folderAsset: yes -timeCreated: 1504008884 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ef286a7cdaafc8141b7eaa37314b76cf +folderAsset: yes +timeCreated: 1504008884 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/EditorTests.meta b/Tests/EditorTests.meta index f41aa6e..1eef6b7 100644 --- a/Tests/EditorTests.meta +++ b/Tests/EditorTests.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 53e6b81c6627ce5469c38700ebbd32a7 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 53e6b81c6627ce5469c38700ebbd32a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/EditorTests/PlaceholderTests.cs b/Tests/EditorTests/PlaceholderTests.cs index eb98eee..f41db98 100644 --- a/Tests/EditorTests/PlaceholderTests.cs +++ b/Tests/EditorTests/PlaceholderTests.cs @@ -1,14 +1,14 @@ -using NUnit.Framework; - -namespace UnityEditor.Experimental.U2D.PSDImporter.Tests -{ - internal class Placeholder - { - [Test] - public void PlaceHolderTest() - { - // Use the Assert class to test conditions. - Assert.Pass("This is a placeholder to ensure we have at least one test."); - } - } -} +using NUnit.Framework; + +namespace UnityEditor.Experimental.U2D.PSDImporter.Tests +{ + internal class Placeholder + { + [Test] + public void PlaceHolderTest() + { + // Use the Assert class to test conditions. + Assert.Pass("This is a placeholder to ensure we have at least one test."); + } + } +} diff --git a/Tests/EditorTests/PlaceholderTests.cs.meta b/Tests/EditorTests/PlaceholderTests.cs.meta index 4b56790..ba22654 100644 --- a/Tests/EditorTests/PlaceholderTests.cs.meta +++ b/Tests/EditorTests/PlaceholderTests.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: e02c5dbafeee6ae488b1efd88793f456 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: e02c5dbafeee6ae488b1efd88793f456 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef b/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef index a856722..a604ca8 100644 --- a/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef +++ b/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef @@ -1,25 +1,25 @@ -{ - "name": "Unity.2D.Psdimporter.EditorTests", - "references": [ - "Unity.2D.Common.Editor", - "Unity.2D.Psdimporter.Editor", - "Unity.2D.Animation.Editor", - "Unity.2D.Animation.Runtime", - "Unity.2D.Sprite.Editor" - ], - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [ - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [] +{ + "name": "Unity.2D.Psdimporter.EditorTests", + "references": [ + "Unity.2D.Common.Editor", + "Unity.2D.Psdimporter.Editor", + "Unity.2D.Animation.Editor", + "Unity.2D.Animation.Runtime", + "Unity.2D.Sprite.Editor" + ], + "optionalUnityReferences": [ + "TestAssemblies" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [] } \ No newline at end of file diff --git a/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef.meta b/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef.meta index 0f7ec2f..59a0137 100644 --- a/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef.meta +++ b/Tests/EditorTests/Unity.2D.Psdimporter.EditorTests.asmdef.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 782c623a3cbd6d940be3a3bcf0d4604b -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 782c623a3cbd6d940be3a3bcf0d4604b +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Third Party Notices.md b/Third Party Notices.md index 97f84e7..765a311 100644 --- a/Third Party Notices.md +++ b/Third Party Notices.md @@ -1,72 +1,72 @@ -This package contains third-party software components governed by the license(s) indicated below: ---------- - -Component Name: Photoshop PSD FileType Plugin for Paint.NET - -License Type: MIT, BSD - -///////////////////////////////////////////////////////////////////////////////// - -Photoshop PSD FileType Plugin for Paint.NET -http://psdplugin.codeplex.com/ - -Copyright (c) 2006-2007 Frank Blumenberg -Copyright (c) 2010-2016 Tao Yue - -MIT License: http://www.opensource.org/licenses/mit-license.php - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -///////////////////////////////////////////////////////////////////////////////// - -Portions of the software have been adapted from Yet Another PSD Parser: - http://www.codeproject.com/KB/graphics/PSDParser.aspx - -These portions are provided under the BSD License: - http://www.opensource.org/licenses/BSD-3-Clause - ----- - -Copyright (c) 2006, Jonas Beckeman -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Jonas Beckeman nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY JONAS BECKEMAN AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL JONAS BECKEMAN AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -///////////////////////////////////////////////////////////////////////////////// +This package contains third-party software components governed by the license(s) indicated below: +--------- + +Component Name: Photoshop PSD FileType Plugin for Paint.NET + +License Type: MIT, BSD + +///////////////////////////////////////////////////////////////////////////////// + +Photoshop PSD FileType Plugin for Paint.NET +http://psdplugin.codeplex.com/ + +Copyright (c) 2006-2007 Frank Blumenberg +Copyright (c) 2010-2016 Tao Yue + +MIT License: http://www.opensource.org/licenses/mit-license.php + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +///////////////////////////////////////////////////////////////////////////////// + +Portions of the software have been adapted from Yet Another PSD Parser: + http://www.codeproject.com/KB/graphics/PSDParser.aspx + +These portions are provided under the BSD License: + http://www.opensource.org/licenses/BSD-3-Clause + +---- + +Copyright (c) 2006, Jonas Beckeman +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Jonas Beckeman nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY JONAS BECKEMAN AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL JONAS BECKEMAN AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +///////////////////////////////////////////////////////////////////////////////// diff --git a/Third Party Notices.md.meta b/Third Party Notices.md.meta index f3be39e..3094c4d 100644 --- a/Third Party Notices.md.meta +++ b/Third Party Notices.md.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 9a0bf89d9a6d719479a816944f579291 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9a0bf89d9a6d719479a816944f579291 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 2264c81..8685b42 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "com.unity.2d.psdimporter", - "version": "5.0.3", - "unity": "2021.1", + "version": "6.0.0-pre.2", + "unity": "2021.2", "displayName": "2D PSD Importer", - "description": "A ScriptedImporter for importing Adobe Photoshop PSB (Photoshop Big) file format. The ScriptedImporter is currently targeted for users who wants to create multi Sprite character animation using Unity 2D Animation Package.", + "description": "A ScriptedImporter for importing Adobe Photoshop PSB (Photoshop Big) file format. The ScriptedImporter is currently targeted for users who wants to create multi Sprite character animation using Unity 2D Animation Package.\n\nDocumentation for v5.0 is currently being updated.", "keywords": [ "2d", "psdimporter", @@ -11,19 +11,19 @@ ], "category": "2D", "dependencies": { - "com.unity.2d.common": "5.0.0", - "com.unity.2d.animation": "6.0.3", + "com.unity.2d.animation": "6.0.1", + "com.unity.2d.common": "6.0.0-pre.2", "com.unity.2d.sprite": "1.0.0" }, "relatedPackages": { - "com.unity.2d.psdimporter.tests": "5.0.3" + "com.unity.2d.psdimporter.tests": "6.0.0-pre.2" }, "upmCi": { - "footprint": "5aba28318664e28475f9e448bb3d02a1eed2fca5" + "footprint": "32632cb9b68960414b425492897adbf12bfe1e04" }, "repository": { "url": "https://github.cds.internal.unity3d.com/unity/2d.git", "type": "git", - "revision": "8752f08cdd2aa2a0153c9c70e2affdb28ccfe4bd" + "revision": "cca7970f1452a4da6d2bfdccaf406b7980c4de6f" } } diff --git a/package.json.meta b/package.json.meta index ba1d0b6..e480932 100644 --- a/package.json.meta +++ b/package.json.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 2f948ecb81c850949a2725b1ba265844 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 2f948ecb81c850949a2725b1ba265844 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant:

_wy!anM%=Ge!^YB$tLcxhtI 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 diff --git a/Documentation~/index.md b/Documentation~/index.md index 29e8fe6..2eda86e 100644 --- a/Documentation~/index.md +++ b/Documentation~/index.md @@ -1,19 +1,19 @@ -# Overview -The **PSD Importer** is an [Asset importer](https://docs.unity3d.com/ScriptReference/AssetImporter.html) that imports [Adobe Photoshop .psb](https://helpx.adobe.com/photoshop/using/file-formats.html#large_document_format_psb) files into Unity, and generating a [Prefab](https://docs.unity3d.com/Manual/Prefabs.html) of Sprites based on the imported source file. The .psb file format is functionally identical to the more common Adobe [.psd format](https://helpx.adobe.com/photoshop/using/file-formats.html#photoshop_format_psd), but supports much larger images than the .psd format (up to 300,000 pixels in any dimension). You can convert existing artwork that are in .psd to the .psb format by opening and then saving them as .psb files in Adobe Photoshop. - -Importing .psb files with the PSD Importer allows you to use features such as [Mosaic](PSD-importer-properties.md#Mosaic) to automatically generate a Sprite sheet from the imported layers; or [Character Rig](PSD-importer-properties.md#Rig) where Unity reassembles the Sprites of a character as they are arranged in their source files. - -The PSD Importer currently only supports two [Texture Modes](https://docs.unity3d.com/Manual/TextureTypes.html):[ Default](https://docs.unity3d.com/Manual/TextureTypes.html#Default) and[ Sprite](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite). Other Texture Modes may be supported in the future. - -**Note:** The **Sprite Library Asset** is no longer editable from the Skinning Editor of the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) from version 6.0 onwards as the Category and Label options have been removed from the Sprite Visibility panel. However, the PSD Importer will continue to automatically generate Sprite Library Assets if relevant data from a previous version is present. - -## Supported and unsupported Photoshop effects - -When importing a .psb file into Unity with the PSD Importer, the importer generates a prefab of Sprites based on the image and layer data of the imported .psb file. However not all of Photoshop’s layer and visual effects or features are supported by the PSD Importer. The following Photoshop layer properties and visual effects are ignored when the importer generates the Sprites and prefab: - -- Channels -- Blend Modes -- Layer Opacity -- Effects - -If you want to add visual effects to the generated Sprites, you can add additional Textures to the Sprites with the [Sprite Editor's Secondary Textures](https://docs.unity3d.com/Manual/SpriteEditor-SecondaryTextures.html) module. Shaders can sample these Secondary Textures to apply additional effects to the Sprite, such as normal mapping. Refer to the [Sprite Editor: Secondary Textures](https://docs.unity3d.com/Manual/SpriteEditor-SecondaryTextures.html) documentation for more information. +# Overview +The **PSD Importer** is an [Asset importer](https://docs.unity3d.com/ScriptReference/AssetImporter.html) that imports [Adobe Photoshop .psb](https://helpx.adobe.com/photoshop/using/file-formats.html#large_document_format_psb) files into Unity, and generates a [Prefab](https://docs.unity3d.com/Manual/Prefabs.html) of Sprites based on the imported source file. The .psb file format is functionally identical to the more common Adobe [.psd format](https://helpx.adobe.com/photoshop/using/file-formats.html#photoshop_format_psd), but supports much larger images than the .psd format (up to 300,000 pixels in any dimension). To convert existing artwork from .psd to .psb format, you can open them in Adobe Photoshop and then save them as .psb files. + +Importing .psb files with the PSD Importer allows you to use features such as [Mosaic](PSD-importer-properties.md#Mosaic) (to automatically generate a Sprite sheet from the imported layers) and [Character Rig](PSD-importer-properties.md#Rig) (to reassemble the Sprites of a character as they are arranged in their source files). + +The PSD Importer currently only supports two [Texture Modes](https://docs.unity3d.com/Manual/TextureTypes.html):[ Default](https://docs.unity3d.com/Manual/TextureTypes.html#Default) and[ Sprite](https://docs.unity3d.com/Manual/TextureTypes.html#Sprite). + +**Note:** The **Sprite Library Asset** is no longer editable from the Skinning Editor of the [2D Animation](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) from version 6.0 onwards as the Category and Label options have been removed from the Sprite Visibility panel. However, the PSD Importer will continue to automatically generate Sprite Library Assets if relevant data from a previous version is present. + +## Supported and unsupported Photoshop effects + +When importing a .psb file into Unity with the PSD Importer, the importer generates a prefab of Sprites based on the image and layer data of the imported .psb file. However, the PSD Importer does not support all of Photoshop’s layer and visual effects or features. The PSD Importer ignores the following Photoshop layer properties and visual effects when it generates the Sprites and prefab: + +- Channels +- Blend Modes +- Layer Opacity +- Effects + +If you want to add visual effects to the generated Sprites, you can add additional Textures to the Sprites with the [Sprite Editor's Secondary Textures](https://docs.unity3d.com/Manual/SpriteEditor-SecondaryTextures.html) module. Shaders can sample these Secondary Textures to apply additional effects to the Sprite, such as normal mapping. Refer to the [Sprite Editor: Secondary Textures](https://docs.unity3d.com/Manual/SpriteEditor-SecondaryTextures.html) documentation for more information. diff --git a/Documentation~/skeleton-sharing.md b/Documentation~/skeleton-sharing.md index fe1d8a4..9e3199f 100644 --- a/Documentation~/skeleton-sharing.md +++ b/Documentation~/skeleton-sharing.md @@ -1,23 +1,23 @@ -# Skeleton sharing -You can share [.skeleton Assets](PSD-importer-properties.md#main-skeleton) between different imported Assets by assigning the .skeleton Asset from one to the other's **Main Skeleton** property. This feature can be used together with the [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) to edit the [bones](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) of the .skeleton Assets in the 2D Animation package's [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html). - -To demonstrate how to skeleton sharing, refer to the following example of two actors (characters or other Assets imported for animation with the 2D Animation package) that were imported into Unity with the PSD Importer called 'Primary' and 'Variant'. The goal is to share the .skeleton Asset of 'Primary' with 'Variant'. - -![](images/primary-variant-assets.png) -![](images/primary-character.png) | ![](images/variant-character.png) ---|-- -Primary | Variant - -The [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) is required to create and edit the bones of the .skeleton Assets of imported Assets. In this example, the bones of 'Primary' are created and rigged in 2D Animation's [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html) (refer to the [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) documentation for further information). - -![](images/rigged-primary.png)
A bone hierarchy connected together to form the skeleton of 'Primary'. - -When importing an Asset without anything set in the **Main Skeleton** property, the PSD Importer generates a .skeleton Asset for the Asset and automatically names it as '[Asset File Name] Skeleton'. Any [bones rigged](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) for 'Primary' is saved to the .skeleton Asset 'Primary Skeleton'. - -![](images/primary-skeleton.png) - -To share the 'Primary Skeleton' with 'Variant', select 'Variant' and go to its PSD Importer settings. Assign 'Primary Skeleton' to the **Main Skeleton** property to have 'Variant' reference that .skeleton Asset as its own bone hierarchy. - -![](images/variant-skeleton.png)
The [Bone tools](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) are greyed out and unavailable when opening 'Variant' in the Skinning Editor. - -When an actor references another actor's .skeleton Asset instead of its own, the [Bone Tools](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) in the Skinning Editor are disabled. To edit the bones, open the original actor (that the .skeleton Asset belongs to) in the Skinning Editor and edit the bones. Any changes to the original .skeleton Asset is reflected in any actor which references it. In this example, changes made to 'Primary Skeleton' are reflected in the 'Variant' actor's bone hierarchy . +# Skeleton sharing +You can share [.skeleton Assets](PSD-importer-properties.md#main-skeleton) between different imported Assets by assigning the .skeleton Asset from one to the other's **Main Skeleton** property. This feature can be used together with the [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) to edit the [bones](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) of the .skeleton Assets in the 2D Animation package's [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html). + +To demonstrate how to skeleton sharing, refer to the following example of two actors (characters or other Assets imported for animation with the 2D Animation package) that were imported into Unity with the PSD Importer called 'Primary' and 'Variant'. The goal is to share the .skeleton Asset of 'Primary' with 'Variant'. + +![](images/primary-variant-assets.png) +![](images/primary-character.png) | ![](images/variant-character.png) +--|-- +Primary | Variant + +The [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) is required to create and edit the bones of the .skeleton Assets of imported Assets. In this example, the bones of 'Primary' are created and rigged in 2D Animation's [Skinning Editor](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinningEditor.html) (refer to the [2D Animation package](https://docs.unity3d.com/Packages/com.unity.2d.animation@latest) documentation for further information). + +![](images/rigged-primary.png)
A bone hierarchy connected together to form the skeleton of 'Primary'. + +When importing an Asset without anything set in the **Main Skeleton** property, the PSD Importer generates a .skeleton Asset for the Asset and automatically names it as '[Asset File Name] Skeleton'. Any [bones rigged](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) for 'Primary' is saved to the .skeleton Asset 'Primary Skeleton'. + +![](images/primary-skeleton.png) + +To share the 'Primary Skeleton' with 'Variant', select 'Variant' and go to its PSD Importer settings. Assign 'Primary Skeleton' to the **Main Skeleton** property to have 'Variant' reference that .skeleton Asset as its own bone hierarchy. + +![](images/variant-skeleton.png)
The [Bone tools](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) are greyed out and unavailable when opening 'Variant' in the Skinning Editor. + +When an actor references another actor's .skeleton Asset instead of its own, the [Bone Tools](https://docs.unity3d.com/Packages/com.unity.2d.animation@6.0/manual/SkinEdToolsShortcuts.html#bone-tools) in the Skinning Editor are disabled. To edit the bones, open the original actor (that the .skeleton Asset belongs to) in the Skinning Editor and edit the bones. Any changes to the original .skeleton Asset is reflected in any actor which references it. In this example, changes made to 'Primary Skeleton' are reflected in the 'Variant' actor's bone hierarchy . diff --git a/Editor.meta b/Editor.meta index 9486471..8f026e5 100644 --- a/Editor.meta +++ b/Editor.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 23888dc58bcb0814389c9fd915521b77 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 23888dc58bcb0814389c9fd915521b77 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Analytics.cs b/Editor/Analytics.cs index 015c2f4..0ee3ff0 100644 --- a/Editor/Analytics.cs +++ b/Editor/Analytics.cs @@ -1,64 +1,64 @@ -using System; -using PhotoshopFile; -using UnityEngine; -using UnityEngine.Analytics; - -namespace UnityEditor.U2D.PSD -{ - [Serializable] - internal struct PSDApplyEvent - { - public int instance_id; - public int texture_type; - public int sprite_mode; - public bool mosaic_layer; - public bool import_hidden_layer; - public bool character_mode; - public bool generate_go_hierarchy; - public bool reslice_from_layer; - public bool is_character_rigged; - public SpriteAlignment character_alignment; - public bool is_psd; - public PsdColorMode color_mode; - - } - - internal interface IAnalytics - { - AnalyticsResult SendApplyEvent(PSDApplyEvent evt); - } - - internal static class AnalyticFactory - { - static IAnalytics s_Analytics; - static public IAnalytics analytics - { - get - { - if (s_Analytics == null) - s_Analytics = new Analytics(); - return s_Analytics; - } - set { s_Analytics = value; } - } - } - - [InitializeOnLoad] - internal class Analytics : IAnalytics - { - const int k_MaxEventsPerHour = 100; - const int k_MaxNumberOfElements = 1000; - const string k_VendorKey = "unity.2d.psdimporter"; - const int k_Version = 1; - - static Analytics() - { - EditorAnalytics.RegisterEventWithLimit("psdImporterApply", k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey, k_Version); - } - - public AnalyticsResult SendApplyEvent(PSDApplyEvent evt) - { - return EditorAnalytics.SendEventWithLimit("psdImporterApply", evt, k_Version); - } - } -} +using System; +using PhotoshopFile; +using UnityEngine; +using UnityEngine.Analytics; + +namespace UnityEditor.U2D.PSD +{ + [Serializable] + internal struct PSDApplyEvent + { + public int instance_id; + public int texture_type; + public int sprite_mode; + public bool mosaic_layer; + public bool import_hidden_layer; + public bool character_mode; + public bool generate_go_hierarchy; + public bool reslice_from_layer; + public bool is_character_rigged; + public SpriteAlignment character_alignment; + public bool is_psd; + public PsdColorMode color_mode; + + } + + internal interface IAnalytics + { + AnalyticsResult SendApplyEvent(PSDApplyEvent evt); + } + + internal static class AnalyticFactory + { + static IAnalytics s_Analytics; + static public IAnalytics analytics + { + get + { + if (s_Analytics == null) + s_Analytics = new Analytics(); + return s_Analytics; + } + set { s_Analytics = value; } + } + } + + [InitializeOnLoad] + internal class Analytics : IAnalytics + { + const int k_MaxEventsPerHour = 100; + const int k_MaxNumberOfElements = 1000; + const string k_VendorKey = "unity.2d.psdimporter"; + const int k_Version = 1; + + static Analytics() + { + EditorAnalytics.RegisterEventWithLimit("psdImporterApply", k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey, k_Version); + } + + public AnalyticsResult SendApplyEvent(PSDApplyEvent evt) + { + return EditorAnalytics.SendEventWithLimit("psdImporterApply", evt, k_Version); + } + } +} diff --git a/Editor/Analytics.cs.meta b/Editor/Analytics.cs.meta index 42d8343..746b657 100644 --- a/Editor/Analytics.cs.meta +++ b/Editor/Analytics.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 9c2f00f81f6586446909cd337be9a6c7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 9c2f00f81f6586446909cd337be9a6c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/AssemblyInfo.cs b/Editor/AssemblyInfo.cs index 4061cce..9b1adea 100644 --- a/Editor/AssemblyInfo.cs +++ b/Editor/AssemblyInfo.cs @@ -1,2 +1,2 @@ -using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Unity.2D.Psdimporter.Tests.EditorTests")] +using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("Unity.2D.Psdimporter.Tests.EditorTests")] diff --git a/Editor/AssemblyInfo.cs.meta b/Editor/AssemblyInfo.cs.meta index ed3981f..9ff8a2f 100644 --- a/Editor/AssemblyInfo.cs.meta +++ b/Editor/AssemblyInfo.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 3073eb37881ce394f83060fd73c2d98d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3073eb37881ce394f83060fd73c2d98d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets.meta b/Editor/Assets.meta new file mode 100644 index 0000000..1534985 --- /dev/null +++ b/Editor/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bce0dac5f0c4f4fd5803440a5bf8ccee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons.meta b/Editor/Assets/Icons.meta new file mode 100644 index 0000000..dabdcef --- /dev/null +++ b/Editor/Assets/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f53b0034804e64815a9500a89a65cdb5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark.meta b/Editor/Assets/Icons/Dark.meta new file mode 100644 index 0000000..e81c980 --- /dev/null +++ b/Editor/Assets/Icons/Dark.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c6d402da5acb4d1da766701ce3753c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@16x.png b/Editor/Assets/Icons/Dark/Layers Collapsed@16x.png new file mode 100644 index 0000000000000000000000000000000000000000..cdce53b14ea298a44fe25dcc964738a702bdcc71 GIT binary patch literal 3807 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@16x.png.meta b/Editor/Assets/Icons/Dark/Layers Collapsed@16x.png.meta new file mode 100644 index 0000000..2c3e61e --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Collapsed@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 725dea07ef1724145806dfddfe9dee03 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@1x.png b/Editor/Assets/Icons/Dark/Layers Collapsed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f78ec3cb76d5f313898e002f0f744e7176ca9dcd GIT binary patch literal 425 zcmV;a0apHrP){ z!!Qh$%~mXh+Bh=>$$DkOBMdY|xC5yMKKQa|CpGK)9*v z`fOR&JMK>;8)vUoJi^g<=Whxe$5BYwBCHT+LI|b1ed>i~I4g{xCKaG-g2xrY7ZiB# zI}lyoXn{m#F7LXVF@RB|K_qo?Owxg8z>**cjz1EZMA(DZwr!59)WwqK2cG)A|8bMR zAo8dfDiVxT0a`#+hO?p1CGHW>9;g`eUu2Vf8VSmd?6+2yWk1I5Dlkod=fAZt$T^3d T;;@|y00000NkvXXu0mjf(Au*b literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@1x.png.meta b/Editor/Assets/Icons/Dark/Layers Collapsed@1x.png.meta new file mode 100644 index 0000000..11548e6 --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Collapsed@1x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: dd04679f252ec40a8b931fbb52bd3f8b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@2x.png b/Editor/Assets/Icons/Dark/Layers Collapsed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d611d01f07f59a8b807710eb6cce4f3cfc963ae GIT binary patch literal 611 zcmV-p0-XJcP)FVE+5Vxk5u0T!fmg0VXo3<9L{sazvGExHJ8Wm5TC0t|{k9!~uR$0JG# z(@UgrUs#`F{)2Z5o7L%biX_pJbh#(Q-pH5$9Q-I$Kxd0OXHC*&Eg>_tDyYaXuUNOn zc7zs!U?87g1f^ZwLzN)tcRqgBsi3w7m`0{pba;qZ`8aK0YTx)2w;|Ftcq4%}M2f+w z7+g=xF$&bzeJNXgj-?dycR?Fm7BUM^N22xrK#>T7PL7&-4q_v_NnC xyLJ_JyIscCWY^0TT!TA--iok{Ykuc$3%_ONFZfIWpo{@~0drDELIAGL9O(c600d`2O+f$vv5yPJdCIjhR9R8b{sRF#a zb1zFVU)9zkv{(PrJADj9kw_#Gi9~jl66MI_<72H-O8^oqOwIEWmPFEK1h4#sf>QxL7Zo#AtI0JIHeL^{Ue){ar>&09gd3 zb#>SXejrlR?rW3gm<@oN_p`)PRh_QgB&7h)&(GY$Ym+{U+TCSj9C{2lxNq0sc&%dS z4Ljp{-)3Yy^cdbDz$cRvDyjp7dmBHDhycy~{rx6H98pT2&u2%;CSBL@fGRHh+ef0a z>=iKjhzv$shDMy%J3c-h%V)#9RF!iIu6qM-Gb-M+qX37rP1ONhjA8wt7ZN z*zSbL0^1Y_r>1D=Hd$!n8Rt|uln{9s&v>f^SO~lt*FK7&EaP8ZUK(5x;^R9e#5N|x z@R^_qGVQhP6{w8IWY}B#+Bo@HCfMSrjSv>bFW`FQlTyaTy?U} z!bt997@xH4#cKg8UL?x*AE*_S16()(vW&-w{`WmMU{C~oPFNLcVf&>Lp-=*t8ZY5~ z1Fs4}guiS5YLY^P!U$k%yhMobHBE%H^9myX9=@IMwU+S`g$RihMu3E-h>`J<6cL7L z#}`HbG(B#3A`{7xmGP1#5jwnKlKhr-Y+>_&G%%s9#C8bfWJ4kIfINu;(2f%YpdBX) zKs(Mh3h*XB*!(VVovjl91=B4pY@fd&eYR?ZZauuB%o{}_5m){J+I5i{o$eRY00000 LNkvXXu0mjf5u)IA literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@4x.png.meta b/Editor/Assets/Icons/Dark/Layers Collapsed@4x.png.meta new file mode 100644 index 0000000..f43b95a --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Collapsed@4x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: ea5547bcdee4e4a8cb4705499aabe76d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Collapsed@8x.png b/Editor/Assets/Icons/Dark/Layers Collapsed@8x.png new file mode 100644 index 0000000000000000000000000000000000000000..f43e0bafa7d97ea0e87d145f091f9fdf83b45d8c GIT binary patch literal 1877 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 EHwTldZU6uP literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Mixed@16x.png.meta b/Editor/Assets/Icons/Dark/Layers Mixed@16x.png.meta new file mode 100644 index 0000000..dd15332 --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Mixed@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: cce85e132a43842a09301fd497983f25 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Mixed@1x.png b/Editor/Assets/Icons/Dark/Layers Mixed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3858f83c71fb8f4b07750da52068dfb8a45cd9f2 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{s&JN$B+ufw*hZ?n+!y9o<3gR6QCBr&XCAd z%2Wu1rObC6%nxvSB{0Y~3jR1h{d&tJw~o&GUj58_Uq4nImsR|~DEY9?X&bMXf&pK4 ztb0BC^{$WZOy_o{&U&^lbCy8=n(s%q6F25-M!kK8i`N ooR`E;$k+0{y!AxepR&CSYEPo(bb3BH3iLaJr>mdKI;Vst05@xfa{vGU literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Mixed@1x.png.meta b/Editor/Assets/Icons/Dark/Layers Mixed@1x.png.meta new file mode 100644 index 0000000..e07aeaf --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Mixed@1x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 8dbb9f40df36243efaad92ce7cddfc71 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Mixed@2x.png b/Editor/Assets/Icons/Dark/Layers Mixed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..363a0cfb78531eec9968a5052b9680682c85d998 GIT binary patch literal 487 zcmVO>v%`~VniitHn5Owb6QD#O2!gE;VuxTH*zTFe1kQP$ z-yFwDNfCDmG_ytUEvdsT%hIzfD;%2GA;8&gHk$)B;J{Dx3t*2F#E5uFYp-m%c2 z8Gzsh8h5>3XJ{W}b971HmF7opfl6xt$6!E-J^h@$K@$KKIqOSN6lchv(HH_vL{YTY zb)79|lNv$;6yr?ji z_KwLqSw<{+BlW`T!(c%UUd0oMC_6#*XY}oW%8s)H9z{Tb$mqb62sDYH0AH(5e@fs5 d3l{ttd;z_wy+l?Hf>r@~0drDELIAGL9O(c600d`2O+f$vv5yP1%SM15!Qu#3%D@|ewLZ$P8-g;x@4ookNL3UVG^enO z{;E_mMq)I7_w;nPAQA*Y5ClOG1VIo4;j2-hl9*1XSG8I#tX8W(@ne{Mo#2Q%olZ=j zgm(ev^LdEV4UXGNrE+!Zn#19c;&%x?jv>Z>DiJRNu(j*;I!~A<9+Dm`z{6&<`Pc9F zQ}T>c0aUE5Nd)hRyWMU=p0F0c(%MR7OJwN7D~ttTYjZ%`@Asi2Yb$}VCcE7(?)7>T za)6cqZ0%;V$&`u_ zIyY2{E`Y1u(B%;FGS#`EPyo1oN*4mh1;m53&OLuX!uX#3&WEHpWdb{@6u^Xq5>f-~?RZ z@fL|AAdm3Gabh=rFtzq6oYexHE8rmq9=w9xeB`Sha9$0vSD-c+&~rf)kO97|eF|d% zR;yLeYPHgjt}zIj$F*IQ=ks3gN*L{0;AK}wwMxrk#Sqtid+imOwPSoAebfxe>yRul zyCz57Bqae9iy)=iJ@X0{aILb16;++KMNy#u%jNPOgA7R#7qz=-kAcT+x7#DqK&2RZ z#L2YujYy-<=c1#8v9y+TUE!LPp4XfS13n;P-sk)K+TC4tluXj~LILp5-y4m_AF_Km z7BIp@Q;2a~ulO90+x}sKc=C%hQFfOzZi-kXO4@nA842MeL$qp&dP;qZaGDysXp0|{ zoDziaQWH3<1w0CIdBu<;A-um8V!XW^wGbk*?e**6{q3-d5P3nAmA@&KNSXg1@J5I- z>;CsBO@N$Ch+}GvcYMibOvO?nF9p(yZVA*DU#Jd}k5|D76LY1u6WV7Omgsk$7p?TV)v4NTve*I5@;JV#AHRQGIZoC zKF#I=#eX!o27i*Q+(d9^O%L$2gvf}F_0YkFfn7dd^PyEO8oXiN)Y{Vsr1#fX8UVS` zFHIX?4Kj?&+~fiNCQk_uO|+HC&@Xe70Sc3bWZg{7GNc0Nx-vaTxD_)=1)4^)tZLn| zZCRjW5TX7EUlyYPFjI!)lZ?D+D6VkZp~QKW(GH$=b*&AzY6Wx@aZi;!kp+S~6|$o9 z1c_8Oo1MLet97;0-IAbPRe20)3TE!nuv#i$uMHjf#HXmW00n&OJz-;5EVdS%I1iy-(N?ltV5$M19 z^5F5zi)~{uP7j$~|GAmLxg5@mN6o5FNb~I$)#AQd+ zKB`Wx@K#(H@_7KyzHzQ^-WQ|)h+>fXUTjyB7Sgag5kLsjPs>}+qlMNqkw?9NU_m;t zYuCjiEtom8c);?Dac?o3WyhL_Mc`vGV74Q1=9@F3`{WDrS#q(m)X@Ekx>DyTEUb^22t&tn2fH1`}d0Vth@&F74lHe#>9py%g8& z#mMUF=Op{jN4dS%it7z)P3?Sij+rX8$e=l;=c|Wxu1;opeIW7g6|8X4lp!_mitXW0 z%LJ7^xPlXQP=&pW_E;Ai_ncrB`)yUSY&YQwOK>*3hQ6~b`KniPs;+N}K?fBRi56)cbZsCCqzrZ380PNZRJaw-w`^GGZ~bFTY^XnxU8Jj5OD?^}#XTYDqg>x_#@6 zZL6JT=NL``c6xkuVqu_EA)fyGAI|wr0sSN#V_pGYB?Shoac%*etQBbQ5Ea#RIb62> z`8~L4Gtx a@;hQpS@AlP;+w+R1i;SP(W=?PKjnY>n_pc3 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Mixed@8x.png.meta b/Editor/Assets/Icons/Dark/Layers Mixed@8x.png.meta new file mode 100644 index 0000000..426f330 --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Mixed@8x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 1088bf24503634e7dbadf455fdcf78b6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Separated@16x.png b/Editor/Assets/Icons/Dark/Layers Separated@16x.png new file mode 100644 index 0000000000000000000000000000000000000000..cbaa3addef2a9972274718033d1c201be7771350 GIT binary patch literal 3963 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Separated@16x.png.meta b/Editor/Assets/Icons/Dark/Layers Separated@16x.png.meta new file mode 100644 index 0000000..b2532ba --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Separated@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 1f3420e9f7420411a8aac27743b35e29 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Separated@1x.png b/Editor/Assets/Icons/Dark/Layers Separated@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4c36a94705bb6aafb1fd092c20b8a318f3df1a5c GIT binary patch literal 426 zcmV;b0agBqP)c35Q1(PJ1YOSAuQ_iL=%bn+W+iwY?C>oDOqb11!#pCnDs;V;Ft|*Go z_x-Gin_s{*-$=43R-K)+ws1@G?(mZ)ZZyDk-3i?vfP2+#dm02xaMKQ&?G@;91$@l& z{5Tj4R@`r8Y|gfx;uwOB&5f#`$c zP>SW7<2d?!g$u=4#iGjsD4i_|W!x7uTJgN^qLu1nLKMgGOtfiYX_{8*wW~Hbhkz($zXmS8JOM8|efO{JtW%bMD;xL6GCs+#@WB7V#wOXAtyG#`< z7K^@N7?hkP^x%Q~^n5;hI%-f7U_pjXu&$NMGB;L?>gE9;NUYw1#~u%Im?nRYYCZ=svsf5 zpkiwh+XjXWf}^ngA}H-L8-CyllX4rT*|1qblJC5>X0!Pe?iZ2)1Rr4< z;NIU9!CfpZe5e}HXN6<{piCK{k8D&Ahr_cZc!Mn&4eILCoJ$2VP#I{=ZXiE)zVM{m zXz=*2Sz!buB)*Xryl?_C5~|?8LLf?lYgO<&h%f&LD|@xVBa#3B002ovPDHLkV1nJ$ B8XW)t literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Separated@2x.png.meta b/Editor/Assets/Icons/Dark/Layers Separated@2x.png.meta new file mode 100644 index 0000000..18e6915 --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Separated@2x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: e269a78d88d514e4c9bde97d573d7e45 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Separated@4x.png b/Editor/Assets/Icons/Dark/Layers Separated@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..0c25a4dd2305ff81104432c567ba9bd0eb406b31 GIT binary patch literal 1155 zcmV-}1bq96P)@~0drDELIAGL9O(c600d`2O+f$vv5yPdY-Tay6ZG1=eW z56J;q0`P2aZEc<62H5Zptr31iuo=I;zTVh)g^~a=d{J>OZUu)^2r@NUICBL+7`wz~ zNY#L&$BE7XO@)01R2>GSiHZP)g&^06bwP_<0T6mlki|`K@@MiCzBi03EQmeQL^%p@ z1lZWvIO4?+qfLJB1jBD&_!yDEXo8IL0FDZ{@Sxdj_GvwYxc<3|T)-+5gjclT72Ptt zLOg<3HnW|Cvs&Qx_Vx&3^hJ{75@)lWg!5`pc*O`F@!8ZXBC{P7T^<_?z>8v@E5a+} zI?*LHLW}^B=O*jiD%Vy;TYzXsEMzRAou=rKG)fDbwcwDNWk?yY?@A_5FHH#Y|mF{G3}pUaMtNxH7$0Uez9hl@lf z>J>1$O>R3%eBLv7n^y6r90fR}t+Ni0xdBEfqlK890p&!HEVRR*L2S2%J%=m3B9bDj zrf6AhGPw4~qB273RJa5owA)-dII9I%2s|361r$R&(d3GYE(m^&kK6<~vwg3q(h^gG z7opwV-D7rF?jVspTm|;xnI(+B6faiW5d4}fDeUE_%>NCVCIMxn)L8jf(eK#L%7((< z4r>SzsAP?m6F`zAgh`jDvI0ni5d2zgd$Cwdb?bW90_4^Lt`ROiCr@w|1**!s7ohY< zpe(S~5K3{mKCG}-B<|;p0Fl1Hvu&S`jR!jz-^EW~Fdmck^+o{n9Is^>jg@|goSi zsqu`L0x)SJ#GA57ZF^PY8E*w(&}ACKxKo{Dbc|=bPK9B}kPTAZU)OlXYY&jX6Go!( znu>|>OeF+hvP3X7o~eugOo9loeRW}KJX0wF7$L$}vHD-=z7GE{;L4E))zsA3@)t4K Vhfk5-yV(E$002ovPDHLkV1iFW5hMTr literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Separated@4x.png.meta b/Editor/Assets/Icons/Dark/Layers Separated@4x.png.meta new file mode 100644 index 0000000..a866310 --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Separated@4x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 03a0f27e9b08047889b3f5e7f0c23ff7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Dark/Layers Separated@8x.png b/Editor/Assets/Icons/Dark/Layers Separated@8x.png new file mode 100644 index 0000000000000000000000000000000000000000..c79ec0785c58b30136b0734038c9c68c74292214 GIT binary patch literal 1978 zcmV;r2SxaaP)*M3&_W1ZXp$bz<0rdO*-Fm(LoeeC8-(U4we$6urqdT2W2kmzInJPx9 z1R$%Ojrk`Vb)O%1DLcKYd4=c&pjZ3*`};*sqkloX!sg~?@8#v?w(MRZS^?yM!*&=iJ-_Lg$2N_3L8C(?Ck7>EdX{^&jhR>`+$RkgJ-gc2@mjtfGw;?0)+)2 zaVy9C=b}~uMv%M!KV0%>+a=2wO$4c2z;`O?;f`&T;cqznyLOcsw2}&zY@lQURbmLN zCy`sJkK<#jX8|0-G&oHBJP(*@$^hhNwJ*Ziaj+Z=@h{zhSMaym7va1fK)gb&R+H@E zNmaapUhQ(=!#VyZ3J9+yVHG$)lGT34ZvHmZ>fs=20@Yrj%PZvf*u8>U?GnG=p(Zc~ z5r>k&ul7X*-4_u0rcqWqzduQY-JmbP5+R0?p@eWIh^jYGyn@^wR4KU+f(qeG5M_6; z%S~gMR{J7+7pYv0r=vKUH!-rJka<{cS8(&N+VbP`&Fh|^3U&9r}+?xi!~6?6#4 z|9{U!!e*u)qBHZJf@&MHeHM_m+0)pEBL5}};WXo>(P#*#_bP1o*0R$0P?|}t2%tc- zr>webQ;ia!2a z?z)ybff5R=snW$90};aE;i2_%yTSrcyKw9E>mf8%dYEHy$-=)Tixd_Bhc`dTecnDH zM_$3_)DjUr?+f!XmdCshJSKzx)tFb4Wr3y+VL9iYEN~{6-e3 zQ9*bW-l!P>zG=zDE4Q0dx<9|^bu|cb9ffBE*+M>;X0zGhm9oca z+Ys-sGUR!0T>?i{DmUhzm*?vBy7xo0U_HP*A$Wv5d3xU4{Ie|N4PpNf%pPDJ%2jq) z2wm4gD06pEGy>4L6hhhC!i4Aqps^{0Di~f9tpGG8g-|8KYoZr`W?l$cdIYOzcui>p zpqUYZ#NQqIzs|3*=(SZgyry&l&?q5vSqRtCEXvo39&OK$e^VqwoNQBC0ch09?x_pR z5o{(9xB&vFI1oU^fdDEF1W<7xfQkbFR2&GP;*>rSR7PedlC|W|{5arrb}vtP83eF^ zkc&8VjUm6chJKFUUrSou`DdAX6L1TdLw&$9_vmxTqiP}VupoZQxL5MXvI0{`8EK5K$UN`@0{F_hd#KzN z`s4A~Nl|JB;|mF81OoWVQ<@jOy}k8piy))%bA6FF1n`whTJHru5fSj7z)DMaR^wBK zi6pZ?0CTAC320MF5inPy(a30rPafm*`|eQ=Aba*DvY@dXIL5*bC{#rOgQV3Cv}@Me4g0qd$n&R literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Dark/Layers Separated@8x.png.meta b/Editor/Assets/Icons/Dark/Layers Separated@8x.png.meta new file mode 100644 index 0000000..bae657d --- /dev/null +++ b/Editor/Assets/Icons/Dark/Layers Separated@8x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 51ef52b256a104c0ca3268e10a1b1056 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light.meta b/Editor/Assets/Icons/Light.meta new file mode 100644 index 0000000..ade050e --- /dev/null +++ b/Editor/Assets/Icons/Light.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 00c7de9129a3f41a3a38bd1c2d5a057f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Collapsed@16x.png b/Editor/Assets/Icons/Light/Layers Collapsed@16x.png new file mode 100644 index 0000000000000000000000000000000000000000..878faa67a6d0a32c6404c1eb17a9aeef24b5faba GIT binary patch literal 3853 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Collapsed@16x.png.meta b/Editor/Assets/Icons/Light/Layers Collapsed@16x.png.meta new file mode 100644 index 0000000..565911b --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Collapsed@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: cf195ec1f698d488fb3fdeebc2b3ad33 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Collapsed@1x.png b/Editor/Assets/Icons/Light/Layers Collapsed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..593231e159a43a1f1c6512cde180ddd044f5f763 GIT binary patch literal 412 zcmV;N0b~A&P)$=Y@%ZjrEzVA<6*Io5}ALBS3xmyxZ+qRpc zC`wLFIB*>2fMO+1LrE!DuxG>%oRl1-X-dggknG2*bv~}^`q9i!%n{)3F#FoJ?W$>- zcf?O58~$g0_JwJ&n3lW_?1l_`Sh-_f9o7z_q(k|dsGS!2A$XwmU_oQ7d2=mr=O@I0^GYPHy*hvsU` zqDG^!I2;aJkcr6b^ZIc<;d5CqvdcBUyjIRh7p4Josx8mbgK6N3o^8;}Hg@;4+ zz`;!{u%|%3qcX7a1DDHXOEm)|gl_JNz-F`gXf~T2jv-#P3k?usk0})Lgk0$9j7n87 z91h>G(HOCG$pEm8(B|j!IWkd0ApuUvY?IMw#j$~NC!H2WBr5+8$VA{cmbI^NPGux+BA_EB zIT!Rtg6l_DN5Y~Skay0GvbnU+BplR=9cqSCJAu4&`IKBCd5lAqk&xHgR3Ef)PRsOb zzu%vMi1F{*T|mW5xRu$}5`ug1AW&x#<{{_-1N;IyCPeZ|txjzK0000 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Collapsed@2x.png.meta b/Editor/Assets/Icons/Light/Layers Collapsed@2x.png.meta new file mode 100644 index 0000000..f294a65 --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Collapsed@2x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: dc4d4d6503a044f85bf2b8b356dfb738 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Collapsed@4x.png b/Editor/Assets/Icons/Light/Layers Collapsed@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6a3b3639fef1570dc62577a0f1787f8b8230b7 GIT binary patch literal 1121 zcmV-n1fKheP)@~0drDELIAGL9O(c600d`2O+f$vv5yPB8$ahu~;mNN`(q!YirA?R4T{VUB_r(-+Oy|>s?=8 zdo&|*7hrpPdmV;u3h>Fhh^Yg9gM?_fw!`_ym zi|h8TuCDrI04V|3+sn(#2W&VEXYyI%V{|Za-snVykN~me%b^m&%PBUV%EXx|z|PLj z&u|Hw2fCOr_hn9~W*q?IU78|36vb9ln3ytfQ^gUcaLTO4DVxeVj>sN$^>_J zcbll@94aO%0vLX# z_V78c^#Nz0g=B&<#L`}+UV(t|-T41hlAn?DDJN8fkTpIcjD!u~23aSIycj8*6yvA8_TqN|BT*EV?>~^WW;(cZ z0;Cy_Qg`D2+PW4CIZC$lXQHU1mJFtPs15q$@qv!1kNsb zAkq4sbZlw!fFv-XjjZhuO3Q{)<^e@w1)v4T3P1~v6@V6;c@*F&w(pZBb0+{YyHnoK nPza?)=-k6^lzEWFV$tOvrQ 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Mixed@16x.png.meta b/Editor/Assets/Icons/Light/Layers Mixed@16x.png.meta new file mode 100644 index 0000000..8516da9 --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Mixed@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 8146dbbd8d7184f43bb0049a7ce3ade8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Mixed@1x.png b/Editor/Assets/Icons/Light/Layers Mixed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e58e972811968b5a72979890f5b758c387aaf8b4 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{(Das$B+ufw}Gd5n;Zn5)=w4Mz_gX=r2~)5 zj!w}I(GJ-J_9``%Y}QMS(;PVG{QPz8%`D#--#t?5ipG0tKc_ukyXcSe)J8{v9jjKo z3%KO7Yn}DeNsDIQy|`*7Niu4S3uS|&_tX4Ch%yl2tPzw=^}2v&%3YD;R)Tp3!iCN;jF~K#!mfW^m3y1z>z?<&jlVW_`rN3Rn$yaC zY05Q&x63l4qOO-R)iAzD)OdXK5tl!sPi#_FOQyC~OQ!pTqqoBj@I6?f^y5=cqJ&k` p1ZA^Bf4zRH)!hF+!+gI?`Ays8Klj+BVu4;~@O1TaS?83{1OTKyiDLi& literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Mixed@1x.png.meta b/Editor/Assets/Icons/Light/Layers Mixed@1x.png.meta new file mode 100644 index 0000000..0c1114b --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Mixed@1x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 92ca921ade6e944868364b1813c7568f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Mixed@2x.png b/Editor/Assets/Icons/Light/Layers Mixed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c55b03e748911ad99562f1dfd7de7a68632f1ff GIT binary patch literal 492 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 YHgw)As`Y*U1P^icj6J5p+&lSy0GBXRMF0Q* literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Separated@16x.png.meta b/Editor/Assets/Icons/Light/Layers Separated@16x.png.meta new file mode 100644 index 0000000..27abc8b --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Separated@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 0c6027d31d0b44acbb45af1bcf05e0db +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Light/Layers Separated@1x.png b/Editor/Assets/Icons/Light/Layers Separated@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b073f1b75e8e00538988b76594bc083a161318 GIT binary patch literal 433 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Light/Layers Separated@8x.png.meta b/Editor/Assets/Icons/Light/Layers Separated@8x.png.meta new file mode 100644 index 0000000..8dcef6d --- /dev/null +++ b/Editor/Assets/Icons/Light/Layers Separated@8x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 2634b0c913a9a4431a8702825a79ca31 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected.meta b/Editor/Assets/Icons/Selected.meta new file mode 100644 index 0000000..71b08d3 --- /dev/null +++ b/Editor/Assets/Icons/Selected.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de89e38f975b648ee8a3157737d2e442 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Collapsed@16x.png b/Editor/Assets/Icons/Selected/Layers Collapsed@16x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8af3dbd2da1c36544ae0cdd6e96041f9d1d7bf9 GIT binary patch literal 3577 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 Y68P4en3;*>EdMe%Zs%-UZR3~vAC|I1?*IS* literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Collapsed@16x.png.meta b/Editor/Assets/Icons/Selected/Layers Collapsed@16x.png.meta new file mode 100644 index 0000000..6ed0179 --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Collapsed@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 7ffc8f310c89c47679285e29d8583529 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Collapsed@1x.png b/Editor/Assets/Icons/Selected/Layers Collapsed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d307200eecfde62fb2e48af76366e4d1a81321 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{(nyw$B+ufvq5ipn+ybWd-rejQOIi$ULpN} zfplkpWkZwRHs5c-BK>9?T;tO#sQ}?TRcRnSt z;`b~|N{D*=cPI+P;c&=drb?+9YzbSOPNzkdWtwh)NB~IFBuQpfRZVf5JKPHRyd96n zEyR>0gz^yQblGi6GH_Hjh{_s53ZJuTA(iY_3XQeqh|0U`h^_>bW%&s+q`1&&nvU8g zlI8>Kd`t16T@zOV5ULl57-6itUKF6j8VigJyPvq6yj6glcrr&#+@tQY$RHx8}JtUtzUXa<$N$E~UHY-Y^&p z)?xu2Rltia+ZGd)uCof-1nj8$ymj4vjnKA6#d+{?CQ$0Z2$+ZjFgT1R#5o0mGatt> zm->5Kafpyma<708AvQTz4E%TI`K0Sh8T2`}N^vG2ADU_1B_jBLz!rkRrT0_&E#%}A zagzX-D2rUvMFjVcu}efk5zr)OqI%9;vxu{giC$a*O>%pe+#!vKO)bKH_m1MhdCsOy zKVtVw`p%ob2RdrS!{-;}2!4ZJK+Gg;LQ@X`z5oxH5ilo?4R!zk002ovPDHLkV1h$i B>frzY literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Collapsed@2x.png.meta b/Editor/Assets/Icons/Selected/Layers Collapsed@2x.png.meta new file mode 100644 index 0000000..5fc09bd --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Collapsed@2x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 68f9e990182e8491b9c0f3dc88cd0158 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Collapsed@4x.png b/Editor/Assets/Icons/Selected/Layers Collapsed@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0f7ecbb8939be783b92bcd08dfb63177d122b5 GIT binary patch literal 1030 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Mixed@4x.png.meta b/Editor/Assets/Icons/Selected/Layers Mixed@4x.png.meta new file mode 100644 index 0000000..3d0fd1d --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Mixed@4x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 32ae70dfad34e4a56a3f40eaf723f739 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Mixed@8x.png b/Editor/Assets/Icons/Selected/Layers Mixed@8x.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8e6cc84bdcd2ce8ae9ec4f509df9523d29daad GIT binary patch literal 1325 zcmV+|1=9M7P)cq=G;PrUIY?Q$b7xp#$6jM*%=qK}tx*p4dJ;R=WS2 zVN5cU!JJmIR?;dW00000000000000000000000000002k^6>C*Ao$CUG)^0Rvb($c z`Q_#1SpOITpx3Xt{@wNA;o(e1tjPdyJzX39R2%q<{Au)67CSpT^XKR1a}9=tj7(Dj z;Cj0@<~RLzBHNj3;9TwP?On@AR38A^=ttUUpVsW{>k6a7g^mh$(y%H6zz^}^bA2Ld z-RaMoK0Q6%w)hcIRRFjlUSE#2cYc<5y?t%^bFXw%a1+P5G{SrUWbWj)7oh%jr8!pz=%6vMRJpdZ)?dvj` zPG$*!M2j`mvXo9H3jm|(n>EGL$>;%4QTk?0k#sUz0BFOX_(q=yhRB*uMhSqv@4pKT zAKOAlgpa9%U{?lmJzr@26gnLVE+w(S0pN#yq%lc-jBRiLs7{cQ?EuivsaruR3-faT zH5DY`(n3jWZ~(Y9ZZ})iZx@1CdVQu}_1T_DVo?`@bi(2mfKG+1U|Vy2elx#J+)D;Y zmVz}9I(<3QU*>}_N&KHsqi|7TZy@<*5G#Z$xncf7U#Gcx`!d$z%PTCn2LT{hdP*r5^Sa`*g z#_TCv43_HxIc}44>`MMx`~XpG*{!rrHhMw*1RIl&L z;2h~laHYNWUMHoOJ_THh>+SkAb^lg>ANQGSqVe76CW%FfF8}aO#h#VSc}LJ#Zv)#@(SxHo3PT8l zki%6ZWb|FBT(|H*iOa~2&Rieik}H=I1tQN1vzF8g|-q1 zrFSehWwA1-lL`aDH+*&f^;`{=L6!p{94njF*6@M(x&Whr&`hmBHH9HY0-?Dgk?Jag zd?1AVhEDQmwmPWF(l94eAT(VT=2RO1L83rtzTt!F10e7hV`=!H$p8q}2!yPsZ!Bs$00MV~t-RhR@J_#aU9o$Vim!D6000000000000000 j0000000000z)1ZBzlR%{as~Ut00000NkvXXu0mjfalKEM literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Mixed@8x.png.meta b/Editor/Assets/Icons/Selected/Layers Mixed@8x.png.meta new file mode 100644 index 0000000..7a90cfa --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Mixed@8x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 3492e9eb6292141eb942d0c9beface29 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Separated@16x.png b/Editor/Assets/Icons/Selected/Layers Separated@16x.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd451bef32a0bfce77615ddcdf8a64ba68fa175 GIT binary patch literal 3749 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 Z(X|gb=r$LW9FHe)7}l0{7VIG){twO@n$Q3M literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Separated@16x.png.meta b/Editor/Assets/Icons/Selected/Layers Separated@16x.png.meta new file mode 100644 index 0000000..0190d26 --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Separated@16x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 5e2b00fc2e687454b8c7dcf6cb8226d7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Assets/Icons/Selected/Layers Separated@1x.png b/Editor/Assets/Icons/Selected/Layers Separated@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f880ac1164e98166813b510552f901c507135873 GIT binary patch literal 358 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 literal 0 HcmV?d00001 diff --git a/Editor/Assets/Icons/Selected/Layers Separated@8x.png.meta b/Editor/Assets/Icons/Selected/Layers Separated@8x.png.meta new file mode 100644 index 0000000..6ec13d8 --- /dev/null +++ b/Editor/Assets/Icons/Selected/Layers Separated@8x.png.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 15b1d39ac42ce4674bd63f86f9a0c5df +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDImportPostProcessor.cs b/Editor/PSDImportPostProcessor.cs index e041c0b..7735ed1 100644 --- a/Editor/PSDImportPostProcessor.cs +++ b/Editor/PSDImportPostProcessor.cs @@ -1,85 +1,31 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEditor.U2D; -using UnityEditor.U2D.Sprites; -using UnityEngine; - -namespace UnityEditor.U2D.PSD -{ - internal class PSDImportPostProcessor : AssetPostprocessor - { - private static string s_CurrentApplyAssetPath = null; - - void OnPostprocessSprites(Texture2D texture, Sprite[] sprites) - { - var dataProviderFactories = new SpriteDataProviderFactories(); - dataProviderFactories.Init(); - PSDImporter psd = AssetImporter.GetAtPath(assetPath) as PSDImporter; - if (psd == null) - return; - ISpriteEditorDataProvider importer = dataProviderFactories.GetSpriteEditorDataProviderFromObject(psd); - if (importer != null) - { - importer.InitSpriteEditorDataProvider(); - var physicsOutlineDataProvider = importer.GetDataProvider(); - var textureDataProvider = importer.GetDataProvider(); - int actualWidth = 0, actualHeight = 0; - textureDataProvider.GetTextureActualWidthAndHeight(out actualWidth, out actualHeight); - float definitionScaleW = (float)texture.width / actualWidth; - float definitionScaleH = (float)texture.height / actualHeight; - float definitionScale = Mathf.Min(definitionScaleW, definitionScaleH); - foreach (var sprite in sprites) - { - var guid = sprite.GetSpriteID(); - var outline = physicsOutlineDataProvider.GetOutlines(guid); - var outlineOffset = sprite.rect.size / 2; - if (outline != null && outline.Count > 0) - { - // Ensure that outlines are all valid. - int validOutlineCount = 0; - for (int i = 0; i < outline.Count; ++i) - validOutlineCount = validOutlineCount + ( (outline[i].Length > 2) ? 1 : 0 ); - - int index = 0; - var convertedOutline = new Vector2[validOutlineCount][]; - for (int i = 0; i < outline.Count; ++i) - { - if (outline[i].Length > 2) - { - convertedOutline[index] = new Vector2[outline[i].Length]; - for (int j = 0; j < outline[i].Length; ++j) - { - convertedOutline[index][j] = outline[i][j] * definitionScale + outlineOffset; - } - index++; - } - } - sprite.OverridePhysicsShape(convertedOutline); - } - } - } - } - - public static string currentApplyAssetPath - { - set { s_CurrentApplyAssetPath = value; } - } - static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromPath) - { - if (!string.IsNullOrEmpty(s_CurrentApplyAssetPath)) - { - foreach (var asset in importedAssets) - { - if (asset == s_CurrentApplyAssetPath) - { - var obj = AssetDatabase.LoadMainAssetAtPath(asset); - Selection.activeObject = obj; - Unsupported.SceneTrackerFlushDirty(); - s_CurrentApplyAssetPath = null; - break; - } - } - } - } - } -} +using UnityEngine; + +namespace UnityEditor.U2D.PSD +{ + internal class PSDImportPostProcessor : AssetPostprocessor + { + private static string s_CurrentApplyAssetPath = null; + + public static string currentApplyAssetPath + { + set { s_CurrentApplyAssetPath = value; } + } + static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromPath) + { + if (!string.IsNullOrEmpty(s_CurrentApplyAssetPath)) + { + foreach (var asset in importedAssets) + { + if (asset == s_CurrentApplyAssetPath) + { + var obj = AssetDatabase.LoadMainAssetAtPath(asset); + Selection.activeObject = obj; + Unsupported.SceneTrackerFlushDirty(); + s_CurrentApplyAssetPath = null; + break; + } + } + } + } + } +} diff --git a/Editor/PSDImportPostProcessor.cs.meta b/Editor/PSDImportPostProcessor.cs.meta index 370ee65..76ceb50 100644 --- a/Editor/PSDImportPostProcessor.cs.meta +++ b/Editor/PSDImportPostProcessor.cs.meta @@ -1,11 +1,11 @@ -fileFormatVersion: 2 -guid: 96feaa0b12eabfe44b345be97ea0029c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 96feaa0b12eabfe44b345be97ea0029c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/PSDImporter.cs b/Editor/PSDImporter.cs index b0ca5d5..6f8e0f3 100644 --- a/Editor/PSDImporter.cs +++ b/Editor/PSDImporter.cs @@ -1,1527 +1,1656 @@ -using System; -using System.Collections.Generic; -using System.IO; -using PDNWrapper; -using UnityEngine; -using Unity.Collections; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using UnityEditor.AssetImporters; -using UnityEditor.U2D.Animation; -using UnityEditor.U2D.Common; -using UnityEditor.U2D.Sprites; -using UnityEngine.Assertions; -using UnityEngine.U2D; -using UnityEngine.U2D.Animation; -using UnityEngine.Scripting.APIUpdating; - -namespace UnityEditor.U2D.PSD -{ - ///

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 literal 82909 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ⅇ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 mdU|>uMK6~@w diff --git a/Documentation~/images/table2.png b/Documentation~/images/table2.png deleted file mode 100644 index c4ed0a3c9ac21ddac44a86d51eabc6cf77129a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115885 zcmZ5{bx@nl8*OlhKyfKjv;=pjxKk+Z?poa4i@UqKyW58scQ5V)*PGv+x&PeFWb#fj z@4UO&ea=45IcFn&DoCOs6Cwiu05oYSF=YS%N)G^l-b93kd~+6(RRZ~daT1YMK}1Ac z-&NcJ0LTE+Vn0;ev(CFU?J37ns2@n!z#ROz31b_lOBWTF>(!R`7G#!rZb-ntLc&Zh zXcGQ^|K4R^_H4S))3ddYoJKJm9rsfN_Ddyb*`F^ zPT!KetoOcapVtkd^XY`Xtl|Cdf?x8y%rK0^wGEojY6Wsp(-%YN3b~-KD-0!ZUD-wc z|9NC2r})+4k9aC+?;vWri2~Y4%8vs~Jal;fLdR|khJb~Ue7J!d)1A-P_tmS?+Hu(yHap8 zUm+BkJ82bo8t#UI0!Ry2teRn&h!_wNGOVo#EC!IlI_Bgj{cUXAc3Y?mhE@*5vzhWj zBUGNFVf(@aJkt61S_*@SiHQO&i&&K$`2dYcr>te!apkNk6D?6VY&6Rrjj`n+nAsL& zc#I=k`2&DXyuw4udqh;JY>Z|6M;U-+eCcL|S(n$$SO;rn-Hid|?-Y-1IX=2MSumM2>|!eb)9P0^4Z1J)v~;gr!Vr3x0O&9yJm&NdlZ$HmuWzB#s~4jVw+8!rWaiVvK3-uVop2Ii8{zdht+ zcQ!#GO-@2nO3)W`5`^&#aUrvTe}g=(+!n6oezX$dPYbp$)*<0KZY3^xy$2|t-koEk zPgX4osH+%HZf)f_+3C$xH#e@mPlUlCb`MYvs3g=l7a(})(c<j!>ycN1b_jlNuLT)dsRj^2+G-Q?CPmCM3^#d+5 zb6#?#Lx9@#e=DkHV@=OfFOaDvAAkwK6EUEhIN#aH+rEnWZ*^7ks6)@i?^7qmG%PG^ zy4~;NBv;n~yynAgt9Nc%i-9Z-+hG~5b;RTwVLYlu<|)b93&Uy4Z01Zdb?SPygtViB zuXw>Udg;7DEq%M`w%zUX`k>T>y0rFqwN2{7UvZ{IUz}%pq5%YAW#3i$)*crhsvTj0 zEXBp3!)k2FumUm8k&=EAN+PpqTUQ&M@kd!?QyywzVGw(3Y|XICNBim}-gxLvEyF<( z7>M75I_d;^3Zt6<$jF~+&bl5)_!q0A7UIfaDW)A4EA>cwJnnCkl~1S6xTbl8?sJ94 zqowBWF4kLR${$I$m=2>>hu$~+1V7t#ipozP=erHnlIi@}hpDbs4sh(8WRUvp94CSrP#!JaRaQgjKT7Gld&*l?2*9HOCt0N&>m95N^wR}QV^*LmU5+Axuwj*pG&Eql ze{kTV%~8VDaczLNP^8zJF?f2EzfUx%*Xm);zCK=+&X2jD;<`wonI=9A#*eXWUKJO1 zFHk0xcBJaFC~&qKq+St_;qlL{GH0%PT&VTlI$w_dviGTrsYWSsUaZyY_3Z9#)lVr_ zetcYX)8$H+Q_w(S1NU6006n|6E*Q&o3hm&dzD?kuD@x;Wkj7|7EGd)GMNB&&4~?N`V9E_5>zaybviURa6cS2fl~7xIUy