12 #include "../stdafx.h" 13 #include "../video/video_driver.hpp" 14 #include "32bpp_anim_sse2.hpp" 17 #include "../safeguards.h" 20 static FBlitter_32bppSSE2_Anim iFBlitter_32bppSSE2_Anim;
22 void Blitter_32bppSSE2_Anim::PaletteAnimate(
const Palette &palette)
26 this->palette = palette;
32 const uint16 *anim = this->anim_buf;
35 bool screen_dirty =
false;
38 const int width = this->anim_buf_width;
39 const int screen_pitch = _screen.pitch;
40 const int anim_pitch = this->anim_buf_pitch;
42 __m128i brightness_cmp = _mm_set1_epi16(Blitter_32bppBase::DEFAULT_BRIGHTNESS);
43 __m128i colour_mask = _mm_set1_epi16(0xFF);
44 for (
int y = this->anim_buf_height; y != 0 ; y--) {
45 Colour *next_dst_ln = dst + screen_pitch;
46 const uint16 *next_anim_ln = anim + anim_pitch;
49 __m128i data = _mm_load_si128((
const __m128i *) anim);
52 __m128i colour_data = _mm_and_si128(data, colour_mask);
55 int colour_cmp_result = _mm_movemask_epi8(_mm_cmpgt_epi16(colour_data, anim_cmp));
56 if (colour_cmp_result) {
58 if (x < 8 || colour_cmp_result != 0xFFFF ||
59 _mm_movemask_epi8(_mm_cmpeq_epi16(_mm_srli_epi16(data, 8), brightness_cmp)) != 0xFFFF) {
61 for (
int z = min<int>(x, 8); z != 0 ; z--) {
62 int value = _mm_extract_epi16(data, 0);
63 uint8 colour =
GB(value, 0, 8);
66 *dst = AdjustBrightneSSE(LookupColourInPalette(colour),
GB(value, 8, 8));
69 data = _mm_srli_si128(data, 2);
74 for (
int z = 0; z < 8; z++) {
75 *dst = LookupColourInPalette(_mm_extract_epi16(colour_data, 0));
76 colour_data = _mm_srli_si128(colour_data, 2);
virtual void MakeDirty(int left, int top, int width, int height)=0
Mark a particular area dirty.
Information about the currently used palette.
bool _screen_disable_anim
Disable palette animation (important for 32bpp-anim blitter during giant screenshot) ...
int first_dirty
The first dirty element.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
Functions related to SSE 32 bpp blitter.
Structure to access the alpha, red, green, and blue channels from a 32 bit number.
Index in the _palettes array from which all animations are taking places (table/palettes.h)