├── Runtime ├── README.md ├── Env.h ├── Debug.h ├── Utils.h ├── GUIDs.cpp ├── MagWindow.h ├── D2DContext.h ├── Renderable.h ├── CursorManager.h ├── FrameCatcher.h ├── RenderManager.h ├── WinRTCapturer.h ├── pch.cpp ├── EffectRendererBase.h ├── Env.cpp ├── GDIWindowCapturer.h ├── WindowCapturerBase.h ├── D2DImageEffectRenderer.h ├── WICBitmapEffectRenderer.h ├── MagCallbackWindowCapturer.h ├── MonochromeCursorShader.hlsl ├── MagCallbackWindowCapturer.cpp ├── targetver.h ├── MagWindow.cpp ├── CursorManager.cpp ├── cpp.hint ├── packages.config ├── EffectDefines.h ├── pch.h ├── framework.h ├── DllMain.cpp ├── MonochromeCursorTransform.h ├── MonochromeCursorEffect.h └── Runtime.vcxproj.filters ├── tools └── HookTextureResolver │ ├── .gitignore │ ├── README.md │ ├── resolve.py │ ├── texture2array.py │ └── ravuZoomR3Texture2png.py ├── img ├── 窗口截图.png ├── 通用_放大后.png ├── 通用_源.png ├── 高DPI设置.png ├── Anime4K_放大后.png ├── Anime4K_源.png └── CursorHook.png ├── Magpie ├── logo.ico ├── README.md ├── packages.config ├── Properties │ ├── Settings.settings │ ├── AssemblyInfo.cs │ ├── app.manifest │ ├── Settings.Designer.cs │ └── Resources.Designer.cs ├── Program.cs ├── App.config └── NativeMethods.cs ├── CursorHook ├── README.md ├── packages.config ├── ServerInterface.cs ├── SafeCursorHandle.cs ├── Properties │ └── AssemblyInfo.cs ├── InjectionEntryPoint.cs ├── IpcServer.cs ├── RuntimeCursorHook.cs ├── StartUpCursorHook.cs └── CursorHook.csproj ├── MODULE_ACNet ├── ACNet.hlsli ├── ACNetEffect.h ├── pch.cpp ├── ACNetL10Shader.hlsl ├── ACNetL1aShader.hlsl ├── ACNetL1bShader.hlsl ├── ACNetL2aShader.hlsl ├── ACNetL2bShader.hlsl ├── ACNetL3aShader.hlsl ├── ACNetL3bShader.hlsl ├── ACNetL4aShader.hlsl ├── ACNetL4bShader.hlsl ├── ACNetL5aShader.hlsl ├── ACNetL5bShader.hlsl ├── ACNetL6aShader.hlsl ├── ACNetL6bShader.hlsl ├── ACNetL7aShader.hlsl ├── ACNetL7bShader.hlsl ├── ACNetL8aShader.hlsl ├── ACNetL8bShader.hlsl ├── ACNetL9aShader.hlsl ├── ACNetL9bShader.hlsl ├── packages.config ├── pch.h ├── DllMain.cpp ├── ACNetL10Transform.h ├── MODULE_ACNet.vcxproj.filters └── EffectDefines.h ├── EffectCommon ├── CommonPch.h ├── GUIDs.cpp ├── EffectBase.h ├── common.hlsli ├── SimpleDrawTransform.h ├── SimpleScaleTransform.h ├── packages.config ├── RGB2YUVShader.hlsl ├── CommonEffectDefines.h ├── CommonDebug.h ├── EffectCommon.vcxproj.filters └── EffectUtils.h ├── MODULE_RAVU ├── resource.h ├── MODULE_RAVU.rc ├── pch.cpp ├── RAVUZoomTransform.h ├── RAVUZoomR3Shader.hlsl ├── RavuZoomR3Weights.bmp ├── RAVULiteR3Pass1Shader.hlsl ├── RAVULiteR3Pass2Shader.hlsl ├── RAVUZoomWeightsTransform.h ├── packages.config ├── pch.h ├── RAVUZoomR3WeightsShader.hlsl ├── EffectDefines.h ├── RAVULitePass2Transform.h ├── MODULE_RAVU.vcxproj.filters ├── RAVULiteEffect.h └── DllMain.cpp ├── MODULE_Anime4K ├── Anime4K.hlsli ├── Anime4KEffect.h ├── pch.cpp ├── Anime4KDarkLinesEffect.h ├── Anime4KThinLinesEffect.h ├── Anime4KConv4x3x3x1Shader.hlsl ├── Anime4KConvReduceShader.hlsl ├── Anime4KDenoiseBilateralEffect.h ├── Anime4KConv4x3x3x8Pass1Shader.hlsl ├── Anime4KConv4x3x3x8Pass2Shader.hlsl ├── Anime4KConv4x3x3x8Pass3Shader.hlsl ├── Anime4KConv4x3x3x8Pass4Shader.hlsl ├── Anime4KConv4x3x3x8Pass5Shader.hlsl ├── Anime4KDarkLinesPass1Shader.hlsl ├── Anime4KDarkLinesPass2Shader.hlsl ├── Anime4KDarkLinesPass3Shader.hlsl ├── Anime4KDarkLinesPass4Shader.hlsl ├── Anime4KDarkLinesPass5Shader.hlsl ├── Anime4KDenoiseBilateralShader.hlsl ├── Anime4KSharpenCombineShader.hlsl ├── Anime4KThinLinesPass1Shader.hlsl ├── Anime4KThinLinesPass2Shader.hlsl ├── Anime4KThinLinesPass3Shader.hlsl ├── Anime4KThinLinesPass4Shader.hlsl ├── Anime4KThinLinesPass5Shader.hlsl ├── Anime4KThinLinesPass6Shader.hlsl ├── Anime4KThinLinesPass7Shader.hlsl ├── Anime4KDenoiseConv4x3x3x1Shader.hlsl ├── Anime4KDenoiseConvReduceShader.hlsl ├── Anime4KDenoiseConv4x3x3x8Pass1Shader.hlsl ├── Anime4KDenoiseConv4x3x3x8Pass2Shader.hlsl ├── Anime4KDenoiseConv4x3x3x8Pass3Shader.hlsl ├── Anime4KDenoiseConv4x3x3x8Pass4Shader.hlsl ├── Anime4KDenoiseConv4x3x3x8Pass5Shader.hlsl ├── packages.config ├── pch.h ├── Anime4KThinLinesPass7Transform.h ├── Anime4KDarkLinesPass5Transform.h ├── Anime4KDenoiseBilateralTransform.h ├── Anime4KConvReduceTransform.h └── Anime4KSharpenCombineTransform.h ├── MODULE_SSIM ├── pch.cpp ├── SSimDownscalerRShader.hlsl ├── SSimSuperResVarLShader.hlsl ├── SSimSuperResFinalShader.hlsl ├── SSimSuperResWithScaleTransform.h ├── packages.config ├── pch.h ├── SSimDownscalerL2Pass2Shader.hlsl ├── SSimDownscalerL2Pass1Shader.hlsl ├── SSimSuperResVarHShader.hlsl ├── SSimSuperResDownscaling1Shader.hlsl ├── SSimSuperResDownscaling2Shader.hlsl ├── SSimDownscalerMeanShader.hlsl ├── SSimDownscalerFinalShader.hlsl ├── SSimSuperResVarLTransform.h ├── SSimSuperResFinalTransform.h ├── MODULE_SSIM.vcxproj.filters ├── EffectDefines.h └── DllMain.cpp ├── MODULE_Common ├── JincScaleEffect.h ├── pch.cpp ├── JincScaleTransform.h ├── LanczosScaleEffect.h ├── PixelScaleEffect.h ├── AdaptiveSharpen.hlsli ├── Jinc2ScaleShader.hlsl ├── PixelScaleShader.hlsl ├── PixelScaleTransform.h ├── AdaptiveSharpenEffect.h ├── Lanczos6ScaleShader.hlsl ├── LanczosScaleTransform.h ├── MitchellNetravaliScaleEffect.h ├── AdaptiveSharpenPass1Shader.hlsl ├── AdaptiveSharpenPass2Shader.hlsl ├── AdaptiveSharpenPass2Transform.h ├── ContrastAdaptiveSharpenEffect.h ├── ContrastAdaptiveSharpenShader.hlsl ├── MitchellNetravaliScaleShader.hlsl ├── MitchellNetravaliScaleTransform.h ├── packages.config ├── pch.h ├── ContrastAdaptiveSharpenTransform.h ├── EffectDefines.h └── MODULE_Common.vcxproj.filters ├── MODULE_FSRCNNX ├── FSRCNNXEffect.h ├── pch.cpp ├── FSRCNNX8041AggregationShader.hlsl ├── packages.config ├── pch.h ├── FSRCNNX8041LineArtSubBandResiduals1Shader.hlsl ├── FSRCNNX8041SubBandResiduals1Shader.hlsl ├── FSRCNNX8041SubBandResiduals2Shader.hlsl ├── FSRCNNX8041LineArtSubBandResiduals2Shader.hlsl ├── DllMain.cpp ├── FSRCNNXAggregationTransform.h ├── FSRCNNX8041FeatureMap2Shader.hlsl ├── FSRCNNX8041FeatureMap1Shader.hlsl ├── FSRCNNX8041LineArtFeatureMap1Shader.hlsl ├── FSRCNNX8041LineArtFeatureMap2Shader.hlsl └── MODULE_FSRCNNX.vcxproj.filters ├── docs ├── 光标映射.md └── 自定义缩放.md ├── BUILD_ALL_MODULES └── BUILD_ALL_MODULES.vcxproj.filters ├── LICENSE ├── .gitattributes └── README.md /Runtime/README.md: -------------------------------------------------------------------------------- 1 | # Runtime 2 | 3 | 负责全屏窗口的显示和渲染。此部分编译为dll供用户界面调用。 4 | -------------------------------------------------------------------------------- /tools/HookTextureResolver/.gitignore: -------------------------------------------------------------------------------- 1 | TEXTURE.txt 2 | out.txt 3 | *.bmp -------------------------------------------------------------------------------- /Runtime/Env.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/Env.h -------------------------------------------------------------------------------- /img/窗口截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/窗口截图.png -------------------------------------------------------------------------------- /img/通用_放大后.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/通用_放大后.png -------------------------------------------------------------------------------- /img/通用_源.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/通用_源.png -------------------------------------------------------------------------------- /img/高DPI设置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/高DPI设置.png -------------------------------------------------------------------------------- /Magpie/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Magpie/logo.ico -------------------------------------------------------------------------------- /Runtime/Debug.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/Debug.h -------------------------------------------------------------------------------- /Runtime/Utils.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/Utils.h -------------------------------------------------------------------------------- /CursorHook/README.md: -------------------------------------------------------------------------------- 1 | # CursorHook 2 | 3 | 用于注入源窗口进程的钩子,以处理光标映射。见[光标映射](../docs/光标映射.md)。 4 | -------------------------------------------------------------------------------- /MODULE_ACNet/ACNet.hlsli: -------------------------------------------------------------------------------- 1 | #include "common.hlsli" 2 | 3 | #define RELU(x) max(x, ZEROS4) 4 | -------------------------------------------------------------------------------- /Magpie/README.md: -------------------------------------------------------------------------------- 1 | # MAGPIE 2 | 3 | 此文件夹为用户界面部分,将缩放配置传递给Runtime,以及负责将CursorHook注入源窗口进程。 4 | -------------------------------------------------------------------------------- /Runtime/GUIDs.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/GUIDs.cpp -------------------------------------------------------------------------------- /Runtime/MagWindow.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/MagWindow.h -------------------------------------------------------------------------------- /img/Anime4K_放大后.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/Anime4K_放大后.png -------------------------------------------------------------------------------- /img/Anime4K_源.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/Anime4K_源.png -------------------------------------------------------------------------------- /img/CursorHook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/img/CursorHook.png -------------------------------------------------------------------------------- /Runtime/D2DContext.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/D2DContext.h -------------------------------------------------------------------------------- /Runtime/Renderable.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/Renderable.h -------------------------------------------------------------------------------- /EffectCommon/CommonPch.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/CommonPch.h -------------------------------------------------------------------------------- /EffectCommon/GUIDs.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/GUIDs.cpp -------------------------------------------------------------------------------- /MODULE_RAVU/resource.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/resource.h -------------------------------------------------------------------------------- /Runtime/CursorManager.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/CursorManager.h -------------------------------------------------------------------------------- /Runtime/FrameCatcher.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/FrameCatcher.h -------------------------------------------------------------------------------- /Runtime/RenderManager.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/RenderManager.h -------------------------------------------------------------------------------- /Runtime/WinRTCapturer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/WinRTCapturer.h -------------------------------------------------------------------------------- /EffectCommon/EffectBase.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/EffectBase.h -------------------------------------------------------------------------------- /EffectCommon/common.hlsli: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/common.hlsli -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetEffect.h -------------------------------------------------------------------------------- /MODULE_RAVU/MODULE_RAVU.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/MODULE_RAVU.rc -------------------------------------------------------------------------------- /Runtime/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 5 | -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4K.hlsli: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4K.hlsli -------------------------------------------------------------------------------- /MODULE_RAVU/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /MODULE_SSIM/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /Runtime/EffectRendererBase.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/EffectRendererBase.h -------------------------------------------------------------------------------- /Runtime/Env.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "Env.h" 3 | 4 | std::unique_ptr Env::$instance = nullptr; 5 | -------------------------------------------------------------------------------- /Runtime/GDIWindowCapturer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/GDIWindowCapturer.h -------------------------------------------------------------------------------- /Runtime/WindowCapturerBase.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/WindowCapturerBase.h -------------------------------------------------------------------------------- /MODULE_ACNet/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KEffect.h -------------------------------------------------------------------------------- /MODULE_Anime4K/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /MODULE_Common/JincScaleEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/JincScaleEffect.h -------------------------------------------------------------------------------- /MODULE_Common/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNXEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_FSRCNNX/FSRCNNXEffect.h -------------------------------------------------------------------------------- /MODULE_FSRCNNX/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: 与预编译标头对应的源文件 2 | 3 | #include "pch.h" 4 | 5 | // 当使用预编译的头时,需要使用此源文件,编译才能成功。 6 | -------------------------------------------------------------------------------- /MODULE_RAVU/RAVUZoomTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RAVUZoomTransform.h -------------------------------------------------------------------------------- /EffectCommon/SimpleDrawTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/SimpleDrawTransform.h -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL10Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL10Shader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL1aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL1aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL1bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL1bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL2aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL2aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL2bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL2bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL3aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL3aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL3bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL3bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL4aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL4aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL4bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL4bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL5aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL5aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL5bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL5bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL6aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL6aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL6bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL6bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL7aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL7aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL7bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL7bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL8aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL8aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL8bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL8bShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL9aShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL9aShader.hlsl -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL9bShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_ACNet/ACNetL9bShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/JincScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/JincScaleTransform.h -------------------------------------------------------------------------------- /MODULE_Common/LanczosScaleEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/LanczosScaleEffect.h -------------------------------------------------------------------------------- /MODULE_Common/PixelScaleEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/PixelScaleEffect.h -------------------------------------------------------------------------------- /MODULE_RAVU/RAVUZoomR3Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RAVUZoomR3Shader.hlsl -------------------------------------------------------------------------------- /MODULE_RAVU/RavuZoomR3Weights.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RavuZoomR3Weights.bmp -------------------------------------------------------------------------------- /Runtime/D2DImageEffectRenderer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/D2DImageEffectRenderer.h -------------------------------------------------------------------------------- /Runtime/WICBitmapEffectRenderer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/WICBitmapEffectRenderer.h -------------------------------------------------------------------------------- /EffectCommon/SimpleScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/EffectCommon/SimpleScaleTransform.h -------------------------------------------------------------------------------- /MODULE_Common/AdaptiveSharpen.hlsli: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/AdaptiveSharpen.hlsli -------------------------------------------------------------------------------- /MODULE_Common/Jinc2ScaleShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/Jinc2ScaleShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/PixelScaleShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/PixelScaleShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/PixelScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/PixelScaleTransform.h -------------------------------------------------------------------------------- /Runtime/MagCallbackWindowCapturer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/MagCallbackWindowCapturer.h -------------------------------------------------------------------------------- /Runtime/MonochromeCursorShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/Runtime/MonochromeCursorShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesEffect.h -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesEffect.h -------------------------------------------------------------------------------- /MODULE_Common/AdaptiveSharpenEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/AdaptiveSharpenEffect.h -------------------------------------------------------------------------------- /MODULE_Common/Lanczos6ScaleShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/Lanczos6ScaleShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/LanczosScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/LanczosScaleTransform.h -------------------------------------------------------------------------------- /MODULE_RAVU/RAVULiteR3Pass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RAVULiteR3Pass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_RAVU/RAVULiteR3Pass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RAVULiteR3Pass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_RAVU/RAVUZoomWeightsTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_RAVU/RAVUZoomWeightsTransform.h -------------------------------------------------------------------------------- /MODULE_SSIM/SSimDownscalerRShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_SSIM/SSimDownscalerRShader.hlsl -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResVarLShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_SSIM/SSimSuperResVarLShader.hlsl -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResFinalShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_SSIM/SSimSuperResFinalShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConvReduceShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConvReduceShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/MitchellNetravaliScaleEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/MitchellNetravaliScaleEffect.h -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResWithScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_SSIM/SSimSuperResWithScaleTransform.h -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseBilateralEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseBilateralEffect.h -------------------------------------------------------------------------------- /MODULE_Common/AdaptiveSharpenPass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/AdaptiveSharpenPass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/AdaptiveSharpenPass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/AdaptiveSharpenPass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/AdaptiveSharpenPass2Transform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/AdaptiveSharpenPass2Transform.h -------------------------------------------------------------------------------- /MODULE_Common/ContrastAdaptiveSharpenEffect.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/ContrastAdaptiveSharpenEffect.h -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x8Pass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x8Pass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x8Pass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x8Pass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x8Pass3Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x8Pass3Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x8Pass4Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x8Pass4Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConv4x3x3x8Pass5Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KConv4x3x3x8Pass5Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesPass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesPass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass3Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesPass3Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass4Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesPass4Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass5Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDarkLinesPass5Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseBilateralShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseBilateralShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KSharpenCombineShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KSharpenCombineShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass3Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass3Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass4Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass4Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass5Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass5Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass6Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass6Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass7Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KThinLinesPass7Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/ContrastAdaptiveSharpenShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/ContrastAdaptiveSharpenShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/MitchellNetravaliScaleShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/MitchellNetravaliScaleShader.hlsl -------------------------------------------------------------------------------- /MODULE_Common/MitchellNetravaliScaleTransform.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Common/MitchellNetravaliScaleTransform.h -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041AggregationShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_FSRCNNX/FSRCNNX8041AggregationShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConvReduceShader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConvReduceShader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass1Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass1Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass2Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass2Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass3Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass3Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass4Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass4Shader.hlsl -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass5Shader.hlsl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewcs0901/Magpie/HEAD/MODULE_Anime4K/Anime4KDenoiseConv4x3x3x8Pass5Shader.hlsl -------------------------------------------------------------------------------- /CursorHook/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /EffectCommon/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MODULE_ACNet/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MODULE_Anime4K/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MODULE_Common/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /MODULE_RAVU/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Runtime/MagCallbackWindowCapturer.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "MagCallbackWindowCapturer.h" 3 | 4 | MagCallbackWindowCapturer* MagCallbackWindowCapturer::_instance = nullptr; 5 | -------------------------------------------------------------------------------- /Runtime/targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // // 包含 SDKDDKVer.h 可定义可用的最高版本的 Windows 平台。 4 | // 如果希望为之前的 Windows 平台构建应用程序,在包含 SDKDDKVer.h 之前请先包含 WinSDKVer.h 并 5 | // 将 _WIN32_WINNT 宏设置为想要支持的平台。 6 | #include 7 | -------------------------------------------------------------------------------- /Runtime/MagWindow.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "MagWindow.h" 3 | 4 | 5 | std::unique_ptr MagWindow::$instance = nullptr; 6 | 7 | UINT MagWindow::_WM_DESTORYMAG = RegisterWindowMessage(L"MAGPIE_WM_DESTORYMAG"); 8 | -------------------------------------------------------------------------------- /MODULE_SSIM/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /EffectCommon/RGB2YUVShader.hlsl: -------------------------------------------------------------------------------- 1 | #define MAGPIE_INPUT_COUNT 1 2 | #define MAGPIE_NO_CHECK 3 | #define MAGPIE_USE_YUV 4 | #include "common.hlsli" 5 | 6 | 7 | D2D_PS_ENTRY(main) { 8 | return float4(RGB2YUV(SampleInputCur(0).rgb), 1); 9 | } 10 | -------------------------------------------------------------------------------- /Runtime/CursorManager.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "CursorManager.h" 3 | 4 | 5 | UINT CursorManager::_WM_NEWCURSOR32 = RegisterWindowMessage(L"MAGPIE_WM_NEWCURSOR32"); 6 | UINT CursorManager::_WM_NEWCURSOR64 = RegisterWindowMessage(L"MAGPIE_WM_NEWCURSOR64"); 7 | -------------------------------------------------------------------------------- /Runtime/cpp.hint: -------------------------------------------------------------------------------- 1 | // 提示文件帮助 Visual Studio IDE 解释 Visual C++ 标识符, 2 | // 如函数和宏的名称。 3 | // 有关详细信息,请参见 https://go.microsoft.com/fwlink/?linkid=865984 4 | #define API_DECLSPEC extern "C" __declspec(dllexport) 5 | #define IFACEMETHODIMP_(type) __override STDMETHODIMP_(type) 6 | -------------------------------------------------------------------------------- /MODULE_Anime4K/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | #include 11 | 12 | 13 | #endif //PCH_H 14 | -------------------------------------------------------------------------------- /MODULE_ACNet/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | 11 | #include 12 | 13 | 14 | #endif //PCH_H 15 | -------------------------------------------------------------------------------- /MODULE_Common/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | 11 | #include 12 | 13 | 14 | #endif //PCH_H 15 | -------------------------------------------------------------------------------- /MODULE_RAVU/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | 11 | #include 12 | 13 | 14 | #endif //PCH_H 15 | -------------------------------------------------------------------------------- /MODULE_SSIM/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | 11 | #include 12 | 13 | 14 | #endif //PCH_H 15 | -------------------------------------------------------------------------------- /Magpie/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | 11 | #include 12 | 13 | 14 | #endif //PCH_H 15 | -------------------------------------------------------------------------------- /EffectCommon/CommonEffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | // {982B95F0-FFA4-4BDB-A933-2B2EE5F74B58} 5 | DEFINE_GUID(GUID_MAGPIE_RGB2YUV_SHADER, 6 | 0x982b95f0, 0xffa4, 0x4bdb, 0xa9, 0x33, 0x2b, 0x2e, 0xe5, 0xf7, 0x4b, 0x58); 7 | 8 | constexpr auto MAGPIE_RGB2YUV_SHADER = L"shaders/RGB2YUVShader.cso"; 9 | -------------------------------------------------------------------------------- /Runtime/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tools/HookTextureResolver/README.md: -------------------------------------------------------------------------------- 1 | # HookTextureResolver 2 | 3 | 用于读取mpv hook中的TEXTURE块。[RAVU](https://github.com/bjin/mpv-prescalers)使用了TEXTURE块,移植到hlsl时必须将其解码。 4 | 5 | 较小的TEXTURE块可以转换为hlsl数组,较大的TEXTURE块则必须导出为纹理图片,将其作为effect的输入。 6 | 7 | 导出为图片时的一个问题是Direct2D不支持读取alpha通道,因此我将导出图片的宽度增加一倍以容纳更多信息。 8 | 9 | png格式的每个颜色通道只有8位,因此导出时会有严重的精度损失。为了缓解这个问题,我进行了一些简单的压缩。实践证明,一定程度的精度损失对RAVU的效果没有肉眼可见的影响。 10 | 11 | -------------------------------------------------------------------------------- /Runtime/EffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | // {A9DF8B5B-B5C5-478F-B5B3-BC5C48E96EF5} 6 | DEFINE_GUID(GUID_MAGPIE_MONOCHROME_CURSOR_SHADER, 7 | 0xa9df8b5b, 0xb5c5, 0x478f, 0xb5, 0xb3, 0xbc, 0x5c, 0x48, 0xe9, 0x6e, 0xf5); 8 | 9 | // {BF2F648B-CE26-4177-ACE1-CC0FB3DA9F52} 10 | DEFINE_GUID(CLSID_MAGPIE_MONOCHROME_CURSOR_EFFECT, 11 | 0xbf2f648b, 0xce26, 0x4177, 0xac, 0xe1, 0xcc, 0xf, 0xb3, 0xda, 0x9f, 0x52); 12 | 13 | 14 | constexpr auto MAGPIE_MONOCHROME_CURSOR_SHADER = L"shaders/MonochromeCursorShader.cso"; 15 | -------------------------------------------------------------------------------- /Runtime/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: 这是预编译标头文件。 2 | // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 3 | // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 4 | // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 5 | // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 6 | 7 | #ifndef PCH_H 8 | #define PCH_H 9 | 10 | #include "framework.h" 11 | #include "Debug.h" 12 | #include "Utils.h" 13 | 14 | 15 | #define XML(X) TEXT(#X) 16 | 17 | #define API_DECLSPEC extern "C" __declspec(dllexport) 18 | 19 | 20 | using namespace std::literals::string_literals; 21 | using namespace Microsoft::WRL; 22 | 23 | #endif //PCH_H 24 | -------------------------------------------------------------------------------- /tools/HookTextureResolver/resolve.py: -------------------------------------------------------------------------------- 1 | # TEXTURE.txt 格式:第一行为纹理的长和高,用空格隔开,第二行为16进制纹理数据 2 | 3 | import struct 4 | import numpy as np 5 | 6 | 7 | def resolve(in_file: str) -> np.ndarray: 8 | with open(in_file) as f: 9 | header = f.readline() 10 | raw_data = f.read() 11 | 12 | (width, _, height) = header[:-1].partition(' ') 13 | width = int(width) 14 | height = int(height) 15 | 16 | weights = struct.unpack("<%df" % (width * height * 4), bytes.fromhex(raw_data)) 17 | weights = np.array(weights, dtype=np.float) 18 | 19 | return weights.reshape((height, width, 4)) 20 | -------------------------------------------------------------------------------- /tools/HookTextureResolver/texture2array.py: -------------------------------------------------------------------------------- 1 | # 将纹理数据导出为 hlsl 数组 2 | # 适合较小的纹理 3 | 4 | from resolve import resolve 5 | 6 | IN_FILE = 'TEXTURE.txt' 7 | OUT_FILE = 'out.txt' 8 | 9 | weights = resolve(IN_FILE).flat 10 | 11 | with open(OUT_FILE, mode='w') as f: 12 | f.write('{\n') 13 | for i in range(0, len(weights) - 4, 4): 14 | f.write('\t{: .6f}, {: .6f}, {: .6f}, {: .6f},\n' 15 | .format(weights[i], weights[i + 1], weights[i + 2], weights[i + 3])) 16 | 17 | i = len(weights) - 4 18 | f.write('\t{: .6f}, {: .6f}, {: .6f}, {: .6f}\n' 19 | .format(weights[i], weights[i + 1], weights[i + 2], weights[i + 3])) 20 | f.write('}\n') 21 | -------------------------------------------------------------------------------- /CursorHook/ServerInterface.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Magpie.CursorHook { 4 | // IPC 服务器接口 5 | public class ServerInterface : MarshalByRefObject { 6 | public void ReportMessages(string[] messages) { 7 | if (messages == null) { 8 | return; 9 | } 10 | 11 | foreach (var msg in messages) { 12 | ReportMessage(msg); 13 | } 14 | } 15 | 16 | public void ReportMessage(string message) { 17 | Console.WriteLine("##CursorHook##: " + message); 18 | } 19 | 20 | 21 | // 客户端调用此函数确定服务器的响应性 22 | public void Ping() { 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /docs/光标映射.md: -------------------------------------------------------------------------------- 1 | # Magpie中的光标映射 2 | 3 | CursorHook的功能是隐藏源窗口中的光标,并在全屏窗口上绘制该光标。下图演示了它的工作原理: 4 | 5 | ![CursorHook工作原理](../img/CursorHook.png) 6 | 7 | 1. Magpie使用[EasyHook](http://easyhook.github.io/)将CursorHook.dll注入源窗口进程,替换源窗口中的[SetCursor](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setcursor) 8 | 2. 源窗口试图使用SetCursor设置自定义光标 9 | 3. 注入程序维护一个源光标到对应透明光标的映射,首先在该映射中查找该光标。如果找到,使用该光标对应的透明光标调用系统的SetCursor,转到第7步;如果未找到,转到第4步 10 | 4. 创建一个热点相同的透明光标,创建新的映射 11 | 5. 使用PostMessage将该映射通知全屏窗口。全屏窗口维护着一个透明光标到源光标的映射,收到消息后创建该映射 12 | 6. 使用第4步创建的透明光标调用系统的SetCursor 13 | 7. 全屏窗口渲染时使用[GetCursorInfo](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getcursorinfo)获取当前光标,此时系统返回注入程序里设置的透明光标 14 | 8. 全屏窗口在映射中查找该透明光标,并在窗口上绘制其对应的源光标 -------------------------------------------------------------------------------- /MODULE_RAVU/RAVUZoomR3WeightsShader.hlsl: -------------------------------------------------------------------------------- 1 | #define MAGPIE_INPUT_COUNT 1 2 | #define MAGPIE_NO_CHECK 3 | #include "common.hlsli" 4 | 5 | #define WEIGHTS_TEXTURE_WIDTH 45 6 | #define WEIGHTS_TEXTURE_HEIGHT 2592 7 | 8 | 9 | 10 | D2D_PS_ENTRY(main) { 11 | float2 pos = (floor(Coord(0).xy / Coord(0).zw) + 0.5) * Coord(0).zw; 12 | 13 | float2 x = SampleInput(0, pos).xy; 14 | float2 y = SampleInput(0, float2(pos.x + WEIGHTS_TEXTURE_WIDTH * Coord(0).z, pos.y)).xy; 15 | float2 z = SampleInput(0, float2(pos.x + 2 * WEIGHTS_TEXTURE_WIDTH * Coord(0).z, pos.y)).xy; 16 | float2 w = SampleInput(0, float2(pos.x + 3 * WEIGHTS_TEXTURE_WIDTH * Coord(0).z, pos.y)).xy; 17 | 18 | float4 r = { 19 | (x.x * 255 * 256 + x.y * 255) / 65535, 20 | (y.x * 255 * 256 + y.y * 255) / 65535, 21 | (z.x * 255 * 256 + z.y * 255) / 65535, 22 | (w.x * 255 * 256 + w.y * 255) / 65535 23 | }; 24 | 25 | return r; 26 | } 27 | 28 | -------------------------------------------------------------------------------- /tools/HookTextureResolver/ravuZoomR3Texture2png.py: -------------------------------------------------------------------------------- 1 | from resolve import resolve 2 | import imageio 3 | import numpy as np 4 | 5 | IN_FILE = 'TEXTURE.txt' 6 | OUT_FILE = 'RavuZoomR3Weights.bmp' 7 | 8 | weights: np.ndarray = resolve(IN_FILE) 9 | 10 | # 将四个分量分别压缩到 [0, 1] 11 | for i in range(4): 12 | minElem = np.amin(weights[:, :, i]) 13 | maxElem = np.amax(weights[:, :, i]) 14 | print(minElem, maxElem, sep=', ') 15 | 16 | weights[:, :, i] = (weights[:, :, i] - minElem) / (maxElem - minElem) 17 | 18 | weights = np.round(weights * 65535).astype(np.int) 19 | 20 | out = np.zeros((weights.shape[0], weights.shape[1] * 4, 3), dtype=np.uint8) 21 | 22 | for i in range(4): 23 | out[:, weights.shape[1] * i: weights.shape[1] * (i + 1), 0] = weights[:, :, i] / 256 24 | out[:, weights.shape[1] * i: weights.shape[1] * (i + 1), 1] = weights[:, :, i] % 256 25 | 26 | imageio.imwrite(OUT_FILE, out) 27 | -------------------------------------------------------------------------------- /BUILD_ALL_MODULES/BUILD_ALL_MODULES.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | -------------------------------------------------------------------------------- /Magpie/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Alt+F11 7 | 8 | 9 | 0 10 | 11 | 12 | False 13 | 14 | 15 | 0 16 | 17 | 18 | 0 19 | 20 | 21 | -------------------------------------------------------------------------------- /EffectCommon/CommonDebug.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | 6 | 7 | class CommonDebug { 8 | public: 9 | CommonDebug() = delete; 10 | CommonDebug(const CommonDebug&) = delete; 11 | CommonDebug(CommonDebug&&) = delete; 12 | 13 | 14 | static void WriteLine(const std::wstring_view& msg) { 15 | #ifdef _DEBUG 16 | OutputDebugString(L"##DEBUG##: "); 17 | OutputDebugString(msg.data()); 18 | OutputDebugString(L"\n"); 19 | #endif // _DEBUG 20 | } 21 | 22 | template 23 | static void WriteLine(T msg) { 24 | WriteLine(std::to_wstring(msg)); 25 | } 26 | 27 | static void WriteLine(const std::wstring& msg) { 28 | WriteLine(std::wstring_view(msg)); 29 | } 30 | 31 | static void WriteLine(const wchar_t* msg) { 32 | WriteLine(std::wstring_view(msg)); 33 | } 34 | 35 | static void WriteErrorMessage(const std::wstring_view& msg) { 36 | WriteLine(msg); 37 | } 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /Magpie/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using System.Windows.Forms; 7 | 8 | namespace Magpie { 9 | static class Program { 10 | static readonly Mutex mutex = new Mutex(true, "{4C416227-4A30-4A2F-8F23-8701544DD7D6}"); 11 | 12 | /// 13 | /// 应用程序的主入口点。 14 | /// 15 | [STAThread] 16 | static void Main() { 17 | // 不允许多个实例同时运行 18 | if (mutex.WaitOne(TimeSpan.Zero, true)) { 19 | Application.EnableVisualStyles(); 20 | Application.SetCompatibleTextRenderingDefault(false); 21 | Application.Run(new MainForm()); 22 | mutex.ReleaseMutex(); 23 | } else { 24 | // 已存在实例时广播 WM_SHOWME,唤醒该实例 25 | _ = NativeMethods.BroadcastMessage(NativeMethods.MAGPIE_WM_SHOWME); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Magpie/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Resources; 2 | using System.Reflection; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | 6 | // 有关程序集的一般信息由以下 7 | // 控制。更改这些特性值可修改 8 | // 与程序集关联的信息。 9 | [assembly: AssemblyTitle("Magpie")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("Magpie")] 14 | [assembly: AssemblyCopyright("Copyright © 2021 Blinue")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | 18 | // 将 ComVisible 设置为 false 会使此程序集中的类型 19 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 20 | //请将此类型的 ComVisible 特性设置为 true。 21 | [assembly: ComVisible(false)] 22 | 23 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 24 | [assembly: Guid("c75ec8d6-ff40-4307-9b46-ea760dc5e4c9")] 25 | 26 | // 程序集的版本信息由下列四个值组成: 27 | // 28 | // 主版本 29 | // 次版本 30 | // 生成号 31 | // 修订号 32 | // 33 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 34 | //通过使用 "*",如下所示: 35 | // [assembly: AssemblyVersion("1.0.*")] 36 | [assembly: NeutralResourcesLanguage("zh-CN")] 37 | -------------------------------------------------------------------------------- /CursorHook/SafeCursorHandle.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Win32.SafeHandles; 3 | 4 | 5 | namespace Magpie.CursorHook { 6 | // HCURSOR 的安全包装 7 | class SafeCursorHandle : SafeHandleZeroOrMinusOneIsInvalid { 8 | public SafeCursorHandle() : base(true) { 9 | } 10 | 11 | public SafeCursorHandle(IntPtr handle, bool ownsHandle = true) : base(ownsHandle) { 12 | SetHandle(handle); 13 | } 14 | 15 | protected override bool ReleaseHandle() { 16 | return NativeMethods.DestroyCursor(handle); 17 | } 18 | 19 | public override bool Equals(object obj) { 20 | if (obj == null || GetType() != obj.GetType()) { 21 | return false; 22 | } 23 | 24 | SafeCursorHandle other = (SafeCursorHandle)obj; 25 | return handle == other.handle; 26 | } 27 | 28 | public override int GetHashCode() { 29 | return handle.ToInt32(); 30 | } 31 | 32 | public static readonly SafeCursorHandle Zero = new SafeCursorHandle(IntPtr.Zero, false); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /CursorHook/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("CursorHook")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CursorHook")] 13 | [assembly: AssemblyCopyright("Copyright © 2021 Blinue")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("983647dc-e3c2-4658-852b-ff4d146f8134")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 33 | //通过使用 "*",如下所示: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.2.0.0")] 36 | [assembly: AssemblyFileVersion("0.2.0.0")] 37 | -------------------------------------------------------------------------------- /MODULE_ACNet/DllMain.cpp: -------------------------------------------------------------------------------- 1 | // dllmain.cpp : 定义 DLL 应用程序的入口点。 2 | #include "pch.h" 3 | #include 4 | #include "ACNetEffect.h" 5 | #include 6 | 7 | 8 | API_DECLSPEC HRESULT CreateEffect( 9 | ID2D1Factory1* d2dFactory, 10 | ID2D1DeviceContext* d2dDC, 11 | IWICImagingFactory2* wicImgFactory, 12 | const nlohmann::json& props, 13 | float fillScale, 14 | std::pair& scale, 15 | ComPtr& effect 16 | ) { 17 | bool isRegistered; 18 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_ACNET_EFFECT, isRegistered); 19 | if (FAILED(hr)) { 20 | return hr; 21 | } 22 | 23 | if (!isRegistered) { 24 | hr = ACNetEffect::Register(d2dFactory); 25 | if (FAILED(hr)) { 26 | return hr; 27 | } 28 | } 29 | 30 | ComPtr result; 31 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_ACNET_EFFECT, &result); 32 | if (FAILED(hr)) { 33 | return hr; 34 | } 35 | 36 | effect = std::move(result); 37 | scale.first *= 2; 38 | scale.second *= 2; 39 | return S_OK; 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Blinue 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimDownscalerL2Pass2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // SSimDownscaler calc L2 pass 2 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | }; 6 | 7 | 8 | #define MAGPIE_INPUT_COUNT 1 // L1 9 | #include "common.hlsli" 10 | 11 | 12 | 13 | #define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) 14 | #define Kernel(x) MN(1.0/3.0, 1.0/3.0, abs(x)) 15 | #define taps 2.0 16 | 17 | 18 | 19 | D2D_PS_ENTRY(main) { 20 | InitMagpieSampleInput(); 21 | 22 | float2 cur = Coord(0).xy / Coord(0).zw; 23 | // Calculate bounds 24 | float low = ceil(cur.x - taps - 0.5); 25 | float high = floor(cur.x + taps - 0.5); 26 | 27 | float W = 0.0; 28 | float3 avg = 0; 29 | float2 pos = cur; 30 | 31 | for (float k = low; k <= high; k++) { 32 | pos.x = k + 0.5; 33 | float w = Kernel(pos.x - cur.x); 34 | avg += w * uncompressLinear(SampleInputLod(0, GetCheckedPos(0, pos * Coord(0).zw)).xyz, -0.5, 1.5); 35 | W += w; 36 | } 37 | 38 | avg /= W; 39 | return float4(compressLinear(avg, -0.5, 1.5), 1); 40 | } 41 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimDownscalerL2Pass1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // SSimDownscaler calc L2 pass 1 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | int2 destSize : packoffset(c0.z); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 1 // PREKERNEL 10 | #include "common.hlsli" 11 | 12 | 13 | #define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) 14 | #define Kernel(x) MN(1.0/3.0, 1.0/3.0, abs(x)) 15 | #define taps 2.0 16 | 17 | 18 | D2D_PS_ENTRY(main) { 19 | float2 scale = float2(destSize) / srcSize; 20 | InitMagpieSampleInputWithScale(scale); 21 | 22 | float2 cur = Coord(0).xy / Coord(0).zw; 23 | 24 | // Calculate bounds 25 | float low = ceil(cur.y - taps - 0.5); 26 | float high = floor(cur.y + taps - 0.5); 27 | 28 | float W = 0; 29 | float3 avg = 0; 30 | float2 pos = cur; 31 | 32 | for (float k = low; k <= high; k++) { 33 | pos.y = k + 0.5; 34 | float w = Kernel((pos.y - cur.y) * scale.y); 35 | 36 | float3 t = SampleInputLod(0, GetCheckedPos(0, pos * Coord(0).zw)).xyz; 37 | avg += w * t * t; 38 | W += w; 39 | } 40 | avg /= W; 41 | 42 | return float4(compressLinear(avg, -0.5, 1.5), 1); 43 | } 44 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResVarHShader.hlsl: -------------------------------------------------------------------------------- 1 | // SSSR varH 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | float2 scale : packoffset(c0.z); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 2 10 | #include "common.hlsli" 11 | 12 | 13 | 14 | #define spread 1.0 / 1000.0 15 | 16 | #define sqr(x) pow(x, 2.0) 17 | #define GetH(x,y) SampleInputOffChecked(0, float2(x, y) / scale).rgb 18 | 19 | #define Luma(rgb) ( dot(rgb*rgb, float3(0.2126, 0.7152, 0.0722)) ) 20 | 21 | 22 | 23 | D2D_PS_ENTRY(main) { 24 | InitMagpieSampleInput(); 25 | 26 | int X, Y; 27 | float3 meanH = 0; 28 | for (X = -1; X <= 1; X++) { 29 | for (Y = -1; Y <= 1; Y++) { 30 | meanH += GetH(X, Y) * pow(spread, sqr(float(X)) + sqr(float(Y))); 31 | } 32 | } 33 | meanH /= (1.0 + 4.0 * spread + 4.0 * spread * spread); 34 | 35 | float varH = 0.0; 36 | for (X = -1; X <= 1; X++) { 37 | for (Y = -1; Y <= 1; Y++) { 38 | varH += Luma(abs(GetH(X, Y) - meanH)) * pow(spread, sqr(float(X)) + sqr(float(Y))); 39 | } 40 | } 41 | varH /= (spread + 4.0 * spread + 4.0 * spread * spread); 42 | 43 | varH *= 8; 44 | float x = floor(varH * 10) / 10; 45 | float y = ((varH - x) * 100) / 10; 46 | return float4(x, y, 0, 1); 47 | } 48 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041LineArtSubBandResiduals1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1_LA) sub-band residuals 1 2 | 3 | 4 | #define MAGPIE_INPUT_COUNT 3 5 | #define MAGPIE_NO_CHECK 6 | #include "common.hlsli" 7 | 8 | 9 | D2D_PS_ENTRY(main) { 10 | InitMagpieSampleInput(); 11 | 12 | float4 res = { 0.0313877351582050,-0.0325053185224533,-0.0413495972752571,0.0357267409563065 }; 13 | res += mul(uncompressTan(SampleInputCur(0)), float4x4(0.1461677402257919, -0.1208343803882599, 0.0125428512692451, -0.1319324076175690, -0.3387282788753510, -0.3393035829067230, -0.2043240815401077, 0.0048940703272820, -0.0343158058822155, 0.0995195582509041, -0.0571033284068108, -0.0356303341686726, 0.1097832918167114, 0.1462953090667725, 0.0575199872255325, -0.1682354062795639)); 14 | res += mul(uncompressTan(SampleInputCur(1)), float4x4(0.1110563054680824, 0.0068465564399958, -0.0098551185801625, -0.1380221396684647, -0.3268660008907318, -0.2625139057636261, 0.5479852557182312, -0.0188483651727438, -0.7557058334350586, -0.6716431379318237, 0.0680231377482414, 1.0786534547805786, -0.0519768036901951, -0.0483648441731930, 0.1052823588252068, 0.0570317767560482)); 15 | res += uncompressLinear(SampleInputCur(2), -1, 1.5); 16 | res = max(res, ZEROS4) + float4(0.9962985515594482, 0.9851159453392029, 0.2272046357393265, -0.1116774082183838) * min(res, ZEROS4); 17 | 18 | return compressTan(res); 19 | } 20 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041SubBandResiduals1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1) sub-band residuals 1 2 | 3 | 4 | #define MAGPIE_INPUT_COUNT 3 5 | #define MAGPIE_NO_CHECK 6 | #include "common.hlsli" 7 | 8 | 9 | D2D_PS_ENTRY(main) { 10 | InitMagpieSampleInput(); 11 | 12 | float4 res = { 0.0245648548007011,-0.4467784762382507,0.0197526942938566,-0.0110000418499112 }; 13 | res += mul(uncompressTan(SampleInputCur(0)), float4x4(0.0302665308117867, -0.9262221455574036, -0.1161134764552116, -0.0506900474429131, 0.2716045379638672, -0.0485871583223343, 0.0044713355600834, -0.4274623394012451, 0.0749531090259552, -0.3700785338878632, 0.0350039415061474, -0.0540786534547806, -0.0607390031218529, -0.8019900321960449, 0.0923245251178741, 0.1258827745914459)); 14 | res += mul(uncompressTan(SampleInputCur(1)), float4x4(-0.0649135261774063, 0.0815236791968346, 0.0067334296181798, 0.1277425885200500, -0.0051357815973461, -0.1485908329486847, 0.0074226572178304, 0.0050623500719666, 0.0588018335402012, -0.0692552924156189, 0.1288725286722183, -0.0989386290311813, 0.0427936837077141, 0.0967708528041840, -0.0455632135272026, -0.0711275041103363)); 15 | res += uncompressLinear(SampleInputCur(2), -1, 1.5); 16 | res = max(res, ZEROS4) + float4(0.9927186965942383, 0.0570580027997494, 1.3226752281188965, 1.0069466829299927) * min(res, ZEROS4); 17 | 18 | return compressLinear(res, -1.5, 2); 19 | } 20 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041SubBandResiduals2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1) sub-band residuals 2 2 | 3 | 4 | #define MAGPIE_INPUT_COUNT 3 5 | #define MAGPIE_NO_CHECK 6 | #include "common.hlsli" 7 | 8 | 9 | D2D_PS_ENTRY(main) { 10 | InitMagpieSampleInput(); 11 | 12 | float4 res = { -0.0425243787467480,-0.3715015351772308,-0.0256227850914001,-0.2774516046047211 }; 13 | res += mul(uncompressTan(SampleInputCur(0)), float4x4(0.0238118842244148, 0.0295480657368898, -0.0066418983042240, 0.1021223962306976, -0.0568209178745747, -0.4355100393295288, -0.2700522541999817, -0.2060186564922333, -0.0689613372087479, -0.1689691990613937, -0.0306748505681753, -0.2461252212524414, -0.0057375836186111, -0.1892303228378296, -0.0285871494561434, -0.5032613277435303)); 14 | res += mul(uncompressTan(SampleInputCur(1)), float4x4(0.5463213324546814, 0.0972800329327583, 0.0307560767978430, 0.0678058937191963, -0.0356063023209572, -0.7013865113258362, 0.1890443563461304, -0.1036657467484474, -0.1745826154947281, -0.2942218780517578, -0.0485423319041729, -0.2983124554157257, -0.0524431839585304, -0.3261034786701202, 0.3217246532440186, 0.1958018541336060)); 15 | res += uncompressLinear(SampleInputCur(2), -2, 2); 16 | res = max(res, ZEROS4) + float4(0.1391339898109436, 0.0960328355431557, 0.6235341429710388, 0.1177272796630859) * min(res, ZEROS4); 17 | 18 | return compressLinear(res, -1, 4); 19 | } 20 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041LineArtSubBandResiduals2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1_LA) sub-band residuals 2 2 | 3 | 4 | #define MAGPIE_INPUT_COUNT 3 5 | #define MAGPIE_NO_CHECK 6 | #include "common.hlsli" 7 | 8 | 9 | D2D_PS_ENTRY(main) { 10 | InitMagpieSampleInput(); 11 | 12 | float4 res = { -0.0820835754275322,-0.0049459170550108,-0.1635029017925262,0.0367167443037033 }; 13 | res += mul(uncompressTan(SampleInputCur(0)), float4x4(-0.1730685681104660, -0.1758024245500565, -0.0673282966017723, -0.7883995175361633, -0.0092403469607234, 0.1237237676978111, -0.0802010595798492, 0.1532886922359467, -0.0256615914404392, 0.0783618539571762, -0.0216845069080591, 0.4360575079917908, 0.2488089799880981, -0.0421040952205658, 0.4070311486721039, 0.1112201139330864)); 14 | res += mul(uncompressTan(SampleInputCur(1)), float4x4(-0.1360913068056107, -0.0307455379515886, -0.1545475125312805, -0.0465389303863049, -0.1308580189943314, 0.2625028789043427, -0.2567890584468842, 0.3363034725189209, 0.1148972064256668, 0.3114618360996246, -0.1600875705480576, 0.6157666444778442, 0.0422471873462200, 0.0509155690670013, -1.1255714893341064, 0.0219085998833179)); 15 | res += uncompressLinear(SampleInputCur(2), -1, 1); 16 | res = max(res, ZEROS4) + float4(-0.3776825070381165, 1.2568452358245850, 0.3147132694721222, 1.0953333377838135) * min(res, ZEROS4); 17 | 18 | return compressLinear(res, -4, 4); 19 | } 20 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResDownscaling1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // SSSR Downscaling I 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | float2 scale : packoffset(c0.z); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 2 // POSTKERNEL 10 | #include "common.hlsli" 11 | 12 | 13 | #define axis 1 14 | 15 | #define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) 16 | #define Kernel(x) MN(0.334, 0.333, abs(x)) 17 | #define taps 2.0f 18 | 19 | #define Luma(rgb) ( dot(rgb*rgb, float3(0.2126, 0.7152, 0.0722)) ) 20 | 21 | 22 | D2D_PS_ENTRY(main) { 23 | InitMagpieSampleInput(); 24 | 25 | float2 cur = Coord(0).xy / Coord(0).zw; 26 | 27 | // Calculate bounds 28 | float low = ceil(cur.y - taps * scale.y - 0.5f); 29 | float high = floor(cur.y + taps * scale.y - 0.5f); 30 | 31 | float W = 0.0; 32 | float4 avg = 0; 33 | float2 pos = cur; 34 | float4 tex; 35 | 36 | for (float k = low; k <= high; k++) { 37 | pos.y = k + 0.5; 38 | float w = Kernel((pos.y - cur.y) / scale.y); 39 | 40 | tex.rgb = SampleInputLod(0, GetCheckedPos(0, pos * Coord(0).zw)).rgb; 41 | tex.a = Luma(tex.rgb); 42 | avg += w * tex; 43 | W += w; 44 | } 45 | avg /= W; 46 | 47 | return float4(avg.rgb, abs(avg.a - Luma(avg.rgb)) * 20); 48 | } 49 | -------------------------------------------------------------------------------- /CursorHook/InjectionEntryPoint.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * 用于注入源窗口进程的钩子,支持运行时注入和启动时注入两种模式 3 | * 原理见 光标映射.md 4 | */ 5 | 6 | using System; 7 | using System.Collections.Generic; 8 | using System.Linq; 9 | using System.Runtime.InteropServices; 10 | using System.Threading; 11 | 12 | 13 | namespace Magpie.CursorHook { 14 | /// 15 | /// 注入时 EasyHook 会寻找 的实现。 16 | /// 注入后此类将成为入口 17 | /// 18 | public class InjectionEntryPoint : EasyHook.IEntryPoint { 19 | private readonly CursorHookBase cursorHook = null; 20 | 21 | // 运行时注入的入口 22 | public InjectionEntryPoint( 23 | EasyHook.RemoteHooking.IContext _, 24 | string channelName, 25 | IntPtr hwndSrc 26 | ) { 27 | cursorHook = new RuntimeCursorHook(hwndSrc, new IpcServer(channelName)); 28 | } 29 | 30 | // 启动时注入的入口 31 | public InjectionEntryPoint(EasyHook.RemoteHooking.IContext _, string channelName) { 32 | cursorHook = new StartUpCursorHook(new IpcServer(channelName)); 33 | } 34 | 35 | // 运行时注入逻辑的入口 36 | public void Run(EasyHook.RemoteHooking.IContext _1, string _2, IntPtr _3) { 37 | cursorHook.Run(); 38 | } 39 | 40 | // 启动时注入逻辑的入口 41 | public void Run(EasyHook.RemoteHooking.IContext _1, string _2) { 42 | cursorHook.Run(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResDownscaling2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // SSSR Downscaling II 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | float2 scale : packoffset(c0.z); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 2 10 | #include "common.hlsli" 11 | 12 | 13 | #define axis 0 14 | 15 | #define MN(B,C,x) (x < 1.0 ? ((2.-1.5*B-(C))*x + (-3.+2.*B+C))*x*x + (1.-(B)/3.) : (((-(B)/6.-(C))*x + (B+5.*C))*x + (-2.*B-8.*C))*x+((4./3.)*B+4.*C)) 16 | #define Kernel(x) MN(0.334, 0.333, abs(x)) 17 | #define taps 2.0 18 | 19 | #define Luma(rgb) ( dot(rgb*rgb, float3(0.2126, 0.7152, 0.0722)) ) 20 | 21 | 22 | D2D_PS_ENTRY(main) { 23 | InitMagpieSampleInput(); 24 | 25 | float2 cur = Coord(0).xy / Coord(0).zw; 26 | 27 | // Calculate bounds 28 | float low = ceil(cur.x - taps * scale.x - 0.5); 29 | float high = floor(cur.x + taps * scale.x - 0.5); 30 | 31 | float W = 0.0; 32 | float4 avg = 0; 33 | float2 pos = cur; 34 | float4 tex; 35 | 36 | for (float k = low; k <= high; k++) { 37 | pos.x = k + 0.5; 38 | float w = Kernel((pos.x - cur.x) / scale.x); 39 | 40 | tex.rgb = SampleInputLod(0, GetCheckedPos(0, pos * Coord(0).zw)).rgb; 41 | tex.a = Luma(tex.rgb); 42 | avg += w * tex; 43 | W += w; 44 | } 45 | avg /= W; 46 | 47 | float a = abs(avg.a - Luma(avg.rgb)) + SampleInputCur(0).a / 20; 48 | return float4(avg.rgb, a * 20); 49 | } 50 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include 3 | #include 4 | #include "FSRCNNXEffect.h" 5 | 6 | 7 | API_DECLSPEC HRESULT CreateEffect( 8 | ID2D1Factory1* d2dFactory, 9 | ID2D1DeviceContext* d2dDC, 10 | IWICImagingFactory2* wicImgFactory, 11 | const nlohmann::json& props, 12 | float fillScale, 13 | std::pair& scale, 14 | ComPtr& effect 15 | ) { 16 | const auto& e = props.value("effect", ""); 17 | if (e != "FSRCNNX" && e != "FSRCNNXLineArt") { 18 | return E_INVALIDARG; 19 | } 20 | 21 | bool isRegistered; 22 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_FSRCNNX_EFFECT, isRegistered); 23 | if (FAILED(hr)) { 24 | return hr; 25 | } 26 | 27 | if (!isRegistered) { 28 | hr = FSRCNNXEffect::Register(d2dFactory); 29 | if (FAILED(hr)) { 30 | return hr; 31 | } 32 | } 33 | 34 | ComPtr result; 35 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_FSRCNNX_EFFECT, &result); 36 | if (FAILED(hr)) { 37 | return hr; 38 | } 39 | 40 | if (e == "FSRCNNXLineArt") { 41 | hr = result->SetValue(FSRCNNXEffect::PROP_USE_LINE_ART_VERSION, TRUE); 42 | if (FAILED(hr)) { 43 | return hr; 44 | } 45 | } 46 | 47 | effect = std::move(result); 48 | scale.first *= 2; 49 | scale.second *= 2; 50 | return S_OK; 51 | } 52 | 53 | -------------------------------------------------------------------------------- /Runtime/framework.h: -------------------------------------------------------------------------------- 1 | // header.h: 标准系统包含文件的包含文件, 2 | // 或特定于项目的包含文件 3 | // 4 | 5 | #pragma once 6 | 7 | #include "targetver.h" 8 | #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 9 | #define OEMRESOURCE // 需要设置系统光标 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setsystemcursor 10 | #define NOMINMAX // 使用标准库的min和max而不是宏 11 | 12 | // Windows 头文件 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | 24 | // C++ 运行时头文件 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | 36 | // C++/WinRT 头文件 37 | #include 38 | #include 39 | #include 40 | #include 41 | 42 | // boost 43 | #include 44 | 45 | 46 | #pragma comment(lib, "d2d1.lib") 47 | #pragma comment(lib, "dwrite.lib") 48 | #pragma comment(lib, "Magnification.lib") 49 | #pragma comment(lib, "d3d11.lib") 50 | #pragma comment(lib, "dxguid.lib") 51 | #pragma comment(lib, "shlwapi.lib") 52 | #pragma comment(lib, "windowsapp") 53 | #pragma comment(lib, "dwmapi.lib") 54 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimDownscalerMeanShader.hlsl: -------------------------------------------------------------------------------- 1 | // SSimDownscaler calc Mean 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | }; 6 | 7 | 8 | #define MAGPIE_INPUT_COUNT 1 // POSTKERNEL 9 | #include "common.hlsli" 10 | 11 | 12 | #define locality 8.0 13 | 14 | #define Kernel(x) pow(1.0 / locality, abs(x)) 15 | #define taps 3.0 16 | #define maxtaps taps 17 | 18 | 19 | 20 | float3 ScaleH(float2 pos, float curX) { 21 | // Calculate bounds 22 | float low = floor(-0.5 * maxtaps); 23 | float high = floor(0.5 * maxtaps); 24 | 25 | float W = 0; 26 | float3 avg = 0; 27 | 28 | for (float k = 0.0; k < maxtaps; k++) { 29 | float rel = k + low + 1.0; 30 | pos.x = curX + rel; 31 | float w = Kernel(rel); 32 | 33 | avg += w * SampleInputChecked(0, pos * Coord(0).zw).rgb; 34 | W += w; 35 | } 36 | avg /= W; 37 | 38 | return avg; 39 | } 40 | 41 | D2D_PS_ENTRY(main) { 42 | InitMagpieSampleInput(); 43 | float2 cur = Coord(0).xy / Coord(0).zw; 44 | 45 | // Calculate bounds 46 | float low = floor(-0.5 * maxtaps); 47 | float high = floor(0.5 * maxtaps); 48 | 49 | float W = 0; 50 | float3 avg = 0; 51 | float2 pos = cur; 52 | 53 | for (float k = 0.0; k < maxtaps; k++) { 54 | float rel = k + low + 1.0; 55 | pos.y = cur.y + rel; 56 | float w = Kernel(rel); 57 | 58 | avg += w * ScaleH(pos, cur.x); 59 | W += w; 60 | } 61 | avg /= W; 62 | return float4(avg, 1); 63 | } 64 | -------------------------------------------------------------------------------- /MODULE_RAVU/EffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | 5 | 6 | // {F606A124-CF11-4533-9C7E-62A0B89F0282} 7 | DEFINE_GUID(GUID_MAGPIE_RAVU_LITE_R3_PASS1_SHADER, 8 | 0xf606a124, 0xcf11, 0x4533, 0x9c, 0x7e, 0x62, 0xa0, 0xb8, 0x9f, 0x2, 0x82); 9 | 10 | // {F270D6BC-DDA8-458D-8CAC-1B472DD2F7D2} 11 | DEFINE_GUID(GUID_MAGPIE_RAVU_LITE_R3_PASS2_SHADER, 12 | 0xf270d6bc, 0xdda8, 0x458d, 0x8c, 0xac, 0x1b, 0x47, 0x2d, 0xd2, 0xf7, 0xd2); 13 | 14 | // {F39FDAAA-B830-4692-A80F-5929B25C3C6F} 15 | DEFINE_GUID(GUID_MAGPIE_RAVU_ZOOM_R3_SHADER, 16 | 0xf39fdaaa, 0xb830, 0x4692, 0xa8, 0xf, 0x59, 0x29, 0xb2, 0x5c, 0x3c, 0x6f); 17 | 18 | // {07431047-1DCC-4EBC-84D5-6734D52DD774} 19 | DEFINE_GUID(GUID_MAGPIE_RAVU_ZOOM_R3_WEIGHTS_SHADER, 20 | 0x7431047, 0x1dcc, 0x4ebc, 0x84, 0xd5, 0x67, 0x34, 0xd5, 0x2d, 0xd7, 0x74); 21 | 22 | 23 | // {59F45D37-88F0-454A-B32E-116E5889CD86} 24 | DEFINE_GUID(CLSID_MAGPIE_RAVU_LITE_EFFECT, 25 | 0x59f45d37, 0x88f0, 0x454a, 0xb3, 0x2e, 0x11, 0x6e, 0x58, 0x89, 0xcd, 0x86); 26 | 27 | // {10FEB1FE-2AC5-4C8D-BF88-F6031FBB311D} 28 | DEFINE_GUID(CLSID_MAGPIE_RAVU_ZOOM_EFFECT, 29 | 0x10feb1fe, 0x2ac5, 0x4c8d, 0xbf, 0x88, 0xf6, 0x3, 0x1f, 0xbb, 0x31, 0x1d); 30 | 31 | 32 | constexpr auto MAGPIE_RAVU_LITE_R3_PASS1_SHADER = L"shaders/RavuLiteR3Pass1Shader.cso"; 33 | constexpr auto MAGPIE_RAVU_LITE_R3_PASS2_SHADER = L"shaders/RavuLiteR3Pass2Shader.cso"; 34 | constexpr auto MAGPIE_RAVU_ZOOM_R3_SHADER = L"shaders/RavuZoomR3Shader.cso"; 35 | constexpr auto MAGPIE_RAVU_ZOOM_R3_WEIGHTS_SHADER = L"shaders/RavuZoomR3WeightsShader.cso"; 36 | -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KThinLinesPass7Transform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class Anime4KThinLinesPass7Transform : public SimpleDrawTransform<2> { 8 | private: 9 | Anime4KThinLinesPass7Transform() : SimpleDrawTransform<2>(GUID_MAGPIE_ANIME4K_THINLINES_PASS7_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create( 13 | _In_ ID2D1EffectContext* d2dEC, 14 | _Outptr_ Anime4KThinLinesPass7Transform** ppOutput 15 | ) { 16 | *ppOutput = nullptr; 17 | 18 | HRESULT hr = LoadShader( 19 | d2dEC, 20 | MAGPIE_ANIME4K_THINLINES_PASS7_SHADER, 21 | GUID_MAGPIE_ANIME4K_THINLINES_PASS7_SHADER 22 | ); 23 | if (FAILED(hr)) { 24 | return hr; 25 | } 26 | 27 | *ppOutput = new Anime4KThinLinesPass7Transform(); 28 | 29 | return S_OK; 30 | } 31 | 32 | void SetStrength(float value) { 33 | assert(value > 0); 34 | _strength = value; 35 | } 36 | 37 | float GetStrength() { 38 | return _strength; 39 | } 40 | 41 | protected: 42 | void _SetShaderContantBuffer(const SIZE& srcSize) override { 43 | struct { 44 | INT32 srcWidth; 45 | INT32 srcHeight; 46 | FLOAT strength; 47 | } shaderConstants{ 48 | srcSize.cx, 49 | srcSize.cy, 50 | _strength 51 | }; 52 | 53 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 54 | } 55 | 56 | private: 57 | float _strength = 0.3f; 58 | }; -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDarkLinesPass5Transform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class Anime4KDarkLinesPass5Transform : public SimpleDrawTransform<2> { 8 | private: 9 | Anime4KDarkLinesPass5Transform() : SimpleDrawTransform<2>(GUID_MAGPIE_ANIME4K_DARKLINES_PASS5_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create( 13 | _In_ ID2D1EffectContext* d2dEC, 14 | _Outptr_ Anime4KDarkLinesPass5Transform** ppOutput 15 | ) { 16 | *ppOutput = nullptr; 17 | 18 | HRESULT hr = LoadShader( 19 | d2dEC, 20 | MAGPIE_ANIME4K_DARKLINES_PASS5_SHADER, 21 | GUID_MAGPIE_ANIME4K_DARKLINES_PASS5_SHADER 22 | ); 23 | if (FAILED(hr)) { 24 | return hr; 25 | } 26 | 27 | *ppOutput = new Anime4KDarkLinesPass5Transform(); 28 | 29 | return S_OK; 30 | } 31 | 32 | void SetStrength(float value) { 33 | assert(value > 0); 34 | _strength = value; 35 | } 36 | 37 | float GetStrength() { 38 | return _strength; 39 | } 40 | 41 | protected: 42 | void _SetShaderContantBuffer(const SIZE& srcSize) override { 43 | struct { 44 | INT32 srcWidth; 45 | INT32 srcHeight; 46 | FLOAT strength; 47 | } shaderConstants{ 48 | srcSize.cx, 49 | srcSize.cy, 50 | _strength 51 | }; 52 | 53 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 54 | } 55 | 56 | private: 57 | float _strength = 1.0f; 58 | }; -------------------------------------------------------------------------------- /MODULE_Common/ContrastAdaptiveSharpenTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | 8 | class ContrastAdaptiveSharpenTransform : public SimpleDrawTransform<1> { 9 | private: 10 | ContrastAdaptiveSharpenTransform() : SimpleDrawTransform<1>(GUID_MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_SHADER) {} 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ ContrastAdaptiveSharpenTransform** ppOutput) { 13 | *ppOutput = nullptr; 14 | 15 | HRESULT hr = LoadShader( 16 | d2dEC, 17 | MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_SHADER, 18 | GUID_MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_SHADER 19 | ); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | *ppOutput = new ContrastAdaptiveSharpenTransform(); 25 | 26 | return S_OK; 27 | } 28 | 29 | void SetSharpness(float value) { 30 | assert(value >= 0 && value <= 1); 31 | _sharpness = value; 32 | } 33 | 34 | float GetSharpness() { 35 | return _sharpness; 36 | } 37 | protected: 38 | void _SetShaderContantBuffer(const SIZE& srcSize) override { 39 | struct { 40 | INT32 srcWidth; 41 | INT32 srcHeight; 42 | FLOAT sharpness; 43 | } shaderConstants{ 44 | srcSize.cx, 45 | srcSize.cy, 46 | _sharpness 47 | }; 48 | 49 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 50 | } 51 | 52 | private: 53 | float _sharpness = 0.4f; 54 | }; 55 | -------------------------------------------------------------------------------- /Magpie/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Alt+F11 18 | 19 | 20 | 0 21 | 22 | 23 | False 24 | 25 | 26 | 0 27 | 28 | 29 | 0 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /MODULE_RAVU/RAVULitePass2Transform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class RAVULitePass2Transform : public SimpleDrawTransform<2> { 8 | private: 9 | RAVULitePass2Transform() : SimpleDrawTransform<2>(GUID_MAGPIE_RAVU_LITE_R3_PASS2_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ RAVULitePass2Transform** ppOutput) { 13 | *ppOutput = nullptr; 14 | 15 | HRESULT hr = LoadShader( 16 | d2dEC, 17 | MAGPIE_RAVU_LITE_R3_PASS2_SHADER, 18 | GUID_MAGPIE_RAVU_LITE_R3_PASS2_SHADER 19 | ); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | *ppOutput = new RAVULitePass2Transform(); 25 | 26 | return S_OK; 27 | } 28 | 29 | 30 | IFACEMETHODIMP MapInputRectsToOutputRect( 31 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 33 | UINT32 inputRectCount, 34 | _Out_ D2D1_RECT_L* pOutputRect, 35 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 36 | ) override { 37 | if (inputRectCount != 2) { 38 | return E_INVALIDARG; 39 | } 40 | if (pInputRects[0].right - pInputRects[0].left != pInputRects[1].right - pInputRects[1].left 41 | || pInputRects[0].bottom - pInputRects[0].top != pInputRects[1].bottom - pInputRects[1].top 42 | ) { 43 | return E_INVALIDARG; 44 | } 45 | 46 | _inputRects[0] = pInputRects[0]; 47 | _inputRects[1] = pInputRects[1]; 48 | *pOutputRect = { 49 | 0, 50 | 0, 51 | _inputRects[0].right * 2, 52 | _inputRects[0].bottom * 2, 53 | }; 54 | *pOutputOpaqueSubRect = {}; 55 | 56 | return S_OK; 57 | } 58 | }; -------------------------------------------------------------------------------- /EffectCommon/EffectCommon.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 头文件 38 | 39 | 40 | 41 | 42 | 着色器 43 | 44 | 45 | 46 | 47 | 48 | 着色器 49 | 50 | 51 | -------------------------------------------------------------------------------- /MODULE_ACNet/ACNetL10Transform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | 8 | class ACNetL10Transform : public SimpleDrawTransform<3> { 9 | private: 10 | ACNetL10Transform() : SimpleDrawTransform<3>(GUID_MAGPIE_ACNET_L10_SHADER) {} 11 | 12 | public: 13 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ ACNetL10Transform** ppOutput) { 14 | *ppOutput = nullptr; 15 | 16 | HRESULT hr = LoadShader( 17 | d2dEC, 18 | MAGPIE_ACNET_L10_SHADER, 19 | GUID_MAGPIE_ACNET_L10_SHADER 20 | ); 21 | if (FAILED(hr)) { 22 | return hr; 23 | } 24 | 25 | *ppOutput = new ACNetL10Transform(); 26 | 27 | return S_OK; 28 | } 29 | 30 | 31 | IFACEMETHODIMP MapInputRectsToOutputRect( 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 33 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 34 | UINT32 inputRectCount, 35 | _Out_ D2D1_RECT_L* pOutputRect, 36 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 37 | ) override { 38 | if (inputRectCount != 3) { 39 | return E_INVALIDARG; 40 | } 41 | 42 | _inputRects[0] = pInputRects[0]; 43 | for (int i = 1; i < 3; ++i) { 44 | if (pInputRects[0].right - pInputRects[0].left != pInputRects[i].right - pInputRects[i].left 45 | || pInputRects[0].bottom - pInputRects[0].top != pInputRects[i].bottom - pInputRects[i].top) { 46 | return E_INVALIDARG; 47 | } 48 | 49 | _inputRects[i] = pInputRects[i]; 50 | } 51 | 52 | *pOutputRect = { 53 | 0, 54 | 0, 55 | _inputRects[0].right * 2, 56 | _inputRects[0].bottom * 2, 57 | }; 58 | *pOutputOpaqueSubRect = {}; 59 | 60 | return S_OK; 61 | } 62 | }; 63 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNXAggregationTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | 8 | class FSRCNNXAggregationTransform : public SimpleDrawTransform<2> { 9 | private: 10 | FSRCNNXAggregationTransform() : SimpleDrawTransform<2>(GUID_MAGPIE_FSRCNNX_8041_AGGREGATION_SHADER) {} 11 | 12 | public: 13 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ FSRCNNXAggregationTransform** ppOutput) { 14 | *ppOutput = nullptr; 15 | 16 | HRESULT hr = LoadShader( 17 | d2dEC, 18 | MAGPIE_FSRCNNX_8041_AGGREGATION_SHADER, 19 | GUID_MAGPIE_FSRCNNX_8041_AGGREGATION_SHADER 20 | ); 21 | if (FAILED(hr)) { 22 | return hr; 23 | } 24 | 25 | *ppOutput = new FSRCNNXAggregationTransform(); 26 | 27 | return S_OK; 28 | } 29 | 30 | 31 | IFACEMETHODIMP MapInputRectsToOutputRect( 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 33 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 34 | UINT32 inputRectCount, 35 | _Out_ D2D1_RECT_L* pOutputRect, 36 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 37 | ) override { 38 | if (inputRectCount != 2) { 39 | return E_INVALIDARG; 40 | } 41 | if (pInputRects[0].right - pInputRects[0].left != pInputRects[1].right - pInputRects[1].left 42 | || pInputRects[0].bottom - pInputRects[0].top != pInputRects[1].bottom - pInputRects[1].top) { 43 | return E_INVALIDARG; 44 | } 45 | 46 | _inputRects[0] = pInputRects[0]; 47 | _inputRects[1] = pInputRects[1]; 48 | 49 | *pOutputRect = { 50 | 0, 51 | 0, 52 | _inputRects[0].right * 2, 53 | _inputRects[0].bottom * 2, 54 | }; 55 | *pOutputOpaqueSubRect = {}; 56 | 57 | return S_OK; 58 | } 59 | }; 60 | -------------------------------------------------------------------------------- /CursorHook/IpcServer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Magpie.CursorHook { 8 | // 无锁,需使用方同步 9 | class IpcServer { 10 | private ServerInterface serverInterface = null; 11 | private Queue messageQueue = null; 12 | 13 | public bool IsConnected { get; private set; } 14 | 15 | // channelName 可以为 null,此时本类的方法不起作用 16 | public IpcServer(string channelName) { 17 | if(string.IsNullOrEmpty(channelName)) { 18 | IsConnected = false; 19 | return; 20 | } 21 | IsConnected = true; 22 | 23 | serverInterface = EasyHook.RemoteHooking.IpcConnectClient(channelName); 24 | messageQueue = new Queue(); 25 | 26 | // 测试连接性,如果失败会抛出异常静默的失败因此 Run 方法不会执行 27 | Send(); 28 | } 29 | 30 | public void AddMessage(string msg) { 31 | if (!IsConnected) { 32 | return; 33 | } 34 | 35 | if (messageQueue.Count < 1000) { 36 | messageQueue.Enqueue(msg); 37 | } 38 | } 39 | 40 | public void Send() { 41 | if(!IsConnected) { 42 | return; 43 | } 44 | 45 | string[] queued = messageQueue.ToArray(); 46 | messageQueue.Clear(); 47 | 48 | try { 49 | if (queued != null && queued.Length > 0) { 50 | serverInterface.ReportMessages(queued); 51 | } else { 52 | serverInterface.Ping(); 53 | } 54 | } catch { 55 | // IPC 服务器已关闭 56 | // 只会在调试环境下发生 57 | IsConnected = false; 58 | serverInterface = null; 59 | messageQueue = null; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KDenoiseBilateralTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class Anime4KDenoiseBilateralTransform : public SimpleDrawTransform<> { 8 | private: 9 | Anime4KDenoiseBilateralTransform() : SimpleDrawTransform<>(GUID_MAGPIE_ANIME4K_DENOISE_BILATERAL_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create( 13 | _In_ ID2D1EffectContext* d2dEC, 14 | _Outptr_ Anime4KDenoiseBilateralTransform** ppOutput 15 | ) { 16 | *ppOutput = nullptr; 17 | 18 | HRESULT hr = LoadShader( 19 | d2dEC, 20 | MAGPIE_ANIME4K_DENOISE_BILATERAL_SHADER, 21 | GUID_MAGPIE_ANIME4K_DENOISE_BILATERAL_SHADER 22 | ); 23 | if (FAILED(hr)) { 24 | return hr; 25 | } 26 | 27 | *ppOutput = new Anime4KDenoiseBilateralTransform(); 28 | 29 | return S_OK; 30 | } 31 | 32 | void SetVariant(int value) { 33 | assert(value >= 0 && value <= 2); 34 | _variant = value; 35 | } 36 | 37 | int GetVariant() { 38 | return _variant; 39 | } 40 | 41 | void SetIntensitySigma(float value) { 42 | assert(value > 0); 43 | _intensitySigma = value; 44 | } 45 | 46 | float GetIntensitySigma() { 47 | return _intensitySigma; 48 | } 49 | 50 | protected: 51 | void _SetShaderContantBuffer(const SIZE& srcSize) override { 52 | struct { 53 | INT32 srcWidth; 54 | INT32 srcHeight; 55 | INT32 variant; 56 | FLOAT intensitySigma; 57 | } shaderConstants{ 58 | srcSize.cx, 59 | srcSize.cy, 60 | _variant, 61 | _intensitySigma 62 | }; 63 | 64 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 65 | } 66 | 67 | private: 68 | int _variant = 0; 69 | float _intensitySigma = 0.1f; 70 | }; -------------------------------------------------------------------------------- /CursorHook/RuntimeCursorHook.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading; 6 | using System.Threading.Tasks; 7 | 8 | namespace Magpie.CursorHook { 9 | // 运行时钩子 10 | class RuntimeCursorHook : CursorHookBase { 11 | public RuntimeCursorHook(IntPtr hwndSrc, IpcServer server) : base(server) { 12 | hwndHost = NativeMethods.FindWindow(HOST_WINDOW_CLASS_NAME, IntPtr.Zero); 13 | if (hwndHost == IntPtr.Zero) { 14 | throw new Exception("无法找到全屏窗口"); 15 | } 16 | 17 | this.hwndSrc = hwndSrc; 18 | } 19 | 20 | public override void Run() { 21 | // 安装钩子 22 | EasyHook.LocalHook setCursorHook = null; 23 | try { 24 | // 截获 SetCursor 25 | setCursorHook = EasyHook.LocalHook.Create( 26 | EasyHook.LocalHook.GetProcAddress("user32.dll", "SetCursor"), 27 | new SetCursorDelegate(SetCursorHook), 28 | this 29 | ); 30 | 31 | // 只 Hook 窗口线程,因为 SetCursor 必须在窗口线程上调用 32 | setCursorHook.ThreadACL.SetInclusiveACL( 33 | new int[] { NativeMethods.GetWindowThreadId(hwndSrc) } 34 | ); 35 | } catch (Exception e) { 36 | // 安装失败,直接退出 37 | ReportIfFalse(false, "安装钩子失败:" + e.Message); 38 | return; 39 | } 40 | 41 | ReportToServer("SetCursor钩子安装成功"); 42 | 43 | ReplaceHCursors(); 44 | 45 | while (NativeMethods.IsWindow(hwndHost)) { 46 | SendMessages(); 47 | Thread.Sleep(200); 48 | } 49 | 50 | // 退出前重置窗口类的光标 51 | ReplaceHCursorsBack(); 52 | 53 | // 卸载钩子 54 | setCursorHook.Dispose(); 55 | EasyHook.LocalHook.Release(); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Runtime/DllMain.cpp: -------------------------------------------------------------------------------- 1 | // DllMain.cpp : Runtime.dll 的入口点。 2 | // 3 | 4 | 5 | #include "pch.h" 6 | #include "MagWindow.h" 7 | #include "Env.h" 8 | 9 | HINSTANCE hInst = NULL; 10 | 11 | 12 | // DLL 入口 13 | BOOL APIENTRY DllMain( 14 | HMODULE hModule, 15 | DWORD ul_reason_for_call, 16 | LPVOID lpReserved 17 | ) { 18 | switch (ul_reason_for_call) { 19 | case DLL_PROCESS_ATTACH: 20 | hInst = hModule; 21 | break; 22 | case DLL_PROCESS_DETACH: 23 | break; 24 | case DLL_THREAD_ATTACH: 25 | break; 26 | case DLL_THREAD_DETACH: 27 | break; 28 | } 29 | return TRUE; 30 | } 31 | 32 | 33 | API_DECLSPEC void WINAPI RunMagWindow( 34 | void reportStatus(int status, const wchar_t* errorMsg), 35 | HWND hwndSrc, 36 | const char* scaleModel, 37 | int captureMode, 38 | bool showFPS, 39 | bool noDisturb 40 | ) { 41 | Debug::ThrowIfComFailed( 42 | CoInitializeEx(NULL, COINIT_MULTITHREADED), 43 | L"初始化 COM 出错" 44 | ); 45 | 46 | try { 47 | Debug::Assert( 48 | IsWindow(hwndSrc) && IsWindowVisible(hwndSrc) && Utils::GetWindowShowCmd(hwndSrc) == SW_NORMAL, 49 | L"不合法的源窗口" 50 | ); 51 | Debug::Assert( 52 | captureMode >= 0 && captureMode <= 1, 53 | L"非法的抓取模式" 54 | ); 55 | 56 | Env::CreateInstance(hInst, hwndSrc, scaleModel, captureMode, showFPS, noDisturb); 57 | MagWindow::CreateInstance(); 58 | } catch(const magpie_exception& e) { 59 | reportStatus(0, (L"创建全屏窗口出错:" + e.what()).c_str()); 60 | return; 61 | } catch (...) { 62 | Debug::WriteErrorMessage(L"创建全屏窗口发生未知错误"); 63 | reportStatus(0, L"未知错误"); 64 | return; 65 | } 66 | 67 | reportStatus(2, nullptr); 68 | 69 | // 主消息循环 70 | std::wstring errMsg = MagWindow::RunMsgLoop(); 71 | 72 | Env::$instance = nullptr; 73 | reportStatus(0, errMsg.empty() ? nullptr : errMsg.c_str()); 74 | } 75 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimDownscalerFinalShader.hlsl: -------------------------------------------------------------------------------- 1 | // SSimDownscaler final pass 2 | 3 | cbuffer constants : register(b0) { 4 | int2 srcSize : packoffset(c0.x); 5 | }; 6 | 7 | 8 | #define MAGPIE_INPUT_COUNT 3 // POSTKERNEL, Mean, R 9 | #include "common.hlsli" 10 | 11 | 12 | #define locality 8.0 13 | 14 | #define Kernel(x) pow(1.0 / locality, abs(x)) 15 | #define taps 3.0 16 | #define maxtaps taps 17 | 18 | #define Gamma(x) (pow(x, 0.5f)) 19 | #define GammaInv(x) (pow(x, 2)) 20 | 21 | #define GetLuma(x) (dot(x, float3(0.299, 0.587, 0.114))) 22 | 23 | 24 | float3x3 ScaleH(float2 pos, float curX) { 25 | // Calculate bounds 26 | float low = floor(-0.5 * maxtaps); 27 | float high = floor(0.5 * maxtaps); 28 | 29 | float W = 0.0; 30 | float3x3 avg = 0; 31 | 32 | for (float k = 0.0; k < maxtaps; k++) { 33 | float rel = k + low + 1.0; 34 | pos.x = curX + rel; 35 | float w = Kernel(rel); 36 | 37 | float3 M = Gamma(SampleInputChecked(1, pos * Coord(1).zw).rgb); 38 | float3 R = SampleInputChecked(2, pos * Coord(2).zw).rgb; 39 | R = 1.0 / R - 1.0; 40 | avg += w * float3x3(R * M, M, R); 41 | W += w; 42 | } 43 | avg /= W; 44 | 45 | return avg; 46 | } 47 | 48 | D2D_PS_ENTRY(main) { 49 | InitMagpieSampleInput(); 50 | float2 cur = Coord(0).xy / Coord(0).zw; 51 | 52 | // Calculate bounds 53 | float low = floor(-0.5 * maxtaps); 54 | float high = floor(0.5 * maxtaps); 55 | 56 | float W = 0.0; 57 | float3x3 avg = 0; 58 | float2 pos = cur; 59 | 60 | for (float k = 0.0; k < maxtaps; k++) { 61 | float rel = k + low + 1.0; 62 | pos.y = cur.y + rel; 63 | float w = Kernel(rel); 64 | 65 | avg += w * ScaleH(pos, cur.x); 66 | W += w; 67 | } 68 | avg /= W; 69 | 70 | 71 | float3 origin = SampleInputCur(0).rgb; 72 | float3 r = GammaInv(avg[1] + avg[2] * Gamma(origin) - avg[0]); 73 | 74 | return float4(r, 1); 75 | } 76 | -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KConvReduceTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class Anime4KConvReduceTransform : public SimpleDrawTransform<5> { 8 | private: 9 | Anime4KConvReduceTransform(const GUID& shaderID) : SimpleDrawTransform<5>(shaderID) {} 10 | 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ Anime4KConvReduceTransform** ppOutput, bool useDenoiseVersion) { 13 | *ppOutput = nullptr; 14 | 15 | const GUID& shaderID = useDenoiseVersion ? GUID_MAGPIE_ANIME4K_DENOISE_CONV_REDUCE_SHADER : GUID_MAGPIE_ANIME4K_CONV_REDUCE_SHADER; 16 | HRESULT hr = LoadShader( 17 | d2dEC, 18 | useDenoiseVersion ? MAGPIE_ANIME4K_DENOISE_CONV_REDUCE_SHADER : MAGPIE_ANIME4K_CONV_REDUCE_SHADER, 19 | shaderID 20 | ); 21 | if (FAILED(hr)) { 22 | return hr; 23 | } 24 | 25 | *ppOutput = new Anime4KConvReduceTransform(shaderID); 26 | 27 | return S_OK; 28 | } 29 | 30 | 31 | IFACEMETHODIMP MapInputRectsToOutputRect( 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 33 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 34 | UINT32 inputRectCount, 35 | _Out_ D2D1_RECT_L* pOutputRect, 36 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 37 | ) override { 38 | if (inputRectCount != 5) { 39 | return E_INVALIDARG; 40 | } 41 | 42 | _inputRects[0] = pInputRects[0]; 43 | for (int i = 1; i < 5; ++i) { 44 | if (pInputRects[0].right - pInputRects[0].left != pInputRects[i].right - pInputRects[i].left 45 | || pInputRects[0].bottom - pInputRects[0].top != pInputRects[i].bottom - pInputRects[i].top) { 46 | return E_INVALIDARG; 47 | } 48 | 49 | _inputRects[i] = pInputRects[i]; 50 | } 51 | 52 | *pOutputRect = pInputRects[0]; 53 | *pOutputOpaqueSubRect = { 0,0,0,0 }; 54 | 55 | return S_OK; 56 | } 57 | }; -------------------------------------------------------------------------------- /Runtime/MonochromeCursorTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class MonochromeCursorTransform : public SimpleDrawTransform<2> { 8 | private: 9 | MonochromeCursorTransform() : SimpleDrawTransform<2>(GUID_MAGPIE_MONOCHROME_CURSOR_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create( 13 | _In_ ID2D1EffectContext* d2dEC, 14 | _Outptr_ MonochromeCursorTransform** ppOutput 15 | ) { 16 | *ppOutput = nullptr; 17 | 18 | HRESULT hr = LoadShader( 19 | d2dEC, 20 | MAGPIE_MONOCHROME_CURSOR_SHADER, 21 | GUID_MAGPIE_MONOCHROME_CURSOR_SHADER 22 | ); 23 | if (FAILED(hr)) { 24 | return hr; 25 | } 26 | 27 | *ppOutput = new MonochromeCursorTransform(); 28 | 29 | return S_OK; 30 | } 31 | 32 | IFACEMETHODIMP MapInputRectsToOutputRect( 33 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 34 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 35 | UINT32 inputRectCount, 36 | _Out_ D2D1_RECT_L* pOutputRect, 37 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 38 | ) override { 39 | if (inputRectCount != 2) { 40 | return E_INVALIDARG; 41 | } 42 | 43 | *pOutputRect = pInputRects[0]; 44 | _inputRects[0] = pInputRects[0]; 45 | _inputRects[1] = pInputRects[1]; 46 | 47 | *pOutputOpaqueSubRect = { 0,0,0,0 }; 48 | 49 | RECT shaderConstants{ 50 | _cursorPos.x, 51 | _cursorPos.y, 52 | _cursorPos.x + pInputRects[1].right - pInputRects[1].left, 53 | _cursorPos.y + (pInputRects[1].bottom - pInputRects[1].top) / 2 54 | }; 55 | 56 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 57 | 58 | return S_OK; 59 | } 60 | 61 | const POINT& GetCursorPos() const { 62 | return _cursorPos; 63 | } 64 | 65 | void SetCursorPos(const POINT& value) { 66 | _cursorPos = value; 67 | } 68 | 69 | private: 70 | POINT _cursorPos{}; 71 | }; 72 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResVarLTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class SSimSuperResVarLTransform : public SimpleDrawTransform<2> { 8 | private: 9 | SSimSuperResVarLTransform() : SimpleDrawTransform<2>(GUID_MAGPIE_SSIM_SUPERRES_VARL_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ SSimSuperResVarLTransform** ppOutput) { 13 | *ppOutput = nullptr; 14 | 15 | HRESULT hr = LoadShader( 16 | d2dEC, 17 | MAGPIE_SSIM_SUPERRES_VARL_SHADER, 18 | GUID_MAGPIE_SSIM_SUPERRES_VARL_SHADER 19 | ); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | *ppOutput = new SSimSuperResVarLTransform(); 25 | 26 | return S_OK; 27 | } 28 | 29 | 30 | IFACEMETHODIMP MapInputRectsToOutputRect( 31 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 33 | UINT32 inputRectCount, 34 | _Out_ D2D1_RECT_L* pOutputRect, 35 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 36 | ) override { 37 | if (inputRectCount != 2) { 38 | return E_INVALIDARG; 39 | } 40 | 41 | _inputRects[0] = pInputRects[0]; 42 | _inputRects[1] = pInputRects[1]; 43 | 44 | *pOutputRect = _inputRects[1]; 45 | *pOutputOpaqueSubRect = {}; 46 | 47 | int srcWidth = _inputRects[0].right - _inputRects[0].left; 48 | int srcHeight = _inputRects[0].bottom - _inputRects[0].top; 49 | struct { 50 | INT32 srcWidth; 51 | INT32 srcHeight; 52 | FLOAT scaleX; 53 | FLOAT scaleY; 54 | } shaderConstants{ 55 | srcWidth, 56 | srcHeight, 57 | (_inputRects[1].right - _inputRects[1].left) / float(srcWidth), 58 | (_inputRects[1].bottom - _inputRects[1].top) / float(srcHeight) 59 | }; 60 | 61 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 62 | 63 | return S_OK; 64 | } 65 | }; -------------------------------------------------------------------------------- /CursorHook/StartUpCursorHook.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading; 6 | using System.Threading.Tasks; 7 | 8 | namespace Magpie.CursorHook { 9 | // 启动时钩子 10 | class StartUpCursorHook : CursorHookBase { 11 | public StartUpCursorHook(IpcServer server): base(server) { 12 | } 13 | 14 | public override void Run() { 15 | // 安装钩子 16 | EasyHook.LocalHook setCursorHook = null; 17 | try { 18 | // 截获 SetCursor 19 | setCursorHook = EasyHook.LocalHook.Create( 20 | EasyHook.LocalHook.GetProcAddress("user32.dll", "SetCursor"), 21 | new SetCursorDelegate(SetCursorHook), 22 | this 23 | ); 24 | 25 | // Hook 除当前线程的所有线程,因为此时窗口线程未知 26 | setCursorHook.ThreadACL.SetExclusiveACL(new int[] { 0 }); 27 | } catch (Exception e) { 28 | // 安装失败,直接退出 29 | ReportIfFalse(false, "安装钩子失败:" + e.Message); 30 | return; 31 | } 32 | 33 | ReportToServer("SetCursor钩子安装成功"); 34 | 35 | 36 | // 启动时注入完成,唤醒注入进程 37 | EasyHook.RemoteHooking.WakeUpProcess(); 38 | 39 | // 启动时注入永远不卸载钩子 40 | while (true) { 41 | // 查找全屏窗口 42 | IntPtr hwndHost = NativeMethods.FindWindow(HOST_WINDOW_CLASS_NAME, IntPtr.Zero); 43 | if (hwndHost != IntPtr.Zero) { 44 | if (hwndHost != base.hwndHost) { 45 | ReportToServer("检测到全屏窗口"); 46 | 47 | base.hwndHost = hwndHost; 48 | // hwndSrc 为前台窗口 49 | hwndSrc = NativeMethods.GetForegroundWindow(); 50 | 51 | ReportCursorMap(); 52 | 53 | ReplaceHCursors(); 54 | } 55 | } else { 56 | if (base.hwndHost != IntPtr.Zero) { 57 | ReportToServer("全屏窗口已关闭"); 58 | base.hwndHost = IntPtr.Zero; 59 | 60 | ReplaceHCursorsBack(); 61 | } 62 | } 63 | 64 | SendMessages(); 65 | Thread.Sleep(200); 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /MODULE_SSIM/SSimSuperResFinalTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class SSimSuperResFinalTransform : public SimpleDrawTransform<5> { 8 | private: 9 | SSimSuperResFinalTransform() : SimpleDrawTransform<5>(GUID_MAGPIE_SSIM_SUPERRES_FINAL_SHADER) {} 10 | 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ SSimSuperResFinalTransform** ppOutput) { 13 | *ppOutput = nullptr; 14 | 15 | HRESULT hr = LoadShader( 16 | d2dEC, 17 | MAGPIE_SSIM_SUPERRES_FINAL_SHADER, 18 | GUID_MAGPIE_SSIM_SUPERRES_FINAL_SHADER 19 | ); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | *ppOutput = new SSimSuperResFinalTransform(); 25 | 26 | return S_OK; 27 | } 28 | 29 | 30 | IFACEMETHODIMP MapInputRectsToOutputRect( 31 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 33 | UINT32 inputRectCount, 34 | _Out_ D2D1_RECT_L* pOutputRect, 35 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 36 | ) override { 37 | if (inputRectCount != 5) { 38 | return E_INVALIDARG; 39 | } 40 | 41 | _inputRects[0] = pInputRects[0]; 42 | _inputRects[1] = pInputRects[1]; 43 | for (int i = 2; i < 5; ++i) { 44 | if (pInputRects[1].right - pInputRects[1].left != pInputRects[i].right - pInputRects[i].left 45 | || pInputRects[1].bottom - pInputRects[1].top != pInputRects[i].bottom - pInputRects[i].top) { 46 | return E_INVALIDARG; 47 | } 48 | 49 | _inputRects[i] = pInputRects[i]; 50 | } 51 | 52 | *pOutputRect = pInputRects[1]; 53 | *pOutputOpaqueSubRect = { 0,0,0,0 }; 54 | 55 | struct { 56 | INT32 srcWidth; 57 | INT32 srcHeight; 58 | INT32 destWidth; 59 | INT32 destHeight; 60 | } shaderConstants{ 61 | _inputRects[0].right - _inputRects[0].left, 62 | _inputRects[0].bottom - _inputRects[0].top, 63 | _inputRects[1].right - _inputRects[1].left, 64 | _inputRects[1].bottom - _inputRects[1].top 65 | }; 66 | 67 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants)); 68 | 69 | return S_OK; 70 | } 71 | }; -------------------------------------------------------------------------------- /MODULE_Anime4K/Anime4KSharpenCombineTransform.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | 6 | 7 | class Anime4KSharpenCombineTransform : public SimpleDrawTransform<2> { 8 | private: 9 | Anime4KSharpenCombineTransform() : SimpleDrawTransform<2>(GUID_MAGPIE_ANIME4K_SHARPEN_COMBINE_SHADER){} 10 | 11 | public: 12 | static HRESULT Create(_In_ ID2D1EffectContext* d2dEC, _Outptr_ Anime4KSharpenCombineTransform** ppOutput) { 13 | *ppOutput = nullptr; 14 | 15 | HRESULT hr = LoadShader( 16 | d2dEC, 17 | MAGPIE_ANIME4K_SHARPEN_COMBINE_SHADER, 18 | GUID_MAGPIE_ANIME4K_SHARPEN_COMBINE_SHADER 19 | ); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | *ppOutput = new Anime4KSharpenCombineTransform(); 25 | 26 | return S_OK; 27 | } 28 | 29 | 30 | IFACEMETHODIMP MapInputRectsToOutputRect( 31 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects, 32 | _In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects, 33 | UINT32 inputRectCount, 34 | _Out_ D2D1_RECT_L* pOutputRect, 35 | _Out_ D2D1_RECT_L* pOutputOpaqueSubRect 36 | ) override { 37 | if (inputRectCount != 2) { 38 | return E_INVALIDARG; 39 | } 40 | if (pInputRects[0].right - pInputRects[0].left != pInputRects[1].right - pInputRects[1].left 41 | || pInputRects[0].bottom - pInputRects[0].top != pInputRects[1].bottom - pInputRects[1].top 42 | ) { 43 | return E_INVALIDARG; 44 | } 45 | 46 | _inputRects[0] = pInputRects[0]; 47 | _inputRects[1] = pInputRects[1]; 48 | *pOutputRect = { 49 | 0, 50 | 0, 51 | _inputRects[0].right * 2, 52 | _inputRects[0].bottom * 2, 53 | }; 54 | *pOutputOpaqueSubRect = {}; 55 | 56 | struct { 57 | INT32 width; 58 | INT32 height; 59 | FLOAT curveHeight; 60 | } _shaderConstants = { 61 | _inputRects[0].right, 62 | _inputRects[0].bottom, 63 | _curveHeight 64 | }; 65 | _drawInfo->SetPixelShaderConstantBuffer((BYTE*)&_shaderConstants, sizeof(_shaderConstants)); 66 | 67 | return S_OK; 68 | } 69 | 70 | void SetCurveHeight(float value) { 71 | assert(value >= 0); 72 | _curveHeight = value; 73 | } 74 | 75 | float GetCurveHeight() { 76 | return _curveHeight; 77 | } 78 | 79 | private: 80 | float _curveHeight = 0; 81 | }; -------------------------------------------------------------------------------- /EffectCommon/EffectUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace Microsoft::WRL; 9 | 10 | 11 | class EffectUtils { 12 | public: 13 | static HRESULT IsEffectRegistered(ID2D1Factory1* d2dFactory, const CLSID& effectID, bool& result) { 14 | UINT32 n; 15 | HRESULT hr = d2dFactory->GetRegisteredEffects(nullptr, 0, nullptr, &n); 16 | if (FAILED(hr)) { 17 | return hr; 18 | } 19 | 20 | std::vector effects(n); 21 | hr = d2dFactory->GetRegisteredEffects(effects.data(), n, &n, nullptr); 22 | if (FAILED(hr)) { 23 | return hr; 24 | } 25 | 26 | auto it = std::find(effects.begin(), effects.end(), effectID); 27 | result = it != effects.end(); 28 | 29 | return S_OK; 30 | } 31 | 32 | static HRESULT ReadScaleProp( 33 | const nlohmann::json& props, 34 | float fillScale, 35 | const std::pair& scale, 36 | std::pair& result 37 | ) { 38 | if (!props.is_array() || props.size() != 2 || !props[0].is_number() || !props[1].is_number()) { 39 | return E_INVALIDARG; 40 | } 41 | 42 | std::pair origin = { props[0], props[1] }; 43 | if (origin.first == 0 || origin.second == 0) { 44 | return E_INVALIDARG; 45 | } 46 | 47 | result = { 48 | origin.first > 0 ? origin.first : -origin.first * fillScale / scale.first, 49 | origin.second > 0 ? origin.second : -origin.second * fillScale / scale.second 50 | }; 51 | return S_OK; 52 | } 53 | 54 | static HRESULT LoadBitmapFromHBmp(IWICImagingFactory2* wicImgFactory, ID2D1DeviceContext* d2dDC, HBITMAP hBmp, ComPtr& d2dBmp) { 55 | ComPtr wicBmp; 56 | HRESULT hr = wicImgFactory->CreateBitmapFromHBITMAP(hBmp, nullptr, WICBitmapIgnoreAlpha, &wicBmp); 57 | if (FAILED(hr)) { 58 | return hr; 59 | } 60 | 61 | ComPtr result; 62 | hr = d2dDC->CreateBitmapFromWicBitmap(wicBmp.Get(), &result); 63 | if (FAILED(hr)) { 64 | return hr; 65 | } 66 | 67 | d2dBmp = std::move(result); 68 | return S_OK; 69 | } 70 | 71 | static HRESULT UTF8ToUTF16(std::string_view str, std::wstring& result) { 72 | assert(str.size() > 0); 73 | 74 | int convertResult = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0); 75 | if (convertResult <= 0) { 76 | return E_FAIL; 77 | } 78 | 79 | std::wstring r(convertResult + 10, L'\0'); 80 | convertResult = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), &r[0], (int)r.size()); 81 | if (convertResult <= 0) { 82 | return E_FAIL; 83 | } 84 | 85 | result = std::wstring(r.begin(), r.begin() + convertResult); 86 | return S_OK; 87 | } 88 | }; 89 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /Magpie/Properties/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 51 | 58 | 59 | 60 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /MODULE_RAVU/MODULE_RAVU.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | {3437d715-a2ce-4065-b4d1-23764c58e688} 18 | 19 | 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 头文件 38 | 39 | 40 | 头文件 41 | 42 | 43 | 头文件 44 | 45 | 46 | 47 | 48 | 源文件 49 | 50 | 51 | 源文件 52 | 53 | 54 | 55 | 56 | 着色器 57 | 58 | 59 | 着色器 60 | 61 | 62 | 着色器 63 | 64 | 65 | 着色器 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 资源文件 74 | 75 | 76 | 77 | 78 | 资源文件 79 | 80 | 81 | -------------------------------------------------------------------------------- /MODULE_SSIM/MODULE_SSIM.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 头文件 38 | 39 | 40 | 41 | 42 | 源文件 43 | 44 | 45 | 源文件 46 | 47 | 48 | 49 | 50 | 着色器 51 | 52 | 53 | 着色器 54 | 55 | 56 | 着色器 57 | 58 | 59 | 着色器 60 | 61 | 62 | 着色器 63 | 64 | 65 | 着色器 66 | 67 | 68 | 着色器 69 | 70 | 71 | 着色器 72 | 73 | 74 | 着色器 75 | 76 | 77 | 着色器 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Lines of code](https://img.shields.io/tokei/lines/github/Blinue/Magpie)](https://github.com/Blinue/Magpie) [![Help Wanted](https://img.shields.io/github/issues/Blinue/Magpie/help%20wanted?color=%232EA043&label=help%20wanted)](https://github.com/Blinue/Magpie/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) 2 | 3 | # MAGPIE 4 | 5 | Magpie可以将任意窗口放大至全屏,支持多种高级缩放算法,包括Lanczos、[Anime4K](https://github.com/bloc97/Anime4K)、[RAVU](https://github.com/bjin/mpv-prescalers)、[FSRCNNX](https://github.com/igv/FSRCNN-TensorFlow)等。 6 | 7 | 主要用于游戏窗口的放大显示,适用于不支持全屏模式,或者内置的全屏模式会使画面模糊的情况。 8 | 9 | 欢迎标星,欢迎任何形式的贡献。 10 | 11 | ## 使用方法 12 | 13 | ![窗口截图](img/窗口截图.png) 14 | 15 | 要放大的窗口位于前台时,按下热键即可全屏显示该窗口,再次按下热键或者切换前台窗口将退出全屏。 16 | 17 | 以下为配置说明: 18 | 19 | #### 缩放模式 20 | 21 | 程序预置了多种缩放模式,如果它们不符合你的需求,请[自定义缩放](docs/自定义缩放.md)。 22 | 23 | 1. Lanczos:常见的传统插值算法,善于保留锐利的边缘。 24 | 2. RAVU:见[About RAVU](https://github.com/bjin/mpv-prescalers#about-ravu)。此预置使用zoom变体。 25 | 3. FSRCNNX:FSRCNN的变体。在各种场合表现优秀。 26 | 4. ACNet:[ACNetGLSL](https://github.com/TianZerL/ACNetGLSL)的移植。适合动画风格的图像和视频放大。 27 | 5. Anime4K:开源的高质量的实时动漫缩放/降噪算法。 28 | * Anime4K:对输入应用一次Anime4K。默认使用降噪版本。 29 | * Anime4K+ThinLines:执行Anime4K后细化线条。 30 | 6. 像素:将每个像素放大整数倍,可以完整保留原图像的视觉效果。预置了2x和3x两种放大倍率。 31 | 32 | #### 抓取模式 33 | 34 | 指示程序如何抓取源窗口图像 35 | 36 | 1. WinRT Capture:使用[Screen Capture API](https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/screen-capture)抓取窗口,最推荐的方法。此API从Windows 10, v1803开始提供。 37 | 2. GDI:使用GDI抓取源窗口,速度稍慢。 38 | 39 | #### 注入模式 40 | 41 | 如果源窗口使用了自定义光标,屏幕上可能出现两个光标。为了解决这个问题,Magpie提供了进程注入的功能: 42 | 43 | 1. 不使用注入:适用于源窗口没有自定义光标的场合 44 | 2. 运行时注入:在执行缩放的同时注入源窗口线程,退出全屏后取消注入 45 | 3. 启动时注入:适用于运行时注入不起作用的场合,不能注入正在运行的进程,需要手动选择要启动并注入的程序。 46 | 47 | #### 高级选项 48 | 49 | * 显示帧率:在屏幕左上角显示当前帧率 50 | 51 | ## 实现原理 52 | 53 | 因为实现原理的不同,Magpie比[Lossless Scaling](https://store.steampowered.com/app/993090/Lossless_Scaling/)和[IntegerScaler](https://tanalin.com/en/projects/integer-scaler/)强大的多。Magpie的原理非常简单:使用一个全屏窗口覆盖屏幕,捕获原窗口的内容放大后在该全屏窗口显示出来。这种方式使得缩放算法不受任何限制,让我们可以自由使用现存的优秀缩放算法。 54 | 55 | ## 使用提示 56 | 57 | 1. 如果你设置了DPI缩放,而要放大的窗口不支持(表现为画面模糊),请首先进入该程序的兼容性设置,将“高DPI缩放替代”设置为“应用程序”。 58 | 59 | ![高DPI设置](img/高DPI设置.png) 60 | 61 | 2. 一些游戏支持调整窗口的大小,但只是简单的使用线性缩放,这时请先将其设为原始分辨率。 62 | 63 | ## 免责声明 64 | 65 | 因为使用了进程注入技术,本程序极有可能被报毒。出于安全考虑,您应该检查源代码并自行编译。 66 | 67 | 开发本程序的初衷不含有任何恶意,但使用它所造成的后果应由您自己承担。 68 | 69 | 参见[LICENSE](./LICENSE)。 70 | 71 | ## 鸣谢 72 | 73 | 感谢以下优秀项目,你们使Magpie的存在成为可能 74 | 75 | * [nlohmann/json](https://github.com/nlohmann/json) 76 | * [Boost C++ Libraries](https://www.boost.org/) 77 | * [EasyHook/EasyHook](https://github.com/EasyHook/EasyHook) 78 | * [microsoft/cppwinrt](https://github.com/microsoft/cppwinrt) 79 | * [libretro/common-shaders](https://github.com/libretro/common-shaders) 80 | * [TianZerL/Anime4KCPP](https://github.com/TianZerL/Anime4KCPP) 81 | * [bloc97/Anime4K](https://github.com/bloc97/Anime4K) 82 | * [bjin/mpv-prescalers](https://github.com/bjin/mpv-prescalers) 83 | * [igv/FSRCNN-TensorFlow](https://github.com/igv/FSRCNN-TensorFlow) 84 | * [TianZerL/ACNetGLSL](https://github.com/TianZerL/ACNetGLSL) 85 | * [igv’s gists](https://gist.github.com/igv) 86 | * [deus0ww/mpv-conf](https://github.com/deus0ww/mpv-conf) 87 | -------------------------------------------------------------------------------- /MODULE_Common/EffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | 6 | // {F900ED08-0F05-4DD5-A57C-E04FBE822718} 7 | DEFINE_GUID(GUID_MAGPIE_JINC2_SCALE_SHADER, 8 | 0xf900ed08, 0xf05, 0x4dd5, 0xa5, 0x7c, 0xe0, 0x4f, 0xbe, 0x82, 0x27, 0x18); 9 | 10 | // {04F23541-E5F0-4F6F-9504-CB717953BC4D} 11 | DEFINE_GUID(GUID_MAGPIE_ADAPTIVE_SHARPEN_PASS1_SHADER, 12 | 0x4f23541, 0xe5f0, 0x4f6f, 0x95, 0x4, 0xcb, 0x71, 0x79, 0x53, 0xbc, 0x4d); 13 | 14 | // {0315E840-6A97-4D6E-9849-A9EA697C43B8} 15 | DEFINE_GUID(GUID_MAGPIE_ADAPTIVE_SHARPEN_PASS2_SHADER, 16 | 0x315e840, 0x6a97, 0x4d6e, 0x98, 0x49, 0xa9, 0xea, 0x69, 0x7c, 0x43, 0xb8); 17 | 18 | // {B62951A2-F97E-4D3F-A7E7-D5622C32E936} 19 | DEFINE_GUID(GUID_MAGPIE_MITCHELL_NETRAVALI_SCALE_SHADER, 20 | 0xb62951a2, 0xf97e, 0x4d3f, 0xa7, 0xe7, 0xd5, 0x62, 0x2c, 0x32, 0xe9, 0x36); 21 | 22 | // {A5A2C04C-CC7F-40AB-93D4-C4A4B8AFAA78} 23 | DEFINE_GUID(GUID_MAGPIE_LANCZOS6_SCALE_SHADER, 24 | 0xa5a2c04c, 0xcc7f, 0x40ab, 0x93, 0xd4, 0xc4, 0xa4, 0xb8, 0xaf, 0xaa, 0x78); 25 | 26 | // {782A63A0-A71F-4045-9ADD-336DEC2C888C} 27 | DEFINE_GUID(GUID_MAGPIE_PIXEL_SCALE_SHADER, 28 | 0x782a63a0, 0xa71f, 0x4045, 0x9a, 0xdd, 0x33, 0x6d, 0xec, 0x2c, 0x88, 0x8c); 29 | 30 | // {3E7F23C3-185F-4AC6-B6B8-D5187E69CA4F} 31 | DEFINE_GUID(GUID_MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_SHADER, 32 | 0x3e7f23c3, 0x185f, 0x4ac6, 0xb6, 0xb8, 0xd5, 0x18, 0x7e, 0x69, 0xca, 0x4f); 33 | 34 | 35 | 36 | // {FF65D2D6-4359-429D-B30A-F3F65B5AF20D} 37 | DEFINE_GUID(CLSID_MAGPIE_ADAPTIVE_SHARPEN_EFFECT, 38 | 0xff65d2d6, 0x4359, 0x429d, 0xb3, 0xa, 0xf3, 0xf6, 0x5b, 0x5a, 0xf2, 0xd); 39 | 40 | // {85C487CA-1ABF-4760-9B17-3F62D2A54D63} 41 | DEFINE_GUID(CLSID_MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_EFFECT, 42 | 0x85c487ca, 0x1abf, 0x4760, 0x9b, 0x17, 0x3f, 0x62, 0xd2, 0xa5, 0x4d, 0x63); 43 | 44 | 45 | // {1F1D758E-5EEA-4FE7-BDC0-FC9E98702108} 46 | DEFINE_GUID(CLSID_MAGPIE_JINC_SCALE_EFFECT, 47 | 0x1f1d758e, 0x5eea, 0x4fe7, 0xbd, 0xc0, 0xfc, 0x9e, 0x98, 0x70, 0x21, 0x8); 48 | 49 | // {DED5C76B-9308-4122-AC81-578C6542B7BD} 50 | DEFINE_GUID(CLSID_MAGPIE_MITCHELL_NETRAVALI_SCALE_EFFECT, 51 | 0xded5c76b, 0x9308, 0x4122, 0xac, 0x81, 0x57, 0x8c, 0x65, 0x42, 0xb7, 0xbd); 52 | 53 | // {67D990A0-F870-4BBB-B5FB-1AF043435F72} 54 | DEFINE_GUID(CLSID_MAGPIE_LANCZOS_SCALE_EFFECT, 55 | 0x67d990a0, 0xf870, 0x4bbb, 0xb5, 0xfb, 0x1a, 0xf0, 0x43, 0x43, 0x5f, 0x72); 56 | 57 | // {0ED9318D-D624-4582-9CE2-399B79428AB4} 58 | DEFINE_GUID(CLSID_MAGPIE_PIXEL_SCALE_EFFECT, 59 | 0xed9318d, 0xd624, 0x4582, 0x9c, 0xe2, 0x39, 0x9b, 0x79, 0x42, 0x8a, 0xb4); 60 | 61 | 62 | 63 | constexpr auto MAGPIE_ADAPTIVE_SHARPEN_PASS1_SHADER = L"shaders/AdaptiveSharpenPass1Shader.cso"; 64 | constexpr auto MAGPIE_ADAPTIVE_SHARPEN_PASS2_SHADER = L"shaders/AdaptiveSharpenPass2Shader.cso"; 65 | constexpr auto MAGPIE_CONTRAST_ADAPTIVE_SHARPEN_SHADER = L"shaders/ContrastAdaptiveSharpenShader.cso"; 66 | 67 | constexpr auto MAGPIE_LANCZOS6_SCALE_SHADER = L"shaders/Lanczos6ScaleShader.cso"; 68 | constexpr auto MAGPIE_JINC2_SCALE_SHADER = L"shaders/Jinc2ScaleShader.cso"; 69 | constexpr auto MAGPIE_MITCHELL_NETRAVALI_SCALE_SHADER = L"shaders/MitchellNetravaliScaleShader.cso"; 70 | constexpr auto MAGPIE_PIXEL_SCALE_SHADER = L"shaders/PixelScaleShader.cso"; 71 | -------------------------------------------------------------------------------- /MODULE_SSIM/EffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | 5 | 6 | // {C1A88B47-0445-431B-8BCE-A5D9685F81BA} 7 | DEFINE_GUID(GUID_MAGPIE_SSIM_DOWNSCALER_L2_PASS1_SHADER, 8 | 0xc1a88b47, 0x445, 0x431b, 0x8b, 0xce, 0xa5, 0xd9, 0x68, 0x5f, 0x81, 0xba); 9 | // {52F14BD7-276F-4A71-B6A5-78EAE953B009} 10 | DEFINE_GUID(GUID_MAGPIE_SSIM_DOWNSCALER_L2_PASS2_SHADER, 11 | 0x52f14bd7, 0x276f, 0x4a71, 0xb6, 0xa5, 0x78, 0xea, 0xe9, 0x53, 0xb0, 0x9); 12 | // {D0170618-3B87-425C-BDCB-3FD295AD1A53} 13 | DEFINE_GUID(GUID_MAGPIE_SSIM_DOWNSCALER_MEAN_SHADER, 14 | 0xd0170618, 0x3b87, 0x425c, 0xbd, 0xcb, 0x3f, 0xd2, 0x95, 0xad, 0x1a, 0x53); 15 | // {1DC8E763-F619-45A0-83CA-B309A3F0A2E4} 16 | DEFINE_GUID(GUID_MAGPIE_SSIM_DOWNSCALER_R_SHADER, 17 | 0x1dc8e763, 0xf619, 0x45a0, 0x83, 0xca, 0xb3, 0x9, 0xa3, 0xf0, 0xa2, 0xe4); 18 | // {40BC3632-19FE-4B7B-8988-F7FDE5F87A94} 19 | DEFINE_GUID(GUID_MAGPIE_SSIM_DOWNSCALER_FINAL_SHADER, 20 | 0x40bc3632, 0x19fe, 0x4b7b, 0x89, 0x88, 0xf7, 0xfd, 0xe5, 0xf8, 0x7a, 0x94); 21 | 22 | // {EF4B2463-F824-482C-8706-857B3959B30F} 23 | DEFINE_GUID(GUID_MAGPIE_SSIM_SUPERRES_DOWNSCALING_1_SHADER, 24 | 0xef4b2463, 0xf824, 0x482c, 0x87, 0x6, 0x85, 0x7b, 0x39, 0x59, 0xb3, 0xf); 25 | // {D4C13132-4FAF-4C2E-BD9E-A212E7AF44B2} 26 | DEFINE_GUID(GUID_MAGPIE_SSIM_SUPERRES_DOWNSCALING_2_SHADER, 27 | 0xd4c13132, 0x4faf, 0x4c2e, 0xbd, 0x9e, 0xa2, 0x12, 0xe7, 0xaf, 0x44, 0xb2); 28 | // {78B32561-4277-43E7-A94C-F9D6DD3BA2D6} 29 | DEFINE_GUID(GUID_MAGPIE_SSIM_SUPERRES_VARL_SHADER, 30 | 0x78b32561, 0x4277, 0x43e7, 0xa9, 0x4c, 0xf9, 0xd6, 0xdd, 0x3b, 0xa2, 0xd6); 31 | // {B963075F-21B5-4602-A5A4-96981B1B5AC9} 32 | DEFINE_GUID(GUID_MAGPIE_SSIM_SUPERRES_VARH_SHADER, 33 | 0xb963075f, 0x21b5, 0x4602, 0xa5, 0xa4, 0x96, 0x98, 0x1b, 0x1b, 0x5a, 0xc9); 34 | // {D37BC701-F6C9-4154-A89C-1BABC3156E45} 35 | DEFINE_GUID(GUID_MAGPIE_SSIM_SUPERRES_FINAL_SHADER, 36 | 0xd37bc701, 0xf6c9, 0x4154, 0xa8, 0x9c, 0x1b, 0xab, 0xc3, 0x15, 0x6e, 0x45); 37 | 38 | 39 | 40 | // {A61130BF-EBAB-4056-A3C1-FF541AE2C67F} 41 | DEFINE_GUID(CLSID_MAGPIE_SSIM_DOWNSCALER_EFFECT, 42 | 0xa61130bf, 0xebab, 0x4056, 0xa3, 0xc1, 0xff, 0x54, 0x1a, 0xe2, 0xc6, 0x7f); 43 | 44 | // {9A186FA1-0334-400B-8333-D63009EBCA77} 45 | DEFINE_GUID(CLSID_MAGPIE_SSIM_SUPERRES_EFFECT, 46 | 0x9a186fa1, 0x334, 0x400b, 0x83, 0x33, 0xd6, 0x30, 0x9, 0xeb, 0xca, 0x77); 47 | 48 | 49 | 50 | constexpr auto MAGPIE_SSIM_DOWNSCALER_L2_PASS1_SHADER = L"shaders/SSimDownscalerL2Pass1Shader.cso"; 51 | constexpr auto MAGPIE_SSIM_DOWNSCALER_L2_PASS2_SHADER = L"shaders/SSimDownscalerL2Pass2Shader.cso"; 52 | constexpr auto MAGPIE_SSIM_DOWNSCALER_MEAN_SHADER = L"shaders/SSimDownscalerMeanShader.cso"; 53 | constexpr auto MAGPIE_SSIM_DOWNSCALER_R_SHADER = L"shaders/SSimDownscalerRShader.cso"; 54 | constexpr auto MAGPIE_SSIM_DOWNSCALER_FINAL_SHADER = L"shaders/SSimDownscalerFinalShader.cso"; 55 | 56 | constexpr auto MAGPIE_SSIM_SUPERRES_DOWNSCALING1_SHADER = L"shaders/SSimSuperResDownscaling1Shader.cso"; 57 | constexpr auto MAGPIE_SSIM_SUPERRES_DOWNSCALING2_SHADER = L"shaders/SSimSuperResDownscaling2Shader.cso"; 58 | constexpr auto MAGPIE_SSIM_SUPERRES_VARL_SHADER = L"shaders/SSimSuperResVarLShader.cso"; 59 | constexpr auto MAGPIE_SSIM_SUPERRES_VARH_SHADER = L"shaders/SSimSuperResVarHShader.cso"; 60 | constexpr auto MAGPIE_SSIM_SUPERRES_FINAL_SHADER = L"shaders/SSimSuperResFinalShader.cso"; 61 | -------------------------------------------------------------------------------- /Runtime/MonochromeCursorEffect.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include "MonochromeCursorTransform.h" 4 | #include 5 | #include "EffectDefines.h" 6 | 7 | 8 | class MonochromeCursorEffect : public EffectBase { 9 | public: 10 | IFACEMETHODIMP Initialize( 11 | _In_ ID2D1EffectContext* pEffectContext, 12 | _In_ ID2D1TransformGraph* pTransformGraph 13 | ) { 14 | HRESULT hr = MonochromeCursorTransform::Create(pEffectContext, &_transform); 15 | if (FAILED(hr)) { 16 | return hr; 17 | } 18 | 19 | hr = pTransformGraph->AddNode(_transform.Get()); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | hr = pTransformGraph->ConnectToEffectInput(0, _transform.Get(), 0); 24 | if (FAILED(hr)) { 25 | return hr; 26 | } 27 | hr = pTransformGraph->ConnectToEffectInput(1, _transform.Get(), 1); 28 | if (FAILED(hr)) { 29 | return hr; 30 | } 31 | hr = pTransformGraph->SetOutputNode(_transform.Get()); 32 | if (FAILED(hr)) { 33 | return hr; 34 | } 35 | 36 | return S_OK; 37 | } 38 | 39 | HRESULT SetCursorPos(D2D_VECTOR_2F value) { 40 | _transform->SetCursorPos({ lroundf(value.x), lroundf(value.y) }); 41 | return S_OK; 42 | } 43 | 44 | D2D_VECTOR_2F GetCursorPos() const { 45 | POINT pos = _transform->GetCursorPos(); 46 | return { float(pos.x), float(pos.y) }; 47 | } 48 | 49 | enum PROPS { 50 | PROP_CURSOR_POS = 0 51 | }; 52 | 53 | static HRESULT Register(_In_ ID2D1Factory1* pFactory) { 54 | const D2D1_PROPERTY_BINDING bindings[] = 55 | { 56 | D2D1_VALUE_TYPE_BINDING(L"CursorPos", &SetCursorPos, &GetCursorPos), 57 | }; 58 | 59 | HRESULT hr = pFactory->RegisterEffectFromString(CLSID_MAGPIE_MONOCHROME_CURSOR_EFFECT, XML( 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | ), bindings, ARRAYSIZE(bindings), CreateEffect); 77 | 78 | return hr; 79 | } 80 | 81 | static HRESULT CALLBACK CreateEffect(_Outptr_ IUnknown** ppEffectImpl) { 82 | *ppEffectImpl = static_cast(new MonochromeCursorEffect()); 83 | 84 | if (*ppEffectImpl == nullptr) { 85 | return E_OUTOFMEMORY; 86 | } 87 | 88 | return S_OK; 89 | } 90 | 91 | private: 92 | MonochromeCursorEffect() {} 93 | 94 | ComPtr _transform = nullptr; 95 | }; 96 | -------------------------------------------------------------------------------- /Magpie/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本:4.0.30319.42000 5 | // 6 | // 对此文件的更改可能会导致不正确的行为,并且如果 7 | // 重新生成代码,这些更改将会丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Magpie.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("Alt+F11")] 29 | public string Hotkey { 30 | get { 31 | return ((string)(this["Hotkey"])); 32 | } 33 | set { 34 | this["Hotkey"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("0")] 41 | public int ScaleMode { 42 | get { 43 | return ((int)(this["ScaleMode"])); 44 | } 45 | set { 46 | this["ScaleMode"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.UserScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 53 | public bool ShowFPS { 54 | get { 55 | return ((bool)(this["ShowFPS"])); 56 | } 57 | set { 58 | this["ShowFPS"] = value; 59 | } 60 | } 61 | 62 | [global::System.Configuration.UserScopedSettingAttribute()] 63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 64 | [global::System.Configuration.DefaultSettingValueAttribute("0")] 65 | public int InjectMode { 66 | get { 67 | return ((int)(this["InjectMode"])); 68 | } 69 | set { 70 | this["InjectMode"] = value; 71 | } 72 | } 73 | 74 | [global::System.Configuration.UserScopedSettingAttribute()] 75 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 76 | [global::System.Configuration.DefaultSettingValueAttribute("0")] 77 | public int CaptureMode { 78 | get { 79 | return ((int)(this["CaptureMode"])); 80 | } 81 | set { 82 | this["CaptureMode"] = value; 83 | } 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /MODULE_Common/MODULE_Common.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 头文件 38 | 39 | 40 | 头文件 41 | 42 | 43 | 头文件 44 | 45 | 46 | 头文件 47 | 48 | 49 | 头文件 50 | 51 | 52 | 头文件 53 | 54 | 55 | 头文件 56 | 57 | 58 | 头文件 59 | 60 | 61 | 62 | 63 | 源文件 64 | 65 | 66 | 源文件 67 | 68 | 69 | 70 | 71 | 着色器 72 | 73 | 74 | 着色器 75 | 76 | 77 | 着色器 78 | 79 | 80 | 着色器 81 | 82 | 83 | 着色器 84 | 85 | 86 | 着色器 87 | 88 | 89 | 着色器 90 | 91 | 92 | 93 | 94 | 着色器 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /MODULE_ACNet/MODULE_ACNet.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 32 | 33 | 源文件 34 | 35 | 36 | 源文件 37 | 38 | 39 | 40 | 41 | 着色器 42 | 43 | 44 | 着色器 45 | 46 | 47 | 着色器 48 | 49 | 50 | 着色器 51 | 52 | 53 | 着色器 54 | 55 | 56 | 着色器 57 | 58 | 59 | 着色器 60 | 61 | 62 | 着色器 63 | 64 | 65 | 着色器 66 | 67 | 68 | 着色器 69 | 70 | 71 | 着色器 72 | 73 | 74 | 着色器 75 | 76 | 77 | 着色器 78 | 79 | 80 | 着色器 81 | 82 | 83 | 着色器 84 | 85 | 86 | 着色器 87 | 88 | 89 | 着色器 90 | 91 | 92 | 着色器 93 | 94 | 95 | 着色器 96 | 97 | 98 | 99 | 100 | 着色器 101 | 102 | 103 | 着色器 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /MODULE_RAVU/RAVULiteEffect.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | #include "RavuLitePass2Transform.h" 5 | #include 6 | #include "EffectDefines.h" 7 | 8 | 9 | class RAVULiteEffect : public EffectBase { 10 | public: 11 | IFACEMETHODIMP Initialize( 12 | _In_ ID2D1EffectContext* effectContext, 13 | _In_ ID2D1TransformGraph* transformGraph 14 | ) { 15 | HRESULT hr = SimpleDrawTransform<>::Create( 16 | effectContext, 17 | &_rgb2yuvTransform, 18 | MAGPIE_RGB2YUV_SHADER, 19 | GUID_MAGPIE_RGB2YUV_SHADER 20 | ); 21 | if (FAILED(hr)) { 22 | return hr; 23 | } 24 | hr = SimpleDrawTransform<>::Create( 25 | effectContext, 26 | &_pass1Transform, 27 | MAGPIE_RAVU_LITE_R3_PASS1_SHADER, 28 | GUID_MAGPIE_RAVU_LITE_R3_PASS1_SHADER 29 | ); 30 | if (FAILED(hr)) { 31 | return hr; 32 | } 33 | hr = RAVULitePass2Transform::Create(effectContext, &_pass2Transform); 34 | if (FAILED(hr)) { 35 | return hr; 36 | } 37 | 38 | hr = transformGraph->AddNode(_rgb2yuvTransform.Get()); 39 | if (FAILED(hr)) { 40 | return hr; 41 | } 42 | hr = transformGraph->AddNode(_pass1Transform.Get()); 43 | if (FAILED(hr)) { 44 | return hr; 45 | } 46 | hr = transformGraph->AddNode(_pass2Transform.Get()); 47 | if (FAILED(hr)) { 48 | return hr; 49 | } 50 | 51 | hr = transformGraph->ConnectToEffectInput(0, _rgb2yuvTransform.Get(), 0); 52 | if (FAILED(hr)) { 53 | return hr; 54 | } 55 | hr = transformGraph->ConnectNode(_rgb2yuvTransform.Get(), _pass1Transform.Get(), 0); 56 | if (FAILED(hr)) { 57 | return hr; 58 | } 59 | hr = transformGraph->ConnectNode(_rgb2yuvTransform.Get(), _pass2Transform.Get(), 0); 60 | if (FAILED(hr)) { 61 | return hr; 62 | } 63 | hr = transformGraph->ConnectNode(_pass1Transform.Get(), _pass2Transform.Get(), 1); 64 | if (FAILED(hr)) { 65 | return hr; 66 | } 67 | 68 | hr = transformGraph->SetOutputNode(_pass2Transform.Get()); 69 | if (FAILED(hr)) { 70 | return hr; 71 | } 72 | 73 | return S_OK; 74 | } 75 | 76 | static HRESULT Register(_In_ ID2D1Factory1* pFactory) { 77 | HRESULT hr = pFactory->RegisterEffectFromString(CLSID_MAGPIE_RAVU_LITE_EFFECT, XML( 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | ), nullptr, 0, CreateEffect); 90 | 91 | return hr; 92 | } 93 | 94 | static HRESULT CALLBACK CreateEffect(_Outptr_ IUnknown** ppEffectImpl) { 95 | // This code assumes that the effect class initializes its reference count to 1. 96 | *ppEffectImpl = static_cast(new RAVULiteEffect()); 97 | 98 | if (*ppEffectImpl == nullptr) { 99 | return E_OUTOFMEMORY; 100 | } 101 | 102 | return S_OK; 103 | } 104 | 105 | private: 106 | // Constructor should be private since it should never be called externally. 107 | RAVULiteEffect() {} 108 | 109 | ComPtr> _rgb2yuvTransform = nullptr; 110 | ComPtr> _pass1Transform = nullptr; 111 | ComPtr _pass2Transform = nullptr; 112 | }; 113 | -------------------------------------------------------------------------------- /MODULE_RAVU/DllMain.cpp: -------------------------------------------------------------------------------- 1 | // dllmain.cpp : 定义 DLL 应用程序的入口点。 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | #include 6 | #include "RAVULiteEffect.h" 7 | #include "RAVUZoomEffect.h" 8 | 9 | 10 | HINSTANCE hInst = NULL; 11 | 12 | // DLL 入口 13 | BOOL APIENTRY DllMain( 14 | HMODULE hModule, 15 | DWORD ul_reason_for_call, 16 | LPVOID lpReserved 17 | ) { 18 | switch (ul_reason_for_call) { 19 | case DLL_PROCESS_ATTACH: 20 | hInst = hModule; 21 | break; 22 | case DLL_PROCESS_DETACH: 23 | break; 24 | case DLL_THREAD_ATTACH: 25 | break; 26 | case DLL_THREAD_DETACH: 27 | break; 28 | } 29 | return TRUE; 30 | } 31 | 32 | 33 | HRESULT CreateLiteEffect( 34 | ID2D1Factory1* d2dFactory, 35 | ID2D1DeviceContext* d2dDC, 36 | const nlohmann::json& props, 37 | ComPtr& effect, 38 | std::pair& scale 39 | ) { 40 | bool isRegistered; 41 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_RAVU_LITE_EFFECT, isRegistered); 42 | if (FAILED(hr)) { 43 | return hr; 44 | } 45 | 46 | if (!isRegistered) { 47 | hr = RAVULiteEffect::Register(d2dFactory); 48 | if (FAILED(hr)) { 49 | return hr; 50 | } 51 | } 52 | 53 | ComPtr result; 54 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_RAVU_LITE_EFFECT, &result); 55 | if (FAILED(hr)) { 56 | return hr; 57 | } 58 | 59 | effect = std::move(result); 60 | scale.first *= 2; 61 | scale.second *= 2; 62 | return S_OK; 63 | } 64 | 65 | HRESULT CreateZoomEffect( 66 | ID2D1Factory1* d2dFactory, 67 | ID2D1DeviceContext* d2dDC, 68 | IWICImagingFactory2* wicImgFactory, 69 | const nlohmann::json& props, 70 | float fillScale, 71 | std::pair& scale, 72 | ComPtr& effect 73 | ) { 74 | bool isRegistered; 75 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_RAVU_ZOOM_EFFECT, isRegistered); 76 | if (FAILED(hr)) { 77 | return hr; 78 | } 79 | 80 | if (!isRegistered) { 81 | hr = RAVUZoomEffect::Register(d2dFactory); 82 | if (FAILED(hr)) { 83 | return hr; 84 | } 85 | } 86 | 87 | ComPtr result; 88 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_RAVU_ZOOM_EFFECT, &result); 89 | if (FAILED(hr)) { 90 | return hr; 91 | } 92 | 93 | std::pair scaleResult(1.0f, 1.0f); 94 | // scale 属性 95 | auto it = props.find("scale"); 96 | if (it != props.end()) { 97 | hr = EffectUtils::ReadScaleProp(*it, fillScale, scale, scaleResult); 98 | if (FAILED(hr)) { 99 | return hr; 100 | } 101 | 102 | hr = result->SetValue(RAVUZoomEffect::PROP_SCALE, D2D1_VECTOR_2F{ scaleResult.first, scaleResult.second }); 103 | if (FAILED(hr)) { 104 | return hr; 105 | } 106 | } 107 | 108 | // 设置权重纹理 109 | hr = RAVUZoomEffect::LoadWeights(result.Get(), hInst, wicImgFactory, d2dDC); 110 | if (FAILED(hr)) { 111 | return hr; 112 | } 113 | 114 | effect = std::move(result); 115 | scale.first *= scaleResult.first; 116 | scale.second *= scaleResult.second; 117 | return S_OK; 118 | } 119 | 120 | 121 | API_DECLSPEC HRESULT CreateEffect( 122 | ID2D1Factory1* d2dFactory, 123 | ID2D1DeviceContext* d2dDC, 124 | IWICImagingFactory2* wicImgFactory, 125 | const nlohmann::json& props, 126 | float fillScale, 127 | std::pair& scale, 128 | ComPtr& effect 129 | ) { 130 | const auto& e = props.value("effect", ""); 131 | if (e == "RAVULite") { 132 | return CreateLiteEffect(d2dFactory, d2dDC, props, effect, scale); 133 | } else if (e == "RAVUZoom") { 134 | return CreateZoomEffect(d2dFactory, d2dDC, wicImgFactory, props, fillScale, scale, effect); 135 | } else { 136 | return E_INVALIDARG; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /CursorHook/CursorHook.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {983647DC-E3C2-4658-852B-FF4D146F8134} 8 | Library 9 | Properties 10 | CursorHook 11 | CursorHook 12 | v4.7.2 13 | 512 14 | true 15 | 16 | 17 | true 18 | ..\build\x64\Debug\ 19 | DEBUG;TRACE 20 | true 21 | full 22 | AnyCPU 23 | 7.3 24 | prompt 25 | true 26 | 27 | 28 | ..\build\x64\Release\ 29 | 30 | 31 | true 32 | true 33 | pdbonly 34 | AnyCPU 35 | 7.3 36 | prompt 37 | 38 | 39 | true 40 | ..\build\x86\Debug\ 41 | DEBUG;TRACE 42 | true 43 | full 44 | AnyCPU 45 | 7.3 46 | prompt 47 | 48 | 49 | ..\build\x86\Release\ 50 | TRACE 51 | true 52 | true 53 | pdbonly 54 | AnyCPU 55 | 7.3 56 | prompt 57 | 58 | 59 | 60 | ..\packages\EasyHook.2.7.7097\lib\net40\EasyHook.dll 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Magpie/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本:4.0.30319.42000 5 | // 6 | // 对此文件的更改可能会导致不正确的行为,并且如果 7 | // 重新生成代码,这些更改将会丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Magpie.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// 一个强类型的资源类,用于查找本地化的字符串等。 17 | /// 18 | // 此类是由 StronglyTypedResourceBuilder 19 | // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 20 | // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen 21 | // (以 /str 作为命令选项),或重新生成 VS 项目。 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// 返回此类使用的缓存的 ResourceManager 实例。 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Magpie.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// 重写当前线程的 CurrentUICulture 属性,对 51 | /// 使用此强类型资源类的所有资源查找执行重写。 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// 查找类似 [ 65 | /// { 66 | /// "name": "Lanczos", 67 | /// "model": [ 68 | /// { 69 | /// "module": "Common", 70 | /// "effect": "lanczos", 71 | /// "scale": [ -1, -1 ], 72 | /// "ARStrength": 0.7 73 | /// }, 74 | /// { 75 | /// "module": "Common", 76 | /// "effect": "adaptiveSharpen", 77 | /// "curveHeight": 0.6 78 | /// } 79 | /// ] 80 | /// }, 81 | /// { 82 | /// "name": "RAVU", 83 | /// "model": [ 84 | /// { 85 | /// "module": "RAVU", 86 | /// "effect": "RAVUZoom", 87 | /// "scale": [ -1, -1 ] 88 | /// }, 89 | /// { 90 | /// "module": "Anime4K", 91 | /// "effect" [字符串的其余部分被截断]"; 的本地化字符串。 92 | /// 93 | internal static string BuiltInScaleModels { 94 | get { 95 | return ResourceManager.GetString("BuiltInScaleModels", resourceCulture); 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Magpie/NativeMethods.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Drawing; 4 | using System.Runtime.InteropServices; 5 | using System.Text; 6 | 7 | 8 | namespace Magpie { 9 | // Win32 API 10 | static class NativeMethods { 11 | public static readonly int MAGPIE_WM_SHOWME = RegisterWindowMessage("WM_SHOWME"); 12 | public static readonly int MAGPIE_WM_DESTORYMAG = RegisterWindowMessage("MAGPIE_WM_DESTORYMAG"); 13 | public static readonly int SW_NORMAL = 1; 14 | 15 | // 获取用户当前正在使用的窗体的句柄 16 | [DllImport("user32", CharSet = CharSet.Unicode)] 17 | public static extern IntPtr GetForegroundWindow(); 18 | 19 | [DllImport("user32", CharSet = CharSet.Unicode)] 20 | [return: MarshalAs(UnmanagedType.Bool)] 21 | public static extern bool IsWindow(IntPtr hWnd); 22 | 23 | [DllImport("user32", CharSet = CharSet.Unicode)] 24 | [return: MarshalAs(UnmanagedType.Bool)] 25 | public static extern bool IsWindowVisible(IntPtr hWnd); 26 | 27 | [DllImport("user32", CharSet = CharSet.Unicode)] 28 | [return: MarshalAs(UnmanagedType.Bool)] 29 | public static extern bool SetForegroundWindow(IntPtr hWnd); 30 | 31 | [DllImport("user32", CharSet = CharSet.Unicode)] 32 | [return: MarshalAs(UnmanagedType.Bool)] 33 | private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 34 | 35 | private static readonly IntPtr HWND_BROADCAST = (IntPtr)0xffff; 36 | public static bool BroadcastMessage(int msg) { 37 | return PostMessage(HWND_BROADCAST, msg, IntPtr.Zero, IntPtr.Zero); 38 | } 39 | 40 | [DllImport("user32", CharSet = CharSet.Unicode)] 41 | public static extern int RegisterWindowMessage(string message); 42 | 43 | [DllImport("user32.dll", CharSet = CharSet.Unicode)] 44 | private static extern int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId); 45 | 46 | public static int GetWindowProcessId(IntPtr hWnd) { 47 | int processId = 0; 48 | 49 | if(GetWindowThreadProcessId(hWnd, ref processId) == 0) { 50 | return 0; 51 | } 52 | 53 | return processId; 54 | } 55 | 56 | [StructLayout(LayoutKind.Sequential)] 57 | private struct POINT { 58 | public int x; 59 | public int y; 60 | } 61 | [StructLayout(LayoutKind.Sequential)] 62 | struct RECT { 63 | public int left; 64 | public int top; 65 | public int right; 66 | public int bottom; 67 | } 68 | [StructLayout(LayoutKind.Sequential)] 69 | struct WINDOWPLACEMENT { 70 | public uint length; 71 | public uint flags; 72 | public uint showCmd; 73 | public POINT ptMinPosition; 74 | public POINT ptMaxPosition; 75 | public RECT rcNormalPosition; 76 | } 77 | 78 | [DllImport("user32.dll", CharSet = CharSet.Unicode)] 79 | [return: MarshalAs(UnmanagedType.Bool)] 80 | private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 81 | 82 | public static int GetWindowShowCmd(IntPtr hWnd) { 83 | WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); 84 | wp.length = (uint)Marshal.SizeOf(wp); 85 | if(!GetWindowPlacement(hWnd, ref wp)) { 86 | return -1; 87 | } 88 | return (int)wp.showCmd; 89 | } 90 | 91 | /* 92 | * Runtime.dll 93 | */ 94 | 95 | public delegate void ReportStatus(int status, IntPtr errorMsg); 96 | 97 | [DllImport("Runtime", CallingConvention = CallingConvention.StdCall)] 98 | [return: MarshalAs(UnmanagedType.U1)] 99 | public static extern void RunMagWindow( 100 | ReportStatus reportStatus, 101 | IntPtr hwndSrc, 102 | [MarshalAs(UnmanagedType.LPUTF8Str)] string scaleModel, 103 | int captureMode, 104 | [MarshalAs(UnmanagedType.U1)] bool showFPS, 105 | [MarshalAs(UnmanagedType.U1)] bool noDisturb 106 | ); 107 | 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Runtime/Runtime.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 源文件 6 | 7 | 8 | 源文件 9 | 10 | 11 | 源文件 12 | 13 | 14 | 源文件 15 | 16 | 17 | 源文件 18 | 19 | 20 | 源文件 21 | 22 | 23 | 源文件 24 | 25 | 26 | 27 | 28 | 头文件 29 | 30 | 31 | 头文件 32 | 33 | 34 | 头文件 35 | 36 | 37 | 头文件 38 | 39 | 40 | 头文件 41 | 42 | 43 | 头文件 44 | 45 | 46 | 头文件\Effect 47 | 48 | 49 | 头文件\Capture 50 | 51 | 52 | 头文件\Capture 53 | 54 | 55 | 头文件\Capture 56 | 57 | 58 | 头文件\Capture 59 | 60 | 61 | 头文件\Render 62 | 63 | 64 | 头文件\Render 65 | 66 | 67 | 头文件\Render 68 | 69 | 70 | 头文件\Render 71 | 72 | 73 | 头文件\Render 74 | 75 | 76 | 头文件\Render 77 | 78 | 79 | 头文件\Render 80 | 81 | 82 | 头文件\Render 83 | 84 | 85 | 头文件 86 | 87 | 88 | 头文件\Effect 89 | 90 | 91 | 头文件\Effect 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | {3952c476-cabb-4540-85f7-1e61009bb320} 101 | 102 | 103 | {0404efaa-f838-435a-a592-35c48d478ed4} 104 | 105 | 106 | {0d12cfca-e0f7-451b-b3ce-713fb1202715} 107 | 108 | 109 | {9f2b3932-bd6a-460e-bc28-6d02b8a56bf2} 110 | 111 | 112 | {7aeace38-38c9-4406-9075-effd6b4c0381} 113 | 114 | 115 | {6b867004-a0fd-4e2b-aa28-8fffcbdc9fbe} 116 | 117 | 118 | {45015676-99ea-4ea3-9c14-3bc0e0130a34} 119 | 120 | 121 | 122 | 123 | 着色器 124 | 125 | 126 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041FeatureMap2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1) feature map 2 2 | 3 | 4 | cbuffer constants : register(b0) { 5 | int2 srcSize : packoffset(c0.x); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 1 10 | #include "common.hlsli" 11 | 12 | 13 | D2D_PS_ENTRY(main) { 14 | InitMagpieSampleInput(); 15 | 16 | float left1X = max(0, Coord(0).x - Coord(0).z); 17 | float left2X = max(0, left1X - Coord(0).z); 18 | float right1X = min(maxCoord0.x, Coord(0).x + Coord(0).z); 19 | float right2X = min(maxCoord0.x, right1X + Coord(0).z); 20 | float top1Y = max(0, Coord(0).y - Coord(0).w); 21 | float top2Y = max(0, top1Y - Coord(0).w); 22 | float bottom1Y = min(maxCoord0.y, Coord(0).y + Coord(0).w); 23 | float bottom2Y = min(maxCoord0.y, bottom1Y + Coord(0).w); 24 | 25 | float4 res = { 0.0541447550058365,0.0088306749239564,-0.0112389577552676,-0.0127860950306058 }; 26 | res += float4(0.0142660010606050, 0.0137931071221828, 0.0061188107356429, -0.0104134222492576) 27 | * SampleInput(0, float2(left2X, top2Y)).x; 28 | res += float4(0.0147292809560895, -0.0289912857115269, 0.0266769435256720, 0.0933856964111328) 29 | * SampleInput(0, float2(left2X, top1Y)).x; 30 | res += float4(-0.1734338253736496, 0.1116316691040993, -0.1973157376050949, -0.0581855811178684) 31 | * SampleInput(0, float2(left2X, Coord(0).y)).x; 32 | res += float4(0.0347507223486900, -0.0341566652059555, 0.0061667622067034, 0.0075258882716298) 33 | * SampleInput(0, float2(left2X, bottom1Y)).x; 34 | res += float4(0.0069884369149804, -0.0194250214844942, 0.0080830128863454, -0.0036874092184007) 35 | * SampleInput(0, float2(left2X, bottom2Y)).x; 36 | res += float4(0.0233764201402664, 0.0344744995236397, 0.0162145942449570, 0.0979529991745949) 37 | * SampleInput(0, float2(left1X, top2Y)).x; 38 | res += float4(0.1280796974897385, -0.1018339172005653, -0.0132977198809385, -0.0019474622095004) 39 | * SampleInput(0, float2(left1X, top1Y)).x; 40 | res += float4(0.4286882579326630, 0.1222677752375603, 0.7046694159507751, 0.0945475697517395) 41 | * SampleInput(0, float2(left1X, Coord(0).y)).x; 42 | res += float4(0.1107441782951355, -0.0134433070197701, -0.0174900908023119, -0.1686445474624634) 43 | * SampleInput(0, float2(left1X, bottom1Y)).x; 44 | res += float4(0.0321478620171547, 0.0065357843413949, 0.0300805997103453, 0.0420113280415535) 45 | * SampleInput(0, float2(left1X, bottom2Y)).x; 46 | res += float4(-0.1240341588854790, 0.0950303301215172, -0.0129648456349969, -0.2681856453418732) 47 | * SampleInput(0, float2(Coord(0).x, top2Y)).x; 48 | res += float4(0.4846960902214050, 0.0351924635469913, 0.0223043337464333, -0.1273630708456039) 49 | * SampleInput(0, float2(Coord(0).x, top1Y)).x; 50 | res += float4(-1.9379507303237915, -0.2444442063570023, 0.0291962660849094, -0.3835578560829163) 51 | * SampleInputCur(0).x; 52 | res += float4(0.6396278142929077, -0.0765938311815262, -0.0552659817039967, 0.4393545985221863) 53 | * SampleInput(0, float2(Coord(0).x, bottom1Y)).x; 54 | res += float4(-0.1969728022813797, -0.0607173256576061, 0.0131113547831774, 0.0542017817497253) 55 | * SampleInput(0, float2(Coord(0).x, bottom2Y)).x; 56 | res += float4(0.0091696009039879, -0.0031533432193100, -0.0368777588009834, -0.0459998287260532) 57 | * SampleInput(0, float2(right1X, top2Y)).x; 58 | res += float4(0.1096992492675781, 0.2597902715206146, 0.0304869692772627, -0.0195200722664595) 59 | * SampleInput(0, float2(right1X, top1Y)).x; 60 | res += float4(0.2889648377895355, -0.4275591969490051, -0.7414156794548035, 0.2695442438125610) 61 | * SampleInput(0, float2(right1X, Coord(0).y)).x; 62 | res += float4(0.0892018377780914, -0.0229137558490038, 0.0244414471089840, -0.1926898956298828) 63 | * SampleInput(0, float2(right1X, bottom1Y)).x; 64 | res += float4(0.0576358586549759, 0.0027846973389387, -0.0036861505359411, -0.0253547113388777) 65 | * SampleInput(0, float2(right1X, bottom2Y)).x; 66 | res += float4(0.0159624069929123, 0.0319602824747562, 0.0019470085389912, 0.0089780492708087) 67 | * SampleInput(0, float2(right2X, top2Y)).x; 68 | res += float4(0.0552792511880398, 0.0543054342269897, 0.0134062822908163, 0.0545728243887424) 69 | * SampleInput(0, float2(right2X, top1Y)).x; 70 | res += float4(-0.1170092225074768, 0.1963327825069427, 0.1503890156745911, 0.1891828328371048) 71 | * SampleInput(0, float2(right2X, Coord(0).y)).x; 72 | res += float4(-0.0084421783685684, 0.1297017931938171, -0.0330600887537003, -0.0942063704133034) 73 | * SampleInput(0, float2(right2X, bottom1Y)).x; 74 | res += float4(0.0118440408259630, -0.0337875857949257, 0.0055063469335437, 0.0254479162395000) 75 | * SampleInput(0, float2(right2X, bottom2Y)).x; 76 | 77 | return compressLinear(res, -2, 2); 78 | } 79 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041FeatureMap1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1) feature map 1 2 | 3 | 4 | cbuffer constants : register(b0) { 5 | int2 srcSize : packoffset(c0.x); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 1 10 | #include "common.hlsli" 11 | 12 | 13 | D2D_PS_ENTRY(main) { 14 | InitMagpieSampleInput(); 15 | 16 | float left1X = max(0, Coord(0).x - Coord(0).z); 17 | float left2X = max(0, left1X - Coord(0).z); 18 | float right1X = min(maxCoord0.x, Coord(0).x + Coord(0).z); 19 | float right2X = min(maxCoord0.x, right1X + Coord(0).z); 20 | float top1Y = max(0, Coord(0).y - Coord(0).w); 21 | float top2Y = max(0, top1Y - Coord(0).w); 22 | float bottom1Y = min(maxCoord0.y, Coord(0).y + Coord(0).w); 23 | float bottom2Y = min(maxCoord0.y, bottom1Y + Coord(0).w); 24 | 25 | float4 res = { -0.1572492271661758, -0.0120896836742759, 0.0061487639322877, -0.2852848768234253 }; 26 | res += float4(-0.0047900392673910, 0.0537447109818459, -0.0000247144635068, 0.0066653941757977) 27 | * SampleInput(0, float2(left2X, top2Y)).x; 28 | res += float4(0.0073144687339664, -0.0309004038572311, -0.0109181385487318, -0.0092840325087309) 29 | * SampleInput(0, float2(left2X, top1Y)).x; 30 | res += float4(0.0591700896620750, 0.1974907070398331, -0.0197357516735792, -0.0546554848551750) 31 | * SampleInput(0, float2(left2X, Coord(0).y)).x; 32 | res += float4(-0.0011764382943511, -0.0299451071768999, 0.0229587312787771, 0.0021908886265010) 33 | * SampleInput(0, float2(left2X, bottom1Y)).x; 34 | res += float4(0.0098101310431957, 0.0080995410680771, -0.0030452020000666, -0.0132035519927740) 35 | * SampleInput(0, float2(left2X, bottom2Y)).x; 36 | res += float4(-0.0168330334126949, -0.0743711441755295, -0.0259261634200811, 0.0234480481594801) 37 | * SampleInput(0, float2(left1X, top2Y)).x; 38 | res += float4(0.0239933785051107, 0.1896541714668274, 0.0207756329327822, -0.0370332375168800) 39 | * SampleInput(0, float2(left1X, top1Y)).x; 40 | res += float4(0.0094799501821399, -0.0652511194348335, -0.0004292793164495, -0.0726212188601494) 41 | * SampleInput(0, float2(left1X, Coord(0).y)).x; 42 | res += float4(0.0297284796833992, -0.1210186630487442, -0.0202929321676493, -0.0574462898075581) 43 | * SampleInput(0, float2(left1X, bottom1Y)).x; 44 | res += float4(-0.0318185277283192, 0.0840775370597839, 0.0110451309010386, 0.0415569432079792) 45 | * SampleInput(0, float2(left1X, bottom2Y)).x; 46 | res += float4(-0.0253141783177853, 0.1168256178498268, 0.1159729585051537, 0.0963164269924164) 47 | * SampleInput(0, float2(Coord(0).x, top2Y)).x; 48 | res += float4(-0.1103615835309029, -0.0276833958923817, -0.4999594092369080, 0.1053867191076279) 49 | * SampleInput(0, float2(Coord(0).x, top1Y)).x; 50 | res += float4(1.1100435256958008, 0.0646764487028122, 0.0154005717486143, 0.8891586661338806) 51 | * SampleInputCur(0).x; 52 | res += float4(0.1229330673813820, 0.1719468832015991, 0.5730338096618652, -0.1645544171333313) 53 | * SampleInput(0, float2(Coord(0).x, bottom1Y)).x; 54 | res += float4(-0.0090442728251219, -0.3023961782455444, -0.1589493155479431, 0.0418574027717113) 55 | * SampleInput(0, float2(Coord(0).x, bottom2Y)).x; 56 | res += float4(0.0031942036002874, -0.1310926079750061, 0.0075543406419456, -0.0016449346439913) 57 | * SampleInput(0, float2(right1X, top2Y)).x; 58 | res += float4(-0.0995150282979012, -0.0701921209692955, -0.0130895879119635, 0.1344170123338699) 59 | * SampleInput(0, float2(right1X, top1Y)).x; 60 | res += float4(0.0060519003309309, -0.1533465683460236, 0.0114194005727768, 0.0264683905988932) 61 | * SampleInput(0, float2(right1X, Coord(0).y)).x; 62 | res += float4(0.0244008023291826, 0.1881769001483917, -0.0206351149827242, -0.0628309547901154) 63 | * SampleInput(0, float2(right1X, bottom1Y)).x; 64 | res += float4(0.0075713125988841, 0.0508594363927841, 0.0430423170328140, -0.0124188791960478) 65 | * SampleInput(0, float2(right1X, bottom2Y)).x; 66 | res += float4(-0.0166875869035721, -0.0047865519300103, 0.0006719123339280, 0.0316803231835365) 67 | * SampleInput(0, float2(right2X, top2Y)).x; 68 | res += float4(-0.0058461269363761, 0.0990798473358154, -0.0177743826061487, -0.0066122291609645) 69 | * SampleInput(0, float2(right2X, top1Y)).x; 70 | res += float4(-0.0972401946783066, -0.0225446373224258, -0.0037693574558944, 0.1953062713146210) 71 | * SampleInput(0, float2(right2X, Coord(0).y)).x; 72 | res += float4(-0.0216837190091610, -0.1824268400669098, 0.0069816261529922, 0.0283037684857845) 73 | * SampleInput(0, float2(right2X, bottom1Y)).x; 74 | res += float4(-0.0025767991319299, 0.0459827110171318, -0.0080216089263558, 0.0084134787321091) 75 | * SampleInput(0, float2(right2X, bottom2Y)).x; 76 | 77 | return compressLinear(res, -1, 1.5); 78 | } 79 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041LineArtFeatureMap1Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1_LA) feature map 1 2 | 3 | 4 | cbuffer constants : register(b0) { 5 | int2 srcSize : packoffset(c0.x); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 1 10 | #include "common.hlsli" 11 | 12 | 13 | D2D_PS_ENTRY(main) { 14 | InitMagpieSampleInput(); 15 | 16 | float left1X = max(0, Coord(0).x - Coord(0).z); 17 | float left2X = max(0, left1X - Coord(0).z); 18 | float right1X = min(maxCoord0.x, Coord(0).x + Coord(0).z); 19 | float right2X = min(maxCoord0.x, right1X + Coord(0).z); 20 | float top1Y = max(0, Coord(0).y - Coord(0).w); 21 | float top2Y = max(0, top1Y - Coord(0).w); 22 | float bottom1Y = min(maxCoord0.y, Coord(0).y + Coord(0).w); 23 | float bottom2Y = min(maxCoord0.y, bottom1Y + Coord(0).w); 24 | 25 | float4 res = { -0.3117050230503082,0.1817725896835327,0.0011673698900267,-0.0044658286496997 }; 26 | res += float4(-0.0187959559261799, -0.0206312909722328, 0.0226501729339361, 0.0111862262710929) 27 | * SampleInput(0, float2(left2X, top2Y)).x; 28 | res += float4(0.0469042696058750, 0.0428658165037632, -0.0208927169442177, -0.0053485808894038) 29 | * SampleInput(0, float2(left2X, top1Y)).x; 30 | res += float4(0.0486242026090622, 0.0268428903073072, -0.1095351055264473, -0.0197027549147606) 31 | * SampleInput(0, float2(left2X, Coord(0).y)).x; 32 | res += float4(-0.0301427692174911, -0.0444439016282558, 0.0803908482193947, -0.0072240661829710) 33 | * SampleInput(0, float2(left2X, bottom1Y)).x; 34 | res += float4(0.0097448397427797, 0.0132117131724954, -0.0087575586512685, 0.0003270092420280) 35 | * SampleInput(0, float2(left2X, bottom2Y)).x; 36 | res += float4(0.0227436870336533, 0.0284603293985128, -0.0899902656674385, 0.0174379274249077) 37 | * SampleInput(0, float2(left1X, top2Y)).x; 38 | res += float4(-0.0880827009677887, -0.0890802741050720, 0.3386772871017456, -0.0749290063977242) 39 | * SampleInput(0, float2(left1X, top1Y)).x; 40 | res += float4(-0.0832799598574638, -0.1518420130014420, 0.1693033277988434, 0.1514045447111130) 41 | * SampleInput(0, float2(left1X, Coord(0).y)).x; 42 | res += float4(0.0490957386791706, 0.0839962288737297, 0.0323486365377903, -0.0491475425660610) 43 | * SampleInput(0, float2(left1X, bottom1Y)).x; 44 | res += float4(0.0281097982078791, 0.0267692077904940, -0.0460123419761658, 0.0137899341061711) 45 | * SampleInput(0, float2(left1X, bottom2Y)).x; 46 | res += float4(0.0592067055404186, -0.0008030450553633, 0.1280025541782379, -0.0270480886101723) 47 | * SampleInput(0, float2(Coord(0).x, top2Y)).x; 48 | res += float4(-0.0784756019711494, -0.0078630214557052, -0.1963789612054825, 0.2132134586572647) 49 | * SampleInput(0, float2(Coord(0).x, top1Y)).x; 50 | res += float4(0.9478371739387512, -0.7432878613471985, -0.4691794812679291, -0.4196422100067139) 51 | * SampleInputCur(0).x; 52 | res += float4(0.1578149050474167, -0.0874812081456184, 0.1223142221570015, 0.2514914274215698) 53 | * SampleInput(0, float2(Coord(0).x, bottom1Y)).x; 54 | res += float4(0.0576529577374458, 0.0775778889656067, 0.0526014007627964, -0.1151828765869141) 55 | * SampleInput(0, float2(Coord(0).x, bottom2Y)).x; 56 | res += float4(-0.0459806136786938, -0.0550342053174973, -0.0553226508200169, -0.0042642662301660) 57 | * SampleInput(0, float2(right1X, top2Y)).x; 58 | res += float4(0.1346504986286163, 0.1795998811721802, -0.0741422399878502, -0.0004661275597755) 59 | * SampleInput(0, float2(right1X, top1Y)).x; 60 | res += float4(-0.0344312079250813, -0.0998986735939980, 0.2834288179874420, 0.1789152175188065) 61 | * SampleInput(0, float2(right1X, Coord(0).y)).x; 62 | res += float4(-0.0376542955636978, -0.0137260686606169, -0.2183600962162018, -0.0829529240727425) 63 | * SampleInput(0, float2(right1X, bottom1Y)).x; 64 | res += float4(0.0143303163349628, 0.0085790483281016, 0.0312815308570862, 0.0557830408215523) 65 | * SampleInput(0, float2(right1X, bottom2Y)).x; 66 | res += float4(0.0196402054280043, 0.0245775021612644, 0.0333996489644051, 0.0064323167316616) 67 | * SampleInput(0, float2(right2X, top2Y)).x; 68 | res += float4(-0.0247105974704027, -0.0139399459585547, 0.0039188005030155, 0.0138866743072867) 69 | * SampleInput(0, float2(right2X, top1Y)).x; 70 | res += float4(0.0688862130045891, 0.0629303157329559, -0.0323157459497452, -0.1300792843103409) 71 | * SampleInput(0, float2(right2X, Coord(0).y)).x; 72 | res += float4(0.0111092608422041, 0.0116711426526308, 0.0460555553436279, 0.0563828162848949) 73 | * SampleInput(0, float2(right2X, bottom1Y)).x; 74 | res += float4(-0.0043270774185658, -0.0096766958013177, -0.0235258601605892, -0.0409700050950050) 75 | * SampleInput(0, float2(right2X, bottom2Y)).x; 76 | 77 | return compressLinear(res, -1, 1.5); 78 | } 79 | -------------------------------------------------------------------------------- /MODULE_FSRCNNX/FSRCNNX8041LineArtFeatureMap2Shader.hlsl: -------------------------------------------------------------------------------- 1 | // (FSRCNNX_x2_8-0-4-1_LA) feature map 2 2 | 3 | 4 | cbuffer constants : register(b0) { 5 | int2 srcSize : packoffset(c0.x); 6 | }; 7 | 8 | 9 | #define MAGPIE_INPUT_COUNT 1 10 | #include "common.hlsli" 11 | 12 | 13 | D2D_PS_ENTRY(main) { 14 | InitMagpieSampleInput(); 15 | 16 | float left1X = max(0, Coord(0).x - Coord(0).z); 17 | float left2X = max(0, left1X - Coord(0).z); 18 | float right1X = min(maxCoord0.x, Coord(0).x + Coord(0).z); 19 | float right2X = min(maxCoord0.x, right1X + Coord(0).z); 20 | float top1Y = max(0, Coord(0).y - Coord(0).w); 21 | float top2Y = max(0, top1Y - Coord(0).w); 22 | float bottom1Y = min(maxCoord0.y, Coord(0).y + Coord(0).w); 23 | float bottom2Y = min(maxCoord0.y, bottom1Y + Coord(0).w); 24 | 25 | float4 res = { 0.0165165197104216,0.0061719734221697,-0.0008248710073531,-0.0774794667959213 }; 26 | res += float4(-0.0127812735736370, -0.0146999256685376, 0.0025963818188757, 0.0008133125957102) 27 | * SampleInput(0, float2(left2X, top2Y)).x; 28 | res += float4(0.0192508958280087, 0.0089628640562296, 0.0046624913811684, -0.0005601323791780) 29 | * SampleInput(0, float2(left2X, top1Y)).x; 30 | res += float4(-0.1021092385053635, -0.0491660982370377, -0.0818324312567711, -0.0719010531902313) 31 | * SampleInput(0, float2(left2X, Coord(0).y)).x; 32 | res += float4(0.0166876111179590, -0.0046075899153948, 0.0258100070059299, -0.0235325042158365) 33 | * SampleInput(0, float2(left2X, bottom1Y)).x; 34 | res += float4(-0.0028500237967819, -0.0020616643596441, -0.0073093594983220, -0.0034190006554127) 35 | * SampleInput(0, float2(left2X, bottom2Y)).x; 36 | res += float4(0.0024815262295306, 0.0222324915230274, -0.0080765523016453, 0.0105959763750434) 37 | * SampleInput(0, float2(left1X, top2Y)).x; 38 | res += float4(0.1017390340566635, 0.0138921840116382, 0.0559288635849953, -0.0168517548590899) 39 | * SampleInput(0, float2(left1X, top1Y)).x; 40 | res += float4(0.1267367750406265, -0.2365809977054596, 0.4724994897842407, -0.0154752098023891) 41 | * SampleInput(0, float2(left1X, Coord(0).y)).x; 42 | res += float4(0.0847241580486298, 0.1127829849720001, -0.0643212646245956, 0.0177757386118174) 43 | * SampleInput(0, float2(left1X, bottom1Y)).x; 44 | res += float4(-0.0354492329061031, -0.0234994646161795, 0.0336676724255085, 0.0153558924794197) 45 | * SampleInput(0, float2(left1X, bottom2Y)).x; 46 | res += float4(-0.1001686528325081, 0.0175829399377108, -0.0146998856216669, -0.0897502079606056) 47 | * SampleInput(0, float2(Coord(0).x, top2Y)).x; 48 | res += float4(0.0973328053951263, -0.5987607836723328, -0.0770601108670235, 0.2343221157789230) 49 | * SampleInput(0, float2(Coord(0).x, top1Y)).x; 50 | res += float4(-1.0639246702194214, 0.5335622429847717, -0.2365868240594864, 0.6484431028366089) 51 | * SampleInputCur(0).x; 52 | res += float4(-0.0258918590843678, 0.1439655423164368, 0.2597847878932953, -0.5380389094352722) 53 | * SampleInput(0, float2(Coord(0).x, bottom1Y)).x; 54 | res += float4(0.0333042629063129, -0.0408495217561722, 0.0026879014912993, 0.0496195442974567) 55 | * SampleInput(0, float2(Coord(0).x, bottom2Y)).x; 56 | res += float4(0.0017764334334061, 0.0032939016819000, -0.0121603077277541, -0.0066827093251050) 57 | * SampleInput(0, float2(right1X, top2Y)).x; 58 | res += float4(0.0497846752405167, 0.0766935721039772, 0.0505562871694565, 0.0058483541943133) 59 | * SampleInput(0, float2(right1X, top1Y)).x; 60 | res += float4(0.6903248429298401, 0.0658241882920265, -0.4562527537345886, -0.0117225451394916) 61 | * SampleInput(0, float2(right1X, Coord(0).y)).x; 62 | res += float4(0.1896255612373352, -0.0459045991301537, -0.0380226671695709, -0.0333303771913052) 63 | * SampleInput(0, float2(right1X, bottom1Y)).x; 64 | res += float4(-0.0868696048855782, 0.0157926902174950, 0.0011628456413746, 0.0207170285284519) 65 | * SampleInput(0, float2(right1X, bottom2Y)).x; 66 | res += float4(0.0130701754242182, -0.0067251212894917, -0.0007082104566507, -0.0017002354143187) 67 | * SampleInput(0, float2(right2X, top2Y)).x; 68 | res += float4(0.0029672298114747, -0.0060487915761769, 0.0191176552325487, 0.0520425662398338) 69 | * SampleInput(0, float2(right2X, top1Y)).x; 70 | res += float4(-0.0253955777734518, -0.0159530192613602, 0.0304108783602715, -0.0263646803796291) 71 | * SampleInput(0, float2(right2X, Coord(0).y)).x; 72 | res += float4(-0.0708072409033775, 0.0109798992052674, 0.0285820439457893, 0.0188453849405050) 73 | * SampleInput(0, float2(right2X, bottom1Y)).x; 74 | res += float4(0.0698847994208336, -0.0164128411561251, 0.0043246182613075, -0.0244176983833313) 75 | * SampleInput(0, float2(right2X, bottom2Y)).x; 76 | 77 | return compressLinear(res, -1, 1); 78 | } 79 | -------------------------------------------------------------------------------- /MODULE_SSIM/DllMain.cpp: -------------------------------------------------------------------------------- 1 | // dllmain.cpp : 定义 DLL 应用程序的入口点。 2 | #include "pch.h" 3 | #include 4 | #include "EffectDefines.h" 5 | #include "SSimDownscalerEffect.h" 6 | #include "SSimSuperResEffect.h" 7 | #include 8 | 9 | 10 | HRESULT CreateSSimDownscalerEffect( 11 | ID2D1Factory1* d2dFactory, 12 | ID2D1DeviceContext* d2dDC, 13 | const nlohmann::json& props, 14 | float fillScale, 15 | std::pair& scale, 16 | ComPtr& effect 17 | ) { 18 | bool isRegistered; 19 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_SSIM_DOWNSCALER_EFFECT, isRegistered); 20 | if (FAILED(hr)) { 21 | return hr; 22 | } 23 | 24 | if (!isRegistered) { 25 | hr = SSimDownscalerEffect::Register(d2dFactory); 26 | if (FAILED(hr)) { 27 | return hr; 28 | } 29 | } 30 | 31 | ComPtr result; 32 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_SSIM_DOWNSCALER_EFFECT, &result); 33 | if (FAILED(hr)) { 34 | return hr; 35 | } 36 | 37 | std::pair scaleResult(1.0f, 1.0f); 38 | // scale 属性 39 | auto it = props.find("scale"); 40 | if (it != props.end()) { 41 | hr = EffectUtils::ReadScaleProp(*it, fillScale, scale, scaleResult); 42 | if (FAILED(hr)) { 43 | return hr; 44 | } 45 | 46 | hr = result->SetValue( 47 | SSimDownscalerEffect::PROP_SCALE, 48 | D2D1_VECTOR_2F{ scaleResult.first, scaleResult.second } 49 | ); 50 | if (FAILED(hr)) { 51 | return hr; 52 | } 53 | } 54 | 55 | // DownScaleEffect 属性 56 | hr = SSimDownscalerEffect::CreateAndSetDownScaleEffect(result.Get(), d2dFactory, d2dDC, scaleResult); 57 | if (FAILED(hr)) { 58 | return hr; 59 | } 60 | 61 | effect = std::move(result); 62 | scale.first *= scaleResult.first; 63 | scale.second *= scaleResult.second; 64 | return S_OK; 65 | } 66 | 67 | HRESULT CreateSSimSuperResEffect( 68 | ID2D1Factory1* d2dFactory, 69 | ID2D1DeviceContext* d2dDC, 70 | IWICImagingFactory2* wicImgFactory, 71 | const nlohmann::json& props, 72 | float fillScale, 73 | std::pair& scale, 74 | ComPtr& effect 75 | ) { 76 | bool isRegistered; 77 | HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_SSIM_SUPERRES_EFFECT, isRegistered); 78 | if (FAILED(hr)) { 79 | return hr; 80 | } 81 | 82 | if (!isRegistered) { 83 | hr = SSimSuperResEffect::Register(d2dFactory); 84 | if (FAILED(hr)) { 85 | return hr; 86 | } 87 | } 88 | 89 | ComPtr result; 90 | hr = d2dDC->CreateEffect(CLSID_MAGPIE_SSIM_SUPERRES_EFFECT, &result); 91 | if (FAILED(hr)) { 92 | return hr; 93 | } 94 | 95 | // upScaleEffect 属性 96 | auto it = props.find("upScaleEffect"); 97 | if (it == props.end()) { 98 | return E_INVALIDARG; 99 | } 100 | 101 | const auto& moduleName = it->value("module", ""); 102 | if (moduleName.empty()) { 103 | return E_INVALIDARG; 104 | } 105 | 106 | std::wstring moduleNameW; 107 | hr = EffectUtils::UTF8ToUTF16(moduleName, moduleNameW); 108 | 109 | HMODULE dll = LoadLibrary((boost::wformat(L"effects\\%1%") % moduleNameW).str().c_str()); 110 | if (!dll) { 111 | return E_INVALIDARG; 112 | } 113 | 114 | using EffectCreateFunc = HRESULT( 115 | ID2D1Factory1* d2dFactory, 116 | ID2D1DeviceContext* d2dDC, 117 | IWICImagingFactory2* wicImgFactory, 118 | const nlohmann::json& props, 119 | float fillScale, 120 | std::pair& scale, 121 | ComPtr& effect 122 | ); 123 | auto createEffect = (EffectCreateFunc*)GetProcAddress(dll, "CreateEffect"); 124 | if (createEffect == NULL) { 125 | return E_FAIL; 126 | } 127 | 128 | std::pair scaleResult = scale; // 缩放倍率为 upScaleEffect 的缩放倍率 129 | ComPtr upScaleEffect; 130 | hr = createEffect(d2dFactory, d2dDC, wicImgFactory, *it, fillScale, scaleResult, upScaleEffect); 131 | if (FAILED(hr)) { 132 | return hr; 133 | } 134 | 135 | hr = result->SetValue(SSimSuperResEffect::PROP_UP_SCALE_EFFECT, upScaleEffect.Get()); 136 | if (FAILED(hr)) { 137 | return hr; 138 | } 139 | 140 | effect = std::move(result); 141 | scale.first *= scaleResult.first; 142 | scale.second *= scaleResult.second; 143 | return S_OK; 144 | } 145 | 146 | API_DECLSPEC HRESULT CreateEffect( 147 | ID2D1Factory1* d2dFactory, 148 | ID2D1DeviceContext* d2dDC, 149 | IWICImagingFactory2* wicImgFactory, 150 | const nlohmann::json& props, 151 | float fillScale, 152 | std::pair& scale, 153 | ComPtr& effect 154 | ) { 155 | const auto& e = props.value("effect", ""); 156 | if (e == "SSimDownscaler") { 157 | return CreateSSimDownscalerEffect(d2dFactory, d2dDC, props, fillScale, scale, effect); 158 | } else if (e == "SSimSuperRes") { 159 | return CreateSSimSuperResEffect(d2dFactory, d2dDC, wicImgFactory, props, fillScale, scale, effect); 160 | } else { 161 | return E_INVALIDARG; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /docs/自定义缩放.md: -------------------------------------------------------------------------------- 1 | # 自定义缩放 2 | 3 | 本文档指导您如何定义自己的缩放模式。 4 | 5 | Magpie启动时会在所在目录搜索ScaleModels.json,如果未找到则会创建一个默认的。默认的ScaleModels.json内容如下: 6 | 7 | ```json 8 | [ 9 | { 10 | "name": "Lanczos", 11 | "model": [ 12 | { 13 | "module": "Common", 14 | "effect": "lanczos", 15 | "scale": [ -1, -1 ], 16 | "ARStrength": 0.7 17 | }, 18 | { 19 | "module": "Common", 20 | "effect": "adaptiveSharpen", 21 | "curveHeight": 0.6 22 | } 23 | ] 24 | }, 25 | { 26 | "name": "RAVU", 27 | "model": [ 28 | { 29 | "module": "RAVU", 30 | "effect": "RAVUZoom", 31 | "scale": [ -1, -1 ] 32 | }, 33 | { 34 | "module": "Anime4K", 35 | "effect": "denoiseBilateral", 36 | "variant": "mode" 37 | } 38 | ] 39 | }, 40 | { 41 | "...": "..." 42 | } 43 | ] 44 | ``` 45 | 46 | ScaleModels.json的根元素是一个数组,其中的每个成员都是一个缩放模型。name属性是显示的名字,model属性是缩放模型的定义,缩放模型由一系列的effect堆叠而成,Magpie在缩放时会逐个应用这些effect。 47 | 48 | Magpie提供了大量effect供组合使用,它们以模块为单位在运行时动态加载。大部分effect提供了参数选项以订制行为。 49 | 50 | 很多缩放效果支持scale参数,它的值必须是有两个元素的数组。当它们为正数时,表示长和高的缩放比例;为负数时则表示相对于屏幕能容纳的最大等比缩放的比例。例如值[-1, -1]表示等比缩放到屏幕能容纳的最大大小,[-0.5, -0.5]表示缩放到[-1, -1]的一半大小。在示例中可以看到它们的应用。 51 | 52 | ### Common 53 | 54 | Common模块包含以下效果: 55 | 56 | 1. sharpen:使用Direct2D内置的锐化算法锐化输入。 57 | * 参数 58 | * sharpness:锐化强度。必须在0~10之间。默认值为0。 59 | * threshold:锐化阈值。必须在0~1之间。默认值为0。 60 | 2. adaptiveSharpen:自适应锐化算法。此算法着重于锐化图像中的模糊边缘,因此相比一般的锐化算法噪点、振铃和条纹更少。 61 | * 参数 62 | * curveHeight:锐化强度。必须大于零,一般在0.3~2.0之间。默认值为0.3。 63 | 3. CAS:对比度自适应锐化算法。自适应锐化青春版。 64 | * 参数 65 | * sharpness:锐化强度。必须在0-1之间。默认值为0.4。 66 | 4. lanczos:使用Lanczos算法缩放输入。 67 | * 参数 68 | * scale:缩放比例,值必须是有两个元素的数组。 69 | * ARStrength:抗震铃强度。值越大抗震铃效果越好,但图像越模糊。必须在0到1之间。默认值为0.5。 70 | 5. mitchell:使用Mitchell-Netravali算法缩放输入。用于缩小时效果最佳。 71 | * 参数 72 | * scale:缩放比例,值必须是有两个元素的数组。 73 | * variant:指定使用的变体: 74 | * "mitchell":mitchell原版。默认值。 75 | * "catrom":比mitchell更锐利。 76 | * "sharper":更为锐利,可能有更好的视觉效果。Photoshop使用此参数。 77 | 6. pixel:将图像中每个像素进行整数倍放大。可以完整保留原始图像的信息,但只能放大到整数倍。适用于输入图像较小的情况。 78 | * 参数 79 | * scale:缩放比例,和其他缩放算法不同,此值必须是正整数,因为图像尺寸只能等比例整数倍放大。默认值为1。 80 | 81 | ### ACNet 82 | 83 | ACNet模块仅包含一个效果,使用时无需指定effect名。ACNet固定的将输入放大至两倍。 84 | 85 | ### Anime4K 86 | 87 | Anime4K模块包含以下效果: 88 | 89 | 1. Anime4K:[Anime4K](https://github.com/bloc97/Anime4K) v3.1 的移植,支持降噪变体。内置了自适应锐化,可以产生更好的视觉效果。固定的将输入放大至两倍。 90 | * 参数 91 | * curveHeight:自适应锐化强度。0表示不锐化,否则必须为正数,一般在0.3~2.0之间。默认值为0。 92 | * useDenoiseVersion:使用降噪版本的Anime4K,在有轻微噪点的情况下表现良好,因此推荐使用。默认值为false。 93 | 2. darkLines:Anime4K提供的加深线条的算法。 94 | * 参数 95 | * strength:加深强度。必须大于零。默认值为1。 96 | 3. thinLines:Anime4K提供的细化线条的算法。 97 | * 参数 98 | * strength:细化强度。必须大于零。默认值为0.3。 99 | 4. denoiseBilateral:Anime4K提供的降噪算法。 100 | * 参数 101 | * variant:指定使用的变体 102 | * "mode":bilateral mode filter。默认值。 103 | * "median":bilateral median filter。 104 | * "mean":bilateral mean filter。 105 | * intensity:降噪强度。必须大于零。默认值为0.1。 106 | 107 | ### FSRCNNX 108 | 109 | FARCNNX模块包含以下效果: 110 | 111 | 1. FSRCNNX:FSRCNNX_x2_8-0-4-1的移植。固定的将输入放大至两倍。 112 | 2. FSRCNNXLineArt:FSRCNNX_x2_8-0-4-1_LineArt的移植。固定的将输入放大至两倍。 113 | 114 | ### RAVU 115 | 116 | RAVU模块包含以下效果: 117 | 118 | 1. RAVULite:ravu-lite-r3的移植。固定的将输入放大至两倍。 119 | 2. RAVUZoom:ravu-zoom-r3的移植。支持任意倍数的缩放。 120 | * 参数 121 | * scale:缩放比例,值必须是有两个元素的数组。 122 | 123 | ### SSIM 124 | 125 | SSIM模块包含以下效果: 126 | 127 | 1. SSimDownscaler:基于感知的图像缩小算法,比catrom更锐利。此效果依赖于Common模块。 128 | 129 | * 参数 130 | * scale:缩放比例,值必须是有两个元素的数组。 131 | 132 | 2. SSimSuperRes:基于感知的图像放大算法,可对嵌套的缩放算法进行增强。 133 | 134 | * 参数 135 | 136 | * upScaleEffect:嵌套的缩放效果。它的缩放倍率决定了SSimSuperRes的缩放倍率。 137 | 138 | * 示例 139 | 140 | 以下片段演示了SSimSuperRes对Lanczos算法的增强。 141 | 142 | ```json 143 | { 144 | "module": "SSIM", 145 | "effect": "SSimSuperRes", 146 | "upScaleEffect": { 147 | "module": "Common", 148 | "effect": "lanczos", 149 | "scale": [-1, -1] 150 | } 151 | } 152 | ``` 153 | 154 | 155 | 156 | ## 示例 157 | 158 | 如果屏幕大小是源窗口的2-4倍,可以应用两次Anime4K,下面的片段演示了这个算法。 159 | 160 | ```json 161 | { 162 | "name": "动漫 4x", 163 | "model": [ 164 | { 165 | "module": "Anime4K", 166 | "effect": "Anime4K", 167 | "curveHeight": 0.3, 168 | "useDenoiseVersion": true 169 | }, 170 | { 171 | "module": "Common", 172 | "effect": "mitchell", 173 | "scale": [ -0.5, -0.5 ], 174 | "variant": "catrom" 175 | }, 176 | { 177 | "module": "Anime4K", 178 | "effect": "Anime4K", 179 | "curveHeight": 0.3 180 | } 181 | ] 182 | } 183 | ``` 184 | 185 | 为了提升性能,在应用第一次Anime4K后缩放到屏幕能容纳的最大等比缩放的比例的一半大小,这样在第二次应用Anim4K后刚好全屏显示。为了消除图像中的轻微噪点,第一次使用的Anime4K为降噪版本。 -------------------------------------------------------------------------------- /MODULE_FSRCNNX/MODULE_FSRCNNX.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 头文件 26 | 27 | 28 | 头文件 29 | 30 | 31 | 32 | 33 | 源文件 34 | 35 | 36 | 源文件 37 | 38 | 39 | 40 | 41 | 着色器 42 | 43 | 44 | 着色器 45 | 46 | 47 | 着色器 48 | 49 | 50 | 着色器 51 | 52 | 53 | 着色器 54 | 55 | 56 | 着色器 57 | 58 | 59 | 着色器 60 | 61 | 62 | 着色器 63 | 64 | 65 | 着色器 66 | 67 | 68 | 着色器 69 | 70 | 71 | 着色器 72 | 73 | 74 | 着色器 75 | 76 | 77 | 着色器 78 | 79 | 80 | 着色器 81 | 82 | 83 | 着色器 84 | 85 | 86 | 着色器 87 | 88 | 89 | 着色器 90 | 91 | 92 | 着色器 93 | 94 | 95 | 着色器 96 | 97 | 98 | 着色器 99 | 100 | 101 | 着色器 102 | 103 | 104 | 着色器 105 | 106 | 107 | 着色器 108 | 109 | 110 | 着色器 111 | 112 | 113 | 着色器 114 | 115 | 116 | 着色器 117 | 118 | 119 | 着色器 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /MODULE_ACNet/EffectDefines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "pch.h" 3 | #include 4 | 5 | 6 | // {0C0641E5-5E1E-474D-9101-22E463CEEF78} 7 | DEFINE_GUID(GUID_MAGPIE_ACNET_L1A_SHADER, 8 | 0xc0641e5, 0x5e1e, 0x474d, 0x91, 0x1, 0x22, 0xe4, 0x63, 0xce, 0xef, 0x78); 9 | 10 | // {484D2999-5A14-48B4-9297-7F126DE9E2DF} 11 | DEFINE_GUID(GUID_MAGPIE_ACNET_L1B_SHADER, 12 | 0x484d2999, 0x5a14, 0x48b4, 0x92, 0x97, 0x7f, 0x12, 0x6d, 0xe9, 0xe2, 0xdf); 13 | 14 | // {AA1D9D67-3C13-46C9-9F64-00DAEF8AABB5} 15 | DEFINE_GUID(GUID_MAGPIE_ACNET_L2A_SHADER, 16 | 0xaa1d9d67, 0x3c13, 0x46c9, 0x9f, 0x64, 0x0, 0xda, 0xef, 0x8a, 0xab, 0xb5); 17 | 18 | // {D080A828-00CB-4F55-A3B8-FA7286131E40} 19 | DEFINE_GUID(GUID_MAGPIE_ACNET_L2B_SHADER, 20 | 0xd080a828, 0xcb, 0x4f55, 0xa3, 0xb8, 0xfa, 0x72, 0x86, 0x13, 0x1e, 0x40); 21 | 22 | // {6BEE0CDB-FF7A-4BE8-9F7D-28FA37AD96F5} 23 | DEFINE_GUID(GUID_MAGPIE_ACNET_L3A_SHADER, 24 | 0x6bee0cdb, 0xff7a, 0x4be8, 0x9f, 0x7d, 0x28, 0xfa, 0x37, 0xad, 0x96, 0xf5); 25 | 26 | // {5121BE36-0B46-4F58-AF4D-37152F0B3DEC} 27 | DEFINE_GUID(GUID_MAGPIE_ACNET_L3B_SHADER, 28 | 0x5121be36, 0xb46, 0x4f58, 0xaf, 0x4d, 0x37, 0x15, 0x2f, 0xb, 0x3d, 0xec); 29 | 30 | // {49E2BD95-52A6-4B95-AD95-F65D9779FC9A} 31 | DEFINE_GUID(GUID_MAGPIE_ACNET_L4A_SHADER, 32 | 0x49e2bd95, 0x52a6, 0x4b95, 0xad, 0x95, 0xf6, 0x5d, 0x97, 0x79, 0xfc, 0x9a); 33 | 34 | // {E5016C09-246D-48A8-8A89-3AFAA8C5A74B} 35 | DEFINE_GUID(GUID_MAGPIE_ACNET_L4B_SHADER, 36 | 0xe5016c09, 0x246d, 0x48a8, 0x8a, 0x89, 0x3a, 0xfa, 0xa8, 0xc5, 0xa7, 0x4b); 37 | 38 | // {1E99FF0F-FB30-4F53-AEBA-3F231C112194} 39 | DEFINE_GUID(GUID_MAGPIE_ACNET_L5A_SHADER, 40 | 0x1e99ff0f, 0xfb30, 0x4f53, 0xae, 0xba, 0x3f, 0x23, 0x1c, 0x11, 0x21, 0x94); 41 | 42 | // {469323BB-5249-4A12-BA74-C48DCE2A9D59} 43 | DEFINE_GUID(GUID_MAGPIE_ACNET_L5B_SHADER, 44 | 0x469323bb, 0x5249, 0x4a12, 0xba, 0x74, 0xc4, 0x8d, 0xce, 0x2a, 0x9d, 0x59); 45 | 46 | // {DA893731-3000-4770-A90C-3F38AAE079BD} 47 | DEFINE_GUID(GUID_MAGPIE_ACNET_L6A_SHADER, 48 | 0xda893731, 0x3000, 0x4770, 0xa9, 0xc, 0x3f, 0x38, 0xaa, 0xe0, 0x79, 0xbd); 49 | 50 | // {42C77A4A-F8DF-4F7D-B73C-45CA3C02FCAA} 51 | DEFINE_GUID(GUID_MAGPIE_ACNET_L6B_SHADER, 52 | 0x42c77a4a, 0xf8df, 0x4f7d, 0xb7, 0x3c, 0x45, 0xca, 0x3c, 0x2, 0xfc, 0xaa); 53 | 54 | // {B0624DCA-DC1D-40DB-B4BC-246ACFA98320} 55 | DEFINE_GUID(GUID_MAGPIE_ACNET_L7A_SHADER, 56 | 0xb0624dca, 0xdc1d, 0x40db, 0xb4, 0xbc, 0x24, 0x6a, 0xcf, 0xa9, 0x83, 0x20); 57 | 58 | // {08429C28-E3EB-4823-8E88-A2416967224B} 59 | DEFINE_GUID(GUID_MAGPIE_ACNET_L7B_SHADER, 60 | 0x8429c28, 0xe3eb, 0x4823, 0x8e, 0x88, 0xa2, 0x41, 0x69, 0x67, 0x22, 0x4b); 61 | 62 | // {89B6CA53-113F-438B-B4D0-2C33E0537F8D} 63 | DEFINE_GUID(GUID_MAGPIE_ACNET_L8A_SHADER, 64 | 0x89b6ca53, 0x113f, 0x438b, 0xb4, 0xd0, 0x2c, 0x33, 0xe0, 0x53, 0x7f, 0x8d); 65 | 66 | // {D3DF1607-C6CA-4475-A380-8078F5C92791} 67 | DEFINE_GUID(GUID_MAGPIE_ACNET_L8B_SHADER, 68 | 0xd3df1607, 0xc6ca, 0x4475, 0xa3, 0x80, 0x80, 0x78, 0xf5, 0xc9, 0x27, 0x91); 69 | 70 | // {5DC970E8-238E-4AE2-8141-D632ACCC7FEA} 71 | DEFINE_GUID(GUID_MAGPIE_ACNET_L9A_SHADER, 72 | 0x5dc970e8, 0x238e, 0x4ae2, 0x81, 0x41, 0xd6, 0x32, 0xac, 0xcc, 0x7f, 0xea); 73 | 74 | // {18CE140F-20EB-4B37-BF44-305713094C84} 75 | DEFINE_GUID(GUID_MAGPIE_ACNET_L9B_SHADER, 76 | 0x18ce140f, 0x20eb, 0x4b37, 0xbf, 0x44, 0x30, 0x57, 0x13, 0x9, 0x4c, 0x84); 77 | 78 | // {8653866E-B75E-4F55-91D4-AD0AF520BC7A} 79 | DEFINE_GUID(GUID_MAGPIE_ACNET_L10_SHADER, 80 | 0x8653866e, 0xb75e, 0x4f55, 0x91, 0xd4, 0xad, 0xa, 0xf5, 0x20, 0xbc, 0x7a); 81 | 82 | 83 | // {44C282C1-F6F4-4189-8B9D-2755E332E041} 84 | DEFINE_GUID(CLSID_MAGPIE_ACNET_EFFECT, 85 | 0x44c282c1, 0xf6f4, 0x4189, 0x8b, 0x9d, 0x27, 0x55, 0xe3, 0x32, 0xe0, 0x41); 86 | 87 | 88 | constexpr auto MAGPIE_ACNET_L1A_SHADER = L"shaders/ACNetL1aShader.cso"; 89 | constexpr auto MAGPIE_ACNET_L1B_SHADER = L"shaders/ACNetL1bShader.cso"; 90 | constexpr auto MAGPIE_ACNET_L2A_SHADER = L"shaders/ACNetL2aShader.cso"; 91 | constexpr auto MAGPIE_ACNET_L2B_SHADER = L"shaders/ACNetL2bShader.cso"; 92 | constexpr auto MAGPIE_ACNET_L3A_SHADER = L"shaders/ACNetL3aShader.cso"; 93 | constexpr auto MAGPIE_ACNET_L3B_SHADER = L"shaders/ACNetL3bShader.cso"; 94 | constexpr auto MAGPIE_ACNET_L4A_SHADER = L"shaders/ACNetL4aShader.cso"; 95 | constexpr auto MAGPIE_ACNET_L4B_SHADER = L"shaders/ACNetL4bShader.cso"; 96 | constexpr auto MAGPIE_ACNET_L5A_SHADER = L"shaders/ACNetL5aShader.cso"; 97 | constexpr auto MAGPIE_ACNET_L5B_SHADER = L"shaders/ACNetL5bShader.cso"; 98 | constexpr auto MAGPIE_ACNET_L6A_SHADER = L"shaders/ACNetL6aShader.cso"; 99 | constexpr auto MAGPIE_ACNET_L6B_SHADER = L"shaders/ACNetL6bShader.cso"; 100 | constexpr auto MAGPIE_ACNET_L7A_SHADER = L"shaders/ACNetL7aShader.cso"; 101 | constexpr auto MAGPIE_ACNET_L7B_SHADER = L"shaders/ACNetL7bShader.cso"; 102 | constexpr auto MAGPIE_ACNET_L8A_SHADER = L"shaders/ACNetL8aShader.cso"; 103 | constexpr auto MAGPIE_ACNET_L8B_SHADER = L"shaders/ACNetL8bShader.cso"; 104 | constexpr auto MAGPIE_ACNET_L9A_SHADER = L"shaders/ACNetL9aShader.cso"; 105 | constexpr auto MAGPIE_ACNET_L9B_SHADER = L"shaders/ACNetL9bShader.cso"; 106 | constexpr auto MAGPIE_ACNET_L10_SHADER = L"shaders/AcNetL10Shader.cso"; 107 | --------------------------------------------------------------------------------