| 264 | } |
| 265 | |
| 266 | static std::vector<uint8_t> GetBufferFromPixelData(JSContext* ctx, PixelData& pixelData) |
| 267 | { |
| 268 | std::vector<uint8_t> imageData; |
| 269 | switch (pixelData.Type) |
| 270 | { |
| 271 | case PixelDataKind::Raw: |
| 272 | { |
| 273 | auto data = GetDataFromBufferLikeObject(ctx, pixelData.Data); |
| 274 | if (pixelData.Stride != pixelData.Width) |
| 275 | { |
| 276 | // Make sure data is expected size for RemovePadding |
| 277 | data.resize(pixelData.Stride * pixelData.Height); |
| 278 | data = RemovePadding(data, pixelData); |
| 279 | } |
| 280 | |
| 281 | // Make sure data is expected size |
| 282 | data.resize(pixelData.Width * pixelData.Height); |
| 283 | imageData = std::move(data); |
| 284 | break; |
| 285 | } |
| 286 | case PixelDataKind::Rle: |
| 287 | { |
| 288 | imageData = GetDataFromBufferLikeObject(ctx, pixelData.Data); |
| 289 | break; |
| 290 | } |
| 291 | case PixelDataKind::Png: |
| 292 | { |
| 293 | auto imageFormat = pixelData.Palette == PixelDataPaletteKind::Keep ? ImageFormat::png : ImageFormat::png32; |
| 294 | auto palette = pixelData.Palette == PixelDataPaletteKind::Keep ? Palette::KeepIndices : Palette::OpenRCT2; |
| 295 | auto importMode = getImportModeFromPalette(pixelData.Palette); |
| 296 | auto pngData = GetDataFromBufferLikeObject(ctx, pixelData.Data); |
| 297 | auto image = Imaging::ReadFromBuffer(pngData, imageFormat); |
| 298 | constexpr ImportFlags flags = { ImportFlag::rle }; |
| 299 | ImageImportMeta meta = { { 0, 0 }, palette, flags, importMode }; |
| 300 | |
| 301 | ImageImporter importer; |
| 302 | auto importResult = importer.Import(image, meta); |
| 303 | |
| 304 | pixelData.Type = PixelDataKind::Rle; |
| 305 | pixelData.Width = importResult.Element.width; |
| 306 | pixelData.Height = importResult.Element.height; |
| 307 | |
| 308 | imageData = std::move(importResult.Buffer); |
| 309 | break; |
| 310 | } |
| 311 | default: |
| 312 | throw std::runtime_error("Unsupported pixel data type."); |
| 313 | } |
| 314 | return imageData; |
| 315 | } |
| 316 | |
| 317 | static PixelDataKind PixelDataKindFromJS(const std::string& s) |
| 318 | { |
no test coverage detected