diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/draw_eq.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/draw_eq.cpp')
-rw-r--r-- | Src/Winamp/draw_eq.cpp | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/Src/Winamp/draw_eq.cpp b/Src/Winamp/draw_eq.cpp new file mode 100644 index 00000000..4d89e44e --- /dev/null +++ b/Src/Winamp/draw_eq.cpp @@ -0,0 +1,329 @@ +/** (c) Nullsoft, Inc. C O N F I D E N T I A L + ** Filename: + ** Project: + ** Description: + ** Author: + ** Created: + **/ +#include "Main.h" +#include "draw.h" +#include "plush/plush.h" +#include "WinampAttributes.h" +#include "resource.h" +#include "WADrawDC.h" + +HDC eqMainDC, eqMainDC2; +int enable_eq_windowshade_button; +HBITMAP eqMainBM = NULL, eqMainBM2 = NULL, eqExBM = NULL, eqOldmainBM2 = NULL, eqOldmainBM = NULL; + +extern "C" int eq_init = 0; +void draw_eq_init() +{ + EnterCriticalSection(&g_srcdccs); + if (eq_init) + draw_eq_kill(); + + eq_init=1; + HDC screenHdc = draw_GetWindowDC(hMainWindow); + + eqMainDC = CreateCompatibleDC(screenHdc); + eqMainDC2 = CreateCompatibleDC(screenHdc); + + enable_eq_windowshade_button = 2; + + // attempt to use the ISO eq image (if present) + if(config_eq_frequencies!=EQ_FREQUENCIES_WINAMP) + eqMainBM = draw_LBitmap(NULL, L"eqmain_iso.bmp"); + // otherwise we revert to the normal eq image + if (!eqMainBM) + eqMainBM = draw_LBitmap(NULL, L"eqmain.bmp"); + if (eqMainBM) + enable_eq_windowshade_button = 0; + // and if that fails then we revert to the built in classic skin resources + else + eqMainBM = draw_LBitmap(MAKEINTRESOURCE((config_eq_frequencies==EQ_FREQUENCIES_WINAMP)?IDB_EQMAIN:IDB_EQMAIN_ISO), NULL); + eqOldmainBM = (HBITMAP)SelectObject(eqMainDC, eqMainBM); + + eqExBM = draw_LBitmap(NULL, L"eq_ex.bmp"); + if (!eqExBM) + { + if (!skin_directory[0]) + enable_eq_windowshade_button = 1; + eqExBM = draw_LBitmap(MAKEINTRESOURCE(IDB_EQEX), NULL); + } + else + enable_eq_windowshade_button = 1; + + draw_ReleaseDC(hMainWindow, screenHdc); + + int x; + draw_eq_slid(0,config_preamp,0); + for (x = 1; x <= 10; x ++) + draw_eq_slid(x,eq_tab[x-1],0); + draw_eq_graphthingy(); + draw_eq_onauto(config_use_eq, config_autoload_eq, 0,0); + draw_eq_tbar(GetForegroundWindow()==hEQWindow?1:(config_hilite?0:1)); + draw_eq_presets(0); + + LeaveCriticalSection(&g_srcdccs); +} + +void draw_eq_kill() +{ + if (!eq_init) + return ; + EnterCriticalSection(&g_srcdccs); + SelectObject(eqMainDC, eqOldmainBM); + DeleteObject(eqMainBM); + eqMainBM = NULL; + + if (eqMainBM2) + { + SelectObject(eqMainDC2, eqOldmainBM2); + DeleteObject(eqMainBM2); + eqMainBM2 = NULL; + } + + DeleteDC(eqMainDC); + DeleteDC(eqMainDC2); + + if (eqExBM) + DeleteObject(eqExBM); + eqExBM=NULL; + LeaveCriticalSection(&g_srcdccs); +} + +static void update_area_eq(int x1, int y1, int w, int h) +{ + if (updateen && hEQWindow) + { + WADrawDC tDC(hEQWindow); + if (tDC && hEQWindow) + { + do_palmode(tDC); + if (!(config_dsize && config_eqdsize)) + { + BitBlt(tDC, x1, y1, w, h, eqMainDC, x1, y1, SRCCOPY); + if (eqMainBM2) + { + SelectObject(eqMainDC2, eqOldmainBM2); + DeleteObject(eqMainBM2); + eqMainBM2 = NULL; + } + } + else + { + if (!eqMainBM2) + { + eqMainBM2 = CreateCompatibleBitmap(mainDC, WINDOW_WIDTH * 2, WINDOW_HEIGHT * 2); + eqOldmainBM2 = (HBITMAP)SelectObject(eqMainDC2, eqMainBM2); + x1 = y1 = 0; + w = WINDOW_WIDTH; + h = WINDOW_HEIGHT; + } + StretchBlt(eqMainDC2, x1*2, y1*2, w*2, h*2, eqMainDC, x1, y1, w, h, SRCCOPY); + BitBlt(tDC, x1*2, y1*2, w*2, h*2, eqMainDC2, x1*2, y1*2, SRCCOPY); + } + } + } +} + +void draw_eq_presets(int pressed) +{ + int top = 18, left = 217; + int w = 44; + int h = 12; + BitBlt(eqMainDC, left, top, w, h, eqMainDC, 224, pressed ? 176 : 164, SRCCOPY); + update_area_eq(left, top, w, h); +} + +void draw_eq_tbar(int active) +{ + int l = active ? 134 : 149; + if (!eq_init) return ; + if (config_eq_ws) + { + int xo = 63; + int p = 94; + int r; + int xx = config_volume * 3 / 256; + setSrcBM(eqExBM); + BitBlt(eqMainDC, 0, 0, WINDOW_WIDTH, 14, bmDC, 0, active ? 0 : 15, SRCCOPY); + r = xo + (p * config_volume) / 255; + BitBlt(eqMainDC, r - 2, 4, 3, 7, bmDC, xx*3 + 1, 30, SRCCOPY); + r = 166 + (39 * (config_pan + 128)) / 255; + xx = (config_pan + 128) * 3 / 256; + BitBlt(eqMainDC, r - 2, 4, 3, 7, bmDC, xx*3 + 11, 30, SRCCOPY); + unsetSrcBM(); + } + else + { + BitBlt(eqMainDC, 0, 0, WINDOW_WIDTH, 14, eqMainDC, 0, l, SRCCOPY); + } + update_area_eq(0, 0, WINDOW_WIDTH, 14); +} + +void draw_eq_slid(int which, int pos, int pressed) // left to right, 0-64 +{ + int top = 38, h = 63; + int num_pos = 63 - 11; + int w = 14; + int xp; + int n = 0; + if (!which) + xp = 21; + else xp = 78 + (96 - 78) * (which - 1); + if (!eq_init) return ; + n = 27 - ((pos * 28) / 64); + if (n < 14) + BitBlt(eqMainDC, xp, top, w, h, eqMainDC, 13 + n*15, 164, SRCCOPY); + else + BitBlt(eqMainDC, xp, top, w, h, eqMainDC, 13 + (n - 14)*15, 229, SRCCOPY); + BitBlt(eqMainDC, xp + 1, top + h - 12 - ((63 - pos)*num_pos) / 64, 11, 11, eqMainDC, 0, pressed ? 176 : 164, SRCCOPY); + update_area_eq(xp, top, w, h); +} + +void draw_eq_onauto(int on, int autoon, int onpressed, int autopressed) +{ + int top = 18, left = 14; + int w1 = 25, w2 = 33; + int h = 12; + BitBlt(eqMainDC, left, top, w1, h, eqMainDC, 10 + (onpressed ? 118 : 0) + (on ? 59 : 0), 119, SRCCOPY); + BitBlt(eqMainDC, left + w1, top, w2, h, eqMainDC, 35 + (autopressed ? 118 : 0) + (autoon ? 59 : 0), 119, SRCCOPY); + update_area_eq(left, top, w1 + w2, h); +} + +void draw_eq_graphthingy() +{ + int top = 17, left = 86; + int src_top = 294; + int w = 113, h = 19; + float keys[12] = {0}; + pl_Spline spline = {keys, 1, 12, 0.0f, 0.0f, 0.1f}; + BitBlt(eqMainDC, left, top, w, h, eqMainDC, 0, src_top, SRCCOPY); + BitBlt(eqMainDC, left, top - 1 + h - (int)(config_preamp*19.0f / 64.0f), w, 1, eqMainDC, 0, 314, SRCCOPY); + { + int x; + int last_p = -1; + for (x = 0; x < 10; x ++) + keys[x + 1] = eq_tab[x] * 19.0f / 64.0f; + keys[0] = keys[1]; + keys[11] = keys[10]; + + for (x = 0; x < 109; x ++) + { + float p; + int this_p; + int lin_offs = 115; + plSplineGetPoint(&spline, 1.0f + x / 12.0f, &p); + this_p = (int)p; + if (this_p < 0) this_p = 0; + if (this_p > 18) this_p = 18; + if (last_p == -1 || this_p == last_p) + BitBlt(eqMainDC, left + 2 + x, top + this_p, 1, 1, eqMainDC, lin_offs, src_top + this_p, SRCCOPY); + else + { + if (this_p < last_p) + BitBlt(eqMainDC, left + 2 + x, top + this_p, 1, last_p - this_p + 1, eqMainDC, lin_offs, src_top + this_p, SRCCOPY); + else if (this_p > last_p) + BitBlt(eqMainDC, left + 2 + x, top + last_p, 1, this_p - last_p + 1, eqMainDC, lin_offs, src_top + last_p, SRCCOPY); + } + last_p = this_p; + } + } + update_area_eq(left, top, w, h); +} + +void draw_eq_tbutton(int b3, int wsb) +{ + setSrcBM(eqExBM); + if (config_eq_ws) + { + if (wsb) + BitBlt(eqMainDC, 254, 3, 9, 9, bmDC, 1, 47, SRCCOPY); + else + BitBlt(eqMainDC, 254, 3, 9, 9, bmDC, 254, 3, SRCCOPY); + BitBlt(eqMainDC, 264, 3, 9, 9, bmDC, 11, 38 + b3*9, SRCCOPY); + } + else + { + if (wsb && enable_eq_windowshade_button) + BitBlt(eqMainDC, 254, 3, 9, 9, bmDC, 1, 38, SRCCOPY); + else + BitBlt(eqMainDC, 254, 3, 9, 9, eqMainDC, 254, 137, SRCCOPY); + BitBlt(eqMainDC, 264, 3, 9, 9, eqMainDC, 0, 116 + b3*9, SRCCOPY); + } + unsetSrcBM(); + update_area_eq(253, 3, 20, 9); +} + +static void draw_paintDC_eq(HDC screenHdc, const RECT &r) +{ + int dsize = (config_dsize && config_eqdsize); + + do_palmode(screenHdc); + + if (!dsize) + { + BitBlt(screenHdc, r.left, r.top, r.right - r.left, r.bottom - r.top, eqMainDC, r.left, r.top, SRCCOPY); + if (eqMainBM2) + { + SelectObject(eqMainDC2, eqOldmainBM2); + DeleteObject(eqMainBM2); + eqMainBM2 = NULL; + } + } + else + { + if (!eqMainBM2) + { + eqMainBM2 = CreateCompatibleBitmap(mainDC, WINDOW_WIDTH * 2, WINDOW_HEIGHT * 2); + eqOldmainBM2 = (HBITMAP)SelectObject(eqMainDC2, eqMainBM2); + StretchBlt(eqMainDC2, 0, 0, WINDOW_WIDTH*2, WINDOW_HEIGHT*2, eqMainDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, SRCCOPY); + } + BitBlt(screenHdc, r.left, r.top, r.right - r.left, r.bottom - r.top, eqMainDC2, r.left, r.top, SRCCOPY); + } + +} + +void draw_printclient_eq(HDC hdc, LPARAM /*drawingOptions*/) +{ + RECT r; + GetClientRect(hEQWindow,&r); + draw_paintDC_eq(hdc, r); +} + +void draw_paint_eq(HWND hwnd) +{ + if (hwnd || hEQWindow) + { + HDC screenHdc; + PAINTSTRUCT ps; + RECT r; + + if (!eq_init) return ; + + if (hwnd) + { + GetUpdateRect(hwnd, &ps.rcPaint, 0); + EnterCriticalSection(&g_mainwndcs); + screenHdc = BeginPaint(hwnd, &ps); + memcpy(&r, &ps.rcPaint, sizeof(r)); + } + else + { + screenHdc = draw_GetWindowDC(hEQWindow); + GetClientRect(hEQWindow, &r); + } + + draw_paintDC_eq(screenHdc, r); + + if (hwnd) + { + EndPaint(hwnd, &ps); + LeaveCriticalSection(&g_mainwndcs); + } + else + draw_ReleaseDC(hEQWindow, screenHdc); + } +}
\ No newline at end of file |