diff --git a/bin/lang/Chinese_Simplified.json b/bin/lang/Chinese_Simplified.json index f7913e2..26f33db 100644 --- a/bin/lang/Chinese_Simplified.json +++ b/bin/lang/Chinese_Simplified.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"输出格式", "IDC_STATIC_OUTPUT_QUALITY":"输出图像质量", "IDC_STATIC_OUTPUT_DEPTH":"输出色彩深度", - "IDC_STATIC_AUTO_START":"自动转换设置", + "IDC_STATIC_AUTO_START":"", "IDC_RADIO_AUTO_START_NONE":"不启用", "IDC_RADIO_AUTO_START_ONE":"输入单个文件时启用", "IDC_RADIO_AUTO_START_MULTI":"输入文件夹或多个文件时启用", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"2D 插图 2 (Y 模型)", "IDC_CHECK_TTA":"TTA 模式", "IDC_STATIC_PROCESS_SPEED_SETTING":"处理速度设置", - "IDC_STATIC_PROCESSOR":"处理器", + "IDC_STATIC_PROCESSOR":"", "IDC_RADIO_MODE_GPU":"CUDA (cuDNN 优先)", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"拆分大小", @@ -39,6 +39,7 @@ "IDC_BUTTON_CANCEL":"取消", "IDC_BUTTON_EXEC":"开始", "IDC_STATIC_LANG_UI":"界面语言", + "IDC_BUTTON_OUTPUT_REF":"选择", "MessageUseProcessorMode":"使用的处理模式: %s", "MessageProcessTime":"处理时间: %02d:%02d:%02d.%03d", "MessageInitTime":"初始化时间: %02d:%02d:%02d.%03d", diff --git a/bin/lang/Chinese_Traditional.json b/bin/lang/Chinese_Traditional.json index 987d8de..b646a69 100644 --- a/bin/lang/Chinese_Traditional.json +++ b/bin/lang/Chinese_Traditional.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"輸出副檔名", "IDC_STATIC_OUTPUT_QUALITY":"輸出質量設置", "IDC_STATIC_OUTPUT_DEPTH":"輸出位元深度", - "IDC_STATIC_AUTO_START":"自動開始設定", + "IDC_STATIC_AUTO_START":"", "IDC_RADIO_AUTO_START_NONE":"不自動開始", "IDC_RADIO_AUTO_START_ONE":"輸入文件", "IDC_RADIO_AUTO_START_MULTI":"輸入多個文件或文件夾", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"二次元插圖2 ( Y模式 ) ", "IDC_CHECK_TTA":"使用TTA模式", "IDC_STATIC_PROCESS_SPEED_SETTING":"處理速度設置", - "IDC_STATIC_PROCESSOR":"處理器", + "IDC_STATIC_PROCESSOR":"", "IDC_RADIO_MODE_GPU":"CUDA ( cuDNN優先 )", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"拆分大小", @@ -39,6 +39,7 @@ "IDC_BUTTON_CANCEL":"取消", "IDC_BUTTON_EXEC":"運行", "IDC_STATIC_LANG_UI":"界面語言", + "IDC_BUTTON_OUTPUT_REF":"瀏覽文件", "MessageUseProcessorMode":"使用的處理器模式: %s", "MessageProcessTime":"處理時間: %02d:%02d:%02d.%03d", "MessageInitTime":"初始化時間: %02d:%02d:%02d.%03d", diff --git a/bin/lang/english.json b/bin/lang/english.json index 6918496..9dfabac 100644 --- a/bin/lang/english.json +++ b/bin/lang/english.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"Output extension", "IDC_STATIC_OUTPUT_QUALITY":"Output quality", "IDC_STATIC_OUTPUT_DEPTH":"Output depth bits", -"IDC_STATIC_AUTO_START":"Auto start Settings", +"IDC_STATIC_AUTO_START":"Auto start When Input files set", "IDC_RADIO_AUTO_START_NONE":"No auto start", "IDC_RADIO_AUTO_START_ONE":"On input file", "IDC_RADIO_AUTO_START_MULTI":"On input many files or folder", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"2-D illust (Y Model)", "IDC_CHECK_TTA":"Uses TTA Mode", "IDC_STATIC_PROCESS_SPEED_SETTING":"Processing speed Settings", -"IDC_STATIC_PROCESSOR":"Processor", +"IDC_STATIC_PROCESSOR":"Use Processor", "IDC_RADIO_MODE_GPU":"CUDA (Uses cuDNN)", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"Split size", @@ -39,6 +39,15 @@ "IDC_BUTTON_CANCEL":"Cancel", "IDC_BUTTON_EXEC":"Start", "IDC_STATIC_LANG_UI":"UI language", +"IDC_BUTTON_OUTPUT_REF":"Browse", +"IDC_BUTTON_APP_SETTING":"App Setting", +"IDC_BUTTON_CLEAR_OUTPUT_DIR":"Reset output dir", +"IDC_STATIC_ARG_START":"Boot With Arg", +"IDC_CHECK_ARG_START_AUTO":"Start when boot", +"IDC_CHECK_ARG_START_SUCCESS_FINISH":"Exit when successed", +"IDC_STATIC_INPUT_DIR_FIX":"Input fixed folder", +"IDC_STATIC_OUTPUT_DIR_FIX":"Output fixed folder", +"IDC_CHECK_OUTPUT_NO_OVERWIRITE":"Output files No overwrite", "MessageUseProcessorMode":"Use Processor: %s", "MessageProcessTime":"Processing time: %02d:%02d:%02d.%03d", "MessageInitTime":"Initialization time: %02d:%02d:%02d.%03d", diff --git a/bin/lang/japanese.json b/bin/lang/japanese.json index 82dc306..678c011 100644 --- a/bin/lang/japanese.json +++ b/bin/lang/japanese.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"出力拡張子", "IDC_STATIC_OUTPUT_QUALITY":"出力画質設定", "IDC_STATIC_OUTPUT_DEPTH":"出力深度ビット数", -"IDC_STATIC_AUTO_START":"自動変換開始設定", +"IDC_STATIC_AUTO_START":"ファイル入力時自動変換開始設定", "IDC_RADIO_AUTO_START_NONE":"自動で開始しない", "IDC_RADIO_AUTO_START_ONE":"ファイルを1つでも入力したら開始", "IDC_RADIO_AUTO_START_MULTI":"フォルダあるいは複数ファイルを\r\n入力したら開始", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"2次元イラスト2 (Yモデル)", "IDC_CHECK_TTA":"TTAモードを使う", "IDC_STATIC_PROCESS_SPEED_SETTING":"処理速度設定", -"IDC_STATIC_PROCESSOR":"プロセッサー", +"IDC_STATIC_PROCESSOR":"使用プロセッサー", "IDC_RADIO_MODE_GPU":"CUDA(使えたらcuDNN)", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"分割サイズ", @@ -39,6 +39,15 @@ "IDC_BUTTON_CANCEL":"キャンセル", "IDC_BUTTON_EXEC":"実行", "IDC_STATIC_LANG_UI":"UIの言語", +"IDC_BUTTON_OUTPUT_REF":"参照", +"IDC_BUTTON_APP_SETTING":"動作設定", +"IDC_BUTTON_CLEAR_OUTPUT_DIR":"出力フォルダ初期化", +"IDC_STATIC_ARG_START":"引数付き起動時設定", +"IDC_CHECK_ARG_START_AUTO":"起動時に変換する", +"IDC_CHECK_ARG_START_SUCCESS_FINISH":"成功時に終了する", +"IDC_STATIC_INPUT_DIR_FIX":"入力参照時\r\n固定フォルダ", +"IDC_STATIC_OUTPUT_DIR_FIX":"出力参照時\r\n固定フォルダ", +"IDC_CHECK_OUTPUT_NO_OVERWIRITE":"出力ファイルを上書きしない", "MessageUseProcessorMode":"使用プロセッサーモード: %s", "MessageProcessTime":"処理時間: %02d:%02d:%02d.%03d", "MessageInitTime":"初期化時間: %02d:%02d:%02d.%03d", diff --git a/bin/lang/korean.json b/bin/lang/korean.json index 41c17ef..0f0f0b6 100644 --- a/bin/lang/korean.json +++ b/bin/lang/korean.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"출력 확장자", "IDC_STATIC_OUTPUT_QUALITY":"출력 화질 설정", "IDC_STATIC_OUTPUT_DEPTH":"출력 컬러 비트", -"IDC_STATIC_AUTO_START":"자동 변환 시작 설정", +"IDC_STATIC_AUTO_START":"", "IDC_RADIO_AUTO_START_NONE":"자동 시작 안 함", "IDC_RADIO_AUTO_START_ONE":"파일 입력시 바로 시작", "IDC_RADIO_AUTO_START_MULTI":"폴더 또는 여러 파일을\r\n입력하면 시작", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"2D 일러스트 (Y 모델)", "IDC_CHECK_TTA":"TTA 모드 사용", "IDC_STATIC_PROCESS_SPEED_SETTING":"처리 속도 설정", -"IDC_STATIC_PROCESSOR":"프로세서", +"IDC_STATIC_PROCESSOR":"", "IDC_RADIO_MODE_GPU":"CUDA (cuDNN 사용)", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"분할 크기", @@ -39,6 +39,7 @@ "IDC_BUTTON_CANCEL":"취소", "IDC_BUTTON_EXEC":"시작", "IDC_STATIC_LANG_UI":"UI 언어", +"IDC_BUTTON_OUTPUT_REF":"찾기", "MessageUseProcessorMode":"사용한 프로세서 : %s", "MessageProcessTime":"처리 시간: %02d:%02d:%02d.%03d", "MessageInitTime":"초기화 시간: %02d:%02d:%02d.%03d", diff --git a/bin/lang/turkish.json b/bin/lang/turkish.json index 2572496..f6826d2 100644 --- a/bin/lang/turkish.json +++ b/bin/lang/turkish.json @@ -7,7 +7,7 @@ "IDC_STATIC_OUTPUT_EXT":"Çıktı uzantısı", "IDC_STATIC_OUTPUT_QUALITY":"Çıktı kalitesi", "IDC_STATIC_OUTPUT_DEPTH":"Çıktı bit derinliği", -"IDC_STATIC_AUTO_START":"Otomatik Başlatma Ayarları", +"IDC_STATIC_AUTO_START":"", "IDC_RADIO_AUTO_START_NONE":"Otomatik başlatma", "IDC_RADIO_AUTO_START_ONE":"Dosya girdisi olduğunda", "IDC_RADIO_AUTO_START_MULTI":"Birden fazla dosya veya klasör girdisi olduğunda", @@ -31,7 +31,7 @@ "IDC_RADIO_MODEL_Y":"2-B çizim (Y Modeli)", "IDC_CHECK_TTA":"TTA Modu Kullan", "IDC_STATIC_PROCESS_SPEED_SETTING":"İşleme Hızı Ayarları", -"IDC_STATIC_PROCESSOR":"İşlemci", +"IDC_STATIC_PROCESSOR":"", "IDC_RADIO_MODE_GPU":"CUDA (Varsa cuDNN Kullanır)", "IDC_RADIO_MODE_CPU":"CPU", "IDC_STATIC_CROP_SIZE":"Parçalama oranı", @@ -39,6 +39,7 @@ "IDC_BUTTON_CANCEL":"İptal", "IDC_BUTTON_EXEC":"Başlat", "IDC_STATIC_LANG_UI":"Arayüz dili", +"IDC_BUTTON_OUTPUT_REF":"Gözat", "MessageUseProcessorMode":"Kullanılan İşlemci: %s", "MessageProcessTime":"İşlem süresi: %02d:%02d:%02d.%03d", "MessageInitTime":"Başlangıç süresi: %02d:%02d:%02d.%03d", diff --git a/waifu2x-caffe-gui/CDialogBase.cpp b/waifu2x-caffe-gui/CDialogBase.cpp index 66ee4d9..82f54a7 100644 --- a/waifu2x-caffe-gui/CDialogBase.cpp +++ b/waifu2x-caffe-gui/CDialogBase.cpp @@ -3,9 +3,9 @@ // _CAO쐬 -INT_PTR CDialogBase::DoModal(HINSTANCE hInstance, int iDialogId) +INT_PTR CDialogBase::DoModal(HINSTANCE hInstance, int iDialogId, HWND hWndParent) { - return DialogBoxParam(hInstance, MAKEINTRESOURCE(iDialogId), NULL, &DispatchDialogProc, (LPARAM)this); + return DialogBoxParam(hInstance, MAKEINTRESOURCE(iDialogId), hWndParent, &DispatchDialogProc, (LPARAM)this); } HWND CDialogBase::GetDialogHWND(void) diff --git a/waifu2x-caffe-gui/CDialogBase.h b/waifu2x-caffe-gui/CDialogBase.h index 71ca767..3562b5a 100644 --- a/waifu2x-caffe-gui/CDialogBase.h +++ b/waifu2x-caffe-gui/CDialogBase.h @@ -16,7 +16,7 @@ public: virtual ~CDialogBase(){}; // _CAO쐬 - INT_PTR DoModal(HINSTANCE hInstance, int iDialogId); + INT_PTR DoModal(HINSTANCE hInstance, int iDialogId, HWND hWndParent = NULL); HWND GetDialogHWND(void); diff --git a/waifu2x-caffe-gui/LangStringList.h b/waifu2x-caffe-gui/LangStringList.h index 1968a66..890c434 100644 --- a/waifu2x-caffe-gui/LangStringList.h +++ b/waifu2x-caffe-gui/LangStringList.h @@ -139,7 +139,8 @@ private: auto name = Utf8ToUtf16(it->name.GetString(), it->name.GetStringLength()); auto val = Utf8ToUtf16(it->value.GetString(), it->value.GetStringLength()); - langStringMap.emplace(name, val); + if(val.length() > 0) + langStringMap.emplace(name, val); } } catch (...) diff --git a/waifu2x-caffe-gui/MainDialog.cpp b/waifu2x-caffe-gui/MainDialog.cpp new file mode 100644 index 0000000..8bc5562 --- /dev/null +++ b/waifu2x-caffe-gui/MainDialog.cpp @@ -0,0 +1,2496 @@ +#include "MainDialog.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../common/waifu2x.h" +#include "CDialog.h" +#include "CControl.h" + + +const size_t AR_PATH_MAX(1024); + +const int MinCommonDivisor = 50; +const int DefaultCommonDivisor = 128; +const std::pair DefaultCommonDivisorRange = {90, 140}; + +const TCHAR * const CropSizeListName = TEXT("crop_size_list.txt"); +const TCHAR * const SettingFileName = TEXT("setting.ini"); +const TCHAR * const LangDir = TEXT("lang"); +const TCHAR * const LangListFileName = TEXT("lang/LangList.txt"); + +const TCHAR * const MultiFileStr = TEXT("(Multi File)"); + +const UINT_PTR nIDEventTimeLeft = 1000; + + +// http://stackoverflow.com/questions/10167382/boostfilesystem-get-relative-path +boost::filesystem::path relativePath(const boost::filesystem::path &path, const boost::filesystem::path &relative_to) +{ + // create absolute paths + boost::filesystem::path p = boost::filesystem::absolute(path); + boost::filesystem::path r = boost::filesystem::absolute(relative_to); + + // if root paths are different, return absolute path + if (p.root_path() != r.root_path()) + return p; + + // initialize relative path + boost::filesystem::path result; + + // find out where the two paths diverge + boost::filesystem::path::const_iterator itr_path = p.begin(); + boost::filesystem::path::const_iterator itr_relative_to = r.begin(); + while (*itr_path == *itr_relative_to && itr_path != p.end() && itr_relative_to != r.end()) + { + ++itr_path; + ++itr_relative_to; + } + + // add "../" for each remaining token in relative_to + if (itr_relative_to != r.end()) + { + ++itr_relative_to; + while (itr_relative_to != r.end()) + { + result /= ".."; + ++itr_relative_to; + } + } + + // add remaining path + while (itr_path != p.end()) + { + result /= *itr_path; + ++itr_path; + } + + return result; +} + +std::vector CommonDivisorList(const int N) +{ + std::vector list; + + const int sq = sqrt(N); + for (int i = 1; i <= sq; i++) + { + if (N % i == 0) + list.push_back(i); + } + + const int sqs = list.size(); + for (int i = 0; i < sqs; i++) + list.push_back(N / list[i]); + + std::sort(list.begin(), list.end()); + + return list; +} + + +tstring DialogEvent::AddName() const +{ + tstring addstr; + + addstr += TEXT("("); + switch (modelType) + { + case eModelTypeRGB: + addstr += TEXT("RGB"); + break; + + case eModelTypePhoto: + addstr += TEXT("Photo"); + break; + + case eModelTypeY: + addstr += TEXT("Y"); + break; + } + addstr += TEXT(")"); + + addstr += TEXT("("); + if (mode == "noise") + addstr += TEXT("noise"); + else if (mode == "scale") + addstr += TEXT("scale"); + else if (mode == "noise_scale") + addstr += TEXT("noise_scale"); + else if (mode == "auto_scale") + addstr += TEXT("auto_scale"); + addstr += TEXT(")"); + + if (mode.find("noise") != mode.npos || mode.find("auto_scale") != mode.npos) + addstr += TEXT("(Level") + to_tstring(noise_level) + TEXT(")"); + if (use_tta) + addstr += TEXT("(tta)"); + + if (mode.find("scale") != mode.npos) + { + if (scaleType == eScaleTypeRatio) + addstr += TEXT("(x") + to_tstring(scale_ratio) + TEXT(")"); + else if (scaleType == eScaleTypeWidth) + addstr += TEXT("(width ") + to_tstring(scale_width) + TEXT(")"); + else + addstr += TEXT("(height ") + to_tstring(scale_height) + TEXT(")"); + } + + if (output_depth != 8) + addstr += TEXT("(") + boost::lexical_cast(output_depth) + TEXT("bit)"); + + return addstr; +} + +bool DialogEvent::SyncMember(const bool NotSyncCropSize, const bool silent) +{ + bool ret = true; + + if (input_str_multi.size() == 0) + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_INPUT), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + input_str = buf; + } + + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_OUTPUT), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + output_str = buf; + } + + if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_NOISE), BM_GETCHECK, 0, 0)) + mode = "noise"; + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_SCALE), BM_GETCHECK, 0, 0)) + mode = "scale"; + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_NOISE_SCALE), BM_GETCHECK, 0, 0)) + mode = "noise_scale"; + else + mode = "auto_scale"; + + if (SendMessage(GetDlgItem(dh, IDC_RADIONOISE_LEVEL1), BM_GETCHECK, 0, 0)) + noise_level = 1; + else if (SendMessage(GetDlgItem(dh, IDC_RADIONOISE_LEVEL2), BM_GETCHECK, 0, 0)) + noise_level = 2; + else + noise_level = 3; + + if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_RATIO), BM_GETCHECK, 0, 0)) + scaleType = eScaleTypeRatio; + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_WIDTH), BM_GETCHECK, 0, 0)) + scaleType = eScaleTypeWidth; + else + scaleType = eScaleTypeHeight; + + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + TCHAR *ptr = nullptr; + const double d = _tcstod(buf, &ptr); + if (!ptr || *ptr != TEXT('\0') || d <= 0.0) + { + if (scaleType == eScaleTypeRatio) + { + ret = false; + + if (!silent) + MessageBox(dh, langStringList.GetString(L"MessageScaleRateCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + } + } + else + scale_ratio = d; + } + + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + TCHAR *ptr = nullptr; + const long l = _tcstol(buf, &ptr, 10); + if (!ptr || *ptr != TEXT('\0') || l <= 0) + { + if (scaleType == eScaleTypeWidth) + { + ret = false; + + if (!silent) + MessageBox(dh, langStringList.GetString(L"MessageScaleWidthCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + } + } + else + scale_width = l; + } + + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + TCHAR *ptr = nullptr; + const long l = _tcstol(buf, &ptr, 10); + if (!ptr || *ptr != TEXT('\0') || l <= 0) + { + if (scaleType == eScaleTypeHeight) + { + ret = false; + + if (!silent) + MessageBox(dh, langStringList.GetString(L"MessageScaleHeightCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + } + } + else + scale_height = l; + } + + if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODEL_RGB), BM_GETCHECK, 0, 0)) + { + model_dir = TEXT("models/anime_style_art_rgb"); + modelType = eModelTypeRGB; + } + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODEL_Y), BM_GETCHECK, 0, 0)) + { + model_dir = TEXT("models/anime_style_art"); + modelType = eModelTypeY; + } + else + { + model_dir = TEXT("models/photo"); + modelType = eModelTypePhoto; + } + + { + const auto &OutputExtentionList = Waifu2x::OutputExtentionList; + + const int cur = SendMessage(GetDlgItem(dh, IDC_COMBO_OUT_EXT), CB_GETCURSEL, 0, 0); + if (cur < 0 || cur >= OutputExtentionList.size()) + MessageBox(dh, langStringList.GetString(L"MessageOutputExtentionCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + else + { + const auto elm = OutputExtentionList[cur]; + + outputExt = elm.ext; + + TCHAR buf[AR_PATH_MAX] = TEXT(""); + + GetWindowText(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + if (elm.imageQualityStart && elm.imageQualityEnd) + { + TCHAR *ptr = nullptr; + const auto num = _tcstol(buf, &ptr, 10); + if (!ptr || *ptr != '\0' || num < *elm.imageQualityStart || num > *elm.imageQualityEnd) + { + output_quality.reset(); + ret = false; + + MessageBox(dh, langStringList.GetString(L"MessageOutputQualityCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + } + else + output_quality = num; + } + + const int curDepth = SendMessage(GetDlgItem(dh, IDC_COMBO_OUTPUT_DEPTH), CB_GETCURSEL, 0, 0); + if (curDepth < 0 || curDepth >= elm.depthList.size()) + MessageBox(dh, langStringList.GetString(L"MessageOutputQualityCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + else + output_depth = elm.depthList[curDepth]; + } + } + + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_EDIT_INPUT_EXT_LIST), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + inputFileExt = buf; + + // input_extention_list𕶎̔zɂ + + typedef boost::char_separator char_separator; + typedef boost::tokenizer tokenizer; + + char_separator sep(TEXT(":"), TEXT(""), boost::drop_empty_tokens); + tokenizer tokens(inputFileExt, sep); + + extList.clear(); + for (auto tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) + { + tstring ext(*tok_iter); + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); + extList.push_back(TEXT(".") + ext); + } + } + + if (!NotSyncCropSize) + { + TCHAR buf[AR_PATH_MAX] = TEXT(""); + GetWindowText(GetDlgItem(dh, IDC_COMBO_CROP_SIZE), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + + TCHAR *ptr = nullptr; + crop_size = _tcstol(buf, &ptr, 10); + if (!ptr || *ptr != '\0' || crop_size <= 0) + { + crop_size = 128; + ret = false; + + MessageBox(dh, langStringList.GetString(L"MessageCropSizeCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + } + } + + use_tta = SendMessage(GetDlgItem(dh, IDC_CHECK_TTA), BM_GETCHECK, 0, 0) == BST_CHECKED; + + return ret; +} + +void DialogEvent::SetCropSizeList(const boost::filesystem::path & input_path) +{ + HWND hcrop = GetDlgItem(dh, IDC_COMBO_CROP_SIZE); + + int gcd = 1; + if (boost::filesystem::exists(input_path) && !boost::filesystem::is_directory(input_path)) + { + auto mat = Waifu2x::LoadMat(input_path.string()); + if (mat.empty()) + return; + + auto size = mat.size(); + mat.release(); + + gcd = boost::math::gcd(size.width, size.height); + } + + while (SendMessage(hcrop, CB_GETCOUNT, 0, 0) != 0) + SendMessage(hcrop, CB_DELETESTRING, 0, 0); + + // ő񐔂̖񐔂̃Xg擾 + std::vector list(CommonDivisorList(gcd)); + + // MinCommonDivisor̖񐔍폜 + list.erase(std::remove_if(list.begin(), list.end(), [](const int v) + { + return v < MinCommonDivisor; + } + ), list.end()); + + int mindiff = INT_MAX; + int defaultIndex = -1; + for (int i = 0; i < list.size(); i++) + { + const int n = list[i]; + + tstring str(to_tstring(n)); + SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); + + const int diff = abs(DefaultCommonDivisor - n); + if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) + { + mindiff = diff; + defaultIndex = i; + } + } + + SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)TEXT("-----------------------")); + + // CropSizeList̒lljĂ + mindiff = INT_MAX; + int defaultListIndex = -1; + for (const auto n : CropSizeList) + { + tstring str(to_tstring(n)); + const int index = SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); + + const int diff = abs(DefaultCommonDivisor - n); + if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) + { + mindiff = diff; + defaultListIndex = index; + } + } + + if (defaultIndex == -1) + defaultIndex = defaultListIndex; + + if (GetWindowTextLength(hcrop) == 0) + SendMessage(hcrop, CB_SETCURSEL, defaultIndex, 0); +} + +void DialogEvent::ProcessWaifu2x() +{ + std::vector> file_paths; + + const auto inputFunc = [this, &file_paths](const tstring &input) + { + const boost::filesystem::path input_path(boost::filesystem::absolute(input)); + + if (boost::filesystem::is_directory(input_path)) // input_pathtH_Ȃ炻̃fBNgȉ̉摜t@Cꊇϊ + { + boost::filesystem::path output_path(output_str); + + output_path = boost::filesystem::absolute(output_path); + + if (!boost::filesystem::exists(output_path)) + { + if (!boost::filesystem::create_directory(output_path)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&output_path, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); + return; + } + } + + // ϊ摜̓́Ao̓pX擾 + const auto func = [this, &input_path, &output_path, &file_paths](const boost::filesystem::path &path) + { + BOOST_FOREACH(const boost::filesystem::path& p, std::make_pair(boost::filesystem::recursive_directory_iterator(path), + boost::filesystem::recursive_directory_iterator())) + { + if (!boost::filesystem::is_directory(p)) + { + tstring ext(getTString(p.extension())); +#ifdef UNICODE + std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower); +#else + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); +#endif + + if (std::find(extList.begin(), extList.end(), ext) != extList.end()) + { + const auto out_relative = relativePath(p, input_path); + const auto out_absolute = output_path / out_relative; + + const auto out = getTString(out_absolute.branch_path() / out_absolute.stem()) + outputExt; + + file_paths.emplace_back(getTString(p), out); + } + } + } + + return true; + }; + + if (!func(input_path)) + return; + + for (const auto &p : file_paths) + { + const boost::filesystem::path out_path(p.second); + const boost::filesystem::path out_dir(out_path.parent_path()); + + if (!boost::filesystem::exists(out_dir)) + { + if (!boost::filesystem::create_directories(out_dir)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&out_dir, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + //printf("o̓tH_u%sv̍쐬Ɏs܂\n", out_absolute.string().c_str()); + return; + } + } + } + } + else + { + const boost::filesystem::path output_path(output_str); + const auto outDir = output_path.branch_path(); + + if (!boost::filesystem::exists(outDir)) + { + if (!boost::filesystem::create_directories(outDir)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&outDir, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); + return; + } + } + + file_paths.emplace_back(input_str, output_str); + } + }; + + const auto inputFuncMulti = [this, &file_paths](const tstring &input) + { + const boost::filesystem::path input_path(boost::filesystem::absolute(input)); + const boost::filesystem::path output_path(boost::filesystem::absolute(output_str)); + + const auto outilenameFunc = [&output_path](const tstring &path) -> std::wstring + { + const auto out = output_path / path; + return out.wstring(); + }; + + if (boost::filesystem::is_directory(input_path)) // input_pathtH_Ȃ炻̃fBNgȉ̉摜t@Cꊇϊ + { + if (!boost::filesystem::exists(output_path)) + { + if (!boost::filesystem::create_directory(output_path)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&output_path, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); + return; + } + } + + const auto inputDirName = input_path.filename(); + + // ϊ摜̓́Ao̓pX擾 + const auto func = [this, &input_path, &output_path, &file_paths, &inputDirName](const boost::filesystem::path &path) + { + BOOST_FOREACH(const boost::filesystem::path& p, std::make_pair(boost::filesystem::recursive_directory_iterator(path), + boost::filesystem::recursive_directory_iterator())) + { + if (!boost::filesystem::is_directory(p)) + { + tstring ext(getTString(p.extension())); +#ifdef UNICODE + std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower); +#else + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); +#endif + + if (std::find(extList.begin(), extList.end(), ext) != extList.end()) + { + const auto out_relative = relativePath(p, input_path); + const auto out_absolute = output_path / inputDirName / out_relative; + + const auto out = getTString(out_absolute.branch_path() / out_absolute.stem()) + outputExt; + + file_paths.emplace_back(getTString(p), out); + } + } + } + + return true; + }; + + if (!func(input_path)) + return; + + for (const auto &p : file_paths) + { + const boost::filesystem::path out_path(p.second); + const boost::filesystem::path out_dir(out_path.parent_path()); + + if (!boost::filesystem::exists(out_dir)) + { + if (!boost::filesystem::create_directories(out_dir)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&out_dir, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + //printf("o̓tH_u%sv̍쐬Ɏs܂\n", out_absolute.string().c_str()); + return; + } + } + } + } + else + { + const auto &outDir = output_path; + + if (!boost::filesystem::exists(outDir)) + { + if (!boost::filesystem::create_directories(outDir)) + { + SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&outDir, 0); + PostMessage(dh, WM_END_THREAD, 0, 0); + // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); + return; + } + } + + const auto out = output_path / (input_path.stem().wstring() + outputExt); + file_paths.emplace_back(input_path.wstring(), out.wstring()); + } + }; + + if (input_str_multi.size() == 0) + inputFunc(input_str); + else + { + for (const auto &path : input_str_multi) + inputFuncMulti(path); + } + + bool isFirst = true; + + const auto ProgessFunc = [this, &isFirst](const int ProgressFileMax, const int ProgressFileNow) + { + if (isFirst) + { + isFirst = true; + + SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETRANGE32, 0, ProgressFileMax); + } + + SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETPOS, ProgressFileNow, 0); + }; + + const auto cuDNNCheckStartTime = std::chrono::system_clock::now(); + + if (process == "gpu") + Waifu2x::can_use_cuDNN(); + + const auto cuDNNCheckEndTime = std::chrono::system_clock::now(); + + Waifu2x::eWaifu2xError ret; + + boost::optional ScaleRatio; + boost::optional ScaleWidth; + boost::optional ScaleHeight; + + switch (scaleType) + { + case eScaleTypeRatio: + ScaleRatio = scale_ratio; + break; + case eScaleTypeWidth: + ScaleWidth = scale_width; + break; + default: + ScaleHeight = scale_height; + break; + } + + Waifu2x w; + ret = w.init(__argc, __argv, mode, noise_level, ScaleRatio, ScaleWidth, ScaleHeight, model_dir, process, output_quality, output_depth, use_tta, crop_size, batch_size); + if (ret != Waifu2x::eWaifu2xError_OK) + SendMessage(dh, WM_ON_WAIFU2X_ERROR, (WPARAM)&ret, 0); + else + { + const auto InitEndTime = std::chrono::system_clock::now(); + + const int maxFile = file_paths.size(); + int num = 0; + + ProgessFunc(maxFile, 0); + + DWORD startTime = 0; + + int64_t processeNum = 0; + int64_t count = 0; + const auto fileNum = file_paths.size(); + for (const auto &p : file_paths) + { + ret = w.waifu2x(p.first, p.second, [this]() + { + return cancelFlag; + }); + + num++; + ProgessFunc(maxFile, num); + + count++; + + if (ret != Waifu2x::eWaifu2xError_OK) + { + SendMessage(dh, WM_ON_WAIFU2X_ERROR, (WPARAM)&ret, (LPARAM)&p); + + if (ret == Waifu2x::eWaifu2xError_Cancel) + break; + } + else if (count >= 2) + processeNum++; + + if (count == 1) // ŏ̈ڂ͓ڈȍ~xȂ͂Ȃ̂Ŏc莞Ԃ̌vZɂ͎gȂ + startTime = timeGetTime(); + if (count >= 2) + { + const auto nt = timeGetTime(); + TimeLeftGetTimeThread = nt; + + const auto ElapsedTimeMS = nt - startTime; + + const double avgProcessTime = (double)ElapsedTimeMS / (double)processeNum / 1000.0; + + const auto leftnum = fileNum - count; + + const auto TimeLeft = avgProcessTime * leftnum; + + TimeLeftThread = ceil(TimeLeft); + } + } + + const auto ProcessEndTime = std::chrono::system_clock::now(); + + cuDNNCheckTime = cuDNNCheckEndTime - cuDNNCheckStartTime; + InitTime = InitEndTime - cuDNNCheckEndTime; + ProcessTime = ProcessEndTime - InitEndTime; + usedProcess = w.used_process(); + } + + PostMessage(dh, WM_END_THREAD, 0, 0); +} + +void DialogEvent::ReplaceAddString() // t@C̎ݒ蕔 +{ + SyncMember(true, true); + + const boost::filesystem::path output_path(output_str); + tstring stem; + + if (input_str_multi.size() == 0 && !boost::filesystem::is_directory(input_str)) + stem = getTString(output_path.stem()); + else + stem = getTString(output_path.filename()); + + if (stem.length() > 0 && stem.length() >= autoSetAddName.length()) + { + const auto pos = stem.rfind(autoSetAddName); + if (pos != tstring::npos) + { + const tstring addstr(AddName()); + + auto new_name = stem; + new_name.replace(pos, autoSetAddName.length(), addstr); + + autoSetAddName = addstr; + + boost::filesystem::path new_out_path; + if (input_str_multi.size() == 0 && !boost::filesystem::is_directory(input_str)) + new_out_path = output_path.branch_path() / (new_name + outputExt); + else + new_out_path = output_path.branch_path() / (new_name); + + SetWindowText(GetDlgItem(dh, IDC_EDIT_OUTPUT), getTString(new_out_path).c_str()); + } + } +} + +void DialogEvent::AddLogMessage(const TCHAR * msg) +{ + if (logMessage.length() == 0) + logMessage += msg; + else + logMessage += tstring(TEXT("\r\n")) + msg; + + SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), logMessage.c_str()); +} + +void DialogEvent::Waifu2xTime() +{ + TCHAR msg[1024 * 2]; + TCHAR *ptr = msg; + + { + tstring p; + if (usedProcess == "cpu") + p = TEXT("CPU"); + else if (usedProcess == "gpu") + p = TEXT("CUDA"); + else // if (p == "cudnn") + p = TEXT("cuDNN"); + + ptr += _stprintf(ptr, (langStringList.GetString(L"MessageUseProcessorMode") + L"\r\n").c_str(), p.c_str()); + } + + { + uint64_t t = std::chrono::duration_cast(ProcessTime).count(); + const int msec = t % 1000; t /= 1000; + const int sec = t % 60; t /= 60; + const int min = t % 60; t /= 60; + const int hour = (int)t; + ptr += _stprintf(ptr, (langStringList.GetString(L"MessageProcessTime") + L"\r\n").c_str(), hour, min, sec, msec); + } + + { + uint64_t t = std::chrono::duration_cast(InitTime).count(); + const int msec = t % 1000; t /= 1000; + const int sec = t % 60; t /= 60; + const int min = t % 60; t /= 60; + const int hour = (int)t; + ptr += _stprintf(ptr, (langStringList.GetString(L"MessageInitTime") + L"\r\n").c_str(), hour, min, sec, msec); + } + + if (process == "gpu" || process == "cudnn") + { + uint64_t t = std::chrono::duration_cast(cuDNNCheckTime).count(); + const int msec = t % 1000; t /= 1000; + const int sec = t % 60; t /= 60; + const int min = t % 60; t /= 60; + const int hour = (int)t; + ptr += _stprintf(ptr, langStringList.GetString(L"MessagecuDNNCheckTime").c_str(), hour, min, sec, msec); + } + + AddLogMessage(msg); +} + +void DialogEvent::SaveIni(const bool isSyncMember) +{ + if (isSyncMember) + SyncMember(true); + + const boost::filesystem::path SettingFilePath(exeDir / SettingFileName); + + tstring tScaleRatio; + tstring tScaleWidth; + tstring tScaleHeight; + tstring tmode; + tstring tScaleMode; + tstring tprcess; + + if (scale_ratio > 0.0) + tScaleRatio = to_tstring(scale_ratio); + else + tScaleRatio = TEXT(""); + + if (scale_width > 0) + tScaleWidth = to_tstring(scale_width); + else + tScaleWidth = TEXT(""); + + if (scale_height > 0) + tScaleHeight = to_tstring(scale_height); + else + tScaleHeight = TEXT(""); + + if (mode == ("noise")) + tmode = TEXT("noise"); + else if (mode == ("scale")) + tmode = TEXT("scale"); + else if (mode == ("auto_scale")) + tmode = TEXT("auto_scale"); + else // noise_scale + tmode = TEXT("noise_scale"); + + if (process == "gpu") + tprcess = TEXT("gpu"); + else + tprcess = TEXT("cpu"); + + if (scaleType == eScaleTypeRatio) + tScaleMode = TEXT("Ratio"); + else if (scaleType == eScaleTypeWidth) + tScaleMode = TEXT("Width"); + else + tScaleMode = TEXT("Height"); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleMode"), tScaleMode.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastScale"), tScaleRatio.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleWidth"), tScaleWidth.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleHeight"), tScaleHeight.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputExt"), outputExt.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastInputFileExt"), inputFileExt.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastMode"), tmode.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastNoiseLevel"), to_tstring(noise_level).c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastProcess"), tprcess.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastModel"), to_tstring(modelType).c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastUseTTA"), to_tstring(use_tta ? 1 : 0).c_str(), getTString(SettingFilePath).c_str()); + + if (output_quality) + WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputQuality"), boost::lexical_cast(*output_quality).c_str(), getTString(SettingFilePath).c_str()); + else + WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputQuality"), TEXT(""), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputDepth"), boost::lexical_cast(output_depth).c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastLanguage"), LangName.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastAutoMode"), tAutoMode.c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastIsArgStartAuto"), to_tstring(isArgStartAuto ? 1 : 0).c_str(), getTString(SettingFilePath).c_str()); + WritePrivateProfileString(TEXT("Setting"), TEXT("LastIsArgStartSuccessFinish"), to_tstring(isArgStartSuccessFinish ? 1 : 0).c_str(), getTString(SettingFilePath).c_str()); + WritePrivateProfileString(TEXT("Setting"), TEXT("LastIsOutputNoOverwrite"), to_tstring(isOutputNoOverwrite ? 1 : 0).c_str(), getTString(SettingFilePath).c_str()); + + WritePrivateProfileString(TEXT("Setting"), TEXT("LastInputDirFix"), tInputDirFix.c_str(), getTString(SettingFilePath).c_str()); + WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputDirFix"), tOutputDirFix.c_str(), getTString(SettingFilePath).c_str()); +} + +// ̓pXI +UINT_PTR DialogEvent::OFNHookProcIn(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_INITDIALOG: + { + // _CAO𒆉ɕ\ + + HWND hParent = GetParent(hdlg); + + HWND hwndScreen; + RECT rectScreen = {0}; + hwndScreen = GetDesktopWindow(); + GetWindowRect(hwndScreen, &rectScreen); + + RECT rDialog = {0}; + GetWindowRect(hParent, &rDialog); + const int Width = rDialog.right - rDialog.left + 1; + const int Height = rDialog.bottom - rDialog.top + 1; + + int DialogPosX; + int DialogPosY; + DialogPosX = ((rectScreen.right - rectScreen.left + 1) / 2 - Width / 2); + DialogPosY = ((rectScreen.bottom - rectScreen.top + 1) / 2 - Height / 2); + SetWindowPos(hParent, NULL, DialogPosX, DialogPosY, Width, Height, SWP_NOSIZE | SWP_NOZORDER); + } + break; + + case WM_NOTIFY: + { + // t@CƃtH_Ił悤ɂ + + NMHDR *pnmh; + OFNOTIFY *pnot; + + pnot = (OFNOTIFY *)lParam; + pnmh = &pnot->hdr; + switch (pnmh->code) + { + case CDN_SELCHANGE: + { + TCHAR szPath[AR_PATH_MAX] = TEXT(""); + HWND hParent = GetParent(hdlg); + if (CommDlg_OpenSave_GetFilePath(hParent, szPath, _countof(szPath)) > 0) + { + szPath[_countof(szPath) - 1] = TEXT('\0'); + + boost::filesystem::path p(szPath); + const auto filename = getTString(p.filename()); + + CommDlg_OpenSave_SetControlText(hParent, edt1, filename.c_str()); + } + } + break; + } + } + break; + } + + return 0L; +} + +// o̓pXI +UINT_PTR DialogEvent::OFNHookProcOut(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uiMsg) + { + case WM_INITDIALOG: + { + // _CAO𒆉ɕ\ + + HWND hParent = GetParent(hdlg); + + HWND hwndScreen; + RECT rectScreen = {0}; + hwndScreen = GetDesktopWindow(); + GetWindowRect(hwndScreen, &rectScreen); + + RECT rDialog = {0}; + GetWindowRect(hParent, &rDialog); + const int Width = rDialog.right - rDialog.left + 1; + const int Height = rDialog.bottom - rDialog.top + 1; + + int DialogPosX; + int DialogPosY; + DialogPosX = ((rectScreen.right - rectScreen.left + 1) / 2 - Width / 2); + DialogPosY = ((rectScreen.bottom - rectScreen.top + 1) / 2 - Height / 2); + SetWindowPos(hParent, NULL, DialogPosX, DialogPosY, Width, Height, SWP_NOSIZE | SWP_NOZORDER); + } + break; + + case WM_NOTIFY: + { + // tH_݂̂Ił悤ɂ + + NMHDR *pnmh; + OFNOTIFY *pnot; + + pnot = (OFNOTIFY *)lParam; + pnmh = &pnot->hdr; + switch (pnmh->code) + { + case CDN_SELCHANGE: + { + TCHAR szPath[AR_PATH_MAX] = TEXT(""); + HWND hParent = GetParent(hdlg); + if (CommDlg_OpenSave_GetFilePath(hParent, szPath, _countof(szPath)) > 0) + { + szPath[_countof(szPath) - 1] = TEXT('\0'); + + boost::filesystem::path p(szPath); + if (boost::filesystem::is_empty(szPath) || boost::filesystem::is_directory(szPath)) + { + const auto filename = getTString(p.filename()); + + CommDlg_OpenSave_SetControlText(hParent, edt1, filename.c_str()); + } + else + CommDlg_OpenSave_SetControlText(hParent, edt1, TEXT("")); + } + } + break; + } + } + break; + } + + return 0L; +} + +DialogEvent::DialogEvent() : dh(nullptr), mode("noise_scale"), noise_level(1), scale_ratio(2.0), scale_width(0), scale_height(0), model_dir(TEXT("models/anime_style_art_rgb")), +process("gpu"), outputExt(TEXT(".png")), inputFileExt(TEXT("png:jpg:jpeg:tif:tiff:bmp:tga")), +use_tta(false), output_depth(8), crop_size(128), batch_size(1), isLastError(false), scaleType(eScaleTypeEnd), +TimeLeftThread(-1), TimeLeftGetTimeThread(0), isCommandLineStart(false), tAutoMode(TEXT("none")), +isArgStartAuto(true), isArgStartSuccessFinish(true), isOutputNoOverwrite(false) +{} + +void DialogEvent::Exec(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + if (processThread.joinable()) + return; + + if (!SyncMember(false)) + return; + + if (input_str.length() == 0 && input_str_multi.size() == 0) + { + MessageBox(dh, langStringList.GetString(L"MessageInputPathCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return; + } + + if (output_str.length() == 0) + { + MessageBox(dh, langStringList.GetString(L"MessageOutputPathCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return; + } + + if (outputExt.length() == 0) + { + MessageBox(dh, langStringList.GetString(L"MessageOutputExtCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return; + } + + if (process == "gpu" || process == "cudnn") + { + const auto flag = Waifu2x::can_use_CUDA(); + switch (flag) + { + case Waifu2x::eWaifu2xCudaError_NotFind: + MessageBox(dh, langStringList.GetString(L"MessageCudaNotFindError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return; + case Waifu2x::eWaifu2xCudaError_OldVersion: + MessageBox(dh, langStringList.GetString(L"MessageCudaOldVersionError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return; + } + } + + SaveIni(true); // Ỉ”\lĎsɐݒۑ + + SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETPOS, 0, 0); + cancelFlag = false; + isLastError = false; + + TimeLeftThread = -1; + TimeLeftGetTimeThread = 0; + + processThread = std::thread(std::bind(&DialogEvent::ProcessWaifu2x, this)); + + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), TRUE); + EnableWindow(GetDlgItem(dh, IDC_BUTTON_EXEC), FALSE); + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CHECK_CUDNN), FALSE); + + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_LOG), TEXT("")); + logMessage.clear(); + + SetTimer(dh, nIDEventTimeLeft, 1000, NULL); +} + +void DialogEvent::WaitThreadExit(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + KillTimer(dh, nIDEventTimeLeft); + + processThread.join(); + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); + EnableWindow(GetDlgItem(dh, IDC_BUTTON_EXEC), TRUE); + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CHECK_CUDNN), TRUE); + + bool endFlag = false; + if (!isLastError) + { + if (!cancelFlag) + { + AddLogMessage(langStringList.GetString(L"MessageTransSuccess").c_str()); + + if (isCommandLineStart && isArgStartSuccessFinish) // R}hCnċNāAϊɐI(tOݒ莞̂) + endFlag = true; + } + + Waifu2xTime(); + MessageBeep(MB_ICONASTERISK); + } + else + MessageBox(dh, langStringList.GetString(L"MessageErrorHappen").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + + isCommandLineStart = false; + + if (endFlag) + SendMessage(dh, WM_CLOSE, 0, 0); +} + +void DialogEvent::Timer(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + const int64_t TimeLeft = TimeLeftThread; + const DWORD TimeLeftGetTime = TimeLeftGetTimeThread; + + if (TimeLeft == -1) + { + SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), langStringList.GetString(L"MessageTimeLeftUnkown").c_str()); + } + else + { + if (TimeLeftGetTime > 0) + { + const DWORD tnow = timeGetTime(); + + const DWORD leftprevSec = (tnow - TimeLeftGetTime) / 1000; + + int64_t TimeLeftNow = TimeLeft - (int64_t)leftprevSec; + if (TimeLeftNow < 0) + TimeLeftNow = 0; + + const int64_t sec = TimeLeftNow % 60; + const int64_t min = (TimeLeftNow / 60) % 60; + const int64_t hour = (TimeLeftNow / 60 / 60); + + TCHAR msg[1024]; + _stprintf_s(msg, TEXT("%s: %02d:%02d:%02d"), langStringList.GetString(L"MessageTimeLeft").c_str(), hour, min, sec); + msg[_countof(msg) - 1] = TEXT('\0'); + + // \ + SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), msg); + } + } +} + +void DialogEvent::OnDialogEnd(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + SaveIni(); + + if (!processThread.joinable()) + PostQuitMessage(0); + else + MessageBeep(MB_ICONEXCLAMATION); +} + +void DialogEvent::OnFaildCreateDir(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + const boost::filesystem::path *p = (const boost::filesystem::path *)wParam; + + TCHAR msg[1024 * 2]; + _stprintf(msg, langStringList.GetString(L"MessageCreateOutDirError").c_str(), getTString(*p).c_str()); + + MessageBox(dh, msg, langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + + isLastError = true; +} + +void DialogEvent::OnWaifu2xError(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + const Waifu2x::eWaifu2xError ret = *(const Waifu2x::eWaifu2xError *)wParam; + + if (ret != Waifu2x::eWaifu2xError_OK) + { + TCHAR msg[1024] = TEXT(""); + + if (lParam == 0) + { + switch (ret) + { + case Waifu2x::eWaifu2xError_Cancel: + _stprintf(msg, langStringList.GetString(L"MessageCancelError").c_str()); + break; + case Waifu2x::eWaifu2xError_InvalidParameter: + _stprintf(msg, langStringList.GetString(L"MessageInvalidParameterError").c_str()); + break; + case Waifu2x::eWaifu2xError_FailedOpenModelFile: + _stprintf(msg, langStringList.GetString(L"MessageFailedOpenModelFileError").c_str()); + break; + case Waifu2x::eWaifu2xError_FailedParseModelFile: + _stprintf(msg, langStringList.GetString(L"MessageFailedParseModelFileError").c_str()); + break; + case Waifu2x::eWaifu2xError_FailedConstructModel: + _stprintf(msg, langStringList.GetString(L"MessageFailedConstructModelError").c_str()); + break; + } + } + else + { + const auto &fp = *(const std::pair *)lParam; + + switch (ret) + { + case Waifu2x::eWaifu2xError_Cancel: + _stprintf(msg, langStringList.GetString(L"MessageCancelError").c_str()); + break; + case Waifu2x::eWaifu2xError_InvalidParameter: + _stprintf(msg, langStringList.GetString(L"MessageInvalidParameterError").c_str()); + break; + case Waifu2x::eWaifu2xError_FailedOpenInputFile: + _stprintf(msg, langStringList.GetString(L"MessageFailedOpenInputFileError").c_str(), fp.first.c_str()); + break; + case Waifu2x::eWaifu2xError_FailedOpenOutputFile: + _stprintf(msg, langStringList.GetString(L"MessageFailedOpenOutputFileError").c_str(), fp.second.c_str()); + break; + case Waifu2x::eWaifu2xError_FailedProcessCaffe: + _stprintf(msg, langStringList.GetString(L"MessageFailedProcessCaffeError").c_str()); + break; + } + } + + AddLogMessage(msg); + + if (ret != Waifu2x::eWaifu2xError_Cancel) + isLastError = true; + } +} + +void DialogEvent::SetWindowTextLang() +{ +#define SET_WINDOW_TEXT(id) SetWindowTextW(GetDlgItem(dh, id), langStringList.GetString(L#id).c_str()); + + SET_WINDOW_TEXT(IDC_STATIC_IO_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_INPUT_PATH); + SET_WINDOW_TEXT(IDC_BUTTON_INPUT_REF); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_PATH); + SET_WINDOW_TEXT(IDC_STATIC_TANS_EXT_LIST); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_EXT); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_QUALITY); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_DEPTH); + SET_WINDOW_TEXT(IDC_STATIC_QUALITY_PROCESS_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_TRANS_MODE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE_SCALE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_SCALE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_SCALE); + SET_WINDOW_TEXT(IDC_STATIC_JPEG_NOISE_LEVEL); + SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL1); + SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL2); + SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL3); + SET_WINDOW_TEXT(IDC_STATIC_SCALE_RATE); + SET_WINDOW_TEXT(IDC_RADIO_SCALE_RATIO); + SET_WINDOW_TEXT(IDC_RADIO_SCALE_WIDTH); + SET_WINDOW_TEXT(IDC_RADIO_SCALE_HEIGHT); + SET_WINDOW_TEXT(IDC_STATIC_MODEL); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_RGB); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_PHOTO); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_Y); + SET_WINDOW_TEXT(IDC_CHECK_TTA); + SET_WINDOW_TEXT(IDC_STATIC_PROCESS_SPEED_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_CROP_SIZE); + SET_WINDOW_TEXT(IDC_BUTTON_CHECK_CUDNN); + SET_WINDOW_TEXT(IDC_BUTTON_CANCEL); + SET_WINDOW_TEXT(IDC_BUTTON_EXEC); + SET_WINDOW_TEXT(IDC_STATIC_LANG_UI); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_NONE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_ONE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_MULTI); + SET_WINDOW_TEXT(IDC_BUTTON_OUTPUT_REF); + SET_WINDOW_TEXT(IDC_BUTTON_APP_SETTING); + SET_WINDOW_TEXT(IDC_BUTTON_CLEAR_OUTPUT_DIR); + +#undef SET_WINDOW_TEXT +} + +void DialogEvent::SetDepthAndQuality(const bool SetDefaultQuality) +{ + HWND hout = GetDlgItem(dh, IDC_COMBO_OUT_EXT); + HWND houtDepth = GetDlgItem(dh, IDC_COMBO_OUTPUT_DEPTH); + + const int cur = SendMessage(hout, CB_GETCURSEL, 0, 0); + if (cur < 0) + return; + + const auto &OutputExtentionList = Waifu2x::OutputExtentionList; + if (cur >= OutputExtentionList.size()) + return; + + const auto elm = OutputExtentionList[cur]; + + int oldDepth = 0; + { + TCHAR oldDepthStr[100] = TEXT(""); + GetWindowText(houtDepth, oldDepthStr, _countof(oldDepthStr)); + + if (_tcslen(oldDepthStr) > 0) + oldDepth = boost::lexical_cast(oldDepthStr); + } + + // [x̃Xg + while (SendMessage(houtDepth, CB_GETCOUNT, 0, 0) != 0) + SendMessage(houtDepth, CB_DELETESTRING, 0, 0); + + // [x̃Xglj + size_t defaultIndex = 0; + for (size_t i = 0; i < elm.depthList.size(); i++) + { + const auto depth = elm.depthList[i]; + + const auto str = boost::lexical_cast(depth); + const auto index = SendMessage(houtDepth, CB_ADDSTRING, 0, (LPARAM)str.c_str()); + + if (depth == oldDepth) + defaultIndex = i; + } + + SendMessage(houtDepth, CB_SETCURSEL, defaultIndex, 0); + + if (elm.depthList.size() == 1) + EnableWindow(houtDepth, FALSE); + else + EnableWindow(houtDepth, TRUE); + + if (!elm.imageQualityStart || !elm.imageQualityEnd || !elm.imageQualityDefault) // 掿ݒ͖ + { + EnableWindow(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), FALSE); + SetWindowTextW(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), L""); + + SetWindowTextW(GetDlgItem(dh, IDC_STATIC_OUTPUT_QUALITY), langStringList.GetString(L"IDC_STATIC_OUTPUT_QUALITY").c_str()); + + output_quality.reset(); + } + else + { + HWND hedit = GetDlgItem(dh, IDC_EDIT_OUT_QUALITY); + + EnableWindow(hedit, TRUE); + if (SetDefaultQuality) + SetWindowText(hedit, boost::lexical_cast(*elm.imageQualityDefault).c_str()); + + const auto wstr = langStringList.GetString(L"IDC_STATIC_OUTPUT_QUALITY"); + + const auto addstr = std::wstring(L" (") + boost::lexical_cast(*elm.imageQualityStart) + + L"`" + boost::lexical_cast(*elm.imageQualityEnd) + L")"; + SetWindowTextW(GetDlgItem(dh, IDC_STATIC_OUTPUT_QUALITY), (wstr + addstr).c_str()); + } +} + +void DialogEvent::Create(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + dh = hWnd; + + { + TCHAR texepath[1024 * 3] = TEXT(""); + GetModuleFileName(NULL, texepath, _countof(texepath)); + texepath[_countof(texepath) - 1] = TEXT('\0'); + + const boost::filesystem::path exePath(texepath); + exeDir = exePath.branch_path(); + } + + const boost::filesystem::path SettingFilePath(exeDir / SettingFileName); + + { + const boost::filesystem::path LangDirPath(exeDir / LangDir); + const boost::filesystem::path LangListPath(exeDir / LangListFileName); + langStringList.SetLangBaseDir(getTString(LangDirPath)); + langStringList.ReadLangList(getTString(LangListPath)); + } + + std::wstring langName; + { + TCHAR tmp[1000]; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastLanguage"), TEXT(""), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + langName = tmp; + } + + { + HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); + + const auto &list = langStringList.GetLangList(); + for (const auto &lang : list) + { + const int index = SendMessageW(hlang, CB_ADDSTRING, 0, (LPARAM)lang.LangName.c_str()); + } + + size_t defaultListIndex = 0; + const auto &DefaultLang = langStringList.GetLang(); + for (size_t i = 0; i < list.size(); i++) + { + const auto &lang = list[i]; + if (lang.LangName == DefaultLang.LangName && lang.LangID == DefaultLang.LangID + && lang.SubLangID == DefaultLang.SubLangID && lang.FileName == DefaultLang.FileName) + { + defaultListIndex = i; + LangName = list[i].LangName; + break; + } + } + + if (langName.length() > 0) // OŇꂪ炻D + { + for (size_t i = 0; i < list.size(); i++) + { + const auto &lang = list[i]; + if (lang.LangName == langName) + { + defaultListIndex = i; + langStringList.SetLang(list[i]); + + LangName = langName; + break; + } + } + } + + SendMessage(hlang, CB_SETCURSEL, defaultListIndex, 0); + } + + SetWindowTextLang(); + + { + HWND houtext = GetDlgItem(dh, IDC_COMBO_OUT_EXT); + + const auto &OutputExtentionList = Waifu2x::OutputExtentionList; + for (const auto &elm : OutputExtentionList) + { + SendMessageW(houtext, CB_ADDSTRING, 0, (LPARAM)elm.ext.c_str()); + } + + SendMessage(houtext, CB_SETCURSEL, 0, 0); + } + + const boost::filesystem::path CropSizeListPath(exeDir / CropSizeListName); + std::ifstream ifs(CropSizeListPath.wstring()); + if (ifs) + { + std::string str; + while (getline(ifs, str)) + { + char *ptr = nullptr; + const long n = strtol(str.c_str(), &ptr, 10); + if (ptr && *ptr == '\0') + CropSizeList.push_back(n); + } + } + + { + HWND hcrop = GetDlgItem(dh, IDC_COMBO_CROP_SIZE); + + SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)TEXT("-----------------------")); + + // CropSizeList̒lljĂ + int mindiff = INT_MAX; + int defaultListIndex = -1; + for (const auto n : CropSizeList) + { + tstring str(to_tstring(n)); + const int index = SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); + + const int diff = abs(DefaultCommonDivisor - n); + if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) + { + mindiff = diff; + defaultListIndex = index; + } + } + + if (GetWindowTextLength(hcrop) == 0) + SendMessage(hcrop, CB_SETCURSEL, defaultListIndex, 0); + } + + tstring tScaleRatio; + tstring tScaleWidth; + tstring tScaleHeight; + + tstring tScaleMode; + tstring tmode; + tstring tprcess; + { + TCHAR tmp[1000]; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastScale"), TEXT("2.00"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tScaleRatio = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleWidth"), TEXT("0"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tScaleWidth = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleHeight"), TEXT("0"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tScaleHeight = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleMode"), TEXT("Ratio"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tScaleMode = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastOutputExt"), TEXT("png"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + outputExt = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastInputFileExt"), TEXT("png:jpg:jpeg:tif:tiff:bmp:tga"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + inputFileExt = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastMode"), TEXT("noise_scale"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tmode = tmp; + + noise_level = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastNoiseLevel"), 1, getTString(SettingFilePath).c_str()); + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastProcess"), TEXT("gpu"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tprcess = tmp; + + modelType = (eModelType)GetPrivateProfileInt(TEXT("Setting"), TEXT("LastModel"), 0, getTString(SettingFilePath).c_str()); + + use_tta = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastUseTTA"), 0, getTString(SettingFilePath).c_str()) != 0; + + output_quality.reset(); + const int num = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastOutputQuality"), -100, getTString(SettingFilePath).c_str()); + if (num != -100) + output_quality = num; + + output_depth = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastOutputDepth"), output_depth, getTString(SettingFilePath).c_str()); + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastAutoMode"), TEXT("none"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tAutoMode = tmp; + + isArgStartAuto = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastIsArgStartAuto"), 1, getTString(SettingFilePath).c_str()) != 0; + isArgStartSuccessFinish = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastIsArgStartSuccessFinish"), 1, getTString(SettingFilePath).c_str()) != 0; + isOutputNoOverwrite = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastIsOutputNoOverwrite"), 0, getTString(SettingFilePath).c_str()) != 0; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastInputDirFix"), TEXT(""), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tInputDirFix = tmp; + + GetPrivateProfileString(TEXT("Setting"), TEXT("LastOutputDirFix"), TEXT(""), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); + tmp[_countof(tmp) - 1] = TEXT('\0'); + tOutputDirFix = tmp; + } + + TCHAR *ptr = nullptr; + const double tempScale = _tcstod(tScaleRatio.c_str(), &ptr); + if (!ptr || *ptr != TEXT('\0') || tempScale <= 0.0) + tScaleRatio = TEXT("2.00"); + + const long tempScaleWidth = _tcstol(tScaleWidth.c_str(), &ptr, 10); + if (!ptr || *ptr != TEXT('\0') || tempScaleWidth <= 0) + tScaleWidth = TEXT(""); + + const long tempScaleHeight = _tcstol(tScaleHeight.c_str(), &ptr, 10); + if (!ptr || *ptr != TEXT('\0') || tempScaleHeight <= 0) + tScaleHeight = TEXT(""); + + if (outputExt.length() > 0 && outputExt[0] != TEXT('.')) + outputExt = L"." + outputExt; + + if (!(1 <= noise_level && noise_level <= 3)) + noise_level = 1; + + if (tprcess == TEXT("gpu")) + process = "gpu"; + else + process = "cpu"; + + if (!((eModelType)0 <= modelType && modelType < eModelTypeEnd)) + modelType = eModelTypeRGB; + + if (tmode == TEXT("noise")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + } + else if (tmode == TEXT("scale")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + } + else if (tmode == TEXT("auto_scale")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_CHECKED, 0); + } + else // noise_scale + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); + } + + if (tScaleMode == TEXT("Ratio")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_UNCHECKED, 0); + + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), TRUE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); + } + else if (tScaleMode == TEXT("Width")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_UNCHECKED, 0); + + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), TRUE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); + } + else + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_CHECKED, 0); + + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), TRUE); + } + + if (noise_level == 1) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_UNCHECKED, 0); + } + else if (noise_level == 2) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_UNCHECKED, 0); + } + else + { + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_CHECKED, 0); + } + + if (modelType == eModelTypeRGB) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_UNCHECKED, 0); + } + else if (modelType == eModelTypePhoto) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_UNCHECKED, 0); + } + else + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_CHECKED, 0); + } + + if (use_tta) + SendMessage(GetDlgItem(hWnd, IDC_CHECK_TTA), BM_SETCHECK, BST_CHECKED, 0); + else + SendMessage(GetDlgItem(hWnd, IDC_CHECK_TTA), BM_SETCHECK, BST_UNCHECKED, 0); + + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_RATIO), tScaleRatio.c_str()); + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_WIDTH), tScaleWidth.c_str()); + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_HEIGHT), tScaleHeight.c_str()); + + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_INPUT_EXT_LIST), inputFileExt.c_str()); + + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); + + // O̊gqݒ֘A𕜌 + HWND houtext = GetDlgItem(dh, IDC_COMBO_OUT_EXT); + + size_t defaultIndex = 0; + const auto &OutputExtentionList = Waifu2x::OutputExtentionList; + for (size_t i = 0; i < OutputExtentionList.size(); i++) + { + const auto &elm = OutputExtentionList[i]; + if (elm.ext == outputExt) + { + defaultIndex = i; + break; + } + } + + SendMessage(houtext, CB_SETCURSEL, defaultIndex, 0); + + if (output_quality) + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_OUT_QUALITY), boost::lexical_cast(*output_quality).c_str()); + + SetWindowText(GetDlgItem(hWnd, IDC_COMBO_OUTPUT_DEPTH), boost::lexical_cast(output_depth).c_str()); + + SetDepthAndQuality(false); + + if (isArgStartAuto) // w肳ꂽ玩Ŏs(tOݒ莞̂) + { + int nArgs = 0; + LPTSTR *lplpszArgs; + lplpszArgs = CommandLineToArgvW(GetCommandLine(), &nArgs); + if (lplpszArgs) + { + input_str_multi.clear(); + + if (nArgs > 1) + { + if (nArgs == 2) + { + OnSetInputFilePath(lplpszArgs[1]); + } + else if (nArgs > 2) + { + for (int i = 1; i < nArgs; i++) + input_str_multi.push_back(lplpszArgs[i]); + + OnSetInputFilePath(); + } + + isCommandLineStart = true; + + ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); + } + + LocalFree(lplpszArgs); + } + } +} + +void DialogEvent::Cancel(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + cancelFlag = true; + EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); +} + +void DialogEvent::UpdateAddString(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + ReplaceAddString(); +} + +void DialogEvent::ScaleRadio(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_RATIO), BM_GETCHECK, 0, 0)) + { + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), TRUE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); + } + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_WIDTH), BM_GETCHECK, 0, 0)) + { + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), TRUE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); + } + else + { + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); + EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), TRUE); + } + + ReplaceAddString(); +} + +void DialogEvent::CheckCUDNN(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + const auto flag = Waifu2x::can_use_CUDA(); + switch (flag) + { + case Waifu2x::eWaifu2xCudaError_NotFind: + MessageBox(dh, langStringList.GetString(L"MessageCudaNotFindError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + return; + case Waifu2x::eWaifu2xCudaError_OldVersion: + MessageBox(dh, langStringList.GetString(L"MessageCudaOldVersionError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + return; + } + + switch (Waifu2x::can_use_cuDNN()) + { + case Waifu2x::eWaifu2xcuDNNError_OK: + MessageBox(dh, langStringList.GetString(L"MessagecuDNNOK").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONINFORMATION); + break; + case Waifu2x::eWaifu2xcuDNNError_NotFind: + { + TCHAR msg[1024 * 2]; + _stprintf(msg, langStringList.GetString(L"MessagecuDNNNotFindError").c_str(), TEXT(CUDNN_DLL_NAME)); + MessageBox(dh, msg, langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + break; + } + case Waifu2x::eWaifu2xcuDNNError_OldVersion: + { + TCHAR msg[1024 * 2]; + _stprintf(msg, langStringList.GetString(L"MessagecuDNNOldVersionError").c_str(), TEXT(CUDNN_DLL_NAME), TEXT(CUDNN_REQUIRE_VERION_TEXT)); + MessageBox(dh, msg, langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + break; + } + case Waifu2x::eWaifu2xcuDNNError_CannotCreate: + MessageBox(dh, langStringList.GetString(L"MessagecuDNNCannotCreateError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + break; + default: + MessageBox(dh, langStringList.GetString(L"MessagecuDNNDefautlError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); + } +} + +LRESULT DialogEvent::OnSetInputFilePath(const TCHAR * tPath) +{ + HWND hWnd = GetDlgItem(dh, IDC_EDIT_INPUT); + + boost::filesystem::path path(tPath); + + if (!boost::filesystem::exists(path)) + { + MessageBox(dh, langStringList.GetString(L"MessageInputCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); + return 0L; + } + + input_str_multi.clear(); + + SyncMember(true, true); + + boost::filesystem::path outpath(output_dir); + + if (boost::filesystem::is_directory(path)) + { + HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + if (output_dir.length() == 0) // o̓pXݒȂ̓t@C̃tH_ + outpath = path.branch_path(); + + const tstring addstr(AddName()); + autoSetAddName = AddName(); + + const auto str = getTString(outpath / (path.stem().wstring() + addstr)); + SetWindowText(ho, str.c_str()); + + SetWindowText(hWnd, tPath); + } + else + { + HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + if (output_dir.length() == 0) // o̓pXݒȂ̓tH_ƓtH_ + outpath = path.branch_path(); + + tstring outputFileName = getTString(path.filename()); + + const auto tailDot = outputFileName.find_last_of(TEXT('.')); + if (tailDot != outputFileName.npos) + outputFileName.erase(tailDot, outputFileName.length()); + + const tstring addstr(AddName()); + autoSetAddName = addstr; + + outpath = outpath / (outputFileName + addstr + outputExt); + + outputFileName = getTString(outpath); + + SetWindowText(ho, outputFileName.c_str()); + + SetWindowText(hWnd, tPath); + } + + SetCropSizeList(path); + + return 0L; +} + +LRESULT DialogEvent::OnSetInputFilePath() +{ + HWND hWnd = GetDlgItem(dh, IDC_EDIT_INPUT); + + SyncMember(true, true); + + if (input_str_multi.size() > 0) + { + SetWindowText(hWnd, MultiFileStr); + + HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + const tstring addstr(AddName()); + autoSetAddName = AddName(); + + boost::filesystem::path outpath(output_dir); + + if (output_dir.length() == 0) // o̓pXݒȂ̓t@CƓtH_ + { + outpath = input_str_multi[0]; + outpath = outpath.branch_path(); + } + + boost::filesystem::path baseDir(input_str_multi[0]); + + tstring filename; + if (boost::filesystem::is_directory(baseDir)) + filename = baseDir.filename().wstring(); + else + filename = baseDir.stem().wstring(); + + const auto str = getTString(outpath / (filename + TEXT(" multi") + addstr)); + SetWindowText(ho, str.c_str()); + } + + SetCropSizeList(TEXT("")); + + return 0L; +} + +LRESULT DialogEvent::OnSetOutputFilePath(const TCHAR * tPath) +{ + HWND hWnd = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + SyncMember(true, true); + + if (input_str.length() > 0 || input_str_multi.size() > 0) + { + boost::filesystem::path path(input_str); + boost::filesystem::path outpath(tPath); + + if (input_str_multi.size() > 0) + { + path = input_str_multi[0]; + } + + if (boost::filesystem::is_directory(path)) + { + HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + const tstring addstr(AddName()); + autoSetAddName = AddName(); + + output_str = getTString(outpath / (path.stem().wstring() + addstr)); + SetWindowText(ho, output_str.c_str()); + } + else + { + HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); + + tstring outputFileName = getTString(path.filename()); + + const auto tailDot = outputFileName.find_last_of(TEXT('.')); + if (tailDot != outputFileName.npos) + outputFileName.erase(tailDot, outputFileName.length()); + + const tstring addstr(AddName()); + autoSetAddName = addstr; + + outpath = outpath / (outputFileName + addstr + outputExt); + + output_str = getTString(outpath); + + SetWindowText(ho, output_str.c_str()); + } + } + else + { + SetWindowText(hWnd, tPath); + output_str = tPath; + } + + output_dir = tPath; + + return 0L; +} + +// œnhWndIDC_EDITHWND(Rg[̃Cxg) + +LRESULT DialogEvent::DropInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) +{ + TCHAR szTmp[AR_PATH_MAX]; + + // hbvꂽt@C擾 + UINT FileNum = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, szTmp, _countof(szTmp)); + if (FileNum > 0) + { + if (FileNum == 1) + { + DragQueryFile((HDROP)wParam, 0, szTmp, _countof(szTmp)); + szTmp[_countof(szTmp) - 1] = TEXT('\0'); + + OnSetInputFilePath(szTmp); + } + else if (FileNum > 1) + { + input_str.clear(); + input_str_multi.clear(); + + for (UINT i = 0; i < FileNum; i++) + { + TCHAR szTmp[AR_PATH_MAX]; + + if (DragQueryFile((HDROP)wParam, i, szTmp, _countof(szTmp)) < _countof(szTmp)) + { + szTmp[_countof(szTmp) - 1] = TEXT('\0'); + + input_str_multi.push_back(szTmp); + } + } + + OnSetInputFilePath(); + } + + if (tAutoMode == TEXT("one") || + (tAutoMode == TEXT("multi") && (input_str_multi.size() > 0 || boost::filesystem::is_directory(szTmp)))) + { + ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); + } + } + + return 0L; +} + +// œnhWndIDC_EDITHWND(Rg[̃Cxg) + +LRESULT DialogEvent::DropOutput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) +{ + TCHAR szTmp[AR_PATH_MAX]; + + // hbvꂽt@C擾 + UINT FileNum = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, szTmp, AR_PATH_MAX); + if (FileNum >= 1) + { + DragQueryFile((HDROP)wParam, 0, szTmp, AR_PATH_MAX); + SetWindowText(hWnd, szTmp); + } + + return 0L; +} + +LRESULT DialogEvent::TextInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) +{ + const auto ret = CallWindowProc(OrgSubWnd, hWnd, WM_CHAR, wParam, lParam); + ReplaceAddString(); + return ret; +} + +void DialogEvent::InputRef(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + SyncMember(false); + + OPENFILENAME ofn = {0}; + TCHAR szPath[AR_PATH_MAX] = TEXT(""); + + static std::vector szFile(AR_PATH_MAX * 100); + memset(szFile.data(), 0, szFile.size() * sizeof(TCHAR)); + + GetCurrentDirectory(_countof(szPath), szPath); + szPath[_countof(szPath) - 1] = TEXT('\0'); + + tstring extStr; + for (const auto &ext : extList) + { + if (extStr.length() != 0) + extStr += TEXT(";*") + ext; + else + extStr = TEXT("*") + ext; + } + + TCHAR szFilter[AR_PATH_MAX] = TEXT(""); + TCHAR *tfp = szFilter; + + if (extStr.length() > 0) + { + tfp += _stprintf(tfp, langStringList.GetString(L"MessageExtStr").c_str(), extStr.c_str()); + tfp++; + + memcpy(tfp, extStr.c_str(), extStr.length() * sizeof(TCHAR)); + tfp += extStr.length(); + + *tfp = TEXT('\0'); + tfp++; + } + + const tstring allFilesTitle(langStringList.GetString(L"MessageAllFileFolder").c_str()); + memcpy(tfp, allFilesTitle.c_str(), allFilesTitle.length() * sizeof(TCHAR)); + tfp += allFilesTitle.length(); + *tfp = TEXT('\0'); + tfp++; + + const tstring allFilesExt(TEXT("*.*")); + memcpy(tfp, allFilesExt.c_str(), allFilesExt.length() * sizeof(TCHAR)); + tfp += allFilesExt.length(); + + *tfp = TEXT('\0'); + tfp++; + *tfp = TEXT('\0'); + tfp++; + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = dh; + ofn.lpstrFile = szFile.data(); + ofn.nMaxFile = szFile.size(); + ofn.lpstrFilter = szFilter; + ofn.nFilterIndex = 1; + ofn.lpstrTitle = langStringList.GetString(L"MessageTitleInputDialog").c_str(); + ofn.lpstrInitialDir = szPath; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.nFileOffset = 0; + ofn.nFileExtension = 0; + ofn.lpstrDefExt = NULL; + ofn.lCustData = 0; + ofn.lpfnHook = OFNHookProcIn; + ofn.lpTemplateName = 0; + //ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; + ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_READONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; + if (GetOpenFileName(&ofn)) + { + szFile[szFile.size() - 1] = TEXT('\0'); + + const TCHAR * ptr = szFile.data(); + + const auto firstLen = _tcslen(ptr); + if (firstLen > 0) + { + input_str.clear(); + input_str_multi.clear(); + + if (firstLen + 2 >= szFile.size() || ptr[firstLen + 1] == '\0') + OnSetInputFilePath(ptr); + else + { + const TCHAR * end = ptr + szFile.size(); + + const tstring baseDir(ptr); + ptr += firstLen + 1; + + while (ptr < end) + { + if (*ptr == TEXT('\0')) + break; + + TCHAR szTmp[AR_PATH_MAX]; + + const auto len = _tcslen(ptr); + memcpy(szTmp, ptr, len * sizeof(TCHAR)); + szTmp[len] = TEXT('\0'); + + const auto str = baseDir + TEXT('\\') + szTmp; + + input_str_multi.push_back(str); + + ptr += len + 1; + } + + OnSetInputFilePath(); + } + + if (tAutoMode == TEXT("one") || + (tAutoMode == TEXT("multi") && (input_str_multi.size() > 0 || boost::filesystem::is_directory(szFile.data())))) + { + ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); + } + } + } +} + +void DialogEvent::OutputRef(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + SyncMember(false); + + OPENFILENAME ofn = {0}; + TCHAR szPath[AR_PATH_MAX] = TEXT(""); + + static std::vector szFile(AR_PATH_MAX * 100); + memset(szFile.data(), 0, szFile.size() * sizeof(TCHAR)); + + GetCurrentDirectory(_countof(szPath), szPath); + szPath[_countof(szPath) - 1] = TEXT('\0'); + + + TCHAR szFilter[AR_PATH_MAX] = TEXT(""); + TCHAR *tfp = szFilter; + + const tstring allFilesTitle(langStringList.GetString(L"MessageAllFileFolder").c_str()); + memcpy(tfp, allFilesTitle.c_str(), allFilesTitle.length() * sizeof(TCHAR)); + tfp += allFilesTitle.length(); + *tfp = TEXT('\0'); + tfp++; + + const tstring allFilesExt(TEXT("*.*")); + memcpy(tfp, allFilesExt.c_str(), allFilesExt.length() * sizeof(TCHAR)); + tfp += allFilesExt.length(); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = dh; + ofn.lpstrFile = szFile.data(); + ofn.nMaxFile = szFile.size(); + ofn.lpstrFilter = szFilter; + ofn.nFilterIndex = 1; + ofn.lpstrTitle = langStringList.GetString(L"MessageTitleInputDialog").c_str(); + ofn.lpstrInitialDir = szPath; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.nFileOffset = 0; + ofn.nFileExtension = 0; + ofn.lpstrDefExt = NULL; + ofn.lCustData = 0; + ofn.lpfnHook = OFNHookProcOut; + ofn.lpTemplateName = 0; + ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ENABLEHOOK; + if (GetOpenFileName(&ofn)) + { + szFile[szFile.size() - 1] = TEXT('\0'); + + const TCHAR * ptr = szFile.data(); + + const auto firstLen = _tcslen(ptr); + if (firstLen > 0) + { + output_str.clear(); + + if (firstLen > 0) + { + OnSetOutputFilePath(ptr); + } + } + } +} + +void DialogEvent::LangChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + if (HIWORD(wParam) != CBN_SELCHANGE) + return; + + HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); + + const int cur = SendMessage(hlang, CB_GETCURSEL, 0, 0); + + const auto &list = langStringList.GetLangList(); + + if (list.size() <= cur) + return; + + langStringList.SetLang(list[cur]); + LangName = list[cur].LangName; + + SetWindowTextLang(); +} + +void DialogEvent::OutExtChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + if (HIWORD(wParam) != CBN_SELCHANGE) + return; + + SetDepthAndQuality(); + + ReplaceAddString(); +} + +void DialogEvent::ClearOutputDir(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + output_dir.clear(); + + SyncMember(true, true); + + if(input_str.length() > 0) + OnSetInputFilePath(input_str.c_str()); + else + OnSetInputFilePath(); +} + +void DialogEvent::AppSetting(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) +{ + class AppSettingDialogEvent + { + private: + HWND dh; + LangStringList &langStringList; + + public: + tstring tAutoMode; + std::string process; + bool isArgStartAuto; + bool isArgStartSuccessFinish; + bool isOutputNoOverwrite; + tstring tInputDirFix; + tstring tOutputDirFix; + + private: + void AppSettingDialogEvent::SetWindowTextLang() + { +#define SET_WINDOW_TEXT(id) SetWindowTextW(GetDlgItem(dh, id), langStringList.GetString(L#id).c_str()); + + SET_WINDOW_TEXT(IDC_STATIC_AUTO_START); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_NONE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_ONE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_MULTI); + + SET_WINDOW_TEXT(IDC_STATIC_PROCESSOR); + SET_WINDOW_TEXT(IDC_RADIO_MODE_GPU); + SET_WINDOW_TEXT(IDC_RADIO_MODE_CPU); + + SET_WINDOW_TEXT(IDC_STATIC_ARG_START); + SET_WINDOW_TEXT(IDC_CHECK_ARG_START_AUTO); + SET_WINDOW_TEXT(IDC_CHECK_ARG_START_SUCCESS_FINISH); + + SET_WINDOW_TEXT(IDC_STATIC_INPUT_DIR_FIX); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_DIR_FIX); + + SET_WINDOW_TEXT(IDC_CHECK_OUTPUT_NO_OVERWIRITE); + +#undef SET_WINDOW_TEXT + } + + public: + AppSettingDialogEvent(LangStringList &LangStringList) : dh(NULL), langStringList(LangStringList) + {} + + void AppSettingDialogEvent::Create(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) + { + dh = hWnd; + + SetWindowTextLang(); + + if (tAutoMode == TEXT("one")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_CHECKED, 0); + } + else if (tAutoMode == TEXT("multi")) + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_UNCHECKED, 0); + } + else + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_UNCHECKED, 0); + } + + if (process == "gpu") + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_GPU), BM_SETCHECK, BST_CHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_CPU), BM_SETCHECK, BST_UNCHECKED, 0); + } + else + { + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_GPU), BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_CPU), BM_SETCHECK, BST_CHECKED, 0); + } + + if (isArgStartAuto) + SendMessage(GetDlgItem(hWnd, IDC_CHECK_ARG_START_AUTO), BM_SETCHECK, BST_CHECKED, 0); + + if (isArgStartSuccessFinish) + SendMessage(GetDlgItem(hWnd, IDC_CHECK_ARG_START_SUCCESS_FINISH), BM_SETCHECK, BST_CHECKED, 0); + + if (isOutputNoOverwrite) + SendMessage(GetDlgItem(hWnd, IDC_CHECK_OUTPUT_NO_OVERWIRITE), BM_SETCHECK, BST_CHECKED, 0); + + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_INPUT_DIR_FIX), tInputDirFix.c_str()); + SetWindowText(GetDlgItem(hWnd, IDC_EDIT_OUTPUT_DIR_FIX), tOutputDirFix.c_str()); + } + + void Close(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) + { + sync(); + } + + void sync() + { + if (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_ONE), BM_GETCHECK, 0, 0)) + tAutoMode = TEXT("one"); + else if (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_MULTI), BM_GETCHECK, 0, 0)) + tAutoMode = TEXT("multi"); + else + tAutoMode = TEXT("none"); + + if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_CPU), BM_GETCHECK, 0, 0)) + process = "cpu"; + else + process = "gpu"; + + isArgStartAuto = SendMessage(GetDlgItem(dh, IDC_CHECK_ARG_START_AUTO), BM_GETCHECK, 0, 0) == BST_CHECKED; + isArgStartSuccessFinish = SendMessage(GetDlgItem(dh, IDC_CHECK_ARG_START_SUCCESS_FINISH), BM_GETCHECK, 0, 0) == BST_CHECKED; + isOutputNoOverwrite = SendMessage(GetDlgItem(dh, IDC_CHECK_OUTPUT_NO_OVERWIRITE), BM_GETCHECK, 0, 0) == BST_CHECKED; + + TCHAR buf[AR_PATH_MAX] = TEXT(""); + + GetWindowText(GetDlgItem(dh, IDC_EDIT_INPUT_DIR_FIX), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + tInputDirFix = buf; + + GetWindowText(GetDlgItem(dh, IDC_EDIT_OUTPUT_DIR_FIX), buf, _countof(buf)); + buf[_countof(buf) - 1] = TEXT('\0'); + tOutputDirFix = buf; + } + + void AppSettingDialogEvent::OK(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) + { + sync(); + EndDialog(dh, IDOK); + } + + void AppSettingDialogEvent::CANCEL(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) + { + sync(); + EndDialog(dh, IDCANCEL); + } + }; + + AppSettingDialogEvent cAppSettingDialogEvent(langStringList); + cAppSettingDialogEvent.tAutoMode = tAutoMode; + cAppSettingDialogEvent.process = process; + cAppSettingDialogEvent.isArgStartAuto = isArgStartAuto; + cAppSettingDialogEvent.isArgStartSuccessFinish = isArgStartSuccessFinish; + cAppSettingDialogEvent.isOutputNoOverwrite = isOutputNoOverwrite; + cAppSettingDialogEvent.tInputDirFix = tInputDirFix; + cAppSettingDialogEvent.tOutputDirFix = tOutputDirFix; + + CDialog cDialog; + + cDialog.SetCommandCallBack(SetClassFunc(AppSettingDialogEvent::OK, &cAppSettingDialogEvent), NULL, IDOK); + cDialog.SetCommandCallBack(SetClassFunc(AppSettingDialogEvent::CANCEL, &cAppSettingDialogEvent), NULL, IDCANCEL); + + cDialog.SetEventCallBack(SetClassFunc(AppSettingDialogEvent::Create, &cAppSettingDialogEvent), NULL, WM_INITDIALOG); + cDialog.SetEventCallBack(SetClassFunc(AppSettingDialogEvent::Close, &cAppSettingDialogEvent), NULL, WM_CLOSE); + + const int ret = cDialog.DoModal(GetModuleHandle(NULL), IDD_DIALOG_APP_SETTING, dh); + + if (ret == IDOK) + { + tAutoMode = cAppSettingDialogEvent.tAutoMode; + process = cAppSettingDialogEvent.process; + isArgStartAuto = cAppSettingDialogEvent.isArgStartAuto; + isArgStartSuccessFinish = cAppSettingDialogEvent.isArgStartSuccessFinish; + isOutputNoOverwrite = cAppSettingDialogEvent.isOutputNoOverwrite; + tInputDirFix = cAppSettingDialogEvent.tInputDirFix; + tOutputDirFix = cAppSettingDialogEvent.tOutputDirFix; + } +} diff --git a/waifu2x-caffe-gui/MainDialog.h b/waifu2x-caffe-gui/MainDialog.h new file mode 100644 index 0000000..0c06633 --- /dev/null +++ b/waifu2x-caffe-gui/MainDialog.h @@ -0,0 +1,212 @@ +#pragma once + +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "tstring.h" +#include "LangStringList.h" + +#undef ERROR + +#define WM_FAILD_CREATE_DIR (WM_APP + 5) +#define WM_ON_WAIFU2X_ERROR (WM_APP + 6) +#define WM_END_THREAD (WM_APP + 7) + + +// _CAOp +class DialogEvent +{ +private: + HWND dh; + + boost::filesystem::path exeDir; + std::vector CropSizeList; + + tstring input_str; + std::vector input_str_multi; + tstring output_str; + std::string mode; + int noise_level; + double scale_ratio; + int scale_width; + int scale_height; + tstring model_dir; + std::string process; + tstring outputExt; + tstring inputFileExt; + + bool use_tta; + + boost::optional output_quality; + int output_depth; + + int crop_size; + int batch_size; + + std::vector extList; + + std::thread processThread; + std::atomic_bool cancelFlag; + + tstring autoSetAddName; + bool isLastError; + + tstring logMessage; + + tstring output_dir; + + std::string usedProcess; + std::chrono::system_clock::duration cuDNNCheckTime; + std::chrono::system_clock::duration InitTime; + std::chrono::system_clock::duration ProcessTime; + + enum eScaleType + { + eScaleTypeRatio, + eScaleTypeWidth, + eScaleTypeHeight, + eScaleTypeEnd, + }; + + eScaleType scaleType; + + enum eModelType + { + eModelTypeRGB, + eModelTypePhoto, + eModelTypeY, + eModelTypeEnd, + }; + + eModelType modelType; + + LangStringList langStringList; + std::wstring LangName; + + std::atomic TimeLeftThread; + std::atomic TimeLeftGetTimeThread; + + bool isCommandLineStart; + + tstring tAutoMode; + + bool isArgStartAuto; + bool isArgStartSuccessFinish; + bool isOutputNoOverwrite; + tstring tInputDirFix; + tstring tOutputDirFix; + +private: + template + static tstring to_tstring(T val) + { +#ifdef UNICODE + return std::to_wstring(val); +#else + return std::to_string(val); +#endif + } + + tstring AddName() const; + + bool SyncMember(const bool NotSyncCropSize, const bool silent = false); + + void SetCropSizeList(const boost::filesystem::path &input_path); + + static boost::filesystem::path GetFileName(const boost::filesystem::path &input_path) + { + if (boost::filesystem::is_directory(input_path)) + return input_path.stem(); + else + return input_path.filename(); + } + + void ProcessWaifu2x(); + + void ReplaceAddString(); + + void AddLogMessage(const TCHAR *msg); + + void Waifu2xTime(); + + void SaveIni(const bool isSyncMember = true); + + // ̓pXI + static UINT_PTR CALLBACK OFNHookProcIn( + _In_ HWND hdlg, + _In_ UINT uiMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam + ); + + // o̓pXI + static UINT_PTR CALLBACK OFNHookProcOut( + _In_ HWND hdlg, + _In_ UINT uiMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam + ); + +public: + DialogEvent(); + + void Exec(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void WaitThreadExit(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void Timer(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void OnDialogEnd(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void OnFaildCreateDir(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void OnWaifu2xError(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void SetWindowTextLang(); + + void SetDepthAndQuality(const bool SetDefaultQuality = true); + + void Create(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void Cancel(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void UpdateAddString(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void ScaleRadio(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void CheckCUDNN(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + LRESULT OnSetInputFilePath(const TCHAR *tPath); + + LRESULT OnSetInputFilePath(); + + LRESULT OnSetOutputFilePath(const TCHAR *tPath); + + // œnhWndIDC_EDITHWND(Rg[̃Cxg) + LRESULT DropInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData); + + // œnhWndIDC_EDITHWND(Rg[̃Cxg) + LRESULT DropOutput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData); + + LRESULT TextInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData); + + void InputRef(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void OutputRef(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void LangChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void OutExtChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void ClearOutputDir(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); + + void AppSetting(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData); +}; + diff --git a/waifu2x-caffe-gui/Resource.rc b/waifu2x-caffe-gui/Resource.rc index 323ed6d..12ebd8b 100644 Binary files a/waifu2x-caffe-gui/Resource.rc and b/waifu2x-caffe-gui/Resource.rc differ diff --git a/waifu2x-caffe-gui/Source.cpp b/waifu2x-caffe-gui/Source.cpp index fde8965..97edb63 100644 --- a/waifu2x-caffe-gui/Source.cpp +++ b/waifu2x-caffe-gui/Source.cpp @@ -1,2239 +1,12 @@ #define _CRT_SECURE_NO_WARNINGS +#include "MainDialog.h" #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "resource.h" -#include "tstring.h" -#include "LangStringList.h" -#include "../common/waifu2x.h" - #include "CDialog.h" #include "CControl.h" +#include "../common/waifu2x.h" #pragma comment(lib, "winmm.lib") -#undef ERROR - -#define WM_FAILD_CREATE_DIR (WM_APP + 5) -#define WM_ON_WAIFU2X_ERROR (WM_APP + 6) -#define WM_END_THREAD (WM_APP + 7) - -const size_t AR_PATH_MAX(1024); - -const int MinCommonDivisor = 50; -const int DefaultCommonDivisor = 128; -const std::pair DefaultCommonDivisorRange = {90, 140}; - -const TCHAR * const CropSizeListName = TEXT("crop_size_list.txt"); -const TCHAR * const SettingFileName = TEXT("setting.ini"); -const TCHAR * const LangDir = TEXT("lang"); -const TCHAR * const LangListFileName = TEXT("lang/LangList.txt"); - -const TCHAR * const MultiFileStr = TEXT("(Multi File)"); - -const UINT_PTR nIDEventTimeLeft = 1000; - - -// http://stackoverflow.com/questions/10167382/boostfilesystem-get-relative-path -boost::filesystem::path relativePath(const boost::filesystem::path &path, const boost::filesystem::path &relative_to) -{ - // create absolute paths - boost::filesystem::path p = boost::filesystem::absolute(path); - boost::filesystem::path r = boost::filesystem::absolute(relative_to); - - // if root paths are different, return absolute path - if (p.root_path() != r.root_path()) - return p; - - // initialize relative path - boost::filesystem::path result; - - // find out where the two paths diverge - boost::filesystem::path::const_iterator itr_path = p.begin(); - boost::filesystem::path::const_iterator itr_relative_to = r.begin(); - while (*itr_path == *itr_relative_to && itr_path != p.end() && itr_relative_to != r.end()) { - ++itr_path; - ++itr_relative_to; - } - - // add "../" for each remaining token in relative_to - if (itr_relative_to != r.end()) { - ++itr_relative_to; - while (itr_relative_to != r.end()) { - result /= ".."; - ++itr_relative_to; - } - } - - // add remaining path - while (itr_path != p.end()) { - result /= *itr_path; - ++itr_path; - } - - return result; -} - -std::vector CommonDivisorList(const int N) -{ - std::vector list; - - const int sq = sqrt(N); - for (int i = 1; i <= sq; i++) - { - if (N % i == 0) - list.push_back(i); - } - - const int sqs = list.size(); - for (int i = 0; i < sqs; i++) - list.push_back(N / list[i]); - - std::sort(list.begin(), list.end()); - - return list; -} - -// _CAOp -class DialogEvent -{ -private: - HWND dh; - - boost::filesystem::path exeDir; - std::vector CropSizeList; - - tstring input_str; - std::vector input_str_multi; - tstring output_str; - std::string mode; - int noise_level; - double scale_ratio; - int scale_width; - int scale_height; - tstring model_dir; - std::string process; - tstring outputExt; - tstring inputFileExt; - - bool use_tta; - - boost::optional output_quality; - int output_depth; - - int crop_size; - int batch_size; - - std::vector extList; - - std::thread processThread; - std::atomic_bool cancelFlag; - - tstring autoSetAddName; - bool isLastError; - - tstring logMessage; - - std::string usedProcess; - std::chrono::system_clock::duration cuDNNCheckTime; - std::chrono::system_clock::duration InitTime; - std::chrono::system_clock::duration ProcessTime; - - enum eScaleType - { - eScaleTypeRatio, - eScaleTypeWidth, - eScaleTypeHeight, - eScaleTypeEnd, - }; - - eScaleType scaleType; - - enum eModelType - { - eModelTypeRGB, - eModelTypePhoto, - eModelTypeY, - eModelTypeEnd, - }; - - eModelType modelType; - - LangStringList langStringList; - std::wstring LangName; - - std::atomic TimeLeftThread; - std::atomic TimeLeftGetTimeThread; - - bool isCommandLineStart; - -private: - template - static tstring to_tstring(T val) - { -#ifdef UNICODE - return std::to_wstring(val); -#else - return std::to_string(val); -#endif - } - - tstring AddName() const - { - tstring addstr; - - addstr += TEXT("("); - switch (modelType) - { - case eModelTypeRGB: - addstr += TEXT("RGB"); - break; - - case eModelTypePhoto: - addstr += TEXT("Photo"); - break; - - case eModelTypeY: - addstr += TEXT("Y"); - break; - } - addstr += TEXT(")"); - - addstr += TEXT("("); - if (mode == "noise") - addstr += TEXT("noise"); - else if (mode == "scale") - addstr += TEXT("scale"); - else if (mode == "noise_scale") - addstr += TEXT("noise_scale"); - else if (mode == "auto_scale") - addstr += TEXT("auto_scale"); - addstr += TEXT(")"); - - if (mode.find("noise") != mode.npos || mode.find("auto_scale") != mode.npos) - addstr += TEXT("(Level") + to_tstring(noise_level) + TEXT(")"); - if (use_tta) - addstr += TEXT("(tta)"); - - if (mode.find("scale") != mode.npos) - { - if (scaleType == eScaleTypeRatio) - addstr += TEXT("(x") + to_tstring(scale_ratio) + TEXT(")"); - else if (scaleType == eScaleTypeWidth) - addstr += TEXT("(width ") + to_tstring(scale_width) + TEXT(")"); - else - addstr += TEXT("(height ") + to_tstring(scale_height) + TEXT(")"); - } - - if (output_depth != 8) - addstr += TEXT("(") + boost::lexical_cast(output_depth) + TEXT("bit)"); - - return addstr; - } - - bool SyncMember(const bool NotSyncCropSize, const bool silent = false) - { - bool ret = true; - - if(input_str_multi.size() == 0) - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_INPUT), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - input_str = buf; - } - - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_OUTPUT), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - output_str = buf; - } - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_NOISE), BM_GETCHECK, 0, 0)) - mode = "noise"; - else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_SCALE), BM_GETCHECK, 0, 0)) - mode = "scale"; - else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_NOISE_SCALE), BM_GETCHECK, 0, 0)) - mode = "noise_scale"; - else - mode = "auto_scale"; - - if (SendMessage(GetDlgItem(dh, IDC_RADIONOISE_LEVEL1), BM_GETCHECK, 0, 0)) - noise_level = 1; - else if (SendMessage(GetDlgItem(dh, IDC_RADIONOISE_LEVEL2), BM_GETCHECK, 0, 0)) - noise_level = 2; - else - noise_level = 3; - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_RATIO), BM_GETCHECK, 0, 0)) - scaleType = eScaleTypeRatio; - else if(SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_WIDTH), BM_GETCHECK, 0, 0)) - scaleType = eScaleTypeWidth; - else - scaleType = eScaleTypeHeight; - - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - TCHAR *ptr = nullptr; - const double d = _tcstod(buf, &ptr); - if (!ptr || *ptr != TEXT('\0') || d <= 0.0) - { - if (scaleType == eScaleTypeRatio) - { - ret = false; - - if(!silent) - MessageBox(dh, langStringList.GetString(L"MessageScaleRateCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - } - } - else - scale_ratio = d; - } - - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - TCHAR *ptr = nullptr; - const long l = _tcstol(buf, &ptr, 10); - if (!ptr || *ptr != TEXT('\0') || l <= 0) - { - if (scaleType == eScaleTypeWidth) - { - ret = false; - - if (!silent) - MessageBox(dh, langStringList.GetString(L"MessageScaleWidthCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - } - } - else - scale_width = l; - } - - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - TCHAR *ptr = nullptr; - const long l = _tcstol(buf, &ptr, 10); - if (!ptr || *ptr != TEXT('\0') || l <= 0) - { - if (scaleType == eScaleTypeHeight) - { - ret = false; - - if (!silent) - MessageBox(dh, langStringList.GetString(L"MessageScaleHeightCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - } - } - else - scale_height = l; - } - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODEL_RGB), BM_GETCHECK, 0, 0)) - { - model_dir = TEXT("models/anime_style_art_rgb"); - modelType = eModelTypeRGB; - } - else if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODEL_Y), BM_GETCHECK, 0, 0)) - { - model_dir = TEXT("models/anime_style_art"); - modelType = eModelTypeY; - } - else - { - model_dir = TEXT("models/photo"); - modelType = eModelTypePhoto; - } - - { - const auto &OutputExtentionList = Waifu2x::OutputExtentionList; - - const int cur = SendMessage(GetDlgItem(dh, IDC_COMBO_OUT_EXT), CB_GETCURSEL, 0, 0); - if (cur < 0 || cur >= OutputExtentionList.size()) - MessageBox(dh, langStringList.GetString(L"MessageOutputExtentionCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - else - { - const auto elm = OutputExtentionList[cur]; - - outputExt = elm.ext; - - TCHAR buf[AR_PATH_MAX] = TEXT(""); - - GetWindowText(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - if (elm.imageQualityStart && elm.imageQualityEnd) - { - TCHAR *ptr = nullptr; - const auto num = _tcstol(buf, &ptr, 10); - if (!ptr || *ptr != '\0' || num < *elm.imageQualityStart || num > *elm.imageQualityEnd) - { - output_quality.reset(); - ret = false; - - MessageBox(dh, langStringList.GetString(L"MessageOutputQualityCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - } - else - output_quality = num; - } - - const int curDepth = SendMessage(GetDlgItem(dh, IDC_COMBO_OUTPUT_DEPTH), CB_GETCURSEL, 0, 0); - if (curDepth < 0 || curDepth >= elm.depthList.size()) - MessageBox(dh, langStringList.GetString(L"MessageOutputQualityCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - else - output_depth = elm.depthList[curDepth]; - } - } - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_MODE_CPU), BM_GETCHECK, 0, 0)) - process = "cpu"; - else - process = "gpu"; - - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_EDIT_INPUT_EXT_LIST), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - inputFileExt = buf; - - // input_extention_list𕶎̔zɂ - - typedef boost::char_separator char_separator; - typedef boost::tokenizer tokenizer; - - char_separator sep(TEXT(":"), TEXT(""), boost::drop_empty_tokens); - tokenizer tokens(inputFileExt, sep); - - for (auto tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) - { - tstring ext(*tok_iter); - std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); - extList.push_back(TEXT(".") + ext); - } - } - - if (!NotSyncCropSize) - { - TCHAR buf[AR_PATH_MAX] = TEXT(""); - GetWindowText(GetDlgItem(dh, IDC_COMBO_CROP_SIZE), buf, _countof(buf)); - buf[_countof(buf) - 1] = TEXT('\0'); - - TCHAR *ptr = nullptr; - crop_size = _tcstol(buf, &ptr, 10); - if (!ptr || *ptr != '\0' || crop_size <= 0) - { - crop_size = 128; - ret = false; - - MessageBox(dh, langStringList.GetString(L"MessageCropSizeCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - } - } - - use_tta = SendMessage(GetDlgItem(dh, IDC_CHECK_TTA), BM_GETCHECK, 0, 0) == BST_CHECKED; - - return ret; - } - - void SetCropSizeList(const boost::filesystem::path &input_path) - { - HWND hcrop = GetDlgItem(dh, IDC_COMBO_CROP_SIZE); - - int gcd = 1; - if (boost::filesystem::exists(input_path) && !boost::filesystem::is_directory(input_path)) - { - auto mat = Waifu2x::LoadMat(input_path.string()); - if (mat.empty()) - return; - - auto size = mat.size(); - mat.release(); - - gcd = boost::math::gcd(size.width, size.height); - } - - while (SendMessage(hcrop, CB_GETCOUNT, 0, 0) != 0) - SendMessage(hcrop, CB_DELETESTRING, 0, 0); - - // ő񐔂̖񐔂̃Xg擾 - std::vector list(CommonDivisorList(gcd)); - - // MinCommonDivisor̖񐔍폜 - list.erase(std::remove_if(list.begin(), list.end(), [](const int v) - { - return v < MinCommonDivisor; - } - ), list.end()); - - int mindiff = INT_MAX; - int defaultIndex = -1; - for (int i = 0; i < list.size(); i++) - { - const int n = list[i]; - - tstring str(to_tstring(n)); - SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); - - const int diff = abs(DefaultCommonDivisor - n); - if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) - { - mindiff = diff; - defaultIndex = i; - } - } - - SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)TEXT("-----------------------")); - - // CropSizeList̒lljĂ - mindiff = INT_MAX; - int defaultListIndex = -1; - for (const auto n : CropSizeList) - { - tstring str(to_tstring(n)); - const int index = SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); - - const int diff = abs(DefaultCommonDivisor - n); - if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) - { - mindiff = diff; - defaultListIndex = index; - } - } - - if (defaultIndex == -1) - defaultIndex = defaultListIndex; - - if (GetWindowTextLength(hcrop) == 0) - SendMessage(hcrop, CB_SETCURSEL, defaultIndex, 0); - } - - static boost::filesystem::path GetFileName(const boost::filesystem::path &input_path) - { - if (boost::filesystem::is_directory(input_path)) - return input_path.stem(); - else - return input_path.filename(); - } - - void ProcessWaifu2x() - { - std::vector> file_paths; - - const auto inputFunc = [this, &file_paths](const tstring &input) - { - const boost::filesystem::path input_path(boost::filesystem::absolute(input)); - - if (boost::filesystem::is_directory(input_path)) // input_pathtH_Ȃ炻̃fBNgȉ̉摜t@Cꊇϊ - { - boost::filesystem::path output_path(output_str); - - output_path = boost::filesystem::absolute(output_path); - - if (!boost::filesystem::exists(output_path)) - { - if (!boost::filesystem::create_directory(output_path)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&output_path, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); - return; - } - } - - // ϊ摜̓́Ao̓pX擾 - const auto func = [this, &input_path, &output_path, &file_paths](const boost::filesystem::path &path) - { - BOOST_FOREACH(const boost::filesystem::path& p, std::make_pair(boost::filesystem::recursive_directory_iterator(path), - boost::filesystem::recursive_directory_iterator())) - { - if (!boost::filesystem::is_directory(p)) - { - tstring ext(getTString(p.extension())); -#ifdef UNICODE - std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower); -#else - std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); -#endif - - if (std::find(extList.begin(), extList.end(), ext) != extList.end()) - { - const auto out_relative = relativePath(p, input_path); - const auto out_absolute = output_path / out_relative; - - const auto out = getTString(out_absolute.branch_path() / out_absolute.stem()) + outputExt; - - file_paths.emplace_back(getTString(p), out); - } - } - } - - return true; - }; - - if (!func(input_path)) - return; - - for (const auto &p : file_paths) - { - const boost::filesystem::path out_path(p.second); - const boost::filesystem::path out_dir(out_path.parent_path()); - - if (!boost::filesystem::exists(out_dir)) - { - if (!boost::filesystem::create_directories(out_dir)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&out_dir, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - //printf("o̓tH_u%sv̍쐬Ɏs܂\n", out_absolute.string().c_str()); - return; - } - } - } - } - else - { - const boost::filesystem::path output_path(output_str); - const auto outDir = output_path.branch_path(); - - if (!boost::filesystem::exists(outDir)) - { - if (!boost::filesystem::create_directories(outDir)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&outDir, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); - return; - } - } - - file_paths.emplace_back(input_str, output_str); - } - }; - - const auto inputFuncMulti = [this, &file_paths](const tstring &input) - { - const boost::filesystem::path input_path(boost::filesystem::absolute(input)); - const boost::filesystem::path output_path(boost::filesystem::absolute(output_str)); - - const auto outilenameFunc = [&output_path](const tstring &path) -> std::wstring - { - const auto out = output_path / path; - return out.wstring(); - }; - - if (boost::filesystem::is_directory(input_path)) // input_pathtH_Ȃ炻̃fBNgȉ̉摜t@Cꊇϊ - { - if (!boost::filesystem::exists(output_path)) - { - if (!boost::filesystem::create_directory(output_path)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&output_path, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); - return; - } - } - - const auto inputDirName = input_path.filename(); - - // ϊ摜̓́Ao̓pX擾 - const auto func = [this, &input_path, &output_path, &file_paths, &inputDirName](const boost::filesystem::path &path) - { - BOOST_FOREACH(const boost::filesystem::path& p, std::make_pair(boost::filesystem::recursive_directory_iterator(path), - boost::filesystem::recursive_directory_iterator())) - { - if (!boost::filesystem::is_directory(p)) - { - tstring ext(getTString(p.extension())); -#ifdef UNICODE - std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower); -#else - std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); -#endif - - if (std::find(extList.begin(), extList.end(), ext) != extList.end()) - { - const auto out_relative = relativePath(p, input_path); - const auto out_absolute = output_path / inputDirName / out_relative; - - const auto out = getTString(out_absolute.branch_path() / out_absolute.stem()) + outputExt; - - file_paths.emplace_back(getTString(p), out); - } - } - } - - return true; - }; - - if (!func(input_path)) - return; - - for (const auto &p : file_paths) - { - const boost::filesystem::path out_path(p.second); - const boost::filesystem::path out_dir(out_path.parent_path()); - - if (!boost::filesystem::exists(out_dir)) - { - if (!boost::filesystem::create_directories(out_dir)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&out_dir, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - //printf("o̓tH_u%sv̍쐬Ɏs܂\n", out_absolute.string().c_str()); - return; - } - } - } - } - else - { - const auto &outDir = output_path; - - if (!boost::filesystem::exists(outDir)) - { - if (!boost::filesystem::create_directories(outDir)) - { - SendMessage(dh, WM_FAILD_CREATE_DIR, (WPARAM)&outDir, 0); - PostMessage(dh, WM_END_THREAD, 0, 0); - // printf("o̓tH_u%sv̍쐬Ɏs܂\n", output_path.string().c_str()); - return; - } - } - - const auto out = output_path / (input_path.stem().wstring() + outputExt); - file_paths.emplace_back(input_path.wstring(), out.wstring()); - } - }; - - if(input_str_multi.size() == 0) - inputFunc(input_str); - else - { - for (const auto &path : input_str_multi) - inputFuncMulti(path); - } - - bool isFirst = true; - - const auto ProgessFunc = [this, &isFirst](const int ProgressFileMax, const int ProgressFileNow) - { - if (isFirst) - { - isFirst = true; - - SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETRANGE32, 0, ProgressFileMax); - } - - SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETPOS, ProgressFileNow, 0); - }; - - const auto cuDNNCheckStartTime = std::chrono::system_clock::now(); - - if (process == "gpu") - Waifu2x::can_use_cuDNN(); - - const auto cuDNNCheckEndTime = std::chrono::system_clock::now(); - - Waifu2x::eWaifu2xError ret; - - boost::optional ScaleRatio; - boost::optional ScaleWidth; - boost::optional ScaleHeight; - - switch (scaleType) - { - case eScaleTypeRatio: - ScaleRatio = scale_ratio; - break; - case eScaleTypeWidth: - ScaleWidth = scale_width; - break; - default: - ScaleHeight = scale_height; - break; - } - - Waifu2x w; - ret = w.init(__argc, __argv, mode, noise_level, ScaleRatio, ScaleWidth, ScaleHeight, model_dir, process, output_quality, output_depth, use_tta, crop_size, batch_size); - if(ret != Waifu2x::eWaifu2xError_OK) - SendMessage(dh, WM_ON_WAIFU2X_ERROR, (WPARAM)&ret, 0); - else - { - const auto InitEndTime = std::chrono::system_clock::now(); - - const int maxFile = file_paths.size(); - int num = 0; - - ProgessFunc(maxFile, 0); - - DWORD startTime = 0; - - int64_t processeNum = 0; - int64_t count = 0; - const auto fileNum = file_paths.size(); - for (const auto &p : file_paths) - { - ret = w.waifu2x(p.first, p.second, [this]() - { - return cancelFlag; - }); - - num++; - ProgessFunc(maxFile, num); - - count++; - - if (ret != Waifu2x::eWaifu2xError_OK) - { - SendMessage(dh, WM_ON_WAIFU2X_ERROR, (WPARAM)&ret, (LPARAM)&p); - - if (ret == Waifu2x::eWaifu2xError_Cancel) - break; - } - else if(count >= 2) - processeNum++; - - if(count == 1) // ŏ̈ڂ͓ڈȍ~xȂ͂Ȃ̂Ŏc莞Ԃ̌vZɂ͎gȂ - startTime = timeGetTime(); - if (count >= 2) - { - const auto nt = timeGetTime(); - TimeLeftGetTimeThread = nt; - - const auto ElapsedTimeMS = nt - startTime; - - const double avgProcessTime = (double)ElapsedTimeMS / (double)processeNum / 1000.0; - - const auto leftnum = fileNum - count; - - const auto TimeLeft = avgProcessTime * leftnum; - - TimeLeftThread = ceil(TimeLeft); - } - } - - const auto ProcessEndTime = std::chrono::system_clock::now(); - - cuDNNCheckTime = cuDNNCheckEndTime - cuDNNCheckStartTime; - InitTime = InitEndTime - cuDNNCheckEndTime; - ProcessTime = ProcessEndTime - InitEndTime; - usedProcess = w.used_process(); - } - - PostMessage(dh, WM_END_THREAD, 0, 0); - } - - void ReplaceAddString() // t@C̎ݒ蕔 - { - SyncMember(true, true); - - const boost::filesystem::path output_path(output_str); - tstring stem; - - if (input_str_multi.size() == 0 && !boost::filesystem::is_directory(input_str)) - stem = getTString(output_path.stem()); - else - stem = getTString(output_path.filename()); - - if (stem.length() > 0 && stem.length() >= autoSetAddName.length()) - { - const auto pos = stem.rfind(autoSetAddName); - if (pos != tstring::npos) - { - const tstring addstr(AddName()); - - auto new_name = stem; - new_name.replace(pos, autoSetAddName.length(), addstr); - - autoSetAddName = addstr; - - boost::filesystem::path new_out_path; - if (input_str_multi.size() == 0 && !boost::filesystem::is_directory(input_str)) - new_out_path = output_path.branch_path() / (new_name + outputExt); - else - new_out_path = output_path.branch_path() / (new_name); - - SetWindowText(GetDlgItem(dh, IDC_EDIT_OUTPUT), getTString(new_out_path).c_str()); - } - } - } - - void AddLogMessage(const TCHAR *msg) - { - if (logMessage.length() == 0) - logMessage += msg; - else - logMessage += tstring(TEXT("\r\n")) + msg; - - SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), logMessage.c_str()); - } - - void Waifu2xTime() - { - TCHAR msg[1024 * 2]; - TCHAR *ptr = msg; - - { - tstring p; - if (usedProcess == "cpu") - p = TEXT("CPU"); - else if (usedProcess == "gpu") - p = TEXT("CUDA"); - else // if (p == "cudnn") - p = TEXT("cuDNN"); - - ptr += _stprintf(ptr, (langStringList.GetString(L"MessageUseProcessorMode") + L"\r\n").c_str(), p.c_str()); - } - - { - uint64_t t = std::chrono::duration_cast(ProcessTime).count(); - const int msec = t % 1000; t /= 1000; - const int sec = t % 60; t /= 60; - const int min = t % 60; t /= 60; - const int hour = (int)t; - ptr += _stprintf(ptr, (langStringList.GetString(L"MessageProcessTime") + L"\r\n").c_str(), hour, min, sec, msec); - } - - { - uint64_t t = std::chrono::duration_cast(InitTime).count(); - const int msec = t % 1000; t /= 1000; - const int sec = t % 60; t /= 60; - const int min = t % 60; t /= 60; - const int hour = (int)t; - ptr += _stprintf(ptr, (langStringList.GetString(L"MessageInitTime") + L"\r\n").c_str(), hour, min, sec, msec); - } - - if (process == "gpu" || process == "cudnn") - { - uint64_t t = std::chrono::duration_cast(cuDNNCheckTime).count(); - const int msec = t % 1000; t /= 1000; - const int sec = t % 60; t /= 60; - const int min = t % 60; t /= 60; - const int hour = (int)t; - ptr += _stprintf(ptr, langStringList.GetString(L"MessagecuDNNCheckTime").c_str(), hour, min, sec, msec); - } - - AddLogMessage(msg); - } - - void SaveIni(const bool isSyncMember = true) - { - if (isSyncMember) - SyncMember(true); - - const boost::filesystem::path SettingFilePath(exeDir / SettingFileName); - - tstring tScaleRatio; - tstring tScaleWidth; - tstring tScaleHeight; - tstring tmode; - tstring tScaleMode; - tstring tprcess; - tstring tAutoMode; - - if (scale_ratio > 0.0) - tScaleRatio = to_tstring(scale_ratio); - else - tScaleRatio = TEXT(""); - - if(scale_width > 0) - tScaleWidth = to_tstring(scale_width); - else - tScaleWidth = TEXT(""); - - if(scale_height > 0) - tScaleHeight = to_tstring(scale_height); - else - tScaleHeight = TEXT(""); - - if (mode == ("noise")) - tmode = TEXT("noise"); - else if (mode == ("scale")) - tmode = TEXT("scale"); - else if (mode == ("auto_scale")) - tmode = TEXT("auto_scale"); - else // noise_scale - tmode = TEXT("noise_scale"); - - if (process == "gpu") - tprcess = TEXT("gpu"); - else - tprcess = TEXT("cpu"); - - if (scaleType == eScaleTypeRatio) - tScaleMode = TEXT("Ratio"); - else if (scaleType == eScaleTypeWidth) - tScaleMode = TEXT("Width"); - else - tScaleMode = TEXT("Height"); - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_ONE), BM_GETCHECK, 0, 0)) - tAutoMode = TEXT("one"); - else if (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_MULTI), BM_GETCHECK, 0, 0)) - tAutoMode = TEXT("multi"); - else - tAutoMode = TEXT("none"); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleMode"), tScaleMode.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastScale"), tScaleRatio.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleWidth"), tScaleWidth.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastScaleHeight"), tScaleHeight.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputExt"), outputExt.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastInputFileExt"), inputFileExt.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastMode"), tmode.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastNoiseLevel"), to_tstring(noise_level).c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastProcess"), tprcess.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastModel"), to_tstring(modelType).c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastUseTTA"), to_tstring(use_tta ? 1 : 0).c_str(), getTString(SettingFilePath).c_str()); - - if(output_quality) - WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputQuality"), boost::lexical_cast(*output_quality).c_str(), getTString(SettingFilePath).c_str()); - else - WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputQuality"), TEXT(""), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastOutputDepth"), boost::lexical_cast(output_depth).c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastLanguage"), LangName.c_str(), getTString(SettingFilePath).c_str()); - - WritePrivateProfileString(TEXT("Setting"), TEXT("LastAutoMode"), tAutoMode.c_str(), getTString(SettingFilePath).c_str()); - } - - // o̓pXI - static UINT_PTR CALLBACK OFNHookProcIn( - _In_ HWND hdlg, - _In_ UINT uiMsg, - _In_ WPARAM wParam, - _In_ LPARAM lParam - ) - { - switch (uiMsg) - { - case WM_INITDIALOG: - { - // _CAO𒆉ɕ\ - - HWND hParent = GetParent(hdlg); - - HWND hwndScreen; - RECT rectScreen = { 0 }; - hwndScreen = GetDesktopWindow(); - GetWindowRect(hwndScreen, &rectScreen); - - RECT rDialog = { 0 }; - GetWindowRect(hParent, &rDialog); - const int Width = rDialog.right - rDialog.left + 1; - const int Height = rDialog.bottom - rDialog.top + 1; - - int DialogPosX; - int DialogPosY; - DialogPosX = ((rectScreen.right - rectScreen.left + 1) / 2 - Width / 2); - DialogPosY = ((rectScreen.bottom - rectScreen.top + 1) / 2 - Height / 2); - SetWindowPos(hParent, NULL, DialogPosX, DialogPosY, Width, Height, SWP_NOSIZE | SWP_NOZORDER); - } - break; - - case WM_NOTIFY: - { - // t@CƃtH_Ił悤ɂ - - NMHDR *pnmh; - OFNOTIFY *pnot; - - pnot = (OFNOTIFY *)lParam; - pnmh = &pnot->hdr; - switch (pnmh->code) - { - case CDN_SELCHANGE: - { - TCHAR szPath[AR_PATH_MAX] = TEXT(""); - HWND hParent = GetParent(hdlg); - if (CommDlg_OpenSave_GetFilePath(hParent, szPath, _countof(szPath)) > 0) - { - szPath[_countof(szPath) - 1] = TEXT('\0'); - - boost::filesystem::path p(szPath); - const auto filename = getTString(p.filename()); - - CommDlg_OpenSave_SetControlText(hParent, edt1, filename.c_str()); - } - } - break; - } - } - break; - } - - return 0L; - } - -public: - DialogEvent() : dh(nullptr), mode("noise_scale"), noise_level(1), scale_ratio(2.0), scale_width(0), scale_height(0), model_dir(TEXT("models/anime_style_art_rgb")), - process("gpu"), outputExt(TEXT(".png")), inputFileExt(TEXT("png:jpg:jpeg:tif:tiff:bmp:tga")), - use_tta(false), output_depth(8), crop_size(128), batch_size(1), isLastError(false), scaleType(eScaleTypeEnd), - TimeLeftThread(-1), TimeLeftGetTimeThread(0), isCommandLineStart(false) - { - } - - void Exec(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - if (processThread.joinable()) - return; - - if (!SyncMember(false)) - return; - - if (input_str.length() == 0 && input_str_multi.size() == 0) - { - MessageBox(dh, langStringList.GetString(L"MessageInputPathCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return; - } - - if (output_str.length() == 0) - { - MessageBox(dh, langStringList.GetString(L"MessageOutputPathCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return; - } - - if (outputExt.length() == 0) - { - MessageBox(dh, langStringList.GetString(L"MessageOutputExtCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return; - } - - if (process == "gpu" || process == "cudnn") - { - const auto flag = Waifu2x::can_use_CUDA(); - switch (flag) - { - case Waifu2x::eWaifu2xCudaError_NotFind: - MessageBox(dh, langStringList.GetString(L"MessageCudaNotFindError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return; - case Waifu2x::eWaifu2xCudaError_OldVersion: - MessageBox(dh, langStringList.GetString(L"MessageCudaOldVersionError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return; - } - } - - SaveIni(true); // Ỉ”\lĎsɐݒۑ - - SendMessage(GetDlgItem(dh, IDC_PROGRESS), PBM_SETPOS, 0, 0); - cancelFlag = false; - isLastError = false; - - TimeLeftThread = -1; - TimeLeftGetTimeThread = 0; - - processThread = std::thread(std::bind(&DialogEvent::ProcessWaifu2x, this)); - - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), TRUE); - EnableWindow(GetDlgItem(dh, IDC_BUTTON_EXEC), FALSE); - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CHECK_CUDNN), FALSE); - - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_LOG), TEXT("")); - logMessage.clear(); - - SetTimer(dh, nIDEventTimeLeft, 1000, NULL); - } - - void WaitThreadExit(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - KillTimer(dh, nIDEventTimeLeft); - - processThread.join(); - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); - EnableWindow(GetDlgItem(dh, IDC_BUTTON_EXEC), TRUE); - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CHECK_CUDNN), TRUE); - - bool endFlag = false; - if (!isLastError) - { - if (!cancelFlag) - { - AddLogMessage(langStringList.GetString(L"MessageTransSuccess").c_str()); - - if (isCommandLineStart) // R}hCnċNāAϊɐI - endFlag = true; - } - - Waifu2xTime(); - MessageBeep(MB_ICONASTERISK); - } - else - MessageBox(dh, langStringList.GetString(L"MessageErrorHappen").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - - isCommandLineStart = false; - - if (endFlag) - SendMessage(dh, WM_CLOSE, 0, 0); - } - - void Timer(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - const int64_t TimeLeft = TimeLeftThread; - const DWORD TimeLeftGetTime = TimeLeftGetTimeThread; - - if (TimeLeft == -1) - { - SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), langStringList.GetString(L"MessageTimeLeftUnkown").c_str()); - } - else - { - if (TimeLeftGetTime > 0) - { - const DWORD tnow = timeGetTime(); - - const DWORD leftprevSec = (tnow - TimeLeftGetTime) / 1000; - - int64_t TimeLeftNow = TimeLeft - (int64_t)leftprevSec; - if (TimeLeftNow < 0) - TimeLeftNow = 0; - - const int64_t sec = TimeLeftNow % 60; - const int64_t min = (TimeLeftNow / 60) % 60; - const int64_t hour = (TimeLeftNow / 60 / 60); - - TCHAR msg[1024]; - _stprintf_s(msg, TEXT("%s: %02d:%02d:%02d"), langStringList.GetString(L"MessageTimeLeft").c_str(), hour, min, sec); - msg[_countof(msg) - 1] = TEXT('\0'); - - // \ - SetWindowText(GetDlgItem(dh, IDC_EDIT_LOG), msg); - } - } - } - - void OnDialogEnd(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - SaveIni(); - - if (!processThread.joinable()) - PostQuitMessage(0); - else - MessageBeep(MB_ICONEXCLAMATION); - } - - void OnFaildCreateDir(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - const boost::filesystem::path *p = (const boost::filesystem::path *)wParam; - - TCHAR msg[1024 * 2]; - _stprintf(msg, langStringList.GetString(L"MessageCreateOutDirError").c_str(), getTString(*p).c_str()); - - MessageBox(dh, msg, langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - - isLastError = true; - } - - void OnWaifu2xError(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - const Waifu2x::eWaifu2xError ret = *(const Waifu2x::eWaifu2xError *)wParam; - - if (ret != Waifu2x::eWaifu2xError_OK) - { - TCHAR msg[1024] = TEXT(""); - - if (lParam == 0) - { - switch (ret) - { - case Waifu2x::eWaifu2xError_Cancel: - _stprintf(msg, langStringList.GetString(L"MessageCancelError").c_str()); - break; - case Waifu2x::eWaifu2xError_InvalidParameter: - _stprintf(msg, langStringList.GetString(L"MessageInvalidParameterError").c_str()); - break; - case Waifu2x::eWaifu2xError_FailedOpenModelFile: - _stprintf(msg, langStringList.GetString(L"MessageFailedOpenModelFileError").c_str()); - break; - case Waifu2x::eWaifu2xError_FailedParseModelFile: - _stprintf(msg, langStringList.GetString(L"MessageFailedParseModelFileError").c_str()); - break; - case Waifu2x::eWaifu2xError_FailedConstructModel: - _stprintf(msg, langStringList.GetString(L"MessageFailedConstructModelError").c_str()); - break; - } - } - else - { - const auto &fp = *(const std::pair *)lParam; - - switch (ret) - { - case Waifu2x::eWaifu2xError_Cancel: - _stprintf(msg, langStringList.GetString(L"MessageCancelError").c_str()); - break; - case Waifu2x::eWaifu2xError_InvalidParameter: - _stprintf(msg, langStringList.GetString(L"MessageInvalidParameterError").c_str()); - break; - case Waifu2x::eWaifu2xError_FailedOpenInputFile: - _stprintf(msg, langStringList.GetString(L"MessageFailedOpenInputFileError").c_str(), fp.first.c_str()); - break; - case Waifu2x::eWaifu2xError_FailedOpenOutputFile: - _stprintf(msg, langStringList.GetString(L"MessageFailedOpenOutputFileError").c_str(), fp.second.c_str()); - break; - case Waifu2x::eWaifu2xError_FailedProcessCaffe: - _stprintf(msg, langStringList.GetString(L"MessageFailedProcessCaffeError").c_str()); - break; - } - } - - AddLogMessage(msg); - - if (ret != Waifu2x::eWaifu2xError_Cancel) - isLastError = true; - } - } - - void SetWindowTextLang() - { -#define SET_WINDOW_TEXT(id) SetWindowTextW(GetDlgItem(dh, id), langStringList.GetString(L#id).c_str()); - - SET_WINDOW_TEXT(IDC_STATIC_IO_SETTING); - SET_WINDOW_TEXT(IDC_STATIC_INPUT_PATH); - SET_WINDOW_TEXT(IDC_BUTTON_INPUT_REF); - SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_PATH); - SET_WINDOW_TEXT(IDC_STATIC_TANS_EXT_LIST); - SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_EXT); - SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_QUALITY); - SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_DEPTH); - SET_WINDOW_TEXT(IDC_STATIC_QUALITY_PROCESS_SETTING); - SET_WINDOW_TEXT(IDC_STATIC_TRANS_MODE); - SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE_SCALE); - SET_WINDOW_TEXT(IDC_RADIO_MODE_SCALE); - SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE); - SET_WINDOW_TEXT(IDC_RADIO_AUTO_SCALE); - SET_WINDOW_TEXT(IDC_STATIC_JPEG_NOISE_LEVEL); - SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL1); - SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL2); - SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL3); - SET_WINDOW_TEXT(IDC_STATIC_SCALE_RATE); - SET_WINDOW_TEXT(IDC_RADIO_SCALE_RATIO); - SET_WINDOW_TEXT(IDC_RADIO_SCALE_WIDTH); - SET_WINDOW_TEXT(IDC_RADIO_SCALE_HEIGHT); - SET_WINDOW_TEXT(IDC_STATIC_MODEL); - SET_WINDOW_TEXT(IDC_RADIO_MODEL_RGB); - SET_WINDOW_TEXT(IDC_RADIO_MODEL_PHOTO); - SET_WINDOW_TEXT(IDC_RADIO_MODEL_Y); - SET_WINDOW_TEXT(IDC_CHECK_TTA); - SET_WINDOW_TEXT(IDC_STATIC_PROCESS_SPEED_SETTING); - SET_WINDOW_TEXT(IDC_STATIC_PROCESSOR); - SET_WINDOW_TEXT(IDC_RADIO_MODE_GPU); - SET_WINDOW_TEXT(IDC_RADIO_MODE_CPU); - SET_WINDOW_TEXT(IDC_STATIC_CROP_SIZE); - SET_WINDOW_TEXT(IDC_BUTTON_CHECK_CUDNN); - SET_WINDOW_TEXT(IDC_BUTTON_CANCEL); - SET_WINDOW_TEXT(IDC_BUTTON_EXEC); - SET_WINDOW_TEXT(IDC_STATIC_LANG_UI); - SET_WINDOW_TEXT(IDC_STATIC_AUTO_START); - SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_NONE); - SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_ONE); - SET_WINDOW_TEXT(IDC_RADIO_AUTO_START_MULTI); - -#undef SET_WINDOW_TEXT - } - - void SetDepthAndQuality(const bool SetDefaultQuality = true) - { - HWND hout = GetDlgItem(dh, IDC_COMBO_OUT_EXT); - HWND houtDepth = GetDlgItem(dh, IDC_COMBO_OUTPUT_DEPTH); - - const int cur = SendMessage(hout, CB_GETCURSEL, 0, 0); - if (cur < 0) - return; - - const auto &OutputExtentionList = Waifu2x::OutputExtentionList; - if (cur >= OutputExtentionList.size()) - return; - - const auto elm = OutputExtentionList[cur]; - - int oldDepth = 0; - { - TCHAR oldDepthStr[100] = TEXT(""); - GetWindowText(houtDepth, oldDepthStr, _countof(oldDepthStr)); - - if (_tcslen(oldDepthStr) > 0) - oldDepth = boost::lexical_cast(oldDepthStr); - } - - // [x̃Xg - while (SendMessage(houtDepth, CB_GETCOUNT, 0, 0) != 0) - SendMessage(houtDepth, CB_DELETESTRING, 0, 0); - - // [x̃Xglj - size_t defaultIndex = 0; - for (size_t i = 0; i < elm.depthList.size(); i++) - { - const auto depth = elm.depthList[i]; - - const auto str = boost::lexical_cast(depth); - const auto index = SendMessage(houtDepth, CB_ADDSTRING, 0, (LPARAM)str.c_str()); - - if (depth == oldDepth) - defaultIndex = i; - } - - SendMessage(houtDepth, CB_SETCURSEL, defaultIndex, 0); - - if (elm.depthList.size() == 1) - EnableWindow(houtDepth, FALSE); - else - EnableWindow(houtDepth, TRUE); - - if (!elm.imageQualityStart || !elm.imageQualityEnd || !elm.imageQualityDefault) // 掿ݒ͖ - { - EnableWindow(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), FALSE); - SetWindowTextW(GetDlgItem(dh, IDC_EDIT_OUT_QUALITY), L""); - - SetWindowTextW(GetDlgItem(dh, IDC_STATIC_OUTPUT_QUALITY), langStringList.GetString(L"IDC_STATIC_OUTPUT_QUALITY").c_str()); - - output_quality.reset(); - } - else - { - HWND hedit = GetDlgItem(dh, IDC_EDIT_OUT_QUALITY); - - EnableWindow(hedit, TRUE); - if(SetDefaultQuality) - SetWindowText(hedit, boost::lexical_cast(*elm.imageQualityDefault).c_str()); - - const auto wstr = langStringList.GetString(L"IDC_STATIC_OUTPUT_QUALITY"); - - const auto addstr = std::wstring(L" (") + boost::lexical_cast(*elm.imageQualityStart) - + L"`" + boost::lexical_cast(*elm.imageQualityEnd) + L")"; - SetWindowTextW(GetDlgItem(dh, IDC_STATIC_OUTPUT_QUALITY), (wstr + addstr).c_str()); - } - } - - void Create(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - dh = hWnd; - - { - TCHAR texepath[1024 * 3] = TEXT(""); - GetModuleFileName(NULL, texepath, _countof(texepath)); - texepath[_countof(texepath) - 1] = TEXT('\0'); - - const boost::filesystem::path exePath(texepath); - exeDir = exePath.branch_path(); - } - - const boost::filesystem::path SettingFilePath(exeDir / SettingFileName); - - { - const boost::filesystem::path LangDirPath(exeDir / LangDir); - const boost::filesystem::path LangListPath(exeDir / LangListFileName); - langStringList.SetLangBaseDir(getTString(LangDirPath)); - langStringList.ReadLangList(getTString(LangListPath)); - } - - std::wstring langName; - { - TCHAR tmp[1000]; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastLanguage"), TEXT(""), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - langName = tmp; - } - - { - HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); - - const auto &list = langStringList.GetLangList(); - for (const auto &lang : list) - { - const int index = SendMessageW(hlang, CB_ADDSTRING, 0, (LPARAM)lang.LangName.c_str()); - } - - size_t defaultListIndex = 0; - const auto &DefaultLang = langStringList.GetLang(); - for (size_t i = 0; i < list.size(); i++) - { - const auto &lang = list[i]; - if (lang.LangName == DefaultLang.LangName && lang.LangID == DefaultLang.LangID - && lang.SubLangID == DefaultLang.SubLangID && lang.FileName == DefaultLang.FileName) - { - defaultListIndex = i; - LangName = list[i].LangName; - break; - } - } - - if (langName.length() > 0) // OŇꂪ炻D - { - for (size_t i = 0; i < list.size(); i++) - { - const auto &lang = list[i]; - if (lang.LangName == langName) - { - defaultListIndex = i; - langStringList.SetLang(list[i]); - - LangName = langName; - break; - } - } - } - - SendMessage(hlang, CB_SETCURSEL, defaultListIndex, 0); - } - - SetWindowTextLang(); - - { - HWND houtext = GetDlgItem(dh, IDC_COMBO_OUT_EXT); - - const auto &OutputExtentionList = Waifu2x::OutputExtentionList; - for (const auto &elm : OutputExtentionList) - { - SendMessageW(houtext, CB_ADDSTRING, 0, (LPARAM)elm.ext.c_str()); - } - - SendMessage(houtext, CB_SETCURSEL, 0, 0); - } - - const boost::filesystem::path CropSizeListPath(exeDir / CropSizeListName); - std::ifstream ifs(CropSizeListPath.wstring()); - if (ifs) - { - std::string str; - while (getline(ifs, str)) - { - char *ptr = nullptr; - const long n = strtol(str.c_str(), &ptr, 10); - if (ptr && *ptr == '\0') - CropSizeList.push_back(n); - } - } - - { - HWND hcrop = GetDlgItem(dh, IDC_COMBO_CROP_SIZE); - - SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)TEXT("-----------------------")); - - // CropSizeList̒lljĂ - int mindiff = INT_MAX; - int defaultListIndex = -1; - for (const auto n : CropSizeList) - { - tstring str(to_tstring(n)); - const int index = SendMessage(hcrop, CB_ADDSTRING, 0, (LPARAM)str.c_str()); - - const int diff = abs(DefaultCommonDivisor - n); - if (DefaultCommonDivisorRange.first <= n && n <= DefaultCommonDivisorRange.second && diff < mindiff) - { - mindiff = diff; - defaultListIndex = index; - } - } - - if (GetWindowTextLength(hcrop) == 0) - SendMessage(hcrop, CB_SETCURSEL, defaultListIndex, 0); - } - - tstring tScaleRatio; - tstring tScaleWidth; - tstring tScaleHeight; - - tstring tScaleMode; - tstring tmode; - tstring tprcess; - tstring tAutoMode; - { - TCHAR tmp[1000]; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastScale"), TEXT("2.00"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tScaleRatio = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleWidth"), TEXT("0"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tScaleWidth = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleHeight"), TEXT("0"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tScaleHeight = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastScaleMode"), TEXT("Ratio"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tScaleMode = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastOutputExt"), TEXT("png"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - outputExt = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastInputFileExt"), TEXT("png:jpg:jpeg:tif:tiff:bmp:tga"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - inputFileExt = tmp; - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastMode"), TEXT("noise_scale"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tmode = tmp; - - noise_level = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastNoiseLevel"), 1, getTString(SettingFilePath).c_str()); - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastProcess"), TEXT("gpu"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tprcess = tmp; - - modelType = (eModelType)GetPrivateProfileInt(TEXT("Setting"), TEXT("LastModel"), 0, getTString(SettingFilePath).c_str()); - - use_tta = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastUseTTA"), 0, getTString(SettingFilePath).c_str()) != 0; - - output_quality.reset(); - const int num = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastOutputQuality"), -100, getTString(SettingFilePath).c_str()); - if (num != -100) - output_quality = num; - - output_depth = GetPrivateProfileInt(TEXT("Setting"), TEXT("LastOutputDepth"), output_depth, getTString(SettingFilePath).c_str()); - - GetPrivateProfileString(TEXT("Setting"), TEXT("LastAutoMode"), TEXT("none"), tmp, _countof(tmp), getTString(SettingFilePath).c_str()); - tmp[_countof(tmp) - 1] = TEXT('\0'); - tAutoMode = tmp; - } - - TCHAR *ptr = nullptr; - const double tempScale = _tcstod(tScaleRatio.c_str(), &ptr); - if (!ptr || *ptr != TEXT('\0') || tempScale <= 0.0) - tScaleRatio = TEXT("2.00"); - - const long tempScaleWidth = _tcstol(tScaleWidth.c_str(), &ptr, 10); - if (!ptr || *ptr != TEXT('\0') || tempScaleWidth <= 0) - tScaleWidth = TEXT(""); - - const long tempScaleHeight = _tcstol(tScaleHeight.c_str(), &ptr, 10); - if (!ptr || *ptr != TEXT('\0') || tempScaleHeight <= 0) - tScaleHeight = TEXT(""); - - if (outputExt.length() > 0 && outputExt[0] != TEXT('.')) - outputExt = L"." + outputExt; - - if (!(1 <= noise_level && noise_level <= 3)) - noise_level = 1; - - if (tprcess == TEXT("gpu")) - process = "gpu"; - else - process = "cpu"; - - if (!((eModelType)0 <= modelType && modelType < eModelTypeEnd)) - modelType = eModelTypeRGB; - - if (tmode == TEXT("noise")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - } - else if (tmode == TEXT("scale")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - } - else if (tmode == TEXT("auto_scale")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_CHECKED, 0); - } - else // noise_scale - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE_SCALE), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_NOISE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_SCALE), BM_SETCHECK, BST_UNCHECKED, 0); - } - - if(tScaleMode == TEXT("Ratio")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_UNCHECKED, 0); - - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), TRUE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); - } - else if (tScaleMode == TEXT("Width")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_UNCHECKED, 0); - - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), TRUE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); - } - else - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_RATIO), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_WIDTH), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_SCALE_HEIGHT), BM_SETCHECK, BST_CHECKED, 0); - - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), TRUE); - } - - if (noise_level == 1) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_UNCHECKED, 0); - } - else if (noise_level == 2) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_UNCHECKED, 0); - } - else - { - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL1), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL2), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIONOISE_LEVEL3), BM_SETCHECK, BST_CHECKED, 0); - } - - if (process == "gpu") - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_GPU), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_CPU), BM_SETCHECK, BST_UNCHECKED, 0); - } - else - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_GPU), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODE_CPU), BM_SETCHECK, BST_CHECKED, 0); - } - - if (modelType == eModelTypeRGB) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_UNCHECKED, 0); - } - else if (modelType == eModelTypePhoto) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_UNCHECKED, 0); - } - else - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_RGB), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_PHOTO), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_MODEL_Y), BM_SETCHECK, BST_CHECKED, 0); - } - - if (use_tta) - SendMessage(GetDlgItem(hWnd, IDC_CHECK_TTA), BM_SETCHECK, BST_CHECKED, 0); - else - SendMessage(GetDlgItem(hWnd, IDC_CHECK_TTA), BM_SETCHECK, BST_UNCHECKED, 0); - - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_RATIO), tScaleRatio.c_str()); - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_WIDTH), tScaleWidth.c_str()); - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_SCALE_HEIGHT), tScaleHeight.c_str()); - - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_INPUT_EXT_LIST), inputFileExt.c_str()); - - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); - - // O̊gqݒ֘A𕜌 - HWND houtext = GetDlgItem(dh, IDC_COMBO_OUT_EXT); - - size_t defaultIndex = 0; - const auto &OutputExtentionList = Waifu2x::OutputExtentionList; - for (size_t i = 0; i < OutputExtentionList.size(); i++) - { - const auto &elm = OutputExtentionList[i]; - if (elm.ext == outputExt) - { - defaultIndex = i; - break; - } - } - - SendMessage(houtext, CB_SETCURSEL, defaultIndex, 0); - - if(output_quality) - SetWindowText(GetDlgItem(hWnd, IDC_EDIT_OUT_QUALITY), boost::lexical_cast(*output_quality).c_str()); - - SetWindowText(GetDlgItem(hWnd, IDC_COMBO_OUTPUT_DEPTH), boost::lexical_cast(output_depth).c_str()); - - if (tAutoMode == TEXT("one")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_CHECKED, 0); - } - else if (tAutoMode == TEXT("multi")) - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_UNCHECKED, 0); - } - else - { - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_NONE), BM_SETCHECK, BST_CHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_MULTI), BM_SETCHECK, BST_UNCHECKED, 0); - SendMessage(GetDlgItem(hWnd, IDC_RADIO_AUTO_START_ONE), BM_SETCHECK, BST_UNCHECKED, 0); - } - - SetDepthAndQuality(false); - - - int nArgs = 0; - LPTSTR *lplpszArgs; - lplpszArgs = CommandLineToArgvW(GetCommandLine(), &nArgs); - if (lplpszArgs) - { - input_str_multi.clear(); - - if (nArgs > 1) - { - if (nArgs == 2) - { - OnSetInputFilePath(lplpszArgs[1]); - } - else if (nArgs > 2) - { - for (int i = 1; i < nArgs; i++) - input_str_multi.push_back(lplpszArgs[i]); - - OnSetInputFilePath(); - } - - isCommandLineStart = true; - - ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); - } - - LocalFree(lplpszArgs); - } - } - - void Cancel(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - cancelFlag = true; - EnableWindow(GetDlgItem(dh, IDC_BUTTON_CANCEL), FALSE); - } - - void UpdateAddString(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - ReplaceAddString(); - } - - void ScaleRadio(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_RATIO), BM_GETCHECK, 0, 0)) - { - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), TRUE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); - } - else if (SendMessage(GetDlgItem(dh, IDC_RADIO_SCALE_WIDTH), BM_GETCHECK, 0, 0)) - { - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), TRUE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), FALSE); - } - else - { - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_RATIO), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_WIDTH), FALSE); - EnableWindow(GetDlgItem(dh, IDC_EDIT_SCALE_HEIGHT), TRUE); - } - - ReplaceAddString(); - } - - void CheckCUDNN(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - const auto flag = Waifu2x::can_use_CUDA(); - switch (flag) - { - case Waifu2x::eWaifu2xCudaError_NotFind: - MessageBox(dh, langStringList.GetString(L"MessageCudaNotFindError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - return; - case Waifu2x::eWaifu2xCudaError_OldVersion: - MessageBox(dh, langStringList.GetString(L"MessageCudaOldVersionError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - return; - } - - switch (Waifu2x::can_use_cuDNN()) - { - case Waifu2x::eWaifu2xcuDNNError_OK: - MessageBox(dh, langStringList.GetString(L"MessagecuDNNOK").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONINFORMATION); - break; - case Waifu2x::eWaifu2xcuDNNError_NotFind: - { - TCHAR msg[1024 * 2]; - _stprintf(msg, langStringList.GetString(L"MessagecuDNNNotFindError").c_str(), TEXT(CUDNN_DLL_NAME)); - MessageBox(dh, msg, langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - break; - } - case Waifu2x::eWaifu2xcuDNNError_OldVersion: - { - TCHAR msg[1024 * 2]; - _stprintf(msg, langStringList.GetString(L"MessagecuDNNOldVersionError").c_str(), TEXT(CUDNN_DLL_NAME), TEXT(CUDNN_REQUIRE_VERION_TEXT)); - MessageBox(dh, msg, langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - break; - } - case Waifu2x::eWaifu2xcuDNNError_CannotCreate: - MessageBox(dh, langStringList.GetString(L"MessagecuDNNCannotCreateError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - break; - default: - MessageBox(dh, langStringList.GetString(L"MessagecuDNNDefautlError").c_str(), langStringList.GetString(L"MessageTitleResult").c_str(), MB_OK | MB_ICONERROR); - } - } - - LRESULT OnSetInputFilePath(const TCHAR *tPath) - { - HWND hWnd = GetDlgItem(dh, IDC_EDIT_INPUT); - - boost::filesystem::path path(tPath); - - if (!boost::filesystem::exists(path)) - { - MessageBox(dh, langStringList.GetString(L"MessageInputCheckError").c_str(), langStringList.GetString(L"MessageTitleError").c_str(), MB_OK | MB_ICONERROR); - return 0L; - } - - input_str_multi.clear(); - - SyncMember(true, true); - - if (boost::filesystem::is_directory(path)) - { - HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); - - const tstring addstr(AddName()); - autoSetAddName = AddName(); - - const auto str = getTString(path.branch_path() / (path.stem().wstring() + addstr)); - SetWindowText(ho, str.c_str()); - - SetWindowText(hWnd, tPath); - } - else - { - HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); - - tstring outputFileName = tPath; - - const auto tailDot = outputFileName.find_last_of('.'); - if (tailDot != outputFileName.npos) - outputFileName.erase(tailDot, outputFileName.length()); - - const tstring addstr(AddName()); - autoSetAddName = addstr; - - outputFileName += addstr + outputExt; - - SetWindowText(ho, outputFileName.c_str()); - - SetWindowText(hWnd, tPath); - } - - SetCropSizeList(path); - - return 0L; - } - - LRESULT OnSetInputFilePath() - { - HWND hWnd = GetDlgItem(dh, IDC_EDIT_INPUT); - - SyncMember(true, true); - - if (input_str_multi.size() > 0) - { - SetWindowText(hWnd, MultiFileStr); - - HWND ho = GetDlgItem(dh, IDC_EDIT_OUTPUT); - - const tstring addstr(AddName()); - autoSetAddName = AddName(); - - boost::filesystem::path baseDir(input_str_multi[0]); - - tstring filename; - if (boost::filesystem::is_directory(baseDir)) - filename = baseDir.filename().wstring(); - else - filename = baseDir.stem().wstring(); - - const auto str = getTString(baseDir.branch_path() / (filename + TEXT(" multi") + addstr)); - SetWindowText(ho, str.c_str()); - } - - SetCropSizeList(TEXT("")); - - return 0L; - } - - // œnhWndIDC_EDITHWND(Rg[̃Cxg) - LRESULT DropInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) - { - TCHAR szTmp[AR_PATH_MAX]; - - // hbvꂽt@C擾 - UINT FileNum = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, szTmp, _countof(szTmp)); - if (FileNum > 0) - { - if (FileNum == 1) - { - DragQueryFile((HDROP)wParam, 0, szTmp, _countof(szTmp)); - szTmp[_countof(szTmp) - 1] = TEXT('\0'); - - OnSetInputFilePath(szTmp); - } - else if (FileNum > 1) - { - input_str.clear(); - input_str_multi.clear(); - - for (UINT i = 0; i < FileNum; i++) - { - TCHAR szTmp[AR_PATH_MAX]; - - if (DragQueryFile((HDROP)wParam, i, szTmp, _countof(szTmp)) < _countof(szTmp)) - { - szTmp[_countof(szTmp) - 1] = TEXT('\0'); - - input_str_multi.push_back(szTmp); - } - } - - OnSetInputFilePath(); - } - - if (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_ONE), BM_GETCHECK, 0, 0) || - (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_MULTI), BM_GETCHECK, 0, 0) && (input_str_multi.size() > 0 || boost::filesystem::is_directory(szTmp)))) - { - ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); - } - } - - return 0L; - } - - // œnhWndIDC_EDITHWND(Rg[̃Cxg) - LRESULT DropOutput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) - { - TCHAR szTmp[AR_PATH_MAX]; - - // hbvꂽt@C擾 - UINT FileNum = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, szTmp, AR_PATH_MAX); - if (FileNum >= 1) - { - DragQueryFile((HDROP)wParam, 0, szTmp, AR_PATH_MAX); - SetWindowText(hWnd, szTmp); - } - - return 0L; - } - - LRESULT TextInput(HWND hWnd, WPARAM wParam, LPARAM lParam, WNDPROC OrgSubWnd, LPVOID lpData) - { - const auto ret = CallWindowProc(OrgSubWnd, hWnd, WM_CHAR, wParam, lParam); - ReplaceAddString(); - return ret; - } - - void InputRef(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - SyncMember(false); - - OPENFILENAME ofn = { 0 }; - TCHAR szPath[AR_PATH_MAX] = TEXT(""); - - static std::vector szFile(AR_PATH_MAX * 100); - memset(szFile.data(), 0, szFile.size() * sizeof(TCHAR)); - - GetCurrentDirectory(_countof(szPath), szPath); - szPath[_countof(szPath) - 1] = TEXT('\0'); - - tstring extStr; - for (const auto &ext : extList) - { - if (extStr.length() != 0) - extStr += TEXT(";*") + ext; - else - extStr = TEXT("*") + ext; - } - - TCHAR szFilter[AR_PATH_MAX] = TEXT(""); - TCHAR *tfp = szFilter; - - if (extStr.length() > 0) - { - tfp += _stprintf(tfp, langStringList.GetString(L"MessageExtStr").c_str(), extStr.c_str()); - tfp++; - - memcpy(tfp, extStr.c_str(), extStr.length() * sizeof(TCHAR)); - tfp += extStr.length(); - - *tfp = TEXT('\0'); - tfp++; - } - - const tstring allFilesTitle(langStringList.GetString(L"MessageAllFileFolder").c_str()); - memcpy(tfp, allFilesTitle.c_str(), allFilesTitle.length() * sizeof(TCHAR)); - tfp += allFilesTitle.length(); - *tfp = TEXT('\0'); - tfp++; - - const tstring allFilesExt(TEXT("*.*")); - memcpy(tfp, allFilesExt.c_str(), allFilesExt.length() * sizeof(TCHAR)); - tfp += allFilesExt.length(); - - *tfp = TEXT('\0'); - tfp++; - *tfp = TEXT('\0'); - tfp++; - - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = dh; - ofn.lpstrFile = szFile.data(); - ofn.nMaxFile = szFile.size(); - ofn.lpstrFilter = szFilter; - ofn.nFilterIndex = 1; - ofn.lpstrTitle = langStringList.GetString(L"MessageTitleInputDialog").c_str(); - ofn.lpstrInitialDir = szPath; - ofn.lpstrCustomFilter = NULL; - ofn.nMaxCustFilter = 0; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = NULL; - ofn.lCustData = 0; - ofn.lpfnHook = OFNHookProcIn; - ofn.lpTemplateName = 0; - //ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; - ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_READONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; - if (GetOpenFileName(&ofn)) - { - szFile[szFile.size() - 1] = TEXT('\0'); - - const TCHAR * ptr = szFile.data(); - - const auto firstLen = _tcslen(ptr); - if (firstLen > 0) - { - input_str.clear(); - input_str_multi.clear(); - - if(firstLen + 2 >= szFile.size() || ptr[firstLen + 1] == '\0') - OnSetInputFilePath(ptr); - else - { - const TCHAR * end = ptr + szFile.size(); - - const tstring baseDir(ptr); - ptr += firstLen + 1; - - while (ptr < end) - { - if (*ptr == TEXT('\0')) - break; - - TCHAR szTmp[AR_PATH_MAX]; - - const auto len = _tcslen(ptr); - memcpy(szTmp, ptr, len * sizeof(TCHAR)); - szTmp[len] = TEXT('\0'); - - const auto str = baseDir + TEXT('\\') + szTmp; - - input_str_multi.push_back(str); - - ptr += len + 1; - } - - OnSetInputFilePath(); - } - - if ( SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_ONE), BM_GETCHECK, 0, 0) || - (SendMessage(GetDlgItem(dh, IDC_RADIO_AUTO_START_MULTI), BM_GETCHECK, 0, 0) && (input_str_multi.size() > 0 || boost::filesystem::is_directory(szFile.data())))) - { - ::PostMessage(GetDlgItem(dh, IDC_BUTTON_EXEC), BM_CLICK, 0, 0); - } - } - } - } - - void LangChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - if (HIWORD(wParam) != CBN_SELCHANGE) - return; - - HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); - - const int cur = SendMessage(hlang, CB_GETCURSEL, 0, 0); - - const auto &list = langStringList.GetLangList(); - - if (list.size() <= cur) - return; - - langStringList.SetLang(list[cur]); - LangName = list[cur].LangName; - - SetWindowTextLang(); - } - - void OutExtChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) - { - if (HIWORD(wParam) != CBN_SELCHANGE) - return; - - SetDepthAndQuality(); - - ReplaceAddString(); - } -}; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -2290,6 +63,9 @@ int WINAPI WinMain(HINSTANCE hInstance, cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::Exec, &cDialogEvent), NULL, IDC_BUTTON_EXEC); cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::Cancel, &cDialogEvent), NULL, IDC_BUTTON_CANCEL); cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::InputRef, &cDialogEvent), NULL, IDC_BUTTON_INPUT_REF); + cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::OutputRef, &cDialogEvent), NULL, IDC_BUTTON_OUTPUT_REF); + cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::ClearOutputDir, &cDialogEvent), NULL, IDC_BUTTON_CLEAR_OUTPUT_DIR); + cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::AppSetting, &cDialogEvent), NULL, IDC_BUTTON_APP_SETTING); cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::UpdateAddString, &cDialogEvent), NULL, IDC_RADIO_MODE_NOISE); cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::UpdateAddString, &cDialogEvent), NULL, IDC_RADIO_MODE_SCALE); diff --git a/waifu2x-caffe-gui/Source.h b/waifu2x-caffe-gui/Source.h new file mode 100644 index 0000000..e69de29 diff --git a/waifu2x-caffe-gui/resource.h b/waifu2x-caffe-gui/resource.h index 724d17b..879a6f3 100644 Binary files a/waifu2x-caffe-gui/resource.h and b/waifu2x-caffe-gui/resource.h differ diff --git a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj index 80addd6..c7292cd 100644 --- a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj +++ b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj @@ -99,6 +99,7 @@ + @@ -110,7 +111,9 @@ + + diff --git a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters index e46cd64..bc5a3cc 100644 --- a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters +++ b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters @@ -30,6 +30,9 @@ ソース ファイル + + ソース ファイル + @@ -62,6 +65,12 @@ ヘッダー ファイル + + ヘッダー ファイル + + + ヘッダー ファイル +