src/blitter/8bpp_base.cpp
author bjarni
Thu, 19 Jun 2008 17:54:23 +0000
changeset 9561 f236daaaf93a
parent 9111 48ce04029fe4
child 10056 48659f7d4fa5
permissions -rw-r--r--
(svn r13584) -Fix: [OSX] Fixed issue where 10.5 failed to switch to fullscreen
This is done by selecting the 32bpp-anim blitter by default as it seems Apple removed some 8bpp support
Since this is done at runtime the same binary will still select 8bpp on 10.3 and 10.4
8091
674be8638d74 (svn r11652) -Codechange: add the svn $ header for several files
smatz
parents: 7638
diff changeset
     1
/* $Id$ */
674be8638d74 (svn r11652) -Codechange: add the svn $ header for several files
smatz
parents: 7638
diff changeset
     2
9111
48ce04029fe4 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 8123
diff changeset
     3
/** @file 8bpp_base.cpp Implementation of the base for all 8 bpp blitters. */
48ce04029fe4 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 8123
diff changeset
     4
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     5
#include "../stdafx.h"
8123
ce31d2843a95 (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8091
diff changeset
     6
#include "../gfx_func.h"
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     7
#include "8bpp_base.hpp"
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     8
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
     9
void Blitter_8bppBase::DrawColorMappingRect(void *dst, int width, int height, int pal)
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    10
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    11
	const uint8 *ctab = GetNonSprite(pal) + 1;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    12
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    13
	do {
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    14
		for (int i = 0; i != width; i++) *((uint8 *)dst + i) = ctab[((uint8 *)dst)[i]];
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    15
		dst = (uint8 *)dst + _screen.pitch;
6958
71b3acffa5d6 (svn r10214) -Fix: off-by-one in draw-rect-color-remapping (peter1138)
truelight
parents: 6951
diff changeset
    16
	} while (--height);
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    17
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    18
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    19
void *Blitter_8bppBase::MoveTo(const void *video, int x, int y)
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    20
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    21
	return (uint8 *)video + x + y * _screen.pitch;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    22
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    23
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    24
void Blitter_8bppBase::SetPixel(void *video, int x, int y, uint8 color)
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    25
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    26
	*((uint8 *)video + x + y * _screen.pitch) = color;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    27
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    28
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    29
void Blitter_8bppBase::SetPixelIfEmpty(void *video, int x, int y, uint8 color)
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    30
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    31
	uint8 *dst = (uint8 *)video + x + y * _screen.pitch;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    32
	if (*dst == 0) *dst = color;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    33
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    34
6947
2e14760f63f9 (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: 6940
diff changeset
    35
void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8 color)
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    36
{
6947
2e14760f63f9 (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: 6940
diff changeset
    37
	do {
2e14760f63f9 (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: 6940
diff changeset
    38
		memset(video, color, width);
2e14760f63f9 (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: 6940
diff changeset
    39
		video = (uint8 *)video + _screen.pitch;
2e14760f63f9 (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: 6940
diff changeset
    40
	} while (--height);
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    41
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    42
6948
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    43
void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    44
{
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    45
	int dy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    46
	int dx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    47
	int stepx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    48
	int stepy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    49
	int frac;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    50
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    51
	dy = (y2 - y) * 2;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    52
	if (dy < 0) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    53
		dy = -dy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    54
		stepy = -1;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    55
	} else {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    56
		stepy = 1;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    57
	}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    58
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    59
	dx = (x2 - x) * 2;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    60
	if (dx < 0) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    61
		dx = -dx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    62
		stepx = -1;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    63
	} else {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    64
		stepx = 1;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    65
	}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    66
7638
5f374c09da52 (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: 7432
diff changeset
    67
	if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
6948
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    68
	if (dx > dy) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    69
		frac = dy - (dx / 2);
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    70
		while (x != x2) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    71
			if (frac >= 0) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    72
				y += stepy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    73
				frac -= dx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    74
			}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    75
			x += stepx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    76
			frac += dy;
7638
5f374c09da52 (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: 7432
diff changeset
    77
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
6948
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    78
		}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    79
	} else {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    80
		frac = dx - (dy / 2);
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    81
		while (y != y2) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    82
			if (frac >= 0) {
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    83
				x += stepx;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    84
				frac -= dy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    85
			}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    86
			y += stepy;
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    87
			frac += dx;
7638
5f374c09da52 (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: 7432
diff changeset
    88
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
6948
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    89
		}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    90
	}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    91
}
d7d326482813 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
truelight
parents: 6947
diff changeset
    92
6985
d50d59dca7c1 (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: 6960
diff changeset
    93
void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height)
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    94
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    95
	uint8 *dst = (uint8 *)video;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    96
	uint8 *usrc = (uint8 *)src;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    97
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
    98
	for (; height > 0; height--) {
6985
d50d59dca7c1 (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: 6960
diff changeset
    99
		memcpy(dst, usrc, width * sizeof(uint8));
d50d59dca7c1 (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: 6960
diff changeset
   100
		usrc += width;
d50d59dca7c1 (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: 6960
diff changeset
   101
		dst += _screen.pitch;
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   102
	}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   103
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   104
6985
d50d59dca7c1 (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: 6960
diff changeset
   105
void Blitter_8bppBase::CopyToBuffer(const void *video, void *dst, int width, int height)
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   106
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   107
	uint8 *udst = (uint8 *)dst;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   108
	uint8 *src = (uint8 *)video;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   109
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   110
	for (; height > 0; height--) {
6985
d50d59dca7c1 (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: 6960
diff changeset
   111
		memcpy(udst, src, width * sizeof(uint8));
d50d59dca7c1 (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: 6960
diff changeset
   112
		src += _screen.pitch;
d50d59dca7c1 (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: 6960
diff changeset
   113
		udst += width;
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   114
	}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   115
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   116
6985
d50d59dca7c1 (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: 6960
diff changeset
   117
void Blitter_8bppBase::CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   118
{
6985
d50d59dca7c1 (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: 6960
diff changeset
   119
	uint8 *udst = (uint8 *)dst;
d50d59dca7c1 (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: 6960
diff changeset
   120
	uint8 *src = (uint8 *)video;
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   121
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   122
	for (; height > 0; height--) {
6985
d50d59dca7c1 (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: 6960
diff changeset
   123
		memcpy(udst, src, width * sizeof(uint8));
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   124
		src += _screen.pitch;
6985
d50d59dca7c1 (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: 6960
diff changeset
   125
		udst += dst_pitch;
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   126
	}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   127
}
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   128
6951
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   129
void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   130
{
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   131
	const uint8 *src;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   132
	uint8 *dst;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   133
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   134
	if (scroll_y > 0) {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   135
		/*Calculate pointers */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   136
		dst = (uint8 *)video + left + (top + height - 1) * _screen.pitch;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   137
		src = dst - scroll_y * _screen.pitch;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   138
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   139
		/* Decrease height and increase top */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   140
		top += scroll_y;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   141
		height -= scroll_y;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   142
		assert(height > 0);
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   143
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   144
		/* Adjust left & width */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   145
		if (scroll_x >= 0) {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   146
			dst += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   147
			left += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   148
			width -= scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   149
		} else {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   150
			src -= scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   151
			width += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   152
		}
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   153
6985
d50d59dca7c1 (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: 6960
diff changeset
   154
		for (int h = height; h > 0; h--) {
d50d59dca7c1 (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: 6960
diff changeset
   155
			memcpy(dst, src, width * sizeof(uint8));
d50d59dca7c1 (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: 6960
diff changeset
   156
			src -= _screen.pitch;
d50d59dca7c1 (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: 6960
diff changeset
   157
			dst -= _screen.pitch;
d50d59dca7c1 (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: 6960
diff changeset
   158
		}
6951
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   159
	} else {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   160
		/* Calculate pointers */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   161
		dst = (uint8 *)video + left + top * _screen.pitch;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   162
		src = dst - scroll_y * _screen.pitch;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   163
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   164
		/* Decrese height. (scroll_y is <=0). */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   165
		height += scroll_y;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   166
		assert(height > 0);
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   167
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   168
		/* Adjust left & width */
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   169
		if (scroll_x >= 0) {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   170
			dst += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   171
			left += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   172
			width -= scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   173
		} else {
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   174
			src -= scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   175
			width += scroll_x;
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   176
		}
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   177
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   178
		/* the y-displacement may be 0 therefore we have to use memmove,
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   179
		 * because source and destination may overlap */
6985
d50d59dca7c1 (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: 6960
diff changeset
   180
		for (int h = height; h > 0; h--) {
d50d59dca7c1 (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: 6960
diff changeset
   181
			memmove(dst, src, width * sizeof(uint8));
d50d59dca7c1 (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: 6960
diff changeset
   182
			src += _screen.pitch;
d50d59dca7c1 (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: 6960
diff changeset
   183
			dst += _screen.pitch;
d50d59dca7c1 (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: 6960
diff changeset
   184
		}
6951
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   185
	}
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   186
}
b24e0f108ede (svn r10206) -Codechange: more moving things to blitter-layer: ScrollBuffer
truelight
parents: 6948
diff changeset
   187
6937
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   188
int Blitter_8bppBase::BufferSize(int width, int height)
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   189
{
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   190
	return width * height;
40c760fcf1f6 (svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
diff changeset
   191
}
6960
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   192
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   193
void Blitter_8bppBase::PaletteAnimate(uint start, uint count)
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   194
{
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   195
	/* Video backend takes care of the palette animation */
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   196
}
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   197
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   198
Blitter::PaletteAnimation Blitter_8bppBase::UsePaletteAnimation()
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   199
{
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   200
	return Blitter::PALETTE_ANIMATION_VIDEO_BACKEND;
356d856462b6 (svn r10216) -Fix: palette animation always redid all palette entries, where in fact only a few indexes were needed
truelight
parents: 6958
diff changeset
   201
}