Changeset 41083 in vbox for trunk/src/VBox/GuestHost/SharedClipboard/clipboard-helper.cpp
- Timestamp:
- Apr 27, 2012 12:14:34 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77668
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-helper.cpp
r33540 r41083 16 16 */ 17 17 18 #include <iprt/alloc.h> 18 19 #include <iprt/assert.h> 19 20 #include <VBox/log.h> … … 264 265 } 265 266 267 int vboxClipboardDibToBmp(const void *pSrc, size_t cbSrc, void **ppDest, size_t *pcbDest) 268 { 269 size_t cb = sizeof(BMFILEHEADER) + cbSrc; 270 PBMFILEHEADER pFileHeader; 271 void *dest; 272 size_t pixelOffset; 273 274 PBMINFOHEADER pBitmapInfoHeader = (PBMINFOHEADER)pSrc; 275 if (cbSrc < sizeof(BMINFOHEADER) || 276 RT_LE2H_U32(pBitmapInfoHeader->u32Size) < sizeof(BMINFOHEADER) || 277 /** @todo Support all the many versions of the DIB headers. */ 278 RT_LE2H_U32(pBitmapInfoHeader->u32Size) != sizeof(BMINFOHEADER)) 279 { 280 Log (("vboxClipboardDibToBmp: invalid or unsupported bitmap data.\n")); 281 return VERR_INVALID_PARAMETER; 282 } 283 pixelOffset = sizeof(BMFILEHEADER) 284 + RT_LE2H_U32(pBitmapInfoHeader->u32Size) 285 + RT_LE2H_U32(pBitmapInfoHeader->u32ClrUsed) * sizeof(uint32_t); 286 if (cbSrc < pixelOffset) 287 { 288 Log (("vboxClipboardDibToBmp: invalid bitmap data.\n")); 289 return VERR_INVALID_PARAMETER; 290 } 291 292 dest = RTMemAlloc(cb); 293 if (dest == NULL) 294 { 295 Log (("writeToPasteboard: cannot allocate memory for bitmap.\n")); 296 return VERR_NO_MEMORY; 297 } 298 299 pFileHeader = (PBMFILEHEADER)dest; 300 pFileHeader->u16Type = BITMAPHEADERMAGIC; 301 pFileHeader->u32Size = RT_H2LE_U32(cb); 302 pFileHeader->u16Reserved1 = pFileHeader->u16Reserved2 = 0; 303 pFileHeader->u32OffBits = RT_H2LE_U32(pixelOffset); 304 memcpy((uint8_t *)dest + sizeof(BMFILEHEADER), pSrc, cbSrc); 305 *ppDest = dest; 306 *pcbDest = cb; 307 return VINF_SUCCESS; 308 } 309 310 int vboxClipboardBmpGetDib(const void *pSrc, size_t cbSrc, const void **pDest, size_t *pcbDest) 311 { 312 PBMFILEHEADER pFileHeader = (PBMFILEHEADER)pSrc; 313 314 if (pFileHeader == NULL || cbSrc < sizeof(BMFILEHEADER) || 315 pFileHeader->u16Type != BITMAPHEADERMAGIC || 316 RT_LE2H_U32(pFileHeader->u32Size) != cbSrc) 317 { 318 Log (("vboxClipboardBmpGetDib: invalid bitmap data.\n")); 319 return VERR_INVALID_PARAMETER; 320 } 321 *pDest = ((uint8_t *)pSrc) + sizeof(BMFILEHEADER); 322 *pcbDest = cbSrc - sizeof(BMFILEHEADER); 323 return VINF_SUCCESS; 324 } 325
Note:
See TracChangeset
for help on using the changeset viewer.