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 8bpp_base.cpp Implementation of the base for all 8 bpp blitters. */
12 #include "../stdafx.h"
13 #include "../gfx_func.h"
14 #include "8bpp_base.hpp"
16 #include "../safeguards.h"
18 void Blitter_8bppBase::DrawColourMappingRect(void *dst
, int width
, int height
, PaletteID pal
)
20 const uint8
*ctab
= GetNonSprite(pal
, ST_RECOLOUR
) + 1;
23 for (int i
= 0; i
!= width
; i
++) *((uint8
*)dst
+ i
) = ctab
[((uint8
*)dst
)[i
]];
24 dst
= (uint8
*)dst
+ _screen
.pitch
;
28 void *Blitter_8bppBase::MoveTo(void *video
, int x
, int y
)
30 return (uint8
*)video
+ x
+ y
* _screen
.pitch
;
33 void Blitter_8bppBase::SetPixel(void *video
, int x
, int y
, uint8 colour
)
35 *((uint8
*)video
+ x
+ y
* _screen
.pitch
) = colour
;
38 void Blitter_8bppBase::DrawRect(void *video
, int width
, int height
, uint8 colour
)
41 memset(video
, colour
, width
);
42 video
= (uint8
*)video
+ _screen
.pitch
;
46 void Blitter_8bppBase::CopyFromBuffer(void *video
, const void *src
, int width
, int height
)
48 uint8
*dst
= (uint8
*)video
;
49 const uint8
*usrc
= (const uint8
*)src
;
51 for (; height
> 0; height
--) {
52 memcpy(dst
, usrc
, width
* sizeof(uint8
));
58 void Blitter_8bppBase::CopyToBuffer(const void *video
, void *dst
, int width
, int height
)
60 uint8
*udst
= (uint8
*)dst
;
61 const uint8
*src
= (const uint8
*)video
;
63 for (; height
> 0; height
--) {
64 memcpy(udst
, src
, width
* sizeof(uint8
));
70 void Blitter_8bppBase::CopyImageToBuffer(const void *video
, void *dst
, int width
, int height
, int dst_pitch
)
72 uint8
*udst
= (uint8
*)dst
;
73 const uint8
*src
= (const uint8
*)video
;
75 for (; height
> 0; height
--) {
76 memcpy(udst
, src
, width
* sizeof(uint8
));
82 void Blitter_8bppBase::ScrollBuffer(void *video
, int &left
, int &top
, int &width
, int &height
, int scroll_x
, int scroll_y
)
88 /* Calculate pointers */
89 dst
= (uint8
*)video
+ left
+ (top
+ height
- 1) * _screen
.pitch
;
90 src
= dst
- scroll_y
* _screen
.pitch
;
92 /* Decrease height and increase top */
97 /* Adjust left & width */
107 for (int h
= height
; h
> 0; h
--) {
108 memcpy(dst
, src
, width
* sizeof(uint8
));
109 src
-= _screen
.pitch
;
110 dst
-= _screen
.pitch
;
113 /* Calculate pointers */
114 dst
= (uint8
*)video
+ left
+ top
* _screen
.pitch
;
115 src
= dst
- scroll_y
* _screen
.pitch
;
117 /* Decrease height. (scroll_y is <=0). */
121 /* Adjust left & width */
131 /* the y-displacement may be 0 therefore we have to use memmove,
132 * because source and destination may overlap */
133 for (int h
= height
; h
> 0; h
--) {
134 memmove(dst
, src
, width
* sizeof(uint8
));
135 src
+= _screen
.pitch
;
136 dst
+= _screen
.pitch
;
141 int Blitter_8bppBase::BufferSize(int width
, int height
)
143 return width
* height
;
146 void Blitter_8bppBase::PaletteAnimate(const Palette
&palette
)
148 /* Video backend takes care of the palette animation */
151 Blitter::PaletteAnimation
Blitter_8bppBase::UsePaletteAnimation()
153 return Blitter::PALETTE_ANIMATION_VIDEO_BACKEND
;