Files
imajviewer/docs/rapor-brightness.md

3.3 KiB
Raw Blame History

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: c ile ç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)
  • Birleştirme: M_final = M_contrast * M_brightness * M_saturation — genel 4x5 matris çarpımı; uygulama sırası saturation → brightness → contrast.
  • Uygulama: ColorFiltered + ColorFilter.matrix ile 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: _onHardwareKey yalnı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ı

  1. _brightness state ekle (varsayılan 0.0, aralık -100..100).
  2. _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.)
  3. _onPointerMove: brightness modunda _brightness = _startBrightness + dy * 0.5 (clamp -100..100; hassasiyet açık soru).
  4. _buildCombinedFilter: araştırmadaki 4x5 çarpım mantığıyla 3 efekt birleştir (saturation → brightness → contrast); cache anahtarına _brightness ekle.
  5. Reset (sağ çift tık), _resetView, _toggleFillFit: brightness 0'a döner.
  6. hasFilter koşuluna _brightness != 0 eklenir (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

  1. Brightness hassasiyeti: dy * 0.5, aralık -100..100 uygun mu?
  2. Rotate Shift+sağ tık'ta kalıyor (değişiklik yok) — onay?