ReactOS 0.4.16-dev-122-g325d74c
message.c
Go to the documentation of this file.
1//
2// message.c
3//
4// Dissolve in/out messages into the "matrix"
5//
6//
7//
8#include <windows.h>
9#include "globals.h"
10#include "message.h"
11#include "matrix.h"
12
13//
14// this isn't really a random-number generator. It's based on
15// a 16bit CRC algorithm. With the right mask (0xb400) it is possible
16// to call this function 65536 times and get a unique result every time
17// with *NO* repeats. The results look random but they're not - if we
18// call this function another 65536 times we get exactly the same results
19// in the same order. This is necessary for fading in messages because
20// we need to be guaranteed that all cells...it's completely uniform in
21// operation but looks random enough to be very effective
22//
24{
25 const WORD mask = 0xb400;
26
27 if(reg & 1)
28 reg = (reg >> 1) ^ mask;
29 else
30 reg = (reg >> 1);
31
32 return reg;
33}
34
35//
36// Set a new message based on font and text
37//
39{
40 HDC hdc;
41 RECT rect;
42 int x, y;
43
44 HDC hdcMessage;
45 HBITMAP hbmMessage;
46
47 HANDLE hOldFont, hOldBmp;
48
49 //
50 // Create a monochrome off-screen buffer
51 //
52 hdc = GetDC(NULL);
53
54 hdcMessage = CreateCompatibleDC(hdc);
55 hbmMessage = CreateBitmap(MAXMSG_WIDTH, MAXMSG_HEIGHT, 1, 1, 0);
56 hOldBmp = SelectObject(hdcMessage, hbmMessage);
57
59
60 //
61 // Draw text into bitmap
62 //
63 SetRect(&rect, 0, 0, msg->width, MAXMSG_HEIGHT);
65
66 hOldFont = SelectObject(hdcMessage, g_hFont);
68
69 OffsetRect(&rect, (msg->width-(rect.right-rect.left))/2, (msg->height-(rect.bottom-rect.top))/2);
71
72 //
73 // Convert bitmap into an array of cells for easy drawing
74 //
75 for(y = 0; y < msg->height; y++)
76 {
77 for(x = 0; x < msg->width; x++)
78 {
79 msg->message[x][y] = GetPixel(hdcMessage, x, y) ? 0 : 1;
80 }
81 }
82
83 //
84 // Cleanup
85 //
86 SelectObject(hdcMessage, hOldFont);
87 SelectObject(hdcMessage, hOldBmp);
88
89 DeleteDC(hdcMessage);
90 DeleteObject(hbmMessage);
91}
92
93//
94// Draw any part of the message that is visible. Make the
95// message "shimmer" by using a random glyph each time
96//
98{
99 int x, y;
100
101 for(x = 0; x < msg->width; x++)
102 for(y = 0; y < msg->height; y++)
103 if((msg->message[x][y] & 0x8000) &&
104 (msg->message[x][y] & 0x00FF))
105 {
107 }
108}
109
110//
111// Reveal specified amount of message
112//
114{
115 while(amount--)
116 {
117 int pos;
118
119 msg->random_reg1 = crc_msgrand(msg->random_reg1);
120 pos = msg->random_reg1 & 0xffff;
121
122 msg->message[pos / 256][pos % 256] |= GLYPH_REDRAW;
123 }
124}
125
126//
127// Reset (hide) the message
128//
130{
131 int x, y;
132
133 for(x = 0; x < msg->width; x++)
134 for(y = 0; y < msg->height; y++)
135 msg->message[x][y] = 0;
136}
137
138//
139// convert from 50-500 (fast-slow) to slow(50) - fast(500)
140//
142{
144}
145
146//
147// Called once for each iteration of the matrix
148//
150{
151 MATRIX_MESSAGE *msg = matrix->message;
152
153 int RealSpeed = MessageSpeed();
154
155 if(g_nNumMessages > 0)
156 {
157 // nothing to do yet..
158 if(msg->counter++ < 0)
159 return;
160
161 // has counter reached limit..clear the message
162 if(msg->counter++ == RealSpeed / 2 + (RealSpeed/4))
164
165 // reset counter + display a new message
166 if(msg->counter >= RealSpeed)
167 {
168 // mark all message-cells as being "invisible" so the
169 // message gets cleared by the matrix decoding naturally
170
172 msg->msgindex = crc_rand() % g_nNumMessages;
173 else
174 msg->msgindex = (msg->msgindex + 1) % g_nNumMessages;
175
176 // make a new message..initially invisible
177 SetMatrixMessage(msg, 0, g_szMessages[msg->msgindex]);
178
179 msg->counter = -(int)(crc_rand() % MSGSPEED_MAX);
180 }
181 // reveal the next part of the message
182 else if(msg->counter < RealSpeed / 2)
183 {
185 w = (1 << 16) + ((w<<16) / MSGSPEED_MAX);
186 w = (w * 3 * g_nMessageSpeed) >> 16;
187
188 RevealMatrixMessage(msg, w + 100);
189 }
190
191 //
192 // draw whatever part of the message is visible at this time
193 //
195 }
196}
197
198//
199// Set current font used for messages
200//
201void SetMessageFont(HWND hwnd, TCHAR *szFontName, int nPointSize, BOOL fBold)
202{
203 int lfHeight;
204 HDC hdc;
205 HFONT hFont;
206
207 hdc = GetDC(hwnd);
208
209 lfHeight = -MulDiv(nPointSize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
210
212
213 hFont = CreateFont(lfHeight, 0, 0, 0, fBold ? FW_BOLD: FW_NORMAL, 0, 0, 0,
216
217 if(hFont != 0)
218 {
219 if(g_hFont != 0)
221
222 g_hFont = hFont;
223 }
224}
225
226//
227// Create a message!
228//
230{
232
233 if((msg = malloc(sizeof(MATRIX_MESSAGE))) == 0)
234 return 0;
235
237
238 msg->msgindex = 0;
239 msg->width = min(width, MAXMSG_WIDTH);
240 msg->height = min(height, MAXMSG_HEIGHT);
241 msg->counter = -(int)(crc_rand() % MSGSPEED_MIN + MSGSPEED_MIN);
242
243 msg->random_reg1 = (WORD)GetTickCount();
244
246
248
249 return msg;
250}
#define msg(x)
Definition: auth_time.c:54
HFONT hFont
Definition: main.c:53
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
const WCHAR * text
Definition: package.c:1794
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum GLint GLuint mask
Definition: glext.h:6028
GLuint GLenum matrix
Definition: glext.h:9407
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
static int reg
Definition: i386-dis.c:1290
int g_nNumMessages
Definition: settings.c:14
#define MAX_INTENSITY
Definition: globals.h:15
#define MAXMSG_WIDTH
Definition: globals.h:23
BOOL g_fRandomizeMessages
Definition: settings.c:21
#define MAXMSG_HEIGHT
Definition: globals.h:24
TCHAR g_szMessages[MAX_MESSAGES][MAXMSG_LENGTH]
Definition: settings.c:13
BOOL g_fFontBold
Definition: settings.c:22
#define GLYPH_HEIGHT
Definition: globals.h:18
TCHAR g_szFontName[]
Definition: settings.c:16
int g_nFontSize
Definition: settings.c:20
int g_nMessageSpeed
Definition: settings.c:15
#define MSGSPEED_MIN
Definition: globals.h:28
#define GLYPH_WIDTH
Definition: globals.h:17
#define MSGSPEED_MAX
Definition: globals.h:27
int crc_rand()
Definition: matrix.c:18
HFONT g_hFont
Definition: settings.c:25
GLYPH RandomGlyph(int intensity)
Definition: matrix.c:45
void DrawGlyph(MATRIX *matrix, HDC hdc, int xpos, int ypos, GLYPH glyph)
Definition: matrix.c:167
#define GLYPH_REDRAW
Definition: matrix.h:20
int MessageSpeed()
Definition: message.c:141
void RevealMatrixMessage(MATRIX_MESSAGE *msg, int amount)
Definition: message.c:113
void DoMatrixMessage(HDC hdc, MATRIX *matrix)
Definition: message.c:149
void SetMessageFont(HWND hwnd, TCHAR *szFontName, int nPointSize, BOOL fBold)
Definition: message.c:201
void DrawMatrixMessage(MATRIX *matrix, MATRIX_MESSAGE *msg, HDC hdc)
Definition: message.c:97
MATRIX_MESSAGE * InitMatrixMessage(HWND hwnd, int width, int height)
Definition: message.c:229
void ClearMatrixMessage(MATRIX_MESSAGE *msg)
Definition: message.c:129
void SetMatrixMessage(MATRIX_MESSAGE *msg, HFONT hFont, TCHAR *text)
Definition: message.c:38
WORD crc_msgrand(WORD reg)
Definition: message.c:23
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define min(a, b)
Definition: monoChain.cc:55
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
& rect
Definition: startmenu.cpp:1413
Definition: matrix.h:44
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define DEFAULT_PITCH
Definition: wingdi.h:443
HGDIOBJ WINAPI GetStockObject(_In_ int)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
#define ANTIALIASED_QUALITY
Definition: wingdi.h:440
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define FW_BOLD
Definition: wingdi.h:378
#define LOGPIXELSY
Definition: wingdi.h:719
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define WHITE_BRUSH
Definition: wingdi.h:902
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:415
#define CreateFont
Definition: wingdi.h:4443
#define ANSI_CHARSET
Definition: wingdi.h:383
#define CLIP_DEFAULT_PRECIS
Definition: wingdi.h:426
#define FW_NORMAL
Definition: wingdi.h:373
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI DeleteDC(_In_ HDC)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define DT_CENTER
Definition: winuser.h:527
#define DrawText
Definition: winuser.h:5783
#define DT_WORDBREAK
Definition: winuser.h:544
HDC WINAPI GetDC(_In_opt_ HWND)
#define DT_VCENTER
Definition: winuser.h:543
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define DT_CALCRECT
Definition: winuser.h:526
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
char TCHAR
Definition: xmlstorage.h:189