src/blitter/32bpp_base.cpp
author peter1138
Tue, 29 Jan 2008 17:09:00 +0000
changeset 8941 f93c669d3ca6
parent 8619 c2434269c3eb
child 10429 1b99254f9607
permissions -rw-r--r--
(svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
8587
6db234b2b897 (svn r11652) -Codechange: add the svn $ header for several files
smatz
parents: 8134
diff changeset
     1
/* $Id$ */
6db234b2b897 (svn r11652) -Codechange: add the svn $ header for several files
smatz
parents: 8134
diff changeset
     2
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     3
#include "../stdafx.h"
8619
c2434269c3eb (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8587
diff changeset
     4
#include "../gfx_func.h"
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     5
#include "32bpp_base.hpp"
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     6
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     7
void *Blitter_32bppBase::MoveTo(const void *video, int x, int y)
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     8
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     9
	return (uint32 *)video + x + y * _screen.pitch;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    10
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    11
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    12
void Blitter_32bppBase::SetPixel(void *video, int x, int y, uint8 color)
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    13
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    14
	*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(color);
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    15
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    16
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    17
void Blitter_32bppBase::SetPixelIfEmpty(void *video, int x, int y, uint8 color)
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    18
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    19
	uint32 *dst = (uint32 *)video + x + y * _screen.pitch;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    20
	if (*dst == 0) *dst = LookupColourInPalette(color);
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    21
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    22
7443
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    23
void Blitter_32bppBase::DrawRect(void *video, int width, int height, uint8 color)
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    24
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    25
	uint32 color32 = LookupColourInPalette(color);
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    26
7443
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    27
	do {
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    28
		uint32 *dst = (uint32 *)video;
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    29
		for (int i = width; i > 0; i--) {
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    30
			*dst = color32;
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    31
			dst++;
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    32
		}
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    33
		video = (uint32 *)video + _screen.pitch;
b8c8a0d029fd (svn r10201) -Codechange: Replace Blitter::SetHorizontalLine with Blitter::DrawRect, as the former was only used by the rectangle drawing code anyway. This lets us draw rectangles in one go.
peter1138
parents: 7436
diff changeset
    34
	} while (--height);
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    35
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    36
7444
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    37
void Blitter_32bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    38
{
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    39
	int dy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    40
	int dx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    41
	int stepx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    42
	int stepy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    43
	int frac;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    44
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    45
	dy = (y2 - y) * 2;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    46
	if (dy < 0) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    47
		dy = -dy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    48
		stepy = -1;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    49
	} else {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    50
		stepy = 1;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    51
	}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    52
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    53
	dx = (x2 - x) * 2;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    54
	if (dx < 0) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    55
		dx = -dx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    56
		stepx = -1;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    57
	} else {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    58
		stepx = 1;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    59
	}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    60
8134
c0403a1217fc (svn r11169) -Fix [FS#1255]: obiwan in Blitter::Drawline(), which caused it to clip too much at screen/viewport borders. Patch by frosch.
rubidium
parents: 7928
diff changeset
    61
	if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
7444
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    62
	if (dx > dy) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    63
		frac = dy - (dx / 2);
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    64
		while (x != x2) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    65
			if (frac >= 0) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    66
				y += stepy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    67
				frac -= dx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    68
			}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    69
			x += stepx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    70
			frac += dy;
8134
c0403a1217fc (svn r11169) -Fix [FS#1255]: obiwan in Blitter::Drawline(), which caused it to clip too much at screen/viewport borders. Patch by frosch.
rubidium
parents: 7928
diff changeset
    71
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
7444
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    72
		}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    73
	} else {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    74
		frac = dx - (dy / 2);
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    75
		while (y != y2) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    76
			if (frac >= 0) {
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    77
				x += stepx;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    78
				frac -= dy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    79
			}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    80
			y += stepy;
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    81
			frac += dx;
8134
c0403a1217fc (svn r11169) -Fix [FS#1255]: obiwan in Blitter::Drawline(), which caused it to clip too much at screen/viewport borders. Patch by frosch.
rubidium
parents: 7928
diff changeset
    82
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
7444
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    83
		}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    84
	}
705a57aa0076 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 7443
diff changeset
    85
}
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
    86
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
    87
