Change-Id: Id70b30aa0b9c204a8f74a7977a03822691d4cb45 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164321 Tested-by: Jenkins Reviewed-by: Taichi Haradaguchi <20001722@ymail.ne.jp>
6.9 KiB
GDIMetaFile class
The GDIMetaFile
class reads, writes, manipulates and replays metafiles via the
VCL
module.
A typical use case is to initialize a new GDIMetaFile
, open the actual stored
metafile and read it in via GDIMetaFile::Read( aIStream )
. This reads in the
metafile into the GDIMetafile
object - it can read in an old-style VCLMTF
metafile (back in the days that Microsoft didn't document the metafile format
this was used), as well as EMF+ files - and adds them to a list (vector) of
MetaActions
. You can also populate your own GDIMetaFile
via AddAction()
,
RemoveAction()
, ReplaceAction()
, etc.
Once the GDIMetafile
object is read to be used, you can "play" the metafile,
"pause" it, "wind forward" or "rewind" the metafile. The metafile can be moved,
scaled, rotated and clipped, as well have the colours adjusted or replaced, or
even made monochrome.
The GDIMetafile can be used to get an OutputDevice
's metafile via the
Linker()
and Record()
functions.
Using GDIMetafile
First, create a new GDIMetafile
, this can be done via the default constructor.
It can then be constructed manually, or you can use Record()
on an
OutputDevice
to populate the GDIMetaFile
, or of course you can read it from
file with Read()
. From here you can then elect to manipulate the metafile, or
play it back to another GDIMetafile
or to an OutputDevice
via Play()
. To
store the file, use Write()
.
CONSTRUCTORS AND DESTRUCTORS
GDIMetaFile
GDIMetaFile( const GDIMetaFile& rMtf )
- copy constructor~GDIMetaFile
OPERATORS
operator =
operator ==
operator !=
RECORDING AND PLAYBACK FUNCTIONS
Play(GDIMetaFile&, size_t)
- play back metafile into another metafile up to positionPlay(OutputDevice*, size_t)
- play back metafile intoOutputDevice
up to positionPlay(OutputDevice*, Point, Size, size_t)
- play back metafile intoOutputDevice
at a particular location on theOutputDevice
, up to the position in the metafilePause
- pauses or continues the playbackIsPause
Stop
- stop playback fullyWindStart
- windback to start of the metafilewindPrev
- windback one recordGetActionSize
- get the number of records in the metafile
METAFILE RECORD FUNCTIONS
FirstAction
- get the first metafile recordNextAction
- get the next metafile record from the current positionGetAction(size_t)
- get the metafile record at location in fileGetCurAction
- get the current metafile recordAddAction(MetaAction*)
- appends a metafile recordAddAction(MetaAction*, size_t)
- adds a metafile record to a particular location in the fileRemoveAction
- removes record at file locationClear
- first stops if recording, then removes all metafile recordspush_back
- pushes back, basically a thin wrapper to the metafile record list
READ AND WRITING
Read
Write
GetChecksum
GetSizeBytes
DISPLACEMENT FUNCTIONS
Move( long nX, long nX)
Move( long nX, long nX, long nDPIX, long nDPIY )
- Move method getting specifics how to handle MapMode( MapUnit::MapPixel )
TRANSFORMATION FUNCTIONS
Scale( double fScaleX, double fScaleY )
Scale( const Fraction& rScaleX, const Fraction& rScaleY )
Mirror
Rotate( long nAngle10 )
Clip( const Rectangle& )
COLOR ADJUSTMENT FUNCTIONS
Adjust
- change luminance, contrast, gamma and RGB via a percentageConvert
- colour conversionReplaceColors
GetMonochromeMtf
Related classes
MetaAction
: a base class used by all records. It implements a command-like
pattern, and also acts as a prototype for other actions.
CONSTRUCTORS AND DESTRUCTORS
MetaAction()
- default constructor, sets mnRefCount to 1 and mnType, in this case MetaActionType::NONEMetaAction(sal_uInt16 nType)
- virtual constructor, sets mnType to nType, and mnRefCount to 1~MetaAction
COMMAND FUNCTION
Execute(OutputDevice*)
- execute the functionality of the record to the OutputDevice. Part of command pattern.
FACTORY FUNCTION
Clone()
- prototype clone function
MANIPULATION FUNCTIONS
Move(long nHorzMove, long nVerMove)
Scale(double fScaleX, double fScaleY)
READ AND WRITE FUNCTIONS
Read
Write
ReadMetaAction
- a static function, only used to determine which MetaAction to call on to read the record, which means that this is the function that must be used.
INTROSPECTIVE FUNCTIONS
GetType
A note about MetaCommentAction
So this class is the most interesting - a comment record is what is used to
extended metafiles, to make what we call an "Enhanced Metafile". This basically
gets the OutputDevice
's connect metafile and adds the record via this when it
runs Execute()
. It doesn't actually do anything else, unlike other
MetaAction
s which invoke functions from OutputDevice
. And if there is no
connect metafile in OutputDevice
, then it just does nothing at all in Execute.
Everything else works as normal (Read, Write, etc).
Basic pseudocode
The following illustrates an exceptionally basic and incomplete implementation
of how to use GDIMetafile
. An example can be found at
vcl/workben/mtfdemo.cxx
DemoWin::Paint()
{
// assume that VCL has been initialized and a new application created
Window* pWin = new WorkWindow();
GDIMetaFile* pMtf = new GDIMetaFile();
SvFileStream aFileStream("example.emf", STEAM_READ);
ReadWindowMetafile(aFileStream, pMtf);
pMtf->Play(pWin);
}