10 #include "../stdafx.h" 11 #include "../video/video_driver.hpp" 15 #include "../table/sprites.h" 17 #include "../safeguards.h" 22 Blitter_32bppAnim::~Blitter_32bppAnim()
27 template <BlitterMode mode>
30 const SpriteData *src = (
const SpriteData *)bp->
sprite;
32 const Colour *src_px = (
const Colour *)(src->data + src->offset[zoom][0]);
33 const uint16 *src_n = (
const uint16 *)(src->data + src->offset[zoom][1]);
35 for (uint i = bp->
skip_top; i != 0; i--) {
36 src_px = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
37 src_n = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
41 uint16 *anim = this->anim_buf + this->ScreenToAnimOffset((uint32 *)bp->
dst) + bp->
top * this->
anim_buf_pitch + bp->
left;
43 const byte *remap = bp->
remap;
45 for (
int y = 0; y < bp->
height; y++) {
49 const Colour *src_px_ln = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
52 const uint16 *src_n_ln = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
59 while (dst < dst_end) {
67 if (dst > dst_end) anim += dst - dst_end;
69 if (dst + n > dst_end) {
70 uint d = dst_end - dst;
75 dst_end = dst + bp->
width;
77 n = min<uint>(n - d, (uint)bp->
width);
91 while (dst < dst_end) {
92 n = min<uint>(*src_n++, (uint)(dst_end - dst));
106 if (src_px->a == 255) {
114 uint r = remap[
GB(m, 0, 8)];
115 *anim = r | (m & 0xFF00);
130 uint r = remap[
GB(m, 0, 8)];
143 if (src_px->a == 255) {
147 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
151 uint r = remap[
GB(m, 0, 8)];
152 *anim = r | (m & 0xFF00);
164 if (src_px->a != 0) {
165 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
170 uint r = remap[
GB(m, 0, 8)];
199 if (src_px->a == 255) {
219 if (src_px->a == 255) {
222 uint m =
GB(*src_n, 0, 8);
231 uint m =
GB(*src_n, 0, 8);
263 default: NOT_REACHED();
264 case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom);
return;
281 uint16 *anim = this->
anim_buf + this->ScreenToAnimOffset((uint32 *)dst);
285 for (
int i = 0; i != width; i++) {
291 udst = udst - width + _screen.pitch;
298 for (
int i = 0; i != width; i++) {
304 udst = udst - width + _screen.pitch;
310 DEBUG(misc, 0,
"32bpp blitter doesn't know how to draw this colour table ('%d')", pal);
320 this->
anim_buf[this->ScreenToAnimOffset((uint32 *)video) + x + y * this->
anim_buf_pitch] = colour | (DEFAULT_BRIGHTNESS << 8);
323 void Blitter_32bppAnim::DrawLine(
void *video,
int x,
int y,
int x2,
int y2,
int screen_width,
int screen_height, uint8 colour,
int width,
int dash)
328 this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [&](
int x,
int y) {
329 *((
Colour *)video + x + y * _screen.pitch) = c;
332 uint16 *
const offset_anim_buf = this->
anim_buf + this->ScreenToAnimOffset((uint32 *)video);
333 const uint16 anim_colour = colour | (DEFAULT_BRIGHTNESS << 8);
334 this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [&](
int x,
int y) {
335 *((
Colour *)video + x + y * _screen.pitch) = c;
350 uint16 *anim_line = this->ScreenToAnimOffset((uint32 *)video) + this->
anim_buf;
354 uint16 *anim = anim_line;
356 for (
int i = width; i > 0; i--) {
359 *anim = colour | (DEFAULT_BRIGHTNESS << 8);
363 video = (uint32 *)video + _screen.pitch;
364 anim_line += this->anim_buf_pitch;
371 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
373 const uint32 *usrc = (
const uint32 *)src;
374 uint16 *anim_line = this->ScreenToAnimOffset((uint32 *)video) + this->
anim_buf;
376 for (; height > 0; height--) {
379 uint16 *anim_pal = anim_line;
381 memcpy(static_cast<void *>(dst), usrc, width *
sizeof(uint32));
383 dst += _screen.pitch;
385 memcpy(anim_line, usrc, width *
sizeof(uint16));
386 usrc = (
const uint32 *)((
const uint16 *)usrc + width);
396 for (
int i = 0; i < width; i++) {
397 uint colour =
GB(*anim_pal, 0, 8);
411 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
412 uint32 *udst = (uint32 *)dst;
413 const uint32 *src = (
const uint32 *)video;
415 if (this->
anim_buf ==
nullptr)
return;
417 const uint16 *anim_line = this->ScreenToAnimOffset((
const uint32 *)video) + this->
anim_buf;
419 for (; height > 0; height--) {
420 memcpy(udst, src, width *
sizeof(uint32));
421 src += _screen.pitch;
424 memcpy(udst, anim_line, width *
sizeof(uint16));
425 udst = (uint32 *)((uint16 *)udst + width);
433 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
448 uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
449 uint th = height - scroll_y;
450 for (; th > 0; th--) {
451 memcpy(dst, src, tw *
sizeof(uint16));
469 uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
470 uint th = height + scroll_y;
471 for (; th > 0; th--) {
472 memmove(dst, src, tw *
sizeof(uint16));
483 return width * height * (
sizeof(uint32) +
sizeof(uint16));
496 const uint16 *anim = this->
anim_buf;
500 const int width = this->anim_buf_width;
501 const int pitch_offset = _screen.pitch - width;
502 const int anim_pitch_offset = this->anim_buf_pitch - width;
504 for (
int x = width; x != 0 ; x--) {
505 uint16 value = *anim;
506 uint8 colour =
GB(value, 0, 8);
515 anim += anim_pitch_offset;
529 if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height ||
530 _screen.pitch != this->anim_buf_pitch) {
539 this->
anim_buf =
reinterpret_cast<uint16 *
>((
reinterpret_cast<uintptr_t
>(this->
anim_alloc) + 0xF) & (~0xF));
virtual void MakeDirty(int left, int top, int width, int height)=0
Mark a particular area dirty.
void PaletteAnimate(const Palette &palette) override
Called when the 8bpp palette is changed; you should redraw all pixels on the screen that are equal to...
int left
The left offset in the 'dst' in pixels to start drawing.
uint32 PaletteID
The number of the palette.
static const PaletteID PALETTE_TO_TRANSPARENT
This sets the sprite to transparent.
Colour LookupColourInPalette(uint index)
Look up the colour in the current palette.
Information about the currently used palette.
int height
The height in pixels that needs to be drawn to dst.
void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override
Draw a colourtable to the screen.
Perform transparency colour remapping.
int skip_top
How much pixels of the source to skip on the top (based on zoom of dst)
uint32 data
Conversion of the channel information to a 32 bit number.
int width
The width in pixels that needs to be drawn to dst.
uint8 a
colour channels in LE order
uint16 * anim_buf
In this buffer we keep track of the 8bpp indexes so we can do palette animation.
void * anim_alloc
The raw allocated buffer, not necessarily aligned correctly.
int skip_left
How much pixels of the source to skip on the left (based on zoom of dst)
void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override
Draw an image to the screen, given an amount of params defined above.
static Colour ComposeColourPANoCheck(Colour colour, uint a, Colour current)
Compose a colour based on Pixel value, alpha value, and the current pixel value.
void PostResize() override
Post resize event.
static FBlitter_32bppAnim iFBlitter_32bppAnim
Instantiation of the 32bpp with animation blitter factory.
void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) override
Scroll the videobuffer some 'x' and 'y' value.
Common functionality for all blitter implementations.
void CopyToBuffer(const void *video, void *dst, int width, int height) override
Copy from the screen to a buffer.
The blitter takes care of the palette animation.
int anim_buf_height
The height of the animation buffer.
void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override
Draws a sprite to a (screen) buffer.
Parameters related to blitting.
int pitch
The pitch of the destination buffer.
void DrawRect(void *video, int width, int height, uint8 colour) override
Make a single horizontal line in a single colour on the video-buffer.
int anim_buf_pitch
The pitch of the animation buffer (width rounded up to 16 byte boundary).
static const PaletteID PALETTE_NEWSPAPER
Recolour sprite for newspaper-greying.
Perform a crash remapping.
bool _screen_disable_anim
Disable palette animation (important for 32bpp-anim blitter during giant screenshot) ...
int first_dirty
The first dirty element.
Perform remapping to a completely blackened sprite.
#define DEBUG(name, level,...)
Output a line of debugging information.
static Colour MakeGrey(Colour colour)
Make a colour grey - based.
int BufferSize(int width, int height) override
Calculate how much memory there is needed for an image of this size in the video-buffer.
void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override
Draw a line with a given colour.
int top
The top offset in the 'dst' in pixels to start drawing.
int anim_buf_width
The width of the animation buffer.
Palette palette
The current palette.
const byte * remap
XXX – Temporary storage for remap array.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
Factory for the 32bpp blitter with animation.
const void * sprite
Pointer to the sprite how ever the encoder stored it.
void DrawRect(void *video, int width, int height, uint8 colour) override
Make a single horizontal line in a single colour on the video-buffer.
static uint8 MakeDark(uint8 r, uint8 g, uint8 b)
Make a colour dark grey, for specialized 32bpp remapping.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
Perform a colour remapping.
A 32 bpp blitter with animation support.
Blitter::PaletteAnimation UsePaletteAnimation() override
Check if the blitter uses palette animation at all.
void * dst
Destination buffer.
Structure to access the alpha, red, green, and blue channels from a 32 bit number.
Perform the simple blitting.
void CopyFromBuffer(void *video, const void *src, int width, int height) override
Copy from a buffer to the screen.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
BlitterMode
The modes of blitting we can do.
PaletteAnimation
Types of palette animation.
void SetPixel(void *video, int x, int y, uint8 colour) override
Draw a pixel with a given colour on the video-buffer.
ZoomLevel
All zoom levels we know.
void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override
Draw a colourtable to the screen.
static Colour ComposeColourRGBA(uint r, uint g, uint b, uint a, Colour current)
Compose a colour based on RGBA values and the current pixel value.
Index in the _palettes array from which all animations are taking places (table/palettes.h)
void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) override
Scroll the videobuffer some 'x' and 'y' value.
static Colour MakeTransparent(Colour colour, uint nom, uint denom=256)
Make a pixel looks like it is transparent.
static Colour ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, Colour current)
Compose a colour based on RGBA values and the current pixel value.