3.3 KiB
3.3 KiB
Rapor: Brightness Efekti + Sağ Tık Etkileşim Düzeni
Tarih: 2026-08-03 Durum: Rapor — uygulama için onay bekleniyor
1. Gönderilen Araştırmanın Özeti
ColorMatrixHelper: Rec.709 luma katsayıları (0.2126 / 0.7152 / 0.0722) — projedekiyle aynı.- Üç ayrı 4x5 renk matrisi:
- Brightness: RGB'ye offset ekler (
b→ -255..255) - Contrast:
cile çarpar +128*(1-c)offset (0..2 arası, 1.0 orijinal) - Saturation: Rec.709 ağırlıklı karışım (0..2 arası, 1.0 orijinal)
- Brightness: RGB'ye offset ekler (
- Birleştirme:
M_final = M_contrast * M_brightness * M_saturation— genel 4x5 matris çarpımı; uygulama sırası saturation → brightness → contrast. - Uygulama:
ColorFiltered+ColorFilter.matrixile GPU shader'ı — projedekiyle aynı mekanizma. - Örnek widget (
ImageAdjusterWidget) slider tabanlı; bizim uygulama jest tabanlı olduğu için bu kısım direkt uygulanmayacak. Asıl değer matris hesabında.
2. Projedeki Mevcut Durum — lib/widgets/image_canvas.dart
- State:
_contrast(1.0),_saturation(1.0) — brightness yok. _buildCombinedFilter(): saturation × contrast tek matriste elle birleştiriliyor (contrast offset:t = (1-c)/2→ 255 ölçeğinde 127.5*(1-c)).- Cache:
_cachedFilter+_cachedSat/_cachedCon. - Etkileşim: sağ tık = contrast, Ctrl+sağ tık = saturation, Shift+sağ tık = rotate, sağ çift tık = reset (tüm efektler).
- Modifier takibi:
_onHardwareKeyyalnızca ctrl ve shift'i izliyor.
3. Karşılaştırma — Araştırma vs Mevcut Kod
| Konu | Mevcut | Araştırma | Fark |
|---|---|---|---|
| Saturation matrisi | Rec.709, aynı formül | Rec.709, aynı formül | Matematik birebir aynı |
| Contrast offset | 127.5*(1-c) | 128*(1-c) | ~%0.4, görsel fark yok |
| Brightness | yok | b offset matrisi |
Eklenecek |
| Birleştirme | elle 2 matris | genel 4x5 çarpım | 3 efekt için genel çarpım daha temiz |
| Arayüz | jest (sağ tık + sürükle) | slider | Widget değil, matris katmanı alınacak |
4. Uygulama Planı
_brightnessstate ekle (varsayılan 0.0, aralık -100..100)._onPointerDown: öncelik sırası — Ctrl+Shift → brightness, Ctrl → saturation, Shift → rotate, yoksa contrast. (Başlangıçta Alt denenmişti; XFCE Alt+klik'i pencere hareketine kaptığı için Ctrl+Shift'e geçildi.)_onPointerMove: brightness modunda_brightness = _startBrightness + dy * 0.5(clamp -100..100; hassasiyet açık soru)._buildCombinedFilter: araştırmadaki 4x5 çarpım mantığıyla 3 efekt birleştir (saturation → brightness → contrast); cache anahtarına_brightnessekle.- Reset (sağ çift tık),
_resetView,_toggleFillFit: brightness 0'a döner. hasFilterkoşuluna_brightness != 0eklenir (ColorFiltered yalnızca gerektiğinde).
5. Dikkat Edilecekler
- Linux/XFCE: Alt+klik WM tarafından pencere hareketine kaptırıldığı için brightness Ctrl+Shift+sağ tık'a alındı (Alt kaldırıldı).
- Uygulama sırası: saturation → brightness → contrast sabit kalacak; farklı sıra farklı sonuç verir.
- Reset davranışı brightness'i de kapsar.
6. Açık Sorular
- Brightness hassasiyeti:
dy * 0.5, aralık -100..100 uygun mu? - Rotate Shift+sağ tık'ta kalıyor (değişiklik yok) — onay?