4 * This file is part of OpenTTD.
5 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
6 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
10 /** @file 32bpp_simple.cpp Implementation of the simple 32 bpp blitter. */
12 #include "../stdafx.h"
13 #include "../zoom_func.h"
14 #include "32bpp_simple.hpp"
16 #include "../table/sprites.h"
18 #include "../safeguards.h"
20 /** Instantiation of the simple 32bpp blitter factory. */
21 static FBlitter_32bppSimple iFBlitter_32bppSimple
;
23 void Blitter_32bppSimple::Draw(Blitter::BlitterParams
*bp
, BlitterMode mode
, ZoomLevel zoom
)
25 const Blitter_32bppSimple::Pixel
*src
, *src_line
;
26 Colour
*dst
, *dst_line
;
28 /* Find where to start reading in the source sprite */
29 src_line
= (const Blitter_32bppSimple::Pixel
*)bp
->sprite
+ (bp
->skip_top
* bp
->sprite_width
+ bp
->skip_left
) * ScaleByZoom(1, zoom
);
30 dst_line
= (Colour
*)bp
->dst
+ bp
->top
* bp
->pitch
+ bp
->left
;
32 for (int y
= 0; y
< bp
->height
; y
++) {
34 dst_line
+= bp
->pitch
;
37 src_line
+= bp
->sprite_width
* ScaleByZoom(1, zoom
);
39 for (int x
= 0; x
< bp
->width
; x
++) {
42 /* In case the m-channel is zero, do not remap this pixel in any way */
44 if (src
->a
!= 0) *dst
= ComposeColourRGBA(src
->r
, src
->g
, src
->b
, src
->a
, *dst
);
46 if (bp
->remap
[src
->m
] != 0) *dst
= ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp
->remap
[src
->m
]), src
->v
), src
->a
, *dst
);
53 uint8 g
= MakeDark(src
->r
, src
->g
, src
->b
);
54 *dst
= ComposeColourRGBA(g
, g
, g
, src
->a
, *dst
);
57 if (bp
->remap
[src
->m
] != 0) *dst
= ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp
->remap
[src
->m
]), src
->v
), src
->a
, *dst
);
63 *dst
= Colour(0, 0, 0);
68 /* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
69 * This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
70 * we produce a result the newgrf maker didn't expect ;) */
72 /* Make the current colour a bit more black, so it looks like this image is transparent */
73 if (src
->a
!= 0) *dst
= MakeTransparent(*dst
, 192);
77 if (src
->a
!= 0) *dst
= ComposeColourRGBA(src
->r
, src
->g
, src
->b
, src
->a
, *dst
);
81 src
+= ScaleByZoom(1, zoom
);
86 void Blitter_32bppSimple::DrawColourMappingRect(void *dst
, int width
, int height
, PaletteID pal
)
88 Colour
*udst
= (Colour
*)dst
;
90 if (pal
== PALETTE_TO_TRANSPARENT
) {
92 for (int i
= 0; i
!= width
; i
++) {
93 *udst
= MakeTransparent(*udst
, 154);
96 udst
= udst
- width
+ _screen
.pitch
;
100 if (pal
== PALETTE_NEWSPAPER
) {
102 for (int i
= 0; i
!= width
; i
++) {
103 *udst
= MakeGrey(*udst
);
106 udst
= udst
- width
+ _screen
.pitch
;
111 DEBUG(misc
, 0, "32bpp blitter doesn't know how to draw this colour table ('%d')", pal
);
114 Sprite
*Blitter_32bppSimple::Encode(const SpriteLoader::Sprite
*sprite
, AllocatorProc
*allocator
)
116 Blitter_32bppSimple::Pixel
*dst
;
117 Sprite
*dest_sprite
= (Sprite
*)allocator(sizeof(*dest_sprite
) + (size_t)sprite
->height
* (size_t)sprite
->width
* sizeof(*dst
));
119 dest_sprite
->height
= sprite
->height
;
120 dest_sprite
->width
= sprite
->width
;
121 dest_sprite
->x_offs
= sprite
->x_offs
;
122 dest_sprite
->y_offs
= sprite
->y_offs
;
124 dst
= (Blitter_32bppSimple::Pixel
*)dest_sprite
->data
;
125 SpriteLoader::CommonPixel
*src
= (SpriteLoader::CommonPixel
*)sprite
->data
;
127 for (int i
= 0; i
< sprite
->height
* sprite
->width
; i
++) {
136 /* Get brightest value */
137 uint8 rgb_max
= max(src
->r
, max(src
->g
, src
->b
));
139 /* Black pixel (8bpp or old 32bpp image), so use default value */
140 if (rgb_max
== 0) rgb_max
= DEFAULT_BRIGHTNESS
;
143 /* Pre-convert the mapping channel to a RGB value */
144 Colour colour
= this->AdjustBrightness(this->LookupColourInPalette(src
->m
), dst
[i
].v
);