22#include <wx/clipbrd.h>
23#include <wx/dataobj.h>
26#include <wx/mstream.h>
28#include <wx/sstream.h>
36 if( wxTheClipboard->Open() )
39 bool saved = wxTheClipboard->SetData(
40 new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ) );
43 wxTheClipboard->Flush();
45 wxTheClipboard->Close();
53bool SaveClipboard(
const std::string& aTextUTF8,
const std::vector<CLIPBOARD_MIME_DATA>& aMimeData )
55 if( aMimeData.empty() )
60 if( wxTheClipboard->Open() )
62 wxDataObjectComposite* data =
new wxDataObjectComposite();
63 data->Add(
new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ),
true );
68 if( entry.m_data.GetDataLen() == 0 && !entry.m_image.has_value() )
75 if( entry.m_image.has_value() && entry.m_image->IsOk() )
77 data->Add(
new wxBitmapDataObject( *entry.m_image ) );
85 wxDataFormat format( entry.m_mimeType );
86 wxCustomDataObject* custom =
new wxCustomDataObject( format );
89 custom->Alloc( entry.m_data.GetDataLen() );
90 custom->SetData( entry.m_data.GetDataLen(), entry.m_data.GetData() );
94 bool saved = wxTheClipboard->SetData( data );
97 wxTheClipboard->Flush();
99 wxTheClipboard->Close();
116 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
117 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
121 if( wxTheClipboard->IsSupported( wxDataFormat( wxS(
"application/kicad" ) ) ) )
123 wxCustomDataObject data( wxDataFormat( wxS(
"application/kicad" ) ) );
125 if( wxTheClipboard->GetData( data ) )
127 result.assign(
static_cast<const char*
>( data.GetData() ), data.GetSize() );
129 if( !wasAlreadyOpen )
130 wxTheClipboard->Close();
136 if( wxTheClipboard->IsSupported( wxDF_TEXT )
137 || wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) )
139 wxTextDataObject data;
140 wxTheClipboard->GetData( data );
144 result = data.GetText().utf8_str();
147 if( !wasAlreadyOpen )
148 wxTheClipboard->Close();
157 std::unique_ptr<wxBitmap> bitmap;
161 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
162 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
166 if( wxTheClipboard->IsSupported( wxDF_BITMAP ) )
168 wxBitmapDataObject data;
170 if( wxTheClipboard->GetData( data ) )
172 bitmap = std::make_unique<wxBitmap>( data.GetBitmap() );
177 else if( wxDataFormat pngFormat( wxS(
"public.png" ) ); wxTheClipboard->IsSupported( pngFormat ) )
179 wxCustomDataObject pngData( pngFormat );
181 if( wxTheClipboard->GetData( pngData ) && pngData.GetSize() > 0 )
183 wxMemoryInputStream stream( pngData.GetData(), pngData.GetSize() );
184 wxImage img( stream, wxBITMAP_TYPE_PNG );
187 bitmap = std::make_unique<wxBitmap>( img );
191 else if( wxTheClipboard->IsSupported( wxDF_FILENAME ) )
193 wxFileDataObject data;
195 if( wxTheClipboard->GetData( data ) && data.GetFilenames().size() == 1 )
197 wxImage img( data.GetFilenames()[0] );
198 bitmap = std::make_unique<wxBitmap>( img );
200 if( !bitmap->IsOk() )
205 if( !wasAlreadyOpen )
206 wxTheClipboard->Close();
217 if( wxTheClipboard->Open() )
219 wxDataObjectComposite* data =
new wxDataObjectComposite();
223 wxStringOutputStream os;
227 data->Add(
new wxTextDataObject( os.GetString() ),
true );
236 bool saved = wxTheClipboard->SetData( data );
239 wxTheClipboard->Flush();
241 wxTheClipboard->Close();
257 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
258 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
262 if( wxTheClipboard->IsSupported( wxDF_TEXT ) || wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) )
264 wxTextDataObject data;
266 if( wxTheClipboard->GetData( data ) )
272 if( !wasAlreadyOpen )
273 wxTheClipboard->Close();
285 wxImage imageCopy( aImage );
288 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL, 1 );
289 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY, 3 );
290 imageCopy.SetOption( wxIMAGE_OPTION_PNG_FILTER, 0x08 );
292 wxMemoryOutputStream memStream;
293 wxBufferedOutputStream bufferedStream( memStream );
295 if( !imageCopy.SaveFile( bufferedStream, wxBITMAP_TYPE_PNG ) )
298 bufferedStream.Close();
300 auto stBuf = memStream.GetOutputStreamBuffer();
301 aOutput.SetDataLen( 0 );
302 aOutput.AppendData( stBuf->GetBufferStart(), stBuf->GetIntPosition() );
308#if defined( __WXMSW__ )
310static wxImage FlattenAlphaOnWhite(
const wxImage& aImage )
312 wxImage flat = aImage.Copy();
314 if( !flat.HasAlpha() )
317 unsigned char* rgb = flat.GetData();
318 const unsigned char* alpha = flat.GetAlpha();
319 const size_t count =
static_cast<size_t>( flat.GetWidth() ) * flat.GetHeight();
321 for(
size_t i = 0; i < count; ++i )
323 const int a = alpha[i];
325 for(
int c = 0; c < 3; ++c )
326 rgb[i * 3 + c] =
static_cast<unsigned char>( ( rgb[i * 3 + c] * a + 255 * ( 255 - a ) + 127 ) / 255 );
336 const wxImage* aFallbackImage )
338 wxCHECK( wxTheClipboard->IsOpened(),
false );
339 wxCHECK( aPngData.GetDataLen() > 0,
false );
341#if defined( __WXMSW__ )
343 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDataFormat(
"PNG" ) );
344 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
345 aData->Add( pngObj );
348 if( aFallbackImage && aFallbackImage->IsOk() )
349 aData->Add(
new wxBitmapDataObject( wxBitmap( FlattenAlphaOnWhite( *aFallbackImage ) ) ) );
350#elif defined( __WXGTK__ )
351 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDF_BITMAP );
352 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
353 aData->Add( pngObj );
355 wxCHECK( aFallbackImage && aFallbackImage->IsOk(),
false );
356 aData->Add(
new wxBitmapDataObject( wxBitmap( *aFallbackImage ) ) );
365 wxCHECK( wxTheClipboard->IsOpened(),
false );
366 wxCHECK( aImage.IsOk(),
false );
368#if defined( __WXGTK__ ) || defined( __WXMSW__ )
369 wxMemoryBuffer pngData;
376 aData->Add(
new wxBitmapDataObject( wxBitmap( aImage ) ) );
void WriteLines(const std::vector< std::vector< wxString > > &aRows)
Write a vector of rows to the stream.
std::unique_ptr< wxBitmap > GetImageFromClipboard()
Get image data from the clipboard, if there is any.
bool EncodeImageToPng(const wxImage &aImage, wxMemoryBuffer &aOutput)
Encode an image to PNG format with fast compression settings optimized for clipboard use.
bool AddTransparentImageToClipboardData(wxDataObjectComposite *aData, wxImage aImage)
Adds an image to clipboard data in a platform-specific way such that transparency is supported.
bool SaveTabularDataToClipboard(const std::vector< std::vector< wxString > > &aData)
Store tabular data to the system clipboard.
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
bool AddPngToClipboardData(wxDataObjectComposite *aData, const wxMemoryBuffer &aPngData, const wxImage *aFallbackImage)
Adds pre-encoded PNG data to clipboard in a platform-specific way.
bool GetTabularDataFromClipboard(std::vector< std::vector< wxString > > &aData)
Attempt to get tabular data from the clipboard.
bool AutoDecodeCSV(const wxString &aInput, std::vector< std::vector< wxString > > &aData)
Try to guess the format of a T/CSV file and decode it into aData.
wxString result
Test unit parsing edge cases and error handling.