Full Code of Blinue/Magpie for AI

dev b57b1aec43e2 cached
587 files
15.8 MB
4.0M tokens
355 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (15,834K chars total). Download the full file to get everything.
Repository: Blinue/Magpie
Branch: dev
Commit: b57b1aec43e2
Files: 587
Total size: 15.8 MB

Directory structure:
gitextract_qytqdh1v/

├── .all-contributorsrc
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug.yaml
│   │   ├── 02_performance.yaml
│   │   ├── 03_request.yaml
│   │   ├── 04_question.yaml
│   │   └── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build.yml
│       ├── release.yml
│       └── wiki.yml
├── .gitignore
├── CONTRIBUTING.md
├── CONTRIBUTING_ZH.md
├── Directory.Build.props
├── LICENSE
├── Magpie.slnx
├── README.md
├── README_ZH.md
├── Settings.XamlStyler
├── certs/
│   ├── .gitignore
│   └── Magpie.pfx
├── docs/
│   ├── About touch support.md
│   ├── Built-in effects.md
│   ├── Comparison of capture methods.md
│   ├── Compilation guide.md
│   ├── FAQ (EN).md
│   ├── FAQ.md
│   ├── Home (EN).md
│   ├── Home.md
│   ├── Interact with Magpie programally.md
│   ├── MagpieFX (EN).md
│   ├── MagpieFX.md
│   ├── Performance optimization.md
│   ├── _Sidebar.md
│   ├── 以编程方式与 Magpie 交互.md
│   ├── 关于触控支持.md
│   ├── 内置效果介绍.md
│   ├── 性能优化建议.md
│   ├── 捕获方式对比.md
│   └── 编译指南.md
├── natvis/
│   ├── magpie.natvis
│   ├── phmap.natvis
│   └── rapidjson.natvis
├── scripts/
│   ├── publish.py
│   ├── release.py
│   └── wiki.py
├── src/
│   ├── BuildOptions.props
│   ├── Common.Post.props
│   ├── Common.Pre.props
│   ├── Effects/
│   │   ├── ACNet.hlsl
│   │   ├── Anime4K/
│   │   │   ├── Anime4K_3D_AA_Upscale_US.hlsl
│   │   │   ├── Anime4K_3D_Upscale_US.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Mean.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Median.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Mode.hlsl
│   │   │   ├── Anime4K_Restore_L.hlsl
│   │   │   ├── Anime4K_Restore_M.hlsl
│   │   │   ├── Anime4K_Restore_S.hlsl
│   │   │   ├── Anime4K_Restore_Soft_L.hlsl
│   │   │   ├── Anime4K_Restore_Soft_M.hlsl
│   │   │   ├── Anime4K_Restore_Soft_S.hlsl
│   │   │   ├── Anime4K_Restore_Soft_UL.hlsl
│   │   │   ├── Anime4K_Restore_Soft_VL.hlsl
│   │   │   ├── Anime4K_Restore_UL.hlsl
│   │   │   ├── Anime4K_Restore_VL.hlsl
│   │   │   ├── Anime4K_Thin_HQ.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_L.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_S.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_UL.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_VL.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x2_M.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x2_S.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x3_L.hlsl
│   │   │   ├── Anime4K_Upscale_L.hlsl
│   │   │   ├── Anime4K_Upscale_S.hlsl
│   │   │   ├── Anime4K_Upscale_UL.hlsl
│   │   │   └── Anime4K_Upscale_VL.hlsl
│   │   ├── Bicubic.hlsl
│   │   ├── Bilinear.hlsl
│   │   ├── CAS/
│   │   │   ├── CAS.hlsl
│   │   │   └── CAS_Scaling.hlsl
│   │   ├── CRT/
│   │   │   ├── CRT_Easymode.hlsl
│   │   │   ├── CRT_Geom.hlsl
│   │   │   ├── CRT_Hyllian.hlsl
│   │   │   ├── CRT_Lottes.hlsl
│   │   │   └── GTU_v050.hlsl
│   │   ├── CuNNy/
│   │   │   ├── CuNNy-16x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-16x16C-NVL.hlsl
│   │   │   ├── CuNNy-2x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-2x4C-NVL.hlsl
│   │   │   ├── CuNNy-3x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-3x4C-NVL.hlsl
│   │   │   ├── CuNNy-4x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x16C-NVL.hlsl
│   │   │   ├── CuNNy-4x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x4C-NVL.hlsl
│   │   │   ├── CuNNy-4x8C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x8C-NVL.hlsl
│   │   │   ├── CuNNy-6x8C-NVL-DN.hlsl
│   │   │   ├── CuNNy-6x8C-NVL.hlsl
│   │   │   ├── CuNNy-8x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-8x16C-NVL.hlsl
│   │   │   ├── CuNNy-8x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-8x4C-NVL.hlsl
│   │   │   ├── CuNNy-8x8C-NVL-DN.hlsl
│   │   │   └── CuNNy-8x8C-NVL.hlsl
│   │   ├── CuNNy2/
│   │   │   ├── CuNNy-3x12-NVL.hlsl
│   │   │   ├── CuNNy-4x12-NVL.hlsl
│   │   │   ├── CuNNy-4x16-NVL.hlsl
│   │   │   ├── CuNNy-4x24-NVL.hlsl
│   │   │   ├── CuNNy-4x32-NVL.hlsl
│   │   │   ├── CuNNy-8x32-NVL.hlsl
│   │   │   ├── CuNNy-fast-NVL.hlsl
│   │   │   ├── CuNNy-faster-NVL.hlsl
│   │   │   └── CuNNy-veryfast-NVL.hlsl
│   │   ├── Deband.hlsl
│   │   ├── Effects.vcxproj
│   │   ├── Effects.vcxproj.filters
│   │   ├── FSR/
│   │   │   ├── FSR_EASU.hlsl
│   │   │   └── FSR_RCAS.hlsl
│   │   ├── FSRCNNX/
│   │   │   ├── FSRCNNX.hlsl
│   │   │   └── FSRCNNX_LineArt.hlsl
│   │   ├── FXAA/
│   │   │   ├── FXAA.hlsli
│   │   │   ├── FXAA_High.hlsl
│   │   │   ├── FXAA_Medium.hlsl
│   │   │   └── FXAA_Ultra.hlsl
│   │   ├── ImageAdjustment.hlsl
│   │   ├── Jinc.hlsl
│   │   ├── Lanczos.hlsl
│   │   ├── NIS/
│   │   │   ├── Coef_Scale.dds
│   │   │   ├── Coef_USM.dds
│   │   │   ├── NIS.hlsl
│   │   │   ├── NIS_Scaler.hlsli
│   │   │   └── NVSharpen.hlsl
│   │   ├── NNEDI3/
│   │   │   ├── NNEDI3_nns128_win8x4.hlsl
│   │   │   ├── NNEDI3_nns128_win8x6.hlsl
│   │   │   ├── NNEDI3_nns16_win8x4.hlsl
│   │   │   ├── NNEDI3_nns16_win8x6.hlsl
│   │   │   ├── NNEDI3_nns256_win8x4.hlsl
│   │   │   ├── NNEDI3_nns256_win8x6.hlsl
│   │   │   ├── NNEDI3_nns32_win8x4.hlsl
│   │   │   ├── NNEDI3_nns32_win8x6.hlsl
│   │   │   ├── NNEDI3_nns64_win8x4.hlsl
│   │   │   ├── NNEDI3_nns64_win8x6.hlsl
│   │   │   └── prescalers.hlsli
│   │   ├── Nearest.hlsl
│   │   ├── Pixel Art/
│   │   │   ├── MMPX.hlsl
│   │   │   ├── Pixellate.hlsl
│   │   │   └── SharpBilinear.hlsl
│   │   ├── RAVU/
│   │   │   ├── RAVU_3x_R2.hlsl
│   │   │   ├── RAVU_3x_R2_RGB.hlsl
│   │   │   ├── RAVU_3x_R3.hlsl
│   │   │   ├── RAVU_3x_R3_RGB.hlsl
│   │   │   ├── RAVU_3x_R4.hlsl
│   │   │   ├── RAVU_3x_R4_RGB.hlsl
│   │   │   ├── RAVU_Lite_AR_R2.hlsl
│   │   │   ├── RAVU_Lite_AR_R3.hlsl
│   │   │   ├── RAVU_Lite_AR_R4.hlsl
│   │   │   ├── RAVU_Lite_R2.hlsl
│   │   │   ├── RAVU_Lite_R3.hlsl
│   │   │   ├── RAVU_Lite_R4.hlsl
│   │   │   ├── RAVU_R2.hlsl
│   │   │   ├── RAVU_R2_RGB.hlsl
│   │   │   ├── RAVU_R3.hlsl
│   │   │   ├── RAVU_R3_RGB.hlsl
│   │   │   ├── RAVU_R4.hlsl
│   │   │   ├── RAVU_R4_RGB.hlsl
│   │   │   ├── RAVU_Zoom_AR_R2.hlsl
│   │   │   ├── RAVU_Zoom_AR_R2_RGB.hlsl
│   │   │   ├── RAVU_Zoom_AR_R3.hlsl
│   │   │   ├── RAVU_Zoom_AR_R3_RGB.hlsl
│   │   │   ├── RAVU_Zoom_R2.hlsl
│   │   │   ├── RAVU_Zoom_R2_RGB.hlsl
│   │   │   ├── RAVU_Zoom_R3.hlsl
│   │   │   ├── RAVU_Zoom_R3_RGB.hlsl
│   │   │   ├── prescalers.hlsli
│   │   │   ├── ravu_3x_lut2_f16.dds
│   │   │   ├── ravu_3x_lut3_f16.dds
│   │   │   ├── ravu_3x_lut4_f16.dds
│   │   │   ├── ravu_lite_lut2_f16.dds
│   │   │   ├── ravu_lite_lut3_f16.dds
│   │   │   ├── ravu_lite_lut4_f16.dds
│   │   │   ├── ravu_lut2_f16.dds
│   │   │   ├── ravu_lut3_f16.dds
│   │   │   ├── ravu_lut4_f16.dds
│   │   │   ├── ravu_zoom_lut2_ar_f16.dds
│   │   │   ├── ravu_zoom_lut2_f16.dds
│   │   │   ├── ravu_zoom_lut3_ar_f16.dds
│   │   │   └── ravu_zoom_lut3_f16.dds
│   │   ├── SGSR.hlsl
│   │   ├── SMAA/
│   │   │   ├── AreaTex.dds
│   │   │   ├── SMAA.hlsli
│   │   │   ├── SMAA_High.hlsl
│   │   │   ├── SMAA_Low.hlsl
│   │   │   ├── SMAA_Medium.hlsl
│   │   │   ├── SMAA_Ultra.hlsl
│   │   │   └── SearchTex.dds
│   │   ├── SSimDownscaler.hlsl
│   │   ├── Sharpen/
│   │   │   ├── AdaptiveSharpen.hlsl
│   │   │   ├── FineSharp.hlsl
│   │   │   ├── LCAS.hlsl
│   │   │   └── LumaSharpen.hlsl
│   │   ├── StubDefs.hlsli
│   │   └── xBRZ/
│   │       ├── xBRZ_2x.hlsl
│   │       ├── xBRZ_3x.hlsl
│   │       ├── xBRZ_4x.hlsl
│   │       ├── xBRZ_5x.hlsl
│   │       ├── xBRZ_6x.hlsl
│   │       └── xBRZ_Freescale.hlsl
│   ├── HybridCRT.props
│   ├── Magpie/
│   │   ├── AboutPage.cpp
│   │   ├── AboutPage.h
│   │   ├── AboutPage.idl
│   │   ├── AboutPage.xaml
│   │   ├── AboutViewModel.cpp
│   │   ├── AboutViewModel.h
│   │   ├── AboutViewModel.idl
│   │   ├── AdaptersService.cpp
│   │   ├── AdaptersService.h
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── App.idl
│   │   ├── App.xaml
│   │   ├── AppSettings.cpp
│   │   ├── AppSettings.h
│   │   ├── AppXReader.cpp
│   │   ├── AppXReader.h
│   │   ├── AutoStartHelper.cpp
│   │   ├── AutoStartHelper.h
│   │   ├── BlueInfoBarStyle.cpp
│   │   ├── BlueInfoBarStyle.h
│   │   ├── BlueInfoBarStyle.idl
│   │   ├── BlueInfoBarStyle.xaml
│   │   ├── BoolNegationConverter.cpp
│   │   ├── BoolNegationConverter.h
│   │   ├── BoolNegationConverter.idl
│   │   ├── BoolToNegativeVisibilityConverter.cpp
│   │   ├── BoolToNegativeVisibilityConverter.h
│   │   ├── BoolToNegativeVisibilityConverter.idl
│   │   ├── CandidateWindowItem.cpp
│   │   ├── CandidateWindowItem.h
│   │   ├── CandidateWindowItem.idl
│   │   ├── CaptionButtonsControl.cpp
│   │   ├── CaptionButtonsControl.h
│   │   ├── CaptionButtonsControl.idl
│   │   ├── CaptionButtonsControl.xaml
│   │   ├── ContentDialogHelper.cpp
│   │   ├── ContentDialogHelper.h
│   │   ├── ControlHelper.cpp
│   │   ├── ControlHelper.h
│   │   ├── ControlSizeTrigger.cpp
│   │   ├── ControlSizeTrigger.h
│   │   ├── ControlSizeTrigger.idl
│   │   ├── EffectHelper.h
│   │   ├── EffectParametersViewModel.cpp
│   │   ├── EffectParametersViewModel.h
│   │   ├── EffectParametersViewModel.idl
│   │   ├── EffectsService.cpp
│   │   ├── EffectsService.h
│   │   ├── FileDialogHelper.cpp
│   │   ├── FileDialogHelper.h
│   │   ├── HomePage.cpp
│   │   ├── HomePage.h
│   │   ├── HomePage.idl
│   │   ├── HomePage.xaml
│   │   ├── HomeViewModel.cpp
│   │   ├── HomeViewModel.h
│   │   ├── HomeViewModel.idl
│   │   ├── IconHelper.cpp
│   │   ├── IconHelper.h
│   │   ├── IsEqualStateTrigger.cpp
│   │   ├── IsEqualStateTrigger.h
│   │   ├── IsEqualStateTrigger.idl
│   │   ├── IsNullStateTrigger.cpp
│   │   ├── IsNullStateTrigger.h
│   │   ├── IsNullStateTrigger.idl
│   │   ├── JsonHelper.cpp
│   │   ├── JsonHelper.h
│   │   ├── KeyVisual.Resource.xaml
│   │   ├── KeyVisual.cpp
│   │   ├── KeyVisual.h
│   │   ├── KeyVisual.idl
│   │   ├── KeyVisualState.cpp
│   │   ├── KeyVisualState.h
│   │   ├── KeyVisualState.idl
│   │   ├── LocalizationService.cpp
│   │   ├── LocalizationService.h
│   │   ├── Magpie.rc
│   │   ├── Magpie.vcxproj
│   │   ├── Magpie.vcxproj.filters
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── NewProfileViewModel.cpp
│   │   ├── NewProfileViewModel.h
│   │   ├── NewProfileViewModel.idl
│   │   ├── NotifyIconService.cpp
│   │   ├── NotifyIconService.h
│   │   ├── PageFrame.cpp
│   │   ├── PageFrame.h
│   │   ├── PageFrame.idl
│   │   ├── PageFrame.xaml
│   │   ├── Profile.h
│   │   ├── ProfilePage.cpp
│   │   ├── ProfilePage.h
│   │   ├── ProfilePage.idl
│   │   ├── ProfilePage.xaml
│   │   ├── ProfileService.cpp
│   │   ├── ProfileService.h
│   │   ├── ProfileViewModel.cpp
│   │   ├── ProfileViewModel.h
│   │   ├── ProfileViewModel.idl
│   │   ├── Resources.language-de.resw
│   │   ├── Resources.language-en-US.resw
│   │   ├── Resources.language-es.resw
│   │   ├── Resources.language-fr.resw
│   │   ├── Resources.language-hu.resw
│   │   ├── Resources.language-id.resw
│   │   ├── Resources.language-it.resw
│   │   ├── Resources.language-ja.resw
│   │   ├── Resources.language-ka.resw
│   │   ├── Resources.language-ko.resw
│   │   ├── Resources.language-pl.resw
│   │   ├── Resources.language-pt-BR.resw
│   │   ├── Resources.language-ru.resw
│   │   ├── Resources.language-ta.resw
│   │   ├── Resources.language-tr.resw
│   │   ├── Resources.language-uk.resw
│   │   ├── Resources.language-vi.resw
│   │   ├── Resources.language-zh-Hans.resw
│   │   ├── Resources.language-zh-Hant.resw
│   │   ├── RootPage.cpp
│   │   ├── RootPage.h
│   │   ├── RootPage.idl
│   │   ├── RootPage.xaml
│   │   ├── ScalingMode.cpp
│   │   ├── ScalingMode.h
│   │   ├── ScalingModeEffectItem.cpp
│   │   ├── ScalingModeEffectItem.h
│   │   ├── ScalingModeEffectItem.idl
│   │   ├── ScalingModeItem.cpp
│   │   ├── ScalingModeItem.h
│   │   ├── ScalingModeItem.idl
│   │   ├── ScalingModesPage.cpp
│   │   ├── ScalingModesPage.h
│   │   ├── ScalingModesPage.idl
│   │   ├── ScalingModesPage.xaml
│   │   ├── ScalingModesService.cpp
│   │   ├── ScalingModesService.h
│   │   ├── ScalingModesViewModel.cpp
│   │   ├── ScalingModesViewModel.h
│   │   ├── ScalingModesViewModel.idl
│   │   ├── ScalingService.cpp
│   │   ├── ScalingService.h
│   │   ├── SettingsCard.Resource.xaml
│   │   ├── SettingsCard.cpp
│   │   ├── SettingsCard.h
│   │   ├── SettingsCard.idl
│   │   ├── SettingsExpander.Resource.xaml
│   │   ├── SettingsExpander.cpp
│   │   ├── SettingsExpander.h
│   │   ├── SettingsExpander.idl
│   │   ├── SettingsExpanderCornerRadiusConverter.cpp
│   │   ├── SettingsExpanderCornerRadiusConverter.h
│   │   ├── SettingsExpanderCornerRadiusConverter.idl
│   │   ├── SettingsGroup.Resource.xaml
│   │   ├── SettingsGroup.cpp
│   │   ├── SettingsGroup.h
│   │   ├── SettingsGroup.idl
│   │   ├── SettingsPage.cpp
│   │   ├── SettingsPage.h
│   │   ├── SettingsPage.idl
│   │   ├── SettingsPage.xaml
│   │   ├── SettingsViewModel.cpp
│   │   ├── SettingsViewModel.h
│   │   ├── SettingsViewModel.idl
│   │   ├── Shortcut.cpp
│   │   ├── Shortcut.h
│   │   ├── ShortcutControl.cpp
│   │   ├── ShortcutControl.h
│   │   ├── ShortcutControl.idl
│   │   ├── ShortcutControl.xaml
│   │   ├── ShortcutDialog.cpp
│   │   ├── ShortcutDialog.h
│   │   ├── ShortcutDialog.idl
│   │   ├── ShortcutDialog.xaml
│   │   ├── ShortcutHelper.cpp
│   │   ├── ShortcutHelper.h
│   │   ├── ShortcutService.cpp
│   │   ├── ShortcutService.h
│   │   ├── SimpleStackPanel.cpp
│   │   ├── SimpleStackPanel.h
│   │   ├── SimpleStackPanel.idl
│   │   ├── SmoothResizeHelper.cpp
│   │   ├── SmoothResizeHelper.h
│   │   ├── TextBlockHelper.cpp
│   │   ├── TextBlockHelper.h
│   │   ├── TextBlockHelper.idl
│   │   ├── TextMenuFlyout.cpp
│   │   ├── TextMenuFlyout.h
│   │   ├── TextMenuFlyout.idl
│   │   ├── ThemeHelper.cpp
│   │   ├── ThemeHelper.h
│   │   ├── TitleBarControl.cpp
│   │   ├── TitleBarControl.h
│   │   ├── TitleBarControl.idl
│   │   ├── TitleBarControl.xaml
│   │   ├── ToastPage.cpp
│   │   ├── ToastPage.h
│   │   ├── ToastPage.idl
│   │   ├── ToastPage.xaml
│   │   ├── ToastService.cpp
│   │   ├── ToastService.h
│   │   ├── TouchHelper.cpp
│   │   ├── TouchHelper.h
│   │   ├── UpdateService.cpp
│   │   ├── UpdateService.h
│   │   ├── WrapPanel.cpp
│   │   ├── WrapPanel.h
│   │   ├── WrapPanel.idl
│   │   ├── XamlHelper.cpp
│   │   ├── XamlHelper.h
│   │   ├── XamlWindow.h
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── resource.h
│   ├── Magpie.Core/
│   │   ├── .gitignore
│   │   ├── AdaptivePresenter.cpp
│   │   ├── AdaptivePresenter.h
│   │   ├── BackendDescriptorStore.cpp
│   │   ├── BackendDescriptorStore.h
│   │   ├── CompSwapchainPresenter.cpp
│   │   ├── CompSwapchainPresenter.h
│   │   ├── CursorDrawer.cpp
│   │   ├── CursorDrawer.h
│   │   ├── CursorManager.cpp
│   │   ├── CursorManager.h
│   │   ├── DDS.h
│   │   ├── DDSHelper.cpp
│   │   ├── DDSHelper.h
│   │   ├── DesktopDuplicationFrameSource.cpp
│   │   ├── DesktopDuplicationFrameSource.h
│   │   ├── DeviceResources.cpp
│   │   ├── DeviceResources.h
│   │   ├── DirectXHelper.cpp
│   │   ├── DwmSharedSurfaceFrameSource.cpp
│   │   ├── DwmSharedSurfaceFrameSource.h
│   │   ├── EffectCacheManager.cpp
│   │   ├── EffectCacheManager.h
│   │   ├── EffectCompiler.cpp
│   │   ├── EffectDrawer.cpp
│   │   ├── EffectDrawer.h
│   │   ├── EffectHelper.h
│   │   ├── EffectsProfiler.cpp
│   │   ├── EffectsProfiler.h
│   │   ├── ExclModeHelper.cpp
│   │   ├── ExclModeHelper.h
│   │   ├── FrameSourceBase.cpp
│   │   ├── FrameSourceBase.h
│   │   ├── GDIFrameSource.cpp
│   │   ├── GDIFrameSource.h
│   │   ├── GraphicsCaptureFrameSource.cpp
│   │   ├── GraphicsCaptureFrameSource.h
│   │   ├── ImGuiBackend.cpp
│   │   ├── ImGuiBackend.h
│   │   ├── ImGuiFontsCacheManager.cpp
│   │   ├── ImGuiFontsCacheManager.h
│   │   ├── ImGuiImpl.cpp
│   │   ├── ImGuiImpl.h
│   │   ├── Magpie.Core.vcxproj
│   │   ├── Magpie.Core.vcxproj.filters
│   │   ├── OverlayDrawer.cpp
│   │   ├── OverlayDrawer.h
│   │   ├── OverlayHelper.cpp
│   │   ├── OverlayHelper.h
│   │   ├── PresenterBase.cpp
│   │   ├── PresenterBase.h
│   │   ├── Renderer.cpp
│   │   ├── Renderer.h
│   │   ├── ScalingOptions.cpp
│   │   ├── ScalingRuntime.cpp
│   │   ├── ScalingWindow.cpp
│   │   ├── ScalingWindow.h
│   │   ├── ScreenshotHelper.cpp
│   │   ├── ScreenshotHelper.h
│   │   ├── SrcTracker.cpp
│   │   ├── SrcTracker.h
│   │   ├── StepTimer.cpp
│   │   ├── StepTimer.h
│   │   ├── TextureHelper.cpp
│   │   ├── TextureHelper.h
│   │   ├── Win32Helper.cpp
│   │   ├── WindowHelper.cpp
│   │   ├── YasHelper.h
│   │   ├── include/
│   │   │   ├── DirectXHelper.h
│   │   │   ├── EffectCompiler.h
│   │   │   ├── EffectDesc.h
│   │   │   ├── Event.h
│   │   │   ├── ScalingOptions.h
│   │   │   ├── ScalingRuntime.h
│   │   │   ├── Win32Helper.h
│   │   │   ├── WindowBase.h
│   │   │   └── WindowHelper.h
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── shaders/
│   │       ├── DuplicateFrameCS.hlsl
│   │       ├── ImGuiImplPS.hlsl
│   │       ├── ImGuiImplVS.hlsl
│   │       ├── MaskedCursorPS.hlsl
│   │       ├── MonochromeCursorPS.hlsl
│   │       ├── SimplePS.hlsl
│   │       └── SimpleVS.hlsl
│   ├── Shared/
│   │   ├── CommonDefines.h
│   │   ├── CommonSharedConstants.h
│   │   ├── Logger.cpp
│   │   ├── Logger.h
│   │   ├── Shared.vcxitems
│   │   ├── SmallVector.cpp
│   │   ├── SmallVector.h
│   │   ├── StrHelper.cpp
│   │   ├── StrHelper.h
│   │   ├── StrMacros.h
│   │   ├── Version.cpp
│   │   └── Version.h
│   ├── TouchHelper/
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── TouchHelper.rc
│   │   ├── TouchHelper.vcxproj
│   │   ├── TouchHelper.vcxproj.filters
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   └── pch.h
│   ├── Updater/
│   │   ├── PackageFiles.h
│   │   ├── Updater.rc
│   │   ├── Updater.vcxproj
│   │   ├── Updater.vcxproj.filters
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── resource.h
│   ├── WinUI.targets
│   └── _ConanDeps/
│       ├── _ConanDeps.filters
│       ├── _ConanDeps.vcxproj
│       ├── clang-cl.profile
│       └── msvc.profile
├── tools/
│   ├── CJKCharsetForImGui/
│   │   ├── characters.txt
│   │   └── cjk_charset_for_imgui.py
│   ├── MPVHookTextureParser/
│   │   ├── MPVHookTextureParser.cpp
│   │   ├── MPVHookTextureParser.slnx
│   │   ├── MPVHookTextureParser.vcxproj
│   │   ├── MPVHookTextureParser.vcxproj.filters
│   │   ├── README.md
│   │   ├── README_EN.md
│   │   └── packages.config
│   └── WindowCase/
│       ├── HideCursorWindow.cpp
│       ├── HideCursorWindow.h
│       ├── HungWindow.cpp
│       ├── HungWindow.h
│       ├── KirikiriWindow.cpp
│       ├── KirikiriWindow.h
│       ├── PopupHostWindow.cpp
│       ├── PopupHostWindow.h
│       ├── TopmostWindow.cpp
│       ├── TopmostWindow.h
│       ├── Utils.cpp
│       ├── Utils.h
│       ├── WindowBase.h
│       ├── WindowCase.slnx
│       ├── WindowCase.vcxproj
│       ├── WindowCase.vcxproj.filters
│       ├── app.manifest
│       ├── main.cpp
│       ├── pch.cpp
│       └── pch.h
└── version.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .all-contributorsrc
================================================
{
  "files": [
    "README.md",
    "README_ZH.md"
  ],
  "imageSize": 100,
  "commit": false,
  "contributors": [
    {
      "login": "Blinue",
      "name": "Xu",
      "avatar_url": "https://avatars.githubusercontent.com/u/34770031?v=4",
      "profile": "https://github.com/Blinue",
      "contributions": [
        "maintenance"
      ]
    },
    {
      "login": "hooke007",
      "name": "hooke007",
      "avatar_url": "https://avatars.githubusercontent.com/u/41094733?v=4",
      "profile": "https://github.com/hooke007",
      "contributions": [
        "doc",
        "question",
        "userTesting",
        "code"
      ]
    },
    {
      "login": "palxex",
      "name": "Pal Lockheart",
      "avatar_url": "https://avatars.githubusercontent.com/u/58222?v=4",
      "profile": "http://palxex.ys168.com",
      "contributions": [
        "userTesting"
      ]
    },
    {
      "login": "neoKushan",
      "name": "Steve Donaghy",
      "avatar_url": "https://avatars.githubusercontent.com/u/1029699?v=4",
      "profile": "https://www.stevedonaghy.com/",
      "contributions": [
        "code",
        "translation"
      ]
    },
    {
      "login": "JeffersonQin",
      "name": "gyro永不抽风",
      "avatar_url": "https://avatars.githubusercontent.com/u/30655701?v=4",
      "profile": "http://gyrojeff.top",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ButtERRbrod",
      "name": "ButtERRbrod",
      "avatar_url": "https://avatars.githubusercontent.com/u/89013889?v=4",
      "profile": "https://github.com/ButtERRbrod",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "0x4E69676874466F78",
      "name": "NightFox",
      "avatar_url": "https://avatars.githubusercontent.com/u/4449851?v=4",
      "profile": "https://github.com/0x4E69676874466F78",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "Tzugimaa",
      "name": "Tzugimaa",
      "avatar_url": "https://avatars.githubusercontent.com/u/4981077?v=4",
      "profile": "https://github.com/Tzugimaa",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "WHMHammer",
      "name": "WHMHammer",
      "avatar_url": "https://avatars.githubusercontent.com/u/35433952?v=4",
      "profile": "https://github.com/WHMHammer",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "kato-megumi",
      "name": "kato-megumi",
      "avatar_url": "https://avatars.githubusercontent.com/u/29451351?v=4",
      "profile": "https://github.com/kato-megumi",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "MikeWang000000",
      "name": "Mike Wang",
      "avatar_url": "https://avatars.githubusercontent.com/u/11748152?v=4",
      "profile": "https://github.com/MikeWang000000",
      "contributions": [
        "userTesting"
      ]
    },
    {
      "login": "sammyhori",
      "name": "Sammy Hori",
      "avatar_url": "https://avatars.githubusercontent.com/u/116026761?v=4",
      "profile": "http://sammyhori.com",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "NeilTohno",
      "name": "NeilTohno",
      "avatar_url": "https://avatars.githubusercontent.com/u/28284594?v=4",
      "profile": "https://github.com/NeilTohno",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "a0193143",
      "name": "a0193143",
      "avatar_url": "https://avatars.githubusercontent.com/u/32773311?v=4",
      "profile": "https://github.com/a0193143",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "soulset001",
      "name": "soulset001",
      "avatar_url": "https://avatars.githubusercontent.com/u/121711747?v=4",
      "profile": "https://github.com/soulset001",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "WluhWluh",
      "name": "WluhWluh",
      "avatar_url": "https://avatars.githubusercontent.com/u/52004526?v=4",
      "profile": "https://github.com/WluhWluh",
      "contributions": [
        "design"
      ]
    },
    {
      "login": "SerdarSaglam",
      "name": "Serdar Sağlam",
      "avatar_url": "https://avatars.githubusercontent.com/u/42881121?v=4",
      "profile": "https://github.com/SerdarSaglam",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "AndrusGerman",
      "name": "Andrus Diaz German",
      "avatar_url": "https://avatars.githubusercontent.com/u/30560543?v=4",
      "profile": "https://github.com/AndrusGerman",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "Kefir2105",
      "name": "Kefir2105",
      "avatar_url": "https://avatars.githubusercontent.com/u/103105829?v=4",
      "profile": "https://github.com/Kefir2105",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "animeojisan",
      "name": "animeojisan",
      "avatar_url": "https://avatars.githubusercontent.com/u/132756551?v=4",
      "profile": "https://github.com/animeojisan",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "MuscularPuky",
      "name": "MuscularPuky",
      "avatar_url": "https://avatars.githubusercontent.com/u/93962018?v=4",
      "profile": "https://github.com/MuscularPuky",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "Zoommod",
      "name": "Zoommod",
      "avatar_url": "https://avatars.githubusercontent.com/u/71239440?v=4",
      "profile": "https://github.com/Zoommod",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "fil08",
      "name": "fil08",
      "avatar_url": "https://avatars.githubusercontent.com/u/125665523?v=4",
      "profile": "https://github.com/fil08",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "IsaiasYang",
      "name": "攸羚",
      "avatar_url": "https://avatars.githubusercontent.com/u/20205571?v=4",
      "profile": "https://github.com/IsaiasYang",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ohaiibuzzle",
      "name": "OHaiiBuzzle",
      "avatar_url": "https://avatars.githubusercontent.com/u/23693150?v=4",
      "profile": "http://ohaiibuzzle.dev",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "Rastadu23",
      "name": "Rastadu23",
      "avatar_url": "https://avatars.githubusercontent.com/u/52637051?v=4",
      "profile": "https://github.com/Rastadu23",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "hauuau",
      "name": "hauuau",
      "avatar_url": "https://avatars.githubusercontent.com/u/52239673?v=4",
      "profile": "https://github.com/hauuau",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "nellydocs",
      "name": "nellydocs",
      "avatar_url": "https://avatars.githubusercontent.com/u/71311423?v=4",
      "profile": "https://github.com/nellydocs",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "funnyplanter",
      "name": "funnyplanter",
      "avatar_url": "https://avatars.githubusercontent.com/u/173073947?v=4",
      "profile": "https://github.com/funnyplanter",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "eriforce",
      "name": "Erich Yu",
      "avatar_url": "https://avatars.githubusercontent.com/u/8393109?v=4",
      "profile": "https://github.com/eriforce",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "TamilNeram",
      "name": "தமிழ் நேரம்",
      "avatar_url": "https://avatars.githubusercontent.com/u/67970539?v=4",
      "profile": "https://github.com/TamilNeram",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "mhtvsSFrpHdE",
      "name": "mhtvsSFrpHdE",
      "avatar_url": "https://avatars.githubusercontent.com/u/10773245?v=4",
      "profile": "https://github.com/mhtvsSFrpHdE",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "kangurek-kao",
      "name": "Krzysztof",
      "avatar_url": "https://avatars.githubusercontent.com/u/116571935?v=4",
      "profile": "https://github.com/kangurek-kao",
      "contributions": [
        "translation"
      ]
    },
    {
      "login": "Howard20181",
      "name": "Howard Wu",
      "avatar_url": "https://avatars.githubusercontent.com/u/40033067?v=4",
      "profile": "https://github.com/Howard20181",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "arifpedia",
      "name": "Arif Budiman",
      "avatar_url": "https://avatars.githubusercontent.com/u/4081293?v=4",
      "profile": "https://github.com/arifpedia",
      "contributions": [
        "translation"
      ]
    }
  ],
  "contributorsPerLine": 7,
  "projectName": "Magpie",
  "projectOwner": "Blinue",
  "repoType": "github",
  "repoHost": "https://github.com",
  "skipCi": true,
  "commitConvention": "angular",
  "commitType": "docs"
}


================================================
FILE: .editorconfig
================================================
# Visual Studio 生成了具有 C++ 设置的 .editorconfig 文件。
root = true

[*.{c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tli}]

# Visual C++ 代码样式设置

cpp_generate_documentation_comments = xml

# Visual C++ 格式设置

