|
3 | 3 | // windows-latest ランナーで実行して「Windows 上で実際に動く」ことを検証する。 |
4 | 4 | // |
5 | 5 | // ビルド (Developer Command Prompt / CI): |
6 | | -// cl /std:c++17 /EHsc /Isrc tests\windows_platform_test.cpp ^ |
| 6 | +// cl /std:c++17 /EHsc /Isrc /I. tests\windows_platform_test.cpp ^ |
7 | 7 | // src\platform\WicDecoder.cpp src\platform\TextRasterizer.cpp ^ |
8 | 8 | // src\platform\AudioEngine.cpp ^ |
| 9 | +// src\platform\ImageDecoder.cpp src\platform\AudioDecoder.cpp ^ |
9 | 10 | // ole32.lib windowscodecs.lib d2d1.lib dwrite.lib ^ |
10 | 11 | // mfplat.lib mfreadwrite.lib mfuuid.lib xaudio2.lib shlwapi.lib |
11 | 12 | // |
|
16 | 17 | #endif |
17 | 18 |
|
18 | 19 | #include "../src/platform/WicDecoder.h" |
| 20 | +#include "../src/platform/ImageDecoder.h" |
| 21 | +#include "../src/platform/AudioDecoder.h" |
19 | 22 | #include "../src/platform/TextRasterizer.h" |
20 | 23 | #include "../src/platform/AudioEngine.h" |
21 | 24 |
|
@@ -89,6 +92,24 @@ static void TestWicDecode() |
89 | 92 | CHECK(!next2d::DecodeImageWithWIC(garbage, bad)); |
90 | 93 | } |
91 | 94 |
|
| 95 | +// --- ImageDecoder: 本番の第一経路 (stb_image。コンソールでも同一コード) -------- |
| 96 | +static void TestImageDecoder() |
| 97 | +{ |
| 98 | + std::vector<uint8_t> png(kTestPng, kTestPng + sizeof(kTestPng)); |
| 99 | + next2d::DecodedImage img; |
| 100 | + CHECK(next2d::DecodeImage(png, img)); |
| 101 | + CHECK(img.width == 2 && img.height == 2); |
| 102 | + CHECK(img.rgba.size() == 16); |
| 103 | + CHECK(img.rgba[0] == 255 && img.rgba[1] == 0 && img.rgba[2] == 0 && img.rgba[3] == 255); |
| 104 | + CHECK(img.rgba[4] == 0 && img.rgba[5] == 255 && img.rgba[6] == 0); |
| 105 | + CHECK(img.rgba[8] == 0 && img.rgba[9] == 0 && img.rgba[10] == 255); |
| 106 | + CHECK(img.rgba[15] == 128); |
| 107 | + |
| 108 | + std::vector<uint8_t> garbage(32, 0xAB); |
| 109 | + next2d::DecodedImage bad; |
| 110 | + CHECK(!next2d::DecodeImage(garbage, bad)); |
| 111 | +} |
| 112 | + |
92 | 113 | // --- DirectWrite: メトリクスとグリフラスタライズ (fillText の実体) ---------- |
93 | 114 | static void TestTextRasterizer() |
94 | 115 | { |
@@ -131,19 +152,31 @@ static void TestTextRasterizer() |
131 | 152 | CHECK(!next2d::RasterizeTextWithDWrite("24px Segoe UI", L"", 0, 0, 0, empty)); |
132 | 153 | } |
133 | 154 |
|
134 | | -// --- Media Foundation: 音声デコード (decodeAudioData の実体) ----------------- |
| 155 | +// --- 音声デコード (decodeAudioData の実体) ----------------------------------- |
| 156 | +// AudioEngine::Decode は第一経路 dr_wav/dr_mp3/stb_vorbis (コンソールでも同一)、 |
| 157 | +// フォールバックが Media Foundation。両経路を検証する。 |
135 | 158 | static void TestAudioDecode() |
136 | 159 | { |
137 | 160 | std::vector<uint8_t> wav(kTestWav, kTestWav + sizeof(kTestWav)); |
138 | 161 | next2d::PcmBuffer pcm; |
139 | 162 | CHECK(next2d::AudioEngine::Decode(wav, pcm)); |
140 | 163 | CHECK(pcm.sample_rate == 48000); |
141 | 164 | CHECK(pcm.channels == 1); |
142 | | - CHECK(pcm.samples.size() >= 40); // 48 サンプル前後 (MF は端数調整あり) |
| 165 | + CHECK(pcm.samples.size() >= 40); // 48 サンプル前後 |
143 | 166 | // 振幅 0.5 の矩形波 → ピーク絶対値が 0.4〜0.6 |
144 | 167 | float peak = 0; |
145 | 168 | for (float s : pcm.samples) peak = std::max(peak, std::fabs(s)); |
146 | 169 | CHECK(peak > 0.4f && peak < 0.6f); |
| 170 | + |
| 171 | + // ポータブルデコーダ単体 (本番の第一経路) も直接検証 |
| 172 | + next2d::PcmBuffer pcm2; |
| 173 | + CHECK(next2d::DecodeAudio(wav, pcm2)); |
| 174 | + CHECK(pcm2.sample_rate == 48000 && pcm2.channels == 1); |
| 175 | + CHECK(pcm2.samples.size() >= 40); |
| 176 | + |
| 177 | + std::vector<uint8_t> garbage(32, 0xAB); |
| 178 | + next2d::PcmBuffer bad; |
| 179 | + CHECK(!next2d::DecodeAudio(garbage, bad)); |
147 | 180 | } |
148 | 181 |
|
149 | 182 | // --- XAudio2: 初期化 (ヘッドレス CI では音声デバイスが無く失敗し得る → warn) -- |
@@ -175,6 +208,7 @@ int main() |
175 | 208 | MFStartup(MF_VERSION); |
176 | 209 |
|
177 | 210 | TestWicDecode(); |
| 211 | + TestImageDecoder(); |
178 | 212 | TestTextRasterizer(); |
179 | 213 | TestAudioDecode(); |
180 | 214 | TestAudioEngineInit(); |
|
0 commit comments