2 * This file is part of OpenTTD.
3 * 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.
4 * 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.
5 * 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/>.
8 /** @file 8bpp_simple.cpp Implementation of the simple 8 bpp blitter. */
10 #include "../stdafx.h"
11 #include "../zoom_func.h"
12 #include "8bpp_simple.hpp"
14 #include "../safeguards.h"
16 /** Instantiation of the simple 8bpp blitter factory. */
17 static FBlitter_8bppSimple iFBlitter_8bppSimple
;
19 void Blitter_8bppSimple::Draw(Blitter::BlitterParams
*bp
, BlitterMode mode
, ZoomLevel zoom
)
21 const uint8
*src
, *src_line
;
22 uint8
*dst
, *dst_line
;
24 /* Find where to start reading in the source sprite */
25 src_line
= (const uint8
*)bp
->sprite
+ (bp
->skip_top
* bp
->sprite_width
+ bp
->skip_left
) * ScaleByZoom(1, zoom
);
26 dst_line
= (uint8
*)bp
->dst
+ bp
->top
* bp
->pitch
+ bp
->left
;
28 for (int y
= 0; y
< bp
->height
; y
++) {
30 dst_line
+= bp
->pitch
;
33 src_line
+= bp
->sprite_width
* ScaleByZoom(1, zoom
);
35 for (int x
= 0; x
< bp
->width
; x
++) {
41 colour
= bp
->remap
[*src
];
45 if (*src
!= 0) colour
= bp
->remap
[*dst
];
49 if (*src
!= 0) *dst
= 0;
56 if (colour
!= 0) *dst
= colour
;
58 src
+= ScaleByZoom(1, zoom
);
63 Sprite
*Blitter_8bppSimple::Encode(const SpriteLoader::Sprite
*sprite
, AllocatorProc
*allocator
)
66 dest_sprite
= (Sprite
*)allocator(sizeof(*dest_sprite
) + (size_t)sprite
->height
* (size_t)sprite
->width
);
68 dest_sprite
->height
= sprite
->height
;
69 dest_sprite
->width
= sprite
->width
;
70 dest_sprite
->x_offs
= sprite
->x_offs
;
71 dest_sprite
->y_offs
= sprite
->y_offs
;
73 /* Copy over only the 'remap' channel, as that is what we care about in 8bpp */
74 for (int i
= 0; i
< sprite
->height
* sprite
->width
; i
++) {
75 dest_sprite
->data
[i
] = sprite
->data
[i
].m
;