indent_style = tab
indent_size = 4
tab_width= 4
cpp_indent_braces = false
cpp_indent_multi_line_relative_to = innermost_parenthesis
cpp_indent_within_parentheses = indent
cpp_indent_preserve_within_parentheses = false
cpp_indent_case_contents = true
cpp_indent_case_labels = false
cpp_indent_case_contents_when_block = false
cpp_indent_lambda_braces_when_parameter = false
cpp_indent_goto_labels = one_left
cpp_indent_preprocessor = leftmost_column
cpp_indent_access_specifiers = false
cpp_indent_namespace_contents = false
cpp_indent_preserve_comments = false
cpp_new_line_before_open_brace_namespace = same_line
cpp_new_line_before_open_brace_type = same_line
cpp_new_line_before_open_brace_function = same_line
cpp_new_line_before_open_brace_block = same_line
cpp_new_line_before_open_brace_lambda = same_line
cpp_new_line_scope_braces_on_separate_lines = true
cpp_new_line_close_brace_same_line_empty_type = true
cpp_new_line_close_brace_same_line_empty_function = true
cpp_new_line_before_catch = false
cpp_new_line_before_else = false
cpp_new_line_before_while_in_do_while = false
cpp_space_before_function_open_parenthesis = remove
cpp_space_within_parameter_list_parentheses = false
cpp_space_between_empty_parameter_list_parentheses = false
cpp_space_after_keywords_in_control_flow_statements = true
cpp_space_within_control_flow_statement_parentheses = false
cpp_space_before_lambda_open_parenthesis = false
cpp_space_within_cast_parentheses = false
cpp_space_after_cast_close_parenthesis = false
cpp_space_within_expression_parentheses = false
cpp_space_before_block_open_brace = true
cpp_space_between_empty_braces = false
cpp_space_before_initializer_list_open_brace = false
cpp_space_within_initializer_list_braces = true
cpp_space_preserve_in_initializer_list = true
cpp_space_before_open_square_bracket = false
cpp_space_within_square_brackets = false
cpp_space_before_empty_square_brackets = false
cpp_space_between_empty_square_brackets = false
cpp_space_group_square_brackets = true
cpp_space_within_lambda_brackets = false
cpp_space_between_empty_lambda_brackets = false
cpp_space_before_comma = false
cpp_space_after_comma = true
cpp_space_remove_around_member_operators = true
cpp_space_before_inheritance_colon = true
cpp_space_before_constructor_colon = true
cpp_space_remove_before_semicolon = true
cpp_space_after_semicolon = true
cpp_space_remove_around_unary_operator = true
cpp_space_around_binary_operator = insert
cpp_space_around_assignment_operator = insert
cpp_space_pointer_reference_alignment = left
cpp_space_around_ternary_operator = insert
cpp_use_unreal_engine_macro_formatting = true
cpp_wrap_preserve_blocks = one_liners

# Visual C++ 包含清理设置

cpp_include_cleanup_add_missing_error_tag_type = none
cpp_include_cleanup_remove_unused_error_tag_type = dimmed
cpp_include_cleanup_optimize_unused_error_tag_type = suggestion
cpp_include_cleanup_sort_after_edits = false
cpp_sort_includes_error_tag_type = suggestion
cpp_sort_includes_priority_case_sensitive = false
cpp_sort_includes_priority_style = quoted
cpp_includes_style = default
cpp_includes_use_forward_slash = true


================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .github/ISSUE_TEMPLATE/01_bug.yaml
================================================
name: Bug 错误
description: Report bugs 报告错误
labels: bug
body:
- type: input
  attributes:
    label: Magpie version 程序版本
  validations:
    required: true
- type: input
  attributes:
    label: Windows version 系统版本
    placeholder: >
      win10 2004
  validations:
    required: true
- type: textarea
  attributes:
    label: Related screenshot (optional) 相关截图(可选)
- type: textarea
  attributes:
    label: Reproduction steps 复现步骤
    description: Describe the reproduction steps precisely if possible. 尽可能详细描述错误产生的细节。
  validations:
    required: true
- type: textarea
  attributes:
    label: Log files 日志文件
    description: >
      Post the logs that in the `logs` folder, which will help analyse the causes. 上传logs目录中的文件有助于分析原因。

      Please upload the logs as attachments, rather than copying the content of them. 请以附件的形式上传日志,而不是将其中的内容复制到正文中。
  validations:
    required: true


================================================
FILE: .github/ISSUE_TEMPLATE/02_performance.yaml
================================================
name: Performance 性能
description: obvious performance problems at runtime 运行时有显著的性能衰减
labels: performance
body:
- type: markdown
  attributes:
    value: >
      Report the issues related with performance regression, such as output-lag / high usage of CPU / low FPS ...

      如遇较为严重的性能问题例如卡顿、过高的性能占用、较低的帧率等异常情况,在此报告。
- type: input
  attributes:
    label: Program(Game) 游戏名
    placeholder: "StarCraft"
  validations:
    required: true
- type: input
  attributes:
    label: Capture method 捕获模式
    placeholder: "GDI"
  validations:
    required: true
- type: textarea
  attributes:
    label: Related screenshot (optional) 相关截图(可选)
- type: textarea
  attributes:
    label: Other information (optional) 补充信息(可选)
- type: textarea
  attributes:
    label: Log files 日志文件
    description: >
      Post the logs that in the `logs` folder, which will help analyse the causes. 上传logs目录中的文件有助于分析原因。
      
      Please upload the logs as attachments, rather than copying the content of them. 请以附件的形式上传日志,而不是将其中的内容复制到正文中。
  validations:
    required: true


================================================
FILE: .github/ISSUE_TEMPLATE/03_request.yaml
================================================
name: Feature Request 功能请求
description: Create the request for a new feature 提出一个增加新功能的请求
labels: enhancement
body:
- type: markdown
  attributes:
    value: >
      Make sure it hasn't been mentioned before. If you are recommending a new effect, please provide its name and existing shader implementations (if any). A comparison with existing effects is very helpful.

      确保此类请求之前尚未被其他人提出过。如果你想推荐一个新的效果,请明确说明它的名称,适用场景以及已有的着色器实现(如果有的话),另外强烈建议你附上和现有效果的对比图。
- type: textarea
  attributes:
    label: Expected behavior 预期的功能
  validations:
    required: true
- type: textarea
  attributes:
    label: Alternative behavior (optional) 近似的功能(可选)


================================================
FILE: .github/ISSUE_TEMPLATE/04_question.yaml
================================================
name: Q&A 问询
description: Ask questions about Magpie 提出关于magpie的问题
labels: question
body:
- type: markdown
  attributes:
    value: >
      Before asking questions, make sure it hasn't been mentioned before.

      提问之前应先检索以下列表检查是否已有相关的回答。

      https://github.com/Blinue/Magpie/labels/question

      https://github.com/Blinue/Magpie/wiki/FAQ

      Issues about compilation can also be reported here. Check if you follow the instruction below.

      编译相关的疑问也可在此提出,首先检查是否按照如下说明的流程编译。

      https://github.com/Blinue/Magpie/wiki/%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97

      Don't ask questions about bugs. To open the right template from the previous selection.

      程序报错不要使用此模板,应该返回上级重新选择 `Bug 错误` 选项。
- type: textarea
  attributes:
    label: Question 问题
  validations:
    required: true
- type: textarea
  attributes:
    label: Logs files (optional) 日志文件(可选)
    description: >
      It's not necessary but if you want to post to help describe your problem. 不必上传日志,但是你想借此描述你的问题也可以。
      
      Please upload the logs as attachments, rather than copying the content of them. 请以附件的形式上传日志,而不是将其中的内容复制到正文中。


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Discussions 讨论
    url: https://github.com/Blinue/Magpie/discussions
    about: Feel free to talk about something here 自由交流论坛


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/build.yml
================================================
name: build

on:
  push:
    paths: [ '.github/workflows/build.yml', 'Magpie.slnx', '*.props', 'scripts/publish.py', 'src/**' ]
  pull_request:
    paths: [ '.github/workflows/build.yml', 'Magpie.slnx', '*.props', 'scripts/publish.py', 'src/**' ]

jobs:
  build:
    runs-on: windows-2025-vs2026
    strategy:
      matrix:
        compiler: ["MSVC", "ClangCL"]
        platform: ["x64", "ARM64"]

    steps:
    - uses: actions/checkout@v6

    - uses: actions/setup-python@v6
      with:
        python-version: '3.13'

    - name: Setup Conan
      run: pip install conan

    - name: Load Conan cache
      uses: actions/cache@v5
      with:
        path: ~/.conan2/p
        key: Conan-${{ hashFiles('src/**/conanfile.txt') }}-${{ matrix.compiler }}-${{ matrix.platform }}

    - name: Build
      if: github.ref != 'refs/heads/dev' && github.ref != 'refs/heads/main'
      run: python scripts/publish.py --compiler=${{ matrix.compiler }} --platform=${{ matrix.platform }}

    - name: Build and sign
      if: github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main'
      run: python scripts/publish.py --compiler=${{ matrix.compiler }} --platform=${{ matrix.platform }} --pfx-path=certs\Magpie.pfx --pfx-password="${{ secrets.MAGPIE_PFX_PASSWORD }}"

    - name: Save hash
      id: hash
      run: echo "sha_short=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT

    - name: Store build
      uses: actions/upload-artifact@v7
      with: 
          name: Magpie-dev-${{ steps.hash.outputs.sha_short }}-${{ matrix.compiler }}-${{ matrix.platform }}
          path: ./publish/${{ matrix.platform }}


================================================
FILE: .github/workflows/release.yml
================================================
name: Publish release

on:
  workflow_dispatch:
    inputs:
      major:
        description: 'Major'
        required: true
        type: number
      minor:
        description: 'Minor'
        required: true
        type: number
      patch:
        description: 'Patch'
        required: true
        type: number
      tag:
        description: 'Tag'
        required: false
        type: string
      prerelease:
        description: 'Prerelease'
        required: true
        type: boolean
jobs:
  build:
    runs-on: windows-2025-vs2026
    outputs:
      tag: ${{ steps.tag.outputs.tag }}
    strategy:
      matrix:
        platform: ["x64", "ARM64"]
    steps:
    - uses: actions/checkout@v6

    - uses: actions/setup-python@v6
      with:
        python-version: '3.13'

    - name: Setup Conan
      run: pip install conan
    
    - name: Generate tag
      id: tag
      run: |
        $tag = "${{ inputs.tag }}" -eq "" ? "v${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }}" : "${{ inputs.tag }}"
        echo "tag=$tag" >> $env:GITHUB_OUTPUT

    - name: Build
      run: |
        $versionString = "${{ steps.tag.outputs.tag }}" -replace "^v(?=\d)", ""
        python scripts/publish.py --compiler=ClangCL --platform=${{ matrix.platform }} --version-major=${{ inputs.major }} --version-minor=${{ inputs.minor }} --version-patch=${{ inputs.patch }} --version-string=$versionString --pfx-path=certs\Magpie.pfx --pfx-password="${{ secrets.MAGPIE_PFX_PASSWORD }}"
    
    - name: Store artifacts
      uses: actions/upload-artifact@v7
      with: 
          name: Magpie-${{ steps.tag.outputs.tag }}-${{ matrix.platform }}
          path: publish/${{ matrix.platform }}
  release:
    runs-on: windows-latest
    needs: build
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: '3.13'

      - name: Setup Requests
        run: pip install requests
      
      - name: Restore artifacts
        uses: actions/download-artifact@v8
        with:
          path: publish
      
      - name: Publish release
        run: python scripts/release.py ${{ inputs.major }} ${{ inputs.minor }} ${{ inputs.patch }} ${{ needs.build.outputs.tag }} ${{ inputs.prerelease }} ${{ secrets.CONTENTS_ACCESS_TOKEN }}


================================================
FILE: .github/workflows/wiki.yml
================================================
name: Publish wiki

on:
  push:
    branches: [ main ]
    paths: [ '.github/workflows/wiki.yml', 'docs/**', 'scripts/wiki.py' ]

jobs:
  publish:
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: '3.13'

      - name: Upload documentations to wiki
        run: python scripts/wiki.py ${{ secrets.CONTENTS_ACCESS_TOKEN }}


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

.conan/
my_*/

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
build/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml

================================================
FILE: CONTRIBUTING.md
================================================
# Contribution Guide

**First of all, thank you for spending your valuable time on this project!**

