From e8de37f7b350f6c7028c14c06d3c8bb075da9ef7 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 13 Mar 2011 23:18:19 +0000 Subject: [PATCH] pptviewer mods --- .../presentations/lib/pptviewcontroller.py | 2 + .../lib/pptviewlib/pptviewlib.cpp | 472 +++++++++++------- .../lib/pptviewlib/pptviewlib.dll | Bin 83968 -> 78848 bytes .../presentations/lib/pptviewlib/pptviewlib.h | 9 +- 4 files changed, 293 insertions(+), 190 deletions(-) diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index d9c473ac0..b97d22c03 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -140,8 +140,10 @@ class PptviewDocument(PresentationDocument): PPTviewLib creates large BMP's, but we want small PNG's for consistency. Convert them here. """ + log.debug(u'create_thumbnails') if self.check_thumbnails(): return + log.debug(u'create_thumbnails proceeding') for idx in range(self.get_slide_count()): path = u'%s\\slide%s.bmp' % (self.get_temp_folder(), unicode(idx + 1)) diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp index 54ff53108..de22e2d41 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp @@ -48,30 +48,28 @@ BOOL debug = FALSE; HINSTANCE hInstance = NULL; -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, + LPVOID lpReserved) { hInstance = (HINSTANCE)hModule; switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - DEBUG("PROCESS_ATTACH\n"); - break; - case DLL_THREAD_ATTACH: - DEBUG("THREAD_ATTACH\n"); - break; - case DLL_THREAD_DETACH: - DEBUG("THREAD_DETACH\n"); - break; - case DLL_PROCESS_DETACH: - // Clean up... hopefully there is only the one process attached? - // We'll find out soon enough during tests! - DEBUG("PROCESS_DETACH\n"); - for(int i = 0; i.bmp" will be appended to complete the path. E.g. "c:\temp\slide" would // create "c:\temp\slide1.bmp" slide2.bmp, slide3.bmp etc. // It will also create a *info.txt containing information about the ppt -DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath) +DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, + char *previewpath) { - STARTUPINFO si; - PROCESS_INFORMATION pi; - char cmdline[MAX_PATH * 2]; int id; DEBUG("OpenPPT start: %s; %s\n", filename, previewpath); - DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", hParentWnd, rect.top, rect.left, rect.bottom, rect.right); - if(GetPPTViewerPath(cmdline, sizeof(cmdline))==FALSE) - { - DEBUG("OpenPPT: GetPPTViewerPath failed\n"); - return -1; - } + DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", hParentWnd, rect.top, + rect.left, rect.bottom, rect.right); id = -1; - for(int i = 0; i=0) - { - if(pptviewobj[id].mhook!=NULL) - UnhookWindowsHookEx(pptviewobj[id].mhook); - pptviewobj[id].mhook = NULL; - } - DEBUG("OpenPPT: Exit: id=%i\n", id); - return id; + return TRUE; } + // Load information about the ppt from an info.txt file. // Format: // version @@ -242,26 +273,26 @@ BOOL GetPPTInfo(int id) char buf[100]; DEBUG("GetPPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats)!=0) + if(_stat(pptviewobj[id].filename, &filestats) != 0) return FALSE; sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); int err = fopen_s(&pFile, info, "r"); - if(err!=0) + if(err != 0) { DEBUG("GetPPTInfo: file open failed - %d\n", err); return FALSE; } fgets(buf, 100, pFile); // version == 1 fgets(buf, 100, pFile); - if(filestats.st_mtime!=atoi(buf)) + if(filestats.st_mtime != atoi(buf)) { fclose (pFile); return FALSE; } fgets(buf, 100, pFile); - if(filestats.st_size!=atoi(buf)) + if(filestats.st_size != atoi(buf)) { - fclose (pFile); + fclose(pFile); return FALSE; } fgets(buf, 100, pFile); // slidecount @@ -269,10 +300,11 @@ BOOL GetPPTInfo(int id) fgets(buf, 100, pFile); // first slide steps int firstslidesteps = atoi(buf); // check all the preview images still exist - for(int i = 1; i<=slidecount; i++) + for(int i = 1; i <= slidecount; i++) { - sprintf_s(info, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, i); - if(GetFileAttributes(info)==INVALID_FILE_ATTRIBUTES) + sprintf_s(info, MAX_PATH, "%s%i.bmp", + pptviewobj[id].previewpath, i); + if(GetFileAttributes(info) == INVALID_FILE_ATTRIBUTES) return FALSE; } fclose(pFile); @@ -289,18 +321,22 @@ BOOL SavePPTInfo(int id) FILE* pFile; DEBUG("SavePPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats)!=0) + if(_stat(pptviewobj[id].filename, &filestats) != 0) { DEBUG("SavePPTInfo: stat of %s failed\n", pptviewobj[id].filename); return FALSE; } sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); int err = fopen_s(&pFile, info, "w"); - if(err!=0) + if(err != 0) { DEBUG("SavePPTInfo: fopen of %s failed%i\n", info, err); return FALSE; } + else + { + DEBUG("SavePPTInfo: fopen of %s succeeded\n", info); + } fprintf(pFile, "1\n"); fprintf(pFile, "%u\n", filestats.st_mtime); fprintf(pFile, "%u\n", filestats.st_size); @@ -319,15 +355,28 @@ BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) LRESULT lresult; DEBUG("GetPPTViewerPath: start\n"); - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "PowerPointViewer.Show.12\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\open\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - return FALSE; + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, + "PowerPointViewer.Show.12\\shell\\Show\\command", + 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + { + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, + "Applications\\PPTVIEW.EXE\\shell\\open\\command", + 0, KEY_READ, &hkey) != ERROR_SUCCESS) + { + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, + "Applications\\PPTVIEW.EXE\\shell\\Show\\command", + 0, KEY_READ, &hkey) != ERROR_SUCCESS) + { + return FALSE; + } + } + } dwtype = REG_SZ; dwsize = (DWORD)strsize; - lresult = RegQueryValueEx(hkey, NULL, NULL, &dwtype, (LPBYTE)pptviewerpath, &dwsize ); + lresult = RegQueryValueEx(hkey, NULL, NULL, &dwtype, + (LPBYTE)pptviewerpath, &dwsize); RegCloseKey(hkey); - if(lresult!=ERROR_SUCCESS) + if(lresult != ERROR_SUCCESS) return FALSE; pptviewerpath[strlen(pptviewerpath)-4] = '\0'; // remove "%1" from end of key value DEBUG("GetPPTViewerPath: exit ok\n"); @@ -338,9 +387,9 @@ BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) void Unhook(int id) { DEBUG("Unhook: start %d\n", id); - if(pptviewobj[id].hook!=NULL) + if(pptviewobj[id].hook != NULL) UnhookWindowsHookEx(pptviewobj[id].hook); - if(pptviewobj[id].mhook!=NULL) + if(pptviewobj[id].mhook != NULL) UnhookWindowsHookEx(pptviewobj[id].mhook); pptviewobj[id].hook = NULL; pptviewobj[id].mhook = NULL; @@ -353,7 +402,7 @@ DllExport void ClosePPT(int id) DEBUG("ClosePPT: start%d\n", id); pptviewobj[id].state = PPT_CLOSED; Unhook(id); - if(pptviewobj[id].hWnd==0) + if(pptviewobj[id].hWnd == 0) TerminateThread(pptviewobj[id].hThread, 0); else PostMessage(pptviewobj[id].hWnd, WM_CLOSE, 0, 0); @@ -367,9 +416,10 @@ DllExport void ClosePPT(int id) DllExport void Resume(int id) { DEBUG("Resume: %d\n", id); - MoveWindow(pptviewobj[id].hWnd, pptviewobj[id].rect.left, pptviewobj[id].rect.top, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); + MoveWindow(pptviewobj[id].hWnd, pptviewobj[id].rect.left, + pptviewobj[id].rect.top, + pptviewobj[id].rect.right - pptviewobj[id].rect.left, + pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); Unblank(id); } // Moves the show off the screen so it can't be seen @@ -377,15 +427,15 @@ DllExport void Stop(int id) { DEBUG("Stop:%d\n", id); MoveWindow(pptviewobj[id].hWnd, -32000, -32000, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); + pptviewobj[id].rect.right - pptviewobj[id].rect.left, + pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); } // Return the total number of slides DllExport int GetSlideCount(int id) { DEBUG("GetSlideCount:%d\n", id); - if(pptviewobj[id].state==0) + if(pptviewobj[id].state == 0) return -1; else return pptviewobj[id].slideCount; @@ -395,7 +445,7 @@ DllExport int GetSlideCount(int id) DllExport int GetCurrentSlide(int id) { DEBUG("GetCurrentSlide:%d\n", id); - if(pptviewobj[id].state==0) + if(pptviewobj[id].state == 0) return -1; else return pptviewobj[id].currentSlide; @@ -407,13 +457,17 @@ DllExport void NextStep(int id) DEBUG("NextStep:%d (%d)\n", id, pptviewobj[id].currentSlide); if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) return; - PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, -WHEEL_DELTA), 0); + pptviewobj[id].guess = pptviewobj[id].currentSlide + 1; + PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, + MAKEWPARAM(0, -WHEEL_DELTA), 0); } // Take a step backwards through the show DllExport void PrevStep(int id) { DEBUG("PrevStep:%d (%d)\n", id, pptviewobj[id].currentSlide); + if(pptviewobj[id].currentSlide > 1) + pptviewobj[id].guess = pptviewobj[id].currentSlide - 1; PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); } @@ -469,16 +523,19 @@ DllExport void GotoSlide(int id, int slideno) // the slideshow has focus first char ch[10]; - if(slideno<0) return; + if(slideno < 0) + return; + pptviewobj[id].guess = slideno; _itoa_s(slideno, ch, 10, 10); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); SetForegroundWindow(pptviewobj[id].hWnd); SetFocus(pptviewobj[id].hWnd); Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! - for(int i=0;i<10;i++) + for(int i = 0; i < 10; i++) { - if(ch[i]=='\0') break; + if(ch[i] == '\0') + break; keybd_event((BYTE)ch[i], 0, 0, 0); keybd_event((BYTE)ch[i], 0, KEYEVENTF_KEYUP, 0); } @@ -511,12 +568,12 @@ DllExport void RestartShow(int id) DEBUG("RestartShow:%d\n", id); Stop(id); GotoSlide(id, pptviewobj[id].slideCount); - while(pptviewobj[id].currentSlide>1) + while(pptviewobj[id].currentSlide > 1) { PrevStep(id); Sleep(10); } - for(int i=0;i<=pptviewobj[id].firstSlideSteps;i++) + for(int i = 0; i <= pptviewobj[id].firstSlideSteps; i++) { PrevStep(id); Sleep(10); @@ -531,53 +588,55 @@ DllExport void RestartShow(int id) LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) { HHOOK hook = globalhook; - if(nCode==HCBT_CREATEWND) + if(nCode == HCBT_CREATEWND) { char csClassName[16]; HWND hCurrWnd = (HWND)wParam; DWORD retProcId = NULL; GetClassName(hCurrWnd, csClassName, sizeof(csClassName)); - if((strcmp(csClassName, "paneClassDC")==0) - ||(strcmp(csClassName, "screenClass")==0)) + if((strcmp(csClassName, "paneClassDC") == 0) + ||(strcmp(csClassName, "screenClass") == 0)) { - int id=-1; + int id = -1; DWORD windowthread = GetWindowThreadProcessId(hCurrWnd,NULL); - for(int i=0; i=0) + if(id >= 0) { - if(strcmp(csClassName, "paneClassDC")==0) + if(strcmp(csClassName, "paneClassDC") == 0) pptviewobj[id].hWnd2=hCurrWnd; else { - pptviewobj[id].hWnd=hCurrWnd; + pptviewobj[id].hWnd = hCurrWnd; CBT_CREATEWND* cw = (CBT_CREATEWND*)lParam; - if(pptviewobj[id].hParentWnd!=NULL) + if(pptviewobj[id].hParentWnd != NULL) cw->lpcs->hwndParent = pptviewobj[id].hParentWnd; - cw->lpcs->cy=(pptviewobj[id].rect.bottom-pptviewobj[id].rect.top); - cw->lpcs->cx=(pptviewobj[id].rect.right-pptviewobj[id].rect.left); - cw->lpcs->y=-32000; - cw->lpcs->x=-32000; + cw->lpcs->cy = (pptviewobj[id].rect.bottom-pptviewobj[id].rect.top); + cw->lpcs->cx = (pptviewobj[id].rect.right-pptviewobj[id].rect.left); + cw->lpcs->y = -32000; + cw->lpcs->x = -32000; } - if((pptviewobj[id].hWnd!=NULL)&&(pptviewobj[id].hWnd2!=NULL)) + if((pptviewobj[id].hWnd != NULL) && (pptviewobj[id].hWnd2 != NULL)) { UnhookWindowsHookEx(globalhook); - globalhook=NULL; - pptviewobj[id].hook = SetWindowsHookEx(WH_CALLWNDPROC,CwpProc,hInstance,pptviewobj[id].dwThreadId); - pptviewobj[id].mhook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,pptviewobj[id].dwThreadId); + globalhook = NULL; + pptviewobj[id].hook = SetWindowsHookEx(WH_CALLWNDPROC, + CwpProc,hInstance, pptviewobj[id].dwThreadId); + pptviewobj[id].mhook = SetWindowsHookEx(WH_GETMESSAGE, + GetMsgProc, hInstance, pptviewobj[id].dwThreadId); Sleep(10); pptviewobj[id].state = PPT_OPENED; } } } } - return CallNextHookEx(hook,nCode,wParam,lParam); + return CallNextHookEx(hook, nCode, wParam, lParam); } // This hook exists whilst the slideshow is loading but only listens on the @@ -586,22 +645,23 @@ LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) { HHOOK hook = NULL; MSG *pMSG = (MSG *)lParam; - DWORD windowthread = GetWindowThreadProcessId(pMSG->hwnd,NULL); - int id=-1; - for(int i=0; ihwnd, NULL); + int id = -1; + for(int i = 0; i < MAX_PPTOBJS; i++) { - if(pptviewobj[i].dwThreadId==windowthread) + if(pptviewobj[i].dwThreadId == windowthread) { - id=i; + id = i; hook = pptviewobj[id].mhook; break; } } - if(id>=0&&nCode==HC_ACTION&&wParam==PM_REMOVE&&pMSG->message==WM_MOUSEWHEEL) + if(id >= 0 && nCode == HC_ACTION && wParam == PM_REMOVE + && pMSG->message == WM_MOUSEWHEEL) { - if(pptviewobj[id].state!=PPT_LOADED) + if(pptviewobj[id].state != PPT_LOADED) { - if(pptviewobj[id].currentSlide==1) + if(pptviewobj[id].currentSlide == 1) pptviewobj[id].firstSlideSteps++; pptviewobj[id].steps++; } @@ -610,60 +670,94 @@ LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) } // This hook exists whilst the slideshow is running but only listens on the // slideshows thread. It listens out for slide changes, message WM_USER+22. -LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam){ +LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam) +{ CWPSTRUCT *cwp; cwp = (CWPSTRUCT *)lParam; HHOOK hook = NULL; char filename[MAX_PATH]; - DWORD windowthread = GetWindowThreadProcessId(cwp->hwnd,NULL); - int id=-1; - for(int i=0; ihwnd, NULL); + int id = -1; + for(int i = 0; i < MAX_PPTOBJS; i++) { - if(pptviewobj[i].dwThreadId==windowthread) + if(pptviewobj[i].dwThreadId == windowthread) { - id=i; + id = i; hook = pptviewobj[id].hook; break; } } - if((id>=0)&&(nCode==HC_ACTION)) + if((id >= 0) && (nCode == HC_ACTION)) { - if(cwp->message==WM_USER+22) - { + if(cwp->message == WM_USER + 22) + { if(pptviewobj[id].state != PPT_LOADED) { - if((pptviewobj[id].currentSlide>0) - && (pptviewobj[id].previewpath!=NULL&&strlen(pptviewobj[id].previewpath)>0)) + if((pptviewobj[id].currentSlide > 0) + && (pptviewobj[id].previewpath != NULL + && strlen(pptviewobj[id].previewpath) > 0)) { - sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, pptviewobj[id].currentSlide); + sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, + pptviewobj[id].currentSlide); CaptureAndSaveWindow(cwp->hwnd, filename); } } - if(cwp->wParam==0) + if(cwp->wParam == 0) { - if(pptviewobj[id].currentSlide>0) + if(pptviewobj[id].currentSlide > 0) { pptviewobj[id].state = PPT_LOADED; - pptviewobj[id].currentSlide = pptviewobj[id].slideCount+1; + pptviewobj[id].currentSlide = pptviewobj[id].slideCount + 1; } } else { - pptviewobj[id].currentSlide = cwp->wParam - 255; if(pptviewobj[id].state != PPT_LOADED) { - if(pptviewobj[id].currentSlidewParam)) { - pptviewobj[id].state = PPT_LOADED; + if(pptviewobj[id].slideNo[1] == cwp->wParam) + { + pptviewobj[id].state = PPT_LOADED; + } + else + { + pptviewobj[id].currentSlide++; + pptviewobj[id].slideCount = pptviewobj[id].currentSlide; + pptviewobj[id].slideNo[pptviewobj[id].currentSlide] = cwp->wParam; + } + } + } + else + { + if(pptviewobj[id].guess > 0 + && pptviewobj[id].slideNo[pptviewobj[id].guess] == 0) + { + pptviewobj[id].currentSlide = 0; + } + for(int i = 1; i < pptviewobj[id].slideCount; i++) + { + if(pptviewobj[id].slideNo[i] == cwp->wParam) + { + pptviewobj[id].currentSlide = i; + break; + } + } + if(pptviewobj[id].currentSlide == 0) + { + pptviewobj[id].slideNo[pptviewobj[id].guess] = cwp->wParam; + pptviewobj[id].currentSlide = pptviewobj[id].guess; } } - if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) - pptviewobj[id].slideCount = pptviewobj[id].currentSlide; } } - if((pptviewobj[id].state != PPT_CLOSED)&&(cwp->message==WM_CLOSE||cwp->message==WM_QUIT)) + if((pptviewobj[id].state != PPT_CLOSED) + && (cwp->message == WM_CLOSE || cwp->message == WM_QUIT)) + { pptviewobj[id].state = PPT_CLOSING; + } } return CallNextHookEx(hook,nCode,wParam,lParam); } @@ -685,26 +779,26 @@ VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) UINT uiBytesPerAllRows = uiBytesPerRow * client.bottom; PBYTE pDataBits; - if ((pDataBits = new BYTE [uiBytesPerAllRows]) != NULL) + if ((pDataBits = new BYTE[uiBytesPerAllRows]) != NULL) { BITMAPINFOHEADER bmi = {0}; BITMAPFILEHEADER bmf = {0}; // Prepare to get the data out of HBITMAP: - bmi.biSize = sizeof (bmi); + bmi.biSize = sizeof(bmi); bmi.biPlanes = 1; bmi.biBitCount = 24; bmi.biHeight = client.bottom; bmi.biWidth = client.right; // Get it: - HDC hDC = GetDC (hWnd); - GetDIBits (hDC, hBmp, 0, client.bottom, pDataBits, - (BITMAPINFO*) &bmi, DIB_RGB_COLORS); - ReleaseDC (hWnd, hDC); + HDC hDC = GetDC(hWnd); + GetDIBits(hDC, hBmp, 0, client.bottom, pDataBits, + (BITMAPINFO*) &bmi, DIB_RGB_COLORS); + ReleaseDC(hWnd, hDC); // Fill the file header: - bmf.bfOffBits = sizeof (bmf) + sizeof (bmi); + bmf.bfOffBits = sizeof(bmf) + sizeof(bmi); bmf.bfSize = bmf.bfOffBits + uiBytesPerAllRows; bmf.bfType = 0x4D42; @@ -713,31 +807,33 @@ VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) int err = fopen_s(&pFile, filename, "wb"); if (err == 0) { - fwrite (&bmf, sizeof (bmf), 1, pFile); - fwrite (&bmi, sizeof (bmi), 1, pFile); - fwrite (pDataBits, sizeof (BYTE), uiBytesPerAllRows, pFile); - fclose (pFile); + fwrite(&bmf, sizeof(bmf), 1, pFile); + fwrite(&bmi, sizeof(bmi), 1, pFile); + fwrite(pDataBits, sizeof(BYTE), uiBytesPerAllRows, pFile); + fclose(pFile); } delete [] pDataBits; } - DeleteObject (hBmp); + DeleteObject(hBmp); } -HBITMAP CaptureWindow (HWND hWnd) { +HBITMAP CaptureWindow(HWND hWnd) +{ HDC hDC; BOOL bOk = FALSE; HBITMAP hImage = NULL; - hDC = GetDC (hWnd); + hDC = GetDC(hWnd); RECT rcClient; - GetClientRect (hWnd, &rcClient); - if ((hImage = CreateCompatibleBitmap (hDC, rcClient.right, rcClient.bottom)) != NULL) + GetClientRect(hWnd, &rcClient); + if((hImage = CreateCompatibleBitmap(hDC, rcClient.right, rcClient.bottom)) + != NULL) { HDC hMemDC; HBITMAP hDCBmp; - if ((hMemDC = CreateCompatibleDC (hDC)) != NULL) + if((hMemDC = CreateCompatibleDC (hDC)) != NULL) { - hDCBmp = (HBITMAP) SelectObject (hMemDC, hImage); + hDCBmp = (HBITMAP)SelectObject(hMemDC, hImage); HMODULE hLib = LoadLibrary("User32"); // PrintWindow works for windows outside displayable area // but was only introduced in WinXP. BitBlt requires the window to be topmost @@ -757,14 +853,14 @@ HBITMAP CaptureWindow (HWND hWnd) { bOk = TRUE; } } - ReleaseDC (hWnd, hDC); - if (! bOk) + ReleaseDC(hWnd, hDC); + if(!bOk) { if (hImage) { - DeleteObject (hImage); + DeleteObject(hImage); hImage = NULL; } } return hImage; -} +} \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll index d0b8727f0f9483a7870a152786c411c019998868..9c8240636cbf48c43c33e473f722f6420abc948c 100644 GIT binary patch literal 78848 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 E1C)2yFaQ7m literal 83968 zcmeHw4PcYix&NEeYQaLQwptY>B5`bBO`CqD`DhCbf}@gt!nCudO-fSQq{{~suhrHx zTf<8f6`bC=34`rA=NxyJX?5U=bQG1jip-0XyLG!<4YqDfd$npc|KD@oH_4mwF=Xz4 z|JVN;IOjd@InO!gIluEf&-qMRdGjW28pmeW-QiJoxLvE=mUd;c#p!f;l}$FK+vij|oXUz7HOh9E)s{1J=8Sn_(L-PP zWUQ&E05d!8>oli0J`(QK!( zPRF^~#Bs|Nshq3zpDLp?BV5we7bvE4oD(s>6Jj@AsNlE^gvpUl&m@jZVXyHg*NsR5 z51%BiOvuFYz!UPa$8FzJaQA?e8&GhaM0{HkH$9C4Q$8I@+=25rP8m>ev!^7T={0ko zf_sF@Kg}n{YwPqjc|05^w(AshTRCoo(IIVNJG>0g5+-8%5Mm!CxX*E0EnW-9{TVM@ zH|XZ#>4uYh$~dkpMzgny=lhv{|K74Ys|0PjX3 zd4LkOqK}Wiq=#2VBsJuXQ7M;__a?oD$m>+XyO2UpQMUW2#2sPrqBmBQHV(1$$@vI9^P9-cen)J3zV&vQdi`|yPYckfD)Ea!W=4~jcS`i zB!?*BY6^v^fS*tu#jp&=|LuHu4^ryaE`rxdo+0UJdUe zO7Kv^d`i$zXd{(UPNAc>z)Oc!Jzhbt0cvUkrM^`KZ!WRhL$8~)@K#gYyVP5u`4pnK z#n;1gUIK4A6<{Rdzgz+DXGHvl9^Otu?P{w0FxA#Wz>ZMDhg87x)ZW)A;qqE|ud+Du zeoG|JQK+4Yx{*j0)9W1+T1lbT$m=5ST8djwIqoK0ZlKq`3V4+icMl=1rN-nD@rpU{ zk|`8e4Da_h!*fxN`>CV$7Q@>~-b(7wc|`Z$I(T;2GbZ=4CnNCx83J|uSkKrnhOnCY zm7zWANF?$Mj3n1jFueC;-juq%_+J$nyeTahphQ0-nU?;o-5}ya6cw2lO1@N);WzA9 zoRq0jzo@cKn^L9bqY}%h(_&F3iA|-8;N3xltMp+ zVm>H_OcSVy8=cOZCj0}6ApEY0yslYzHHRPm2yGZl9{taL8qynYy`^W68m}7*zk?M1 zzrOx_8n@~Dmnbr{aJRyB!+oA2!SEhHl??AP!ds2EDBk1tho&^Cj`%`15W3Q)Z=6DR z9q3qlsBpCBN})ab{s!}mpTkKaKMOwrKR=K2vkg!5?2asrhyIIS}*=QnldJgX}1|G7(OzvZqS&WFyam$RlF2kzsS_eTGe7z&Afy7OBk0H{*4Y z%G^qI9f%yS#p=^X6 zMrbHt7kdy8urQOGNLJgg6d3@g1!yL6F#nVs%!|cRd3=cZ=ClP>$ z7hIS~vJfPrwbD4gGBemm^(IDU1pBDk#K_sfKA{fQ=S=GO%Ishtl?u7;hfGQ3KazDM zCJ49xw;%`*8)iL1q#+QMIK?VPVc&IzLJC0ATG7gdOuNkC58fl?N^8xa_ead(w}f|r zV{^ECoRX7+fd*9MH*94CRu(_LjY4L~sL%(00vSKv%59^e&urIcC^A}8B3WJ`br7lB zDT7#muSlxL8>i^dgH#q1Uvqf2P(7*CKfxkNaTKJQ3?M3=5y_g^$E0BugvaW zeae#}w+8#NPl|jb*q1paQZPjd-^B?HTn8pbkNEdchj88-rAX?h@V*?RQYHn+fTPH| zIs9*bW!-!HJHSy|(!41pC7o1K8JI;u&`vWk5-U?`MUw;tma@Qyh+Nl4+3#|oVVSX> z``)`GVZxLsHzChB&*-c8EtI+1o+{yv%%c@KdBz8`?L;KxH;11W8km4!0mzTvgs~x7 zn_+5gWbIHJ)6YX>lli-eVYB_PWE`iO-$wD#suaZkV1h9bdNA3WC9S~U&kXNfS41-w z2|UKfEE=h(Zgcp1LXtT4+)8*;iv`@*jUmn3>GOYtJA}7%($={R9BP%p|mo?TIQuzY9oX z`N^$7_z{FjY?dQT+DJyM0^#VKrNhB_9Opc9`5O~AIr$5T0GqG&Ly*||U@4^PnI|D) z;`-p!^YMPkoRj8`bN>vn9S@lf&@^_+G^~w{zN8J4@6dSRJzq0$Jc&jlQ>r+vqbV3a zZni&$V%ZEW6x#hM8<_1ZGYvMsL}rZcJ3tZ&P^vi;+9?oOW8?cjgD4m%Mzntq`J6W= zK}#vlZ10qCPkdRC3p_c=P(hWcRCB8}6skY~hTyhX@jAxCnJ6w}6rliR#qi$1vJyfZ z5*`i)2;Sh9rT@BEwP>rPkxTqFbo3(@E^Gx*WyX&C$?5`qCG3K$Ax!l!u&nQ;oUL5Tvw ztB%!k*DX{N#Y#nv&E@TFF)`Xgf>IsH62vGI{m?0Lz$7S=H7?A0nh@)si1?B<1EZ~@ zeX&MJd%;LKqaw?PsIkF58j2*5)PP_g4S!Lwqm`CfB5x!M<8MbIY&Sp{6c&C7gTjI1 z34=m9UV8>fD={bxf}REiK7wsSE+6CvFb>cn-h(i;gw{Y#gh_OX#*Q$FpcP>&!cD#w zu49R#&Bi&LEiSGFA&=MM^~giT!Gp~HDWmppgzR4*U^}DzTi%zrcAkswIt%+3X7;Zz zDjV0vBqybU6?yk~P9i7x6!xvB8_hprzp|`xsGe zAt{AY3RGm<|MM+kmNy+W3lveqE>KWqdx;{Ze3+z>;+?WQqJCg1HJgy0s&=Bb3AGD$ zU#juTkr2g$^mtf;0O|2Uq)YU8{43C7?#%=}zTv+}k4d_q$CF4C^qAHVlOR7J>hXdF zaXr2k;iw)f5&oj-Ez`FX0D#RmGJwD{I9Q45n-p(lFfMU~_ilhmS~g*}U&bY2VQL?P zc-xV=JCZe9u;dSc26K#+iFExZ(RB!P*C*2To<7mnR9%NTFO4-?$h0{;{-21#%BM1Q ze}!T)wyq$Nvw|V%zVmYI=WM4%)ojrpDD+KKUP_g|@k~1r4u(ij=g$EJF zP|d>kB0M67`w+IS^Ehs|an^O-^&K|OzQ(rxe`a)G@-YC$Pq|+mm5(b3R&3+cN@Ro# z&O-nrW+?pq9LxmgofC^eu0D#3ukThTW)Rkdi5U_XgoV-!L*1+fa2u=Q)?-@nB8Z20v`_#*sP5g$=QE7|!ZIdvk9?`M0JzH6{O5N|)v zc4q+a2|?h`L#|N_Cu|={GFj@Q%pkK1>+C=LQBpB=6YcRJc}yr}U}`e$_QaF7AvwBX z9A!`3Ev|!*V}~v(IMf+!l15W!G$Xh4B%_8Z`&>HX6y5pR`sWb|tJFXJXbrGb#5y6i z;NscN>w^1e7Zs-i;@V1*O#7n??wgmG%r;$dppfbiH)<$7KBeaGqh7*bZ54V+OVyJs z4E=%0f)uqYDedn^?X%(Y#1woU0$+bWK6cIzc_J?kWK>>7B(6tA($>$RiqEC>pRK+9 zQ`-C3?bw&-RCzln0_?jscMOd7>e93~$e*B7zRpiP4qeIFgu z#BJIIC`{U@kB^>hqa=3Y?C?Kb`?wA92?VvTlUNYA@8r(ReI-bx+#Ak?dvSerBs!kY zk6^x6h&OS46*bGz@jP3?FWI{TZxFwcEVE#Lp1~{5*D0n}i1`;5GZyaybgwwFtP&^! zR79+c;>is{ato`WH7~Z2UMEBd2Os6w{}Jen(dZ3|<&zEpZ(tkT@r4!Vy zl;g|Ty0vvi>x>Xvou)x;JK4IG=I&L*UR>-J;gwDJV`8UfF^5kjS7N`;q9RT&c7HiS zHAuwn_lOuW9YE9AO_BrbCdmPR*MS*b%X!m*^yikRj0IlsC5;+Mf9W5^K809tF3RXX z3x#s6kh+so??CG452CqSXU4KMOR`C#m$PUdYaFbKg>KY}QHSHgdM%=ajjVAkRwI$u z5*ENq@Y*v--3K}T_}_(2XZJ29K}~BBy6&1*_!p1_X4gQjtRSL(F%z#2A=VpTmnWEuoH_LN#PLf8@FD~BQ9WrFxUi&oh?06C?E z_p?T%V!3~r{kCZ2zeXd|1DB%AAyYqkkTeYnF$}4#5K8JmNkP*SL#C}%8C~7l$`o#^ zziVq=*Hw5G&L((v0IjQh!iVnK8Z`CeF3YR_u6{0kBdx>Z%xI(a`Yz>7{bJ_I;UKev z$A5rI5~FF1;!PPr)8<&bzn^Y{(1o^m0h{>?`EH61E=rR`_X~$C(m6kml2U_JC^S}k zj4D3$7pXGYbErI9nByYnQ2A^jEany$cj>*aNLlyy(+meUP<}zNQ?D^x0Styx*d+&P zCR)uYk*$i)qWcXvfW8R#8d7sNb-f6MCk0s`%rFw$m z^ig^g5n(+GsQ~N19V)k$6L87Es~r z1|QCA5ycH72WCm^jP@wP&7Q?=7LVs9OZ&OsC!1=Y{-@v1JRXZCib?jEpmk$>Dl}Ns zy9wZjk#xueQ8~?cm)E7n*p;Y$BfiTKN4sgJ!_gG#>tN*s6ml47((YtsB;zoz&8h?*iP zSQuEj^m{fNq5wGexPWb`~w#Z*fU90Ny@ zh>njRIG+ETNF*dg^OfU#Ra$lU&0kX$7*EFioynYUrL-QA<2!MuhSkHaw@EJ^#bbpT z1qq^rrQinQ^7u2RCEx-Gwk6pgRADj5^crhrkHaZ#%eprUmU5^_$J^u1Cu- zgA^{JbH0@0I#Qt6X+5otDoK%m<~)c z9TrH^e`*>Fns)Q1-RAHPv6?^|nBYU?2P=2_yLMuJ@DvyvGIb+2rx^&EdV{9EplM^! zv5(8!r*>!tT7m&PObe(2t#}3lPUgGeqk#D+fE{?WAbWo{-VnG4)*S_c zb(BmUo{CN`7TWY}bR(`?A~)Hzkf|G^{7#JWbU;JvZaze5uyPH;#`0>=qX?FREgB

rqB7CDqWF0%o-I#vTsxuTa3#G^Jq@2eXsz9`V5BacP zJyag*BwBN;qIFg%L=b?f-q;HCH!li&MQP@TD!UU1o|F>smAk93DO|S`Tea~rcqxhW zWYbLvrk%k+C+j)#tHL+Fz@&!oq_OKZ0iPQ{Do%%PfYK;Iv`RQ^A{m6LTuWtPbAlvg z7$n#QX7is}OYvO>gsBH-AWSWsh46U@Q=^EULs&T9Y-(@en%W&)bDP8F^!~rG5AU@1yOBO!Os8YZ-6-BH&@?fcoe<>BY(0BS zi2f>z-ht>|Cf_?C7GWVtjU?RtbwkM%!fph7$P{VfLP39Kf&^KW+(B`-0?Jo;7|aig zXQjJATPqaz$04E>ii&T(w|<&X;BF9&UM5UccB3qsR;q=%wz2#W>BM$z5TmK4RYFbc z5EVVeWs)wGBkKIukm~Om<9tfO(|b8#N!uTyGL*2)Lf4r_1hp8s5o$4ge@rc?>!B9u zR5jFsjUQpq01c)W;|RN(7ymye=MfbL;}cQQMevAFfeA}ZR9il}HWGoqq>qlk+3Y9lJz!;PqDLolMEnQ=r# zGtG#K7WWYq^*}^LRy?92sgJ0rZzC#_CX~tQC7X>hnNN~~GMP`Jj@p?|=j;&`oxw*` zbSWUBqOXO;b=jxb2Nm^?apr1hC~rz`<;>yB(SMkdVUm9HD(ba3`9VGc@+y#OBK*5r zBma7^Yx2%T{E}oot$5l{&mEUd5;4B;Vosj+N{{|>dh=#d`tssbzAm|{I$S%*O6N_J zW&WWw-Ff(S(;d&Dt|>K9&XYf^{(Anef%m;v2M&3!tl__&8hFE-xpL=0{!{+N_a5h` z1(zfT>(hdo##?Uv`t!+CjAx90{#~@-b=?Qv8m*Dqusrk~W`o3*JWEw;YcHGh&EU(D zr|s2dW_vH=Z%XEC(=k;|t~Q55`&cs=VM1GWkERHbzEo7PADq^sh#O!ZCJ??+dxvMrD*GCdoSiIlULSPg@3|;NfRM%Nz>LQuL!*FdrH9Uq$ZvW z+8JWH4SH-saK1S(Sfc6LpF&ZJ@HRBi98O`)%$CZ4v^ZoEvxUFGC^Hi&bu;NJY`&!T z_8m`pJ`zFJh>E^n0)1hAE%WJiCv=4Qw=th)4A3Ly)1BFfimpFF*O*UR(-GAj%tEuxXpvd-8Vs&oOtINq%tV zD)|1cNzQjZn{L9)FB+c@F3gcr@gSqU>(W%B4B z%cp&K-yFZ8jC$kF^lkL?hZWoDIZF3!UZ+Xx%w6D;zc83p%s5L^qz6)9V24cOj4AtG zSlKd~=?03p2qrq1L2bc=+B6B{Nv?uq_HKcAN&SPk# z3K_^QSM0lBfuArq*eX8!HB`^w7#lLtT_6U>SRx!@e^;2n5!Tg>5gaE@3rCVS9dJA; z^ziWt&}}0zf$VG*xC)w%`MZu`UU31^cqTm4HuF|_d^20*G%-F7OI&mup_Y83jP+T`y#!TA#VpJ^7f z1z-G4)ZG7_Z%m)9+h}RV#!W%LX%j9b{4cv9kCKhn@En3j9h zD0{xxB&x)FRkWB>w?l+zbRl0khO>nvI@YWlLwiT6!@mblFm3yI1}K3fQsaSjOe9Pe zZS;bn6ap9Tk$t@B7+-n98k|YQUpw0=%|BGoBUy(r>w`JH)SjGyaced>g8@avc}(;6 zX$BGo?5MmQm@02$^G+{snt?vkTQFOY7wW%Y<#4F(E!a2=uA$0i0u#1ojI6}Kc>EKL!mk-{p_lVqYYqhtgT~w{ zNkY$IgM^}kp@Z;8XAA}CdE31(5cmNIF07?pj4m1`L961oP%59iC-WY(yT-gS`~qwP zW^9Dwfb}IaP7|Z<6iBDf@;QjPo1rmEvTU3P71Ajq_#BU^xeT+?#&=#Vu z7NP>Qxo-CF`?x0D^bEBy8?)W(c*Z2pnqRfjo&hdHTPSliY>GJ)qD)oQk=KsX??>^5 z10opq8JLZr_4slzS}&4`@cd!|Es6X)iE!wl{X!aq3MKcVoQ7s)yZmhh_yjkjukeM>m-6!Imm zi2jDa{DYID`WikLeI;=b^c9^!bCOCNI~-xUdz8L|UWtKzGE{f4`X8ymi2#ZEm5Tka zxPJK!8DwIiuED?rIu`n#-a7z+=`O~;QhM)$Bs&K}-%#+84HuU89`b#-;AQ{b>v}$< zUrJl|PoeKlB9rEYkaZrn;l73F=f2G|DT+w{%nxr!E$e;3_aT0Ng(4R`zhc7*#SMs= z;1BFQp2WZV-VgW#{y$FZUy7XX?cfh=$S9*aMDo4-UlTKkTFQX{`V6nZMNb7c0+wY)& zDQvcP#4=-gIRG|7n^UML%wCBfo_!4`6rd<`YjRChxcMW(bUqEb>?cm%_?ZBzJsTx~ zVr96TQN(rm8IdAU0RPT6hQEIddjx4Uz&n+#FEg-PvS2^$W#VK%)BjZ5l zheUZuo}y2gI|Y5h(FFLYsi%J3MEy!yB+;P~QHRz=b!fwV4d<*sZRemroxo%paa+?m z4dZpPIea?|xI}s0+xht^5Bi=>3?wrmh997(`NecTInaB*0+R^MKy*_~NUu!wf0(@P zVpvf=IYd*CU?zKfeIM=~M@gAvMd`OKg%k&8l0THP96rDoRt$*(7^5ee;7sy|QYhDH z=vlcE{@l;A zJ+55J9w`;-2a$a&Jlp9=wU$Ze>sGq~ICCFDH5FJuotfc~QzvaHGKGkZqK> z-O5_C3jXwDZeS>-fu%wU*``r2bOd?$tYpG-%Ta`dnaK9XK-Q`VE79|qFJ6m}{aLks=HB@r0;SYQN8BIN%EE{O#Fpeu$J zp~er6Tru#$5p10$;vVffK2rZ&_k-yD{f6F$6d9h2`SUQ5Oo|Nq_b2y!N>T22Zk6Z{ z(Qka1(Qo?BN%RzzNFPxVED;rLFGf_fFA`DFc1=V@yD||KZD2)tp(o?tKStJ_#)ry@ z^rtWE`KS`VoXEZsr^6tC$Z1RUL0p%p8}BKhAIxP*N;>)<$fg0Na+2kuZ6}tL65Ujh zG(=jdBrK^P0>$c?jNV$pu=MmIEb=EqwTkRu-T3H5G$gT~bi?Hh|K9nGCn7peYnt#} zLpM6=(sWg6?n~Hhi!?Ai?Z#AXWtt}i5u?eYzdZYmQISW+AM|DZN&0f+H2Na!e?T2b zD9K7^y}0(oM49fgI9tx$w(ikd3cDO#y&y@)--|bW(b9*auSk)eMv-WOyh{eMy@3M zSS%c>3&XHH!7`6)=t6^#e+>D1y2gnC+M^v`fxzgcqz`}|>s6@F_}-C>3s~W(5j!y8 z2k9Ri3bOIz?=bceRsU3cgkPJBZ;RRIXTX|MmEo5jCppVLwegASJMu$O{9_d~LmVQ2 zxz^bsTq4oDa8rFt5Whb)0tjd;OEYjQv5ud)dnW2jFvlrmFOY=tHg|(Oa2h#Wq-MjAT z{HF^((sfL_Qy2RO=IdT}AJ@I^y=8H?K@EFON4|!IEU+|8KfJJ=USKIp_NP#~Vl-tN z#n=yG&=nU7n)h}4y_bjTPGD)DU0)xnJW^F(UtbN=I;ccjrZ?UaYt0E>!Dj@0$0COe zKmS24PBHF->B2aH=(5=)1nieh>LbH6FZHpsFt+Eal_)TT>!~YiB8Mo+%#y}~zDdey z57kYgx?Ut)#}X!WFQ@m;rQn79qEw-@j{r7I8kLqtH)1Bt^tENoQ{cw1V-Pt+`Hz7r z{b^IGZl4cwJf<7Me-YTPV-B>o~h*XPO{(=$B#)n5N80_tXAoDD7A9 zIqY%bH`UN*z-bqW_6b@|-HnteA86AAs-}N*m77@b)-C87(;3}2!TK|6t~;=HChpbh z^!wc@WxBoY_xXzbu>6^=oC-B^K?PY~G^#@=1=o4$Yah|lXipS4aP<;i9wJ`Q7Ia1A z5am|z<}wO}DO5}$>JamMgiOb9n)-Jrkz~aAzZ+!stY<76jhF5x^b z3A-a(gfi0uBP2eIB(!Cm*2U&fAj}rSoP7l3RkT5t9$+^g14MvL$H-j^hW#JSOuw6i z(?2lNkc@iL{af%BVl-wxK$V6<6Y#OSM+IW*ofT+~{JT(J6+aPqwLX%S2CEo|_$+*g zir?8#+&lAq1iaJxdS`xs!07qQf-H$IAXGI2p^Y=C+zpxM^<^r`{1X@4IUWj74D^Bk zCkbOXDYpx~Ay(3;84%X=w}#IXQ~vMDP_(v)YBw7%2be#|`~%EC$o#|1r$fz%Dp`m@ zvmz?m^^T}$A2Fh$4bF&akomN&fijs-3zLXylKHfniKu84#5m1-8Z9w{WIhe8m{~HP z%n8oZnNOnvPRW^1eG}zce#!{Q2*?P?2*?P?2*?P?2*?P?2*?P?2*?Qh??wRo7V<|% zKt|vTihy~AaLwTh+B~^g=ZHYw3gK_XVn>_{!3}R#aKqokectL7i%m5(jTNTa^2JN( zmy|fJc4@V#ydohg8dqK$CyV8kM&e8DO>H(SE2zfit*|xuR@2L3yRCW6GADjBye*o{ zt>~~h@uyHrl%`IHw?yf%8dMH}1N^OuXj+Ze*5OgAtP7Pb4!6gv^t3swHl;_5jgm9I z6Y?O-^(ui6N{pr5VDsYd__nyjoU!<2h*P$?ELIz;a=MgmTZ`M~u}3S2(Jgk{EMA-0 z?P|7pJjxaezQ-T0MN$tMztZ8fy4HD?x?F2aol{8Xf~V`3D6g+kQb>}o*5y*RTb%2a zK*l4~9;+L?)1QuY*w)$HW{cN8rA(0y;8@(iQ{~esRgQ%c7i~K;@gk<$^AOriE4PYC#jk>f?fhde*@u(9p1Ila+HAcOeDKDQg+;%CXRl$-G9pUE5`LOEY${c^O| z%x>G-Q^hZ8vpCm?x$B%wk~h@h^14{*P!IesiIxR^NqY#@SiPQRx6S5czr)1(t;6E9 zvA2rF?0sDm?5G=EA}BnItMl00nmiWdT1pzM)`qpsUYD!Q)6nepHa4|c8$7nQmd4KF zLW*d>A9|*zwXH3uS;!>%b9M{{ZKWVc0C~9c_?I<&2rro9!02vRP?R&UYxU zRjNCeEcvo-#>~Zbi*vQZxmqX}fApRH0KCZ8dgVGtTN?%nuhP=eVrxb-QQbFufXcf* z$_oY%Uz?XoaCM;f2t;%S{&>8kBNBT1>|Sb7(^^ZLkG0uUV`eZBC)8G(yKTMF0}EXIpA_)qax!W9>2r{mk-Cm(YKXwO3yy@ zlsZ9IL?xjviz&dDxGymvW7?8K1qfJ+I`SnBG{CLNMhG#{B}iO8uNWoK7M7c_a9R&K zeO+x_sh40b;e+N~qq5TI>51iw+JH)z)dx*wzXeB$(fB3N-x3mYRC7N3$@}ZLTF$|> zb2d)NEyiyR+qhP##!R6r3 z&d)>{b*S6IHK7Ko*^4wK%EzA-<2n#$;nw558oVvWvl28O{IhVY5jqoOLchiOM(MOc zV|}7=jP_xiWfqF|waqfsDvGueQg3sUrZlY=^g5;}=;T;k(V-z$I_5y^A4M3I_-z_I zSxg7~HY+?hN)$hz6CcsyV$T`nRx6s|DS^eJ$Qd=TFeOTsKBJu3f2Q?LUwacYkwi6W zz@iNmsaY0oMg^>IiBeB*>pZZUPH#&&!Vq+fWjPp}1Ugkt-YO-6<#FXXC#8tuk}zP! zU>E8le|h3al`u+0hbK1kif2h26U8!N0U5<&aa4+qNo+Wxp@_6vIue~!Ueu^fDG+p4 z+#gcIWx|czr^x7sqwI81pDyr6i&7wv1UC&1-!I`RYs?jkiq$z4%a`K~^N5N?D=_b? z$2fwq&{jZkCg)m*+vRMB(X4Q|G1g$5r+E6*tXNXJvb@^VQ0X9R?`rWj)H}$m*LZza zhpR!Gqi(=b#MjYKUnArY{A$~3Hf8%N{zwOX@LuJ!x!0p&pUu=s-A-}D3rK{B@{0O$ z^D;<6lvyH@Kc71S)io70dv9CPviOK@=>xM1KUkOfMjFY>;*y3ssG_H#6_X(^CMOLQ zu4c@xonB7^hW=JahNpp64Q(9_t8Gr3+tL<&?P&91CPQQ}c}^^U*gB=n(bUk<;a!Ub zB?Z}HT@sPgVa3c={>TWN8G*tJ$lya(!z!w{VFUh*_#qQwG&^lbxW zf8B=f=fe@5{5d@Wx#Iar=A-mgT#lP1y1wrzxB<8cxPuoexDVm(faBqIz&(7Cf@{Vz z8?F}aQ#cQHC*DK+Znz%2UxPBg3|9+txrj;-6+R_K&NnAo1})D2g9k8jMzw@SI_25j^+1-qWY z&MTG*p6IqIg)u4RqNhJtin%(lSHbpQPY*ozA82;4!qr{K22-4E9d*9P}IXb!`@4R;Z+2;5XW<6n4#WK(ZW3-5evwNFmjhP< zcOzT_TnF48a2wzrf_n_^S-4@iakx+6($I!XxU1mwC@T-{5xCFmb2IvJIh-CYA8tNe zHrynzeH-p~aD#CDaNmb}5UvmIcDPo!o8ca|9FK(td$>~Mx?1G(Qxl@GGEsnb{#p8A3-cBQ0 z_aF;*tf#Ou1!sgF8@RqWrKOoJx8Tes#o~22IPS8Pmen@2a!v}ncm#4jMLaG;_~5ig ztcARV`3}1Op-gEJtNIR=jz9Xsaa)rb9bT6Ov=6Wv={D8HTxqGM>}%z#%;l@f@cR^+ zl$LdFhZnV8h?G2}AYmD$RMylluGXq6g!8xtu5od7ZDV!q;>Kk+EvsG0agQn*ZBDvn z&?uf(anC0;((MaZbECCsHTQ<15jWdxEW9;JYi)G;fa_*OBhKrkdEF=<*I^(>bb*iE z)Zt3OKhE87y5G)~#lwv@u0qjhY4@ydq+4V7l}x-@TYVmHV~f?XmgDZ>8XFgPbgXLb zARR|`?k+_mU5ByKEy2|`cO%_H;<%llYlfgY8|h>Yb+xz}>2KwD5JWCq1mU=O$&EfI znzV*{7S!leTuY!zcP2Hm*j3XS#hAy?#?EG2hqn*AJ9)M}3V5z|-Uc2qRd zm<-#++D5Gqcn|^RvXaqvr%kS%#?;1abK}kr?xr;hcd^hjEo4(`9nmi5ej=$?Ff?Rg z9+$+%4bKY7TeBW_G~4NVL%D}6I)%7xNlR^(jwKL3j{7bPvtw%Rny3Yb`)?{) zxbQ%^$$&w&8=%Ud|~aAR{0nAR{0nAR{0nAR{0nAR{0n zAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0n zAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0n zAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0n zAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0n zAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0nAR{0n@V^oP z1(yxJ;kpyqS8z#)P@f`xdNRi?MOud?iTgGY$)7VK@RwiwQeWEH-lkk@b9)>vr(tex zj(V=r=4^IZ9nRH;xplQmt}C9a^mr{!tEJ85v>E2Ew|VB48fVVXTRa|HdsEwbB?@qQ z40C;MXNjlTZfm!Au4{KRyImevi}$)_S9^)Y)1I?7cdoMC;&imwJl=X~Z752q)O+1N zk9V1~#dVgYY38zg$my{)``ixidhs1GZre9}sKsVAyB%vCZMM}mPb^WIZ0bZ-FPgpF zw$|3BY$M+=*Wy{`TI2>l1j@ zUmt5U%dWTDI&4lWz>l^i7UL}!v5wahMSmGGc+q^NcYOzXXPv{T$(yTmTH5ha8SRCf z`o&sxPKB+>w|a4P?c8{GYje~&dAaJmyd3m$hucN1b-Byk&31>^*6j7UQA%fVA<}$J zZI0%z+SbZjkfGpCpg9*678L3VO@&`Aysfacu%qzq!i|OZ7w#y0vT#>n za#3ngT2V$(PtmuE9xi&c=to6AElMxGym(&mSBk5PyNfp#|E2h&;xz3=+PT^??Gmk1 z+o`=%JFIcuE{}=t3{(b!?`k97{4ObYxWVp^yXecu*F|0Ry%kXc8LBq?2!-g5g zImUeBGUF{qyRqB2!MMrzgz-h=VdL+N?;9^EEhsH7y{Xhz>MrdpeY|vc>8qu0mX4La zTZ)D%vBp(!+?DD)_3i5W)DNluRs9R~LG>Z^n0j{Z{M`K9vfM{Ck85^mp4Ggr8PQD3 zzaan0{G9wn`IdZlerNu+{C)XH^Ro-e3vMpxEZA1?Y{8!jJ}y{ZSY2o>>?-_T;hw@n zg+~hiR2VK)6se2!MN5lni*74=wD|GjUB%B9zg|32JYJllovFQ8o2M<&F4ult`wi_T z?PJ;}wfnWNYR9x6YG;*PQBqiGW3`0 zm3qDY2EA49(r?s%TYpF&)?aM6(r}GIZ@A6SX6Q8Z8q`LkvBLOu<2Q_*#(Rw4H~z@@ zOXDHqQRAD&F=I#Rou$2{-vu&ZQ)jE^sEgD__04LB+M`~t&d9wg zcV6y|x#nC)t}FMh+lIaptj)F0&4+ZaDM?;IIA$T@Y=%S!kWUH3*Ck5 z3pW&QE9@`)P2rn`9~Pz+Z7q7TXjjpZqCXUs7T;LhP~23^7k{_-r^PQ8zfyd>_(ZWn zYtlAr@6bM={h{_5?Tgw8Z8A`Lu4J&}cu9)xD&1Fg&APwnKGdo7x%wr*X{-J@{fPbp zeHu_Q8Y&D{L#yFo!%q!+AW^Rv-ZZ>pc+c>$;X>nFyZUG9LG@9!EBF4~Kjfz5neuMUTMI-U&)bu?FYmW`85)&F zr!i|hnty7#f{f*GUdVK@*&}|GrT8bYW>;X>qBs zw4u~dy1ulh^joE&(w~$*OBk6I+yow+I#rzkN&1qyPJN5ITivJruKI`SAFKDN52#;L zzomXh{hs<`^`*IUpmVvo*4$Re)wgq>%>8-pOSy+~Rgf(+u(UzG*5y5w_shJ&ychF^ z^Ipq)EAO4WY-r^5`785V^ZER(`Dq1n3Tg`M1-lBW3;PN~g^w2gzObz5hN7mTCyL%J z(iY!byruXL#gXE9+B)s++WWP|C5Dm}(5W=trMf0yHLUxsZn=Jy-mAY||1JGJ`Umt+ z>UZh)==bYi(!T~f6w#*|vLG|nhDpOTV}o%ubm^!uqcp2@Yw5ny7fX+q{-yN4OS#(= z+(PKjWoWZXU9PTDuTrSUYvJ%o;q(uUVWY=&z{$v_i)~}ydUTNTb@<3 zMsufTv*tURCpFJ&4ltej9V}LM!IcHq7c4EX7di{Qg%1^OFWd>O8Y(;rn=}qvzO<;O zXmin1MZYLI9~RsX>-})?_TnEG?<{`0I8}Q@`vGwd)tZrEvf%COt;yx{<|%D*#=K$FG{?;0iypBj>lGmII= zON_IjQ}c~Eu-7HVGUE~>*DdTbrfDV(oH5y$YD@ziWM-3s_87U|yuQ4Rd7JV!=RK0Q uHLts9W64f^zkav=DD-zy&l!}ka%Bb(?o@DTcr2t$@<&EMM&L6e@P7dKbb|f> diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h index 6012b0467..a45f3b4c2 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h @@ -27,11 +27,14 @@ VOID SaveBitmap (CHAR* filename, HBITMAP hBmp) ; VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename); BOOL GetPPTInfo(int id); BOOL SavePPTInfo(int id); - +BOOL InitPPTObject(int id, char *filename, HWND hParentWnd, + RECT rect, char *previewpath); +BOOL StartPPTView(int id); void Unhook(int id); -#define MAX_PPTOBJS 50 +#define MAX_PPTOBJS 16 +#define MAX_SLIDES 256 struct PPTVIEWOBJ { @@ -49,7 +52,9 @@ struct PPTVIEWOBJ int currentSlide; int firstSlideSteps; int steps; + int guess; char filename[MAX_PATH]; char previewpath[MAX_PATH]; + int slideNo[MAX_SLIDES]; PPTVIEWSTATE state; };