core/indigo-core/common/utils/emf_utils.h (122 lines of code) (raw):

#include <cstdint> #include "../common/math/algebra.h" namespace indigo { // Constants for EMF record types constexpr uint32_t EMR_HEADER = 1; constexpr uint32_t EMR_STRETCHDIBITS = 81; constexpr uint32_t EMR_SETDIBITSTODEVICE = 80; constexpr uint32_t EMR_EOF = 14; struct BITMAPINFOHEADER { uint32_t biSize; int32_t biWidth; int32_t biHeight; uint16_t biPlanes; uint16_t biBitCount; uint32_t biCompression; uint32_t biSizeImage; int32_t biXPelsPerMeter; int32_t biYPelsPerMeter; uint32_t biClrUsed; uint32_t biClrImportant; }; // Bitmap structure struct Bitmap { std::string dibits; int x; int y; int width; int height; int bitmap_width; int bitmap_height; }; // EMF Record structure struct EMFRecord { uint32_t iType; //!< Type of EMR record uint32_t nSize; //!< Size of entire record in bytes (multiple of 4). }; struct EMREOF { EMFRecord emr; uint32_t nPalEntries; uint32_t offPalEntries; uint32_t nSizeLast; }; // EMR_SETDIBITSTODEVICE record structure struct EMRSetDIBitsToDevice { EMFRecord header; int32_t boundsLeft; int32_t boundsTop; int32_t boundsRight; int32_t boundsBottom; int32_t xDest; int32_t yDest; int32_t xSrc; int32_t ySrc; int32_t cxSrc; int32_t cySrc; uint32_t offBmiSrc; uint32_t cbBmiSrc; uint32_t offBits; uint32_t cbBits; uint32_t iUsageSrc; uint32_t iStartScan; uint32_t cScans; }; // EMR_STRETCHDIBITS record structure struct EMRStretchDIBits { EMFRecord emr; int32_t boundsLeft; int32_t boundsTop; int32_t boundsRight; int32_t boundsBottom; int32_t xDest; int32_t yDest; int32_t xSrc; int32_t ySrc; uint32_t cxSrc; uint32_t cySrc; uint32_t offBmiSrc; uint32_t cbBmiSrc; uint32_t offBits; uint32_t cbBits; uint32_t iUsageSrc; uint32_t dwRop; uint32_t cxDest; uint32_t cyDest; }; struct EMFHeader { EMFRecord emr; int32_t boundsLeft; int32_t boundsTop; int32_t boundsRight; int32_t boundsBottom; int32_t frameLeft; int32_t frameTop; int32_t frameRight; int32_t frameBottom; uint32_t dSignature; uint32_t nVersion; uint32_t nBytes; uint32_t nRecords; uint16_t nHandles; uint16_t sReserved; uint32_t nDescription; uint32_t offDescription; uint32_t nPalEntries; int32_t deviceCx; int32_t deviceCy; int32_t millimetersCx; int32_t millimetersCy; uint32_t cbPixelFormat; uint32_t offPixelFormat; uint32_t bOpenGL; int32_t micrometersCx; int32_t micrometersCy; }; std::string dibToPNG(const std::string& dib_data); std::vector<Bitmap> ripBitmapsFromEMF(const std::string& emf); std::string decodePNG(const std::string& inputPNGData); std::string createEMFFromBitmap(const std::string& bmpData); } // namespace indigo