Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/2026.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ <h5>New features</h5>
<li>SVE2 optimizations of class ImagePpmTxtSaver.</li>
<li>SVE2 optimizations of class ImagePpmBinSaver.</li>
<li>SVE2 optimizations of class ImageBmpSaver.</li>
<li>SVE2 optimizations of class ImagePngSaver.</li>
<li>C++ wrapper Simd::SynetAdd16b.</li>
<li>C++ wrapper Simd::SynetQuantizedAdd.</li>
<li>C++ wrapper Simd::SynetQuantizedMul.</li>
Expand Down Expand Up @@ -148,6 +149,7 @@ <h5>New features</h5>
<li>Tests for verifying functionality of SVE2 optimizations of class ImagePgmBinSaver.</li>
<li>Tests for verifying functionality of SVE2 optimizations of class ImagePpmTxtSaver.</li>
<li>Tests for verifying functionality of SVE2 optimizations of class ImagePpmBinSaver.</li>
<li>Tests for verifying functionality of SVE2 optimizations of class ImagePngSaver.</li>
</ul>
<h5>Removing</h5>
<ul>
Expand Down
3 changes: 3 additions & 0 deletions prj/vs2022/Sve2.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
<ClCompile Include="..\..\src\Simd\SimdSve2Histogram.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2Hog.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2ImageSave.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2ImageSavePng.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2Laplace.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2Lbp.cpp" />
<ClCompile Include="..\..\src\Simd\SimdSve2MaxFilter.cpp" />
Expand Down Expand Up @@ -211,6 +212,8 @@
<ClInclude Include="..\..\src\Simd\SimdDescrIntCommon.h" />
<ClInclude Include="..\..\src\Simd\SimdEnable.h" />
<ClInclude Include="..\..\src\Simd\SimdExtract.h" />
<ClInclude Include="..\..\src\Simd\SimdImageSave.h" />
<ClInclude Include="..\..\src\Simd\SimdImageSavePng.h" />
<ClInclude Include="..\..\src\Simd\SimdInit.h" />
<ClInclude Include="..\..\src\Simd\SimdLib.h" />
<ClInclude Include="..\..\src\Simd\SimdLoad.h" />
Expand Down
9 changes: 9 additions & 0 deletions prj/vs2022/Sve2.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@
<ClInclude Include="..\..\src\Simd\SimdExtract.h">
<Filter>Inc</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Simd\SimdImageSave.h">
<Filter>Inc</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Simd\SimdImageSavePng.h">
<Filter>Inc</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Simd\SimdInit.h">
<Filter>Inc</Filter>
</ClInclude>
Expand Down Expand Up @@ -311,6 +317,9 @@
<ClCompile Include="..\..\src\Simd\SimdSve2ImageSave.cpp">
<Filter>Sve2\Image</Filter>
</ClCompile>
<ClCompile Include="..\..\src\Simd\SimdSve2ImageSavePng.cpp">
<Filter>Sve2\Image</Filter>
</ClCompile>
<ClCompile Include="..\..\src\Simd\SimdSve2Laplace.cpp">
<Filter>Sve2\Filter</Filter>
</ClCompile>
Expand Down
6 changes: 6 additions & 0 deletions src/Simd/SimdImageSave.h
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,12 @@ namespace Simd
ImageBmpSaver(const ImageSaverParam& param);
};

class ImagePngSaver : public Neon::ImagePngSaver
{
public:
ImagePngSaver(const ImageSaverParam& param);
};

//-------------------------------------------------------------------------------------------------

uint8_t* ImageSaveToMemory(const uint8_t* src, size_t stride, size_t width, size_t height, SimdPixelFormatType format, SimdImageFileType file, int quality, size_t* size);
Expand Down
30 changes: 29 additions & 1 deletion src/Simd/SimdImageSavePng.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ namespace Simd
{
limit = Min(limit, 258);
int i = 0;
#if defined(SIMD_X64_ENABLE) || defined(SIMD_ARM64_ENABLE) || defined(SIMD_RISCV64_ENABLE)
#if defined(SIMD_X64_ENABLE) || defined(SIMD_ARM64_ENABLE) || defined(SIMD_RISCV64_ENABLE)
int limit8 = limit & (~7);
for (; i < limit8; i += 8)
if (*(uint64_t*)(a + i) != *(uint64_t*)(b + i))
Expand Down Expand Up @@ -230,6 +230,34 @@ namespace Simd
{
}
#endif// SIMD_NEON_ENABLE

#ifdef SIMD_SVE2_ENABLE
namespace Sve2
{
SIMD_INLINE int ZlibCount(const uint8_t* a, const uint8_t* b, int limit)
{
limit = Min(limit, 258);
int i = 0;
const uint64_t A = svcntb();
const svbool_t body = svptrue_b8();
for (; i + (int)A <= limit; i += (int)A)
{
svbool_t ne = svcmpne_u8(body, svld1_u8(body, a + i), svld1_u8(body, b + i));
if (svptest_any(body, ne))
return i + (int)svminv_u8(ne, svindex_u8(0, 1));
}
if (i < limit)
{
svbool_t tail = svwhilelt_b8((uint64_t)i, (uint64_t)limit);
svbool_t ne = svcmpne_u8(tail, svld1_u8(tail, a + i), svld1_u8(tail, b + i));
if (svptest_any(tail, ne))
return i + (int)svminv_u8(ne, svindex_u8(0, 1));
i = limit;
}
return i;
}
}
#endif// SIMD_SVE2_ENABLE
}

#endif//__SimdImageSavePng_h__
2 changes: 1 addition & 1 deletion src/Simd/SimdSve2ImageSave.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ namespace Simd
case SimdImageFilePgmBin: return new ImagePgmBinSaver(param);
case SimdImageFilePpmTxt: return new ImagePpmTxtSaver(param);
case SimdImageFilePpmBin: return new ImagePpmBinSaver(param);
case SimdImageFilePng: return new Neon::ImagePngSaver(param);
case SimdImageFilePng: return new ImagePngSaver(param);
case SimdImageFileJpeg: return new Neon::ImageJpegSaver(param);
case SimdImageFileBmp: return new ImageBmpSaver(param);
default:
Expand Down
Loading