Magpie is a personal project, initially inspired by IntegerScaler and Lossless Scaling. However, the project has become much more powerful than its predecessors. Due to the limited capability and energy of the developers, we welcome any form of contribution to this project! Magpie follows the [All Contributors](https://github.com/all-contributors/all-contributors) protocol. No matter in what form you contributed to the project (e.g. code, document, test, etc.), the developer will add you to the contributors list as long as you contributed enough.

If you are new here, we strongly recommend you to read [this article](https://opensourceway.community/open-source-guide/how-to-contribute/) (it's in Chinese).

Below are some types of contributions you might want to make:

### I have a question 🙏

[FAQ](https://github.com/Blinue/Magpie/wiki/FAQ_EN) includes most of the common questions asked. You can also search in [Issue](https://github.com/Blinue/Magpie/issues) and [Discussion](https://github.com/Blinue/Magpie/discussions) to see if anyone has raised the same question before. Feel free to go ahead and ask in Discussion if not.

### I encountered an error 🐞

Magpie hasn't been thoroughly tested, so errors are inevitable. We hope you can let us know about the errors, which helps everyone having the same problems.

Please start by searching the errors in Issues and Discussions to avoid duplicate questions. Please publish a [Issue (bug report)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=bug&template=01_bug.yaml). Here are some best practices to help the developers to quickly locate the error:

1. Choose a clear and simple subject. For example, "The rounded corner of windows in Windows 11 causes the top-left and bottom-right corners to be blurry" is an excellent subject. "Application Error," on the other hand, is hard to interpret.
2. It is especially helpful to upload the log files, which are stored in the logs folder. **Please upload the logs as attachments rather than copying their content.**
3. Please specify in details how to replicate the errors. It would be ideal if you also provide us with some screenshots.
4. Additional information may be helpful for the developers. e.g. special display configurations, graphics card models, etc.

### I have a feature request 🚀

Please share any "whimsy" you have with the developers! We merely added the features based on our experience. Your ideas, however, may make a difference!

Please search in [Issue](https://github.com/Blinue/Magpie/issues) first for your feature requests to make sure they're not duplicate. Please also check [Projects](https://github.com/Blinue/Magpie/projects) (in Chinese) to see if the features have already been implemented. Please submit a [Issue (feature request)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=enhancement&template=03_request.yaml) with detailed descriptions of your suggestion, for example, if other applications have implemented similar features.

**If you'd like a new special effect to be added, please specify its name, use cases, and existing shader implementation (if exists). We also strongly recommend you to attach a comparison image with the current special effects.**

### I'd like to contribute code 💻

Contributing code is the more direct way to help Magpie. You may fix bugs, add new features, or correct formatting issues. You are not limited by the magnitude of the contribution. Every line is important!

Like all other open source projects, you need to initiate pull requests to contribute codes for Magpie. The developers may ask you to make some modifications. Your pull request may be closed if you fail to respond in a timely manner. You should merge your commits into the dev branch.

**Note: once you contribute code to Magpie, you are agreeing to transfer the copyright of that code to the current copyright owner of Magpie.** This allows developers to make important decisions (like changing the license) without getting consent from every single contributor. The developers promise that the only changes in license will be shifting to newer versions of GPL. If you'd like to keep your copyrights, you will have to quit contributing and to apply the changes only to your forks.

You need to follow the following rules when contributing code:

1. Keep in the same style as that of the current code, including no change-of-line for curly brackets, using tabs for indentation, the ways to name variables, classes, and source files, using UTF-8 without BOM encoding, preferring single-line comments, and using git-style messages, etc. Please install [XamlStyler](https://github.com/Xavalon/XamlStyler) for formatting XAML files. Here is an example:
    ``` c++
    // ClassName.h
    
    class ClassName {
    public:
        void Test1();

    private:
        void _PrivateTest1();

        int _m1 = 0;
    };
    
    // ClassName.cpp
    
    void ClassName::Test1() {
        if (_m1 <= 0) {
            ++_m1;
        }
    }

    void ClassName::_PrivateTest1() {
        try {
            _m1 = std::stoi("123");
        } catch (std::exception& e) {
            // Error Handling
        }

        int sum = 0;
        for (int i = 0; i < _m1; ++i) {
            sum += i;
        }
    }
    ```
2. Check [Projects](https://github.com/Blinue/Magpie/projects) or submit pull requests to communicate with the developers before you make major changes to make sure they align with the road map of the project.
3. Your branch must compile.

### I'd like to contribute translations 🌍

We are using Weblate for localization work. If you'd like to help translate Magpie into more languages, please visit https://hosted.weblate.org/projects/magpie.

### I'd like to contribute to the documentations 📖

Because of the laziness of the developers, the documentation of Magpie is constantly missing or out of date. Contributions to documentation are more than welcome! The MagPie wiki is automatically published from the docs folder in the `main` branch, so editing the documentation follows the same procedures of contributing code.

Please merge to the `main` branch if you are improving the documentations of existing features. Otherwise merge to the `dev` branch. All changes in the `dev` branch will be merged to the `main` branch when new versions are released, this will also trigger the wiki will to be updated as well.

### I'd like to fund Magpie 💰

The developers spend a lot of time every week to implement new features without getting paid. Currently there is no way to fund Magpie. Starring, forking, and advertising are the best ways to support us!


================================================
FILE: CONTRIBUTING_ZH.md
================================================
# 贡献指南

**首先,感谢你将宝贵的时间花费在本项目上!** 

Magpie 是一个个人项目,最早启发于 IntegerScaler 和 Lossless Scaling,但现在它比前辈们强大的多。开发者的能力和精力有限,因此欢迎任何形式的贡献!Magpie 遵循 [All Contributors](https://github.com/all-contributors/all-contributors) 规范,无论你以何种形式做出贡献,诸如编写代码、撰写文档、用户测试等,只要你的贡献足够,开发者都会把你加入贡献者清单。

如果你是新手,强烈推荐你读一下[这篇文章](https://opensourceway.community/open-source-guide/how-to-contribute/)。

下面是一些你可能想做的贡献:

### 我有一个问题 🙏

[FAQ](https://github.com/Blinue/Magpie/wiki/FAQ) 汇总了常见的问题,你也可以搜索 [Issue](https://github.com/Blinue/Magpie/issues) 和 [Discussion](https://github.com/Blinue/Magpie/discussions) 看是否已经有人提出过。如果依然没有得到解答,请在 Discussion 中询问。

### 我遇到了一个错误 🐞

Magpie 没有广泛的测试过,因此错误不可避免。希望你能向开发者反馈这个错误,这样可以帮助所有和你遇到同样问题的人。

首先请在 Issue 和 Discussion 中搜索你遇到的错误,避免和现有 Issue 重复。汇报错误时请发布一个 [Issue(bug report)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=bug&template=01_bug.yaml),下面是一些有利于开发者快速定位问题的最佳实践:

1. 选择一个清晰简洁的标题。如 “Windows 11窗口圆角导致游戏窗口超分后左下/右下角模糊” 是一个好标题,而 “应用程序错误” 则意义不明。
2. 上传日志文件对定位问题特别有帮助,它们位于 logs 文件夹下。**请以附件的形式上传日志,而不是将其中的内容复制到正文中。**
3. 请详细的描述复现步骤,最好提供一些截图。
4. 还有一些信息可能对开发者有帮助,比如特殊的显示器配置,显卡型号等。

### 我有一个功能建议 🚀

你可能有一些关于 Magpie 的奇思妙想,请和开发者分享它们!开发者通常只是通过自己的使用经验添加新功能,但你的点子可能会使 Magpie 与众不同。

首先请在 Issue 中搜索你的功能建议,确保不和已有的重复,尤其要查看 [Projects](https://github.com/Blinue/Magpie/projects) 里是否有这个功能。然后提交一个 [Issue (feature request)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=enhancement&template=03_request.yaml) 详细地描述你的建议,比如是否有其他软件实现了类似的功能。

**如果你想建议一个新的效果,请明确说明它的名称,适用场景以及已有的着色器实现(如果有的话),另外强烈建议你附上和现有效果的对比图。**

### 我想贡献代码 💻

贡献代码是帮助 Magpie 项目最直接的方式,你可以修复 bug,增加新功能或修正格式错误。不要因为修改太小就羞于贡献,你的每一行修改都很重要。

和所有开源项目一样,你需要提交 pull request 来向 Magpie 贡献代码。开发者可能会要求你做一些更改,如果你无法及时响应,你的 pull request 可能会被关闭。你应将提交合并到 dev 分支。

**注意:一旦你向 Magpie 贡献代码,便表示你同意将该代码的版权转让给 Magpie 当前的版权所有者。** 这是为了使开发者做出重大决定(如更换许可证)时无需征得每一个贡献者的同意。开发者承诺 Magpie 项目更换许可证的唯一情形是迁移到更新版本的 GPL 协议。如果你想保留版权,只能放弃贡献,将更改保留在自己的 Fork 中。

贡献代码时你需要遵守一些准则:

1. 和现有的代码风格保持一致,包括花括号不换行,tab 缩进,变量、类、源文件等的命名方式,所有源码文件格式均为 UTF-8 without BOM,倾向于使用行注释,git 消息风格等等。格式化 XAML 文件时请安装 [XamlStyler](https://github.com/Xavalon/XamlStyler) 插件。下面是一个代码风格的示例:
    ``` c++
    // ClassName.h
    
    class ClassName {
    public:
        void Test1();

    private:
        void _PrivateTest1();

        int _m1 = 0;
    };
    
    // ClassName.cpp
    
    void ClassName::Test1() {
        if (_m1 <= 0) {
            ++_m1;
        }
    }

    void ClassName::_PrivateTest1() {
        try {
            _m1 = std::stoi("123");
        } catch (std::exception& e) {
            // 错误处理
        }

        int sum = 0;
        for (int i = 0; i < _m1; ++i) {
            sum += i;
        }
    }
    ```
2. 如果你要进行比较大的更改请先查看 [Projects](https://github.com/Blinue/Magpie/projects) 或提交 pull request 和开发者交流,确保和项目当前的方向一致。
3. 你的分支必须可以通过编译检查。

### 我想贡献翻译 🌍

我们使用 Weblate 进行本地化工作。如果你想帮助将 Magpie 翻译成更多语言,请前往 https://hosted.weblate.org/projects/magpie 。

### 我想贡献文档 📖

因为开发者的懒惰,Magpie 的文档长期处于缺失/过时的状态,因此文档的贡献是非常欢迎的。Magpie 的 wiki 是从 main 分支的 docs 文件夹自动发布的,因此修改文档和[贡献代码](#我想贡献代码-)的方式相同。

如果你想改进已发布功能的文档,请合并到 main 分支,否则请合并到 dev 分支。每次发布版本时,dev 分支的更改都将合并到 main 分支,wiki 也会相应的自动更新。

### 我想资助 Magpie 💰

请点击页面上方的 "Sponsor" 按钮,非常感谢你的支持。如果能从中获益,我便会将更多精力投入开源项目的开发和维护。


================================================
FILE: Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="Configuration">
    <PreferredToolArchitecture Condition="'$(PreferredToolArchitecture)' == ''">x64</PreferredToolArchitecture>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <ClCompile>
      <LanguageStandard>stdcpp20</LanguageStandard>
      <LanguageStandard_C>stdc17</LanguageStandard_C>
      <ConformanceMode>true</ConformanceMode>
      <!-- 禁用 RTTI ,因为它会导致二进制膨胀 -->
      <RuntimeTypeInfo>false</RuntimeTypeInfo>
      <SDLCheck>true</SDLCheck>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <WarningLevel>Level4</WarningLevel>
      <!-- /utf-8: 源代码使用 UTF-8 格式 -->
      <!-- /Zc:__cplusplus: 更新 __cplusplus 宏 -->
      <!-- /volatile:iso: 禁用 volatile 的语义扩展 -->
      <AdditionalOptions>/utf-8 /Zc:__cplusplus /volatile:iso %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: Magpie.slnx
================================================
<Solution>
  <Configurations>
    <Platform Name="ARM64" />
    <Platform Name="x64" />
  </Configurations>
  <Folder Name="/Solution Items/">
    <File Path="Directory.Build.props" />
    <File Path="src/BuildOptions.props" />
    <File Path="src/Common.Post.props" />
    <File Path="src/Common.Pre.props" />
    <File Path="src/HybridCRT.props" />
    <File Path="src/WinUI.targets" />
  </Folder>
  <Folder Name="/Solution Items/Natvis/">
    <File Path="natvis/magpie.natvis" />
    <File Path="natvis/phmap.natvis" />
    <File Path="natvis/rapidjson.natvis" />
  </Folder>
  <Project Path="src/Effects/Effects.vcxproj" Id="62503530-b84b-4cc2-80b6-3f89618172b7" />
  <Project Path="src/Magpie.Core/Magpie.Core.vcxproj" Id="0e5205ae-dfa9-4cb8-b662-e43cd6512e2a">
    <BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
  </Project>
  <Project Path="src/Magpie/Magpie.vcxproj" Id="1239537c-e5b8-427a-9e7f-ea443d1f3529" DefaultStartup="true">
    <BuildDependency Project="src/Effects/Effects.vcxproj" />
    <BuildDependency Project="src/TouchHelper/TouchHelper.vcxproj" />
    <BuildDependency Project="src/Updater/Updater.vcxproj" />
    <BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
  </Project>
  <Project Path="src/Shared/Shared.vcxitems" Id="aabda3a3-7b23-4189-895b-f68a4c6b14c2" />
  <Project Path="src/TouchHelper/TouchHelper.vcxproj" Id="05b51bb8-08cb-4907-884f-8e2ad6bf6052">
    <BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
  </Project>
  <Project Path="src/Updater/Updater.vcxproj" Id="e82b7a20-0557-4dc1-b418-87977d7450a4">
    <BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
  </Project>
  <Project Path="src/_ConanDeps/_ConanDeps.vcxproj" Id="456ccae4-2c51-4cf2-8d3a-1efce8c41a2d" />
</Solution>


================================================
FILE: README.md
================================================
<br>
<p align="center">
  <img src="./src/Magpie/Icons/SVG/Magpie Icon Full Disabled.svg" width="150px" height="150px" alt="Logo">
</p>
<h1 align="center">Magpie</h1>

<div align="center">

[![License](https://img.shields.io/github/license/Blinue/Magpie)](./LICENSE)
[![build](https://github.com/Blinue/Magpie/actions/workflows/build.yml/badge.svg)](https://github.com/Blinue/Magpie/actions/workflows/build.yml)
[![All Contributors](https://img.shields.io/github/all-contributors/Blinue/Magpie)](#acknowledgement-)
[![Translation status](https://hosted.weblate.org/widget/magpie/svg-badge.svg)](https://hosted.weblate.org/engage/magpie)

</div>

🌍 **English** | [简体中文](./README_ZH.md)

Magpie is a lightweight window upscaling tool that comes equipped with a variety of efficient scaling algorithms and filters.

👉 [Download](https://github.com/Blinue/Magpie/releases)

👉 [FAQ](https://github.com/Blinue/Magpie/wiki/FAQ%20(EN))

👉 [Built-in effects](https://github.com/Blinue/Magpie/wiki/Built-in%20effects)

👉 [Compilation guide](https://github.com/Blinue/Magpie/wiki/Compilation%20guide)

## Features

* Supports both fullscreen and windowed scaling
* Includes a variety of built-in algorithms and filters, including [Anime4K](https://github.com/bloc97/Anime4K), [FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR), CRT shaders, and more
* WinUI-based user interface with support for light and dark themes
* Multi-monitor support

## Screenshots

<div style="display:flex; gap:10px;">
  <img src="img/main-window.png" alt= "Main window" height="300">
  <img src="img/screenshot.png" alt= "Main window" height="300">
</div>

## Hints

1. If you have set DPI scaling and the window you want to scale does not support high DPI (which is common in older games), it is recommended to first enter the program's compatibility settings and set "High DPI scaling override" to "Application".

2. Some games support zooming the window, but with extremely naive algorithms. Please set the resolution to the built-in (best) option.

## System requirements

1. Windows 10 v1903+ or Windows 11
2. DirectX feature level 11

## Localization

Thanks to [Weblate](https://weblate.org) for hosting! Click the image below to visit the translation page.

[![Translation status](https://hosted.weblate.org/widget/magpie/multi-auto.svg)](https://hosted.weblate.org/engage/magpie)

## Acknowledgement

Thanks go to these wonderful people:

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Blinue"><img src="https://avatars.githubusercontent.com/u/34770031?v=4?s=100" width="100px;" alt="Xu"/><br /><sub><b>Xu</b></sub></a><br /><a href="#maintenance-Blinue" title="Maintenance">🚧</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hooke007"><img src="https://avatars.githubusercontent.com/u/41094733?v=4?s=100" width="100px;" alt="hooke007"/><br /><sub><b>hooke007</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=hooke007" title="Documentation">📖</a> <a href="#question-hooke007" title="Answering Questions">💬</a> <a href="#userTesting-hooke007" title="User Testing">📓</a> <a href="https://github.com/Blinue/Magpie/commits?author=hooke007" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://palxex.ys168.com"><img src="https://avatars.githubusercontent.com/u/58222?v=4?s=100" width="100px;" alt="Pal Lockheart"/><br /><sub><b>Pal Lockheart</b></sub></a><br /><a href="#userTesting-palxex" title="User Testing">📓</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://www.stevedonaghy.com/"><img src="https://avatars.githubusercontent.com/u/1029699?v=4?s=100" width="100px;" alt="Steve Donaghy"/><br /><sub><b>Steve Donaghy</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=neoKushan" title="Code">💻</a> <a href="#translation-neoKushan" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://gyrojeff.top"><img src="https://avatars.githubusercontent.com/u/30655701?v=4?s=100" width="100px;" alt="gyro永不抽风"/><br /><sub><b>gyro永不抽风</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=JeffersonQin" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ButtERRbrod"><img src="https://avatars.githubusercontent.com/u/89013889?v=4?s=100" width="100px;" alt="ButtERRbrod"/><br /><sub><b>ButtERRbrod</b></sub></a><br /><a href="#translation-ButtERRbrod" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/0x4E69676874466F78"><img src="https://avatars.githubusercontent.com/u/4449851?v=4?s=100" width="100px;" alt="NightFox"/><br /><sub><b>NightFox</b></sub></a><br /><a href="#translation-0x4E69676874466F78" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Tzugimaa"><img src="https://avatars.githubusercontent.com/u/4981077?v=4?s=100" width="100px;" alt="Tzugimaa"/><br /><sub><b>Tzugimaa</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Tzugimaa" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/WHMHammer"><img src="https://avatars.githubusercontent.com/u/35433952?v=4?s=100" width="100px;" alt="WHMHammer"/><br /><sub><b>WHMHammer</b></sub></a><br /><a href="#translation-WHMHammer" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/kato-megumi"><img src="https://avatars.githubusercontent.com/u/29451351?v=4?s=100" width="100px;" alt="kato-megumi"/><br /><sub><b>kato-megumi</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=kato-megumi" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/MikeWang000000"><img src="https://avatars.githubusercontent.com/u/11748152?v=4?s=100" width="100px;" alt="Mike Wang"/><br /><sub><b>Mike Wang</b></sub></a><br /><a href="#userTesting-MikeWang000000" title="User Testing">📓</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://sammyhori.com"><img src="https://avatars.githubusercontent.com/u/116026761?v=4?s=100" width="100px;" alt="Sammy Hori"/><br /><sub><b>Sammy Hori</b></sub></a><br /><a href="#translation-sammyhori" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/NeilTohno"><img src="https://avatars.githubusercontent.com/u/28284594?v=4?s=100" width="100px;" alt="NeilTohno"/><br /><sub><b>NeilTohno</b></sub></a><br /><a href="#translation-NeilTohno" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/a0193143"><img src="https://avatars.githubusercontent.com/u/32773311?v=4?s=100" width="100px;" alt="a0193143"/><br /><sub><b>a0193143</b></sub></a><br /><a href="#translation-a0193143" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/soulset001"><img src="https://avatars.githubusercontent.com/u/121711747?v=4?s=100" width="100px;" alt="soulset001"/><br /><sub><b>soulset001</b></sub></a><br /><a href="#translation-soulset001" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/WluhWluh"><img src="https://avatars.githubusercontent.com/u/52004526?v=4?s=100" width="100px;" alt="WluhWluh"/><br /><sub><b>WluhWluh</b></sub></a><br /><a href="#design-WluhWluh" title="Design">🎨</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/SerdarSaglam"><img src="https://avatars.githubusercontent.com/u/42881121?v=4?s=100" width="100px;" alt="Serdar Sağlam"/><br /><sub><b>Serdar Sağlam</b></sub></a><br /><a href="#translation-SerdarSaglam" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/AndrusGerman"><img src="https://avatars.githubusercontent.com/u/30560543?v=4?s=100" width="100px;" alt="Andrus Diaz German"/><br /><sub><b>Andrus Diaz German</b></sub></a><br /><a href="#translation-AndrusGerman" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Kefir2105"><img src="https://avatars.githubusercontent.com/u/103105829?v=4?s=100" width="100px;" alt="Kefir2105"/><br /><sub><b>Kefir2105</b></sub></a><br /><a href="#translation-Kefir2105" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/animeojisan"><img src="https://avatars.githubusercontent.com/u/132756551?v=4?s=100" width="100px;" alt="animeojisan"/><br /><sub><b>animeojisan</b></sub></a><br /><a href="#translation-animeojisan" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/MuscularPuky"><img src="https://avatars.githubusercontent.com/u/93962018?v=4?s=100" width="100px;" alt="MuscularPuky"/><br /><sub><b>MuscularPuky</b></sub></a><br /><a href="#translation-MuscularPuky" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Zoommod"><img src="https://avatars.githubusercontent.com/u/71239440?v=4?s=100" width="100px;" alt="Zoommod"/><br /><sub><b>Zoommod</b></sub></a><br /><a href="#translation-Zoommod" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/fil08"><img src="https://avatars.githubusercontent.com/u/125665523?v=4?s=100" width="100px;" alt="fil08"/><br /><sub><b>fil08</b></sub></a><br /><a href="#translation-fil08" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/IsaiasYang"><img src="https://avatars.githubusercontent.com/u/20205571?v=4?s=100" width="100px;" alt="攸羚"/><br /><sub><b>攸羚</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=IsaiasYang" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://ohaiibuzzle.dev"><img src="https://avatars.githubusercontent.com/u/23693150?v=4?s=100" width="100px;" alt="OHaiiBuzzle"/><br /><sub><b>OHaiiBuzzle</b></sub></a><br /><a href="#translation-ohaiibuzzle" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Rastadu23"><img src="https://avatars.githubusercontent.com/u/52637051?v=4?s=100" width="100px;" alt="Rastadu23"/><br /><sub><b>Rastadu23</b></sub></a><br /><a href="#translation-Rastadu23" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hauuau"><img src="https://avatars.githubusercontent.com/u/52239673?v=4?s=100" width="100px;" alt="hauuau"/><br /><sub><b>hauuau</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=hauuau" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/nellydocs"><img src="https://avatars.githubusercontent.com/u/71311423?v=4?s=100" width="100px;" alt="nellydocs"/><br /><sub><b>nellydocs</b></sub></a><br /><a href="#translation-nellydocs" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/funnyplanter"><img src="https://avatars.githubusercontent.com/u/173073947?v=4?s=100" width="100px;" alt="funnyplanter"/><br /><sub><b>funnyplanter</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=funnyplanter" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/eriforce"><img src="https://avatars.githubusercontent.com/u/8393109?v=4?s=100" width="100px;" alt="Erich Yu"/><br /><sub><b>Erich Yu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=eriforce" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Howard20181"><img src="https://avatars.githubusercontent.com/u/40033067?v=4?s=100" width="100px;" alt="Howard Wu"/><br /><sub><b>Howard Wu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Howard20181" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/arifpedia"><img src="https://avatars.githubusercontent.com/u/4081293?v=4?s=100" width="100px;" alt="Arif Budiman"/><br /><sub><b>Arif Budiman</b></sub></a><br /><a href="#translation-arifpedia" title="Translation">🌍</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://allcontributors.org/) specification. Contributions of any kind are welcome!

## License

This project is licensed under GPLv3.


================================================
FILE: README_ZH.md
================================================
<br>
<p align="center">
  <img src="./src/Magpie/Icons/SVG/Magpie Icon Full Disabled.svg" width="150px" height="150px" alt="Logo">
</p>
<h1 align="center">Magpie</h1>

<div align="center">

[![许可协议](https://img.shields.io/github/license/Blinue/Magpie)](./LICENSE)
[![build](https://github.com/Blinue/Magpie/actions/workflows/build.yml/badge.svg)](https://github.com/Blinue/Magpie/actions/workflows/build.yml)
[![All Contributors](https://img.shields.io/github/all-contributors/Blinue/Magpie)](#%E8%B4%A1%E7%8C%AE%E8%80%85-)
[![翻译状态](https://hosted.weblate.org/widget/magpie/svg-badge.svg)](https://hosted.weblate.org/engage/magpie)

</div>

🌍 [English](./README.md) | **简体中文**

Magpie 是一个轻量级的窗口超分辨率工具,内置众多高效的算法和滤镜。

👉 [下载](https://github.com/Blinue/Magpie/releases)

👉 [FAQ](https://github.com/Blinue/Magpie/wiki/FAQ)

👉 [内置效果介绍](https://github.com/Blinue/Magpie/wiki/内置效果介绍)

👉 [编译指南](https://github.com/Blinue/Magpie/wiki/编译指南)

## 功能

* 支持全屏和窗口模式缩放
* 众多内置算法和滤镜,如 [Anime4K](https://github.com/bloc97/Anime4K)、[FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR)、CRT 着色器等
* 基于 WinUI 的用户界面,支持浅色和深色主题
* 支持多屏幕

## 截图

<div style="display:flex; gap:10px;">
  <img src="img/main-window-zh.png" alt= "Main window" height="300">
  <img src="img/screenshot.png" alt= "Main window" height="300">
</div>

## 使用提示

1. 如果你设置了 DPI 缩放,而要放大的窗口没有高 DPI 支持(这在老游戏中很常见),推荐首先进入该程序的兼容性设置,将“高 DPI 缩放替代”设置为“应用程序”。
2. 一些游戏支持调整窗口的大小,但只使用简单的缩放算法,这时请先将其设为原始(最佳)分辨率。

## 系统需求

1. Windows 10 v1903+ 或 Windows 11
2. DirectX 功能级别 11

## 本地化

感谢 [Weblate](https://weblate.org) 提供托管服务!点击下面的图片可以进入翻译页面。

[![翻译状态](https://hosted.weblate.org/widget/magpie/multi-auto.svg)](https://hosted.weblate.org/engage/magpie)

## 贡献者

衷心感谢所有为本项目做出贡献的人:

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Blinue"><img src="https://avatars.githubusercontent.com/u/34770031?v=4?s=100" width="100px;" alt="Xu"/><br /><sub><b>Xu</b></sub></a><br /><a href="#maintenance-Blinue" title="Maintenance">🚧</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hooke007"><img src="https://avatars.githubusercontent.com/u/41094733?v=4?s=100" width="100px;" alt="hooke007"/><br /><sub><b>hooke007</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=hooke007" title="Documentation">📖</a> <a href="#question-hooke007" title="Answering Questions">💬</a> <a href="#userTesting-hooke007" title="User Testing">📓</a> <a href="https://github.com/Blinue/Magpie/commits?author=hooke007" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://palxex.ys168.com"><img src="https://avatars.githubusercontent.com/u/58222?v=4?s=100" width="100px;" alt="Pal Lockheart"/><br /><sub><b>Pal Lockheart</b></sub></a><br /><a href="#userTesting-palxex" title="User Testing">📓</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://www.stevedonaghy.com/"><img src="https://avatars.githubusercontent.com/u/1029699?v=4?s=100" width="100px;" alt="Steve Donaghy"/><br /><sub><b>Steve Donaghy</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=neoKushan" title="Code">💻</a> <a href="#translation-neoKushan" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://gyrojeff.top"><img src="https://avatars.githubusercontent.com/u/30655701?v=4?s=100" width="100px;" alt="gyro永不抽风"/><br /><sub><b>gyro永不抽风</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=JeffersonQin" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ButtERRbrod"><img src="https://avatars.githubusercontent.com/u/89013889?v=4?s=100" width="100px;" alt="ButtERRbrod"/><br /><sub><b>ButtERRbrod</b></sub></a><br /><a href="#translation-ButtERRbrod" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/0x4E69676874466F78"><img src="https://avatars.githubusercontent.com/u/4449851?v=4?s=100" width="100px;" alt="NightFox"/><br /><sub><b>NightFox</b></sub></a><br /><a href="#translation-0x4E69676874466F78" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Tzugimaa"><img src="https://avatars.githubusercontent.com/u/4981077?v=4?s=100" width="100px;" alt="Tzugimaa"/><br /><sub><b>Tzugimaa</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Tzugimaa" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/WHMHammer"><img src="https://avatars.githubusercontent.com/u/35433952?v=4?s=100" width="100px;" alt="WHMHammer"/><br /><sub><b>WHMHammer</b></sub></a><br /><a href="#translation-WHMHammer" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/kato-megumi"><img src="https://avatars.githubusercontent.com/u/29451351?v=4?s=100" width="100px;" alt="kato-megumi"/><br /><sub><b>kato-megumi</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=kato-megumi" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/MikeWang000000"><img src="https://avatars.githubusercontent.com/u/11748152?v=4?s=100" width="100px;" alt="Mike Wang"/><br /><sub><b>Mike Wang</b></sub></a><br /><a href="#userTesting-MikeWang000000" title="User Testing">📓</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://sammyhori.com"><img src="https://avatars.githubusercontent.com/u/116026761?v=4?s=100" width="100px;" alt="Sammy Hori"/><br /><sub><b>Sammy Hori</b></sub></a><br /><a href="#translation-sammyhori" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/NeilTohno"><img src="https://avatars.githubusercontent.com/u/28284594?v=4?s=100" width="100px;" alt="NeilTohno"/><br /><sub><b>NeilTohno</b></sub></a><br /><a href="#translation-NeilTohno" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/a0193143"><img src="https://avatars.githubusercontent.com/u/32773311?v=4?s=100" width="100px;" alt="a0193143"/><br /><sub><b>a0193143</b></sub></a><br /><a href="#translation-a0193143" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/soulset001"><img src="https://avatars.githubusercontent.com/u/121711747?v=4?s=100" width="100px;" alt="soulset001"/><br /><sub><b>soulset001</b></sub></a><br /><a href="#translation-soulset001" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/WluhWluh"><img src="https://avatars.githubusercontent.com/u/52004526?v=4?s=100" width="100px;" alt="WluhWluh"/><br /><sub><b>WluhWluh</b></sub></a><br /><a href="#design-WluhWluh" title="Design">🎨</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/SerdarSaglam"><img src="https://avatars.githubusercontent.com/u/42881121?v=4?s=100" width="100px;" alt="Serdar Sağlam"/><br /><sub><b>Serdar Sağlam</b></sub></a><br /><a href="#translation-SerdarSaglam" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/AndrusGerman"><img src="https://avatars.githubusercontent.com/u/30560543?v=4?s=100" width="100px;" alt="Andrus Diaz German"/><br /><sub><b>Andrus Diaz German</b></sub></a><br /><a href="#translation-AndrusGerman" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Kefir2105"><img src="https://avatars.githubusercontent.com/u/103105829?v=4?s=100" width="100px;" alt="Kefir2105"/><br /><sub><b>Kefir2105</b></sub></a><br /><a href="#translation-Kefir2105" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/animeojisan"><img src="https://avatars.githubusercontent.com/u/132756551?v=4?s=100" width="100px;" alt="animeojisan"/><br /><sub><b>animeojisan</b></sub></a><br /><a href="#translation-animeojisan" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/MuscularPuky"><img src="https://avatars.githubusercontent.com/u/93962018?v=4?s=100" width="100px;" alt="MuscularPuky"/><br /><sub><b>MuscularPuky</b></sub></a><br /><a href="#translation-MuscularPuky" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Zoommod"><img src="https://avatars.githubusercontent.com/u/71239440?v=4?s=100" width="100px;" alt="Zoommod"/><br /><sub><b>Zoommod</b></sub></a><br /><a href="#translation-Zoommod" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/fil08"><img src="https://avatars.githubusercontent.com/u/125665523?v=4?s=100" width="100px;" alt="fil08"/><br /><sub><b>fil08</b></sub></a><br /><a href="#translation-fil08" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/IsaiasYang"><img src="https://avatars.githubusercontent.com/u/20205571?v=4?s=100" width="100px;" alt="攸羚"/><br /><sub><b>攸羚</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=IsaiasYang" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://ohaiibuzzle.dev"><img src="https://avatars.githubusercontent.com/u/23693150?v=4?s=100" width="100px;" alt="OHaiiBuzzle"/><br /><sub><b>OHaiiBuzzle</b></sub></a><br /><a href="#translation-ohaiibuzzle" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Rastadu23"><img src="https://avatars.githubusercontent.com/u/52637051?v=4?s=100" width="100px;" alt="Rastadu23"/><br /><sub><b>Rastadu23</b></sub></a><br /><a href="#translation-Rastadu23" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hauuau"><img src="https://avatars.githubusercontent.com/u/52239673?v=4?s=100" width="100px;" alt="hauuau"/><br /><sub><b>hauuau</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=hauuau" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/nellydocs"><img src="https://avatars.githubusercontent.com/u/71311423?v=4?s=100" width="100px;" alt="nellydocs"/><br /><sub><b>nellydocs</b></sub></a><br /><a href="#translation-nellydocs" title="Translation">🌍</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/funnyplanter"><img src="https://avatars.githubusercontent.com/u/173073947?v=4?s=100" width="100px;" alt="funnyplanter"/><br /><sub><b>funnyplanter</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=funnyplanter" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/eriforce"><img src="https://avatars.githubusercontent.com/u/8393109?v=4?s=100" width="100px;" alt="Erich Yu"/><br /><sub><b>Erich Yu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=eriforce" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Howard20181"><img src="https://avatars.githubusercontent.com/u/40033067?v=4?s=100" width="100px;" alt="Howard Wu"/><br /><sub><b>Howard Wu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Howard20181" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/arifpedia"><img src="https://avatars.githubusercontent.com/u/4081293?v=4?s=100" width="100px;" alt="Arif Budiman"/><br /><sub><b>Arif Budiman</b></sub></a><br /><a href="#translation-arifpedia" title="Translation">🌍</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

本项目遵循 [all-contributors](https://allcontributors.org/) 规范,欢迎任何形式的贡献!

## 许可协议

本项目采用 GPLv3 许可协议。


================================================
FILE: Settings.XamlStyler
================================================
{
    "AttributesTolerance": 1,
    "KeepFirstAttributeOnSameLine": true,
    "MaxAttributeCharactersPerLine": 0,
    "MaxAttributesPerLine": 1,
    "NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter",
    "SeparateByGroups": false,
    "AttributeIndentation": 0,
    "AttributeIndentationStyle": 1,
    "RemoveDesignTimeReferences":  false,
    "IgnoreDesignTimeReferencePrefix": false,
    "EnableAttributeReordering": true,
    "AttributeOrderingRuleGroups": [
        "x:Class",
        "xmlns, xmlns:x",
        "xmlns:*",
        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
        "Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
        "*:*, *",
        "PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
        "mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
        "Storyboard.*, From, To, Duration"
    ],
    "FirstLineAttributes": "",
    "OrderAttributesByName": true,
    "PutEndingBracketOnNewLine": false,
    "RemoveEndingTagOfEmptyElement": true,
    "SpaceBeforeClosingSlash": true,
    "RootElementLineBreakRule": 0,
    "ReorderVSM": 2,
    "ReorderGridChildren": false,
    "ReorderCanvasChildren": false,
    "ReorderSetters": 0,
    "FormatMarkupExtension": true,
    "NoNewLineMarkupExtensions": "x:Bind, Binding",
    "ThicknessSeparator": 2,
    "ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin",
    "FormatOnSave": true,
    "CommentPadding": 2,
}


================================================
FILE: certs/.gitignore
================================================
!*.pfx

================================================
FILE: docs/About touch support.md
================================================
Due to OS security restrictions, Magpie requires UIAccess privileges to support touch input. Obtaining this privilege necessitates meeting two conditions:

1. The application must possess a digital signature, and this signature must be verified by a certificate associated with a trusted root certificate authority store on the local machine.
2. The application must reside in a "secure location", such as the Program Files or System32 folders.

When enabling touch support, Magpie performs the following actions:

1. Adds a self-signed certificate to the trusted root certificate authority store.
2. Copies the TouchHelper.exe to `System32\Magpie`. During scaling, Magpie runs this program to enable touch support.

Both of these actions constitute significant changes to the OS, thus requiring administrator privileges. If touch support is no longer needed, this option should be disabled. Magpie will then revert these changes, leaving no traces in the OS.

Touch support may fail for various reasons, such as when TouchHelper.exe requires an update. In such cases, Magpie will request administrator privileges before scaling to resolve the issue.


================================================
FILE: docs/Built-in effects.md
================================================
Magpie ships with a handful of effects that can be used in combinations. Most of the effects have parameters that can be customized. All effects are stored in the `effects` folder. You can easily add effects if you are familiar with HLSL. Check the [MagpieFX](https://github.com/Blinue/Magpie/wiki/MagpieFX%20(EN)) page.

## Introduction to shipped effects

* ACNet: Port of [ACNetGLSL](https://github.com/TianZerL/ACNetGLSL). Suitable for anime-style images. Strong denoise effects.
  * Output size: twice that of the input

* AdaptiveSharpen: Self-adaptive sharpening algorithm. This algorithm focuses on sharpening the blurry edges in the images. Hence it has less image noise, ringing artifacts, and stripes compared to the common sharpening algorithms.
  * Output size: the same as the input
  * Parameter
    * Sharpness

* Anime4K_3D_AA_Upscale_US and Anime4K_3D_Upscale_US: 3D game scaling algorithms provided by Anime4K. The AA variant supports anti-aliasing.
  * Output size: twice that of the input

* Anime4K_Denoise_Bilateral_Mean, Anime4K_Denoise_Bilateral_Median, and Anime4K_Denoise_Bilateral_Mode: Denoise algorithms provided by Anime4K. Uses mean, median, and mode, respectively.
  * Output size: the same as the input
  * Parameter:
    * Strength: Denoise magnitude

* Anime4K_Restore family: Algorithms to restore the lines in animations. In increasing order of demand for computing power. The Soft variants are more conservative in sharpening.
  * Output size: the same as the input

* Anime4K_Thin_HQ: Algorithm to clarify lines in animations provided by Anime4K.
  * Output size: the same as the input
  * Parameters
    * Strength: The strength in each iteration.
    * Iterations: The number of iterations. Decreasing strength and increasing iterations improves the quality of the images, but will lower the processing speed.

* Anime4K_Upscale family: Anime-style scaling algorithms provided by Anime4K. The denoise variant includes denoise functionality. The GAN variant, which keeps more details, is still under experiment.
  * Output size: twice that of the input

* Bicubic: Interpolation algorithms. The lite variant is fast, but at the cost of quality degradation, Suitable for users will weak graphics cards.
  * Output size: determined by scale configuration
  * Parameters
    * B: Too large values will result in blurry images.
    * C: Too large values will result in ring artifacts.
  * Note: Different combinations of parameters will lead to different variants of the algorithm. For example: Mitchell(B=C≈0.333333), Catmull-Rom(B=0 C=0.5), bicubic Photoshop(B=0 C=0.75), Spline(B=1 C=0)

* Bilinear:Bilinear interpolation
  * Output size: determined by scale configuration

* CAS: Port of [FidelityFX-CAS](https://github.com/GPUOpen-Effects/FidelityFX-CAS). Lightweight sharpening effects.
  * Output size: the same as the input
  * Parameter
    * Sharpness

* CAS_Scaling:Port [FidelityFX-CAS](https://github.com/GPUOpen-Effects/FidelityFX-CAS). Supports scaling
  * Output size: the same as the input
  * Parameter
    * Sharpness

* CRT_Easymode: Easy-to-configure lightweight CRT shader.
  * Output size: determined by scale configuration
  * Parameters
    * Sharpness Horizontal
    * Sharpness Vertical
    * Mask Strength
    * Mask Dot Width
    * Mask Dot Height
    * Mask Stagger
    * Mask Size
    * Scanline Strength
    * Scanline Beam Width Min
    * Scanline Beam Width Max
    * Scanline Brightness Min
    * Scanline Brightness Max
    * Scanline Cutoff
    * Gamma Input
    * Gamma Output
    * Brightness Boost
    * Dilation

* CRT_Geom: One of the most popular CRT shaders, designed to emulate the look of Arcade-machine. This implementation does not support interlacing simulation. Check [Emulation General Wiki](https://emulation.gametechwiki.com/index.php/CRT_Geom).
  * Output size: determined by scale configuration
  * Parameters
    * Target Gamma
    * Monitor Gamma
    * Distance
    * Curvature: Whether to emulate the screen curvature
    * Curvature Radius
    * Corner Size
    * Corner Smoothness
    * Horizontal Tilt
    * Vertical Tilt
    * Horizontal Overscan
    * Vertical Overscan
    * Dot Mask
    * Sharpness: The larger the value is, the clear the image becomes
    * Scanline Weight
    * Luminance Boost
  
* CRT_Hyllian: Provides sharp and clear outputs with slight rims. Similar to Sony BVM displays.
  * Output size: determined by scale configuration
  * Parameters
    * Phosphor
    * Vertical Scanlines
    * Input Gamma
    * Output Gamma
    * Sharpness
    * Color Boost
    * Red Boost
    * Green Boost
    * Blue Boost
    * Scanline Strength
    * Min Beam Width
    * Max Beam Width
    * Anti-Ringing

* CRT_Lottes: Provides multiple masks emulating Bloom and Halation effects. Similar to CGA arcade displays.
  * Output size: determined by scale configuration
  * Parameters
    * Scanline Hardness
    * Pixel Hardness
    * Horizontal Display Warp
    * Vertical Display Warp
    * Mask Dark
    * Mask Light
    * Shadow Mask
    * Brightness Boost
    * Bloom-X Soft
    * Bloom-Y Soft
    * Bloom Amount
    * Filter Kernel Shape

* CuNNy family:Suitable for visual novel-style images. The DS variants offer a subtle denoise effect. Provided by [CuNNy](https://github.com/funnyplanter/CuNNy)
  * Output size: twice that of the input

* CuNNy2 family: An enhanced version of CuNNy
  * Output size: twice that of the input

* Deband
  * Output size: the same as the input
  * Parameters
    * Threshold:The threshold of difference below which a pixel is considered to be part of a gradient.
    * Range:The range (in source pixels) at which to sample for neighbours.
    * Iterations:The number of debanding iterations to perform. Each iteration samples from random positions, so increasing the number of iterations is likely to increase the debanding quality. Conversely, it slows the shader down.
    * Grain:Add some extra noise to the image. This significantly helps cover up remaining banding and blocking artifacts, at comparatively little visual quality.

* FineSharp: High-quality sharpening. The earliest version was the AviSynth script.
  * Output size: the same as the input
  * Parameters
    * sstr: Sharpening strength. If you change this parameter, you will have to also change cstr. Check the note below.
    * cstr: Balancing strength.
    * xstr: The sharpening strength in the final step of the XSharpen style.
    * xrep: To fix the artifacts in the last step of sharpening.
  * Note: mapping between sstr and cstr (sstr->cstr): 0->0, 0.5->0.1, 1.0->0.6, 2.0->0.9, 2.5->1.00, 3.0->1.09, 3.5->1.15, 4.0->1.19, 8.0->1.249, 255.0->1.5

* FSR_EASU: Port of the scaling step in [FidelityFX-FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR). The DX10 variant works on graphics cards supporting DirectX feature level, but will be slower.
  * Output size: determined by scale configuration

* FSR_RCAS: Port of the sharpening step in [FidelityFX-FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR).
  * Output size: the same as the input
  * Parameter
    * sharpness

* FSRCNNX: Port of FSRCNNX_x2_8-0-4-1
  * Output size: twice that of the input

* FSRCNNX_LineArt: Port of FSRCNNX_x2_8-0-4-1_LineArt
  * Output size: twice that of the input

* FXAA_Medium, FXAA_High, FXAA_Ultra: Fast anti-aliasing by approximation. In increasing order of demand to computing power.
  * Output size: the same as the input

* GTU_v050: Aims to emulate the blurry and mixed effects of CRT displays rather than masks or curvature. Supports scanning lines.
  * Output size: determined by scale configuration
  * Parameters
    * Composite Connection
    * No Scanlines
    * Signal Resolution Y
    * Signal Resolution I
    * Signal Resolution Q
    * TV Vertical Resolution
    * Black Level
    * Contrast

* ImageAdjustment:Image parameters adjustment
  * Output size: the same as the input
  * Parameters
    * Target Gamma
    * Monitor Gamma
    * Saturation
    * Luminance
    * Contrast
    * Brightness Boost
    * Black Level
    * Red Channel
    * Green Channel
    * Blue Channel

* Jinc: Scaling with the Jinc algorithm
  * Output size: determined by scale configuration
  * Parameters
    * Window Sinc Param: The smaller the value is the sharper the images become. Must be greater than 0. Default value: 0.5
    * Sinc Param: The larger the value is the sharper the images become. Must be greater than 0. Default value: 0.825
    * Anti-ringing Strength: The greater the value is the better the effect becomes, but the images will be more blurry.

* Lanczos: Scaling with the Lanczos algorithm.
  * Output size: determined by scale configuration
  * Parameters
    * Anti-ringing Strength: The greater the value is the better the effect becomes, but the images will be more blurry.

* LCAS:Lightweight 3D image scaling algorithm
  * Output size: determined by scale configuration
  * Parameter
    * Sharpness

* LumaSharpen: A popular sharpening effect in reshade.
  * Output size: the same as the input
  * Parameters
    * Sharpening Strength
    * Sharpening Limit: Anti-ringing strength.
    * Sample Pattern: Filter type.
    * Offset Bias: Filter bias.

* MMPX:Pixel art scaling algorithm. It can add details while retaining the artistic style.
  * Output size: twice that of the input

* Nearest: Nearest neighbor interpolation
  * Output size: determined by scale configuration

* NIS: Port of [NVIDIA Image Scaling](https://github.com/NVIDIAGameWorks/NVIDIAImageScaling).
  * Output size: determined by scale configuration
  * Parameters
    * Sharpness
  * Note: Only supports upscaling.

* NNEDI3 family:These shaders originally designed for deinterlacing and are also high-quality interpolation algorithms. NNEDI3_nns64_win8x6 produces higher quality results, but slower.
  * Output size: twice that of the input

* NVSharpen: Port of NVSharpen that was published along with NIS.
  * Output size: the same as the input
  * Parameter
    * Sharpness

* Pixellate: Scale with the Pixellate algorithm. Suitable for upscaling pixel arts.
  * Output size: determined by scale configuration

* RAVU family: Ported from https://github.com/bjin/mpv-prescalers
  * Output size: twice that of the input

* RAVU_Zoom family: Ported from https://github.com/bjin/mpv-prescalers
  * Output size: determined by scale configuration
  * Note: Only supports upscaling.

* SharpBilinear: Scale with the Sharp-Bilinear algorithm. Suitable for upscaling pixel arts.
  * Output size: determined by scale configuration

* SGSR: Port of [Snapdragon Game Super Resolution v1](https://github.com/SnapdragonStudios/snapdragon-gsr/tree/main/sgsr/v1).
  * Output size: determined by scale configuration
  * Parameter
    * Edge Sharpness: Edge sharpening intensity (The larger the value, the sharper the image.)
    * Edge Threshold: Edge detection threshold

* SMAA_Low, SMAA_Medium, SMAA_High, and SMAA_Ultra: SMAA anti-aliasing. In increasing order of demand for computing power.
  * Output size: the same as the input

* SSimDownscaler: Downscaling algorithm based on perceptron. Sharper than Catrom.
  * Output size: determined by scale configuration
  * Parameter
    * Oversharp: The larger the value, the sharper the image.

* xBRZ_2x, xBRZ_3x, xBRZ_4x, xBRZ_5x, and xBRZ_6x: Scale with the xBRZ algorithm. Suitable for upscaling pixel arts.
  * Output size: determined by the variant.

* xBRZ_Freescale and xBRZ_Freescale_Multipass: xBRZ algorithm supporting any scaling factor.
  * Output size: determined by scale configuration


================================================
FILE: docs/Comparison of capture methods.md
================================================
Magpie provides several capture methods. They have their pros and cons in different scenarios. For general purposes, it's recommended to use Graphics Capture, as it provides the best compatibility and smoothness.

| | Graphics Capture | Desktop Duplication | GDI | DwmSharedSurface |
| :---: | :---: | :---: | :---: |:---: |
| Supports DirectComposition (e.g. UWP) | Yes | Yes | No | No |
| Supports recording/streaming | No under extreme conditions<sup>[1]</sup> | No | Yes | Yes |
| Support the source window to span multiple screens | No under extreme conditions<sup>[1]</sup> | No | Yes | Yes |
| Ignores DPI virtualization<sup>[2]</sup> | No | No | Yes| Yes |
| Notes | The most recommended capture method | Requires Win10 v2004 | | Not recommended due to unstable performance |


[1]: (1) The source window does not support regular window capture. (2) The operating system is Windows 11.

[2]: The system will perform bicubic interpolation upscaling to windows that do not support DPI scaling. The capture methods supporting this options captures the images before such scaling.


================================================
FILE: docs/Compilation guide.md
================================================
### Prerequisites

In order to compile Magpie, you need to first install:

1. The latest version of Visual Studio 2022 or 2026. You need to install both "Desktop development with C++" and "Universal Windows Platform development" workloads and Windows SDK build 26100 or newer.
2. [CMake](https://cmake.org/)

   You can also use the built-in CMake of Visual Studio, which is located at `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`.
3. [Python](https://www.python.org/) 3.11+
4. [Conan](https://conan.io/)

   ```bash
   pip install conan
   ```
   
   Make sure that the above dependencies have been added to the system path, and use the following commands to check:
   ```bash
   cmake --version
   python --version
   conan --version
   ```

### Compiling

1. Clone the repo

   ```bash
   git clone https://github.com/Blinue/Magpie
   ```

2. Open the Magpie.slnx in the root directory and build the solution.

### Enabling Touch Support

To enable touch input support, TouchHelper.exe needs to be signed. While signing is automatically done in the CI pipeline, you can also manually sign it. Follow these steps:

1. Create a self-signed certificate and export it as a pfx file.
2. Replace the `CERT_FINGERPRINT` constant in `src/Magpie/TouchHelper.cpp` with the SHA-1 hash (i.e., fingerprint) of your certificate.
3. Run the following command in the root directory of the repository:

```bash
python scripts/publish.py --pfx-path=<pfx path> --pfx-password=<pfx password>
```

This will compile Magpie and sign TouchHelper.exe. The compiled files will be located in `publish\x64`.


================================================
FILE: docs/FAQ (EN).md
================================================
## Duplicate-monitoring

When displaying performance monitor like RTSS (Rivatuner Statistics Server), there might be 2 OSD layers displayed with Magpie scaling. This is caused by d3d, the screen capture method since v0.7.0. It will be captured by RTSS as well. You can fix this issue by adding it to the blacklist.

## The hot keys don't work, but "Scale after `x`s" works.

1. Try changing the hot keys.
2. Try running Magpie as Administrator.

## Lagging/latency

Please check the [Performance optimization](https://github.com/Blinue/Magpie/wiki/Performance%20optimization) page.

## Will using Magpie in multi-player games be detected as cheating?

Magpie is designed to be non-intrusive, so it is unlikely to be detected as a cheating tool. There have been no reports of bans for using Magpie. Nevertheless, you should be aware of the risks of using the software.

## What is "3D game mode"?

Enabling this option can change the behavior of the cursor and in-game overlay to optimize for 3D games. It is recommended to turn on this option when scaling 3D games.

## What is "Disable DirectFlip"?

DirectFlip is a technology to reduce input lags, but it may cause trouble in some circumstances. Please turn on this option when you are in the following situationsL:

1. The game lags unexpectedly (game known with the issue: Days Gone).
2. Abnormal low frame rates.
3. The screen freezes when streaming.

## What is "Simulate Exclusive Fullscreen?"

A lot of software checks whether there are games running under dedicated fullscreen mode before popping up windows. Turn on this option if you'd like to play in fullscreen without being disturbed,

## What is the frame rate displayed in Magpie?

The frame rate displayed by Magpie is that of its own rather than that of the game. Due to the non-intrusive nature, Magpie has no way to detect the frame rates of games themselves. We recommend you to use tools like RTSS to display the games' frame rates. Their add-on layers can usually be captured by Magpie as well.

## Does Magpie support touch input?

Supported from v0.11, see [About touch support](https://github.com/Blinue/Magpie/wiki/About-touch-support) for details.

### Does Magpie support frame generation?

There are no plans to implement frame generation. Magpie's goal is to improve visual quality, not performance, while post-processing frame generation is difficult to achieve a good enough result and adds latency. Game engines can use motion vectors and depth buffers to make improvements, but Magpie has no access to these. Similarly, FSR 2/3 are not on the development roadmap, as they need to be integrated internally and post-processing is almost impossible.

## What is the relationship between Magpie and Lossless Scaling?

[Lossless Scaling](https://store.steampowered.com/app/993090/Lossless_Scaling/) is a paid software on Steam that is similar to Magpie. When Magpie was released in February 2021, existing window scaling software (such as [IntegerScaler](https://tanalin.com/en/projects/integer-scaler/) and Lossless Scaling) only supported simple scaling algorithms like nearest-neighbor scaling and integer scaling. These programs relied on the [Magnification API](https://learn.microsoft.com/en-us/windows/win32/api/_magapi/) to function, which led to significant limitations.

To support advanced scaling algorithms, I developed and open-sourced Magpie, which implements scaling in a completely different way. Initially, Magpie only supported algorithms like Anime4K, Lanczos, and Adaptive Sharpen. However, based on user feedback, Magpie added support for FSR in [July 2021](https://github.com/Blinue/Magpie/commit/7f6c66f3b47ccd64da41d298faa7a8e185bd5299). Soon after, Lossless Scaling released version 1.4.0, which supported FSR in a similar way to Magpie.

Currently, Magpie and Lossless Scaling differ significantly. Magpie focuses on usability and supporting more scaling algorithms, while Lossless Scaling primarily aims to improve 3D game performance.


================================================
FILE: docs/FAQ.md
================================================
### 双重监控

使用性能计数器屏显时,例如 RTSS (Rivatuner Statistics Server),你可能会在缩放时看到两个叠加层。这是由于 Magpie 使用 Direct3D 呈现画面,它也会被 RTSS 捕捉。如果你不关心 Magpie 的性能,请将 Magpie 添加到黑名单。

### 快捷键不起作用,但可以使用 "`x` 秒后缩放"

1. 尝试更换快捷键
2. 尝试以管理员身份运行 Magpie

### 卡顿/延迟

请查看[性能优化建议](https://github.com/Blinue/Magpie/wiki/性能优化建议)。

### 在多人游戏中使用 Magpie 会被认定为作弊吗?

Magpie 被设计为非侵入式,因此一般不会被识别为作弊工具。目前没有因使用 Magpie 被封禁的报告。尽管如此,你应该了解到使用本软件的风险。

### 什么是“禁用 DirectFlip”?

DirectFlip 是一种用于降低输入延迟的技术,但可能会在一些情况下造成问题。如果你遇到了下面的情形,可以尝试打开这个选项:

1. 游戏异常卡顿(已知游戏:Days Gone)
2. 不正常的低帧率
3. 串流时画面冻结

### 什么是“3D 游戏模式”?

此选项可以更改光标和游戏内叠加层的行为以适配 3D 游戏,建议在缩放 3D 游戏时开启此选项。

### 什么是“模拟独占全屏”?

很多软件弹窗或推送前会先检查是否有独占全屏的游戏,开启此选项可以让你在全屏状态下不受打扰。一些用户报告开启此选项后游戏可能无法正常启动 [#495](https://github.com/Blinue/Magpie/issues/495),如果你遇到了类似的问题,请关闭它。

### Magpie 中显示的帧率是什么?

Magpie 显示的是自己的帧率而不是游戏的,基于非侵入性原则,Magpie 无法获知游戏的帧率。建议使用 RTSS 等工具显示游戏帧率,它们的叠加层一般也可以被 Magpie 捕获到。

### 是否支持触控?

从 v0.11 开始支持,详情见[关于触控支持](https://github.com/Blinue/Magpie/wiki/关于触控支持)。

### 是否支持帧生成?

目前没有实现帧生成的计划。Magpie 的目的是提高游戏画质而不是性能,后处理补帧很难达到足够好的观感,而且还会增加延迟。游戏引擎可以使用运动矢量和深度缓冲以进行改善,但 Magpie 不具备这种条件。与之同理,FSR 2/3 也不在开发计划内,因其必须采用内部集成,后处理几乎无法实现。

### Magpie 和 Lossless Scaling 有何关系?

[Lossless Scaling](https://store.steampowered.com/app/993090/Lossless_Scaling/) 是 Steam 上的一款和 Magpie 功能类似的收费软件。Magpie 于 2021 年 2 月问世,当时市面上的窗口缩放软件(如 [IntegerScaler](https://tanalin.com/en/projects/integer-scaler/) 和 Lossless Scaling)仅支持简单的缩放算法,如最近邻缩放和整数倍缩放。这些软件的核心功能使用 [Magnification API](https://learn.microsoft.com/en-us/windows/win32/api/_magapi/) 实现,因此存在很大的局限性。

为了支持更高级的缩放算法,我开发并开源了 Magpie,它采用了完全不同的方式来实现缩放。最初,Magpie 仅支持 Anime4K、Lanczos、Adaptive Sharpen 等算法。在用户的反馈下,Magpie 在 [2021 年 7 月](https://github.com/Blinue/Magpie/commit/7f6c66f3b47ccd64da41d298faa7a8e185bd5299)加入了对 FSR 的支持。不久之后,Lossless Scaling 推出了 1.4.0 版本,采用与 Magpie 类似的方式支持 FSR。

现在,Magpie 和 Lossless Scaling 有很大的不同。Magpie 的重点是可用性和支持更多的缩放算法,而 Lossless Scaling 则主要聚焦于提高 3D 游戏的性能。


================================================
FILE: docs/Home (EN).md
================================================
[Chinese version](https://github.com/Blinue/Magpie/wiki/)

Welcome to the Magpie Wiki. Please read [CONTRIBUTING](https://github.com/Blinue/Magpie/blob/dev/CONTRIBUTING.md) if you'd like to contribute the the documentations.


================================================
FILE: docs/Home.md
================================================
[English version](https://github.com/Blinue/Magpie/wiki/Home%20(EN))

欢迎来到 Magpie Wiki。如果你想贡献文档,请阅读[贡献指南](https://github.com/Blinue/Magpie/blob/main/CONTRIBUTING_ZH.md#%E6%88%91%E6%83%B3%E8%B4%A1%E7%8C%AE%E6%96%87%E6%A1%A3-)。


================================================
FILE: docs/Interact with Magpie programally.md
================================================
Magpie provides mechanisms for interaction with other programs. Through these mechanisms, your application can cooperate with Magpie.

[MagpieWatcher](https://github.com/Blinue/MagpieWatcher) demonstrates how to use these mechanisms.

## How to Receive Notifications When Scaling State Changes

You should listen for the `MagpieScalingChanged` message.

```c++
UINT WM_MAGPIE_SCALINGCHANGED = RegisterWindowMessage(L"MagpieScalingChanged");
```

### Parameters

The `wParam` parameter indicates the event ID, and the meaning of `lParam` varies depending on the event. The following events are supported:

* 0: Scaling has ended or the source window has lost focus. `lParam` is 0 if scaling has ended, or 1 if the source window has lost focus.
* 1: Scaling has started or the source window has returned to the foreground. `lParam` contains the handle of the scaled window.
* 2: The scaled window’s position or size has changed. This event is exclusive to windowed scaling.
* 3: User has started resizing or moving the scaled window. This event is exclusive to windowed scaling.

### Notes

If your process has a higher integrity level than Magpie, you won't receive messages broadcasted by Magpie due to User Interface Privilege Isolation (UIPI). In such cases, call [ChangeWindowMessageFilterEx](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-changewindowmessagefilterex) to allow receiving the `MagpieScalingChanged` message.

```c++
ChangeWindowMessageFilterEx(hYourWindow, WM_MAGPIE_SCALINGCHANGED, MSGFLT_ADD, nullptr);
```

## How to Get the Handle of the Scaled Window

You can listen for the `MagpieScalingChanged` message to obtain the handle of the scaled window. Additionally, while Magpie is scaling, you can also search for the window with the class name `Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22`. Magpie ensures that this class name remains unchanged and that only one scaled window exists at a time.

```c++
HWND hwndScaling = FindWindow(L"Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22", nullptr);
```

## How to Place Your Window Above the Scaled Window

You should listen for the `MagpieScalingChanged` message and adjust your window's Z-order accordingly. Below is a simple example. For more advanced use cases, refer to [MagpieWatcher](https://github.com/Blinue/MagpieWatcher).

```c++
if (message == WM_MAGPIE_SCALINGCHANGED) {
    if (wParam == 0) {
        // Remove topmost status
        SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    } else if (wParam == 1) {
        // Ensure your window stays above the scaled window
        SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }
}
```

## How to Obtain Scaling Information

Scaling information is stored in the [window properties](https://learn.microsoft.com/en-us/windows/win32/winmsg/about-window-properties) of the scaled window. Currently available properties include:

* `Magpie.Windowed`:Indicates whether Magpie is performing windowed scaling
* `Magpie.SrcHWND`: Handle of the source window
* `Magpie.SrcLeft`、`Magpie.SrcTop`、`Magpie.SrcRight`、`Magpie.SrcBottom`: Source region of scaling
* `Magpie.DestLeft`、`Magpie.DestTop`、`Magpie.DestRight`、`Magpie.DestBottom`: Destination region of scaling

```c++
HWND hwndSrc = (HWND)GetProp(hwndScaling, L"Magpie.SrcHWND");
bool isWindowed = (bool)GetProp(hwndScaling, L"Magpie.Windowed");

RECT srcRect;
srcRect.left = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcLeft");
srcRect.top = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcTop");
srcRect.right = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcRight");
srcRect.bottom = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcBottom");

RECT destRect;
destRect.left = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestLeft");
destRect.top = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestTop");
destRect.right = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestRight");
destRect.bottom = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestBottom");
```

### Notes

1. These properties are only guaranteed to exist after the scaled window has completed its initialization. Therefore, it is advisable to check whether the scaled window is visible before retrieving these properties, especially when the window handle is obtained using the class name.
2. The coordinates stored in these properties are not DPI-virtualized. To use them correctly, you need to set your application's DPI awareness level to Per-Monitor V2. For more details, please refer to [High DPI Desktop Application Development on Windows](https://learn.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows).


================================================
FILE: docs/MagpieFX (EN).md
================================================
MagpieFX is based on DirectX 11 compute shader

``` hlsl
//!MAGPIE EFFECT
//!VERSION 4
// Use the "USE" directive to declare the features being utilized. The following values can be combined:
// MulAdd: Enables the "MulAdd" function.
//!USE MulAdd
// Use the "CAPABILITY" directive to declare the capabilities supported by this effect. Whether they
// are enabled depends on user configuration. The following values can be combined:
// FP16: Declares support for FP16.
//!CAPABILITY FP16
// Use "SORT_NAME" to specify the name used for sorting, otherwise the files will be sorted by their file
// names.
//!SORT_NAME test1

// The following line helps reduce errors in the IDE. It is optional.
#include "StubDefs.hlsl"

// Definition of parameters
//!PARAMETER
// "LABEL" refers to the name of the parameter that is displayed on the user interface.
//!LABEL Sharpness
// "DEFAULT", "MIN", "MAX", and "STEP" are all required.
//!DEFAULT 0.1
//!MIN 0.01
//!MAX 5
//!STEP 0.01
float sharpness;


// Definition of textures
// "INPUT" and "OUTPUT" are special keywords.
// "INPUT" cannot be used as the output of a pass; "OUTPUT" cannot be used as the input of a pass.
// Only the last pass is allowed to write to OUTPUT, and it must write only to OUTPUT.
// Defining INPUT/OUTPUT is optional, but it is recommended to define them explicitly for the
// sake of semantic completeness.
// The size of the OUTPUT represents the output size of this effect. Not specifying it indicates
// support for output of any size.

//!TEXTURE
Texture2D INPUT;

//!TEXTURE
//!WIDTH INPUT_WIDTH * 2
//!HEIGHT INPUT_HEIGHT * 2
Texture2D OUTPUT;

// You can use some pre-defined constants to calculate texture size.
// INPUT_WIDTH
// INPUT_HEIGHT
// OUTPUT_WIDTH
// OUTPUT_HEIGHT

// Supported texture formats:
// R32G32B32A32_FLOAT
// R16G16B16A16_FLOAT
// R16G16B16A16_UNORM
// R16G16B16A16_SNORM
// R32G32_FLOAT
// R10G10B10A2_UNORM
// R11G11B10_FLOAT
// R8G8B8A8_UNORM
// R8G8B8A8_SNORM
// R16G16_FLOAT
// R16G16_UNORM
// R16G16_SNORM
// R32_FLOAT
// R8G8_UNORM
// R8G8_SNORM
// R16_FLOAT
// R16_UNORM
// R16_SNORM
// R8_UNORM
// R8_SNORM
// The definition of a texture in a pass varies depending on its format. For example, when the texture
// format is R8G8_UNORM, it is defined as Texture2D<float2> when used as an input and
// RWTexture2D<unorm float2> when used as an output.
// When FP16 is enabled, eligible textures will be defined using the min16float type. For instance,
// an R8G8_UNORM texture will be defined as Texture2D<min16float2> for input and
// RWTexture2D<unorm min16float2> for output.

//!TEXTURE
//!WIDTH INPUT_WIDTH + 100
//!HEIGHT INPUT_HEIGHT + 100
//!FORMAT R8G8B8A8_UNORM
Texture2D tex1;

// Definition of samplers
// "FILTER" is required,"ADDRESS" is optional
// The default value of "ADDRESS" is "CLAMP"

//!SAMPLER
//!FILTER LINEAR
//!ADDRESS CLAMP
SamplerState sam1;

//!SAMPLER
//!FILTER POINT
//!ADDRESS WRAP
SamplerState sam2;

// Code block shared by all passes

//!COMMON
#define PI 3.14159265359

// Definition of passes

//!PASS 1
// This description will appear in the in-game overlay.
//!DESC First Pass
// You can use a PS-like style, but it will still be implemented with CS.
// The default value of "STYLE" is "CS".
//!STYLE PS
//!IN INPUT
// Supports multiple render targets, up to 8.
//!OUT tex1

float func1() {
}

// "Pass[n]" is the entry point of the pass.
MF4 Pass1(float2 pos) {
    return MF4(1, 1, 1, 1);
}

//!PASS 2
//!IN INPUT, tex1
// The output of the last pass must be "OUTPUT".
//!OUT OUTPUT
// "BLOACK_SIZE" specifies how large an area is processed in one dispatch.
// "BLOACK_SIZE" can have only one dimension, meaning that length and height are specified at the same time.
//!BLOCK_SIZE 16, 16
// "NUM_THREADS" specifies how many parallel threads are involved in a single dispatch.
// "NUM_THREADS" can be less than three dimensions, and the missing dimensions are assumed to be 1
// by default.
//!NUM_THREADS 64, 1, 1

void Pass2(uint2 blockStart, uint3 threadId) {
    // Write to OUPUT
    OUTPUT[blockStart] = MF4(1,1,1,1);
}
```

### Predefined functions

**uint2 GetInputSize()**: Retrieves the size of the input texture.

**float2 GetInputPt()**: Retrieves the size of pixel in the input texture.

**uint2 GetOutputSize()**: Retrieves the size of the output texture.

**float2 GetOutputPt()**: Retrieves the size of pixel in the output texture.

**float2 GetScale()**: Retrieves the scaling factor between the output texture and the input texture.

**uint2 Rmp8x8(uint id)**: Maps the values of 0 to 63 to coordinates in an 8x8 square in swizzle order, which can improve texture cache hit rate.

**MF{n} MulAdd(MF{m} x, MF{m}x{n} y, MF{n} a)**: Equivalent to `mul(x, y) + a`, but with higher performance, making it particularly useful for machine learning-based effects. To use this function, you must declare "USE MulAdd". For details, see [#1049](https://github.com/Blinue/Magpie/pull/1049).


### Predefined macros

**MP_BLOCK_WIDTH, MP_BLOCK_HEIGHT**: The size of the block being processed in the current pass (specified by "BLOCK_SIZE").

**MP_NUM_THREADS_X, MP_NUM_THREADS_Y, MP_NUM_THREADS_Z** : The number of threads per thread group in the current pass (specified by "NUM_THREADS").

**MP_PS_STYLE**: Whether the current pass is a pixel shader style pass (specified by "STYLE").

**MP_INLINE_PARAMS**: Whether the parameters for the current pass are static constants (specifed by user).

**MP_DEBUG**: Whether the shader is being compiled in debug mode (when compiling shaders in debug mode, they are not optimized and contain debug information).

**MP_FP16**: Whether to use half-precision floating-point numbers.

**MF, MF1, MF2, ..., MF4x4**: Floating-point data types that conform to MP_FP16. When half-precision is not specified, they are aliases for float..., otherwise they are aliases for min16float...


### Multiple Render Targets (MRT)

In PS-style, the OUT instruction allows specifying multiple outputs (up to 8 due to DirectX limitations).
``` hlsl
//!OUT tex1, tex2
```

Now the entry point has a different signature:
``` hlsl
void Pass1(float2 pos, out MF4 target1, out MF4 target2);
```

### Load texture from file

``` hlsl
//!TEXTURE
//!SOURCE test.bmp
Texture2D testTex;
```

The TEXTURE instruction supports loading textures from files in common image formats such as BMP, PNG, JPG, and DDS. For DDS files, only 2D textures are supported, but mipmaps are allowed. FORMAT can be optionally specified to help the parser generate the correct definition. If FORMAT is not specified, it is always assumed to be of type float4.

Textures loaded from files cannot be used as the output of passes.


================================================
FILE: docs/MagpieFX.md
================================================
MagpieFX 基于 DirectX 11 计算着色器

``` hlsl
//!MAGPIE EFFECT
//!VERSION 4
// 使用 USE 指令声明使用的功能,支持以下值的组合:
// MulAdd:使 MulAdd 函数可用
//!USE MulAdd
// 使用 CAPABILITY 指令声明效果所支持的技术,但是否使用这些技术取决于用户配置。支持以下值的组合:
// FP16:声明对 FP16 的支持
//!CAPABILITY FP16
// 使用 SORT_NAME 指定排序时使用的名字,否则按照文件名排序
//!SORT_NAME test1

// 下面一行可以减少 IDE 中的错误。它是可选的
#include "StubDefs.hlsl"

// 参数定义
//!PARAMETER
// LABEL 为用户界面上显示的参数名
//!LABEL Sharpness
// DEFAULT、MIN、MAX 和 STEP 都必须存在
//!DEFAULT 0.1
//!MIN 0.01
//!MAX 5
//!STEP 0.01
float sharpness;


// 纹理定义
// INPUT、OUTPUT 是特殊关键字
// INPUT 不能作为通道的输出,OUTPUT 不能作为通道的输入
// 只有最后一个通道可以输出到 OUTPUT,最后一个通道也只能输出到 OUTPUT
// 定义 INPUT 和 OUTPUT 是可选的,但为了保持语义的完整性,建议显式定义
// OUTPUT 的尺寸即为此效果的输出尺寸,不指定则表示支持任意尺寸的输出

//!TEXTURE
Texture2D INPUT;

//!TEXTURE
//!WIDTH INPUT_WIDTH * 2
//!HEIGHT INPUT_HEIGHT * 2
Texture2D OUTPUT;

// 计算纹理尺寸时可以使用一些预定义常量
// INPUT_WIDTH
// INPUT_HEIGHT
// OUTPUT_WIDTH
// OUTPUT_HEIGHT

// 支持的纹理格式:
// R32G32B32A32_FLOAT
// R16G16B16A16_FLOAT
// R16G16B16A16_UNORM
// R16G16B16A16_SNORM
// R32G32_FLOAT
// R10G10B10A2_UNORM
// R11G11B10_FLOAT
// R8G8B8A8_UNORM
// R8G8B8A8_SNORM
// R16G16_FLOAT
// R16G16_UNORM
// R16G16_SNORM
// R32_FLOAT
// R8G8_UNORM
// R8G8_SNORM
// R16_FLOAT
// R16_UNORM
// R16_SNORM
// R8_UNORM
// R8_SNORM
// 根据纹理格式的不同,在通道中该纹理的定义也是不同的。如当纹理格式为 R8G8_UNORM,
// 作为通道的输入时定义是 Texture2D<float2>,作为输出时定义是 RWTexture2D<unorm float2>。
// 当使用 FP16 时,符合条件的纹理将被定义为 min16float 类型,例如 R8G8_UNORM 作为输入时定义变为
// Texture2D<min16float2>,作为输出时定义变为 RWTexture2D<unorm min16float2>。

//!TEXTURE
//!WIDTH INPUT_WIDTH + 100
//!HEIGHT INPUT_HEIGHT + 100
//!FORMAT R8G8B8A8_UNORM
Texture2D tex1;

// 采样器定义
// FILTER 必需,ADDRESS 可选
// ADDRESS 默认值为 CLAMP

//!SAMPLER
//!FILTER LINEAR
//!ADDRESS CLAMP
SamplerState sam1;

//!SAMPLER
//!FILTER POINT
//!ADDRESS WRAP
SamplerState sam2;

// 所有通道通用的部分

//!COMMON
#define PI 3.14159265359

// 通道定义

//!PASS 1
// 描述将出现在游戏内覆盖中
//!DESC First Pass
// 可选 PS 风格,依然用 CS 实现
// STYLE 默认为 CS
//!STYLE PS
//!IN INPUT
// 支持多渲染目标,最多 8 个
//!OUT tex1

float func1() {
}

// Pass[n] 为通道入口点
MF4 Pass1(float2 pos) {
    return MF4(1, 1, 1, 1);
}

//!PASS 2
//!IN INPUT, tex1
// 最后一个通道的输出只能是 OUTPUT
//!OUT OUTPUT
// BLOCK_SIZE 指定一次 dispatch 处理多大的区域
// 可以只有一维,即同时指定长和高
//!BLOCK_SIZE 16, 16
// NUM_THREADS 指定一次 dispatch 有多少并行线程
// 可以少于三维,缺少的维数默认为 1
//!NUM_THREADS 64, 1, 1

void Pass2(uint2 blockStart, uint3 threadId) {
    // 写入 OUPUT
    OUTPUT[blockStart] = MF4(1,1,1,1);
}
```

### 预定义函数

**uint2 GetInputSize()**:获取输入纹理尺寸。

**float2 GetInputPt()**:获取输入纹理每个像素的尺寸。

**uint2 GetOutputSize()**:获取输出纹理尺寸。

**float2 GetOutputPt()**:获取输出纹理每个像素的尺寸。

**float2 GetScale()**:获取输出纹理相对于输入纹理的缩放。

**uint2 Rmp8x8(uint id)**:将 0~63 的值以 swizzle 顺序映射到 8x8 的正方形内的坐标,用以提高纹理缓存的命中率。

**MF{n} MulAdd(MF{m} x, MF{m}x{n} y, MF{n} a)**:等效于 `mul(x, y) + a`,但性能更高,在基于机器学习的效果中非常有用。必须声明 "USE MulAdd" 才能使用此函数。原理参见 [#1049](https://github.com/Blinue/Magpie/pull/1049)。


### 预定义宏

**MP_BLOCK_WIDTH、MP_BLOCK_HEIGHT**:当前通道处理的块的大小(由 "BLOCK_SIZE" 指定)

**MP_NUM_THREADS_X、MP_NUM_THREADS_Y、MP_NUM_THREADS_Z**:当前通道每个线程组的线程数(由 "NUM_THREADS" 指定)

**MP_PS_STYLE**:当前通道是否是像素着色器样式(由 "STYLE" 指定)

**MP_INLINE_PARAMS**:当前通道的参数是否为静态常量(由用户指定)

**MP_DEBUG**:当前是否为调试模式(调试模式下编译的着色器不进行优化且含有调试信息)

**MP_FP16**:当前是否使用半精度浮点数

**MF、MF1、MF2、...、MF4x4**:遵守 fp16 参数的浮点数类型。当未指定 fp16,它们为 float... 的别名,否则为 min16float... 的别名


### 多渲染目标(MRT)

PS 风格下 OUT 指令可指定多个输出(由于 DirectX 的限制最多 8 个):
``` hlsl
//!OUT tex1, tex2
```

这时通道入口有不同的签名:
``` hlsl
void Pass1(float2 pos, out MF4 target1, out MF4 target2);
```

### 从文件加载纹理

``` hlsl
//!TEXTURE
//!SOURCE test.bmp
Texture2D testTex;
```

TEXTURE 指令支持从文件加载纹理,支持的格式有 BMP,PNG,JPG 等常见图像格式以及 DDS 文件。加载 DDS 文件时只支持 2D 纹理,但允许使用 mipmap。可选使用 FORMAT,指定后可以帮助解析器生成正确的定义,不指定始终假设是 float4 类型。

从文件加载的纹理不能作为通道的输出。


================================================
FILE: docs/Performance optimization.md
================================================
This article may be helpful if you are facing performance issues (e.g. lagging, latency, too much power consumption).

Below are some possible situations:

## My graphics card is not powerful enough

If you cannot run some effects with high computing power requirements (e.g. Anime4K, AdaptiveSharpen, etc.) smoothly, try the following:

1. Change to the variants with lower requirements. For example, Anime4K_Upscale_S is much faster than Anime4K_Upscale_L. CAS is much faster than AdaptiveSharpen. They can effectively improve the smoothness of the effects at the cost of some quality degradation.
2. Change the capture mode. We recommend you to try each of them.

## Intermittent lagging

If your graphics card is powerful enough, but you are still experiencing lagging issues, try the following:

<details>
    <summary>For Nvidia users</summary>

### Assume you're on Windows 11 24H2

The following tips apply only to Nvidia users. Improper driver configuration on Nvidia graphics cards is likely the cause of the stuttering.

Quick tips: Restore your Nvidia driver settings to default (clean install) will solve most problems. However, if you insist on use your own settings, let's explain how driver settings cause trouble to program.

#### Strange fps drop after upscaling enabled for a while

At the beginning, everything is fine (Game 60 FPS / Magpie 60 FPS). But after about 10~15 seconds, both game and magpie fps drop to about 37 FPS, at the same time GPU usage go up to 100%, GPU MHz goes down from like 1000 to 700.

First, if you're gaming with "Power management mode: Optimal power", then try to set magpie program to "Prefer maximum performance" or maybe "Adaptive" but I haven't try adaptive mode, yet there is no guarantee. Game remains "Optimal power" is fine. By use this setting, GPU MHz will no longer goes down abnormal.

#### Nvidia App and Nvidia control panel

However, one of my PC doesn't work with this settings while others can be fixed with this way. The investigation result is, there is compatibility issue between Nvidia App and Nvidia control panel. If you use Nvidia App changed your driver settings, open control panel, modify same settings cause the control panel crash or says "Access denied". And settings by Nvidia App are not apply to game or program at all.

Don't use Nvidia App (version 11.0.2.341) to adjust Nvidia driver settings of driver like 572.16. Close Nvidia App and Nvidia control panel, go to `C:\ProgramData\NVIDIA Corporation\Drs`, delete all `.bin` files like `nvdrsdb0.bin`, `nvdrsdb1.bin`, `nvdrssel.bin`, `update.bin`, open Nvidia control panel again and redo all of your global settings and program specified settings, and avoid use Nvidia App driver settings after that.

#### Screen looks not as smooth as native game window

Game 60 FPS / Magpie 60 FPS, appears in either `Graphics Capture` or `Desktop Duplication`.

The investigation result is vertical sync. Although it looks very strange. At least for Windows 11 24H2, you need to turn on vertical sync for a game, to make WGC and DXGI capture doesn't lose frame. If not, even WGC and DXGI capture at 60 FPS and game run at 60 FPS, many or some game frame will lose or called duplicated frame.

Required vertical sync mode for game is "Traditional / Classic / Vertical sync: Use the 3D application setting and enable in-game vsync / Vertical sync: On". Not turn off vertical sync, or use "Vertical sync: Fast". I'm not sure if "Vertical sync: Adaptive / Adaptive (half refresh rate)" will work or not but I have no time for detailed testing.

For magpie, go with "Use the 3D application setting".

#### Crazy frame lose when using Desktop Duplication

At the same time, Game 60 FPS / Magpie 60 FPS. I find that this situation appears when I am using Magpie v0.10.6. Enable vertical sync in Magpie settings and use "Vertical sync: Use the 3D application setting" for Magpie program settings solved this. Upgrade to Magpie v0.11.1 also solved this.

#### Crazy frame lose when GPU usage nears 100%

At the same time, Game sightly lower than monitor FPS like Game 57 FPS / Monitor 60 Hz. If not use Magpie, the native game window looks smooth.

Try turn off "Hardware-accelerated GPU scheduling" and restart. I find that when GPU under heavy load and GPU scheduling on, Either WGC and Desktop Duplication can't process frames correctly. By turn off GPU scheduling, your game FPS is still low, but Magpie will not drop to visually under 10 FPS anymore.

#### Screen looks not smooth but FPS is decent

Game 60 FPS / Magpie 60 FPS / Monitor 60 Hz, but some frames dropped after rendered, instead of present on screen. This also happens on native game Window without use scaling.

Check Max Frame Rate and vertical sync. For example, you have 60 Hz monitor and set vertical sync on as mentioned above, you need to remove Max Frame Rate settings too, if you have set Max Frame Rate to 60 FPS before.

If you have other frame limiter like MSI Afterburner RTSS, also turn it of.

Mislead:
1. Set global Max Frame Rate to 60 FPS and turn off Max Frame Rate for certain program, this will not work as intend. When you have program Max Frame Rate off and vertical sync off, but you have global Max Frame Rate, game and Magpie still follow global Max Frame Rate limit.
1. Use Max Frame Rate as "better vertical sync method" because they say "by doing this can reduce input lag". No, Max Frame Rate is not vertical sync, it doesn't guarantee every rendered frame to be present on monitor, which is "old fashion vertical sync" will do.

#### Low Lantancy Mode

Check these options if you encountered some other strange behavior. I'm not sure if Magpie has these issue, but for Lossless Scaling, use "Low Lantancy Mode: Ultra" will cause WGC API drag and drop position step back after release mouse button.

Set "Low Lantancy Mode: Off" for Magpie. But you may leave "Low Lantancy Mode: Ultra" for games if needed and you know it won't cause bug. For example, some old DirectX 9 game doesn't work well with this setting, it cause frame drop and input lag, if that happen just set it to off.

</details>

<details>
    <summary>For AMD users</summary>

### Placeholder

Welcome provide more performance tips for us. You may also check Nvidia tips and guess if some condition match your setup.

</details>

<details>
    <summary>Hyperthread and big.little CPUs</summary>

#### Hyperthread and Intel Alder Lake big.little CPUs

I suggest if you don't want to turn off Hyperthread, use cmd.exe batch `start /affinity 0x55 "" "C:\path to\game.exe"` for game or it's launcher, game will inherit parent process affinity. And `start /affinity 0xaa` for Magpie. Also adjust game graphics options, try to limit game CPU usage below 50% (4 physical core of 4 core 8 thread as example).

The 0x55 specify game run on 0 2 4 6 logical core of 4 core CPU, and other stuff 0xaa run on 1 3 5 7.

For high priority, use `start /abovenormal` for both game and Magpie, but I find certain game are easy to crash with affinity and higher priority for unknown reason. As an example, `dwm.exe` system service running at `high`. In such case, use power plan high performance to make CPU run at highest clock speed is the last choice.

0x55 and 0xaa are example value, I use https://bitsum.com/tools/cpu-affinity-calculator

You may also utilize this trick to force game run on big cores of Intel Alder Lake big.little CPUs.

Reference:  
https://superuser.com/questions/690509/does-windows-know-how-to-appropriately-assign-threads-to-a-quad-core-processor-t

</details>

### Still lagging?

1. Change the capture mode. We recommend you to try each of them.
2. Turn on "Disable DirectFlip." DirectFlip is a technology to reduce input lag, but may be incompatible with some certain games.
3. If you have multiple graphics card, try changing the graphics adaptor.
4. Increase the process priority of Magpie and the priority in the driver (if such options exist).
5. Please submit an [Issue (Performance)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=performance&template=02_performance.yaml) if none of the attempts above works.

## I'd like to reduce the power consumption of Magpie

When you need to save electricity or reduce the heat generated, try the following:

1. Limit the frame rate.
2. Opt for effects that require lower performance.


================================================
FILE: docs/_Sidebar.md
================================================
- [维基主页](https://github.com/Blinue/Magpie/wiki/)
  - [FAQ](https://github.com/Blinue/Magpie/wiki/FAQ)
  - [编译指南](https://github.com/Blinue/Magpie/wiki/编译指南)
  - [内置效果介绍](https://github.com/Blinue/Magpie/wiki/内置效果介绍)
  - [MagpieFX](https://github.com/Blinue/Magpie/wiki/MagpieFX)
  - [性能优化建议](https://github.com/Blinue/Magpie/wiki/性能优化建议)
  - [捕获方式对比](https://github.com/Blinue/Magpie/wiki/捕获方式对比)
  - [关于触控支持](https://github.com/Blinue/Magpie/wiki/关于触控支持)
  - [以编程方式与 Magpie 交互](https://github.com/Blinue/Magpie/wiki/以编程方式与-Magpie-交互)

- [WIKI HOME](https://github.com/Blinue/Magpie/wiki/Home%20(EN))
  - [FAQ](https://github.com/Blinue/Magpie/wiki/FAQ%20(EN))
  - [Compilation guide](https://github.com/Blinue/Magpie/wiki/Compilation%20guide)
  - [Built-in effects](https://github.com/Blinue/Magpie/wiki/Built-in%20effects)
  - [MagpieFX](https://github.com/Blinue/Magpie/wiki/MagpieFX%20(EN))
  - [Performance optimization](https://github.com/Blinue/Magpie/wiki/Performance%20optimization)
  - [Comparison of capture methods](https://github.com/Blinue/Magpie/wiki/Comparison%20of%20capture%20methods)
  - [About touch support](https://github.com/Blinue/Magpie/wiki/About-touch-support)
  - [Interact with Magpie programally](https://github.com/Blinue/Magpie/wiki/Interact-with-Magpie-programally)


================================================
FILE: docs/以编程方式与 Magpie 交互.md
================================================
Magpie 提供了和其他程序交互的机制。通过它们,你的应用可以和 Magpie 配合使用。

[MagpieWatcher](https://github.com/Blinue/MagpieWatcher) 演示了如何使用这些机制。

## 如何在缩放状态改变时得到通知

你应该监听 `MagpieScalingChanged` 消息。

```c++
UINT WM_MAGPIE_SCALINGCHANGED = RegisterWindowMessage(L"MagpieScalingChanged");
```

### 参数

`wParam` 为事件 ID,对于不同的事件 `lParam` 有不同的含义。支持以下事件:

* 0: 缩放已结束或源窗口失去焦点。缩放结束时 `lParam` 为 0,否则为 1。
* 1: 缩放已开始或源窗口回到前台。`lParam` 为缩放窗口句柄。
* 2: 缩放窗口位置或大小改变。窗口模式缩放时才会生成这个事件。
* 3: 用户开始调整缩放窗口大小或移动缩放窗口。窗口模式缩放时才会生成这个事件。

在调整缩放窗口大小或移动缩放窗口的过程中不会产生事件,但你可以定期检查窗口属性来获得更新的信息。

### 注意事项

如果你的进程完整性级别 (Integration level) 比 Magpie 更高,由于用户界面特权隔离 (UIPI),你将无法收到 Magpie 广播的消息。这种情况下请调用 [ChangeWindowMessageFilterEx](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-changewindowmessagefilterex) 以允许接收 `MagpieScalingChanged` 消息。

```c++
ChangeWindowMessageFilterEx(hYourWindow, WM_MAGPIE_SCALINGCHANGED, MSGFLT_ADD, nullptr);
```

## 如何获取缩放窗口句柄

你可以监听 `MagpieScalingChanged` 消息来获取缩放窗口句柄,也可以查找类名为`Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22`的窗口以在缩放中途获取该句柄。Magpie 将确保此类名不会改变,且不会同时存在多个缩放窗口。

```c++
HWND hwndScaling = FindWindow(L"Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22", nullptr);
```

## 如何将你的窗口置于缩放窗口上方

你应该监听 `MagpieScalingChanged` 消息,根据事件调整自己的 Z 轴顺序。下面是一个简单的示例,更复杂的用例参见 [MagpieWatcher](https://github.com/Blinue/MagpieWatcher)。

```c++
if (message == WM_MAGPIE_SCALINGCHANGED) {
    if (wParam == 0) {
        // 取消置顶
        SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    } else if (wParam == 1) {
        // 确保本窗口在缩放窗口上面
        SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }
}
```

## 如何获取缩放信息

缩放窗口的[窗口属性](https://learn.microsoft.com/en-us/windows/win32/winmsg/about-window-properties)中存储着缩放信息。目前支持以下属性:

* `Magpie.Windowed`:是否处于窗口模式缩放
* `Magpie.SrcHWND`: 源窗口句柄
* `Magpie.SrcLeft`、`Magpie.SrcTop`、`Magpie.SrcRight`、`Magpie.SrcBottom`: 被缩放区域的边界
* `Magpie.DestLeft`、`Magpie.DestTop`、`Magpie.DestRight`、`Magpie.DestBottom`: 缩放后区域矩形边界

```c++
HWND hwndSrc = (HWND)GetProp(hwndScaling, L"Magpie.SrcHWND");
bool isWindowed = (bool)GetProp(hwndScaling, L"Magpie.Windowed");

RECT srcRect;
srcRect.left = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcLeft");
srcRect.top = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcTop");
srcRect.right = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcRight");
srcRect.bottom = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.SrcBottom");

RECT destRect;
destRect.left = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestLeft");
destRect.top = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestTop");
destRect.right = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestRight");
destRect.bottom = (LONG)(INT_PTR)GetProp(hwndScaling, L"Magpie.DestBottom");
```

### 注意事项

1. 这些属性只在缩放窗口初始化完成后才保证存在,因此建议检索属性前检查缩放窗口是否可见,尤其是当窗口句柄是使用类名获取到的。
2. 这些属性中存储的坐标不受 DPI 虚拟化影响,你需要将程序的 DPI 感知级别设置为 Per-Monitor V2 才能正确使用它们。有关详细信息,请参阅 [High DPI Desktop Application Development on Windows](https://learn.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows)。


================================================
FILE: docs/关于触控支持.md
================================================
由于操作系统的安全限制,Magpie 需要 UIAccess 权限来支持触控输入。获得此权限需要满足两个条件:

1. 应用程序必须有一个数字签名,且该签名能够通过与本地计算机上受信任的根证书颁发机构存储相关联的证书来验证。
2. 应用程序必须位于“安全位置”,例如 Program Files、System32 等文件夹中。

启用触控支持时,Magpie 将进行以下操作:

1. 向受信任的根证书颁发机构存储添加自签名证书。
2. 将 TouchHelper.exe 文件复制到 `System32\Magpie` 文件夹。在缩放时,Magpie 会运行此程序以实现触控支持。

这两项操作都对操作系统构成重大更改,因此需要管理员权限。如果不再需要触控支持,应关闭此选项,Magpie 会撤销这些更改,不在操作系统中留下痕迹。

触控支持可能会因为某些原因失效(比如 TouchHelper.exe 需要更新时),如果发生这种情况,Magpie 会在缩放前请求管理员权限来修复它。


================================================
FILE: docs/内置效果介绍.md
================================================
Magpie 内置了大量效果供组合使用,大部分提供了参数选项以订制行为。所有效果存储在 effects 文件夹中,如果你了解 HLSL,你可以很容易的添加任何你想要的效果,见 [MagpieFX](https://github.com/Blinue/Magpie/wiki/MagpieFX)。

## 内置效果介绍

* ACNet:[ACNetGLSL](https://github.com/TianZerL/ACNetGLSL) 的移植。适合动画风格图像的缩放,有较强的降噪效果
  * 输出尺寸:输入的两倍

* AdaptiveSharpen:自适应锐化算法。此算法着重于锐化图像中的模糊边缘,因此相比一般的锐化算法噪点、振铃和条纹更少。
  * 输出尺寸:和输入相同
  * 参数
    * Sharpness:锐化强度

* Anime4K_3D_AA_Upscale_US 和 Anime4K_3D_Upscale_US:Anime4K 提供的 3D 游戏画面缩放算法。AA 变体有抗锯齿的功能
  * 输出尺寸:输入的两倍

* Anime4K_Denoise_Bilateral_Mean、Anime4K_Denoise_Bilateral_Median 和 Anime4K_Denoise_Bilateral_Mode:Anime4K 提供的降噪算法,分别使用平均数、中位数和众数
  * 输出尺寸:和输入相同
  * 参数
    * Strength:降噪强度

* Anime4K_Restore 族:Anime4K 提供的用于还原动漫画面线条的算法,S->M->L->VL->UL 对性能的需求依次提高,Soft 变体效果稍弱
  * 输出尺寸:和输入相同

* Anime4K_Thin_HQ:Anime4K 提供的用于细化动漫画面线条的算法
  * 输出尺寸:和输入相同
  * 参数
    * Strength:每次迭代的强度
    * Iterations:迭代次数。降低 Strength 并提高 Iterations 可以提高画面质量,但会降低速度。

* Anime4K_Upscale 族:Anime4K 提供的动画风格图像缩放算法。Denoise 变体包含降噪效果,GAN 变体处于实验阶段,可以保留更多细节。S、L、VL、UL 对性能的要求依次提高
  * 输出尺寸:输入的两倍

* Bicubic:双立方(双三次)插值算法
  * 输出尺寸:取决于缩放选项
  * 参数
    * B:过滤参数 B。此项过大将模糊
    * C:过滤参数 C。此项过大将产生振铃
  * 备注:通过自由组合不同的BC数值可以实现不同的变体算法,例如:Mitchell(B=C≈0.333333), Catmull-Rom(B=0 C=0.5), bicubic Photoshop(B=0 C=0.75), Spline(B=1 C=0)

* Bilinear:双线性插值
  * 输出尺寸:取决于缩放选项

* CAS:[FidelityFX-CAS](https://github.com/GPUOpen-Effects/FidelityFX-CAS) 的移植。轻量级的锐化效果
  * 输出尺寸:和输入相同
  * 参数
    * Sharpness:锐化强度

* CAS_Scaling:[FidelityFX-CAS](https://github.com/GPUOpen-Effects/FidelityFX-CAS) 的移植。支持缩放
  * 输出尺寸:取决于缩放选项
  * 参数
    * Sharpness:锐化强度

* CRT_Easymode:易于配置的轻量级 CRT 着色器
  * 输出尺寸:取决于缩放选项
  * 参数
    * Sharpness Horizontal:横向锐度
    * Sharpness Vertical:纵向锐度
    * Mask Strength:遮罩强度
    * Mask Dot Width
    * Mask Dot Height
    * Mask Stagger
    * Mask Size
    * Scanline Strength
    * Scanline Beam Width Min
    * Scanline Beam Width Max
    * Scanline Brightness Min
    * Scanline Brightness Max
    * Scanline Cutoff
    * Gamma Input
    * Gamma Output
    * Brightness Boost:用于提高亮度
    * Dilation

* CRT_Geom:最流行的 CRT 着色器之一,旨在模拟 Arcade-machine。此实现不支持模拟隔行扫描。见 [Emulation General Wiki](https://emulation.gametechwiki.com/index.php/CRT_Geom)
  * 输出尺寸:取决于缩放选项
  * 参数
    * Target Gamma
    * Monitor Gamma
    * Distance
    * Curvature:是否模拟屏幕曲率
    * Curvature Radius:曲率半径
    * Corner Size
    * Corner Smoothness
    * Horizontal Tilt
    * Vertical Tilt
    * Horizontal Overscan
    * Vertical Overscan
    * Dot Mask
    * Sharpness:值越大图像越清晰
    * Scanline Weight
    * Luminance Boost:用于提升亮度
  
* CRT_Hyllian:提供锐利清晰的输出,并带有轻微的光晕,类似于索尼的 BVM 系列显示器
  * 输出尺寸:取决于缩放选项
  * 参数
    * Phosphor
    * Vertical Scanlines
    * Input Gamma
    * Output Gamma
    * Sharpness
    * Color Boost
    * Red Boost
    * Green Boost
    * Blue Boost
    * Scanline Strength
    * Min Beam Width
    * Max Beam Width
    * Anti-Ringing

* CRT_Lottes:提供多种遮罩,可以模拟 Bloom 和 Halation 效果。类似于 CGA 街机显示器
  * 输出尺寸:取决于缩放选项
  * 参数
    * Scanline Hardness
    * Pixel Hardness
    * Horizontal Display Warp
    * Vertical Display Warp
    * Mask Dark
    * Mask Light
    * Shadow Mask:遮罩风格
    * Brightness Boost
    * Bloom-X Soft
    * Bloom-Y Soft
    * Bloom Amount
    * Filter Kernel Shape

* CuNNy 族:适合视觉小说风格图像的缩放,由 [CuNNy](https://github.com/funnyplanter/CuNNy) 提供。DS 变体有轻微降噪效果
  * 输出尺寸:输入的两倍

* CuNNy2 族:CuNNy 的改进版
  * 输出尺寸:输入的两倍

* Deband:去除色带
  * 输出尺寸:和输入相同
  * 参数
    * Threshold:当像素之间的差异低于此值时,它被认为是渐变的一部分
    * Range:采样范围。较高的值将找到更多的梯度,较低的值将更积极地去除色带
    * Iterations:迭代次数。增加迭代次数可能会提高质量,但会减慢着色器的速度
    * Grain:噪点强度。在图像中添加一些额外的噪点可以有效遮盖剩余的条纹和伪影,且对视觉质量的影响较小

* FineSharp:高质量的锐化效果,最初是 AviSynth 脚本
  * 输出尺寸:和输入相同
  * 参数
    * sstr:锐化强度。如果改变了此参数,也要改变 cstr,见备注
    * cstr:均衡化的强度
    * xstr:XSharpen 风格的最终锐化步骤的强度
    * xrep:用于修复最终锐化步骤产生的伪影
  * 备注:sstr 和 cstr 的对应关系(sstr->cstr):0->0, 0.5->0.1, 1.0->0.6, 2.0->0.9, 2.5->1.00, 3.0->1.09, 3.5->1.15, 4.0->1.19, 8.0->1.249, 255.0->1.5

* FSR_EASU:[FidelityFX-FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR) 中缩放步骤的移植
  * 输出尺寸:取决于缩放选项

* FSR_RCAS:[FidelityFX-FSR](https://github.com/GPUOpen-Effects/FidelityFX-FSR) 中锐化步骤的移植
  * 输出尺寸:和输入相同
  * 参数
    * Sharpness:锐化强度

* FSRCNNX:FSRCNNX_x2_8-0-4-1 的移植
  * 输出尺寸:输入的两倍

* FSRCNNX_LineArt:FSRCNNX_x2_8-0-4-1_LineArt 的移植
  * 输出尺寸:输入的两倍

* FXAA_Medium、FXAA_High 和 FXAA_Ultra:快速近似抗锯齿。对性能的要求依次提高
   * 输出尺寸:和输入相同

* GTU_v050:旨在模拟 CRT 屏幕的模糊和混合效果而不是遮罩或曲率,支持扫描线
  * 输出尺寸:取决于缩放选项
  * 参数
    * Composite Connection
    * No Scanlines
    * Signal Resolution Y
    * Signal Resolution I
    * Signal Resolution Q
    * TV Vertical Resolution
    * Black Level
    * Contrast

* ImageAdjustment:图像参数调整
  * 输出尺寸:和输入相同
  * 参数
    * Target Gamma:和 monitorGamma 搭配使用以调节 gamma,此参数指定目标 gamma 值
    * Monitor Gamma:当前屏幕的 gamma 值
    * Saturation:色度
    * Luminance:HSV 空间的明度
    * Contrast:对比度
    * Brightness Boost:亮度调整
    * Black Level:暗场强度
    * Red Channel:红色通道颜色缩放
    * Green Channel:绿色通道颜色缩放
    * Blue Channel:蓝色通道颜色缩放

* Jinc:使用 Jinc 算法缩放输入
  * 输出尺寸:取决于缩放选项
  * 参数
    * Window Sinc Param:值越小图像越锐利
    * Sinc Param:值越大图像越锐利
    * Anti-ringing Strength:抗振铃强度

* Lanczos:使用 Lanczos 算法缩放输入。
  * 输出尺寸:取决于缩放选项
  * 参数
    * Anti-ringing Strength:抗震铃强度。值越大抗震铃效果越好,但图像越模糊

* LCAS:轻量级 3D 画面缩放算法
  * 输出尺寸:取决于缩放选项
  * 参数
    * Sharpness:锐化强度

* LumaSharpen:reshade 中流行的锐化效果。
  * 输出尺寸:和输入相同
  * 参数
    * Sharpening Strength:锐化强度
    * Sharpening Limit:抗振铃强度
    * Sample Pattern:滤波器类型,支持 4 种滤波器
    * Offset Bias:滤波器参数的偏移量

* MMPX:像素画缩放算法。可在保留艺术风格的同时添加细节
  * 输出尺寸:输入的两倍

* Nearest:最近邻插值
  * 输出尺寸:取决于缩放选项

* NIS:[NVIDIA Image Scaling](https://github.com/NVIDIAGameWorks/NVIDIAImageScaling) 的移植
  * 输出尺寸:取决于缩放选项
  * 参数
    * Sharpness:锐化强度
  * 备注:只支持放大

* NNEDI3 族:原本用于去隔行,也是高质量的插值算法。移植自 https://github.com/bjin/mpv-prescalers
  * 输出尺寸:输入的两倍

* NVSharpen:随 NIS 发布的 NVSharpen 的移植
  * 输出尺寸:和输入相同
  * 参数
    * Sharpness:锐化强度

* Pixellate:使用 Pixellate 算法缩放输入。适合放大像素画
  * 输出尺寸:取决于缩放选项

* RAVU 族:移植自 https://github.com/bjin/mpv-prescalers
  * 输出尺寸:输入的两倍

* RAVU-Zoom 族:移植自 https://github.com/bjin/mpv-prescalers
  * 输出尺寸:取决于缩放选项
  * 备注:只支持放大

* SGSR:[Snapdragon Game Super Resolution v1](https://github.com/SnapdragonStudios/snapdragon-gsr/tree/main/sgsr/v1) 的移植
  * 输出尺寸:取决于缩放选项
  * 参数
    * Edge Sharpness:边缘锐化强度(值越大图像越锐利)
    * Edge Threshold:边缘检测阈值

* SharpBilinear:使用 Sharp-Bilinear 算法缩放输入。适合放大像素画
  * 输出尺寸:取决于缩放选项

* SMAA_Low、SMAA_Medium、SMAA_High 和 SMAA_Ultra:SMAA 抗锯齿算法。对性能的要求依次提高
   * 输出尺寸:和输入相同

* SSimDownscaler:基于感知的图像缩小算法。移植自 [igv/SSimDownscaler.glsl](https://gist.github.com/igv/36508af3ffc84410fe39761d6969be10)
  * 输出尺寸:取决于缩放选项
  * 参数
    * Oversharp:值越大图像越锐利
  
* xBRZ_2x、xBRZ_3x、xBRZ_4x、xBRZ_5x 和 xBRZ_6x:使用 xBRZ 算法缩放输入。适合放大像素画
  * 输出尺寸:取决于变体。放大到输入的 2-6 倍

* xBRZ_Freescale:支持任意缩放倍数的 xBRZ 算法
  * 输出尺寸:取决于缩放选项


================================================
FILE: docs/性能优化建议.md
================================================
如果你遇到了性能问题(卡顿、延迟、功耗过高等),本文档可能有所帮助。

下面是一些你可能面临的情况:

## 我的显卡性能不足

如果你无法流畅使用一些有较高性能要求的效果(如 Anime4K、AdaptiveSharpen 等),请尝试下面的操作:

1. 更换为性能需求更低的效果。如 Anime4K_Upscale_S 比 Anime4K_Upscale_L 快的多,CAS 比 AdaptiveSharpen 快的多,它们可以有效提高流畅度,代价是一定程度的画面质量损失。
2. 尝试更换捕获模式。建议你每种模式都尝试一下。

## 间歇性卡顿

假设你的显卡性能对于运行 Magpie 绰绰有余,但依然遇到卡顿问题。请尝试下面的操作:

<details>
    <summary>对于 Nvidia 用户</summary>

### 假设您使用的是 Windows 11 24H2

以下提示仅适用于 Nvidia 用户。Nvidia 显卡的驱动程序配置不当可能是造成卡顿的原因。

快速提示:将 Nvidia 驱动程序设置恢复为默认设置(全新安装)将解决大多数问题。但是,如果您坚持使用自己的设置,让我们解释一下驱动程序设置如何给程序带来麻烦。

#### 缩放一段时间后出现奇怪的帧率下降

刚开始时一切正常(游戏 60 FPS / Magpie 60 FPS),但大约 10~15 秒后,游戏和 Magpie 的帧率都会下降到 37 FPS 左右,同时 GPU 占用率飙升至 100%,GPU 频率从约 1000MHz 降至 700MHz。

首先,如果你在游戏时使用了“电源管理模式:最佳功耗”,尝试将 Magpie 设为“首选最大性能”或“自适应”(我尚未测试“自适应”模式,效果不保证)。游戏本身保持“最佳功耗”模式即可。这样设置后,GPU 频率将不会异常下降。

#### Nvidia App 与 Nvidia 控制面板

不过,我的一台电脑即便使用上述方法仍然无法解决,而其他设备都能正常恢复。经过调查发现,Nvidia App 和 Nvidia 控制面板之间存在兼容性问题。如果你使用 Nvidia App 修改了驱动设置,然后在控制面板中修改相同的设置,可能会导致控制面板崩溃,或出现“访问被拒绝”的错误。此外,Nvidia App 进行的驱动设置更改不会真正应用到游戏或程序。

如果你使用的是 Nvidia App 11.0.2.341 版本,并搭配 572.16 版驱动,请不要通过 Nvidia App 调整 Nvidia 驱动设置。解决方案如下:

1. 关闭 Nvidia App 和 Nvidia 控制面板。
2. 进入 C:\ProgramData\NVIDIA Corporation\Drs 目录,删除所有 .bin 文件,例如 nvdrsdb0.bin、nvdrsdb1.bin、nvdrssel.bin、update.bin 等。
3. 重新打开 Nvidia 控制面板,手动重新配置所有全局设置和特定程序的设置。
4. 之后避免使用 Nvidia App 修改驱动设置。

#### 画面看起来不如原生游戏窗口流畅

使用 `Graphics Capture` 或 `Desktop Duplication` 时,即使游戏和 Magpie 都是 60 FPS,画面仍然不够流畅。

调查结果表明,这可能与垂直同步有关。至少在 Windows 11 24H2 版本中,游戏必须开启垂直同步,才能保证 WGC 和 DXGI 捕获模式不会丢帧。否则,即使捕获和游戏都运行在 60 FPS,仍可能发生帧丢失或重复帧现象。

推荐的垂直同步设置:

* 游戏:使用传统垂直同步模式,例如:
  * “使用 3D 应用程序设置”并在游戏内启用 V-Sync
  * 直接选择“垂直同步:开”
* 不要使用以下选项:
  * 关闭垂直同步
  * “垂直同步:快速”模式
* 未测试但可能有效的选项:
  * “垂直同步:自适应 / 自适应(半刷新率)”

对于 Magpie,请选择“使用 3D 应用程序设置”。

#### 使用 Desktop Duplication 时丢帧严重

即使游戏 60 FPS / Magpie 60 FPS,仍然会遇到大量丢帧问题。我发现这种情况出现在 Magpie v0.10.6 版本。解决方法:

* 在 Magpie 设置中启用垂直同步,并在 Nvidia 控制面板中将 Magpie 的垂直同步设置为“使用 3D 应用程序设置”。
* 升级到 Magpie v0.11.1 也能解决此问题。

#### GPU 使用率接近 100% 时 Magpie 丢帧严重

同时,游戏帧率略低于显示器帧率,例如游戏帧率 57 FPS / 显示器帧率 60 Hz。如果不使用 Magpie,原生游戏窗口看起来很流畅。

尝试关闭“硬件加速 GPU 计划”并重启。我发现,当 GPU 负载过重且 GPU 计划开启时,WGC 和桌面复制都无法正确处理帧。关闭 GPU 计划后,游戏帧率仍然很低,但 Magpie 不会再“视觉上”低于 10 FPS。

#### 屏幕观感不流畅,但帧率看起来正常

游戏 60 FPS / Magpie 60 FPS / 显示器 60 Hz,但出现丢帧。这种情况在未缩放、直接运行游戏窗口时也会发生。

请检查是否启用了“最大帧率限制”和垂直同步。例如,在上述情况下,如果你已经打开了垂直同步,同时将最大帧率限制设为 60 FPS,请移除该限制。

如果你有其他帧率限制程序(如 MSI Afterburner RTSS),也请将其关闭。

常见误区:
1. 将“最大帧率”设置为全局 60 FPS,然后对某些程序关闭帧率限制,这实际上不会如你所愿生效。如果你对程序关闭了最大帧率限制和垂直同步,但启用了全局最大帧率,游戏和 Magpie 仍会遵循全局的帧率限制。
1. 有人将“最大帧率”视作更优的垂直同步方法,理由是“这样可以降低输入延迟”。其实并非如此。最大帧率限制并不是垂直同步,它无法保证每一帧都能被完整呈现,而传统的垂直同步正是为此目的而设计的。

#### 低延迟模式

如果遇到其他奇怪的现象,可以检查这些选项。我不确定 Magpie 是否有这些问题,但对于 Lossless Scaling,使用“低延迟模式:超高”会导致 WGC API 缩放后拖拽鼠标时,释放鼠标按钮后鼠标位置和释放按钮时不一致。

为 Magpie 设置“低延迟模式:关闭”。但对于游戏,如果你确定启用“低延迟模式:超高”不会引发问题,也可以保留该设置。例如,一些旧的 DirectX 9 游戏在启用此模式后可能会出现掉帧或输入延迟问题,如果遇到这种情况,建议将其关闭。

</details>

<details>
    <summary>对于 AMD 用户</summary>

欢迎分享更多性能优化技巧!你也可以查看 Nvidia 相关建议,看看其中哪些适用于你的配置。

</details>

<details>
    <summary>超线程和大小核CPU</summary>

#### 超线程与 Intel Alder Lake 大小核架构 CPU

如果你不想关闭超线程,可以使用批处理命令来限制游戏和 Magpie 的 CPU 亲和性(Affinity)。对游戏或其启动器使用 cmd.exe 批处理 `start /affinity 0x55 "" "C:\path to\game.exe"`,游戏将继承父进程的 CPU 亲和性。对 Magpie 使用 `start /affinity 0xaa`。此外,你还可以调整游戏图形设置,尽量将游戏的 CPU 占用控制在 50% 以下(以 4 核 8 线程 CPU 为例,相当于使用 4 个物理核心)。

0x55 指定游戏在 4 核 CPU 的 0 2 4 6 逻辑核心上运行,0xaa 指定其他程序在 1 3 5 7 上运行。

如果需要提高进程优先级,可以使用 `start /abovenormal` 为游戏和 Magpie 设置“高于正常”优先级。但需要注意,某些游戏在设置 CPU 亲和性和提高进程优先级后可能更容易崩溃,具体原因不明。例如,dwm.exe 系统服务本身就以“高”优先级运行。若遇到稳定性问题,可以考虑改用高性能电源计划,让 CPU 长时间运行在最高频率。

0x55 和 0xaa 只是示例值,你可以使用 [Bitsum CPU 亲和性计算器](https://bitsum.com/tools/cpu-affinity-calculator) 来计算适合自己 CPU 的值。

此外,你也可以利用这种方法,强制游戏仅运行在 Intel Alder Lake 大小核架构的“大核”上,以获得更好的性能。

参考:
https://superuser.com/questions/690509/does-windows-know-how-to-appropriately-assign-threads-to-a-quad-core-processor-t

</details>

### 仍然卡顿?
1. 更换捕获模式。建议你每种模式都尝试一下。
2. 打开“禁用 DirectFlip”。DirectFlip 是一个用于降低输入延迟的技术,但可能和某些游戏不兼容。
3. 试试切换使用的显卡。
4. 提高 Magpie 的进程优先级以及在驱动中提高 Magpie 的优先级(如果有这个选项)。
5. 如果上面的尝试不起作用,请提交一个 [Issue (Performance)](https://github.com/Blinue/Magpie/issues/new?assignees=&labels=performance&template=02_performance.yaml)。

## 我想降低 Magpie 的功耗

在需要节省电量或降低发热时,请尝试下面的操作:

1. 限制帧率。
2. 更换为性能需求更低的效果。


================================================
FILE: docs/捕获方式对比.md
================================================
Magpie 提供数种捕获方式,根据使用场景,它们各有优劣。无特殊需求应使用 Graphics Capture,它提供最好的兼容性和流畅度。

| | Graphics Capture | Desktop Duplication | GDI | DwmSharedSurface |
| :---: | :---: | :---: | :---: |:---: |
| 支持捕获 DirectComposition (如 UWP) | 是 | 是 | 否 | 否 |
| 支持录制/串流 | 特殊情况下不支持<sup>[1]</sup> | 否 | 是 | 是 |
| 支持源窗口跨越多个屏幕 | 特殊情况下不支持<sup>[1]</sup> | 否 | 是 | 是 |
| 无视 DPI 虚拟化<sup>[2]</sup> | 否 | 否 | 是| 是 |
| 备注 | 首选捕获方式 | 要求 Win10 v2004 | | 性能不稳定,不建议使用 |

[1]: (1) 源窗口不支持常规的窗口捕获 (2) 操作系统为 Windows 11

[2]: 系统会对不支持 DPI 缩放的窗口进行双三次插值放大,支持此项的捕获方式可以捕获到放大前的图像


================================================
FILE: docs/编译指南.md
================================================
## 先决条件

为了编译 Magpie,你首先需要安装:

1. Visual Studio 2022 或 2026 的最新版本,需要安装“使用 C++ 的桌面开发”和“通用 Windows 平台开发”两个工作负荷以及 Windows SDK build 26100 或更高版本。
2. [CMake](https://cmake.org/)

   你也可以使用 Visual Studio 内置的 CMake,它位于 `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`。
3. [Python](https://www.python.org/) 3.11+
4. [Conan](https://conan.io/)

   ```bash
   pip install conan
   ```
   
   确保上述依赖均已被添加入系统路径,使用以下命令检查:
   ```bash
   cmake --version
   python --version
   conan --version
   ```

## 编译

1. 克隆存储库

   ```bash
   git clone https://github.com/Blinue/Magpie
   ```

2. 打开根目录的 Magpie.slnx 然后生成解决方案。

## 启用触控支持

为了支持触控输入,TouchHelper.exe 应签名。签名是在 CI 中自动进行的,但你也可以手动签名,请执行以下步骤:

1. 创建自签名证书,将其导出为 pfx。
2. 将 `src/Magpie/TouchHelper.cpp` 中的 `CERT_FINGERPRINT` 常量替换为你的证书的 SHA-1 哈希值(也即该证书的指纹)。
3. 在存储库根目录下执行以下命令:

```bash
python scripts/publish.py --pfx-path=<pfx 路径> --pfx-password=<pfx 密码>
```

这将编译 Magpie 并为 TouchHelper.exe 签名。编译出的程序位于 `publish\x64`。


================================================
FILE: natvis/magpie.natvis
================================================
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="SmallVectorImpl&lt;*&gt;">
    <DisplayString IncludeView ="elt0" Condition="Size == 0"></DisplayString>
    <DisplayString IncludeView ="elt0">{(($T1*)BeginX)[0]}{*this,view(elt1)}</DisplayString>
    <DisplayString IncludeView ="elt1" Condition="Size == 1"></DisplayString>
    <DisplayString IncludeView ="elt1">, {(($T1*)BeginX)[1]}{*this,view(elt2)}</DisplayString>
    <DisplayString IncludeView ="elt2" Condition="Size == 2"></DisplayString>
    <DisplayString IncludeView ="elt2">, {(($T1*)BeginX)[2]}{*this,view(elt3)}</DisplayString>
    <DisplayString IncludeView ="elt3" Condition="Size == 3"></DisplayString>
    <DisplayString IncludeView ="elt3">, {(($T1*)BeginX)[3]}{*this,view(elt4)}</DisplayString>
    <DisplayString IncludeView ="elt4" Condition="Size == 4"></DisplayString>
    <DisplayString IncludeView ="elt4">, /* {Size - 4} more*/ </DisplayString>
    <DisplayString Condition="Size == 0">empty</DisplayString>
    <DisplayString Condition="Size != 0">{{{*this,view(elt0)}}}</DisplayString>
    <DisplayString>Uninitialized</DisplayString>
    <Expand>
      <Item Name="[size]">Size</Item>
      <Item Name="[capacity]">Capacity</Item>
      <ArrayItems>
        <Size>Size</Size>
        <ValuePointer>($T1*)BeginX</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>


================================================
FILE: natvis/phmap.natvis
================================================
<?xml version="1.0" encoding="utf-8"?>  

<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">  
  <!-- flat map/set  -->
  <Type            Name="phmap::flat_hash_set&lt;*,*,*,*&gt;">  
  <AlternativeType Name="phmap::flat_hash_map&lt;*,*,*,*,*&gt;" />  
      <DisplayString>{{size = {size_}}}</DisplayString>  
      <Expand>  
        <CustomListItems MaxItemsPerView="1000" ExcludeView="Test">  
          <Variable Name="ctrl" InitialValue="ctrl_" />  
          <Variable Name="slot" InitialValue="slots_" />  
          <Variable Name="ctrl_end" InitialValue="ctrl_ + capacity_" />  
          <Variable Name="slot_end" InitialValue="slots_ + capacity_" />  
    
          <Size>size_</Size>  
          <Loop>  
              <Break Condition="slot == slot_end" />  
              <If Condition="*ctrl >= -1">
                <Item>*slot,na</Item>  
              </If>  
              <Exec>++slot</Exec>  
              <Exec>++ctrl</Exec>  
          </Loop>
        </CustomListItems>  
      </Expand>  
  </Type>  

  <!-- node map/set - only difference is the **slot instead of *slot -->
  <Type            Name="phmap::node_hash_set&lt;*,*,*,*&gt;">  
  <AlternativeType Name="phmap::node_hash_map&lt;*,*,*,*,*&gt;" />  
      <DisplayString>{{size = {size_}}}</DisplayString>  
      <Expand>  
        <CustomListItems MaxItemsPerView="1000" ExcludeView="Test">  
          <Variable Name="ctrl" InitialValue="ctrl_" />  
          <Variable Name="slot" InitialValue="slots_" />  
          <Variable Name="ctrl_end" InitialValue="ctrl_ + capacity_" />  
          <Variable Name="slot_end" InitialValue="slots_ + capacity_" />  
    
          <Size>size_</Size>  
          <Loop>  
              <Break Condition="slot == slot_end" />  
              <If Condition="*ctrl >= -1">
                <Item>**slot,na</Item>  
              </If>  
              <Exec>++slot</Exec>  
              <Exec>++ctrl</Exec>  
          </Loop>
        </CustomListItems>  
      </Expand>  
  </Type>  
    
  <Type Name="phmap::priv::map_slot_type&lt;*,*&gt;">
    <DisplayString>{value}</DisplayString>
  </Type>

  <!-- flat map iterators -->
  <Type Name="phmap::priv::raw_hash_set&lt;*,*,*,*&gt;::iterator">
       <DisplayString Condition="ctrl_ == 0">unset</DisplayString>
       <DisplayString Condition="!(*ctrl_ >= 0)">end()</DisplayString>
       <DisplayString>{*slot_,na}</DisplayString>
  </Type>

  <!-- node map iterators  - only difference is the **slot_ instead of * -->
  <Type Name="phmap::priv::raw_hash_set&lt;phmap::priv::NodeHashSetPolicy&lt;*&gt;,*,*,*&gt;::iterator">
       <DisplayString Condition="ctrl_ == 0">unset</DisplayString>
       <DisplayString Condition="!(*ctrl_ >= 0)">end()</DisplayString>
       <DisplayString>{**slot_,na}</DisplayString>
  </Type>

  <!-- parallel flat/node set -->
  <Type            Name="phmap::parallel_flat_hash_set&lt;*,*,*,*,*,*&gt;">  
  <AlternativeType Name="phmap::parallel_node_hash_set&lt;*,*,*,*,*,*&gt;" />  
      <DisplayString>{{size = ?}}</DisplayString>  
      <Expand>  
        <CustomListItems MaxItemsPerView="1000" ExcludeView="Test">  
          <Variable Name="idx" InitialValue="0" />  
          <Variable Name="maxidx" InitialValue="$T5" />  
          <Variable Name="ctrl" InitialValue="sets_._Elems[0].set_.ctrl_" />  
          <Variable Name="slot" InitialValue="sets_._Elems[0].set_.slots_" />  
          <Variable Name="ctrl_end" InitialValue="sets_._Elems[0].set_.ctrl_" />  
          <Variable Name="slot_end" InitialValue="sets_._Elems[0].set_.slots_" />  
          <Exec>maxidx = 2 &lt;&lt; maxidx</Exec>
          <Loop>  
                <Break Condition="idx == maxidx" />  
                <Exec>ctrl = sets_._Elems[idx].set_.ctrl_</Exec>  
                <Exec>slot = sets_._Elems[idx].set_.slots_</Exec>  
                <Exec>ctrl_end = sets_._Elems[idx].set_.ctrl_ + sets_._Elems[idx].set_.capacity_</Exec>  
                <Exec>slot_end = sets_._Elems[idx].set_.slots_ + sets_._Elems[idx].set_.capacity_</Exec>  
                <Loop>  
                    <Break Condition="slot == slot_end" />  
                    <If Condition="*ctrl >= -1">
                      <Item>*slot,na</Item>  
                    </If>  
                    <Exec>++slot</Exec>  
                    <Exec>++ctrl</Exec>  
                </Loop>
                <Exec>++idx</Exec>  
          </Loop>
        </CustomListItems>  
      </Expand>  
  </Type>  

  <!-- parallel flat/node map - only difference is $T6 instead of $T5 -->
  <Type            Name="phmap::parallel_flat_hash_map&lt;*,*,*,*,*,*,*&gt;">  
  <AlternativeType Name="phmap::parallel_node_hash_map&lt;*,*,*,*,*,*,*&gt;" /> 
      <DisplayString>{{size = ?}}</DisplayString>  
      <Expand>  
        <CustomListItems MaxItemsPerView="1000" ExcludeView="Test">  
          <Variable Name="idx" InitialValue="0" />  
          <Variable Name="maxidx" InitialValue="$T6" />  
          <Variable Name="ctrl" InitialValue="sets_._Elems[0].set_.ctrl_" />  
          <Variable Name="slot" InitialValue="sets_._Elems[0].set_.slots_" />  
          <Variable Name="ctrl_end" InitialValue="sets_._Elems[0].set_.ctrl_" />  
          <Variable Name="slot_end" InitialValue="sets_._Elems[0].set_.slots_" />  
          <Exec>maxidx = 2 &lt;&lt; maxidx</Exec>
          <Loop>  
                <Break Condition="idx == maxidx" />  
                <Exec>ctrl = sets_._Elems[idx].set_.ctrl_</Exec>  
                <Exec>slot = sets_._Elems[idx].set_.slots_</Exec>  
                <Exec>ctrl_end = sets_._Elems[idx].set_.ctrl_ + sets_._Elems[idx].set_.capacity_</Exec>  
                <Exec>slot_end = sets_._Elems[idx].set_.slots_ + sets_._Elems[idx].set_.capacity_</Exec>  
                <Loop>  
                    <Break Condition="slot == slot_end" />  
                    <If Condition="*ctrl >= -1">
                      <Item>*slot,na</Item>  
                    </If>  
                    <Exec>++slot</Exec>  
                    <Exec>++ctrl</Exec>  
                </Loop>
                <Exec>++idx</Exec>  
          </Loop>
        </CustomListItems>  
      </Expand>  
  </Type>  

  <Type Name="phmap::priv::parallel_hash_set&lt;*,*,*,*,*,*,*&gt;::iterator">
       <DisplayString>{it_,na}</DisplayString>
  </Type>

</AutoVisualizer>  


================================================
FILE: natvis/rapidjson.natvis
================================================
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
	<!-- rapidjson::GenericValue - basic support -->
	<Type Name="rapidjson::GenericValue&lt;*,*&gt;">
		<DisplayString Condition="(data_.f.flags &amp; kTypeMask) == rapidjson::kNullType">null</DisplayString>
		<DisplayString Condition="data_.f.flags == kTrueFlag">true</DisplayString>
		<DisplayString Condition="data_.f.flags == kFalseFlag">false</DisplayString>
		<DisplayString Condition="data_.f.flags == kShortStringFlag">{(const Ch*)data_.ss.str,na}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kTypeMask) == rapidjson::kStringType">{(const Ch*)((size_t)data_.s.str &amp; 0x0000FFFFFFFFFFFF),[data_.s.length]na}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kNumberIntFlag) == kNumberIntFlag">{data_.n.i.i}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kNumberUintFlag) == kNumberUintFlag">{data_.n.u.u}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kNumberInt64Flag) == kNumberInt64Flag">{data_.n.i64}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kNumberUint64Flag) == kNumberUint64Flag">{data_.n.u64}</DisplayString>
		<DisplayString Condition="(data_.f.flags &amp; kNumberDoubleFlag) == kNumberDoubleFlag">{data_.n.d}</DisplayString>
		<DisplayString Condition="data_.f.flags == rapidjson::kObjectType">Object members={data_.o.size}</DisplayString>
		<DisplayString Condition="data_.f.flags == rapidjson::kArrayType">Array members={data_.a.size}</DisplayString>
		<Expand>
			<Item Condition="data_.f.flags == rapidjson::kObjectType" Name="[size]">data_.o.size</Item>
			<Item Condition="data_.f.flags == rapidjson::kObjectType" Name="[capacity]">data_.o.capacity</Item>
			<ArrayItems Condition="data_.f.flags == rapidjson::kObjectType">
				<Size>data_.o.size</Size>
				<!-- NOTE: Rapidjson stores some extra data in the high bits of pointers, which is why the mask -->
				<ValuePointer>(rapidjson::GenericMember&lt;$T1,$T2&gt;*)(((size_t)data_.o.members) &amp; 0x0000FFFFFFFFFFFF)</ValuePointer>
			</ArrayItems>

			<Item Condition="data_.f.flags == rapidjson::kArrayType" Name="[size]">data_.a.size</Item>
			<Item Condition="data_.f.flags == rapidjson::kArrayType" Name="[capacity]">data_.a.capacity</Item>
			<ArrayItems Condition="data_.f.flags == rapidjson::kArrayType">
				<Size>data_.a.size</Size>
				<!-- NOTE: Rapidjson stores some extra data in the high bits of pointers, which is why the mask -->
				<ValuePointer>(rapidjson::GenericValue&lt;$T1,$T2&gt;*)(((size_t)data_.a.elements) &amp; 0x0000FFFFFFFFFFFF)</ValuePointer>
			</ArrayItems>

		</Expand>
	</Type>

</AutoVisualizer>


================================================
FILE: scripts/publish.py
================================================
import sys
import os
import subprocess
import glob
import argparse

try:
    # https://docs.github.com/en/actions/learn-github-actions/variables
    if os.environ["GITHUB_ACTIONS"].lower() == "true":
        # 不知为何在 Github Actions 中运行时默认编码为 ANSI,并且 print 需刷新流才能正常显示
        for stream in [sys.stdout, sys.stderr]:
            stream.reconfigure(encoding="utf-8")
except:
    pass

argParser = argparse.ArgumentParser()
argParser.add_argument("--compiler", choices=["MSVC", "ClangCL"], default="MSVC")
argParser.add_argument("--platform", choices=["x64", "ARM64"], default="x64")
argParser.add_argument("--use-native-march", action="store_true")
argParser.add_argument("--version-major", type=int, default=0)
argParser.add_argument("--version-minor", type=int, default=0)
argParser.add_argument("--version-patch", type=int, default=0)
argParser.add_argument("--version-string", default="")
argParser.add_argument("--pfx-path", default="")
argParser.add_argument("--pfx-password", default="")
args = argParser.parse_args()

#####################################################################
#
# 使用 vswhere 查找 msbuild
#
#####################################################################

programFilesX86Path = os.environ["ProgramFiles(x86)"]
vswherePath = programFilesX86Path + "\\Microsoft Visual Studio\\Installer\\vswhere.exe"
if not os.access(vswherePath, os.X_OK):
    raise Exception("未找到 vswhere")

p = subprocess.run(
    vswherePath
    + " -latest -requires Microsoft.Component.MSBuild -find MSBuild\\**\\Bin\\MSBuild.exe",
    capture_output=True,
)
msbuildPath = str(p.stdout, encoding="utf-8").splitlines()[0]
if not os.access(msbuildPath, os.X_OK):
    raise Exception("未找到 msbuild")

#####################################################################
#
# 编译
#
#####################################################################

os.chdir(os.path.dirname(__file__) + "\\..")

p = subprocess.run("git rev-parse --short HEAD", capture_output=True)
commitId = str(p.stdout, encoding="utf-8")[0:-1]

versionNumProps = f";MajorVersion={args.version_major};MinorVersion={args.version_minor};PatchVersion={args.version_patch}"
versionStrProp = "" if args.version_string == "" else f";VersionString={args.version_string}"

p = subprocess.run(
    f'"{msbuildPath}" Magpie.slnx -m -t:Rebuild -restore -p:RestorePackagesConfig=true;Configuration=Release;Platform={args.platform};DisablePDB=true;UseClangCL={args.compiler == "ClangCL"};UseNativeMicroArch={args.use_native_march};OutDir={os.getcwd()}\\publish\\{args.platform}\\;CommitId={commitId}{versionNumProps}{versionStrProp}'
)
if p.returncode != 0:
    raise Exception("编译失败")

#####################################################################
#
# 清理不需要的文件
#
#####################################################################

os.chdir("publish\\" + args.platform)


# 删除文件,忽略错误
def remove_file(file):
    try:
        os.remove(file)
    except:
        pass


for file in glob.glob("*.lib"):
    remove_file(file)

print("清理完毕", flush=True)

#####################################################################
#
# 为 TouchHelper 签名
#
#####################################################################

if args.pfx_path != "":
    pfxPath = os.path.join("..\\..", args.pfx_path)

    # 取最新的 Windows SDK
    windowsSdkDir = max(
        glob.glob(programFilesX86Path + "\\Windows Kits\\10\\bin\\10.*")
    )
    passwordOption = "" if args.pfx_password == "" else f'/p "{args.pfx_password}"'
    p = subprocess.run(
        f'"{windowsSdkDir}\\x64\\signtool.exe" sign /fd SHA256 /a /f "{pfxPath}" {passwordOption} TouchHelper.exe'
    )
    if p.returncode != 0:
        raise Exception("签名失败")


================================================
FILE: scripts/release.py
================================================
import sys
import os
import subprocess
import shutil
import requests
import hashlib
import json
import argparse

try:
    # https://docs.github.com/en/actions/learn-github-actions/variables
    if os.environ["GITHUB_ACTIONS"].lower() == "true":
        # 不知为何在 Github Actions 中运行时默认编码为 ANSI,并且 print 需刷新流才能正常显示
        for stream in [sys.stdout, sys.stderr]:
            stream.reconfigure(encoding="utf-8")
except:
    pass

argParser = argparse.ArgumentParser()
argParser.add_argument("version_major", type=int)
argParser.add_argument("version_minor", type=int)
argParser.add_argument("version_patch", type=int)
argParser.add_argument("tag")
argParser.add_argument("prerelease")
argParser.add_argument("access_token")
args = argParser.parse_args()

isPrerelease = args.prerelease.lower() == "true"

repo = os.environ["GITHUB_REPOSITORY"]
actor = os.environ["GITHUB_ACTOR"]

subprocess.run("git config user.name " + actor)
subprocess.run(f"git config user.email {actor}@users.noreply.github.com")

subprocess.run(
    f"git remote set-url origin https://{args.access_token}@github.com/{repo}.git"
)

# 打标签
if subprocess.run(f"git tag -a {args.tag} -m {args.tag}").returncode != 0:
    raise Exception("打标签失败")

if subprocess.run("git push origin " + args.tag).returncode != 0:
    raise Exception("推送标签失败")

print("已创建标签 " + args.tag, flush=True)

headers = {
    "Accept": "application/vnd.github+json",
    "Authorization": "Bearer " + args.access_token,
    "X-GitHub-Api-Version": "2022-11-28",
}

# 获取前一个发布版本来生成默认发行说明
prevReleaseTag = None
try:
    if isPrerelease:
        # 发布预发行版与最新的版本(无论是正式版还是预发行版)对比
        response = requests.get(
            f"https://api.github.com/repos/{repo}/releases",
            headers=headers,
            params={"per_page": 1}
        )
        if response.ok:
            prevReleaseTag = response.json()[0]["tag_name"]
    else:
        # 发布正式版则与最新的正式版对比
        # 由于可以自己选择最新版本,此接口可能不会返回时间上最新发布的版本,不是大问题
        response = requests.get(
            f"https://api.github.com/repos/{repo}/releases/latest", headers=headers
        )
        if response.ok:
            prevReleaseTag = response.json()["tag_name"]
except:
    # 忽略错误
    pass

# 发布 release
if prevReleaseTag == None:
    body = ""
else:
    # 默认发行说明为比较两个 tag
    body = f"https://github.com/{repo}/compare/{prevReleaseTag}...{args.tag}"

response = requests.post(
    f"https://api.github.com/repos/{repo}/releases",
    json={
        "tag_name": args.tag,
        "name": args.tag,
        "prerelease": isPrerelease,
        "body": body,
        "discussion_category_name": "Announcements",
    },
    headers=headers,
)
if not response.ok:
    raise Exception("发布失败")

uploadUrl = response.json()["upload_url"]
uploadUrl = uploadUrl[: uploadUrl.find("{")] + "?name="

os.chdir(os.path.dirname(__file__) + "\\..\\publish")

pkgInfos = {}
for platform in ["x64", "ARM64"]:
    # 打包成 zip
    pkgName = "Magpie-" + args.tag + "-" + platform
    shutil.make_archive(pkgName, "zip", pkgName)
    pkgName += ".zip"

    # 上传资产
    with open(pkgName, "rb") as f:
        # 流式上传
        # https://requests.readthedocs.io/en/latest/user/advanced/#streaming-uploads
        response = requests.post(
            uploadUrl + pkgName,
            data=f,
            headers={**headers, "Content-Type": "application/zip"},
        )

        if not response.ok:
            raise Exception("上传失败")

        # 计算哈希
        f.seek(0, os.SEEK_SET)
        md5 = hashlib.file_digest(f, hashlib.md5).hexdigest()

    pkgInfos[platform] = (pkgName, md5)

print("已发布 " + args.tag, flush=True)

# 更新 version.json
# 此步应在发布版本之后,因为程序使用 version.json 检查更新
os.chdir("..")
with open("version.json", "w", encoding="utf-8") as f:
    json.dump(
        {
            "version": f"{args.version_major}.{args.version_minor}.{args.version_patch}",
            "tag": args.tag,
            "binary": {
                "x64": {
                    "url": f"https://github.com/{repo}/releases/download/{args.tag}/{pkgInfos['x64'][0]}",
                    "hash": pkgInfos["x64"][1],
                },
                "ARM64": {
                    "url": f"https://github.com/{repo}/releases/download/{args.tag}/{pkgInfos['ARM64'][0]}",
                    "hash": pkgInfos["ARM64"][1],
                },
            },
        },
        f,
        indent=4,
    )

# 提交对 version.json 的更改
if subprocess.run("git add version.json").returncode != 0:
    raise Exception("git add 失败")

if subprocess.run('git commit -m "Update version.json"').returncode != 0:
    raise Exception("git commit 失败")

if subprocess.run("git push").returncode != 0:
    raise Exception("git push 失败")


================================================
FILE: scripts/wiki.py
================================================
import sys
import os
import tempfile
import glob
import shutil
import subprocess
import argparse

try:
    # https://docs.github.com/en/actions/learn-github-actions/variables
    if os.environ["GITHUB_ACTIONS"].lower() == "true":
        # 不知为何在 Github Actions 中运行时默认编码为 ANSI,并且 print 需刷新流才能正常显示
        for stream in [sys.stdout, sys.stderr]:
            stream.reconfigure(encoding="utf-8")
except:
    pass

argParser = argparse.ArgumentParser()
argParser.add_argument("access_token")
args = argParser.parse_args()

wikiRepoUrl = f'https://{args.access_token}@github.com/{os.environ["GITHUB_REPOSITORY"]}.wiki.git'

# 创建临时目录
wikiRepoDir = tempfile.mkdtemp()
os.chdir(wikiRepoDir)

p = subprocess.run("git init")
if p.returncode != 0:
    raise Exception("git init 失败")

actor = os.environ["GITHUB_ACTOR"]
subprocess.run("git config user.name " + actor)
subprocess.run(f"git config user.email {actor}@users.noreply.github.com")

# 拉取
p = subprocess.run(f'git pull "{wikiRepoUrl}"')
if p.returncode != 0:
    raise Exception("git pull 失败")

# 将文档拷贝到临时目录
docsDir = os.path.normpath(os.path.dirname(__file__) + "\\..\\docs")
for file in glob.glob(docsDir + "\\*.md"):
    shutil.copy(file, wikiRepoDir)
    print("已拷贝 " + file, flush=True)

# 推送
subprocess.run("git add .")
subprocess.run('git commit -m "Published by CI"')
p = subprocess.run(f'git push --set-upstream "{wikiRepoUrl}" master')
if p.returncode != 0:
    raise Exception("git push 失败")


================================================
FILE: src/BuildOptions.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- 不要直接修改这些选项,应通过 BuildOptions.props.user 或命令行参数覆盖 -->
  <PropertyGroup>
    <!-- 使用 clang-cl 编译 -->
    <UseClangCL>false</UseClangCL>
    <!-- 针对当前硬件生成优化代码,只在使用 clang-cl 编译时有效 -->
    <UseNativeMicroArch>false</UseNativeMicroArch>
    <!-- 编译为打包应用 (暂不支持) -->
    <IsPackaged>false</IsPackaged>
    <!-- 窗口模式缩放时把用于调整窗口尺寸的辅助窗口标示出来 -->
    <DebugBorder>false</DebugBorder>
    <!-- 在性能分析器上显示调试信息 -->
    <DebugInfoOnOverlay>false</DebugInfoOnOverlay>
    <!-- 使用 composition swapchain 呈现 -->
    <UseCompSwapchain>false</UseCompSwapchain>
    
    <MajorVersion></MajorVersion>
    <MinorVersion></MinorVersion>
    <PatchVersion></PatchVersion>
    <VersionString></VersionString>
    <CommitId></CommitId>
  </PropertyGroup>
  
  <!-- 用户自定义编译选项 -->
  <Import Project="$(MSBuildThisFileDirectory)\BuildOptions.props.user" Condition="Exists('$(MSBuildThisFileDirectory)\BuildOptions.props.user')" />
</Project>


================================================
FILE: src/Common.Post.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Microsoft.Cpp.props 之后导入 -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup>
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
      <PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
      <PreprocessorDefinitions>_WINDOWS;WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;WINRT_NO_MODULE_LOCK;WIL_SUPPRESS_EXCEPTIONS;WIL_USE_STL=1;NOGDICAPMASKS;NOICONS;NOATOM;NOCLIPBOARD;NODRAWTEXT;NOMEMMGR;NOMETAFILE;NOMINMAX;NOOPENFILE;NOSCROLL;NOSERVICE;NOSOUND;NOTEXTMETRIC;NOCOMM;NOKANJI;NOHELP;NOPROFILER;NOMCX;NO_SHLWAPI_PATH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>MP_MAJOR_VERSION=$(MajorVersion);MP_MINOR_VERSION=$(MinorVersion);MP_PATCH_VERSION=$(PatchVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(VersionString)' != ''">MP_VERSION_STRING=$(VersionString);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(CommitId)' != ''">MP_COMMIT_ID=$(CommitId);%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="$(DebugBorder)">MP_DEBUG_BORDER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="$(DebugInfoOnOverlay)">MP_DEBUG_INFO_ON_OVERLAY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="$(UseCompSwapchain)">MP_USE_COMPSWAPCHAIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <DebugInformationFormat Condition="'$(DisablePDB)' == 'true'">None</DebugInformationFormat>
      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
      <!-- /await:strict: 禁用协程的非标准语言扩展 -->
      <AdditionalOptions Condition="!$(UseClangCL)">/await:strict %(AdditionalOptions)</AdditionalOptions>
      <!-- -fstrict-vtable-pointers: 缓存虚表指针,这要求不能通过非法手段改变对象的动态类型 -->
      <!-- -funsafe-math-optimizations: 以降低精度为代价提高浮点运算速度 -->
      <!-- -fno-math-errno: 浮点操作不设置 errno,这使一些数学函数可以内联 -->
      <AdditionalOptions Condition="$(UseClangCL)">/clang:-Wno-missing-designated-field-initializers /clang:-Wno-missing-field-initializers /clang:-fstrict-vtable-pointers /clang:-funsafe
Download .txt
gitextract_qytqdh1v/

├── .all-contributorsrc
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug.yaml
│   │   ├── 02_performance.yaml
│   │   ├── 03_request.yaml
│   │   ├── 04_question.yaml
│   │   └── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build.yml
│       ├── release.yml
│       └── wiki.yml
├── .gitignore
├── CONTRIBUTING.md
├── CONTRIBUTING_ZH.md
├── Directory.Build.props
├── LICENSE
├── Magpie.slnx
├── README.md
├── README_ZH.md
├── Settings.XamlStyler
├── certs/
│   ├── .gitignore
│   └── Magpie.pfx
├── docs/
│   ├── About touch support.md
│   ├── Built-in effects.md
│   ├── Comparison of capture methods.md
│   ├── Compilation guide.md
│   ├── FAQ (EN).md
│   ├── FAQ.md
│   ├── Home (EN).md
│   ├── Home.md
│   ├── Interact with Magpie programally.md
│   ├── MagpieFX (EN).md
│   ├── MagpieFX.md
│   ├── Performance optimization.md
│   ├── _Sidebar.md
│   ├── 以编程方式与 Magpie 交互.md
│   ├── 关于触控支持.md
│   ├── 内置效果介绍.md
│   ├── 性能优化建议.md
│   ├── 捕获方式对比.md
│   └── 编译指南.md
├── natvis/
│   ├── magpie.natvis
│   ├── phmap.natvis
│   └── rapidjson.natvis
├── scripts/
│   ├── publish.py
│   ├── release.py
│   └── wiki.py
├── src/
│   ├── BuildOptions.props
│   ├── Common.Post.props
│   ├── Common.Pre.props
│   ├── Effects/
│   │   ├── ACNet.hlsl
│   │   ├── Anime4K/
│   │   │   ├── Anime4K_3D_AA_Upscale_US.hlsl
│   │   │   ├── Anime4K_3D_Upscale_US.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Mean.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Median.hlsl
│   │   │   ├── Anime4K_Denoise_Bilateral_Mode.hlsl
│   │   │   ├── Anime4K_Restore_L.hlsl
│   │   │   ├── Anime4K_Restore_M.hlsl
│   │   │   ├── Anime4K_Restore_S.hlsl
│   │   │   ├── Anime4K_Restore_Soft_L.hlsl
│   │   │   ├── Anime4K_Restore_Soft_M.hlsl
│   │   │   ├── Anime4K_Restore_Soft_S.hlsl
│   │   │   ├── Anime4K_Restore_Soft_UL.hlsl
│   │   │   ├── Anime4K_Restore_Soft_VL.hlsl
│   │   │   ├── Anime4K_Restore_UL.hlsl
│   │   │   ├── Anime4K_Restore_VL.hlsl
│   │   │   ├── Anime4K_Thin_HQ.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_L.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_S.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_UL.hlsl
│   │   │   ├── Anime4K_Upscale_Denoise_VL.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x2_M.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x2_S.hlsl
│   │   │   ├── Anime4K_Upscale_GAN_x3_L.hlsl
│   │   │   ├── Anime4K_Upscale_L.hlsl
│   │   │   ├── Anime4K_Upscale_S.hlsl
│   │   │   ├── Anime4K_Upscale_UL.hlsl
│   │   │   └── Anime4K_Upscale_VL.hlsl
│   │   ├── Bicubic.hlsl
│   │   ├── Bilinear.hlsl
│   │   ├── CAS/
│   │   │   ├── CAS.hlsl
│   │   │   └── CAS_Scaling.hlsl
│   │   ├── CRT/
│   │   │   ├── CRT_Easymode.hlsl
│   │   │   ├── CRT_Geom.hlsl
│   │   │   ├── CRT_Hyllian.hlsl
│   │   │   ├── CRT_Lottes.hlsl
│   │   │   └── GTU_v050.hlsl
│   │   ├── CuNNy/
│   │   │   ├── CuNNy-16x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-16x16C-NVL.hlsl
│   │   │   ├── CuNNy-2x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-2x4C-NVL.hlsl
│   │   │   ├── CuNNy-3x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-3x4C-NVL.hlsl
│   │   │   ├── CuNNy-4x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x16C-NVL.hlsl
│   │   │   ├── CuNNy-4x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x4C-NVL.hlsl
│   │   │   ├── CuNNy-4x8C-NVL-DN.hlsl
│   │   │   ├── CuNNy-4x8C-NVL.hlsl
│   │   │   ├── CuNNy-6x8C-NVL-DN.hlsl
│   │   │   ├── CuNNy-6x8C-NVL.hlsl
│   │   │   ├── CuNNy-8x16C-NVL-DN.hlsl
│   │   │   ├── CuNNy-8x16C-NVL.hlsl
│   │   │   ├── CuNNy-8x4C-NVL-DN.hlsl
│   │   │   ├── CuNNy-8x4C-NVL.hlsl
│   │   │   ├── CuNNy-8x8C-NVL-DN.hlsl
│   │   │   └── CuNNy-8x8C-NVL.hlsl
│   │   ├── CuNNy2/
│   │   │   ├── CuNNy-3x12-NVL.hlsl
│   │   │   ├── CuNNy-4x12-NVL.hlsl
│   │   │   ├── CuNNy-4x16-NVL.hlsl
│   │   │   ├── CuNNy-4x24-NVL.hlsl
│   │   │   ├── CuNNy-4x32-NVL.hlsl
│   │   │   ├── CuNNy-8x32-NVL.hlsl
│   │   │   ├── CuNNy-fast-NVL.hlsl
│   │   │   ├── CuNNy-faster-NVL.hlsl
│   │   │   └── CuNNy-veryfast-NVL.hlsl
│   │   ├── Deband.hlsl
│   │   ├── Effects.vcxproj
│   │   ├── Effects.vcxproj.filters
│   │   ├── FSR/
│   │   │   ├── FSR_EASU.hlsl
│   │   │   └── FSR_RCAS.hlsl
│   │   ├── FSRCNNX/
│   │   │   ├── FSRCNNX.hlsl
│   │   │   └── FSRCNNX_LineArt.hlsl
│   │   ├── FXAA/
│   │   │   ├── FXAA.hlsli
│   │   │   ├── FXAA_High.hlsl
│   │   │   ├── FXAA_Medium.hlsl
│   │   │   └── FXAA_Ultra.hlsl
│   │   ├── ImageAdjustment.hlsl
│   │   ├── Jinc.hlsl
│   │   ├── Lanczos.hlsl
│   │   ├── NIS/
│   │   │   ├── Coef_Scale.dds
│   │   │   ├── Coef_USM.dds
│   │   │   ├── NIS.hlsl
│   │   │   ├── NIS_Scaler.hlsli
│   │   │   └── NVSharpen.hlsl
│   │   ├── NNEDI3/
│   │   │   ├── NNEDI3_nns128_win8x4.hlsl
│   │   │   ├── NNEDI3_nns128_win8x6.hlsl
│   │   │   ├── NNEDI3_nns16_win8x4.hlsl
│   │   │   ├── NNEDI3_nns16_win8x6.hlsl
│   │   │   ├── NNEDI3_nns256_win8x4.hlsl
│   │   │   ├── NNEDI3_nns256_win8x6.hlsl
│   │   │   ├── NNEDI3_nns32_win8x4.hlsl
│   │   │   ├── NNEDI3_nns32_win8x6.hlsl
│   │   │   ├── NNEDI3_nns64_win8x4.hlsl
│   │   │   ├── NNEDI3_nns64_win8x6.hlsl
│   │   │   └── prescalers.hlsli
│   │   ├── Nearest.hlsl
│   │   ├── Pixel Art/
│   │   │   ├── MMPX.hlsl
│   │   │   ├── Pixellate.hlsl
│   │   │   └── SharpBilinear.hlsl
│   │   ├── RAVU/
│   │   │   ├── RAVU_3x_R2.hlsl
│   │   │   ├── RAVU_3x_R2_RGB.hlsl
│   │   │   ├── RAVU_3x_R3.hlsl
│   │   │   ├── RAVU_3x_R3_RGB.hlsl
│   │   │   ├── RAVU_3x_R4.hlsl
│   │   │   ├── RAVU_3x_R4_RGB.hlsl
│   │   │   ├── RAVU_Lite_AR_R2.hlsl
│   │   │   ├── RAVU_Lite_AR_R3.hlsl
│   │   │   ├── RAVU_Lite_AR_R4.hlsl
│   │   │   ├── RAVU_Lite_R2.hlsl
│   │   │   ├── RAVU_Lite_R3.hlsl
│   │   │   ├── RAVU_Lite_R4.hlsl
│   │   │   ├── RAVU_R2.hlsl
│   │   │   ├── RAVU_R2_RGB.hlsl
│   │   │   ├── RAVU_R3.hlsl
│   │   │   ├── RAVU_R3_RGB.hlsl
│   │   │   ├── RAVU_R4.hlsl
│   │   │   ├── RAVU_R4_RGB.hlsl
│   │   │   ├── RAVU_Zoom_AR_R2.hlsl
│   │   │   ├── RAVU_Zoom_AR_R2_RGB.hlsl
│   │   │   ├── RAVU_Zoom_AR_R3.hlsl
│   │   │   ├── RAVU_Zoom_AR_R3_RGB.hlsl
│   │   │   ├── RAVU_Zoom_R2.hlsl
│   │   │   ├── RAVU_Zoom_R2_RGB.hlsl
│   │   │   ├── RAVU_Zoom_R3.hlsl
│   │   │   ├── RAVU_Zoom_R3_RGB.hlsl
│   │   │   ├── prescalers.hlsli
│   │   │   ├── ravu_3x_lut2_f16.dds
│   │   │   ├── ravu_3x_lut3_f16.dds
│   │   │   ├── ravu_3x_lut4_f16.dds
│   │   │   ├── ravu_lite_lut2_f16.dds
│   │   │   ├── ravu_lite_lut3_f16.dds
│   │   │   ├── ravu_lite_lut4_f16.dds
│   │   │   ├── ravu_lut2_f16.dds
│   │   │   ├── ravu_lut3_f16.dds
│   │   │   ├── ravu_lut4_f16.dds
│   │   │   ├── ravu_zoom_lut2_ar_f16.dds
│   │   │   ├── ravu_zoom_lut2_f16.dds
│   │   │   ├── ravu_zoom_lut3_ar_f16.dds
│   │   │   └── ravu_zoom_lut3_f16.dds
│   │   ├── SGSR.hlsl
│   │   ├── SMAA/
│   │   │   ├── AreaTex.dds
│   │   │   ├── SMAA.hlsli
│   │   │   ├── SMAA_High.hlsl
│   │   │   ├── SMAA_Low.hlsl
│   │   │   ├── SMAA_Medium.hlsl
│   │   │   ├── SMAA_Ultra.hlsl
│   │   │   └── SearchTex.dds
│   │   ├── SSimDownscaler.hlsl
│   │   ├── Sharpen/
│   │   │   ├── AdaptiveSharpen.hlsl
│   │   │   ├── FineSharp.hlsl
│   │   │   ├── LCAS.hlsl
│   │   │   └── LumaSharpen.hlsl
│   │   ├── StubDefs.hlsli
│   │   └── xBRZ/
│   │       ├── xBRZ_2x.hlsl
│   │       ├── xBRZ_3x.hlsl
│   │       ├── xBRZ_4x.hlsl
│   │       ├── xBRZ_5x.hlsl
│   │       ├── xBRZ_6x.hlsl
│   │       └── xBRZ_Freescale.hlsl
│   ├── HybridCRT.props
│   ├── Magpie/
│   │   ├── AboutPage.cpp
│   │   ├── AboutPage.h
│   │   ├── AboutPage.idl
│   │   ├── AboutPage.xaml
│   │   ├── AboutViewModel.cpp
│   │   ├── AboutViewModel.h
│   │   ├── AboutViewModel.idl
│   │   ├── AdaptersService.cpp
│   │   ├── AdaptersService.h
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── App.idl
│   │   ├── App.xaml
│   │   ├── AppSettings.cpp
│   │   ├── AppSettings.h
│   │   ├── AppXReader.cpp
│   │   ├── AppXReader.h
│   │   ├── AutoStartHelper.cpp
│   │   ├── AutoStartHelper.h
│   │   ├── BlueInfoBarStyle.cpp
│   │   ├── BlueInfoBarStyle.h
│   │   ├── BlueInfoBarStyle.idl
│   │   ├── BlueInfoBarStyle.xaml
│   │   ├── BoolNegationConverter.cpp
│   │   ├── BoolNegationConverter.h
│   │   ├── BoolNegationConverter.idl
│   │   ├── BoolToNegativeVisibilityConverter.cpp
│   │   ├── BoolToNegativeVisibilityConverter.h
│   │   ├── BoolToNegativeVisibilityConverter.idl
│   │   ├── CandidateWindowItem.cpp
│   │   ├── CandidateWindowItem.h
│   │   ├── CandidateWindowItem.idl
│   │   ├── CaptionButtonsControl.cpp
│   │   ├── CaptionButtonsControl.h
│   │   ├── CaptionButtonsControl.idl
│   │   ├── CaptionButtonsControl.xaml
│   │   ├── ContentDialogHelper.cpp
│   │   ├── ContentDialogHelper.h
│   │   ├── ControlHelper.cpp
│   │   ├── ControlHelper.h
│   │   ├── ControlSizeTrigger.cpp
│   │   ├── ControlSizeTrigger.h
│   │   ├── ControlSizeTrigger.idl
│   │   ├── EffectHelper.h
│   │   ├── EffectParametersViewModel.cpp
│   │   ├── EffectParametersViewModel.h
│   │   ├── EffectParametersViewModel.idl
│   │   ├── EffectsService.cpp
│   │   ├── EffectsService.h
│   │   ├── FileDialogHelper.cpp
│   │   ├── FileDialogHelper.h
│   │   ├── HomePage.cpp
│   │   ├── HomePage.h
│   │   ├── HomePage.idl
│   │   ├── HomePage.xaml
│   │   ├── HomeViewModel.cpp
│   │   ├── HomeViewModel.h
│   │   ├── HomeViewModel.idl
│   │   ├── IconHelper.cpp
│   │   ├── IconHelper.h
│   │   ├── IsEqualStateTrigger.cpp
│   │   ├── IsEqualStateTrigger.h
│   │   ├── IsEqualStateTrigger.idl
│   │   ├── IsNullStateTrigger.cpp
│   │   ├── IsNullStateTrigger.h
│   │   ├── IsNullStateTrigger.idl
│   │   ├── JsonHelper.cpp
│   │   ├── JsonHelper.h
│   │   ├── KeyVisual.Resource.xaml
│   │   ├── KeyVisual.cpp
│   │   ├── KeyVisual.h
│   │   ├── KeyVisual.idl
│   │   ├── KeyVisualState.cpp
│   │   ├── KeyVisualState.h
│   │   ├── KeyVisualState.idl
│   │   ├── LocalizationService.cpp
│   │   ├── LocalizationService.h
│   │   ├── Magpie.rc
│   │   ├── Magpie.vcxproj
│   │   ├── Magpie.vcxproj.filters
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── NewProfileViewModel.cpp
│   │   ├── NewProfileViewModel.h
│   │   ├── NewProfileViewModel.idl
│   │   ├── NotifyIconService.cpp
│   │   ├── NotifyIconService.h
│   │   ├── PageFrame.cpp
│   │   ├── PageFrame.h
│   │   ├── PageFrame.idl
│   │   ├── PageFrame.xaml
│   │   ├── Profile.h
│   │   ├── ProfilePage.cpp
│   │   ├── ProfilePage.h
│   │   ├── ProfilePage.idl
│   │   ├── ProfilePage.xaml
│   │   ├── ProfileService.cpp
│   │   ├── ProfileService.h
│   │   ├── ProfileViewModel.cpp
│   │   ├── ProfileViewModel.h
│   │   ├── ProfileViewModel.idl
│   │   ├── Resources.language-de.resw
│   │   ├── Resources.language-en-US.resw
│   │   ├── Resources.language-es.resw
│   │   ├── Resources.language-fr.resw
│   │   ├── Resources.language-hu.resw
│   │   ├── Resources.language-id.resw
│   │   ├── Resources.language-it.resw
│   │   ├── Resources.language-ja.resw
│   │   ├── Resources.language-ka.resw
│   │   ├── Resources.language-ko.resw
│   │   ├── Resources.language-pl.resw
│   │   ├── Resources.language-pt-BR.resw
│   │   ├── Resources.language-ru.resw
│   │   ├── Resources.language-ta.resw
│   │   ├── Resources.language-tr.resw
│   │   ├── Resources.language-uk.resw
│   │   ├── Resources.language-vi.resw
│   │   ├── Resources.language-zh-Hans.resw
│   │   ├── Resources.language-zh-Hant.resw
│   │   ├── RootPage.cpp
│   │   ├── RootPage.h
│   │   ├── RootPage.idl
│   │   ├── RootPage.xaml
│   │   ├── ScalingMode.cpp
│   │   ├── ScalingMode.h
│   │   ├── ScalingModeEffectItem.cpp
│   │   ├── ScalingModeEffectItem.h
│   │   ├── ScalingModeEffectItem.idl
│   │   ├── ScalingModeItem.cpp
│   │   ├── ScalingModeItem.h
│   │   ├── ScalingModeItem.idl
│   │   ├── ScalingModesPage.cpp
│   │   ├── ScalingModesPage.h
│   │   ├── ScalingModesPage.idl
│   │   ├── ScalingModesPage.xaml
│   │   ├── ScalingModesService.cpp
│   │   ├── ScalingModesService.h
│   │   ├── ScalingModesViewModel.cpp
│   │   ├── ScalingModesViewModel.h
│   │   ├── ScalingModesViewModel.idl
│   │   ├── ScalingService.cpp
│   │   ├── ScalingService.h
│   │   ├── SettingsCard.Resource.xaml
│   │   ├── SettingsCard.cpp
│   │   ├── SettingsCard.h
│   │   ├── SettingsCard.idl
│   │   ├── SettingsExpander.Resource.xaml
│   │   ├── SettingsExpander.cpp
│   │   ├── SettingsExpander.h
│   │   ├── SettingsExpander.idl
│   │   ├── SettingsExpanderCornerRadiusConverter.cpp
│   │   ├── SettingsExpanderCornerRadiusConverter.h
│   │   ├── SettingsExpanderCornerRadiusConverter.idl
│   │   ├── SettingsGroup.Resource.xaml
│   │   ├── SettingsGroup.cpp
│   │   ├── SettingsGroup.h
│   │   ├── SettingsGroup.idl
│   │   ├── SettingsPage.cpp
│   │   ├── SettingsPage.h
│   │   ├── SettingsPage.idl
│   │   ├── SettingsPage.xaml
│   │   ├── SettingsViewModel.cpp
│   │   ├── SettingsViewModel.h
│   │   ├── SettingsViewModel.idl
│   │   ├── Shortcut.cpp
│   │   ├── Shortcut.h
│   │   ├── ShortcutControl.cpp
│   │   ├── ShortcutControl.h
│   │   ├── ShortcutControl.idl
│   │   ├── ShortcutControl.xaml
│   │   ├── ShortcutDialog.cpp
│   │   ├── ShortcutDialog.h
│   │   ├── ShortcutDialog.idl
│   │   ├── ShortcutDialog.xaml
│   │   ├── ShortcutHelper.cpp
│   │   ├── ShortcutHelper.h
│   │   ├── ShortcutService.cpp
│   │   ├── ShortcutService.h
│   │   ├── SimpleStackPanel.cpp
│   │   ├── SimpleStackPanel.h
│   │   ├── SimpleStackPanel.idl
│   │   ├── SmoothResizeHelper.cpp
│   │   ├── SmoothResizeHelper.h
│   │   ├── TextBlockHelper.cpp
│   │   ├── TextBlockHelper.h
│   │   ├── TextBlockHelper.idl
│   │   ├── TextMenuFlyout.cpp
│   │   ├── TextMenuFlyout.h
│   │   ├── TextMenuFlyout.idl
│   │   ├── ThemeHelper.cpp
│   │   ├── ThemeHelper.h
│   │   ├── TitleBarControl.cpp
│   │   ├── TitleBarControl.h
│   │   ├── TitleBarControl.idl
│   │   ├── TitleBarControl.xaml
│   │   ├── ToastPage.cpp
│   │   ├── ToastPage.h
│   │   ├── ToastPage.idl
│   │   ├── ToastPage.xaml
│   │   ├── ToastService.cpp
│   │   ├── ToastService.h
│   │   ├── TouchHelper.cpp
│   │   ├── TouchHelper.h
│   │   ├── UpdateService.cpp
│   │   ├── UpdateService.h
│   │   ├── WrapPanel.cpp
│   │   ├── WrapPanel.h
│   │   ├── WrapPanel.idl
│   │   ├── XamlHelper.cpp
│   │   ├── XamlHelper.h
│   │   ├── XamlWindow.h
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── resource.h
│   ├── Magpie.Core/
│   │   ├── .gitignore
│   │   ├── AdaptivePresenter.cpp
│   │   ├── AdaptivePresenter.h
│   │   ├── BackendDescriptorStore.cpp
│   │   ├── BackendDescriptorStore.h
│   │   ├── CompSwapchainPresenter.cpp
│   │   ├── CompSwapchainPresenter.h
│   │   ├── CursorDrawer.cpp
│   │   ├── CursorDrawer.h
│   │   ├── CursorManager.cpp
│   │   ├── CursorManager.h
│   │   ├── DDS.h
│   │   ├── DDSHelper.cpp
│   │   ├── DDSHelper.h
│   │   ├── DesktopDuplicationFrameSource.cpp
│   │   ├── DesktopDuplicationFrameSource.h
│   │   ├── DeviceResources.cpp
│   │   ├── DeviceResources.h
│   │   ├── DirectXHelper.cpp
│   │   ├── DwmSharedSurfaceFrameSource.cpp
│   │   ├── DwmSharedSurfaceFrameSource.h
│   │   ├── EffectCacheManager.cpp
│   │   ├── EffectCacheManager.h
│   │   ├── EffectCompiler.cpp
│   │   ├── EffectDrawer.cpp
│   │   ├── EffectDrawer.h
│   │   ├── EffectHelper.h
│   │   ├── EffectsProfiler.cpp
│   │   ├── EffectsProfiler.h
│   │   ├── ExclModeHelper.cpp
│   │   ├── ExclModeHelper.h
│   │   ├── FrameSourceBase.cpp
│   │   ├── FrameSourceBase.h
│   │   ├── GDIFrameSource.cpp
│   │   ├── GDIFrameSource.h
│   │   ├── GraphicsCaptureFrameSource.cpp
│   │   ├── GraphicsCaptureFrameSource.h
│   │   ├── ImGuiBackend.cpp
│   │   ├── ImGuiBackend.h
│   │   ├── ImGuiFontsCacheManager.cpp
│   │   ├── ImGuiFontsCacheManager.h
│   │   ├── ImGuiImpl.cpp
│   │   ├── ImGuiImpl.h
│   │   ├── Magpie.Core.vcxproj
│   │   ├── Magpie.Core.vcxproj.filters
│   │   ├── OverlayDrawer.cpp
│   │   ├── OverlayDrawer.h
│   │   ├── OverlayHelper.cpp
│   │   ├── OverlayHelper.h
│   │   ├── PresenterBase.cpp
│   │   ├── PresenterBase.h
│   │   ├── Renderer.cpp
│   │   ├── Renderer.h
│   │   ├── ScalingOptions.cpp
│   │   ├── ScalingRuntime.cpp
│   │   ├── ScalingWindow.cpp
│   │   ├── ScalingWindow.h
│   │   ├── ScreenshotHelper.cpp
│   │   ├── ScreenshotHelper.h
│   │   ├── SrcTracker.cpp
│   │   ├── SrcTracker.h
│   │   ├── StepTimer.cpp
│   │   ├── StepTimer.h
│   │   ├── TextureHelper.cpp
│   │   ├── TextureHelper.h
│   │   ├── Win32Helper.cpp
│   │   ├── WindowHelper.cpp
│   │   ├── YasHelper.h
│   │   ├── include/
│   │   │   ├── DirectXHelper.h
│   │   │   ├── EffectCompiler.h
│   │   │   ├── EffectDesc.h
│   │   │   ├── Event.h
│   │   │   ├── ScalingOptions.h
│   │   │   ├── ScalingRuntime.h
│   │   │   ├── Win32Helper.h
│   │   │   ├── WindowBase.h
│   │   │   └── WindowHelper.h
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── shaders/
│   │       ├── DuplicateFrameCS.hlsl
│   │       ├── ImGuiImplPS.hlsl
│   │       ├── ImGuiImplVS.hlsl
│   │       ├── MaskedCursorPS.hlsl
│   │       ├── MonochromeCursorPS.hlsl
│   │       ├── SimplePS.hlsl
│   │       └── SimpleVS.hlsl
│   ├── Shared/
│   │   ├── CommonDefines.h
│   │   ├── CommonSharedConstants.h
│   │   ├── Logger.cpp
│   │   ├── Logger.h
│   │   ├── Shared.vcxitems
│   │   ├── SmallVector.cpp
│   │   ├── SmallVector.h
│   │   ├── StrHelper.cpp
│   │   ├── StrHelper.h
│   │   ├── StrMacros.h
│   │   ├── Version.cpp
│   │   └── Version.h
│   ├── TouchHelper/
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── TouchHelper.rc
│   │   ├── TouchHelper.vcxproj
│   │   ├── TouchHelper.vcxproj.filters
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   └── pch.h
│   ├── Updater/
│   │   ├── PackageFiles.h
│   │   ├── Updater.rc
│   │   ├── Updater.vcxproj
│   │   ├── Updater.vcxproj.filters
│   │   ├── app.manifest
│   │   ├── conanfile.txt
│   │   ├── main.cpp
│   │   ├── packages.config
│   │   ├── pch.cpp
│   │   ├── pch.h
│   │   └── resource.h
│   ├── WinUI.targets
│   └── _ConanDeps/
│       ├── _ConanDeps.filters
│       ├── _ConanDeps.vcxproj
│       ├── clang-cl.profile
│       └── msvc.profile
├── tools/
│   ├── CJKCharsetForImGui/
│   │   ├── characters.txt
│   │   └── cjk_charset_for_imgui.py
│   ├── MPVHookTextureParser/
│   │   ├── MPVHookTextureParser.cpp
│   │   ├── MPVHookTextureParser.slnx
│   │   ├── MPVHookTextureParser.vcxproj
│   │   ├── MPVHookTextureParser.vcxproj.filters
│   │   ├── README.md
│   │   ├── README_EN.md
│   │   └── packages.config
│   └── WindowCase/
│       ├── HideCursorWindow.cpp
│       ├── HideCursorWindow.h
│       ├── HungWindow.cpp
│       ├── HungWindow.h
│       ├── KirikiriWindow.cpp
│       ├── KirikiriWindow.h
│       ├── PopupHostWindow.cpp
│       ├── PopupHostWindow.h
│       ├── TopmostWindow.cpp
│       ├── TopmostWindow.h
│       ├── Utils.cpp
│       ├── Utils.h
│       ├── WindowBase.h
│       ├── WindowCase.slnx
│       ├── WindowCase.vcxproj
│       ├── WindowCase.vcxproj.filters
│       ├── app.manifest
│       ├── main.cpp
│       ├── pch.cpp
│       └── pch.h
└── version.json
Download .txt
SYMBOL INDEX (355 symbols across 139 files)

FILE: scripts/publish.py
  function remove_file (line 78) | def remove_file(file):

FILE: src/Magpie.Core/AdaptivePresenter.cpp
  type Magpie (line 8) | namespace Magpie {

FILE: src/Magpie.Core/AdaptivePresenter.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie.Core/BackendDescriptorStore.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie.Core/CompSwapchainPresenter.h
  function namespace (line 6) | namespace Magpie {

FILE: src/Magpie.Core/CursorDrawer.cpp
  type Magpie (line 19) | namespace Magpie {
    type VertexPositionTexture (line 21) | struct VertexPositionTexture {
      method VertexPositionTexture (line 22) | VertexPositionTexture() = default;
      method VertexPositionTexture (line 24) | VertexPositionTexture(const VertexPositionTexture&) = default;
      method VertexPositionTexture (line 25) | VertexPositionTexture& operator=(const VertexPositionTexture&) = def...
      method VertexPositionTexture (line 27) | VertexPositionTexture(VertexPositionTexture&&) = default;
      method VertexPositionTexture (line 28) | VertexPositionTexture& operator=(VertexPositionTexture&&) = default;
      method VertexPositionTexture (line 30) | VertexPositionTexture(XMFLOAT2 const& iposition, XMFLOAT2 const& ite...
      method VertexPositionTexture (line 34) | VertexPositionTexture(FXMVECTOR iposition, FXMVECTOR itextureCoordin...

FILE: src/Magpie.Core/DesktopDuplicationFrameSource.cpp
  type Magpie (line 10) | namespace Magpie {
    function FindMonitor (line 12) | static winrt::com_ptr<IDXGIOutput1> FindMonitor(IDXGIAdapter1* adapter...
    function FrameSourceState (line 123) | FrameSourceState DesktopDuplicationFrameSource::_Update() noexcept {

FILE: src/Magpie/AboutPage.cpp
  type winrt::Magpie::implementation (line 13) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/AboutPage.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/AboutViewModel.cpp
  type winrt::Magpie::implementation (line 16) | namespace winrt::Magpie::implementation {
    function hstring (line 56) | hstring AboutViewModel::Version() const noexcept {
    function fire_and_forget (line 90) | fire_and_forget AboutViewModel::CheckForUpdates() {
    function hstring (line 203) | hstring AboutViewModel::UpdateCardTitle() const noexcept {
    function Uri (line 236) | Uri AboutViewModel::UpdateReleaseNotesLink() const noexcept {
    function fire_and_forget (line 245) | fire_and_forget AboutViewModel::DownloadAndInstall() {

FILE: src/Magpie/AboutViewModel.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/AdaptersService.cpp
  type Magpie (line 12) | namespace Magpie {

FILE: src/Magpie/AdaptersService.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie/App.cpp
  type winrt::Magpie::implementation (line 48) | namespace winrt::Magpie::implementation {
    function InitMessages (line 53) | static void InitMessages() noexcept {
    function IncreaseTimerResolution (line 66) | static void IncreaseTimerResolution() noexcept {
    function FixThreadPoolCrash (line 85) | static void FixThreadPoolCrash() noexcept {
    function App (line 91) | App& App::Get() {
    class MainWindow (line 123) | class MainWindow
    function INumberFormatter2 (line 269) | INumberFormatter2 App::DoubleFormatter() {
    function IsColorLight (line 369) | static bool IsColorLight(const winrt::Windows::UI::Color& clr) noexcept {

FILE: src/Magpie/App.h
  function namespace (line 8) | namespace Magpie {
  type RootPage (line 14) | struct RootPage
  function DispatcherQueue (line 28) | const DispatcherQueue& Dispatcher() const noexcept {

FILE: src/Magpie/AppSettings.cpp
  type Magpie (line 24) | namespace Magpie {
    function EncodeShortcut (line 35) | static uint32_t EncodeShortcut(const Shortcut& shortcut) noexcept {
    function DecodeShortcut (line 52) | static void DecodeShortcut(uint32_t value, Shortcut& shortcut) noexcept {
    function WriteProfile (line 64) | static void WriteProfile(rapidjson::PrettyWriter<rapidjson::StringBuff...
    function ReplaceIcon (line 149) | static void ReplaceIcon(HINSTANCE hInst, HWND hWnd, bool large) noexce...
    function HRESULT (line 158) | static HRESULT CALLBACK TaskDialogCallback(
    function ShowErrorMessage (line 180) | static void ShowErrorMessage(const wchar_t* mainInstruction, const wch...
    function fire_and_forget (line 287) | fire_and_forget AppSettings::SaveAsync() noexcept {
    function GetSystemScreenshotsDir (line 409) | static std::filesystem::path GetSystemScreenshotsDir() noexcept {
    function IsSubfolder (line 436) | static bool IsSubfolder(const std::wstring& sub, const std::wstring& p...
    function FindOldConfig (line 1254) | static std::wstring FindOldConfig(const wchar_t* localAppDataDir) noex...

FILE: src/Magpie/AppSettings.h
  function namespace (line 8) | namespace Magpie {

FILE: src/Magpie/AppXReader.cpp
  type Magpie (line 23) | namespace Magpie {
    type AppxCacheData (line 25) | struct AppxCacheData {
    function ResourceFromPri (line 38) | static std::wstring ResourceFromPri(std::wstring_view packageFullName,...
    class CandidateIcon (line 316) | class CandidateIcon {
      method CandidateIcon (line 318) | CandidateIcon(const wchar_t* fileName) : _fileName(fileName) {
      method IsValid (line 417) | bool IsValid() const noexcept {
      method Compare (line 428) | static bool Compare(const CandidateIcon& l, const CandidateIcon& r, ...
    function SoftwareBitmap (line 483) | static SoftwareBitmap AutoFillBackground(const std::wstring& iconPath,...

FILE: src/Magpie/AppXReader.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/AutoStartHelper.cpp
  type Magpie (line 25) | namespace Magpie {
    function GetTaskName (line 31) | static std::wstring GetTaskName(std::wstring_view userName) noexcept {
    function CreateTaskService (line 35) | static com_ptr<ITaskService> CreateTaskService() noexcept {
    function CreateAutoStartTask (line 52) | static bool CreateAutoStartTask(bool runElevated) noexcept {
    function DeleteAutoStartTask (line 280) | static bool DeleteAutoStartTask() noexcept {
    function IsAutoStartTaskActive (line 318) | static bool IsAutoStartTaskActive() noexcept {
    function GetShortcutPath (line 352) | static std::wstring GetShortcutPath() noexcept {
    function CreateAutoStartShortcut (line 364) | static bool CreateAutoStartShortcut() noexcept {
    function DeleteAutoStartShortcut (line 389) | static bool DeleteAutoStartShortcut() noexcept {
    function IsAutoStartShortcutExist (line 403) | static bool IsAutoStartShortcutExist() noexcept {

FILE: src/Magpie/AutoStartHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/BlueInfoBarStyle.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/BoolNegationConverter.cpp
  type winrt::Magpie::implementation (line 10) | namespace winrt::Magpie::implementation {
    function IInspectable (line 12) | IInspectable BoolNegationConverter::Convert(IInspectable const& value,...
    function IInspectable (line 16) | IInspectable BoolNegationConverter::ConvertBack(IInspectable const& va...

FILE: src/Magpie/BoolNegationConverter.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/BoolToNegativeVisibilityConverter.cpp
  type winrt::Magpie::implementation (line 10) | namespace winrt::Magpie::implementation {
    function IInspectable (line 12) | IInspectable BoolToNegativeVisibilityConverter::Convert(IInspectable c...
    function IInspectable (line 16) | IInspectable BoolToNegativeVisibilityConverter::ConvertBack(IInspectab...

FILE: src/Magpie/BoolToNegativeVisibilityConverter.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/CandidateWindowItem.cpp
  type winrt::Magpie::implementation (line 21) | namespace winrt::Magpie::implementation {
    function GetProcessDesc (line 23) | static std::wstring GetProcessDesc(HWND hWnd) {
    function IconElement (line 79) | IconElement CandidateWindowItem::Icon() const noexcept {
    function fire_and_forget (line 97) | fire_and_forget CandidateWindowItem::_ResolveWindow(bool resolveIcon, ...

FILE: src/Magpie/CandidateWindowItem.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/CaptionButtonsControl.cpp
  type winrt::Magpie::implementation (line 9) | namespace winrt::Magpie::implementation {
    function Size (line 11) | Size CaptionButtonsControl::CaptionButtonSize() const {

FILE: src/Magpie/CaptionButtonsControl.h
  type class (line 6) | enum class
  type CaptionButtonsControl (line 12) | struct CaptionButtonsControl

FILE: src/Magpie/ContentDialogHelper.cpp
  type Magpie (line 7) | namespace Magpie {

FILE: src/Magpie/ContentDialogHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/ControlHelper.cpp
  type Magpie (line 10) | namespace Magpie {

FILE: src/Magpie/ControlHelper.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/ControlSizeTrigger.cpp
  type winrt::Magpie::implementation (line 9) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ControlSizeTrigger.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/EffectHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/EffectParametersViewModel.cpp
  type winrt::Magpie::implementation (line 22) | namespace winrt::Magpie::implementation {
    function fire_and_forget (line 26) | static fire_and_forget LazySaveAppSettings() {
    function hstring (line 167) | hstring ScalingModeFloatParameter::ValueText() const noexcept {

FILE: src/Magpie/EffectParametersViewModel.h
  function namespace (line 7) | namespace Magpie {
  function namespace (line 11) | namespace winrt::Magpie::implementation {
  function Value (line 26) | void Value(bool value) {
  type ScalingModeFloatParameter (line 41) | struct ScalingModeFloatParameter
  function Value (line 55) | void Value(double value) {
  function hstring (line 61) | hstring ValueText() const noexcept;
  function EffectParametersViewModel (line 88) | struct EffectParametersViewModel : EffectParametersViewModelT<EffectPara...

FILE: src/Magpie/EffectsService.cpp
  type Magpie (line 12) | namespace Magpie {
    function ListEffects (line 18) | static void ListEffects(std::vector<std::wstring>& result, std::wstrin...
    function fire_and_forget (line 50) | fire_and_forget EffectsService::Initialize() {
    function EffectInfo (line 113) | const EffectInfo* EffectsService::GetEffect(std::wstring_view name) no...

FILE: src/Magpie/EffectsService.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/FileDialogHelper.cpp
  type Magpie (line 11) | namespace Magpie {

FILE: src/Magpie/FileDialogHelper.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/HomePage.cpp
  type winrt::Magpie::implementation (line 11) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/HomePage.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/HomeViewModel.cpp
  type winrt::Magpie::implementation (line 21) | namespace winrt::Magpie::implementation {
    function hstring (line 45) | hstring HomeViewModel::TimerDescription() const noexcept {
    function hstring (line 64) | hstring HomeViewModel::TimerLabelText() const noexcept {
    function hstring (line 73) | hstring HomeViewModel::TimerButtonText(bool windowedMode) const noexce...
    function hstring (line 102) | hstring HomeViewModel::DelayText() const noexcept {
    function hstring (line 116) | hstring HomeViewModel::UpdateCardTitle() const noexcept {
    function hstring (line 153) | hstring HomeViewModel::InitialToolbarStateDescription() const noexcept {
    function hstring (line 220) | hstring HomeViewModel::ScreenshotSaveDirectory() const noexcept {
    function fire_and_forget (line 231) | fire_and_forget HomeViewModel::ChangeScreenshotSaveDirectory() noexcept {
    function fire_and_forget (line 288) | fire_and_forget HomeViewModel::IsTouchSupportEnabled(bool value) {
    function Uri (line 309) | Uri HomeViewModel::TouchSupportLearnMoreUrl() const noexcept {
    function fire_and_forget (line 427) | static fire_and_forget LocateTempLogs(const wchar_t* logName) noexcept {

FILE: src/Magpie/HomeViewModel.h
  type HomeViewModel (line 7) | struct HomeViewModel
  function hstring (line 10) | hstring TimerDescription() const noexcept;

FILE: src/Magpie/IconHelper.cpp
  type Magpie (line 14) | namespace Magpie {
    function CopyPixelsOfHBmp (line 16) | static bool CopyPixelsOfHBmp(HBITMAP hBmp, LONG width, LONG height, vo...
    function SoftwareBitmap (line 38) | static SoftwareBitmap HIcon2SoftwareBitmap(HICON hIcon) {
    function SIZE (line 115) | static SIZE GetSizeOfIcon(HICON hIcon) noexcept {
    function HICON (line 134) | static HICON GetHIconOfWnd(HWND hWnd, LONG preferredSize) noexcept {
    function SoftwareBitmap (line 184) | SoftwareBitmap IconHelper::ExtractIconFormWnd(HWND hWnd, uint32_t pref...
    function SoftwareBitmap (line 192) | SoftwareBitmap IconHelper::ExtractIconFromExe(const wchar_t* fileName,...
    function SoftwareBitmap (line 263) | SoftwareBitmap IconHelper::ExtractAppSmallIcon() {
    function SoftwareBitmap (line 269) | SoftwareBitmap IconHelper::ExtractAppIcon(uint32_t preferredSize) {

FILE: src/Magpie/IconHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/IsEqualStateTrigger.cpp
  type winrt::Magpie::implementation (line 7) | namespace winrt::Magpie::implementation {
    function AreValuesEqual (line 32) | static bool AreValuesEqual(IInspectable const& value1, IInspectable co...

FILE: src/Magpie/IsEqualStateTrigger.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/IsNullStateTrigger.cpp
  type winrt::Magpie::implementation (line 7) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/IsNullStateTrigger.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/JsonHelper.cpp
  type Magpie (line 5) | namespace Magpie {

FILE: src/Magpie/JsonHelper.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/KeyVisual.cpp
  type winrt::Magpie::implementation (line 18) | namespace winrt::Magpie::implementation {
    function Style (line 134) | Style KeyVisual::_GetStyleSize(std::wstring_view styleName) const {

FILE: src/Magpie/KeyVisual.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/KeyVisualState.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/LocalizationService.cpp
  type Magpie (line 9) | namespace Magpie {

FILE: src/Magpie/LocalizationService.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/MainWindow.cpp
  type Magpie (line 16) | namespace Magpie {
    function LRESULT (line 162) | LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lP...
    function LRESULT (line 457) | LRESULT MainWindow::_TitleBarWndProc(HWND hWnd, UINT msg, WPARAM wPara...
    function LRESULT (line 470) | LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, L...

FILE: src/Magpie/MainWindow.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie/NewProfileViewModel.cpp
  type winrt::Magpie::implementation (line 16) | namespace winrt::Magpie::implementation {
    function IsCandidateWindow (line 18) | static bool IsCandidateWindow(HWND hWnd) noexcept {
    function GetDesktopWindows (line 76) | static SmallVector<HWND> GetDesktopWindows() noexcept {
    function SortCandidateWindows (line 95) | static void SortCandidateWindows(It begin, It end) {

FILE: src/Magpie/NewProfileViewModel.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/NotifyIconService.cpp
  type Magpie (line 13) | namespace Magpie {
    function LRESULT (line 99) | LRESULT NotifyIconService::_NotifyIconWndProc(HWND hWnd, UINT message,...

FILE: src/Magpie/NotifyIconService.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/PageFrame.cpp
  type winrt::Magpie::implementation (line 15) | namespace winrt::Magpie::implementation {
    type ScrollViewer (line 103) | struct ScrollViewer

FILE: src/Magpie/PageFrame.h
  type PageFrame (line 6) | struct PageFrame
  function FrameworkElement (line 35) | FrameworkElement _headerAction{ nullptr };

FILE: src/Magpie/Profile.h
  type class (line 6) | enum class
  function CursorScaling (line 17) | enum class CursorScaling {

FILE: src/Magpie/ProfilePage.cpp
  type winrt::Magpie::implementation (line 15) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ProfilePage.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ProfileService.cpp
  type Magpie (line 11) | namespace Magpie {
    function MatchWPFClassName (line 16) | static bool MatchWPFClassName(std::wstring_view& className) noexcept {
    function MatchRPGMakerMZClassName (line 50) | static bool MatchRPGMakerMZClassName(std::wstring_view& className) noe...
    function MatchTeknoParrotClassName (line 70) | static bool MatchTeknoParrotClassName(std::wstring_view& className) no...
    function ParseClassName (line 87) | static std::wstring_view ParseClassName(std::wstring_view className) n...
    function TestNewProfileImpl (line 101) | static bool TestNewProfileImpl(
    function AnyAutoScaleProfile (line 191) | static bool AnyAutoScaleProfile(const std::vector<Profile>& profiles) ...
    function Profile (line 200) | const Profile* ProfileService::GetProfileForWindow(HWND hWnd, bool for...
    function Profile (line 254) | Profile& ProfileService::DefaultProfile() noexcept {
    function Profile (line 258) | Profile& ProfileService::GetProfile(uint32_t idx) noexcept {

FILE: src/Magpie/ProfileService.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/ProfileViewModel.cpp
  type winrt::Magpie::implementation (line 29) | namespace winrt::Magpie::implementation {
    function fire_and_forget (line 69) | fire_and_forget ProfileViewModel::OpenProgramLocation() const noexcept {
    function ExtractFolder (line 94) | static std::wstring ExtractFolder(const std::wstring& path) noexcept {
    function GetStartFolderForSettingLauncher (line 109) | static std::wstring GetStartFolderForSettingLauncher(const Profile& pr...
    function fire_and_forget (line 124) | fire_and_forget ProfileViewModel::ChangeExeForLaunching() noexcept {
    function hstring (line 179) | hstring ProfileViewModel::Name() const noexcept {
    function LaunchPackagedApp (line 188) | static void LaunchPackagedApp(const Profile& profile) noexcept {
    function LaunchWin32App (line 214) | static void LaunchWin32App(const Profile& profile) noexcept {
    type CaptureMethod (line 363) | enum CaptureMethod
    type CaptureMethod (line 363) | enum CaptureMethod
    type AutoScale (line 389) | enum AutoScale
    type AutoScale (line 389) | enum AutoScale
    function hstring (line 780) | hstring ProfileViewModel::AutoHideCursorDelayText() const noexcept {
    function hstring (line 784) | hstring ProfileViewModel::LaunchParameters() const noexcept {
    function fire_and_forget (line 832) | fire_and_forget ProfileViewModel::_LoadIcon() {

FILE: src/Magpie/ProfileViewModel.h
  function namespace (line 5) | namespace Magpie {
  function namespace (line 9) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/RootPage.cpp
  type winrt::Magpie::implementation (line 32) | namespace winrt::Magpie::implementation {
    function SkipToggleSwitchAnimations (line 91) | static void SkipToggleSwitchAnimations(const DependencyObject& elem) {
    function TitleBarControl (line 343) | TitleBarControl& RootPage::TitleBar() {
    function Color (line 347) | static Color Win32ColorToWinRTColor(COLORREF color) {
    function fire_and_forget (line 376) | fire_and_forget RootPage::_LoadIcon(MUXC::NavigationViewItem const& it...

FILE: src/Magpie/RootPage.h
  function namespace (line 6) | namespace Magpie {
  function namespace (line 10) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ScalingMode.cpp
  type Magpie (line 5) | namespace Magpie {

FILE: src/Magpie/ScalingMode.h
  function namespace (line 4) | namespace Magpie {
  type ScalingMode (line 20) | struct ScalingMode {

FILE: src/Magpie/ScalingModeEffectItem.cpp
  type winrt::Magpie::implementation (line 22) | namespace winrt::Magpie::implementation {
    function SIZE (line 119) | static SIZE GetMonitorSize() noexcept {
    function EffectItem (line 355) | EffectItem& ScalingModeEffectItem::_Data() noexcept {
    function EffectItem (line 359) | const EffectItem& ScalingModeEffectItem::_Data() const noexcept {

FILE: src/Magpie/ScalingModeEffectItem.h
  function namespace (line 7) | namespace Magpie {
  function namespace (line 11) | namespace winrt::Magpie::implementation {
  type ScalingModeEffectItem (line 25) | struct ScalingModeEffectItem
  function IsShowScaleFactors (line 54) | bool IsShowScaleFactors() const noexcept;

FILE: src/Magpie/ScalingModeItem.cpp
  type winrt::Magpie::implementation (line 20) | namespace winrt::Magpie::implementation {
    function ScalingModeEffectItem (line 22) | static ScalingModeEffectItem& GetEffectItemImpl(const IInspectable& it...
    function hstring (line 239) | hstring ScalingModeItem::Name() const noexcept {
    function hstring (line 256) | hstring ScalingModeItem::Description() const noexcept {
    function ScalingMode (line 409) | ScalingMode& ScalingModeItem::_Data() noexcept {
    function ScalingMode (line 413) | const ScalingMode& ScalingModeItem::_Data() const noexcept {

FILE: src/Magpie/ScalingModeItem.h
  function namespace (line 6) | namespace Magpie {
  function namespace (line 10) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ScalingModesPage.cpp
  type winrt::Magpie::implementation (line 15) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ScalingModesPage.h
  function ScalingModesPage (line 8) | struct ScalingModesPage : ScalingModesPageT<ScalingModesPage> {

FILE: src/Magpie/ScalingModesService.cpp
  type Magpie (line 13) | namespace Magpie {
    function ScalingMode (line 15) | ScalingMode& ScalingModesService::GetScalingMode(uint32_t idx) {
    function UpdateProfileAfterRemove (line 38) | static void UpdateProfileAfterRemove(Profile& profile, int removedIdx) {
    function UpdateProfileAfterMove (line 60) | static void UpdateProfileAfterMove(Profile& profile, int idx, int targ...
    function WriteScalingMode (line 92) | static void WriteScalingMode(rapidjson::PrettyWriter<rapidjson::String...
    function LoadScalingMode (line 144) | static bool LoadScalingMode(

FILE: src/Magpie/ScalingModesService.h
  function namespace (line 6) | namespace Magpie {

FILE: src/Magpie/ScalingModesViewModel.cpp
  type winrt::Magpie::implementation (line 18) | namespace winrt::Magpie::implementation {
    function OpenFileDialogForJson (line 31) | static std::optional<std::filesystem::path> OpenFileDialogForJson(
    function fire_and_forget (line 44) | fire_and_forget ScalingModesViewModel::Export() noexcept {
    function fire_and_forget (line 87) | fire_and_forget ScalingModesViewModel::Import() {
    function fire_and_forget (line 170) | fire_and_forget ScalingModesViewModel::_AddScalingModes(bool isInitial...

FILE: src/Magpie/ScalingModesViewModel.h
  function namespace (line 6) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ScalingService.cpp
  type Magpie (line 22) | namespace Magpie {
    function ScalingService (line 24) | ScalingService& ScalingService::Get() noexcept {
    function ShowError (line 146) | static void ShowError(HWND hWnd, ScalingError error) noexcept {
    function IsPopupWindow (line 205) | static bool IsPopupWindow(HWND hwndPopup, HWND hwndOwner) noexcept {
    function IsReadyForScaling (line 238) | static bool IsReadyForScaling(HWND hwndFore) noexcept {
    function ScalingError (line 314) | ScalingError ScalingService::_StartScaleImpl(HWND hWnd, const Profile&...

FILE: src/Magpie/ScalingService.h
  function namespace (line 5) | namespace Magpie {
  function namespace (line 9) | namespace Magpie {

FILE: src/Magpie/SettingsCard.cpp
  type winrt::Magpie::implementation (line 18) | namespace winrt::Magpie::implementation {
    function IsNotEmpty (line 205) | static bool IsNotEmpty(IInspectable const& value) noexcept {

FILE: src/Magpie/SettingsCard.h
  function SettingsCard (line 7) | struct SettingsCard : SettingsCardT<SettingsCard> {

FILE: src/Magpie/SettingsExpander.cpp
  type winrt::Magpie::implementation (line 16) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsExpander.h
  function SettingsExpander (line 8) | struct SettingsExpander : SettingsExpanderT<SettingsExpander> {

FILE: src/Magpie/SettingsExpanderCornerRadiusConverter.cpp
  type winrt::Magpie::implementation (line 10) | namespace winrt::Magpie::implementation {
    function IInspectable (line 12) | IInspectable SettingsExpanderCornerRadiusConverter::Convert(IInspectab...
    function IInspectable (line 23) | IInspectable SettingsExpanderCornerRadiusConverter::ConvertBack(IInspe...

FILE: src/Magpie/SettingsExpanderCornerRadiusConverter.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsGroup.cpp
  type winrt::Magpie::implementation (line 14) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsGroup.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsPage.cpp
  type winrt::Magpie::implementation (line 12) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsPage.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/SettingsViewModel.cpp
  type winrt::Magpie::implementation (line 15) | namespace winrt::Magpie::implementation {
    function fire_and_forget (line 120) | fire_and_forget SettingsViewModel::OpenConfigLocation() const noexcept {

FILE: src/Magpie/SettingsViewModel.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/Shortcut.cpp
  type Magpie (line 8) | namespace Magpie {

FILE: src/Magpie/Shortcut.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/ShortcutControl.cpp
  type winrt::Magpie::implementation (line 22) | namespace winrt::Magpie::implementation {
    function ToKeys (line 24) | static IVector<IInspectable> ToKeys(const Shortcut& shortcut, bool isE...
    function fire_and_forget (line 53) | fire_and_forget ShortcutControl::EditButton_Click(IInspectable const&,...
    function LRESULT (line 134) | LRESULT ShortcutControl::_LowLevelKeyboardProc(int nCode, WPARAM wPara...

FILE: src/Magpie/ShortcutControl.h
  function namespace (line 7) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ShortcutDialog.cpp
  type winrt::Magpie::implementation (line 10) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ShortcutDialog.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ShortcutHelper.cpp
  type Magpie (line 8) | namespace Magpie {
    function ShortcutError (line 87) | ShortcutError ShortcutHelper::CheckShortcut(Shortcut shortcut) noexcept {
  type winrt (line 125) | namespace winrt {
    function hstring (line 129) | hstring to_hstring(ShortcutAction action) {

FILE: src/Magpie/ShortcutHelper.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie/ShortcutService.cpp
  type Magpie (line 28) | namespace Magpie {
    function LRESULT (line 75) | LRESULT ShortcutService::_WndProc(HWND hWnd, UINT message, WPARAM wPar...
    function LRESULT (line 139) | LRESULT CALLBACK ShortcutService::_LowLevelKeyboardProc(int nCode, WPA...

FILE: src/Magpie/ShortcutService.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie/SimpleStackPanel.cpp
  type winrt::Magpie::implementation (line 7) | namespace winrt::Magpie::implementation {
    type Orientation (line 9) | enum Orientation
    function Size (line 42) | Size SimpleStackPanel::MeasureOverride(const Size& availableSize) const {
    function Size (line 121) | Size SimpleStackPanel::ArrangeOverride(Size finalSize) const {

FILE: src/Magpie/SimpleStackPanel.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {
  type Orientation (line 8) | enum Orientation
  type Orientation (line 23) | enum Orientation
  function Thickness (line 24) | Thickness _padding{}

FILE: src/Magpie/SmoothResizeHelper.cpp
  type Magpie (line 16) | namespace Magpie {

FILE: src/Magpie/SmoothResizeHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/TextBlockHelper.cpp
  type winrt::Magpie::implementation (line 13) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/TextBlockHelper.h
  function namespace (line 4) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/TextMenuFlyout.cpp
  type winrt::Magpie::implementation (line 10) | namespace winrt::Magpie::implementation {
    function MenuFlyoutItemBase (line 217) | MenuFlyoutItemBase TextMenuFlyout::_CreateMenuItem(

FILE: src/Magpie/TextMenuFlyout.h
  type TextMenuFlyout (line 15) | struct TextMenuFlyout
  function MenuFlyoutItemBase (line 40) | MenuFlyoutItemBase _undo{ nullptr };

FILE: src/Magpie/ThemeHelper.cpp
  type Magpie (line 6) | namespace Magpie {
    type PreferredAppMode (line 10) | enum class PreferredAppMode {

FILE: src/Magpie/ThemeHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/TitleBarControl.cpp
  type winrt::Magpie::implementation (line 16) | namespace winrt::Magpie::implementation {
    function CaptionButtonsControl (line 50) | CaptionButtonsControl& TitleBarControl::CaptionButtons() noexcept {
    function Point (line 54) | Point TitleBarControl::LeftBottomPoint() noexcept {

FILE: src/Magpie/TitleBarControl.h
  type CaptionButtonsControl (line 7) | struct CaptionButtonsControl
  type TitleBarControl (line 9) | struct TitleBarControl

FILE: src/Magpie/ToastPage.cpp
  type winrt::Magpie::implementation (line 21) | namespace winrt::Magpie::implementation {
    function TrySetOwnder (line 52) | static bool TrySetOwnder(HWND hwndToast, HWND hwndTarget) noexcept {
    function UpdateToastPosition (line 62) | static void UpdateToastPosition(HWND hwndToast, const RECT& frameRect,...
    function fire_and_forget (line 100) | fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std...

FILE: src/Magpie/ToastPage.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {

FILE: src/Magpie/ToastService.cpp
  type Magpie (line 16) | namespace Magpie {
    function LRESULT (line 154) | LRESULT ToastService::_ToastWndProc(HWND hWnd, UINT msg, WPARAM wParam...
    function DispatcherQueue (line 170) | const DispatcherQueue& ToastService::_Dispatcher() const noexcept {

FILE: src/Magpie/ToastService.h
  function namespace (line 4) | namespace Magpie {

FILE: src/Magpie/TouchHelper.cpp
  type Magpie (line 11) | namespace Magpie {
    function GetCertificateDataFromPE (line 24) | static std::vector<uint8_t> GetCertificateDataFromPE(const wchar_t* fi...
    function CloseCertStore (line 48) | static void CloseCertStore(HCERTSTORE hCertStore) noexcept {
    function InstallCertificateFromPE (line 56) | static bool InstallCertificateFromPE(const wchar_t* exePath) noexcept {
    function StopTouchHelper (line 203) | static void StopTouchHelper() noexcept {
    function DeleteTouchHelperExe (line 247) | static bool DeleteTouchHelperExe(const wchar_t* exePath) noexcept {
    function GetTouchHelperPath (line 325) | static std::wstring GetTouchHelperPath() noexcept {
    function CheckAndFixTouchHelper (line 361) | static bool CheckAndFixTouchHelper(std::wstring& path) noexcept {

FILE: src/Magpie/TouchHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/UpdateService.cpp
  type Magpie (line 26) | namespace Magpie {
    function fire_and_forget (line 55) | fire_and_forget UpdateService::CheckForUpdatesAsync(bool isAutoUpdate) {
    function Md5ToHex (line 178) | static std::wstring Md5ToHex(const uint8_t* data) {
    function fire_and_forget (line 196) | fire_and_forget UpdateService::DownloadAndInstall() {
    function fire_and_forget (line 450) | fire_and_forget UpdateService::_Timer_Tick(ThreadPoolTimer const& time...

FILE: src/Magpie/UpdateService.h
  function namespace (line 5) | namespace Magpie {

FILE: src/Magpie/WrapPanel.h
  function namespace (line 5) | namespace winrt::Magpie::implementation {
  function Add (line 25) | void Add(const UvMeasure& measure) noexcept {
  function Size (line 30) | Size ToSize(Orientation orientation) const noexcept {
  function else (line 38) | struct UvRect {
  function else (line 51) | struct Row {
  function Add (line 60) | void Add(const UvMeasure& position, const UvMeasure& size_) noexcept {
  function Clear (line 67) | void Clear() noexcept {
  type WrapPanel (line 76) | struct WrapPanel
  type Orientation (line 84) | enum Orientation
  type Orientation (line 103) | enum Orientation
  function Thickness (line 104) | Thickness _padding{}

FILE: src/Magpie/XamlHelper.cpp
  type Magpie (line 9) | namespace Magpie {
    function IsComboBoxPopup (line 11) | static bool IsComboBoxPopup(const Popup& popup) {

FILE: src/Magpie/XamlHelper.h
  function namespace (line 3) | namespace Magpie {

FILE: src/Magpie/XamlWindow.h
  function _Content (line 54) | void _Content(C const& content) {
  function _SetTheme (line 83) | void _SetTheme(bool isLightTheme) noexcept {
  function Ignore (line 128) | [[maybe_unused]] static Ignore _ = []() {
  function MONITORINFO (line 173) | MONITORINFO monInfo{ .cbSize = sizeof(MONITORINFO) }
  function APPBARDATA (line 177) | APPBARDATA appBarData{}

FILE: src/Magpie/main.cpp
  function SetWorkingDir (line 28) | static void SetWorkingDir() noexcept {
  function InitializeLogger (line 33) | static void InitializeLogger(const wchar_t* logFilePath) noexcept {
  function wWinMain (line 43) | int APIENTRY wWinMain(

FILE: src/Magpie/pch.h
  function namespace (line 79) | namespace winrt {
Copy disabled (too large) Download .json
Condensed preview — 587 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,195K chars).
[
  {
    "path": ".all-contributorsrc",
    "chars": 9057,
    "preview": "{\n  \"files\": [\n    \"README.md\",\n    \"README_ZH.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {"
  },
  {
    "path": ".editorconfig",
    "chars": 3319,
    "preview": "# Visual Studio 生成了具有 C++ 设置的 .editorconfig 文件。\nroot = true\n\n[*.{c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tl"
  },
  {
    "path": ".gitattributes",
    "chars": 2518,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01_bug.yaml",
    "chars": 883,
    "preview": "name: Bug 错误\ndescription: Report bugs 报告错误\nlabels: bug\nbody:\n- type: input\n  attributes:\n    label: Magpie version 程序版本\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02_performance.yaml",
    "chars": 1051,
    "preview": "name: Performance 性能\ndescription: obvious performance problems at runtime 运行时有显著的性能衰减\nlabels: performance\nbody:\n- type: "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/03_request.yaml",
    "chars": 643,
    "preview": "name: Feature Request 功能请求\ndescription: Create the request for a new feature 提出一个增加新功能的请求\nlabels: enhancement\nbody:\n- ty"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/04_question.yaml",
    "chars": 1113,
    "preview": "name: Q&A 问询\ndescription: Ask questions about Magpie 提出关于magpie的问题\nlabels: question\nbody:\n- type: markdown\n  attributes:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 178,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Discussions 讨论\n    url: https://github.com/Blinue/Magpie/discussions"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 441,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1620,
    "preview": "name: build\n\non:\n  push:\n    paths: [ '.github/workflows/build.yml', 'Magpie.slnx', '*.props', 'scripts/publish.py', 'sr"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2297,
    "preview": "name: Publish release\n\non:\n  workflow_dispatch:\n    inputs:\n      major:\n        description: 'Major'\n        required: "
  },
  {
    "path": ".github/workflows/wiki.yml",
    "chars": 425,
    "preview": "name: Publish wiki\n\non:\n  push:\n    branches: [ main ]\n    paths: [ '.github/workflows/wiki.yml', 'docs/**', 'scripts/wi"
  },
  {
    "path": ".gitignore",
    "chars": 6881,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6745,
    "preview": "# Contribution Guide\n\n**First of all, thank you for spending your valuable time on this project!**\n\nMagpie is a personal"
  },
  {
    "path": "CONTRIBUTING_ZH.md",
    "chars": 3173,
    "preview": "# 贡献指南\n\n**首先,感谢你将宝贵的时间花费在本项目上!** \n\nMagpie 是一个个人项目,最早启发于 IntegerScaler 和 Lossless Scaling,但现在它比前辈们强大的多。开发者的能力和精力有限,因此欢迎任何"
  },
  {
    "path": "Directory.Build.props",
    "chars": 986,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Property"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "Magpie.slnx",
    "chars": 1780,
    "preview": "<Solution>\n  <Configurations>\n    <Platform Name=\"ARM64\" />\n    <Platform Name=\"x64\" />\n  </Configurations>\n  <Folder Na"
  },
  {
    "path": "README.md",
    "chars": 14144,
    "preview": "<br>\n<p align=\"center\">\n  <img src=\"./src/Magpie/Icons/SVG/Magpie Icon Full Disabled.svg\" width=\"150px\" height=\"150px\" a"
  },
  {
    "path": "README_ZH.md",
    "chars": 13351,
    "preview": "<br>\n<p align=\"center\">\n  <img src=\"./src/Magpie/Icons/SVG/Magpie Icon Full Disabled.svg\" width=\"150px\" height=\"150px\" a"
  },
  {
    "path": "Settings.XamlStyler",
    "chars": 1864,
    "preview": "{\n    \"AttributesTolerance\": 1,\n    \"KeepFirstAttributeOnSameLine\": true,\n    \"MaxAttributeCharactersPerLine\": 0,\n    \"M"
  },
  {
    "path": "certs/.gitignore",
    "chars": 6,
    "preview": "!*.pfx"
  },
  {
    "path": "docs/About touch support.md",
    "chars": 1151,
    "preview": "Due to OS security restrictions, Magpie requires UIAccess privileges to support touch input. Obtaining this privilege ne"
  },
  {
    "path": "docs/Built-in effects.md",
    "chars": 11560,
    "preview": "Magpie ships with a handful of effects that can be used in combinations. Most of the effects have parameters that can be"
  },
  {
    "path": "docs/Comparison of capture methods.md",
    "chars": 1085,
    "preview": "Magpie provides several capture methods. They have their pros and cons in different scenarios. For general purposes, it'"
  },
  {
    "path": "docs/Compilation guide.md",
    "chars": 1650,
    "preview": "### Prerequisites\n\nIn order to compile Magpie, you need to first install:\n\n1. The latest version of Visual Studio 2022 o"
  },
  {
    "path": "docs/FAQ (EN).md",
    "chars": 3994,
    "preview": "## Duplicate-monitoring\n\nWhen displaying performance monitor like RTSS (Rivatuner Statistics Server), there might be 2 O"
  },
  {
    "path": "docs/FAQ.md",
    "chars": 1905,
    "preview": "### 双重监控\n\n使用性能计数器屏显时,例如 RTSS (Rivatuner Statistics Server),你可能会在缩放时看到两个叠加层。这是由于 Magpie 使用 Direct3D 呈现画面,它也会被 RTSS 捕捉。如果你"
  },
  {
    "path": "docs/Home (EN).md",
    "chars": 225,
    "preview": "[Chinese version](https://github.com/Blinue/Magpie/wiki/)\n\nWelcome to the Magpie Wiki. Please read [CONTRIBUTING](https:"
  },
  {
    "path": "docs/Home.md",
    "chars": 226,
    "preview": "[English version](https://github.com/Blinue/Magpie/wiki/Home%20(EN))\n\n欢迎来到 Magpie Wiki。如果你想贡献文档,请阅读[贡献指南](https://github"
  },
  {
    "path": "docs/Interact with Magpie programally.md",
    "chars": 4688,
    "preview": "Magpie provides mechanisms for interaction with other programs. Through these mechanisms, your application can cooperate"
  },
  {
    "path": "docs/MagpieFX (EN).md",
    "chars": 6673,
    "preview": "MagpieFX is based on DirectX 11 compute shader\n\n``` hlsl\n//!MAGPIE EFFECT\n//!VERSION 4\n// Use the \"USE\" directive to dec"
  },
  {
    "path": "docs/MagpieFX.md",
    "chars": 3711,
    "preview": "MagpieFX 基于 DirectX 11 计算着色器\n\n``` hlsl\n//!MAGPIE EFFECT\n//!VERSION 4\n// 使用 USE 指令声明使用的功能,支持以下值的组合:\n// MulAdd:使 MulAdd 函数"
  },
  {
    "path": "docs/Performance optimization.md",
    "chars": 8341,
    "preview": "This article may be helpful if you are facing performance issues (e.g. lagging, latency, too much power consumption).\n\nB"
  },
  {
    "path": "docs/_Sidebar.md",
    "chars": 1299,
    "preview": "- [维基主页](https://github.com/Blinue/Magpie/wiki/)\n  - [FAQ](https://github.com/Blinue/Magpie/wiki/FAQ)\n  - [编译指南](https:/"
  },
  {
    "path": "docs/以编程方式与 Magpie 交互.md",
    "chars": 3054,
    "preview": "Magpie 提供了和其他程序交互的机制。通过它们,你的应用可以和 Magpie 配合使用。\n\n[MagpieWatcher](https://github.com/Blinue/MagpieWatcher) 演示了如何使用这些机制。\n\n#"
  },
  {
    "path": "docs/关于触控支持.md",
    "chars": 444,
    "preview": "由于操作系统的安全限制,Magpie 需要 UIAccess 权限来支持触控输入。获得此权限需要满足两个条件:\n\n1. 应用程序必须有一个数字签名,且该签名能够通过与本地计算机上受信任的根证书颁发机构存储相关联的证书来验证。\n2. 应用程序"
  },
  {
    "path": "docs/内置效果介绍.md",
    "chars": 6692,
    "preview": "Magpie 内置了大量效果供组合使用,大部分提供了参数选项以订制行为。所有效果存储在 effects 文件夹中,如果你了解 HLSL,你可以很容易的添加任何你想要的效果,见 [MagpieFX](https://github.com/Bl"
  },
  {
    "path": "docs/性能优化建议.md",
    "chars": 4220,
    "preview": "如果你遇到了性能问题(卡顿、延迟、功耗过高等),本文档可能有所帮助。\n\n下面是一些你可能面临的情况:\n\n## 我的显卡性能不足\n\n如果你无法流畅使用一些有较高性能要求的效果(如 Anime4K、AdaptiveSharpen 等),请尝试下"
  },
  {
    "path": "docs/捕获方式对比.md",
    "chars": 528,
    "preview": "Magpie 提供数种捕获方式,根据使用场景,它们各有优劣。无特殊需求应使用 Graphics Capture,它提供最好的兼容性和流畅度。\n\n| | Graphics Capture | Desktop Duplication | GDI"
  },
  {
    "path": "docs/编译指南.md",
    "chars": 1009,
    "preview": "## 先决条件\n\n为了编译 Magpie,你首先需要安装:\n\n1. Visual Studio 2022 或 2026 的最新版本,需要安装“使用 C++ 的桌面开发”和“通用 Windows 平台开发”两个工作负荷以及 Windows S"
  },
  {
    "path": "natvis/magpie.natvis",
    "chars": 1417,
    "preview": "<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n  <Type Name=\"SmallVectorImpl&lt;*&gt"
  },
  {
    "path": "natvis/phmap.natvis",
    "chars": 6377,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>  \n\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/20"
  },
  {
    "path": "natvis/rapidjson.natvis",
    "chars": 2728,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\""
  },
  {
    "path": "scripts/publish.py",
    "chars": 3674,
    "preview": "import sys\nimport os\nimport subprocess\nimport glob\nimport argparse\n\ntry:\n    # https://docs.github.com/en/actions/learn-"
  },
  {
    "path": "scripts/release.py",
    "chars": 4658,
    "preview": "import sys\nimport os\nimport subprocess\nimport shutil\nimport requests\nimport hashlib\nimport json\nimport argparse\n\ntry:\n  "
  },
  {
    "path": "scripts/wiki.py",
    "chars": 1450,
    "preview": "import sys\nimport os\nimport tempfile\nimport glob\nimport shutil\nimport subprocess\nimport argparse\n\ntry:\n    # https://doc"
  },
  {
    "path": "src/BuildOptions.props",
    "chars": 1023,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <!-- 不要直接"
  },
  {
    "path": "src/Common.Post.props",
    "chars": 7223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Microsoft.Cpp.props 之后导入 -->\n<Project xmlns=\"http://schemas.microsoft.com/de"
  },
  {
    "path": "src/Common.Pre.props",
    "chars": 2154,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Microsoft.Cpp.Default.props 之后导入 -->\n<Project xmlns=\"http://schemas.microsof"
  },
  {
    "path": "src/Effects/ACNet.hlsl",
    "chars": 238786,
    "preview": "// ACNet\n// 移植自 https://github.com/TianZerL/ACNetGLSL/blob/f20a6b6b7327f4caf588b06c6b21f18e40dae1ce/glsl/ACNet.glsl\n\n//!"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_3D_AA_Upscale_US.hlsl",
    "chars": 13822,
    "preview": "// Anime4K_3DGraphics_AA_Upscale_x2_US\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_3DGraph"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_3D_Upscale_US.hlsl",
    "chars": 13719,
    "preview": "// Anime4K_3DGraphics_Upscale_x2_US\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_3DGraphics"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mean.hlsl",
    "chars": 3300,
    "preview": "// Anime4K_Denoise_Bilateral_Mean\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Denoise/Anime4K_Denoise_Bila"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Median.hlsl",
    "chars": 3771,
    "preview": "// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Denoise/Anime4K_Denoise_Bilateral_Median.glsl\n\n\n//!MAGPIE EFFE"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mode.hlsl",
    "chars": 4153,
    "preview": "// Anime4K_Denoise_Bilateral_Mode\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Denoise/Anime4K_Denoise_Bila"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_L.hlsl",
    "chars": 75163,
    "preview": "// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_L.glsl\n\n//!MAGPIE EFFECT\n//!VERSIO"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_M.hlsl",
    "chars": 42558,
    "preview": "// Anime4K_Restore_CNN_M\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_M.glsl\n\n/"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_S.hlsl",
    "chars": 20284,
    "preview": "// Anime4K_Restore_CNN_S\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_S.glsl\n\n/"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_Soft_L.hlsl",
    "chars": 75221,
    "preview": "// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft_L.glsl\n\n//!MAGPIE EFFECT\n//!V"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl",
    "chars": 42631,
    "preview": "// Anime4K_Restore_CNN_Soft_M\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_Soft_S.hlsl",
    "chars": 20341,
    "preview": "// Anime4K_Restore_CNN_Soft_S\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_Soft_UL.hlsl",
    "chars": 317607,
    "preview": "// Anime4K_Restore_CNN_Soft_UL\n// Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_Soft_VL.hlsl",
    "chars": 152851,
    "preview": "// Anime4K_Restore_CNN_Soft_VL\n// Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_UL.hlsl",
    "chars": 317505,
    "preview": "// Anime4K_Restore_CNN_UL\n// Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c6914c"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Restore_VL.hlsl",
    "chars": 152810,
    "preview": "// Anime4K_Restore_CNN_VL\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_VL.glsl\n"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl",
    "chars": 7621,
    "preview": "// Anime4K_Thin_HQ\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Experimental-Effects/Anime4K_Thin_HQ.glsl\n\n"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_Denoise_L.hlsl",
    "chars": 76703,
    "preview": "// Anime4K_Upscale_Denoise_CNN_x2_L\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale%2BDenoise/Anime4K_"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_Denoise_S.hlsl",
    "chars": 21652,
    "preview": "// Anime4K_Upscale_Denoise_CNN_x2_S\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale%2BDenoise/Anime4K_"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_Denoise_UL.hlsl",
    "chars": 294634,
    "preview": "// Anime4K_Upscale_Denoise_CNN_x2_UL\n// 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_Denoise_VL.hlsl",
    "chars": 152754,
    "preview": "// Anime4K_Upscale_Denoise_CNN_x2_VL\n// 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl",
    "chars": 150756,
    "preview": "// Anime4K_Upscale_GAN_x2_M\n// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl",
    "chars": 78464,
    "preview": "// Anime4K_Upscale_GAN_x2_S\n// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl",
    "chars": 244169,
    "preview": "// Anime4K_Upscale_GAN_x3_L\n// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_L.hlsl",
    "chars": 76616,
    "preview": "// Anime4K_Upscale_CNN_x2_L\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_CNN_x2_L.g"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_S.hlsl",
    "chars": 21607,
    "preview": "// Anime4K_Upscale_CNN_x2_S\n// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_CNN_x2_S.g"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl",
    "chars": 295016,
    "preview": "// Anime4K_Upscale_CNN_x2_UL\n// 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl"
  },
  {
    "path": "src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl",
    "chars": 152797,
    "preview": "// Anime4K_Upscale_CNN_x2_VL\n// 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl"
  },
  {
    "path": "src/Effects/Bicubic.hlsl",
    "chars": 2956,
    "preview": "// Bicubic 插值算法\n// 移植自 https://github.com/ActualMandM/cemu_graphic_packs/blob/468d165cf27dae13a06e8bdc3d588d0af775ad91/F"
  },
  {
    "path": "src/Effects/Bilinear.hlsl",
    "chars": 254,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\nTexture2D OUTPUT;\n\n//!SAMPLER\n//!FILTER LINEAR\nSa"
  },
  {
    "path": "src/Effects/CAS/CAS.hlsl",
    "chars": 7995,
    "preview": "// 移植自 https://github.com/GPUOpen-Effects/FidelityFX-CAS/blob/master/ffx-cas/ffx_cas.h\n\n//!MAGPIE EFFECT\n//!VERSION 4\n//"
  },
  {
    "path": "src/Effects/CAS/CAS_Scaling.hlsl",
    "chars": 23003,
    "preview": "// 移植自 https://github.com/GPUOpen-Effects/FidelityFX-CAS/blob/9fabcc9a2c45f958aff55ddfda337e74ef894b7f/ffx-cas/ffx_cas.h"
  },
  {
    "path": "src/Effects/CRT/CRT_Easymode.hlsl",
    "chars": 6018,
    "preview": "// CRT-Easymode\n// 移植自 https://github.com/libretro/common-shaders/blob/master/crt/shaders/crt-easymode.cg\n\n/*\n\tCRT Shade"
  },
  {
    "path": "src/Effects/CRT/CRT_Geom.hlsl",
    "chars": 10355,
    "preview": "// CRT-Geom\n// 移植自 https://github.com/libretro/common-shaders/blob/master/crt/shaders/crt-geom.cg\n\n/*\n\tCRT-interlaced\n\n\t"
  },
  {
    "path": "src/Effects/CRT/CRT_Hyllian.hlsl",
    "chars": 7016,
    "preview": "// CRT-Hyllian\n// 移植自 https://github.com/libretro/common-shaders/blob/master/crt/shaders/crt-hyllian.cg\n// 要求整数倍缩放\n\n/*\n "
  },
  {
    "path": "src/Effects/CRT/CRT_Lottes.hlsl",
    "chars": 8430,
    "preview": "// CRT-Lottes\n// 移植自 https://github.com/libretro/common-shaders/blob/master/crt/shaders/crt-lottes.cg\n\n\n// PUBLIC DOMAIN"
  },
  {
    "path": "src/Effects/CRT/GTU_v050.hlsl",
    "chars": 5197,
    "preview": "// GTU-v050\n// 移植自 https://github.com/libretro/common-shaders/tree/master/crt/shaders/gtu-v050\n\n////////////////////////"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl",
    "chars": 1122699,
    "preview": "// CuNNy 16x16C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can r"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl",
    "chars": 1122856,
    "preview": "// CuNNy 16x16C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redi"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl",
    "chars": 19382,
    "preview": "// CuNNy 2x4C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl",
    "chars": 19373,
    "preview": "// CuNNy 2x4C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl",
    "chars": 24619,
    "preview": "// CuNNy 3x4C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl",
    "chars": 24611,
    "preview": "// CuNNy 3x4C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl",
    "chars": 300577,
    "preview": "// CuNNy 4x16C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can re"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl",
    "chars": 300625,
    "preview": "// CuNNy 4x16C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redis"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl",
    "chars": 29793,
    "preview": "// CuNNy 4x4C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl",
    "chars": 29825,
    "preview": "// CuNNy 4x4C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl",
    "chars": 87685,
    "preview": "// CuNNy 4x8C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl",
    "chars": 87685,
    "preview": "// CuNNy 4x8C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl",
    "chars": 124110,
    "preview": "// CuNNy 6x8C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl",
    "chars": 124094,
    "preview": "// CuNNy 6x8C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl",
    "chars": 574728,
    "preview": "// CuNNy 8x16C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can re"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl",
    "chars": 574557,
    "preview": "// CuNNy 8x16C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redis"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl",
    "chars": 50732,
    "preview": "// CuNNy 8x4C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl",
    "chars": 50736,
    "preview": "// CuNNy 8x4C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl",
    "chars": 160524,
    "preview": "// CuNNy 8x8C BILINEAR RGB NVL DN - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can red"
  },
  {
    "path": "src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl",
    "chars": 160669,
    "preview": "// CuNNy 8x8C BILINEAR RGB NVL - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redist"
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-3x12-NVL.hlsl",
    "chars": 82576,
    "preview": "// CuNNy 3x12 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-4x12-NVL.hlsl",
    "chars": 101168,
    "preview": "// CuNNy 4x12 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-4x16-NVL.hlsl",
    "chars": 164325,
    "preview": "// CuNNy 4x16 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-4x24-NVL.hlsl",
    "chars": 336424,
    "preview": "// CuNNy 4x24 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-4x32-NVL.hlsl",
    "chars": 570521,
    "preview": "// CuNNy 4x32 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-8x32-NVL.hlsl",
    "chars": 1074230,
    "preview": "// CuNNy 8x32 - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-fast-NVL.hlsl",
    "chars": 42032,
    "preview": "// CuNNy fast - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/or "
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-faster-NVL.hlsl",
    "chars": 27071,
    "preview": "// CuNNy faster - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and/o"
  },
  {
    "path": "src/Effects/CuNNy2/CuNNy-veryfast-NVL.hlsl",
    "chars": 20883,
    "preview": "// CuNNy veryfast - https://github.com/funnyplanter/CuNNy\n\n// This program is free software: you can redistribute it and"
  },
  {
    "path": "src/Effects/Deband.hlsl",
    "chars": 3643,
    "preview": "// Deband\n// Port from https://github.com/haasn/gentoo-conf/blob/xor/home/nand/.mpv/shaders/deband.glsl\n\n//!MAGPIE EFFEC"
  },
  {
    "path": "src/Effects/Effects.vcxproj",
    "chars": 19404,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msb"
  },
  {
    "path": "src/Effects/Effects.vcxproj.filters",
    "chars": 19506,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuil"
  },
  {
    "path": "src/Effects/FSR/FSR_EASU.hlsl",
    "chars": 16444,
    "preview": "// FidelityFX-FSR 中 EASU 通道\n// 移植自 https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/a21ffb8f6c13233ba336352bdff293"
  },
  {
    "path": "src/Effects/FSR/FSR_RCAS.hlsl",
    "chars": 7172,
    "preview": "// FidelityFX-FSR 中 RCAS 通道\n// 移植自 https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/a21ffb8f6c13233ba336352bdff293"
  },
  {
    "path": "src/Effects/FSRCNNX/FSRCNNX.hlsl",
    "chars": 80863,
    "preview": "// FSRCNNX_x2_8-0-4-1\n// 移植自 https://github.com/igv/FSRCNN-TensorFlow\n\n\n//!MAGPIE EFFECT\n//!VERSION 4\n//!USE MulAdd\n//!C"
  },
  {
    "path": "src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl",
    "chars": 80852,
    "preview": "// FSRCNNX_x2_8-0-4-1_LineArt\n// 移植自 https://github.com/igv/FSRCNN-TensorFlow\n\n//!MAGPIE EFFECT\n//!VERSION 4\n//!USE MulA"
  },
  {
    "path": "src/Effects/FXAA/FXAA.hlsli",
    "chars": 6687,
    "preview": "// 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang\n\n\n/*\nFXAA_PRESET - Choose "
  },
  {
    "path": "src/Effects/FXAA/FXAA_High.hlsl",
    "chars": 1415,
    "preview": "// 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang\n\n//!MAGPIE EFFECT\n//!VERSI"
  },
  {
    "path": "src/Effects/FXAA/FXAA_Medium.hlsl",
    "chars": 1415,
    "preview": "// 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang\n\n//!MAGPIE EFFECT\n//!VERSI"
  },
  {
    "path": "src/Effects/FXAA/FXAA_Ultra.hlsl",
    "chars": 1415,
    "preview": "// 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang\n\n//!MAGPIE EFFECT\n//!VERSI"
  },
  {
    "path": "src/Effects/ImageAdjustment.hlsl",
    "chars": 2394,
    "preview": "// 移植自 https://github.com/libretro/slang-shaders/blob/3f67e1870dbd5be74ae2f09eaed0eeadce6abd15/misc/image-adjustment.sla"
  },
  {
    "path": "src/Effects/Jinc.hlsl",
    "chars": 3756,
    "preview": "// Jinc2 插值算法\n// 移植自 https://github.com/libretro/common-shaders/blob/master/windowed/shaders/jinc2.cg\n//\n// This is an a"
  },
  {
    "path": "src/Effects/Lanczos.hlsl",
    "chars": 2757,
    "preview": "// Lanczos6 插值算法\n// 移植自 https://github.com/libretro/common-shaders/blob/master/windowed/shaders/lanczos6.cg\n\n//!MAGPIE E"
  },
  {
    "path": "src/Effects/NIS/NIS.hlsl",
    "chars": 2830,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n//!CAPABILITY FP16\n\n#include \"../StubDefs.hlsli\"\n\n//!PARAMETER\n//!LABEL Sharpness\n//!DEFAU"
  },
  {
    "path": "src/Effects/NIS/NIS_Scaler.hlsli",
    "chars": 37771,
    "preview": "// 取自 https://github.com/NVIDIAGameWorks/NVIDIAImageScaling/blob/35e13ba316c98eeecf16f37eae70ce88019911f6/NIS/NIS_Scaler"
  },
  {
    "path": "src/Effects/NIS/NVSharpen.hlsl",
    "chars": 2646,
    "preview": "// 移植自 https://github.com/NVIDIAGameWorks/NVIDIAImageScaling/blob/main/NIS/NIS_Scaler.h\n\n//!MAGPIE EFFECT\n//!VERSION 4\n/"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl",
    "chars": 262340,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl",
    "chars": 384658,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl",
    "chars": 41261,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl",
    "chars": 57532,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl",
    "chars": 515502,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl",
    "chars": 758694,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl",
    "chars": 72773,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl",
    "chars": 104328,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl",
    "chars": 135802,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl",
    "chars": 197759,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/NNEDI3/prescalers.hlsli",
    "chars": 2644,
    "preview": "// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public "
  },
  {
    "path": "src/Effects/Nearest.hlsl",
    "chars": 253,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\nTexture2D OUTPUT;\n\n//!SAMPLER\n//!FILTER POINT\nSam"
  },
  {
    "path": "src/Effects/Pixel Art/MMPX.hlsl",
    "chars": 4735,
    "preview": "// MMPX\n// 移植自 https://casual-effects.com/research/McGuire2021PixelArt/index.html\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!TE"
  },
  {
    "path": "src/Effects/Pixel Art/Pixellate.hlsl",
    "chars": 1546,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/interpolation/shaders/pixellate.cg\n\n//!MAGPIE EFFECT\n//!VE"
  },
  {
    "path": "src/Effects/Pixel Art/SharpBilinear.hlsl",
    "chars": 1088,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/interpolation/shaders/sharp-bilinear.cg\n\n//!MAGPIE EFFECT\n"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R2.hlsl",
    "chars": 6729,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl",
    "chars": 7610,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R3.hlsl",
    "chars": 9215,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl",
    "chars": 10841,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R4.hlsl",
    "chars": 13960,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl",
    "chars": 16950,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl",
    "chars": 8418,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl",
    "chars": 10428,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl",
    "chars": 14485,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_R2.hlsl",
    "chars": 6268,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_R3.hlsl",
    "chars": 7444,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Lite_R4.hlsl",
    "chars": 11495,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R2.hlsl",
    "chars": 17422,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R2_RGB.hlsl",
    "chars": 17921,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R3.hlsl",
    "chars": 23476,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R3_RGB.hlsl",
    "chars": 24215,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R4.hlsl",
    "chars": 40676,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_R4_RGB.hlsl",
    "chars": 41835,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl",
    "chars": 10684,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl",
    "chars": 12131,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl",
    "chars": 13137,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl",
    "chars": 15240,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_R2.hlsl",
    "chars": 7627,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl",
    "chars": 8082,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_R3.hlsl",
    "chars": 9956,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl",
    "chars": 11067,
    "preview": "// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers\n// Please don't edit t"
  },
  {
    "path": "src/Effects/RAVU/prescalers.hlsli",
    "chars": 2644,
    "preview": "// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public "
  },
  {
    "path": "src/Effects/SGSR.hlsl",
    "chars": 4588,
    "preview": "// Snapdragon™ Game Super Resolution\n// 移植自 https://github.com/SnapdragonStudios/snapdragon-gsr/blob/main/sgsr/v1/includ"
  },
  {
    "path": "src/Effects/SMAA/SMAA.hlsli",
    "chars": 35040,
    "preview": "// SMAA For Magpie\n// 移植自 https://github.com/iryoku/smaa\n// 根据 Magpie 的需求做了一些更改:\n// 1. 将 VS 的计算移到 PS 中\n// 2. 删除一些用不到的功能,"
  },
  {
    "path": "src/Effects/SMAA/SMAA_High.hlsl",
    "chars": 1377,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n//!SORT_NAME SMAA_2\n\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\n//!WIDTH INPUT_WIDTH\n//!HEIG"
  },
  {
    "path": "src/Effects/SMAA/SMAA_Low.hlsl",
    "chars": 1370,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n//!SORT_NAME SMAA_0\n\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\n//!WIDTH INPUT_WIDTH\n//!HEIG"
  },
  {
    "path": "src/Effects/SMAA/SMAA_Medium.hlsl",
    "chars": 1373,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n//!SORT_NAME SMAA_1\n\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\n//!WIDTH INPUT_WIDTH\n//!HEIG"
  },
  {
    "path": "src/Effects/SMAA/SMAA_Ultra.hlsl",
    "chars": 1378,
    "preview": "//!MAGPIE EFFECT\n//!VERSION 4\n//!SORT_NAME SMAA_3\n\n\n//!TEXTURE\nTexture2D INPUT;\n\n//!TEXTURE\n//!WIDTH INPUT_WIDTH\n//!HEIG"
  },
  {
    "path": "src/Effects/SSimDownscaler.hlsl",
    "chars": 10106,
    "preview": "// 基于感知的图像缩小算法\n// 移植自 https://gist.github.com/igv/36508af3ffc84410fe39761d6969be10\n// 原始文件使用了大量 mpv 的“特性”,因此可能存在移植错误。如果你"
  },
  {
    "path": "src/Effects/Sharpen/AdaptiveSharpen.hlsl",
    "chars": 8437,
    "preview": "// 自适应锐化算法\n// 移植自 https://github.com/libretro/slang-shaders/blob/master/sharpen/shaders/adaptive-sharpen.slang\n// \n// Ad"
  },
  {
    "path": "src/Effects/Sharpen/FineSharp.hlsl",
    "chars": 13173,
    "preview": "// FineSharp\n// 移植自 https://forum.doom9.org/showthread.php?t=171346\n\n// This is the FineSharp avisynth script by Didée c"
  },
  {
    "path": "src/Effects/Sharpen/LCAS.hlsl",
    "chars": 2620,
    "preview": "// This is a combination of linear interpolation and light version of cas\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n//!PARAMETER\n/"
  },
  {
    "path": "src/Effects/Sharpen/LumaSharpen.hlsl",
    "chars": 8051,
    "preview": "// LumaSharpen\n// 移植自 https://github.com/CeeJayDK/SweetFX/blob/master/Shaders/LumaSharpen.fx\n\n/**\n   LumaSharpen version"
  },
  {
    "path": "src/Effects/StubDefs.hlsli",
    "chars": 1450,
    "preview": "#define MP_BLOCK_WIDTH 8\n#define MP_BLOCK_HEIGHT 8\n#define MP_NUM_THREADS_X 64\n#define MP_NUM_THREADS_Y 1\n#define MP_NUM"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_2x.hlsl",
    "chars": 10601,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/2xbrz.cg\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_3x.hlsl",
    "chars": 11485,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/3xbrz.cg\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_4x.hlsl",
    "chars": 15652,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/4xbrz.cg\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_5x.hlsl",
    "chars": 17828,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/5xbrz.cg\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_6x.hlsl",
    "chars": 19831,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/6xbrz.cg\n\n//!MAGPIE EFFECT\n//!VERSION 4\n\n\n//!"
  },
  {
    "path": "src/Effects/xBRZ/xBRZ_Freescale.hlsl",
    "chars": 12821,
    "preview": "// 移植自 https://github.com/libretro/common-shaders/tree/master/xbrz/shaders/xbrz-freescale-multipass\n\n//!MAGPIE EFFECT\n//"
  },
  {
    "path": "src/HybridCRT.props",
    "chars": 1486,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- HybridCRT: https://github.com/microsoft/WindowsAppSDK/blob/main/docs/Coding-"
  },
  {
    "path": "src/Magpie/AboutPage.cpp",
    "chars": 1549,
    "preview": "#include \"pch.h\"\n#include \"AboutPage.h\"\n#if __has_include(\"AboutPage.g.cpp\")\n#include \"AboutPage.g.cpp\"\n#endif\n#include "
  },
  {
    "path": "src/Magpie/AboutPage.h",
    "chars": 759,
    "preview": "#pragma once\n#include \"AboutPage.g.h\"\n#include \"AboutViewModel.h\"\n\nnamespace winrt::Magpie::implementation {\n\nstruct Abo"
  },
  {
    "path": "src/Magpie/AboutPage.idl",
    "chars": 262,
    "preview": "namespace Magpie {\n\truntimeclass AboutPage : Windows.UI.Xaml.Controls.Page {\n\t\tAboutPage();\n\n\t\tAboutViewModel ViewModel "
  },
  {
    "path": "src/Magpie/AboutPage.xaml",
    "chars": 9681,
    "preview": "<Page x:Class=\"Magpie.AboutPage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\""
  },
  {
    "path": "src/Magpie/AboutViewModel.cpp",
    "chars": 8677,
    "preview": "#include \"pch.h\"\n#include \"AboutViewModel.h\"\n#if __has_include(\"AboutViewModel.g.cpp\")\n#include \"AboutViewModel.g.cpp\"\n#"
  },
  {
    "path": "src/Magpie/AboutViewModel.h",
    "chars": 2024,
    "preview": "#pragma once\n#include \"AboutViewModel.g.h\"\n#include \"UpdateService.h\"\n\nnamespace winrt::Magpie::implementation {\n\nstruct"
  }
]

// ... and 387 more files (download for full content)

About this extraction

This page contains the full source code of the Blinue/Magpie GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 587 files (15.8 MB), approximately 4.0M tokens, and a symbol index with 355 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!