Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ImageMix.h « VideoTexture « gameengine « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: bf7a4be792fb0463cdfa99d8b48329a02747dde7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software  Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * Copyright (c) 2007 The Zdeno Ash Miklas
 *
 * This source file is part of VideoTexture library
 *
 * Contributor(s):
 *
 * ***** END GPL LICENSE BLOCK *****
 */

/** \file ImageMix.h
 *  \ingroup bgevideotex
 */

#ifndef __IMAGEMIX_H__
#define __IMAGEMIX_H__


#include "Common.h"

#include "ImageBase.h"
#include "FilterBase.h"


/// class for source mixing
class ImageSourceMix : public ImageSource
{
public:
	/// constructor
	ImageSourceMix (const char *id) : ImageSource(id), m_offset(0), m_weight(0x100) {}
	/// destructor
	virtual ~ImageSourceMix (void) {}

	/// get offset
	long long getOffset (void) { return m_offset; }
	/// set offset
	void setOffset (unsigned int * firstImg) { m_offset = m_image - firstImg; }

	/// get weight
	short getWeight (void) { return m_weight; }
	/// set weight
	void setWeight (short weight) { m_weight = weight; }

protected:
	/// buffer offset to the first source buffer
	long long m_offset;
	/// source weight
	short m_weight;
};


/// class for image mixer
class ImageMix : public ImageBase
{
public:
	/// constructor
	ImageMix (void) : ImageBase(false) {}

	/// destructor
	virtual ~ImageMix (void) {}

	/// get weight
	short getWeight(const char *id);
	/// set weight
	bool setWeight(const char *id, short weight);

protected:

	/// create new source
	virtual ImageSource *newSource(const char *id) { return new ImageSourceMix(id); }

	/// calculate image from sources and set its availability
	virtual void calcImage (unsigned int texId, double ts);
};


/// pixel filter for image mixer
class FilterImageMix : public FilterBase
{
public:
	/// constructor
	FilterImageMix (ImageSourceList & sources) : m_sources(sources) {}
	/// destructor
	virtual ~FilterImageMix (void) {}

protected:
	/// source list
	ImageSourceList & m_sources;

	/// filter pixel, source int buffer
	virtual unsigned int filter (unsigned int * src, short x, short y,
		short * size, unsigned int pixSize, unsigned int val = 0)
	{
		// resulting pixel color
		int color[] = {0, 0, 0, 0};
		// iterate sources
		for (ImageSourceList::iterator it = m_sources.begin(); it != m_sources.end(); ++it)
		{
			// get pointer to mixer source
			ImageSourceMix * mixSrc = static_cast<ImageSourceMix*>(*it);
			// add weighted source pixel to result
			color[0] += mixSrc->getWeight() * (src[mixSrc->getOffset()] & 0xFF);
			color[1] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 8) & 0xFF);
			color[2] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 16) & 0xFF);
			color[3] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 24) & 0xFF);
		}
		// return resulting color
		return ((color[0] >> 8) & 0xFF) | (color[1] & 0xFF00)
			| ((color[2] << 8) & 0xFF0000) | ((color[3] << 16) & 0xFF000000);
	}
};


#endif