-
Notifications
You must be signed in to change notification settings - Fork 0
/
ImageLayerImpl.h
128 lines (104 loc) ยท 3.92 KB
/
ImageLayerImpl.h
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
#pragma once
#pragma comment (lib, "Msimg32.lib")
#include <Windows.h>
#include "ImageLayer.h"
#define CONSOLE_WIDTH 180
#define CONSOLE_HEIGHT 50
#define IMAGE_SCALE 2
#define RESOLUTION_SCALE 16
#define WINDOW_WIDTH (CONSOLE_WIDTH * RESOLUTION_SCALE)
#define WINDOW_HEIGHT (CONSOLE_HEIGHT * RESOLUTION_SCALE*2)
typedef struct{ // ๊ฐ๋ก ์ธ๋ก ๊ตฌ์กฐ์ฒด ์ ์ธ
int width, height;
}Size;
inline Size getBitmapSize(HBITMAP bitmap) { //์ฝ์์ฐฝ์ ๋นํธ๋งต ์ฌ์ด์ฆ๋ฅผ ๋ฆฌํดํ๋ค.
BITMAP tmpBitmap;
GetObject(bitmap, sizeof(BITMAP), &tmpBitmap);
const Size bitmapSize = { tmpBitmap.bmWidth, tmpBitmap.bmHeight };
return bitmapSize;
}
inline HDC createNewBackDC(HDC compatibleDC) { //๋ท๋ฐฐ๊ฒฝ์ ์์ฑํ๋ค.
const HDC backDC = CreateCompatibleDC(compatibleDC);
const HBITMAP backBitmap = CreateCompatibleBitmap(compatibleDC, WINDOW_WIDTH, WINDOW_HEIGHT);
SelectObject(backDC, backBitmap);
DeleteObject(backBitmap);
return backDC;
}
inline void putBitmapToBackDC(HDC backDC, Image image, UINT transparentColor) { // ๋นํธ๋งต์ ๋ท๋ฐฐ๊ฒฝ์ ๋ณต์ฌํ๋ค.
const HDC bitmapDC = CreateCompatibleDC(backDC);
const HBITMAP bitmap = (HBITMAP)LoadImage(NULL, (LPCWSTR)image.fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(bitmapDC, bitmap);
double scale = image.scale;
if (scale == 0) scale = IMAGE_SCALE;
const Size bitmapSize = getBitmapSize(bitmap);
TransparentBlt(backDC, image.x, image.y, bitmapSize.width * scale, bitmapSize.height * scale,
bitmapDC, 0, 0, bitmapSize.width, bitmapSize.height, transparentColor);
DeleteObject(bitmap);
DeleteDC(bitmapDC);
}
inline void applyToConsoleDC(HDC consoleDC, HDC srcDC) { // ์ฝ์์ฐฝ์ ์ ์ฉํ๋ค.
BitBlt(consoleDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,
srcDC, 0, 0, SRCCOPY);
}
inline void _initialize(ImageLayer* self) { // init, ์ ์ธ
self->_windowHandle = GetConsoleWindow();
self->_consoleDC = GetDC(self->_windowHandle);
}
inline HDC getRenderedBackDC(ImageLayer* self) { // ๋ ๋๊ฐ ๋ ๋ท ๋ฐฐ๊ฒฝ์ ๋ถ๋ฌ์จ๋ค.
const HDC backDC = createNewBackDC(self->_consoleDC);
for (int i = 0; i < self->imageCount; i++) {
putBitmapToBackDC(backDC, self->images[i], self->transparentColor);
}
return backDC;
}
inline void _renderAll(ImageLayer* self) { // ๋ณ๊ฒฝ์ฌํญ์ ๋ ๋๋ง ํด์ ๋ณด์ฌ์ค๋ค.
const HDC backDC = getRenderedBackDC(self);
applyToConsoleDC(self->_consoleDC, backDC);
DeleteDC(backDC);
}
inline BLENDFUNCTION getBlendFunction() { // ํฌ๋ช
๋ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํ ํจ์
BLENDFUNCTION bf;
bf.AlphaFormat = AC_SRC_ALPHA;
bf.BlendFlags = 0;
bf.BlendOp = AC_SRC_OVER;
bf.SourceConstantAlpha = 0;
return bf;
}
inline void _renderAndFadeIn(ImageLayer* self) { // ์ด๋์ด ํ๋ฉด๋ถํฐ ๋ถ๋๋ฝ๊ฒ ๋ค์ด์ค๋ ํจ๊ณผ๋ฅผ ๋ธ๋ค.
const HDC consoleDC = self->_consoleDC;
const HDC backDC = getRenderedBackDC(self);
const HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(consoleDC, blackBrush);
BLENDFUNCTION bf = getBlendFunction();
bf.SourceConstantAlpha = 12;
Rectangle(consoleDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
for (int i = 0; i < 20; i++) {
AlphaBlend(consoleDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,
backDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, bf);
}
applyToConsoleDC(consoleDC, backDC);
DeleteObject(blackBrush);
DeleteDC(backDC);
}
inline void applyToDC(HDC dstDC, HDC srcDC) { // DC์ ์ ์ฉํ๋ค.
BitBlt(dstDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,
srcDC, 0, 0, SRCCOPY);
}
inline void _renderAndFadeOut(ImageLayer* self) { // ๊ฒ์ ํ๋ฉด๊ณผ ํจ๊ป ๋ถ๋๋ฝ๊ฒ ํ๋ฉด์ด ๊บผ์ง๋ค.
const HDC consoleDC = self->_consoleDC;
const HDC backDC = getRenderedBackDC(self);
if (applyToDC != NULL) applyToDC(consoleDC, backDC);
applyToDC(consoleDC, backDC);
const HDC blackDC = createNewBackDC(consoleDC);
BLENDFUNCTION bf = getBlendFunction();
for (int i = 255; i >= 0; i -= 20) {
bf.SourceConstantAlpha = i;
applyToDC(consoleDC, blackDC);
AlphaBlend(consoleDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,
backDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, bf);
//Sleep(60);
}
applyToDC(consoleDC, blackDC);
DeleteDC(backDC);
DeleteDC(blackDC);
}