// Copyright 2021 Jean Pierre Cimalando // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 // #define STBIW_WINDOWS_UTF8 #define STB_IMAGE_WRITE_STATIC #define STB_IMAGE_WRITE_IMPLEMENTATION #if defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-function" #endif #include "stb_image_write.h" #if defined(__GNUC__) # pragma GCC diagnostic pop #endif //------------------------------------------------------------------------------ #define WDL_NO_DEFINE_MINMAX #include "WDL/lice/lice.h" #include "WDL/wdltypes.h" #include static std::unique_ptr bmp_to_stbi(LICE_IBitmap *bmp, unsigned ch) { unsigned w = (unsigned)bmp->getWidth(); unsigned h = (unsigned)bmp->getHeight(); unsigned srcspan = (unsigned)bmp->getRowSpan(); bool srcflip = bmp->isFlipped(); LICE_pixel *srcpx = bmp->getBits(); std::unique_ptr result; if (ch == 4) { unsigned char *dstpx = new unsigned char[4 * w * h]; result.reset(dstpx); for (unsigned row = 0; row < h; ++row) { LICE_pixel *src = srcpx + srcspan * (srcflip ? (h - 1 - row) : row); unsigned char *dst = dstpx + row * (4 * w); for (unsigned col = 0; col < w; ++col, ++src, dst += 4) { LICE_pixel px = *src; dst[0] = LICE_GETR(px); dst[1] = LICE_GETG(px); dst[2] = LICE_GETB(px); dst[3] = LICE_GETA(px); } } } else if (ch == 3) { unsigned char *dstpx = new unsigned char[3 * w * h]; result.reset(dstpx); for (unsigned row = 0; row < h; ++row) { LICE_pixel *src = srcpx + srcspan * (srcflip ? (h - 1 - row) : row); unsigned char *dst = dstpx + row * (3 * w); for (unsigned col = 0; col < w; ++col, ++src, dst += 3) { LICE_pixel px = *src; dst[0] = LICE_GETR(px); dst[1] = LICE_GETG(px); dst[2] = LICE_GETB(px); } } } return result; } bool LICE_WritePNG(const char *filename, LICE_IBitmap *bmp, bool wantalpha) { unsigned ch = wantalpha ? 4 : 3; std::unique_ptr data = bmp_to_stbi(bmp, ch); if (!data) return false; return stbi_write_png(filename, bmp->getWidth(), bmp->getHeight(), (int)ch, data.get(), 0); } bool LICE_WriteJPG(const char *filename, LICE_IBitmap *bmp, int quality, bool force_baseline) { (void)force_baseline; // always baseline unsigned ch = 4; std::unique_ptr data = bmp_to_stbi(bmp, ch); if (!data) return false; return stbi_write_jpg(filename, bmp->getWidth(), bmp->getHeight(), (int)ch, data.get(), quality); }