aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/about.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mp3/about.cpp')
-rw-r--r--Src/Plugins/Input/in_mp3/about.cpp576
1 files changed, 576 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/about.cpp b/Src/Plugins/Input/in_mp3/about.cpp
new file mode 100644
index 00000000..7bc3ae04
--- /dev/null
+++ b/Src/Plugins/Input/in_mp3/about.cpp
@@ -0,0 +1,576 @@
+#include <windows.h>
+#include "main.h"
+#if 1
+BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ if (uMsg == WM_COMMAND && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)) EndDialog(hwndDlg,0);
+ return 0;
+}
+
+#else
+#include <commctrl.h>
+
+#include ".\graphics\image.h"
+#include ".\graphics\imagefilters.h"
+#include <strsafe.h>
+
+
+
+#define random( min, max ) (( rand() % (int)((( max ) + 1 ) - ( min ))) + ( min ))
+
+HBITMAP LoadImageFromResource(INT_PTR handle);
+
+#define LEGAL_COUNT 4
+wchar_t *legal[] = {L"Copyright (C) 1998-2006 - Nullsoft, Inc.",
+ L"MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and THOMSON multimedia.",
+ L"VLB decoding copyright 1998-2002 by Dolby Laboratories, Inc. All rights reserved.",
+ L"AAC && aacPlus decoding copyright 1998-2006 by Coding Technologies, Inc. All rights reserved."};
+
+HFONT fntPlugin, fntC, fntLegal;
+HBRUSH brhDlgBG;
+
+#define IMAGES_COUNT 6
+#define IMAGES_INDEX_MY 0
+#define IMAGES_INDEX_WA 1
+#define IMAGES_INDEX_CT 2
+#define IMAGES_INDEX_IIS 3
+#define IMAGES_INDEX_ID3V2 4
+#define IMAGES_INDEX_MP3S 5
+
+RECT rectLogo[IMAGES_COUNT];
+MLImage *imgLogo[IMAGES_COUNT] = {NULL, NULL, NULL, NULL, NULL, NULL};
+MLImage *imgLlama = NULL, *imgLlamaOrig = NULL, *imgMy = NULL;
+RECT rcLlama;
+
+int idxSelected;
+
+wchar_t *url[IMAGES_COUNT - 1] = { L"http://winamp.com/",
+ L"http://www.codingtechnologies.com/index.htm",
+ L"http://www.iis.fraunhofer.de/index.html",
+ L"http://www.id3.org/",
+ L"http://www.iis.fraunhofer.de/amm/download/mp3surround/index.html"};
+
+HWND hwndTT;
+wchar_t strTT[] = L"click here to visit this website";
+
+#define TIMER_ID_WATERRENDER 1980
+#define TIMER_ID_WATERPULSE 1978
+#define TIMER_DELAY_WATERRENDER 48
+#define TIMER_DELAY_WATERPULSE 12000
+#define TIMER_ID_LLAMAFADE 1987
+#define TIMER_DELAY_LLAMAFADE 200
+
+#define TIMER_ID_LOADDATA 1959
+#define TIMER_DELAY_LOADDATA 10
+MLImage *tmpImage = NULL;
+
+MLImageFilterWater *fltrWater = NULL;
+HCURSOR curHand = NULL;
+
+void about_OnInit(HWND hwndDlg);
+void about_OnDestroy(HWND hwndDlg);
+void about_OnMouseDown(HWND hwndDlg, int cx, int cy);
+void about_OnMouseMove(HWND hwndDlg, int cx, int cy);
+void about_OnDraw(HWND hwndDlg);
+void timer_OnWaterPulse(HWND hwndDlg);
+void timer_OnLlamaFade(HWND hwndDlg);
+void timer_OnLoadData(HWND hwndDlg);
+
+
+void SetRects(int cx, int cy)
+{
+ int i, xl, yl;
+
+ i = IMAGES_INDEX_MY; xl = (cx - imgLogo[i]->GetWidth())/2; yl = 64;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+ xl = 2; yl = 2; i = IMAGES_INDEX_WA;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+ xl = 2; yl = cy - 88; i = IMAGES_INDEX_CT;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+ xl = rectLogo[i].right; i = IMAGES_INDEX_IIS;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+ xl = rectLogo[i].right; i = IMAGES_INDEX_ID3V2;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+ xl = rectLogo[i].right; i = IMAGES_INDEX_MP3S;
+ if (imgLogo[i]) SetRect(&rectLogo[i], xl, yl, xl + imgLogo[i]->GetWidth(), yl + imgLogo[i]->GetHeight());
+
+ if(imgLlama) SetRect(&rcLlama, 2, 1, imgLlama->GetWidth() + 2, imgLlama->GetHeight() + 1);
+}
+void CreateToolTipWnd(HWND hwndDlg)
+{
+ INITCOMMONCONTROLSEX iccex;
+ iccex.dwICC = ICC_WIN95_CLASSES;
+ iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
+ InitCommonControlsEx(&iccex);
+
+ hwndTT = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndDlg, NULL, mod.hDllInstance, NULL);
+
+ SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+}
+
+void UpdateToolTips(HWND hwndDlg)
+{
+ TOOLINFOW ti;
+ unsigned int uid = 0;
+
+ // delete tools
+ int ttCount = SendMessage(hwndTT, TTM_GETTOOLCOUNT, 0, 0);
+ for(int i = 0; i < ttCount; i++)
+ {
+ if (SendMessageW(hwndTT, TTM_ENUMTOOLSW, (WPARAM)i, (LPARAM)&ti)) SendMessageW(hwndTT, TTM_DELTOOLW, 0, (LPARAM)&ti);
+ }
+
+ /// add tools
+
+ for (int i = 1; i < IMAGES_COUNT -1; i++)
+ {
+ ti.cbSize = sizeof(TOOLINFO);
+ ti.uFlags = TTF_SUBCLASS;
+ ti.hwnd = hwndDlg;
+ ti.hinst = mod.hDllInstance;
+ ti.uId = uid;
+ ti.lpszText = strTT;
+ ti.rect = rectLogo[i];
+ SendMessageW(hwndTT, TTM_ADDTOOLW, 0, (LPARAM) (LPTOOLINFO) &ti);
+ }
+}
+BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ about_OnInit(hwndDlg);
+ break;
+ case WM_DESTROY:
+ about_OnDestroy(hwndDlg);
+ break;
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hwndDlg,0);
+ }
+ break;
+ case WM_SIZE:
+ if (wParam != SIZE_MINIMIZED)
+ {
+ SetRects(LOWORD(lParam), HIWORD(lParam));
+ UpdateToolTips(hwndDlg);
+ }
+ case WM_MOUSEMOVE:
+ about_OnMouseMove(hwndDlg, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_LBUTTONDOWN:
+ about_OnMouseDown(hwndDlg, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_PAINT:
+ about_OnDraw(hwndDlg);
+ break;
+ case WM_TIMER:
+ switch(wParam)
+ {
+ case TIMER_ID_WATERRENDER:
+ if (idxSelected != -1 && fltrWater)
+ {
+ fltrWater->Render(tmpImage, imgLogo[idxSelected]);
+ InvalidateRect(hwndDlg, &rectLogo[idxSelected], FALSE);
+ }
+ break;
+ case TIMER_ID_WATERPULSE:
+ timer_OnWaterPulse(hwndDlg);
+ break;
+ case TIMER_ID_LLAMAFADE:
+ timer_OnLlamaFade(hwndDlg);
+ break;
+ case TIMER_ID_LOADDATA:
+ timer_OnLoadData(hwndDlg);
+ break;
+ }
+ break;
+ case WM_CTLCOLORDLG:
+ return (BOOL)brhDlgBG;
+ break;
+ }
+ return 0;
+}
+void about_OnInit(HWND hwndDlg)
+{
+ HDC hdc = GetDC(hwndDlg);
+ fntPlugin = CreateFontW(-MulDiv(20, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Microsoft Sans Serif");
+ fntC = CreateFontW(-MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, TRUE, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Arial");
+ fntLegal = CreateFontW(-MulDiv(6, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Microsoft Sans Serif");
+ ReleaseDC(hwndDlg, hdc);
+
+ brhDlgBG = CreateSolidBrush(RGB(255,255,255));
+
+ SetTimer(hwndDlg, TIMER_ID_LOADDATA, TIMER_DELAY_LOADDATA, NULL);
+}
+
+void about_OnDestroy(HWND hwndDlg)
+{
+ for (int i = 0; i < IMAGES_COUNT; i++)
+ {
+ if (imgLogo[i]) delete(imgLogo[i]);
+ imgLogo[i] = NULL;
+ }
+
+ if (imgLlama) delete(imgLlama);
+ imgLlama = NULL;
+
+ if (imgLlamaOrig) delete(imgLlamaOrig);
+ imgLlamaOrig = NULL;
+
+ if (imgMy) delete(imgMy);
+ imgMy = NULL;
+
+ if (fntPlugin) DeleteObject(fntPlugin);
+ if (fntC) DeleteObject(fntC);
+ if (fntLegal) DeleteObject(fntLegal);
+ fntPlugin = NULL;
+ fntC = NULL;
+ fntLegal = NULL;
+
+ if (brhDlgBG) DeleteObject(brhDlgBG);
+ brhDlgBG = NULL;
+
+ if (fltrWater) delete (fltrWater);
+ fltrWater = NULL;
+
+ if (tmpImage) delete(tmpImage);
+ tmpImage = NULL;
+
+ if (curHand) DestroyCursor(curHand);
+ curHand = NULL;
+}
+
+void about_OnMouseDown(HWND hwndDlg, int cx, int cy)
+{
+
+ if (idxSelected == -1) return;
+
+ HCURSOR curWait = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(32514/*OCR_WAIT*/), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR);
+ SetCursor(curWait);
+ ShellExecuteW(hwndDlg, L"open", url[idxSelected -1], NULL, L"c:\\", SW_SHOW);
+ SetCursor(curHand);
+ DestroyCursor(curWait);
+}
+void about_OnMouseMove(HWND hwndDlg, int cx, int cy)
+{
+ POINT pt = {cx, cy};
+ int idxNew = -1;
+ for (int i = 1; i < IMAGES_COUNT - 1; i ++)
+ {
+ if (PtInRect(&rectLogo[i], pt))
+ {
+ if (!curHand)
+ {
+ curHand = (HCURSOR)LoadImage(mod.hDllInstance, MAKEINTRESOURCE(IDC_CUR_HAND), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR);
+ }
+ SetCursor(curHand);
+ idxNew = i;
+ }
+ }
+ if (idxNew != idxSelected)
+ {
+ // stop animation
+ KillTimer(hwndDlg, TIMER_ID_WATERPULSE);
+ KillTimer(hwndDlg, TIMER_ID_WATERRENDER);
+
+ if (idxSelected != -1) // redraw previously animated
+ {
+ InvalidateRect(hwndDlg, &rectLogo[idxSelected], FALSE);
+ }
+ // set new one
+ idxSelected = idxNew;
+ if (fltrWater) delete(fltrWater);
+ fltrWater = NULL;
+ if (tmpImage) delete(tmpImage);
+ tmpImage = NULL;
+ if (idxSelected != -1 && idxSelected != IMAGES_INDEX_WA) SetTimer(hwndDlg, TIMER_ID_WATERPULSE, 30, NULL); // start delay
+ }
+}
+void about_OnDraw(HWND hwndDlg)
+{
+ PAINTSTRUCT ps;
+ HDC hdc;
+ hdc = BeginPaint(hwndDlg, &ps);
+ RECT rc, ri;
+ GetClientRect(hwndDlg, &rc);
+
+ // Draw Llama
+ RECT rl;
+ SetRect(&rl, rcLlama.left, rcLlama.top, rcLlama.right, rcLlama.bottom);
+ if (imgLlama && IntersectRect(&ri, &rl, &ps.rcPaint))
+ {
+ HRGN hrgn = CreateRectRgn(rcLlama.left, rcLlama.top, rcLlama.right, rcLlama.bottom);
+
+ HRGN hrgn1 = CreateRectRgn(rectLogo[IMAGES_INDEX_MY].left,
+ rectLogo[IMAGES_INDEX_MY].top,
+ rectLogo[IMAGES_INDEX_MY].right,
+ rectLogo[IMAGES_INDEX_MY].bottom);
+ CombineRgn(hrgn, hrgn, hrgn1, RGN_DIFF);
+ DeleteObject(hrgn1);
+ hrgn1 = CreateRectRgn(rectLogo[IMAGES_INDEX_WA].left,
+ rectLogo[IMAGES_INDEX_WA].top,
+ rectLogo[IMAGES_INDEX_WA].right,
+ rectLogo[IMAGES_INDEX_WA].bottom);
+ CombineRgn(hrgn, hrgn, hrgn1, RGN_DIFF);
+ SelectClipRgn(hdc, hrgn);
+ DeleteObject(hrgn);
+ DeleteObject(hrgn1);
+
+ imgLlama->Draw(hdc, rl.left, rl.top);
+ SelectClipRgn(hdc, NULL);
+ }
+
+ MLImage *img;
+ for (int i = 0; i < IMAGES_COUNT -1; i++)
+ {
+
+ if (IntersectRect(&ri, &rectLogo[i], &ps.rcPaint))
+ {
+ if (idxSelected == i && tmpImage)
+ {
+ img = tmpImage;
+ HRGN hrgn = CreateRectRgn(rectLogo[i].left + 3, rectLogo[i].top + 3 , rectLogo[i].right - 3, rectLogo[i].bottom - 3);
+ SelectClipRgn(hdc, hrgn);
+ DeleteObject(hrgn);
+ }
+ else img = imgLogo[i];
+ if (img == NULL || imgLlama == NULL) continue;
+ if (i == IMAGES_INDEX_MY)
+ { // blend Llama First
+ MLImageFilter_Blend1(imgMy, img, 0, 0,
+ imgLlama->GetWidth() - (rectLogo[i].left - rcLlama.left), img->GetHeight(), imgLlama,
+ rectLogo[i].left - rcLlama.left, rectLogo[i].top - rcLlama.top, RGB(255,255,255));
+ img = imgMy;
+ }
+ img->Draw(hdc, rectLogo[i].left, rectLogo[i].top);
+ SelectClipRgn(hdc, NULL);
+ }
+ }
+
+ RECT rt;
+ SetBkMode(hdc, TRANSPARENT);
+ rc.left += 6;
+ rc.bottom -= 2;
+ rc.right -= 4;
+
+ HFONT oldF = NULL;
+
+ SetRect(&rt, rc.right - 192, rc.top, rc.right, rc.top + 16);
+ if (IntersectRect(&ri, &rt, &ps.rcPaint))
+ {
+ /// Nullsoft (c)
+ HFONT oldF = (HFONT)SelectObject(hdc, fntC);
+ SetTextColor(hdc, RGB(100,100,200));
+ DrawTextW(hdc, legal[0], -1, &rt, DT_LEFT | DT_SINGLELINE);
+ }
+
+ SetRect(&rt, rc.left - 2, rc.bottom - 33, rc.right, rc.bottom);
+ if (IntersectRect(&ri, &rt, &ps.rcPaint))
+ {
+ /// Separator
+ MoveToEx(hdc, rt.left, rt.top, NULL);
+ HPEN lp = CreatePen(PS_SOLID,1, RGB(190, 190, 190));
+ HPEN op = (HPEN)SelectObject(hdc, lp);
+ LineTo(hdc, rt.right, rt.top);
+ SelectObject(hdc, lp);
+ DeleteObject(lp);
+
+ /// Legal...
+ oldF = (oldF != NULL) ? oldF : (HFONT)SelectObject(hdc, fntLegal);
+ SetTextColor(hdc, RGB(0,0,0));
+ for(int i = 1; i < LEGAL_COUNT; i++)
+ {
+ int y = rc.bottom - (LEGAL_COUNT - i)*10;
+ SetRect(&rt, rc.left, y, rc.right, y +10);
+ if (IntersectRect(&ri, &rt, &ps.rcPaint))
+ DrawTextW(hdc, legal[i], -1, &rt, DT_LEFT | DT_SINGLELINE);
+ }
+ }
+ if (oldF != NULL) SelectObject(hdc, oldF);
+ EndPaint(hwndDlg, &ps);
+}
+void timer_OnLoadData(HWND hwndDlg)
+{
+ static step = 0;
+ KillTimer(hwndDlg, TIMER_ID_LOADDATA);
+ RECT rc;
+ GetClientRect(hwndDlg, &rc);
+ for (int i = 0; i < IMAGES_COUNT; i++)
+ {
+ imgLogo[i] = new MLImage(LoadImageFromResource, TRUE);
+ imgLogo[i]->Load();
+ }
+
+ imgMy = new MLImage();
+ MLImage::Copy(imgMy, imgLogo[IMAGES_INDEX_MY]);
+
+ imgLlamaOrig = new MLImage(LoadImageFromResource, TRUE);
+ imgLlamaOrig->Load();
+ imgLlama = new MLImage();
+ MLImage::Copy(imgLlama, imgLlamaOrig);
+ CreateToolTipWnd(hwndDlg);
+ UpdateToolTips(hwndDlg);
+ idxSelected = -1;
+ SetRects(rc.right - rc.left, rc.bottom - rc.top);
+ InvalidateRect(hwndDlg, &rc, FALSE);
+// SetTimer(hwndDlg, TIMER_ID_LLAMAFADE, TIMER_DELAY_LLAMAFADE, NULL);
+
+}
+void timer_OnWaterPulse(HWND hwndDlg)
+{
+ if (idxSelected == -1) return;
+
+ BOOL startRender = (!fltrWater);
+
+ if(!fltrWater)
+ {
+ KillTimer(hwndDlg, TIMER_ID_WATERPULSE); // stop timer - will change to slower interval
+ fltrWater = new MLImageFilterWater();
+ fltrWater->CreateFor(imgLogo[idxSelected]);
+ tmpImage = new MLImage(imgLogo[idxSelected]->GetWidth(), imgLogo[idxSelected]->GetHeight());
+ }
+
+ int ow = imgLogo[idxSelected]->GetWidth();
+ int oh = imgLogo[idxSelected]->GetHeight();
+
+ for (int i = 0; i < oh*ow/1024; i++)
+ {
+ fltrWater->SineBlob(-1, -1, random(4,min(oh,ow)), 600, 0);
+ }
+
+ if (startRender)
+ {
+ SetTimer(hwndDlg, TIMER_ID_WATERRENDER, TIMER_DELAY_WATERRENDER, NULL);
+ SetTimer(hwndDlg, TIMER_ID_WATERPULSE, TIMER_DELAY_WATERPULSE, NULL);
+ }
+}
+void timer_OnLlamaFade(HWND hwndDlg)
+{
+ static int c = -2;
+ static int step = 2;
+ c = c + step;
+ if (c > 30 && step > 0) {step = 0 - step; c = 30;}
+ else if (c < 0 && step < 0) { step = 0 - step; c = 0; }
+ MLImageFilter_Fader3(imgLlama, imgLlamaOrig, c);
+ InvalidateRect(hwndDlg, &rcLlama, FALSE);
+}
+
+HBITMAP LoadImageFromResource(INT_PTR handle)
+{
+ int id = 0;
+ BOOL incSize;
+ MLImage *img = (MLImage*)handle;
+
+ if (img == imgLogo[IMAGES_INDEX_WA]) {id = IDB_LOGO_WAPLUGINS; incSize = FALSE;}
+ else if (img == imgLogo[IMAGES_INDEX_IIS]) {id = IDB_LOGO_IIS; incSize = TRUE;}
+ else if (img == imgLogo[IMAGES_INDEX_CT]) {id = IDB_LOGO_CODETECH; incSize = TRUE;}
+ else if (img == imgLogo[IMAGES_INDEX_ID3V2]) {id = IDB_LOGO_ID3V2; incSize = TRUE;}
+ else if (img == imgLogo[IMAGES_INDEX_MP3S]) {id = IDB_LOGO_MP3SURROUND; incSize = FALSE;} // because we don't use it for now
+ else if (img == imgLogo[IMAGES_INDEX_MY]) {id = IDB_LOGO_MY; incSize = FALSE;}
+ else if (img == imgLlamaOrig) {id = IDB_LLAMA; incSize = FALSE;}
+ if (id == 0) return NULL;
+
+ HBITMAP hbmp = LoadBitmap(mod.hDllInstance, MAKEINTRESOURCE(id));
+ if (hbmp == NULL) return hbmp;
+
+ if (incSize)
+ {// we want to add additional white border
+ HDC hdcWnd = GetWindowDC(NULL);
+ HDC hdcSrc = CreateCompatibleDC(hdcWnd);
+ HDC hdcDest = CreateCompatibleDC(hdcWnd);
+ BITMAP bmp;
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
+ int extraW = 40;
+ int extraH = 16;
+ HBITMAP hbmpNew = CreateBitmap(bmp.bmWidth + extraW, bmp.bmHeight + extraH, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
+
+ SelectObject(hdcSrc, hbmp);
+ SelectObject(hdcDest, hbmpNew);
+
+ // fill borders
+ HBRUSH br = CreateSolidBrush(RGB(255,255,255));
+ RECT rc;
+ SetRect(&rc, 0,0, bmp.bmWidth + extraW, extraH/2);
+ FillRect(hdcDest, &rc, br);
+ SetRect(&rc, 0, bmp.bmHeight + extraH/2, bmp.bmWidth + extraW, bmp.bmHeight + extraH);
+ FillRect(hdcDest, &rc, br);
+ SetRect(&rc, 0, extraH/2, extraW/2, bmp.bmHeight + extraH/2);
+ FillRect(hdcDest, &rc, br);
+ SetRect(&rc, bmp.bmWidth + extraW/2, extraH/2, bmp.bmWidth + extraW, bmp.bmHeight + extraH/2);
+ FillRect(hdcDest, &rc, br);
+ // copy original
+ BitBlt(hdcDest, extraW/2, extraH/2, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0,0, SRCCOPY);
+
+ DeleteObject(br);
+ DeleteObject(hbmp);
+ DeleteDC(hdcSrc);
+ DeleteDC(hdcDest);
+ ReleaseDC(NULL, hdcWnd);
+
+ hbmp = hbmpNew;
+ }
+ if (img == imgLogo[IMAGES_INDEX_MY])
+ { // need to add vesion number
+ HDC hdcWnd = GetWindowDC(NULL);
+ HDC hdcSrc = CreateCompatibleDC(hdcWnd);
+ HDC hdcDest = CreateCompatibleDC(hdcWnd);
+
+ HFONT fnt = CreateFontW(-MulDiv(90, GetDeviceCaps(hdcDest, LOGPIXELSY), 72), 22, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, L"Agency FB");
+ SelectObject(hdcDest, fnt);
+
+ char *ver = mod.description + lstrlen(mod.description);
+ while(ver != mod.description && *ver != ' ')
+ {
+ ver = CharPrevA(mod.description, ver);
+ }
+ if (*ver == ' ') ver++;
+
+ RECT rc;
+ SetRect(&rc, 0, 0, 0, 0);
+ DrawText(hdcDest, ver, -1, &rc, DT_CALCRECT | DT_RIGHT |DT_SINGLELINE);
+
+ int extraW = rc.right + 6;
+ int extraH = 16;
+
+ BITMAP bmp;
+ GetObject(hbmp, sizeof(BITMAP), &bmp);
+ HBITMAP hbmpNew = CreateBitmap(bmp.bmWidth + extraW, bmp.bmHeight + extraH, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
+
+ SelectObject(hdcSrc, hbmp);
+ SelectObject(hdcDest, hbmpNew);
+
+ // fill new area
+ HBRUSH br = CreateSolidBrush(RGB(255,255,255));
+
+ SetRect(&rc, bmp.bmWidth,0, bmp.bmWidth + extraW, bmp.bmHeight + extraH);
+ FillRect(hdcDest, &rc, br);
+ SetRect(&rc, 0,0, bmp.bmWidth, extraH);
+ FillRect(hdcDest, &rc, br);
+ // copy original
+ BitBlt(hdcDest, 0, extraH, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0,0, SRCCOPY);
+ // draw number
+
+ SetTextColor(hdcDest, RGB(80, 60, 10));
+ SetBkMode(hdcDest, TRANSPARENT);
+ SetRect(&rc, bmp.bmWidth + 6, rc.top -= 22, bmp.bmWidth + extraW, bmp.bmHeight + extraH);
+ DrawText(hdcDest, ver, -1, &rc, DT_RIGHT |DT_SINGLELINE);
+ DeleteObject(fnt);
+ DeleteObject(br);
+ DeleteObject(hbmp);
+ DeleteDC(hdcSrc);
+ DeleteDC(hdcDest);
+ ReleaseDC(NULL, hdcWnd);
+
+ hbmp = hbmpNew;
+
+ }
+
+
+ return hbmp;
+
+}
+
+#endif \ No newline at end of file