// Contrast management module // Uses the Observer pattern to notify the main camera module of contrast changes const ContrastManager = { // Private state _currentContrast: 1.0, // Default contrast (no change) _observers: new Set(), _slider: null, // Initialize the contrast manager init() { this._setupEventListeners(); }, // Private methods _setupEventListeners() { this._slider = document.getElementById('contrast-slider'); this._slider.addEventListener('input', (e) => { this._currentContrast = parseFloat(e.target.value); document.getElementById('contrast-value').textContent = this._currentContrast; this._notifyObservers(); }); }, _notifyObservers() { this._observers.forEach(observer => observer(this._currentContrast)); }, // Public methods subscribe(observer) { this._observers.add(observer); return () => this._observers.delete(observer); }, getCurrentContrast() { return this._currentContrast; }, // Apply contrast to an image applyContrast(imageData, contrast) { if (!contrast || contrast === 1.0) return imageData; const { data } = imageData; const factor = (259 * (contrast + 255)) / (255 * (259 - contrast)); for (let i = 0; i < data.length; i += 4) { // Apply contrast to each color channel for (let c = 0; c < 3; c++) { const pixel = data[i + c]; data[i + c] = factor * (pixel - 128) + 128; } } return imageData; }, // Add reset method reset() { this._currentContrast = 1.0; this._slider.value = 0; // Reset slider to middle position this._notifyObservers(); } };