UltraCanvas/
├── include/
│ ├── UltraCanvasCommonTypes.h
│ ├── UltraCanvasImageElement.h
│ ├── UltraCanvasGraphicsPluginSystem.h
│ └── …
├── core/
│ ├── UltraCanvasImageElement.cpp
│ ├── UltraCanvasGraphicsPluginSystem.cpp
│ └── …
├── Plugins/
│ ├── Images/
│ │ ├── UltraCanvasSTBImagePlugin.h # Core formats (PNG, JPEG, BMP, GIF, TGA, PSD, HDR)
│ │ ├── UltraCanvasWebPPlugin.h # WebP format support
│ │ ├── UltraCanvasAVIFPlugin.h # AVIF format support
│ │ ├── UltraCanvasTIFFPlugin.h # TIFF format support
│ │ ├── UltraCanvasHEICPlugin.h # HEIC/HEIF format support
│ │ ├── UltraCanvasJXLPlugin.h # JPEG XL format support
│ │ └── UltraCanvasImagePluginManager.h # Central plugin management
│ ├── Video/
│ │ ├── UltraCanvasMP4Plugin.h # MP4 video support
│ │ ├── UltraCanvasAVIPlugin.h # AVI video support
│ │ └── UltraCanvasVideoPluginManager.h # Video plugin management
│ ├── Audio/
│ │ ├── UltraCanvasMP3Plugin.h # MP3 audio support
│ │ ├── UltraCanvasFLACPlugin.h # FLAC audio support
│ │ └── UltraCanvasAudioPluginManager.h # Audio plugin management
│ ├── Documents/
│ │ ├── UltraCanvasPDFPlugin.h # PDF document support
│ │ ├── UltraCanvasMarkdownPlugin.h # Markdown support
│ │ └── UltraCanvasDocumentPluginManager.h # Document plugin management
│ └── Graphics/
│ ├── UltraCanvasSVGPlugin.h # SVG vector graphics
│ ├── UltraCanvasEPSPlugin.h # EPS vector graphics
│ └── UltraCanvasVectorPluginManager.h # Vector plugin management
├── OS/
│ ├── Linux/
│ │ └── UltraCanvasSupport.cpp
│ ├── MSWindows/
│ │ └── UltraCanvasSupport.cpp
│ └── MacOS/
│ └── UltraCanvasSupport.cpp
└── examples/
├── ImageViewer/
├── VideoPlayer/
└── DocumentReader/
– Images/ -> All image format plugins
– Video/ -> All video format plugins
– Audio/ -> All audio format plugins
– Documents/ -> Document format plugins
– Graphics/ -> Vector graphics plugins
– Each plugin in its own .h file
– Clear naming: UltraCanvas[Format]Plugin.h
– Example: UltraCanvasHEICPlugin.h, UltraCanvasJXLPlugin.h
– Central manager per category
– UltraCanvasImagePluginManager.h
– Handles registration and coordination
– Each plugin checks for #ifdef ULTRACANVAS_[FORMAT]_SUPPORT
– Graceful degradation if library not available
– Clear error messages for missing dependencies
– Plugins reference core headers: ../../include/
– Clean separation of concerns
– No circular dependencies
cmake
# Core UltraCanvas
add_subdirectory(core)
# Plugin system (optional components)
option(ULTRACANVAS_IMAGE_PLUGINS "Enable image plugins" ON)
option(ULTRACANVAS_VIDEO_PLUGINS "Enable video plugins" OFF)
option(ULTRACANVAS_AUDIO_PLUGINS "Enable audio plugins" OFF)
if(ULTRACANVAS_IMAGE_PLUGINS)
add_subdirectory(Plugins/Images)
endif()
if(ULTRACANVAS_VIDEO_PLUGINS)
add_subdirectory(Plugins/Video)
endif()
if(ULTRACANVAS_AUDIO_PLUGINS)
add_subdirectory(Plugins/Audio)
endif()
This structure provides excellent organization while maintaining the flexibility and modularity that makes UltraCanvas powerful and maintainable!
✅ Modularity: Each plugin is self-contained
✅ Scalability: Easy to add new formats/categories
✅ Maintainability: Clear organization and ownership
✅ Build Flexibility: Choose which plugin categories to include
✅ Dependency Management: Isolated dependencies per plugin
✅ Code Clarity: No confusion about what each file does
✅ Team Development: Different developers can work on different plugins
✅ Testing: Individual plugins can be tested in isolation
// Include specific plugins
#include "Plugins/Images/UltraCanvasHEICPlugin.h"
#include "Plugins/Images/UltraCanvasJXLPlugin.h"
// Or include manager for easy initialization
#include "Plugins/Images/UltraCanvasImagePluginManager.h"
// Initialize all image plugins
UltraCanvas::UltraCanvasImagePluginManager::Initialize();
// Or register specific plugins
UltraCanvas::RegisterHEICPlugin();
UltraCanvas::RegisterJXLPlugin();