Changeset - r26147:b775ce6223ef
[Not reviewed]
master
0 2 0
Michael Lutz - 2 years ago 2021-12-31 00:22:45
michi@icosahedron.de
Codechange: Extend DrawSpriteToRgbaBuffer to work with 8bpp blitters.
2 files changed with 20 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/gfx.cpp
Show inline comments
 
@@ -1200,7 +1200,7 @@ std::unique_ptr<uint32[]> DrawSpriteToRg
 
	if (zoom < _settings_client.gui.zoom_min || zoom > _settings_client.gui.zoom_max) return nullptr;
 

	
 
	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 */
 
	const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH);
 
@@ -1221,11 +1221,29 @@ std::unique_ptr<uint32[]> DrawSpriteToRg
 
	dpi.height = dim.height;
 
	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. */
 
	Backup<bool> disable_anim(_screen_disable_anim, true, FILE_LINE);
 
	GfxBlitter<1, true>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, zoom, &dpi);
 
	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;
 
}
 

	
src/video/cocoa/cocoa_wnd.mm
Show inline comments
 
@@ -179,7 +179,7 @@ static NSImage *NSImageFromSprite(Sprite
 
	/* Fetch the sprite and create a new bitmap */
 
	Dimension dim = GetSpriteSize(sprite_id, nullptr, 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));
 
	if (!data) return nullptr;
0 comments (0 inline, 0 general)