diff --git a/avidemux/cli/ADM_userInterfaces/ADM_gui2/gui_none.cpp b/avidemux/cli/ADM_userInterfaces/ADM_gui2/gui_none.cpp index 715dbf0f0..19b715086 100644 --- a/avidemux/cli/ADM_userInterfaces/ADM_gui2/gui_none.cpp +++ b/avidemux/cli/ADM_userInterfaces/ADM_gui2/gui_none.cpp @@ -218,4 +218,7 @@ void UI_notifyPlaybackLag(uint32_t lag, int updateTimeMs) void UI_tweaks(const char * op, char * paramS, int paramN) {} + +void UI_CopyImageToClipboard(void * image) +{} // EOF diff --git a/avidemux/common/ADM_commonUI/GUI_ui.h b/avidemux/common/ADM_commonUI/GUI_ui.h index 8a30ea90f..6805ed022 100644 --- a/avidemux/common/ADM_commonUI/GUI_ui.h +++ b/avidemux/common/ADM_commonUI/GUI_ui.h @@ -71,4 +71,6 @@ bool UI_askAvisynthPort(uint32_t &port); bool UI_reset(void); void UI_tweaks(const char * op, const char * paramS, int paramN); + +void UI_CopyImageToClipboard(void * image); // EOF diff --git a/avidemux/common/ADM_commonUI/myOwnMenu.h b/avidemux/common/ADM_commonUI/myOwnMenu.h index acfdba9e6..dcd491124 100644 --- a/avidemux/common/ADM_commonUI/myOwnMenu.h +++ b/avidemux/common/ADM_commonUI/myOwnMenu.h @@ -42,6 +42,7 @@ static const MenuEntry _myMenuFile[] = { {MENU_SUBACTION,QT_TRANSLATE_NOOP("adm","Save as PNG"), NULL,ACT_SAVE_PNG, NULL,"Ctrl+P",0}, {MENU_SUBACTION,QT_TRANSLATE_NOOP("adm","Save as JPEG"), NULL,ACT_SAVE_JPG, NULL,"Ctrl+E",0}, {MENU_SUBACTION,QT_TRANSLATE_NOOP("adm","Save Selection as JPEG"),NULL,ACT_SAVE_BUNCH_OF_JPG,NULL,NULL,0}, + {MENU_SUBACTION,QT_TRANSLATE_NOOP("adm","Copy to clipboard"),NULL,ACT_SAVE_IMAGE_TO_CLIPBOARD, NULL,"Ctrl+Shift+C",0}, {MENU_ACTION,QT_TRANSLATE_NOOP("adm","Close"), NULL,ACT_CLOSE, NULL,"Ctrl+W",0}, {MENU_SEPARATOR,"-",NULL,ACT_DUMMY,NULL,NULL,1}, {MENU_ACTION,QT_TRANSLATE_NOOP("adm","Information"), NULL,ACT_VIDEO_PROPERTIES, MKICON(info),"Alt+Return",0}, diff --git a/avidemux/common/A_functions.h b/avidemux/common/A_functions.h index 1a7450414..0e971368e 100644 --- a/avidemux/common/A_functions.h +++ b/avidemux/common/A_functions.h @@ -45,6 +45,7 @@ bool A_saveJpg (const char *name); int A_saveBunchJpg(const char *name); bool A_saveImg (const char *name); bool A_savePng(const char *name); +void A_saveImageToClipboard(void); int ADM_saveRaw (const char *name); int A_audioSave(const char *name); int A_SaveWrapper(const char *name); diff --git a/avidemux/common/gui_action.names b/avidemux/common/gui_action.names index 326b1867e..f41509a47 100644 --- a/avidemux/common/gui_action.names +++ b/avidemux/common/gui_action.names @@ -21,6 +21,7 @@ ACT(SAVE_BMP) ACT(SAVE_PNG) ACT(SAVE_JPG) ACT(SAVE_BUNCH_OF_JPG) +ACT(SAVE_IMAGE_TO_CLIPBOARD) ACT(SAVE_VIDEO) ACT(SAVE_AUDIO) ACT(SAVE_QUEUE) diff --git a/avidemux/common/gui_save.cpp b/avidemux/common/gui_save.cpp index 01a303221..bf2b1d0af 100644 --- a/avidemux/common/gui_save.cpp +++ b/avidemux/common/gui_save.cpp @@ -188,6 +188,11 @@ void HandleAction_Save(Action action) GUI_FileSelWriteExtension (QT_TRANSLATE_NOOP("adm","Select PNG to Save"),defaultExtension,(SELFILE_CB *)A_savePng); } break; + case ACT_SAVE_IMAGE_TO_CLIPBOARD: + { + A_saveImageToClipboard(); + } + break; //----------------------test----------------------- case ACT_SAVE_VIDEO: { @@ -648,6 +653,32 @@ bool A_saveImg (const char *name) return result; } + +/** + \fn A_saveImageToClipboard + \brief Save current displayed image to clibboard +*/ +void A_saveImageToClipboard(void) +{ + bool fromDisplayBuffer=false; + if(ADM_PREVIEW_NONE == admPreview::getPreviewMode()) + fromDisplayBuffer=true; + ADMImage *image; + image=NULL; + if(fromDisplayBuffer) + image=admPreview::getBuffer(); + else + image=getCurrentFilteredImage(); + if(image) + { + UI_CopyImageToClipboard((void*)image); + } + if(!fromDisplayBuffer) + { + delete image; + image=NULL; + } +} /** \fn A_SaveWrapper diff --git a/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp b/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp index e8e406284..ef2aa2f00 100644 --- a/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp +++ b/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp @@ -1148,6 +1148,7 @@ void MainWindow::buildActionLists(void) PUSH_LOADED(File, ACT_SAVE_PNG) PUSH_LOADED(File, ACT_SAVE_JPG) PUSH_LOADED(File, ACT_SAVE_BUNCH_OF_JPG) + PUSH_LOADED(File, ACT_SAVE_IMAGE_TO_CLIPBOARD) for(uint32_t engineIdx = 0; engineIdx < _scriptEngines.size(); engineIdx++) PUSH_LOADED(File, (Action)(ACT_SCRIPT_ENGINE_FIRST + (engineIdx * 3) + 2)) @@ -3792,6 +3793,31 @@ void UI_tweaks(const char * op, const char * paramS, int paramN) QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } +/** + * \fn UI_CopyImageToClipboard + */ +void UI_CopyImageToClipboard(void * image) +{ + if (!image) return; + ADMImage * img = (ADMImage *)image; + QClipboard *clipboard = QApplication::clipboard(); + if (clipboard) + { + int w,h; + w = img->_width; + h = img->_height; + uint32_t size = ADM_IMAGE_ALIGN(w*4) * h; + uint8_t * rgbBuffer=new uint8_t[size]; + ADMColorScalerFull scaler(ADM_CS_BICUBIC,w,h,w,h,img->_pixfrmt,ADM_PIXFRMT_BGR32A); + scaler.convertImage(img,rgbBuffer); + QImage rgbImage = QImage(rgbBuffer,w,h,ADM_IMAGE_ALIGN(w*4),QImage::Format_RGB32).copy(0,0,w,h); + + clipboard->setImage(rgbImage); + + rgbImage = QImage(); // detach rgbBuffer + delete [] rgbBuffer; + } +} /** * \fn dtor