mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
This commit is contained in:
parent
49220cc6f1
commit
26e9b5ca5f
|
@ -121,6 +121,58 @@ void Blitter_32bppBase::MoveBuffer(void *video_dst, const void *video_src, int w
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Blitter_32bppBase::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
|
||||||
|
{
|
||||||
|
const uint32 *src;
|
||||||
|
uint32 *dst;
|
||||||
|
|
||||||
|
if (scroll_y > 0) {
|
||||||
|
/*Calculate pointers */
|
||||||
|
dst = (uint32 *)video + left + (top + height - 1) * _screen.pitch;
|
||||||
|
src = dst - scroll_y * _screen.pitch;
|
||||||
|
|
||||||
|
/* Decrease height and increase top */
|
||||||
|
top += scroll_y;
|
||||||
|
height -= scroll_y;
|
||||||
|
assert(height > 0);
|
||||||
|
|
||||||
|
/* Adjust left & width */
|
||||||
|
if (scroll_x >= 0) {
|
||||||
|
dst += scroll_x;
|
||||||
|
left += scroll_x;
|
||||||
|
width -= scroll_x;
|
||||||
|
} else {
|
||||||
|
src -= scroll_x;
|
||||||
|
width += scroll_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Negative height as we want to copy from bottom to top */
|
||||||
|
this->CopyFromBuffer(dst, src, width, -height, _screen.pitch);
|
||||||
|
} else {
|
||||||
|
/* Calculate pointers */
|
||||||
|
dst = (uint32 *)video + left + top * _screen.pitch;
|
||||||
|
src = dst - scroll_y * _screen.pitch;
|
||||||
|
|
||||||
|
/* Decrese height. (scroll_y is <=0). */
|
||||||
|
height += scroll_y;
|
||||||
|
assert(height > 0);
|
||||||
|
|
||||||
|
/* Adjust left & width */
|
||||||
|
if (scroll_x >= 0) {
|
||||||
|
dst += scroll_x;
|
||||||
|
left += scroll_x;
|
||||||
|
width -= scroll_x;
|
||||||
|
} else {
|
||||||
|
src -= scroll_x;
|
||||||
|
width += scroll_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the y-displacement may be 0 therefore we have to use memmove,
|
||||||
|
* because source and destination may overlap */
|
||||||
|
this->MoveBuffer(dst, src, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Blitter_32bppBase::BufferSize(int width, int height)
|
int Blitter_32bppBase::BufferSize(int width, int height)
|
||||||
{
|
{
|
||||||
return width * height * sizeof(uint32);
|
return width * height * sizeof(uint32);
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
|
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
|
||||||
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
|
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
|
||||||
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
|
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
|
||||||
|
/* virtual */ void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y);
|
||||||
/* virtual */ int BufferSize(int width, int height);
|
/* virtual */ int BufferSize(int width, int height);
|
||||||
|
|
||||||
static inline uint32 LookupColourInPalette(uint8 index) {
|
static inline uint32 LookupColourInPalette(uint8 index) {
|
||||||
|
|
|
@ -126,6 +126,58 @@ void Blitter_8bppBase::MoveBuffer(void *video_dst, const void *video_src, int wi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
|
||||||
|
{
|
||||||
|
const uint8 *src;
|
||||||
|
uint8 *dst;
|
||||||
|
|
||||||
|
if (scroll_y > 0) {
|
||||||
|
/*Calculate pointers */
|
||||||
|
dst = (uint8 *)video + left + (top + height - 1) * _screen.pitch;
|
||||||
|
src = dst - scroll_y * _screen.pitch;
|
||||||
|
|
||||||
|
/* Decrease height and increase top */
|
||||||
|
top += scroll_y;
|
||||||
|
height -= scroll_y;
|
||||||
|
assert(height > 0);
|
||||||
|
|
||||||
|
/* Adjust left & width */
|
||||||
|
if (scroll_x >= 0) {
|
||||||
|
dst += scroll_x;
|
||||||
|
left += scroll_x;
|
||||||
|
width -= scroll_x;
|
||||||
|
} else {
|
||||||
|
src -= scroll_x;
|
||||||
|
width += scroll_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Negative height as we want to copy from bottom to top */
|
||||||
|
this->CopyFromBuffer(dst, src, width, -height, _screen.pitch);
|
||||||
|
} else {
|
||||||
|
/* Calculate pointers */
|
||||||
|
dst = (uint8 *)video + left + top * _screen.pitch;
|
||||||
|
src = dst - scroll_y * _screen.pitch;
|
||||||
|
|
||||||
|
/* Decrese height. (scroll_y is <=0). */
|
||||||
|
height += scroll_y;
|
||||||
|
assert(height > 0);
|
||||||
|
|
||||||
|
/* Adjust left & width */
|
||||||
|
if (scroll_x >= 0) {
|
||||||
|
dst += scroll_x;
|
||||||
|
left += scroll_x;
|
||||||
|
width -= scroll_x;
|
||||||
|
} else {
|
||||||
|
src -= scroll_x;
|
||||||
|
width += scroll_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the y-displacement may be 0 therefore we have to use memmove,
|
||||||
|
* because source and destination may overlap */
|
||||||
|
this->MoveBuffer(dst, src, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Blitter_8bppBase::BufferSize(int width, int height)
|
int Blitter_8bppBase::BufferSize(int width, int height)
|
||||||
{
|
{
|
||||||
return width * height;
|
return width * height;
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
|
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
|
||||||
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
|
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
|
||||||
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
|
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
|
||||||
|
/* virtual */ void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y);
|
||||||
/* virtual */ int BufferSize(int width, int height);
|
/* virtual */ int BufferSize(int width, int height);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,18 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void MoveBuffer(void *video_dst, const void *video_src, int width, int height) = 0;
|
virtual void MoveBuffer(void *video_dst, const void *video_src, int width, int height) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scroll the videobuffer some 'x' and 'y' value.
|
||||||
|
* @param video The buffer to scroll into.
|
||||||
|
* @param left The left value of the screen to scroll.
|
||||||
|
* @param top The top value of the screen to scroll.
|
||||||
|
* @param width The width of the screen to scroll.
|
||||||
|
* @param height The height of the screen to scroll.
|
||||||
|
* @param scroll_x How much to scroll in X.
|
||||||
|
* @param scroll_y How much to scroll in Y.
|
||||||
|
*/
|
||||||
|
virtual void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate how much memory there is needed for an image of this size in the video-buffer.
|
* Calculate how much memory there is needed for an image of this size in the video-buffer.
|
||||||
* @param width The width of the buffer-to-be.
|
* @param width The width of the buffer-to-be.
|
||||||
|
|
|
@ -22,6 +22,7 @@ public:
|
||||||
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch) {};
|
/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch) {};
|
||||||
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch) {};
|
/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch) {};
|
||||||
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height) {};
|
/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height) {};
|
||||||
|
/* virtual */ void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) {};
|
||||||
/* virtual */ int BufferSize(int width, int height) { return 0; };
|
/* virtual */ int BufferSize(int width, int height) { return 0; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
48
src/gfx.cpp
48
src/gfx.cpp
|
@ -61,59 +61,13 @@ static byte _dirty_blocks[DIRTY_BYTES_PER_LINE * MAX_SCREEN_HEIGHT / 8];
|
||||||
void GfxScroll(int left, int top, int width, int height, int xo, int yo)
|
void GfxScroll(int left, int top, int width, int height, int xo, int yo)
|
||||||
{
|
{
|
||||||
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
|
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
|
||||||
const void *src;
|
|
||||||
void *dst;
|
|
||||||
|
|
||||||
if (xo == 0 && yo == 0) return;
|
if (xo == 0 && yo == 0) return;
|
||||||
|
|
||||||
if (_cursor.visible) UndrawMouseCursor();
|
if (_cursor.visible) UndrawMouseCursor();
|
||||||
UndrawTextMessage();
|
UndrawTextMessage();
|
||||||
|
|
||||||
if (yo > 0) {
|
blitter->ScrollBuffer(_screen.dst_ptr, left, top, width, height, xo, yo);
|
||||||
/*Calculate pointers */
|
|
||||||
dst = blitter->MoveTo(_screen.dst_ptr, left, top + height - 1);
|
|
||||||
src = blitter->MoveTo(dst, 0, -yo);
|
|
||||||
|
|
||||||
/* Decrease height and increase top */
|
|
||||||
top += yo;
|
|
||||||
height -= yo;
|
|
||||||
assert(height > 0);
|
|
||||||
|
|
||||||
/* Adjust left & width */
|
|
||||||
if (xo >= 0) {
|
|
||||||
dst = blitter->MoveTo(dst, xo, 0);
|
|
||||||
left += xo;
|
|
||||||
width -= xo;
|
|
||||||
} else {
|
|
||||||
src = blitter->MoveTo(src, -xo, 0);
|
|
||||||
width += xo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Negative height as we want to copy from bottom to top */
|
|
||||||
blitter->CopyFromBuffer(dst, src, width, -height, _screen.pitch);
|
|
||||||
} else {
|
|
||||||
/* Calculate pointers */
|
|
||||||
dst = blitter->MoveTo(_screen.dst_ptr, left, top);
|
|
||||||
src = blitter->MoveTo(dst, 0, -yo);
|
|
||||||
|
|
||||||
/* Decrese height. (yo is <=0). */
|
|
||||||
height += yo;
|
|
||||||
assert(height > 0);
|
|
||||||
|
|
||||||
/* Adjust left & width */
|
|
||||||
if (xo >= 0) {
|
|
||||||
dst = blitter->MoveTo(dst, xo, 0);
|
|
||||||
left += xo;
|
|
||||||
width -= xo;
|
|
||||||
} else {
|
|
||||||
src = blitter->MoveTo(src, -xo, 0);
|
|
||||||
width += xo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the y-displacement may be 0 therefore we have to use memmove,
|
|
||||||
* because source and destination may overlap */
|
|
||||||
blitter->MoveBuffer(dst, src, width, height);
|
|
||||||
}
|
|
||||||
/* This part of the screen is now dirty. */
|
/* This part of the screen is now dirty. */
|
||||||
_video_driver->make_dirty(left, top, width, height);
|
_video_driver->make_dirty(left, top, width, height);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue