# Durum Raporu: Downsampling + Full-Res Swap + RAM Leak Fix Tarih: 2026-08-14 Branch: `main` ## Yapılan Değişiklikler Tek dosya: `lib/widgets/image_canvas.dart` ### 1. Downsampling (ilk yüklemede RAM tasarrufu) - `_downsampleTarget = 2048` sabiti eklendi. - `_buildImage()` artık ilk yüklemede `ResizeImage.resizeIfNeeded(2048, null, ...)` kullanıyor. Büyük resimler (ör. 12000px) 2048px'e küçültülerek decode ediliyor. - Önceki davranış: resim her zaman tam çözünürlükte decode ediliyordu (`cacheWidth = longest * _sc * 2`), bu da dev resimlerde RAM'i dolduruyordu. ### 2. Full-Res Swap (zoom'da kalite) - `_checkFullResSwap()`: downsampled resmin viewport'a oranı (`stretch`) 1.5x'i geçince `_usingFullRes = true` yapılıyor ve doğrudan `FileImage` (tam çözünürlük) kullanılıyor. - `_handleScroll()` içinde `_sc` güncellendikten sonra çağrılıyor. - Sonuç: küçük görünümde 2048px (RAM ~1.6MB), zoom ile yakınlaşınca orijinal. ### 3. RAM Leak Fix (resim geçişlerinde sızıntı) - `didUpdateWidget()` içinde `old.filePath != widget.filePath` kontrolü: - `_cachedFileImage?.evict()`, `_cachedProvider?.evict()` - `PaintingBinding.instance.imageCache.evict(FileImage(File(old.filePath)))` - Tüm cache alanları `null`'a çekiliyor. - Önceki davranış: her yüklenen resim Flutter'ın global `ImageCache`'inde birikiyor, RAM sürekli artıyordu. ### 4. Görüntü boyutu takibi - `_imageSize`, `loadingBuilder` + `ImageStreamListener` ile decode edilen gerçek piksel boyutundan dolduruluyor. `_checkFullResSwap()` bu değeri stretch hesabında kullanıyor. ## Temizlik - Tiled render kodunun tamamı kaldırıldı (Flutter codec API region decode desteklemiyor). - `dart:ui` ve `dart:typed_data` import'ları gereksiz kalınca silindi. - Kullanılmayan `_uiImage`, `_fullResImage`, `_fullResLoading` alanları kaldırıldı. ## Doğrulama - `flutter analyze --no-pub`: 0 error. - `flutter build linux --debug`: başarılı. - Kullanıcı testi: onaylandı ("herşey tamam gözüküyor"). ## Açık Konular / Sonraki Adımlar - `_downsampleTarget` ve swap threshold (1.5x) değerleri tune edilebilir. - LOD (progressive loading) seviyeleri — şimdilik tek kademe (2048 → full) yeterli. - Android/iOS hedeflerinde `ResizeImage` davranışı ayrıca test edilmeli.