12 #include "../stdafx.h"
13 #include "../video/video_driver.hpp"
16 #include "../table/sprites.h"
18 #include "../safeguards.h"
23 Blitter_32bppAnim::~Blitter_32bppAnim()
28 template <BlitterMode mode>
34 const uint16 *src_n = (
const uint16 *)(src->
data + src->
offset[zoom][1]);
36 for (uint i = bp->
skip_top; i != 0; i--) {
37 src_px = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
38 src_n = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
42 assert(_screen.pitch == this->anim_buf_pitch);
43 uint16 *anim = this->
anim_buf + ((uint32 *)bp->
dst - (uint32 *)_screen.dst_ptr) + bp->
top * this->anim_buf_pitch + bp->
left;
45 const byte *remap = bp->
remap;
47 for (
int y = 0; y < bp->
height; y++) {
51 const Colour *src_px_ln = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
54 const uint16 *src_n_ln = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
61 while (dst < dst_end) {
69 if (dst > dst_end) anim += dst - dst_end;
71 if (dst + n > dst_end) {
72 uint d = dst_end - dst;
77 dst_end = dst + bp->
width;
79 n = min<uint>(n - d, (uint)bp->
width);
93 while (dst < dst_end) {
94 n = min<uint>(*src_n++, (uint)(dst_end - dst));
108 if (src_px->a == 255) {
116 uint r = remap[
GB(m, 0, 8)];
117 *anim = r | (m & 0xFF00);
132 uint r = remap[
GB(m, 0, 8)];
145 if (src_px->a == 255) {
149 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
153 uint r = remap[
GB(m, 0, 8)];
154 *anim = r | (m & 0xFF00);
166 if (src_px->a != 0) {
167 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
172 uint r = remap[
GB(m, 0, 8)];
201 if (src_px->a == 255) {
221 if (src_px->a == 255) {
224 uint m =
GB(*src_n, 0, 8);
233 uint m =
GB(*src_n, 0, 8);
265 default: NOT_REACHED();
266 case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom);
return;
283 assert(_screen.pitch == this->anim_buf_pitch);
284 uint16 *anim = this->
anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
288 for (
int i = 0; i != width; i++) {
294 udst = udst - width + _screen.pitch;
301 for (
int i = 0; i != width; i++) {
307 udst = udst - width + _screen.pitch;
313 DEBUG(misc, 0,
"32bpp blitter doesn't know how to draw this colour table ('%d')", pal);
322 assert(_screen.pitch == this->anim_buf_pitch);
323 this->
anim_buf[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * this->
anim_buf_pitch] = colour | (DEFAULT_BRIGHTNESS << 8);
335 assert(_screen.pitch == this->anim_buf_pitch);
336 uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->
anim_buf;
340 uint16 *anim = anim_line;
342 for (
int i = width; i > 0; i--) {
345 *anim = colour | (DEFAULT_BRIGHTNESS << 8);
349 video = (uint32 *)video + _screen.pitch;
350 anim_line += this->anim_buf_pitch;
357 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
359 const uint32 *usrc = (
const uint32 *)src;
360 assert(_screen.pitch == this->anim_buf_pitch);
361 uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->
anim_buf;
363 for (; height > 0; height--) {
366 uint16 *anim_pal = anim_line;
368 memcpy(dst, usrc, width *
sizeof(uint32));
370 dst += _screen.pitch;
372 memcpy(anim_line, usrc, width *
sizeof(uint16));
373 usrc = (
const uint32 *)((
const uint16 *)usrc + width);
383 for (
int i = 0; i < width; i++) {
384 uint colour =
GB(*anim_pal, 0, 8);
398 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
399 uint32 *udst = (uint32 *)dst;
400 const uint32 *src = (
const uint32 *)video;
404 assert(_screen.pitch == this->anim_buf_pitch);
405 const uint16 *anim_line = ((
const uint32 *)video - (uint32 *)_screen.dst_ptr) + this->
anim_buf;
407 for (; height > 0; height--) {
408 memcpy(udst, src, width *
sizeof(uint32));
409 src += _screen.pitch;
412 memcpy(udst, anim_line, width *
sizeof(uint16));
413 udst = (uint32 *)((uint16 *)udst + width);
421 assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
436 uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
437 uint th = height - scroll_y;
438 for (; th > 0; th--) {
439 memcpy(dst, src, tw *
sizeof(uint16));
457 uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
458 uint th = height + scroll_y;
459 for (; th > 0; th--) {
460 memmove(dst, src, tw *
sizeof(uint16));
471 return width * height * (
sizeof(uint32) +
sizeof(uint16));
484 const uint16 *anim = this->
anim_buf;
490 uint colour =
GB(*anim, 0, 8);
513 if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height ||
514 _screen.pitch != this->anim_buf_pitch) {