/** * Copyright (c) Facebook, Inc. and its affiliates. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ #include "Image_Utils.hpp" #include #include #define STB_IMAGE_IMPLEMENTATION #include #define STB_IMAGE_WRITE_IMPLEMENTATION #include namespace ImageUtils { static bool imageHasTransparentPixels(FILE* f) { int width, height, channels; // RGBA: we have to load the pixels to figure out if the image is fully opaque uint8_t* pixels = stbi_load_from_file(f, &width, &height, &channels, 0); if (pixels != nullptr) { int pixelCount = width * height; for (int ix = 0; ix < pixelCount; ix++) { // test fourth byte (alpha); 255 is 1.0 if (pixels[4 * ix + 3] != 255) { return true; } } } return false; } ImageProperties GetImageProperties(char const* filePath) { ImageProperties result = { 1, 1, IMAGE_OPAQUE, }; FILE* f = fopen(filePath, "rb"); if (f == nullptr) { return result; } int channels; int success = stbi_info_from_file(f, &result.width, &result.height, &channels); if (success && channels == 4 && imageHasTransparentPixels(f)) { result.occlusion = IMAGE_TRANSPARENT; } return result; } std::string suffixToMimeType(std::string suffix) { std::transform(suffix.begin(), suffix.end(), suffix.begin(), ::tolower); if (suffix == "jpg" || suffix == "jpeg") { return "image/jpeg"; } if (suffix == "png") { return "image/png"; } return "image/unknown"; } } // namespace ImageUtils