ImageInfoPtr ImageInfo::CopyToImageInfo( const wxRect& rect ) { ImageInfoPtr result; wxRect checkRect = rect; checkRect.Intersect( wxRect(0, 0, mIndexMask->GetWidth(), mIndexMask->GetHeight()) ); if ( !(checkRect.GetWidth() >= 0 && checkRect.GetHeight() >= 0) ) { return result; } int w = checkRect.GetWidth(); int h = checkRect.GetHeight(); size_t size = mPalette->GetCorrectImageSize(w, h, true); wxByte* buf = (wxByte*) malloc( size ); int bytesOnPixel = size / (w * h); switch (bytesOnPixel) { case 1: Helpers::CropSubBuffer( buf, w, h, mIndexMask->GetMask(), mIndexMask->GetWidth(), rect.x, rect.y); break; case 2: Helpers::CropSubBuffer<short>((short*) buf, w, h, (const short*) mIndexMask->GetMask(), mIndexMask->GetWidth(), rect.x, rect.y); break; case 3: Helpers::CropSubBuffer<Pixel>((Pixel*)(buf), w, h, (const Pixel*) mIndexMask->GetMask(), mIndexMask->GetWidth(), rect.x, rect.y); break; case 4: Helpers::CropSubBuffer<PixelA>((PixelA*) buf, w, h, (const PixelA*) mIndexMask->GetMask(), mIndexMask->GetWidth(), rect.x, rect.y); break; default: wxLogError( wxString::Format("ImageInfo::CopyToImageInfo: Bytes on pixel = %d", bytesOnPixel)); } IndexMaskPtr mask = std::make_shared<IndexMask>(); mask->SetMask( buf, size, w, h ); free(buf); result = std::make_shared<ImageInfo>(mask, mPalette); if (!result->IsOk()) { result = nullptr; } return result; }
bool ImageInfo::CopyToClipBoard( const wxRect& rect ) { ImageInfoPtr newBuffered = CopyToImageInfo( rect ); bool res = newBuffered->IsOk(); if (res) { sBuffered = newBuffered; wxBitmap* bmp = sBuffered->GetBitmap(); Helpers::CopyToClipboard(bmp->ConvertToImage()); delete bmp; } return res; }