155 lines
4.7 KiB
C
155 lines
4.7 KiB
C
|
/*
|
||
|
*********************************************************************
|
||
|
* File: ximawmf.h
|
||
|
* Purpose: Windows Metafile Class Loader and Writer
|
||
|
* Author: Volker Horch - vhorch@gmx.de
|
||
|
* created: 13-Jun-2002
|
||
|
*********************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
*********************************************************************
|
||
|
Notes by Author:
|
||
|
*********************************************************************
|
||
|
|
||
|
Limitations:
|
||
|
============
|
||
|
|
||
|
a) Transparency:
|
||
|
|
||
|
A Metafile is vector graphics, which has transparency by design.
|
||
|
This class always converts into a Bitmap format. Transparency is
|
||
|
supported, but there is no good way to find out, which parts
|
||
|
of the Metafile are transparent. There are two ways how we can
|
||
|
handle this:
|
||
|
|
||
|
- Clear the Background of the Bitmap with the background color
|
||
|
you like (i have used COLOR_WINDOW) and don't support transparency.
|
||
|
|
||
|
below #define XMF_SUPPORT_TRANSPARENCY 0
|
||
|
#define XMF_COLOR_BACK RGB(Background color you like)
|
||
|
|
||
|
- Clear the Background of the Bitmap with a very unusual color
|
||
|
(which one ?) and use this color as the transparent color
|
||
|
|
||
|
below #define XMF_SUPPORT_TRANSPARENCY 1
|
||
|
#define XMF_COLOR_TRANSPARENT_R ...
|
||
|
#define XMF_COLOR_TRANSPARENT_G ...
|
||
|
#define XMF_COLOR_TRANSPARENT_B ...
|
||
|
|
||
|
b) Resolution
|
||
|
|
||
|
Once we have converted the Metafile into a Bitmap and we zoom in
|
||
|
or out, the image may not look very good. If we still had the
|
||
|
original Metafile, zooming would produce good results always.
|
||
|
|
||
|
c) Size
|
||
|
|
||
|
Although the filesize of a Metafile may be very small, it might
|
||
|
produce a Bitmap with a bombastic size. Assume you have a Metafile
|
||
|
with an image size of 6000*4000, which contains just one Metafile
|
||
|
record ((e.g. a line from (0,0) to (6000, 4000)). The filesize
|
||
|
of this Metafile would be let's say 100kB. If we convert it to
|
||
|
a 6000*4000 Bitmap with 24 Bits/Pixes, the Bitmap would consume
|
||
|
about 68MB of memory.
|
||
|
|
||
|
I have choosen, to limit the size of the Bitmap to max.
|
||
|
screensize, to avoid memory problems.
|
||
|
|
||
|
If you want something else,
|
||
|
modify #define XMF_MAXSIZE_CX / XMF_MAXSIZE_CY below
|
||
|
|
||
|
*********************************************************************
|
||
|
*/
|
||
|
|
||
|
#ifndef _XIMAWMF_H
|
||
|
#define _XIMAWMF_H
|
||
|
|
||
|
#include "ximage.h"
|
||
|
|
||
|
#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS
|
||
|
|
||
|
class CxImageWMF: public CxImage
|
||
|
{
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
typedef struct tagRECT16
|
||
|
{
|
||
|
int16_t left;
|
||
|
int16_t top;
|
||
|
int16_t right;
|
||
|
int16_t bottom;
|
||
|
} RECT16;
|
||
|
|
||
|
// taken from Windos 3.11 SDK Documentation (Programmer's Reference Volume 4: Resources)
|
||
|
typedef struct tagMETAFILEHEADER
|
||
|
{
|
||
|
uint32_t key; // always 0x9ac6cdd7
|
||
|
uint16_t reserved1; // reserved = 0
|
||
|
RECT16 bbox; // bounding rectangle in metafile units as defined in "inch"
|
||
|
uint16_t inch; // number of metafile units per inch (should be < 1440)
|
||
|
uint32_t reserved2; // reserved = 0
|
||
|
uint16_t checksum; // sum of the first 10 WORDS (using XOR operator)
|
||
|
} METAFILEHEADER;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
public:
|
||
|
CxImageWMF(): CxImage(CXIMAGE_FORMAT_WMF) { }
|
||
|
|
||
|
bool Decode(CxFile * hFile, int32_t nForceWidth=0, int32_t nForceHeight=0);
|
||
|
bool Decode(FILE *hFile, int32_t nForceWidth=0, int32_t nForceHeight=0)
|
||
|
{ CxIOFile file(hFile); return Decode(&file,nForceWidth,nForceHeight); }
|
||
|
|
||
|
#if CXIMAGE_SUPPORT_ENCODE
|
||
|
bool Encode(CxFile * hFile);
|
||
|
bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
|
||
|
#endif // CXIMAGE_SUPPORT_ENCODE
|
||
|
|
||
|
protected:
|
||
|
void ShrinkMetafile(int32_t &cx, int32_t &cy);
|
||
|
BOOL CheckMetafileHeader(METAFILEHEADER *pmetafileheader);
|
||
|
HENHMETAFILE ConvertWmfFiletoEmf(CxFile *pFile, METAFILEHEADER *pmetafileheader);
|
||
|
HENHMETAFILE ConvertEmfFiletoEmf(CxFile *pFile, ENHMETAHEADER *pemfh);
|
||
|
|
||
|
};
|
||
|
|
||
|
#define METAFILEKEY 0x9ac6cdd7L
|
||
|
|
||
|
// Background color definition (if no transparency). see Notes above
|
||
|
#define XMF_COLOR_BACK GetSysColor(COLOR_WINDOW)
|
||
|
// alternatives
|
||
|
//#define XMF_COLOR_BACK RGB(192, 192, 192) // lite gray
|
||
|
//#define XMF_COLOR_BACK RGB( 0, 0, 0) // black
|
||
|
//#define XMF_COLOR_BACK RGB(255, 255, 255) // white
|
||
|
|
||
|
|
||
|
// transparency support. see Notes above
|
||
|
#define XMF_SUPPORT_TRANSPARENCY 0
|
||
|
#define XMF_COLOR_TRANSPARENT_R 211
|
||
|
#define XMF_COLOR_TRANSPARENT_G 121
|
||
|
#define XMF_COLOR_TRANSPARENT_B 112
|
||
|
// don't change
|
||
|
#define XMF_COLOR_TRANSPARENT RGB (XMF_COLOR_TRANSPARENT_R, \
|
||
|
XMF_COLOR_TRANSPARENT_G, \
|
||
|
XMF_COLOR_TRANSPARENT_B)
|
||
|
// don't change
|
||
|
#define XMF_RGBQUAD_TRANSPARENT XMF_COLOR_TRANSPARENT_B, \
|
||
|
XMF_COLOR_TRANSPARENT_G, \
|
||
|
XMF_COLOR_TRANSPARENT_R, \
|
||
|
0
|
||
|
// max. size. see Notes above
|
||
|
// alternatives
|
||
|
//#define XMF_MAXSIZE_CX (GetSystemMetrics(SM_CXSCREEN)-10)
|
||
|
//#define XMF_MAXSIZE_CY (GetSystemMetrics(SM_CYSCREEN)-50)
|
||
|
//#define XMF_MAXSIZE_CX (2*GetSystemMetrics(SM_CXSCREEN)/3)
|
||
|
//#define XMF_MAXSIZE_CY (2*GetSystemMetrics(SM_CYSCREEN)/3)
|
||
|
#define XMF_MAXSIZE_CX 4000
|
||
|
#define XMF_MAXSIZE_CY 4000
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|