// 보기 화면 AI 모듈: 이 장 해상도 올리기 (121) · 품질 올리기 · AI 그림 바탕 (123) // // 약속 // - 입력: 화면의 [BuildContext] (닫혔는지 context.mounted 로 본다) · 앱 ([AppController] - 설정 · 서비스) · 그림 원본 · 장 번호 // - 출력: [upscaleReaderPage] 는 올린 그림으로 바꿔 볼 경로 (설정이 '올린 것으로 보기' 이고 이 기기의 그림 파일일 때만, 아니면 null). // [readerAiSource] 는 AI 그림의 바탕이 될 이 기기의 그림 경로 (없으면 null) // - 오류: 파일을 못 꺼내거나 취소하면 null. AI 창 (ai_upscale_ui) 의 오류 처리를 그대로 쓴다 // 원본 · ZIP 은 그대로 두고 새 파일로 저장한다. 다른 보기 화면도 다시 쓸 수 있다. import 'package:flutter/widgets.dart'; import '../../app/app_controller.dart'; import '../../core/reader_sources.dart'; import '../../core/vfs.dart'; import '../ai_upscale_ui.dart'; /// [page] 장의 해상도를 올려 새 파일로 저장한다. 저장한 뒤 올린 것으로 계속 볼 경로 (설정) - 이 기기의 그림 파일 목록일 때만 Future upscaleReaderPage(BuildContext context, AppController c, ReaderSource src, int page) async { final file = await readerPageFile(c, src, page); if (file == null || !context.mounted) return null; final saved = await upscaleOne(context, c, input: file.$1, nameFrom: file.$2, outDir: file.$3); if (saved == null || !context.mounted) return null; final s = src; if (c.settings.aiImage.upAfter == 'upscaled' && s is ImageFilesSource && !isDav(s.paths[page])) return saved; return null; } /// [page] 장의 품질을 올려 새 파일로 저장한다 Future qualityReaderPage(BuildContext context, AppController c, ReaderSource src, int page) async { final file = await readerPageFile(c, src, page); if (file == null || !context.mounted) return; await qualityUp(context, c, input: file.$1, nameFrom: file.$2, outDir: file.$3); } /// 지금 보는 그림 파일 (이 기기의 그림 파일일 때, AI 그림 컴포넌트가 켜져 있을 때). [hasPages] 볼 장이 있는지 String? readerAiSource(AppController c, ReaderSource src, int page, {required bool hasPages}) { final s = src; if (!c.settings.components.contains('aiimage') || s is! ImageFilesSource || !hasPages) return null; final path = s.paths[page]; return isDav(path) ? null : path; }