gecko-dev/widget/windows/WindowsEMF.h
cku 4ba0283028 Bug 1401069 - Part 4. Change argument type from 'const RECT *' to reference type in WindowsEMF::Playback. r=fatseng
MozReview-Commit-ID: 4StsIm9sqeC

--HG--
extra : rebase_source : b1602542ed4478304352457ea5bfa220aae1dac7
2017-09-18 23:25:34 +08:00

88 lines
2.8 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MOZILLA_WIDGET_WINDOWSEMF_H
#define MOZILLA_WIDGET_WINDOWSEMF_H
/* include windows.h for the HDC definitions that we need. */
#include <windows.h>
namespace mozilla {
namespace widget {
/**
* Windows Enhance Metafile: https://en.wikipedia.org/wiki/Windows_Metafile
* A metafile, also called a vector image, is an image that is stored as a
* sequence of drawing commands and settings. The commands and settings
* recorded in a Metafile object can be stored in memory or saved to a file.
*
* The metafile device context is used for all drawing operations required to
* create the picture. When the system processes a GDI function associated with
* a metafile DC, it converts the function into the appropriate data and stores
* this data in a record appended to the metafile.
*/
class WindowsEMF
{
public:
WindowsEMF();
~WindowsEMF();
/**
* Initializes the object with the path of a file where the EMF data stream
* should be stored. Callers are then expected to call GetDC() to draw output
* before going on to call Playback() or SaveToFile() to generate the EMF
* output.
*/
bool InitForDrawing(const wchar_t* aMetafilePath = nullptr);
/**
* Initializes the object with an existing EMF file. Consumers cannot use
* GetDC() to obtain an HDC to modify the file. They can only use Playback().
*/
bool InitFromFileContents(const wchar_t* aMetafilePath);
/**
* If this object was initiaziled using InitForDrawing() then this function
* returns an HDC that can be drawn to generate the EMF output. Otherwise it
* returns null. After finishing with the HDC, consumers could call Playback()
* to draw EMF onto the given DC or call SaveToFile() to finish writing the
* EMF file.
*/
HDC GetDC() const
{
MOZ_ASSERT(mDC, "GetDC can be used only after "
"InitForDrawing/ InitFromFileContents and before"
"Playback/ SaveToFile");
return mDC;
}
/**
* Play the EMF's drawing commands onto the given DC.
*/
bool Playback(HDC aDeviceContext, const RECT& aRect);
/**
* Called to generate the EMF file once a consumer has finished drawing to
* the HDC returned by GetDC(), if initializes the object with the path of a
* file.
*/
bool SaveToFile();
private:
WindowsEMF(const WindowsEMF& aEMF) = delete;
bool FinishDocument();
void ReleaseEMFHandle();
void ReleaseAllResource();
/* Compiled EMF data handle. */
HENHMETAFILE mEmf;
HDC mDC;
};
} // namespace widget
} // namespace mozilla
#endif /* MOZILLA_WIDGET_WINDOWSEMF_H */