# 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?
