// 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 STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_STATIC #define STBI_WINDOWS_UTF8 #if defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-function" #endif #include "stb_image.h" #if defined(__GNUC__) # pragma GCC diagnostic pop #endif //------------------------------------------------------------------------------ #include "WDL/lice/lice.h" #include "WDL/wdltypes.h" static LICE_IBitmap *LICE_LoadSTB(const char *filename, LICE_IBitmap *bmp) { LICE_IBitmap *delbmp = nullptr; stbi_uc *srcpx = nullptr; LICE_pixel *dstpx = nullptr; bool dstflip = false; unsigned dstspan = 0; unsigned w = 0; unsigned h = 0; unsigned ch = 0; srcpx = stbi_load(filename, (int *)&w, (int *)&h, (int *)&ch, 4); if (!srcpx) goto fail; if (bmp) bmp->resize(w, h); else bmp = delbmp = new WDL_NEW LICE_MemBitmap(w, h); if (!bmp || (unsigned)bmp->getWidth() != w || (unsigned)bmp->getHeight() != h) goto fail; dstpx = bmp->getBits(); dstflip = bmp->isFlipped(); dstspan = bmp->getRowSpan(); for (unsigned row = 0; row < h; ++row) { const stbi_uc *src = srcpx + row * (4 * w); LICE_pixel *dst = dstpx + dstspan * (dstflip ? (h - 1 - row) : row); for (unsigned col = 0; col < w; ++col, src += 4, ++dst) *dst = LICE_RGBA(src[0], src[1], src[2], src[3]); } stbi_image_free(srcpx); return bmp; fail: delete delbmp; stbi_image_free(srcpx); return nullptr; }