Files @ r7882:cdf03a4ac84a
Branch filter:

Location: cpp/openttd-patchpack/source/src/blitter/32bpp_base.cpp - annotation

rubidium
(svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
-Change: make extra sprites (the ones not in the TTD GRFs) replaceable using Action 5.
-Feature: make replacing contiguous subsets of sprites in for some types possible in Action 5.
Note to GRF authors: when you replaced OpenTTD sprites that are not from the TTD GRF files using Action A, your GRF will not have the intended result anymore as the sprite numbers have changed. You should replace the Action A with an Action 5 from now on.
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6947:c5e531edca92
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6947:c5e531edca92
r6937:bea726150bf3
r6937:bea726150bf3
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r7638:1d77b4c32fe9
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r7638:1d77b4c32fe9
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r7638:1d77b4c32fe9
r6948:a40a825a4044
r6948:a40a825a4044
r6948:a40a825a4044
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6985:c27a9a2405aa
r6937:bea726150bf3
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6985:c27a9a2405aa
r6937:bea726150bf3
r6985:c27a9a2405aa
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6985:c27a9a2405aa
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6951:4f69e3e27c06
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6937:bea726150bf3
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
r6960:e903748e34e4
#include "../stdafx.h"
#include "../gfx.h"
#include "32bpp_base.hpp"

void *Blitter_32bppBase::MoveTo(const void *video, int x, int y)
{
	return (uint32 *)video + x + y * _screen.pitch;
}

void Blitter_32bppBase::SetPixel(void *video, int x, int y, uint8 color)
{
	*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(color);
}

void Blitter_32bppBase::SetPixelIfEmpty(void *video, int x, int y, uint8 color)
{
	uint32 *dst = (uint32 *)video + x + y * _screen.pitch;
	if (*dst == 0) *dst = LookupColourInPalette(color);
}

void Blitter_32bppBase::DrawRect(void *video, int width, int height, uint8 color)
{
	uint32 color32 = LookupColourInPalette(color);

	do {
		uint32 *dst = (uint32 *)video;
		for (int i = width; i > 0; i--) {
			*dst = color32;
			dst++;
		}
		video = (uint32 *)video + _screen.pitch;
	} while (--height);
}

void Blitter_32bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
{
	int dy;
	int dx;
	int stepx;
	int stepy;
	int frac;

	dy = (y2 - y) * 2;
	if (dy < 0) {
		dy = -dy;
		stepy = -1;
	} else {
		stepy = 1;
	}

	dx = (x2 - x) * 2;
	if (dx < 0) {
		dx = -dx;
		stepx = -1;
	} else {
		stepx = 1;
	}

	if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
	if (dx > dy) {
		frac = dy - (dx / 2);
		while (x != x2) {
			if (frac >= 0) {
				y += stepy;
				frac -= dx;
			}
			x += stepx;
			frac += dy;
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
		}
	} else {
		frac = dx - (dy / 2);
		while (y != y2) {
			if (frac >= 0) {
				x += stepx;
				frac -= dy;
			}
			y += stepy;
			frac += dx;
			if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
		}
	}
}

void Blitter_32bppBase::CopyFromBuffer(void *video, const void *src, int width, int height)
{
	uint32 *dst = (uint32 *)video;
	uint32 *usrc = (uint32 *)src;

	for (; height > 0; height--) {
		memcpy(dst, usrc, width * sizeof(uint32));
		usrc += width;
		dst += _screen.pitch;
	}
}

void Blitter_32bppBase::CopyToBuffer(const void *video, void *dst, int width, int height)
{
	uint32 *udst = (uint32 *)dst;
	uint32 *src = (uint32 *)video;

	for (; height > 0; height--) {
		memcpy(udst, src, width * sizeof(uint32));
		src += _screen.pitch;
		udst += width;
	}
}

void Blitter_32bppBase::CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
{
	uint32 *udst = (uint32 *)dst;
	uint32 *src = (uint32 *)video;

	for (; height > 0; height--) {
		memcpy(udst, src, width * sizeof(uint32));
		src += _screen.pitch;
		udst += dst_pitch;
	}
}

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;
		}

		for (int h = height; h > 0; h--) {
			memcpy(dst, src, width * sizeof(uint32));
			src -= _screen.pitch;
			dst -= _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 */
		for (int h = height; h > 0; h--) {
			memmove(dst, src, width * sizeof(uint32));
			src += _screen.pitch;
			dst += _screen.pitch;
		}
	}
}

int Blitter_32bppBase::BufferSize(int width, int height)
{
	return width * height * sizeof(uint32);
}

void Blitter_32bppBase::PaletteAnimate(uint start, uint count)
{
	/* By default, 32bpp doesn't have palette animation */
}

Blitter::PaletteAnimation Blitter_32bppBase::UsePaletteAnimation()
{
	return Blitter::PALETTE_ANIMATION_NONE;
}