summaryrefslogtreecommitdiff
path: root/wii/common.h
blob: b4408415b9adfaa044d4c6d38d23793e97eeb8d8 (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
#ifndef WIICOMMON_H
#define WIICOMMON_H

#include <QtGlobal>
#include <QtCore/QByteArray>
#include <QtGui/QColor>
#include <QtCore/QPointF>
#include <QtCore/QDataStream>
#include <QtCore/QStringList>
#include <QtCore/QDebug>
#include <QtCore/QVector>

inline quint32 AlignUp(quint32 value, quint32 alignTo) {
	return (value + alignTo - 1) & ~(alignTo - 1);
}

inline quint32 AlignDown(quint32 value, quint32 alignTo) {
	return value & ~(alignTo - 1);
}


inline quint32 BitExtract(quint32 value, int count, int start) {
	// this function relies on heavy compiler optimisation to be efficient :p
	quint32 mask = 0;
	for (int i = start; i < start+count; i++) {
		mask |= (0x80000000 >> i);
	}

	return (value & mask) >> (32 - (start + count));
}

inline quint32 BitInsert(quint32 value, int newValue, int count, int start) {
	quint32 mask = 0;
	for (int i = start; i < start+count; i++) {
		mask |= (0x80000000 >> i);
	}

	value &= ~mask;
	value |= (newValue << (32 - (start + count))) & mask;
	return value;
}

inline void WritePadding(int num, QDataStream &out) {
	for (int i = 0; i < num; i++)
		out << (quint8)0;
}




QByteArray PadByteArray(QByteArray original, int newLength, char padWith='\0');

inline quint32 ColorToRGBA(QColor col) {
	return (col.red() << 24) | (col.green() << 16) | (col.blue() << 8) | (col.alpha());
}

inline QColor RGBAToColor(quint32 col) {
	return QColor(col >> 24, (col >> 16) & 0xFF, (col >> 8) & 0xFF, col & 0xFF);
}

inline void ReadRGBA8Color(QColor &out, QDataStream &in) {
	quint32 col;
	in >> (quint32&)col;
	out = RGBAToColor(col);
}

inline void WriteRGBA8Color(const QColor in, QDataStream &out) {
	out << (quint32)ColorToRGBA(in);
}

inline void ReadS10Color(QColor &out, QDataStream &in) {
	quint16 r, g, b, a;
	in >> (quint16&)r;
	in >> (quint16&)g;
	in >> (quint16&)b;
	in >> (quint16&)a;
	out.setRgb(r, g, b, a);
}

inline void WriteS10Color(const QColor in, QDataStream &out) {
	out << (quint16)in.red();
	out << (quint16)in.green();
	out << (quint16)in.blue();
	out << (quint16)in.alpha();
}

inline void ReadPointF(QDataStream &stream, QPointF &point) {
	float x, y;
	stream >> x;
	stream >> y;
	point.setX(x);
	point.setY(y);
}

inline void WritePointF(QDataStream &stream, const QPointF &point) {
	stream << (float)point.x();
	stream << (float)point.y();
}

inline void InitDataStream(QDataStream &stream) {
	stream.setByteOrder(QDataStream::BigEndian);
	stream.setVersion(QDataStream::Qt_4_5);
}

QStringList ReadStringList(QDataStream &in);
void WriteStringList(QDataStream &out, QStringList list);

QString ReadFixedLengthASCII(QDataStream &in, int length);
void WriteFixedLengthASCII(QDataStream &out, QString str, int length);

#endif // WIICOMMON_H