mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
329 lines
8.1 KiB
C++
329 lines
8.1 KiB
C++
|
/** (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);
|
||
|
}
|
||
|
}
|