From: Bryan Petty Date: Wed, 13 May 2009 18:30:06 +0000 (+0000) Subject: Removed dependancy on wx/bitmap.h from autocapture.h. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/5f1b5e83c4a9269acadaabd1f8b45f4a3bb1f2fd Removed dependancy on wx/bitmap.h from autocapture.h. Fixed issue with Union() improperly generating a combined bitmap from two source bitmaps (only shown on Mac). Replaced old wxWidgets logo with the new one. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60620 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/utils/screenshotgen/src/autocapture.cpp b/utils/screenshotgen/src/autocapture.cpp index 09e861b2ce..3549158224 100644 --- a/utils/screenshotgen/src/autocapture.cpp +++ b/utils/screenshotgen/src/autocapture.cpp @@ -13,15 +13,17 @@ #pragma hdrstop #endif -// for all others, include the necessary headers wxWidgets headers) +#include "autocapture.h" + #ifndef WX_PRECOMP #include "wx/wx.h" #endif -#include -#include +#include "wx/bitmap.h" +#include "wx/filename.h" +#include "wx/notebook.h" -#include "autocapture.h" +#include #ifdef __WXMAC__ #include @@ -32,6 +34,15 @@ // AutoCaptureMechanism // ---------------------------------------------------------------------------- +AutoCaptureMechanism::AutoCaptureMechanism(wxNotebook *notebook, + int flag, int margin) +: m_notebook(notebook), + m_flag(flag), + m_margin(margin), + m_grid(NULL) +{ +} + /* static */ wxString AutoCaptureMechanism::default_dir = _T("screenshots"); @@ -46,7 +57,7 @@ wxString AutoCaptureMechanism::GetDefaultDirectoryAbsPath() /* static */ void AutoCaptureMechanism::Delay(int seconds) { - // TODO: Switch this to use wxTimer. + // TODO: Switch this to use wxTimer. // Wait for 3 seconds clock_t start = clock(); @@ -55,7 +66,8 @@ void AutoCaptureMechanism::Delay(int seconds) } /* static */ -wxBitmap AutoCaptureMechanism::Capture(int x, int y, int width, int height, int delay) +bool AutoCaptureMechanism::Capture(wxBitmap* bitmap, int x, int y, + int width, int height, int delay) { // Somehow wxScreenDC.Blit() doesn't work under Mac for now. Here is a trick. #ifdef __WXMAC__ @@ -63,26 +75,25 @@ wxBitmap AutoCaptureMechanism::Capture(int x, int y, int width, int height, int // wxExecute(_T("screencapture -x ") + tempfile, wxEXEC_SYNC); char captureCommand[80] =""; // a reasonable max size is 80 - sprintf(captureCommand, "sleep %d;%s", delay, "screencapture -x /tmp/wx_screen_capture.png"); - system(captureCommand); - wxBitmap fullscreen; - if(delay) Delay(delay); + wxBitmap fullscreen; do { fullscreen = wxBitmap(_T("/tmp/wx_screen_capture.png"), wxBITMAP_TYPE_PNG); } while(!fullscreen.IsOk()); - wxBitmap screenshot = fullscreen.GetSubBitmap(wxRect(x,y,width,height)); + bitmap = fullscreen.GetSubBitmap(wxRect(x,y,width,height)); // to prevent loading the old screenshot next time system("rm /tmp/wx_screen_capture.png"); + return true; + #else // Under other paltforms, take a real screenshot if(delay) Delay(delay); @@ -90,17 +101,12 @@ wxBitmap AutoCaptureMechanism::Capture(int x, int y, int width, int height, int // Create a DC for the whole screen area wxScreenDC dcScreen; - // Create a Bitmap that will later on hold the screenshot image - // Note that the Bitmap must have a size big enough to hold the screenshot - // -1 means using the current default colour depth - wxBitmap screenshot(width, height, -1); + bitmap->Create(width, height); // Create a memory DC that will be used for actually taking the screenshot wxMemoryDC memDC; - - // Tell the memory DC to use our Bitmap - // all drawing action on the memory DC will go to the Bitmap now - memDC.SelectObject(screenshot); + memDC.SelectObject((*bitmap)); + memDC.Clear(); // Blit (in this case copy) the actual screen on the memory DC // and thus the Bitmap @@ -118,18 +124,18 @@ wxBitmap AutoCaptureMechanism::Capture(int x, int y, int width, int height, int memDC.SelectObject(wxNullBitmap); #endif // #ifdef __WXMAC__ - return screenshot; + return true; } /* static */ -wxBitmap AutoCaptureMechanism::Capture(wxRect rect, int delay) +bool AutoCaptureMechanism::Capture(wxBitmap* bitmap, wxRect rect, int delay) { wxPoint origin = rect.GetPosition(); - return Capture(origin.x, origin.y, rect.GetWidth(), rect.GetHeight(), delay); + return Capture(bitmap, origin.x, origin.y, rect.GetWidth(), rect.GetHeight(), delay); } /* static */ -void AutoCaptureMechanism::Save(wxBitmap screenshot, wxString fileName) +void AutoCaptureMechanism::Save(wxBitmap* screenshot, const wxString& fileName) { // make sure default_dir exists if (!wxDirExists(default_dir)) @@ -142,7 +148,7 @@ void AutoCaptureMechanism::Save(wxBitmap screenshot, wxString fileName) fullFileName.SetName(fullFileName.GetName() + "_"); // save the screenshot as a PNG - screenshot.SaveFile(fullFileName.GetFullPath(), wxBITMAP_TYPE_PNG); + screenshot->SaveFile(fullFileName.GetFullPath(), wxBITMAP_TYPE_PNG); } void AutoCaptureMechanism::CaptureAll() @@ -165,7 +171,8 @@ void AutoCaptureMechanism::CaptureAll() } // create the screenshot - wxBitmap screenshot = Capture(ctrl); + wxBitmap screenshot(0, 0); + Capture(&screenshot, ctrl); if(ctrl.flag & AJ_Union) { @@ -174,17 +181,21 @@ void AutoCaptureMechanism::CaptureAll() { ++it; it->name = ctrl.name; //preserving the name - screenshot = Union(screenshot, Capture(*it)); + wxBitmap screenshot2(0, 0); + Capture(&screenshot2, *it); + wxBitmap combined(0, 0); + Union(&screenshot, &screenshot2, &combined); + screenshot = combined; } while(!(it->flag & AJ_UnionEnd)); } // and save it - Save(screenshot, ctrl.name); + Save(&screenshot, ctrl.name); } } -wxBitmap AutoCaptureMechanism::Capture(Control& ctrl) +bool AutoCaptureMechanism::Capture(wxBitmap* bitmap, Control& ctrl) { // no manual specification for the control name // or name adjustment is disabled globally @@ -227,43 +238,43 @@ wxBitmap AutoCaptureMechanism::Capture(Control& ctrl) ctrl.name.MakeLower(); // take the screenshot - wxBitmap screenshot = Capture(rect, (choice == wxYES)?5:0); + Capture(bitmap, rect, (choice == wxYES)?5:0); if (choice == wxYES) ctrl.ctrl->SetCursor(wxNullCursor); if (ctrl.flag & AJ_RegionAdjust) PutBack(ctrl.ctrl); - return screenshot; + return true; } -wxBitmap AutoCaptureMechanism::Union(wxBitmap pic1, wxBitmap pic2) +/* static */ +bool AutoCaptureMechanism::Union(wxBitmap* top, wxBitmap* bottom, wxBitmap* result) { int w1, w2, h1, h2, w, h; - w1 = pic1.GetWidth(); - w2 = pic2.GetWidth(); - h1 = pic1.GetHeight(); - h2 = pic2.GetHeight(); + w1 = top->GetWidth(); + w2 = bottom->GetWidth(); + h1 = top->GetHeight(); + h2 = bottom->GetHeight(); const int gap_between = 20; w = (w1 >= w2) ? w1 : w2; h = h1 + h2 + gap_between; - wxBitmap result(w, h, -1); + result->Create(w, h); wxMemoryDC dstDC; - dstDC.SelectObject(result); + dstDC.SelectObject((*result)); - dstDC.SetPen(*wxTRANSPARENT_PEN); dstDC.SetBrush(*wxWHITE_BRUSH); - dstDC.DrawRectangle(-1, -1, w + 1, h + 1); - dstDC.DrawBitmap(pic1, 0, 0, false); - dstDC.DrawBitmap(pic2, 0, h1 + gap_between, false); + dstDC.Clear(); + dstDC.DrawBitmap((*top), 0, 0); + dstDC.DrawBitmap((*bottom), 0, h1 + gap_between); dstDC.SelectObject(wxNullBitmap); - return result; + return true; } wxRect AutoCaptureMechanism::GetRect(wxWindow* ctrl, int flag) diff --git a/utils/screenshotgen/src/autocapture.h b/utils/screenshotgen/src/autocapture.h index 3db8cbc8b9..9984c21c97 100644 --- a/utils/screenshotgen/src/autocapture.h +++ b/utils/screenshotgen/src/autocapture.h @@ -10,8 +10,12 @@ #define _AUTOCAPTURE_H_ #include -#include "wx/filename.h" +#include "wx/gdicmn.h" + +class wxBitmap; +class wxFlexGridSizer; +class wxWindow; class wxNotebook; /** @@ -210,11 +214,9 @@ public: */ AutoCaptureMechanism(wxNotebook *notebook, int flag = AJ_NormalAll, - int margin = 5) - : m_notebook(notebook), m_flag(flag), - m_margin(margin), m_grid(NULL) {} + int margin = 5); - ~AutoCaptureMechanism(){} + ~AutoCaptureMechanism() { } /** Register a control and perform specifid auto adjustments. @@ -277,31 +279,34 @@ public: /** Take a screenshot for the given region. - @param rect is the given rectangular region. - - @param delay is only useful for Mac, for fixing a delay bug. It seems that it didn't - fix the bug, so it might be removed soon. + @param bitmap + Bitmap to save the screenshot to. + @param rect + Given rectangular region. + @param delay + Only useful for Mac, for fixing a delay bug. It seems that it + didn't fix the bug, so it might be removed soon. */ - static wxBitmap Capture(wxRect rect, int delay = 0); + static bool Capture(wxBitmap* bitmap, wxRect rect, int delay = 0); /** Take a screenshot for the given region. - @see Capture(wxRect rect, int delay) + @see Capture(wxBitmap*,wxRect,int) */ - static wxBitmap Capture(int x, int y, int width, int height, int delay = 0); + static bool Capture(wxBitmap* bitmap, int x, int y, int width, int height, int delay = 0); /** Save the screenshot as the name of @a fileName in the default directory. @a fileName should be without ".png". */ - static void Save(wxBitmap screenshot, wxString fileName); + static void Save(wxBitmap* screenshot, const wxString& fileName); /** Set the default directory where the screenshots will be generated. */ - static void SetDefaultDirectory(wxString dir) { default_dir = dir; } + static void SetDefaultDirectory(const wxString& dir) { default_dir = dir; } /** Get the default directory where the screenshots will be generated. @@ -344,7 +349,7 @@ private: /* Capture and auto adjust the control. Used by CaptureAll(). */ - wxBitmap Capture(Control & ctrl); + bool Capture(wxBitmap* bitmap, Control& ctrl); /* Get the correct rectangular region that the control occupies. Used by @@ -384,7 +389,7 @@ private: The gap is 20 pixels by default. Currently it isn't configurable. */ - static wxBitmap Union(wxBitmap pic1, wxBitmap pic2); + static bool Union(wxBitmap* top, wxBitmap* bottom, wxBitmap* result); /* Delay a few seconds without blocking GUI. diff --git a/utils/screenshotgen/src/bitmaps/wxwin32x32.png b/utils/screenshotgen/src/bitmaps/wxwin32x32.png index 20eda44161..42e4fd97f7 100644 Binary files a/utils/screenshotgen/src/bitmaps/wxwin32x32.png and b/utils/screenshotgen/src/bitmaps/wxwin32x32.png differ diff --git a/utils/screenshotgen/src/screenshot_main.cpp b/utils/screenshotgen/src/screenshot_main.cpp index 365518ade8..308ab3cdc5 100644 --- a/utils/screenshotgen/src/screenshot_main.cpp +++ b/utils/screenshotgen/src/screenshot_main.cpp @@ -82,9 +82,10 @@ void ScreenshotFrame::OnCaptureFullScreen(wxCommandEvent& WXUNUSED(event)) wxCoord screenWidth, screenHeight; dcScreen.GetSize(&screenWidth, &screenHeight); - wxBitmap fullscreen = AutoCaptureMechanism::Capture(0, 0, screenWidth, screenHeight); + wxBitmap fullscreen(0, 0); + AutoCaptureMechanism::Capture(&fullscreen, 0, 0, screenWidth, screenHeight); - AutoCaptureMechanism::Save(fullscreen, _T("fullscreen")); + AutoCaptureMechanism::Save(&fullscreen, _T("fullscreen")); wxMessageBox(_("A screenshot of the entire screen was saved as:\n\n ") + AutoCaptureMechanism::GetDefaultDirectoryAbsPath() + _T("fullscreen.png"),