void Blitter_32bppBase::CopyFromBuffer(void *video, const void *src, int width, int height)
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    88
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    89
	uint32 *dst = (uint32 *)video;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    90
	uint32 *usrc = (uint32 *)src;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    91
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    92
	for (; height > 0; height--) {
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    93
		memcpy(dst, usrc, width * sizeof(uint32));
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
    94
		usrc += width;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
    95
		dst += _screen.pitch;
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    96
	}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    97
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    98
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
    99
void Blitter_32bppBase::CopyToBuffer(const void *video, void *dst, int width, int height)
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   100
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   101
	uint32 *udst = (uint32 *)dst;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   102
	uint32 *src = (uint32 *)video;
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   103
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   104
	for (; height > 0; height--) {
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   105
		memcpy(udst, src, width * sizeof(uint32));
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   106
		src += _screen.pitch;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   107
		udst += width;
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   108
	}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   109
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   110
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   111
void Blitter_32bppBase::CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   112
{
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   113
	uint32 *udst = (uint32 *)dst;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   114
	uint32 *src = (uint32 *)video;
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   115
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   116
	for (; height > 0; height--) {
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   117
		memcpy(udst, src, width * sizeof(uint32));
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   118
		src += _screen.pitch;
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   119
		udst += dst_pitch;
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   120
	}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   121
}
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   122
7447
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   123
void Blitter_32bppBase::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   124
{
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   125
	const uint32 *src;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   126
	uint32 *dst;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   127
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   128
	if (scroll_y > 0) {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   129
		/*Calculate pointers */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   130
		dst = (uint32 *)video + left + (top + height - 1) * _screen.pitch;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   131
		src = dst - scroll_y * _screen.pitch;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   132
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   133
		/* Decrease height and increase top */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   134
		top += scroll_y;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   135
		height -= scroll_y;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   136
		assert(height > 0);
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   137
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   138
		/* Adjust left & width */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   139
		if (scroll_x >= 0) {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   140
			dst += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   141
			left += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   142
			width -= scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   143
		} else {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   144
			src -= scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   145
			width += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   146
		}
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   147
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   148
		for (int h = height; h > 0; h--) {
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   149
			memcpy(dst, src, width * sizeof(uint32));
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   150
			src -= _screen.pitch;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   151
			dst -= _screen.pitch;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   152
		}
7447
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   153
	} else {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   154
		/* Calculate pointers */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   155
		dst = (uint32 *)video + left + top * _screen.pitch;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   156
		src = dst - scroll_y * _screen.pitch;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   157
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   158
		/* Decrese height. (scroll_y is <=0). */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   159
		height += scroll_y;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   160
		assert(height > 0);
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   161
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   162
		/* Adjust left & width */
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   163
		if (scroll_x >= 0) {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   164
			dst += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   165
			left += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   166
			width -= scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   167
		} else {
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   168
			src -= scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   169
			width += scroll_x;
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   170
		}
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   171
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   172
		/* the y-displacement may be 0 therefore we have to use memmove,
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   173
		 * because source and destination may overlap */
7481
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   174
		for (int h = height; h > 0; h--) {
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   175
			memmove(dst, src, width * sizeof(uint32));
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   176
			src += _screen.pitch;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   177
			dst += _screen.pitch;
699607d457a0 (svn r10241) -Codechange: CopyToBuffer now produces a buffer that is unreadable from outside the blitter, so the blitter can store anything he likes
truelight
parents: 7456
diff changeset
   178
		}
7447
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   179
	}
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   180
}
2537a074be26 (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 7444
diff changeset
   181
7433
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   182
int Blitter_32bppBase::BufferSize(int width, int height)
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   183
{
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   184
	return width * height * sizeof(uint32);
8e410e7ec0d7 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   185
}
7456
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   186
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   187
void Blitter_32bppBase::PaletteAnimate(uint start, uint count)
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   188
{
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   189
	/* By default, 32bpp doesn't have palette animation */
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   190
}
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   191
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   192
Blitter::PaletteAnimation Blitter_32bppBase::UsePaletteAnimation()
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   193
{
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   194
	return Blitter::PALETTE_ANIMATION_NONE;
0c0636370335 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 7447
diff changeset
   195
}