(svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer

This commit is contained in:
truelight
2007-06-18 20:08:21 +00:00
parent 49220cc6f1
commit 26e9b5ca5f
7 changed files with 120 additions and 47 deletions

View File

@@ -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)
{
return width * height * sizeof(uint32);

View File

@@ -21,6 +21,7 @@ public:
/* 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 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);
static inline uint32 LookupColourInPalette(uint8 index) {

View File

@@ -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)
{
return width * height;

View File

@@ -21,6 +21,7 @@ public:
/* 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 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);
};

View File

@@ -138,6 +138,18 @@ public:
*/
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.
* @param width The width of the buffer-to-be.

View File

@@ -22,6 +22,7 @@ public:
/* 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 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; };
};