aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/draw_pe.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/draw_pe.cpp')
-rw-r--r--Src/Winamp/draw_pe.cpp822
1 files changed, 822 insertions, 0 deletions
diff --git a/Src/Winamp/draw_pe.cpp b/Src/Winamp/draw_pe.cpp
new file mode 100644
index 00000000..c4570c4b
--- /dev/null
+++ b/Src/Winamp/draw_pe.cpp
@@ -0,0 +1,822 @@
+/** (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 "api.h"
+#include "../nu/AutoWide.h"
+#include "../nu/AutoChar.h"
+#include "resource.h"
+#include <bfc/platform/minmax.h>
+#include "WADrawDC.h"
+
+HBITMAP plMainBM=0;
+extern "C" int pe_init = 0;
+wchar_t playlistStr[19] = {0};
+int (WINAPI *jtf_drawtext)(HDC, LPCWSTR, int, LPRECT, UINT) = 0;
+
+void draw_pe_init()
+{
+ EnterCriticalSection(&g_srcdccs);
+ if (pe_init)
+ draw_pe_kill();
+ pe_init=1;
+ if (!plMainBM)
+ plMainBM = draw_LBitmap(MAKEINTRESOURCE(IDB_PLEDIT), L"pledit.bmp");
+ LeaveCriticalSection(&g_srcdccs);
+}
+
+void draw_pe_kill()
+{
+ if (!pe_init)
+ return;
+ EnterCriticalSection(&g_srcdccs);
+ DeleteObject(plMainBM);
+ plMainBM=0;
+ pe_init=0;
+ LeaveCriticalSection(&g_srcdccs);
+}
+
+void draw_set_plbm(HBITMAP bm)
+{
+ EnterCriticalSection(&g_srcdccs);
+ if (plMainBM)
+ DeleteObject(plMainBM);
+ plMainBM=bm;
+ LeaveCriticalSection(&g_srcdccs);
+}
+
+void draw_pe_iobut(int which) // -1 = none, 0 = load, 1=save, 2=clear
+{
+ if (!pe_init || disable_skin_borders) // if we're not init'd (shouldn't happen) or gen_ff is active
+ return;
+
+ int offs=config_pe_width-44;
+
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+
+ setSrcBM(plMainBM);
+
+ BitBlt(hdcout, offs-3, config_pe_height-30-18*2, 3, 18*3, bmDC, 250, 111, SRCCOPY);
+ BitBlt(hdcout, offs, config_pe_height-30-18*2, 22, 18, bmDC, (which==2)?227:204, 111, SRCCOPY);
+ BitBlt(hdcout, offs, config_pe_height-30-18, 22, 18, bmDC, (which==1)?227:204, 130, SRCCOPY);
+ BitBlt(hdcout, offs, config_pe_height-30, 22, 18, bmDC, (which==0)?227:204, 149, SRCCOPY);
+
+ unsetSrcBM();
+}
+
+static void draw_pe_infostr(HDC hdcout, wchar_t *str)
+{
+ StringCchCopyW(playlistStr, 18, str); // use 18 instead of 19 to keep the last byte null terminated
+ AutoChar narrowStr(str);
+ SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)(char *)narrowStr, IPC_CB_PEINFOTEXT);
+ playlistTextFeed->UpdateText(playlistStr, 19);
+
+ if (!pe_init)
+ return;
+ wchar_t data[19] = {0};
+ int x,xp=config_pe_width-143,yp=config_pe_height-28;
+
+ if (disable_skin_borders) return;
+
+ if (lstrlenW(str) < 18)
+ {
+ StringCchCopyW(data,19, str);
+ for (x = lstrlenW(str); x < 18; x ++) data[x]=L' ';
+ }
+ else memcpy(data,str,18*sizeof(wchar_t));
+ do_palmode(hdcout);
+ setSrcBM(fontBM);
+ for (x = 0; x < 18; x ++)
+ {
+ int c=0,c2=0;
+ getXYfromChar(data[x],&c,&c2);
+ BitBlt(hdcout,xp,yp,5,6,bmDC,c,c2,SRCCOPY);
+ xp+=5;
+ }
+ unsetSrcBM();
+}
+
+/* if we ever want to use a font rather than the skin bitmap, we can uncomment this
+void draw_pe_infostr_font(char *str)
+{
+ if (!pe_init)
+ return;
+ int xp=config_pe_width-145,yp=config_pe_height-30;
+ HDC hdcout;
+
+ SendMessageW(hMainWindow, WM_WA_IPC, reinterpret_cast<WPARAM>(str), IPC_CB_PEINFOTEXT);
+
+ if (disable_skin_borders) return;
+
+ hdcout=draw_GetWindowDC(hPLWindow);
+ do_palmode(hdcout);
+ HFONT oldfont = (HFONT) SelectObject(hdcout,mfont);
+ SetTextColor(hdcout,Skin_PLColors[0]);
+ SetBkColor(hdcout,Skin_PLColors[2]);
+
+ RECT r={xp, yp, xp+92, yp+10};
+ DrawText(hdcout, str, min(18, lstrlen(str)), &r, DT_CENTER| DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
+
+ SelectObject(hdcout,oldfont);
+ draw_ReleaseDC(hPLWindow,hdcout);
+}
+*/
+
+void draw_pe_miscbut(int which) // -1 = none, 0 = inf, 1 = sort, 2=misc
+{
+ if (!pe_init || disable_skin_borders) // if we're not init'd (shouldn't happen) or gen_ff is active
+ return;
+
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+
+ BitBlt(hdcout, 98, config_pe_height-30-18*2, 3, 18*3, bmDC, 200, 111, SRCCOPY);
+ BitBlt(hdcout, 101, config_pe_height-30-18*2, 22, 18, bmDC, (which==2)?177:154, 111, SRCCOPY);
+ BitBlt(hdcout, 101, config_pe_height-30-18, 22, 18, bmDC, (which==1)?177:154, 130, SRCCOPY);
+ BitBlt(hdcout, 101, config_pe_height-30, 22, 18, bmDC, (which==0)?177:154, 149, SRCCOPY);
+
+ unsetSrcBM();
+}
+
+void draw_pe_selbut(int which) // -1 = none, 0 = all, 1 = none, 2=inv
+{
+ if (!pe_init)
+ return;
+
+ if (disable_skin_borders) return;
+
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+
+ BitBlt(hdcout,69,config_pe_height-30-18*2,3,18*3,bmDC,150,111,SRCCOPY);
+ BitBlt(hdcout,72,config_pe_height-30-18*2,22,18,bmDC,(which==2)?127:104,111,SRCCOPY);
+ BitBlt(hdcout,72,config_pe_height-30-18,22,18,bmDC,(which==1)?127:104,130,SRCCOPY);
+ BitBlt(hdcout,72,config_pe_height-30,22,18,bmDC,(which==0)?127:104,149,SRCCOPY);
+
+ unsetSrcBM();
+}
+
+void draw_pe_rembut(int which) // -1 = none, 0 = sel, 1 = crop, 2 = all
+{
+ if (!pe_init)
+ return;
+
+ if (disable_skin_borders) return;
+
+
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+
+ BitBlt(hdcout,40,config_pe_height-30-18*3,3,18*4,bmDC,100,111,SRCCOPY);
+ BitBlt(hdcout,43,config_pe_height-30-18*3,22,18,bmDC,(which==3)?77:54,168,SRCCOPY);
+ BitBlt(hdcout,43,config_pe_height-30-18*2,22,18,bmDC,(which==2)?77:54,111,SRCCOPY);
+ BitBlt(hdcout,43,config_pe_height-30-18,22,18,bmDC,(which==1)?77:54,130,SRCCOPY);
+ BitBlt(hdcout,43,config_pe_height-30,22,18,bmDC,(which==0)?77:54,149,SRCCOPY);
+
+ unsetSrcBM();
+}
+
+void draw_pe_addbut(int which) // -1 = none, 0 = file, 1 = dir, 2 = loc
+{
+ if (!pe_init)
+ return;
+
+ if (disable_skin_borders) return;
+
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+
+ BitBlt(hdcout,11,config_pe_height-30-18*2,3,18*3,bmDC,48,111,SRCCOPY);
+ BitBlt(hdcout,14,config_pe_height-30-18*2,22,18,bmDC,(which==2)?23:0,111,SRCCOPY);
+ BitBlt(hdcout,14,config_pe_height-30-18,22,18,bmDC,(which==1)?23:0,130,SRCCOPY);
+ BitBlt(hdcout,14,config_pe_height-30,22,18,bmDC,(which==0)?23:0,149,SRCCOPY);
+
+ unsetSrcBM();
+}
+
+void draw_pe_vslide(HWND hwnd, HDC hdc, int pushed, int pos) // pos 0..playlist_getlength()-num_songs
+{
+ if (!pe_init)
+ return;
+ int track_h = config_pe_height-20-38;
+ int slid_h = 18;
+ //int w = 25;
+ int yp,y,oy;
+
+ WADrawDC hdcout(hdc, hwnd);
+ do_palmode(hdcout);
+
+ setSrcBM(plMainBM);
+ {
+ int num_songs=(config_pe_height-38-20-2)/pe_fontheight;
+ int t=PlayList_getlength()-num_songs;
+ if (t < 1) yp = 0;
+ else {
+ if (pos > t) pos=t;
+ yp = ((track_h-slid_h)*pos)/t;
+ if (yp < 0) yp = 0;
+ }
+ }
+ for (y = 0; y < yp-28; y += 29)
+ BitBlt(hdcout,config_pe_width-15,20+y,8,29,bmDC,36,42,SRCCOPY);
+ oy=y+29;
+ if (slid_h + yp > oy) oy+=29;
+ if (y < yp) BitBlt(hdcout,config_pe_width-15,20+y,8,yp-y,bmDC,36,42,SRCCOPY);
+ BitBlt(hdcout,config_pe_width-15,20+yp,8,slid_h,bmDC,pushed?61:52,53,SRCCOPY);
+ y=yp+slid_h;
+ if (y < oy && y < track_h) BitBlt(hdcout,config_pe_width-15,20+y,8,((y<track_h-29)?oy-y:track_h-y),bmDC,36,42+29-(oy-y),SRCCOPY);
+ y = oy;
+ for (y = oy; y < track_h; y += 29)
+ {
+ BitBlt(hdcout,config_pe_width-15,20+y,8,(y<track_h-29)?29:track_h-y,bmDC,36,42,SRCCOPY);
+ }
+
+ unsetSrcBM();
+}
+
+static void draw_pe_song(HDC hdcout, int pos, wchar_t *name, int time, int sel)
+{
+ if (!pe_init)
+ return;
+
+ int ypos, left, right, num_songs, fontHeight;
+ HFONT useFont;
+ COLORREF foreground, background;
+ HBRUSH useBrush;
+ if (pos < 0)
+ {
+ // if (config_pe_height != 14) return;
+ right = config_pe_width-29;
+ ypos = config_bifont?4:2;
+ left = 4;
+ num_songs = 1;
+ useFont=mfont;//shadefont;
+ fontHeight=10;
+ sel=0;
+ foreground=mfont_fgcolor;
+ background=mfont_bgcolor;
+ useBrush=mfont_bgbrush;
+ }
+ else
+ {
+ fontHeight=pe_fontheight;
+ right=config_pe_width-20;
+ ypos=22+pos*fontHeight,
+ left=12;
+ num_songs=(config_pe_height-38-20-2)/pe_fontheight;
+ useFont=font;
+ if (sel&2) foreground=Skin_PLColors[1];
+ else foreground= Skin_PLColors[0];
+ if (!(sel&1)) background= Skin_PLColors[2];
+ else background=Skin_PLColors[3];
+ useBrush=(sel&1)?selbrush:normbrush;
+ }
+ if (pos >= num_songs) return;
+
+ int xpos=left;
+ int endp=right;
+ int num_chars=(endp-xpos)/5;
+ if (pos>=0 || !config_bifont)
+ {
+ RECT r={xpos,ypos,endp, ypos+fontHeight};
+
+ SetTextColor(hdcout,foreground);
+ SetBkColor(hdcout,background);
+
+ do_palmode(hdcout);
+ HFONT oldfont = (HFONT) SelectObject(hdcout,useFont);
+
+ int rightToLeft = (config_pe_direction == PE_DIRECTION_RTL) || (config_pe_direction == PE_DIRECTION_AUTO && (GetFontLanguageInfo(hdcout) & GCP_REORDER));
+ if (time >= 0)
+ {
+ char str[123];
+ StringCchPrintfA(str,123," %d:%02d ",time/60,(time)%60); // format the time string
+
+ RECT r2=r;
+ if (pos == -1)
+ {
+ r2.top--;
+ r2.bottom--;
+ }
+
+ SIZE timeSize;
+#ifdef BENSKI_NEW_MODE_THAT_BREAKS_GEN_JUMPEX_STUPID_API_HIJACKING
+ // compute width of the string
+ GetTextExtentPoint32(hdcout, str, lstrlen(str), &timeSize);
+#else
+ DrawTextA(hdcout,str,lstrlenA(str),&r2,DT_VCENTER|DT_CALCRECT|DT_SINGLELINE/*|DT_NOCLIP*/|DT_NOPREFIX);
+ timeSize.cx = r2.right-r2.left;
+ r2.top = r.top;
+ r2.bottom = r.bottom;
+#endif
+ if (timeSize.cx < endp-xpos)
+ {
+ UINT alignment;
+
+ if (rightToLeft)
+ {
+ r2.left=xpos;
+ r2.right=xpos+timeSize.cx;
+
+ r.left+=timeSize.cx;
+ xpos+=timeSize.cx;
+ alignment=DT_LEFT|DT_RTLREADING;
+ }
+ else
+ {
+ r2.left=endp-timeSize.cx;
+ r2.right=endp;
+
+ r.right-=timeSize.cx;
+ endp-=timeSize.cx;
+ alignment=DT_RIGHT;
+ }
+
+ DrawTextA(hdcout,str,lstrlenA(str),&r2,DT_VCENTER|DT_SINGLELINE|alignment/*|DT_NOCLIP*/|DT_NOPREFIX); // fg: removed DT_NOCLIP to fix xp's cleartype from painting too far
+ }
+ }
+
+ UINT alignment;
+ if (rightToLeft)
+ {
+ alignment=DT_RIGHT|DT_RTLREADING;
+ }
+ else
+ {
+ alignment=DT_LEFT;
+ }
+
+ if (pos==-1)
+ CharUpperW(name);
+
+ int nameLen = lstrlenW(name);
+ int jtf_result = 0;
+ if (jtf_drawtext)
+ jtf_result=jtf_drawtext(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
+
+ if (!jtf_result)
+ DrawTextW(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
+
+ if (jtf_result != 2)
+ DrawTextW(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX|DT_CALCRECT);
+
+ HBRUSH oldbrush=(HBRUSH)SelectObject(hdcout,useBrush);
+ HPEN oldpen=(HPEN)SelectObject(hdcout,GetStockObject(NULL_PEN));
+ if (rightToLeft)
+ Rectangle(hdcout, xpos, r.top, 1+(endp-r.right)+r.left, 1+ypos+fontHeight);
+ else
+ Rectangle(hdcout,r.right,r.top,1+endp,1+ypos+fontHeight);
+ if (!pos || pos == num_songs-1)
+ {
+ SelectObject(hdcout,normbrush);
+ if (!pos)
+ Rectangle(hdcout, left, 20, 1+right, 1+23);
+ if (pos == num_songs-1)
+ Rectangle(hdcout, left, ypos+fontHeight, 1+right, config_pe_height-38+1);
+ }
+
+ SelectObject(hdcout,oldfont);
+ SelectObject(hdcout,oldpen);
+ SelectObject(hdcout,oldbrush);
+ }
+ else
+ {
+ int x;
+ char str[10]="";
+ setSrcBM(fontBM);
+ do_palmode(hdcout);
+ if (time >= 0)
+ {
+ StringCchPrintfA(str,10,"%d:%02d",time/60,(time)%60);
+ num_chars -= lstrlenA(str)+1;
+ }
+
+ for (x = 0; x < num_chars && name[x]; x ++)
+ {
+ int c2=0,c=0;
+ wchar_t oc;
+ oc=name[x];
+ if (x==num_chars-1 && name[x+1]) oc=L'\1';
+ getXYfromChar(oc,&c,&c2);
+ BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
+ xpos += 5;
+ }
+
+ if (!name[x])
+ {
+ int c2=0,c=0;
+ getXYfromChar(L' ',&c,&c2);
+ if (time >= 0) num_chars++;
+ while (x++ < num_chars)
+ {
+ BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
+ xpos += 5;
+ }
+ }
+
+ if (time >= 0)
+ {
+ int c2=0,c=0;
+ getXYfromChar(' ',&c,&c2);
+ BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
+ xpos += 5;
+ if (pos < 0)
+ xpos = config_pe_width-29-5*lstrlenA(str);
+ else
+ xpos = config_pe_width-24-5*lstrlenA(str);
+ for (x = 0; str[x]; x ++)
+ {
+ getXYfromChar(str[x],&c,&c2);
+ BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
+ xpos += 5;
+ }
+ }
+
+ if (xpos < config_pe_width-(pos<0?30:20))
+ {
+ int c2=0,c=0;
+ getXYfromChar(' ',&c,&c2);
+ BitBlt(hdcout,xpos,ypos,config_pe_width-(pos<0?30:20)-xpos,6,bmDC,c,c2,SRCCOPY);
+ }
+
+ unsetSrcBM();
+ }
+}
+
+void draw_pe_tbar(HWND hwnd, HDC hdc, int state)
+{
+ if (!pe_init)
+ return;
+ if (!disable_skin_borders)
+ {
+ WADrawDC hdcout(hdc, hwnd);
+ state = state?0:21;
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+ if (config_pe_height != 14)
+ {
+ int nt;
+ int xp=0;
+ BitBlt(hdcout,xp,0,25,20,bmDC,0,state,SRCCOPY);
+ xp+=25;
+ nt = (config_pe_width - 25 - 25 - 100)/25;
+ if (nt)
+ {
+ if (nt&1)
+ {
+ BitBlt(hdcout,xp,0,12,20,bmDC,127,state,SRCCOPY);
+ xp+=12;
+ }
+ nt/=2;
+ while (nt-->0)
+ {
+ BitBlt(hdcout,xp,0,25,20,bmDC,127,state,SRCCOPY);
+ xp+=25;
+ }
+ }
+
+ BitBlt(hdcout,xp,0,100,20,bmDC,26,state,SRCCOPY);
+ xp+=100;
+ nt = (config_pe_width - 25 - 25 - 100)/25;
+ if (nt)
+ {
+ if (nt&1)
+ {
+ BitBlt(hdcout,xp,0,13,20,bmDC,127,state,SRCCOPY);
+ xp+=13;
+ }
+ nt/=2;
+ while (nt-->0)
+ {
+ BitBlt(hdcout,xp,0,25,20,bmDC,127,state,SRCCOPY);
+ xp+=25;
+ }
+ }
+ nt = (config_pe_width - 25 - 25 - 100)%25;
+ if (nt)
+ {
+ StretchBlt(hdcout,xp,0,nt,20,bmDC,127,state,25,20,SRCCOPY);
+ xp+=nt;
+ }
+ BitBlt(hdcout,xp,0,25,20,bmDC,153,state,SRCCOPY);
+ }
+ else
+ {
+ int xpos=0;
+ int n = (config_pe_width - 50)/25;
+ BitBlt(hdcout,xpos,0,25,14,bmDC,72,42,SRCCOPY);
+ xpos+=25;
+ n--;
+ while (n--)
+ {
+ BitBlt(hdcout,xpos,0,25,14,bmDC,72,57,SRCCOPY);
+ xpos+=25;
+ }
+ n = (config_pe_width - 50)%25;
+ if (n)
+ {
+ StretchBlt(hdcout,xpos,0,n,14,bmDC,72,57,24,14,SRCCOPY);
+ xpos+=n;
+ }
+ BitBlt(hdcout,xpos,0,50,14,bmDC,99,state?57:42,SRCCOPY);
+ }
+ unsetSrcBM();
+
+ if (config_pe_height == 14)
+ {
+ wchar_t ft[FILETITLE_SIZE] = {0};
+ int q=PlayList_getPosition();
+ if (q >= 0 && q < PlayList_getlength())
+ {
+ if (!g_has_deleted_current)
+ {
+ PlayList_getitem_pl(PlayList_getPosition(),ft);
+ q=PlayList_getsonglength(PlayList_getPosition());
+ }
+ else
+ {
+ StringCchCopyW(ft,FILETITLE_SIZE, FileTitle);
+ q=in_getlength();
+ }
+ }
+ else
+ {
+ getStringW(IDS_PLEDIT_NOFILE_WSHADE,ft,FILETITLE_SIZE);
+ q=-1;
+ }
+ draw_pe_song(hdcout, -1,ft,q,state?0:2);
+ }
+ }
+}
+
+void draw_pe_timedisp(HDC hdc, int minutes, int seconds, int tlm, int clear)
+{
+ if (!pe_init)
+ return;
+ static int lastm, lasts, lastc=1,lasttlm;
+ int x=config_pe_width-94+8;
+ int y=config_pe_height-15;
+ if (!hPLWindow) return;
+ if (disable_skin_borders) return;
+
+ WADrawDC mainDC(hdc, hPLWindow);
+ if (minutes == -666) { minutes=lastm; seconds=lasts; clear=lastc; tlm=lasttlm; }
+
+ lastm=minutes; lasts=seconds; lastc=clear; lasttlm=tlm;
+
+ do_palmode(mainDC);
+
+ setSrcBM(fontBM);
+ if (clear)
+ {
+ BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+4,y,5,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+5+4,y,5,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5,y,5,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5+4+4,y,5,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5+4+5+4,y,5,6,bmDC,142,0,SRCCOPY);
+ }
+ else
+ {
+ if (tlm)
+ {
+ if (minutes < 0) minutes=-minutes;
+ if (seconds < 0) seconds=-seconds;
+ if (!(minutes/100)) BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+((minutes/100)?0:4),y,3,6,bmDC,75,6,SRCCOPY);
+ }
+ else
+ {
+ if (!(minutes/100)) BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
+ BitBlt(mainDC,x+((minutes/100)?0:4),y,3,6,bmDC,142,0,SRCCOPY);
+ }
+
+ if (minutes/100) BitBlt(mainDC,x+4,y,5,6,bmDC,5*((minutes/100)%10),6,SRCCOPY);
+ BitBlt(mainDC,x+5+4,y,5,6,bmDC,5*((minutes/10)%10),6,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5,y,5,6,bmDC,5*((minutes)%10),6,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5+4+4,y,5,6,bmDC,5*((seconds/10)%10),6,SRCCOPY);
+ BitBlt(mainDC,x+5+4+5+4+5+4,y,5,6,bmDC,5*((seconds)%10),6,SRCCOPY);
+ }
+ unsetSrcBM();
+}
+
+void draw_pe_tbutton(int b2, int b3, int b2_ws)
+{
+ if (!pe_init)
+ return;
+ if (disable_skin_borders) return;
+ {
+ WADrawDC hdcout(hPLWindow);
+ do_palmode(hdcout);
+ setSrcBM(plMainBM);
+ if (!b3)
+ BitBlt(hdcout,config_pe_width-11,3,9,9,bmDC,167,3,SRCCOPY);
+ else
+ BitBlt(hdcout,config_pe_width-11,3,9,9,bmDC,52,42,SRCCOPY);
+ if (!b2)
+ {
+ if (!b2_ws) BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,158,3,SRCCOPY);
+ else BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,128,45,SRCCOPY);
+ }
+ else
+ BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,b2_ws?150:62,42,SRCCOPY);
+ unsetSrcBM();
+ }
+}
+
+static bool IntersectY(int top1, int bottom1, int top2, int bottom2)
+{
+ int top = MAX(top1, top2);
+ int bottom = MIN(bottom1, bottom2);
+ return top <= bottom;
+}
+
+static void draw_pl(HWND hwnd, HDC hdcout)
+{
+ if (!pe_init)
+ return;
+ do_palmode(hdcout);
+ draw_pe_tbar(hwnd, hdcout, GetForegroundWindow()==hwnd?1:(config_hilite?0:1));
+ setSrcBM(plMainBM);
+ if (config_pe_height != 14)
+ {
+ int y;
+ int yp=20;
+ y=(config_pe_height-20-38)/29;
+ while (y-->0)
+ {
+ BitBlt(hdcout,0,yp,12,29,bmDC,0,42,SRCCOPY);
+ BitBlt(hdcout,config_pe_width-20,yp,5,29,bmDC,31,42,SRCCOPY);
+ BitBlt(hdcout,config_pe_width-7,yp,7,29,bmDC,31+13,42,SRCCOPY);
+ yp += 29;
+ }
+ y=(config_pe_height-20-38)%29;
+ if (y)
+ {
+ StretchBlt(hdcout,0,yp,12,y,bmDC,0,42,12,29,SRCCOPY);
+ StretchBlt(hdcout,config_pe_width-20,yp,5,y,bmDC,31,42,5,29,SRCCOPY);
+ StretchBlt(hdcout,config_pe_width-7,yp,7,y,bmDC,31+13,42,7,29,SRCCOPY);
+ yp += y;
+ }
+
+ if (!disable_skin_borders)
+ {
+ BitBlt(hdcout,0,yp,125,38,bmDC,0,72,SRCCOPY);
+ int x=(config_pe_width-125-150)/25;
+
+ int xp=125, s=0;
+ if (x >= 3) { x-=3; s=1;}
+ while (x-->0)
+ {
+ BitBlt(hdcout,xp,yp,25,38,bmDC,179,0,SRCCOPY);
+ xp+=25;
+ }
+ x = (config_pe_width-125-150)%25;
+ if (x)
+ {
+ StretchBlt(hdcout,xp,yp,x,38,bmDC,179,0,25,38,SRCCOPY);
+ xp+=x;
+ }
+ if (s)
+ {
+ BitBlt(hdcout,xp,yp,75,38,bmDC,205,0,SRCCOPY);
+ xp+=75;
+ }
+ BitBlt(hdcout,xp,yp,150,38,bmDC,126,72,SRCCOPY);
+ }
+ }
+ unsetSrcBM();
+}
+
+static void draw_pl2(HWND hwnd, HDC hdc, RECT &r)
+{
+ if (config_pe_height != 14)
+ {
+ {
+ int x,t;
+ int num_songs=(config_pe_height-38-20-2)/pe_fontheight;
+ if (pledit_disp_offs < 0) pledit_disp_offs=0;
+ t=PlayList_getlength()-pledit_disp_offs;
+ if (t < 1)
+ {
+ pledit_disp_offs=0;
+ t=PlayList_getlength();
+ }
+ if (t > num_songs) t = num_songs;
+ //LeaveCriticalSection(&g_mainwndcs);
+ for (x = 0; x < t; x ++)
+ {
+ int qt,b;
+
+ qt=22+x*pe_fontheight;
+ b=qt+pe_fontheight-1;
+ if (IntersectY(qt, b, r.top, r.bottom)
+ || (x == t-1 && config_pe_height-38 >= r.top))
+ {
+ wchar_t ft[FILETITLE_SIZE] = {0};
+ PlayList_getitem_pl(x+pledit_disp_offs,ft);
+
+ extern int g_has_deleted_current;
+ // EnterCriticalSection(&g_mainwndcs);
+ draw_pe_song(hdc, x,ft,PlayList_getsonglength(x+pledit_disp_offs),(PlayList_getselect(x+pledit_disp_offs) ? 1 : 0) + ((!g_has_deleted_current && PlayList_getPosition() == x+pledit_disp_offs) ? 2 : 0));
+ //LeaveCriticalSection(&g_mainwndcs);
+ }
+ }
+ //EnterCriticalSection(&g_mainwndcs);
+ wchar_t blank[] = L" ";
+ for (; x < num_songs; x ++)
+ {
+ draw_pe_song(hdc, x,blank ,-1,0);
+ }
+ if (r.right > config_pe_width-18 )
+ {
+ draw_pe_vslide(hwnd, hdc, 0, pledit_disp_offs);
+ }
+ }
+ draw_pe_timedisp(hdc, -666,0,0,0);
+ {
+ wchar_t str[64]=L"", str2[32]=L"";
+ {
+ int /*x=0,*/v,t,p=0;
+ int seltime=0,st2=0,st1=0, ttime=0;
+ v = PlayList_getlength();
+ for (t = 0; t < v; t ++)
+ {
+ int a = PlayList_getsonglength(t);
+ if (PlayList_getselect(t))
+ {
+ p++;
+ if (a<0)
+ st2=2;
+ else seltime += a;
+ }
+ if (a<0) st1=1;
+ //else x += a;
+ if (a > 0) ttime += a;
+ }
+ if (!seltime && !st2) StringCchCopyW(str,64, L"0:00");
+ else if (seltime)
+ {
+ if (seltime < 60*60)
+ StringCchPrintfW(str, 64, L"%d:%02d",seltime/60,seltime%60);
+ else
+ StringCchPrintfW(str,64, L"%d:%02d:%02d",seltime/60/60,(seltime/60)%60,seltime%60);
+ if (st2) StringCchCatW(str,64,L"+");
+ } else if (st2) StringCchCatW(str,64,L"?");
+
+ if (!ttime && !st1) StringCchCopyW(str2,32, L"0:00");
+ else if (ttime)
+ {
+ if (ttime < 60*60)
+ StringCchPrintfW(str2,32, L"%d:%02d",ttime/60,ttime%60);
+ else
+ StringCchPrintfW(str2,32,L"%d:%02d:%02d",ttime/60/60,(ttime/60)%60,ttime%60);
+ if (st1) StringCchCatW(str2,32,L"+");
+ } else if (st1) StringCchCatW(str2,32,L"?");
+ }
+ StringCchCatW(str,64,L"/");
+ StringCchCatW(str,64,str2);
+
+ draw_pe_infostr(hdc, str);
+ }
+ }
+}
+
+static void draw_paintDC_pe(HWND hwnd, HDC hdc, RECT &r)
+{
+ draw_pl(hwnd, hdc);
+}
+
+void draw_printclient_pe(HWND hwnd, HDC hdc, LPARAM /*drawingOptions*/)
+{
+ RECT r;
+ GetClientRect(hwnd,&r);
+ draw_paintDC_pe(hwnd, hdc, r);
+ draw_pl2(hwnd, hdc, r);
+}
+
+void draw_paint_pe(HWND hwnd)
+{
+ if (!pe_init)
+ return;
+ PAINTSTRUCT ps;
+ RECT r;
+ HDC hdc=BeginPaint(hwnd,&ps);
+ EnterCriticalSection(&g_mainwndcs);
+ r=ps.rcPaint;
+ draw_paintDC_pe(hwnd, hdc, r);
+ WADrawDC windowDC(0, hwnd);
+ draw_pl2(hwnd, windowDC, r);
+ LeaveCriticalSection(&g_mainwndcs);
+ EndPaint(hwnd,&ps);
+} \ No newline at end of file