1#define STB_IMAGE_IMPLEMENTATION
4#include "ImageDecoder.h"
8 using namespace Cogs::Core::TerrainProvider;
11Cogs::Core::TerrainProvider::ImageDecoder::~ImageDecoder()
14 stbi_image_free(stb_data);
19bool Cogs::Core::TerrainProvider::ImageDecoder::decode(
Cogs::TileData& tileData,
21 unsigned suggested_width,
22 unsigned suggested_height,
23 float suggested_nodata)
28 case MimeType::Jpeg: {
29 int width, height, comp;
30 stbi_set_flip_vertically_on_load_thread(1);
31 stb_data = stbi_load_from_memory((
const stbi_uc*)input.data(),
32 static_cast<int>(input.size()),
36 tileData.format = Cogs::TextureFormat::R8G8B8A8_UNORM_SRGB;
37 tileData.width = width;
38 tileData.height = height;
40 tileData.imageData = stb_data;
41 tileData.flags = Cogs::TileDataFlags::None;
44 case MimeType::Tiff: {
46 if (!geotiff.getFullImage(output, suggested_nodata)) {
47 tileData.imageData =
nullptr;
50 tileData.format = geotiff.format;
51 tileData.width = geotiff.width;
52 tileData.height = geotiff.height;
54 tileData.imageData = output.data();
55 tileData.minZ = geotiff.minSample.value_or(0.f);
56 tileData.maxZ = geotiff.maxSample.value_or(0.f);
62 if (input.size() !=
sizeof(
float) * suggested_width * suggested_height) {
63 tileData.imageData =
nullptr;
67 float min = std::numeric_limits<float>::max();
68 float max = -std::numeric_limits<float>::max();
69 float* image = (
float*)input.data();
70 for (
size_t i = 0, n = input.size() /
sizeof(float); i < n; i++) {
71 min = std::min(min, image[i]);
72 max = std::max(max, image[i]);
75 tileData.format = Cogs::TextureFormat::R32_FLOAT;
76 tileData.width = suggested_width;
77 tileData.height = suggested_height;
79 tileData.imageData = input.data();
86 if (input.size() != 4 *
sizeof(uint8_t) * suggested_width * suggested_height) {
87 tileData.imageData =
nullptr;
91 tileData.format = Cogs::TextureFormat::R8G8B8A8_UNORM_SRGB;
92 tileData.width = suggested_width;
93 tileData.height = suggested_height;
95 tileData.imageData = input.data();
96 tileData.flags = Cogs::TileDataFlags::None;
101 tileData.imageData =
nullptr;
@ ShouldFlip
Tile data should be flipped on the Y axis.
@ LinearColorSpace
Target format of conversion should be in linear (non-sRGB) color space.
@ IsHeight
Tile contains height data, min/max values should be provided.