mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Extend DrawSpriteToRgbaBuffer to work with 8bpp blitters.
parent
69c8ed9965
commit
57b992717b
20
src/gfx.cpp
20
src/gfx.cpp
|
@ -1200,7 +1200,7 @@ std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zo
|
||||||
if (zoom < _settings_client.gui.zoom_min || zoom > _settings_client.gui.zoom_max) return nullptr;
|
if (zoom < _settings_client.gui.zoom_min || zoom > _settings_client.gui.zoom_max) return nullptr;
|
||||||
|
|
||||||
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
|
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
|
||||||
if (!blitter->Is32BppSupported()) return nullptr;
|
if (blitter->GetScreenDepth() != 8 && blitter->GetScreenDepth() != 32) return nullptr;
|
||||||
|
|
||||||
/* Gather information about the sprite to write, reserve memory */
|
/* Gather information about the sprite to write, reserve memory */
|
||||||
const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH);
|
const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH);
|
||||||
|
@ -1221,11 +1221,29 @@ std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zo
|
||||||
dpi.height = dim.height;
|
dpi.height = dim.height;
|
||||||
dpi.zoom = zoom;
|
dpi.zoom = zoom;
|
||||||
|
|
||||||
|
/* If the current blitter is a paletted blitter, we have to render to an extra buffer and resolve the palette later. */
|
||||||
|
std::unique_ptr<byte[]> pal_buffer{};
|
||||||
|
if (blitter->GetScreenDepth() == 8) {
|
||||||
|
pal_buffer.reset(new byte[dim.width * dim.height]);
|
||||||
|
MemSetT(pal_buffer.get(), 0, dim.width * dim.height);
|
||||||
|
|
||||||
|
dpi.dst_ptr = pal_buffer.get();
|
||||||
|
}
|
||||||
|
|
||||||
/* Temporarily disable screen animations while blitting - This prevents 40bpp_anim from writing to the animation buffer. */
|
/* Temporarily disable screen animations while blitting - This prevents 40bpp_anim from writing to the animation buffer. */
|
||||||
Backup<bool> disable_anim(_screen_disable_anim, true, FILE_LINE);
|
Backup<bool> disable_anim(_screen_disable_anim, true, FILE_LINE);
|
||||||
GfxBlitter<1, true>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, zoom, &dpi);
|
GfxBlitter<1, true>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, zoom, &dpi);
|
||||||
disable_anim.Restore();
|
disable_anim.Restore();
|
||||||
|
|
||||||
|
if (blitter->GetScreenDepth() == 8) {
|
||||||
|
/* Resolve palette. */
|
||||||
|
uint32 *dst = result.get();
|
||||||
|
const byte *src = pal_buffer.get();
|
||||||
|
for (size_t i = 0; i < dim.height * dim.width; ++i) {
|
||||||
|
*dst++ = _cur_palette.palette[*src++].data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ static NSImage *NSImageFromSprite(SpriteID sprite_id, ZoomLevel zoom)
|
||||||
/* Fetch the sprite and create a new bitmap */
|
/* Fetch the sprite and create a new bitmap */
|
||||||
Dimension dim = GetSpriteSize(sprite_id, nullptr, zoom);
|
Dimension dim = GetSpriteSize(sprite_id, nullptr, zoom);
|
||||||
std::unique_ptr<uint32[]> buffer = DrawSpriteToRgbaBuffer(sprite_id, zoom);
|
std::unique_ptr<uint32[]> buffer = DrawSpriteToRgbaBuffer(sprite_id, zoom);
|
||||||
if (!buffer) return nullptr; // failed to blit sprite or we're using an 8bpp blitter.
|
if (!buffer) return nullptr; // Failed to blit sprite for some reason.
|
||||||
|
|
||||||
CFAutoRelease<CGDataProvider> data(CGDataProviderCreateWithData(nullptr, buffer.release(), dim.width * dim.height * 4, &CGDataFreeCallback));
|
CFAutoRelease<CGDataProvider> data(CGDataProviderCreateWithData(nullptr, buffer.release(), dim.width * dim.height * 4, &CGDataFreeCallback));
|
||||||
if (!data) return nullptr;
|
if (!data) return nullptr;
|
||||||
|
|
Loading…
Reference in New Issue