VirtualBox

Ignore:
Timestamp:
Apr 27, 2012 12:14:34 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77668
Message:

GA: Bitmap clipboard support (darwin). Thanks to François Revol (mmu_man).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-helper.cpp

    r33540 r41083  
    1616 */
    1717
     18#include <iprt/alloc.h>
    1819#include <iprt/assert.h>
    1920#include <VBox/log.h>
     
    264265}
    265266
     267int 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
     310int 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.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette