diff options
Diffstat (limited to 'gfx/src/nsDeviceContext.h')
-rw-r--r-- | gfx/src/nsDeviceContext.h | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/gfx/src/nsDeviceContext.h b/gfx/src/nsDeviceContext.h new file mode 100644 index 0000000000..5238c1f71d --- /dev/null +++ b/gfx/src/nsDeviceContext.h @@ -0,0 +1,311 @@ +/* -*- Mode: C++; tab-width: 8; 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 _NS_DEVICECONTEXT_H_ +#define _NS_DEVICECONTEXT_H_ + +#include <stdint.h> // for uint32_t +#include <sys/types.h> // for int32_t +#include "gfxTypes.h" // for gfxFloat +#include "gfxFont.h" // for gfxFont::Orientation +#include "mozilla/Assertions.h" // for MOZ_ASSERT_HELPER2 +#include "mozilla/RefPtr.h" // for RefPtr +#include "nsCOMPtr.h" // for nsCOMPtr +#include "nsCoord.h" // for nscoord +#include "nsError.h" // for nsresult +#include "nsISupports.h" // for NS_INLINE_DECL_REFCOUNTING +#include "nsMathUtils.h" // for NS_round +#include "nscore.h" // for char16_t, nsAString +#include "mozilla/AppUnits.h" // for AppUnits +#include "nsFontMetrics.h" // for nsFontMetrics::Params +#include "mozilla/gfx/Point.h" // for IntSize +#include "mozilla/gfx/PrintTarget.h" // for PrintTarget::PageDoneCallback +#include "mozilla/gfx/PrintPromise.h" + +class gfxContext; +class gfxTextPerfMetrics; +class gfxUserFontSet; +struct nsFont; +class nsAtom; +class nsIDeviceContextSpec; +class nsIScreen; +class nsIScreenManager; +class nsIWidget; +struct nsRect; + +namespace mozilla { +namespace dom { +enum class ScreenColorGamut : uint8_t; +} // namespace dom +namespace hal { +enum class ScreenOrientation : uint32_t; +} // namespace hal +namespace widget { +class Screen; +} // namespace widget +} // namespace mozilla + +class nsDeviceContext final { + public: + using IntSize = mozilla::gfx::IntSize; + using PrintTarget = mozilla::gfx::PrintTarget; + + nsDeviceContext(); + + NS_INLINE_DECL_REFCOUNTING(nsDeviceContext) + + /** + * Initialize the device context from a widget + * @param aWidget a widget to initialize the device context from + */ + void Init(nsIWidget* aWidget); + + /** + * Initialize the device context from a device context spec + * @param aDevSpec the specification of the printing device + * @return error status + */ + nsresult InitForPrinting(nsIDeviceContextSpec* aDevSpec); + + /** + * Create a rendering context and initialize it. Only call this + * method on device contexts that were initialized for printing. + * + * @return the new rendering context (guaranteed to be non-null) + */ + mozilla::UniquePtr<gfxContext> CreateRenderingContext(); + + /** + * Create a reference rendering context and initialize it. Only call this + * method on device contexts that were initialized for printing. + * + * @return the new rendering context. + */ + mozilla::UniquePtr<gfxContext> CreateReferenceRenderingContext(); + + /** + * Gets the number of app units in one device pixel; this number + * is usually a factor of AppUnitsPerCSSPixel(), although that is + * not guaranteed. + */ + int32_t AppUnitsPerDevPixel() const { return mAppUnitsPerDevPixel; } + + /** + * Convert device pixels which is used for gfx/thebes to nearest + * (rounded) app units + */ + nscoord GfxUnitsToAppUnits(gfxFloat aGfxUnits) const { + return nscoord(NS_round(aGfxUnits * AppUnitsPerDevPixel())); + } + + /** + * Convert app units to device pixels which is used for gfx/thebes. + */ + gfxFloat AppUnitsToGfxUnits(nscoord aAppUnits) const { + return gfxFloat(aAppUnits) / AppUnitsPerDevPixel(); + } + + /** + * Gets the number of app units in one physical inch; this is the + * device's DPI times AppUnitsPerDevPixel(). + */ + int32_t AppUnitsPerPhysicalInch() const { return mAppUnitsPerPhysicalInch; } + + /** + * Get the ratio of app units to dev pixels that would be used at unit + * (100%) full zoom. + */ + int32_t AppUnitsPerDevPixelAtUnitFullZoom() const { + return mAppUnitsPerDevPixelAtUnitFullZoom; + } + + /** + * Get the ratio of app units to dev pixels that would be used in a top-level + * chrome page such as browser.xhtml. + */ + int32_t AppUnitsPerDevPixelInTopLevelChromePage() const; + + /** + * Return the bit depth of the device. + */ + uint32_t GetDepth(); + + /** + * Return the color gamut of the device. + */ + mozilla::dom::ScreenColorGamut GetColorGamut(); + + /** + * Return the orientation type of the device. + * If not screen device, return primary screen's value + */ + mozilla::hal::ScreenOrientation GetScreenOrientationType(); + + /** + * Return the orientation angle of the device. + * If not screen device, return primary screen's value + */ + uint16_t GetScreenOrientationAngle(); + + /** + * Get the size of the displayable area of the output device + * in app units. + * @param aWidth out parameter for width + * @param aHeight out parameter for height + * @return error status + */ + nsresult GetDeviceSurfaceDimensions(nscoord& aWidth, nscoord& aHeight); + + /** + * Get the size of the content area of the output device in app + * units. This corresponds on a screen device, for instance, to + * the entire screen. + * @param aRect out parameter for full rect. Position (x,y) will + * be (0,0) or relative to the primary monitor if + * this is not the primary. + * @return error status + */ + nsresult GetRect(nsRect& aRect); + + /** + * Get the size of the content area of the output device in app + * units. This corresponds on a screen device, for instance, to + * the area reported by GetDeviceSurfaceDimensions, minus the + * taskbar (Windows) or menubar (Macintosh). + * @param aRect out parameter for client rect. Position (x,y) will + * be (0,0) adjusted for any upper/left non-client + * space if present or relative to the primary + * monitor if this is not the primary. + * @return error status + */ + nsresult GetClientRect(nsRect& aRect); + + /** + * Returns true if we're currently between BeginDocument() and + * EndDocument() calls. + */ + bool IsCurrentlyPrintingDocument() const { return mIsCurrentlyPrintingDoc; } + + /** + * Inform the output device that output of a document is beginning + * Used for print related device contexts. Must be matched 1:1 with + * EndDocument() or AbortDocument(). + * + * @param aTitle - title of Document + * @param aPrintToFileName - name of file to print to, if empty then don't + * print to file + * @param aStartPage - starting page number (must be greater than zero) + * @param aEndPage - ending page number (must be less than or + * equal to number of pages) + * + * @return error status + */ + nsresult BeginDocument(const nsAString& aTitle, + const nsAString& aPrintToFileName, int32_t aStartPage, + int32_t aEndPage); + + /** + * Inform the output device that output of a document is ending. + * Used for print related device contexts. Must be matched 1:1 with + * BeginDocument() + * @return Promise that can be chained once the operation is complete. + */ + RefPtr<mozilla::gfx::PrintEndDocumentPromise> EndDocument(); + + /** + * Inform the output device that output of a document is being aborted. + * Must be matched 1:1 with BeginDocument() + * @return error status + */ + nsresult AbortDocument(); + + /** + * Inform the output device that output of a page is beginning + * Used for print related device contexts. Must be matched 1:1 with + * EndPage() and within a BeginDocument()/EndDocument() pair. + * + * @param aSizeInPoints - The physical dimensions of the page in points. + * Currently only supported (used) by print-to-PDF + * print targets, and then only to switch the + * orientation for a specific page (arbitrary page + * sizes are not supported by the Core Graphics print- + * to-PDF APIs, for example). + * + * @return error status + */ + nsresult BeginPage(const IntSize& aSizeInPoints); + + /** + * Inform the output device that output of a page is ending + * Used for print related device contexts. Must be matched 1:1 with + * BeginPage() and within a BeginDocument()/EndDocument() pair. + * @return error status + */ + nsresult EndPage(); + + /** + * Check to see if the DPI has changed, or impose a new DPI scale value. + * @return whether there was actually a change in the DPI (whether + * AppUnitsPerDevPixel() or AppUnitsPerPhysicalInch() + * changed) + */ + bool CheckDPIChange(); + + /** + * Set the full zoom factor: all lengths are multiplied by this factor + * when we convert them to device pixels. Returns whether the ratio of + * app units to dev pixels changed because of the zoom factor. + */ + bool SetFullZoom(float aScale); + + /** + * Returns the page full zoom factor applied. + */ + float GetFullZoom() const { return mFullZoom; } + + /** + * True if this device context was created for printing. + */ + bool IsPrinterContext() const { return !!mPrintTarget; } + + mozilla::DesktopToLayoutDeviceScale GetDesktopToDeviceScale(); + + private: + // Private destructor, to discourage deletion outside of Release(): + ~nsDeviceContext(); + + /** + * Implementation shared by CreateRenderingContext and + * CreateReferenceRenderingContext. + */ + mozilla::UniquePtr<gfxContext> CreateRenderingContextCommon( + bool aWantReferenceContext); + + void SetDPI(); + void ComputeClientRectUsingScreen(nsRect* outRect); + void ComputeFullAreaUsingScreen(nsRect* outRect); + already_AddRefed<mozilla::widget::Screen> FindScreen(); + + // Return false if the surface is not right + bool CalcPrintingSize(); + void UpdateAppUnitsForFullZoom(); + + nscoord mWidth; + nscoord mHeight; + int32_t mAppUnitsPerDevPixel; + int32_t mAppUnitsPerDevPixelAtUnitFullZoom; + int32_t mAppUnitsPerPhysicalInch; + float mFullZoom; + float mPrintingScale; + gfxPoint mPrintingTranslate; + + nsCOMPtr<nsIWidget> mWidget; + nsCOMPtr<nsIDeviceContextSpec> mDeviceContextSpec; + RefPtr<PrintTarget> mPrintTarget; + bool mIsCurrentlyPrintingDoc; + bool mIsInitialized = false; +}; + +#endif /* _NS_DEVICECONTEXT_H_ */ |