/* -*- 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 // for uint32_t #include // 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 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 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 status of HDR support of the associated screen. */ bool GetScreenIsHDR(); /** * 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 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 CreateRenderingContextCommon( bool aWantReferenceContext); void SetDPI(); void ComputeClientRectUsingScreen(nsRect* outRect); void ComputeFullAreaUsingScreen(nsRect* outRect); already_AddRefed 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 mWidget; nsCOMPtr mDeviceContextSpec; RefPtr mPrintTarget; bool mIsCurrentlyPrintingDoc; bool mIsInitialized = false; }; #endif /* _NS_DEVICECONTEXT_H_ */