13#include "../zoom_func.h"
14#include "../settings_type.h"
18#include "../safeguards.h"
21static FBlitter_32bppSSE2 iFBlitter_32bppSSE2;
39 uint all_sprites_size = 0;
40 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
42 auto &info = sd.infos[z];
43 info.sprite_width = src_sprite->
width;
44 info.sprite_offset = all_sprites_size;
45 info.sprite_line_size =
sizeof(Colour) * src_sprite->
width +
sizeof(uint32_t) * META_LENGTH;
47 const uint rgba_size = info.sprite_line_size * src_sprite->
height;
48 info.mv_offset = all_sprites_size + rgba_size;
50 const uint mv_size =
sizeof(MapValue) * src_sprite->
width * src_sprite->
height;
51 all_sprites_size += rgba_size + mv_size;
55 const auto &root_sprite = sprite.Root();
60 std::copy_n(
reinterpret_cast<std::byte *
>(&sd),
sizeof(SpriteData), dst_sprite->
data);
63 bool has_remap =
false;
64 bool has_anim =
false;
65 bool has_translucency =
false;
66 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
69 const auto &info = sd.infos[z];
70 Colour *dst_rgba_line =
reinterpret_cast<Colour *
>(&dst_sprite->
data[
sizeof(SpriteData) + info.sprite_offset]);
71 MapValue *dst_mv =
reinterpret_cast<MapValue *
>(&dst_sprite->
data[
sizeof(SpriteData) + info.mv_offset]);
72 for (uint y = src_sprite->height; y != 0; y--) {
73 Colour *dst_rgba = dst_rgba_line + META_LENGTH;
74 for (uint x = src_sprite->width; x != 0; x--) {
77 if (src->a != 0 && src->a != 255) has_translucency =
true;
85 const uint8_t rgb_max = std::max({src->r, src->g, src->b});
86 dst_mv->v = (rgb_max == 0) ? DEFAULT_BRIGHTNESS : rgb_max;
90 dst_rgba->r = colour.r;
91 dst_rgba->g = colour.g;
92 dst_rgba->b = colour.b;
97 dst_mv->v = DEFAULT_BRIGHTNESS;
101 *(uint16_t*) dst_mv = 0;
109 dst_rgba = dst_rgba_line + META_LENGTH;
110 uint32_t nb_pix_transp = 0;
111 for (uint x = src_sprite->width; x != 0; x--) {
112 if (dst_rgba->a == 0) nb_pix_transp++;
116 (*dst_rgba_line).data = nb_pix_transp;
118 Colour *nb_right = dst_rgba_line + 1;
119 dst_rgba_line =
reinterpret_cast<Colour *
>(
reinterpret_cast<std::byte *
>(dst_rgba_line) + info.sprite_line_size);
122 dst_rgba = dst_rgba_line - 1;
124 for (uint x = src_sprite->width; x != 0; x--) {
125 if (dst_rgba->a == 0) nb_pix_transp++;
129 (*nb_right).data = nb_pix_transp;
135 if (has_translucency) sd.flags.Set(SpriteFlag::Translucent);
136 if (!has_remap) sd.flags.Set(SpriteFlag::NoRemap);
137 if (!has_anim) sd.flags.Set(SpriteFlag::NoAnim);
138 std::copy_n(
reinterpret_cast<std::byte *
>(&sd),
sizeof(SpriteData), dst_sprite->
data);
Functions related to SSE 32 bpp blitter.
static Colour LookupColourInPalette(uint index)
Look up the colour in the current palette.
Interface for something that can allocate memory for a sprite.
T * Allocate(size_t size)
Allocate memory for a sprite.
SpriteType
Types of sprites that might be loaded.
@ Font
A sprite used for fonts.
static constexpr uint8_t PALETTE_ANIM_START
Index in the _palettes array from which all animations are taking places (table/palettes....
ClientSettings _settings_client
The current settings for this game.
GUISettings gui
settings related to the GUI
ZoomLevel zoom_min
minimum zoom out level
ZoomLevel zoom_max
maximum zoom out level
Definition of a common pixel in OpenTTD's realm.
Structure for passing information from the sprite loader to the blitter.
uint16_t width
Width of the sprite.
SpriteLoader::CommonPixel * data
The sprite itself.
uint16_t height
Height of the sprite.
Data structure describing a sprite.
uint16_t width
Width of the sprite.
uint16_t height
Height of the sprite.
int16_t y_offs
Number of pixels to shift the sprite downwards.
std::byte data[]
Sprite data.
int16_t x_offs
Number of pixels to shift the sprite to the right.
ZoomLevel
All zoom levels we know.