summaryrefslogtreecommitdiffstats
path: root/gfx/2d/QuartzSupport.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/2d/QuartzSupport.h')
-rw-r--r--gfx/2d/QuartzSupport.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/gfx/2d/QuartzSupport.h b/gfx/2d/QuartzSupport.h
new file mode 100644
index 000000000..f56fcb77c
--- /dev/null
+++ b/gfx/2d/QuartzSupport.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+// vim:set ts=2 sts=2 sw=2 et cin:
+/* 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 nsCoreAnimationSupport_h__
+#define nsCoreAnimationSupport_h__
+#ifdef XP_MACOSX
+
+#import <OpenGL/OpenGL.h>
+#import <OpenGL/gl.h>
+#import "ApplicationServices/ApplicationServices.h"
+#include "gfxTypes.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/gfx/MacIOSurface.h"
+#include "nsError.h"
+
+// Get the system color space.
+CGColorSpaceRef CreateSystemColorSpace();
+
+// Manages a CARenderer
+struct _CGLContextObject;
+
+enum AllowOfflineRendererEnum { ALLOW_OFFLINE_RENDERER, DISALLOW_OFFLINE_RENDERER };
+
+class nsCARenderer : public mozilla::RefCounted<nsCARenderer> {
+public:
+ MOZ_DECLARE_REFCOUNTED_TYPENAME(nsCARenderer)
+ nsCARenderer() : mCARenderer(nullptr), mWrapperCALayer(nullptr), mFBOTexture(0),
+ mOpenGLContext(nullptr), mCGImage(nullptr), mCGData(nullptr),
+ mIOSurface(nullptr), mFBO(0), mIOTexture(0),
+ mUnsupportedWidth(UINT32_MAX), mUnsupportedHeight(UINT32_MAX),
+ mAllowOfflineRenderer(DISALLOW_OFFLINE_RENDERER),
+ mContentsScaleFactor(1.0) {}
+ ~nsCARenderer();
+ // aWidth and aHeight are in "display pixels". A "display pixel" is the
+ // smallest fully addressable part of a display. But in HiDPI modes each
+ // "display pixel" corresponds to more than one device pixel. Multiply
+ // display pixels by aContentsScaleFactor to get device pixels.
+ nsresult SetupRenderer(void* aCALayer, int aWidth, int aHeight,
+ double aContentsScaleFactor,
+ AllowOfflineRendererEnum aAllowOfflineRenderer);
+ // aWidth and aHeight are in "display pixels". Multiply by
+ // aContentsScaleFactor to get device pixels.
+ nsresult Render(int aWidth, int aHeight,
+ double aContentsScaleFactor,
+ CGImageRef *aOutCAImage);
+ bool isInit() { return mCARenderer != nullptr; }
+ /*
+ * Render the CALayer to an IOSurface. If no IOSurface
+ * is attached then an internal pixel buffer will be
+ * used.
+ */
+ void AttachIOSurface(MacIOSurface *aSurface);
+ IOSurfaceID GetIOSurfaceID();
+ // aX, aY, aWidth and aHeight are in "display pixels". Multiply by
+ // surf->GetContentsScaleFactor() to get device pixels.
+ static nsresult DrawSurfaceToCGContext(CGContextRef aContext,
+ MacIOSurface *surf,
+ CGColorSpaceRef aColorSpace,
+ int aX, int aY,
+ size_t aWidth, size_t aHeight);
+
+ // Remove & Add the layer without destroying
+ // the renderer for fast back buffer swapping.
+ void DetachCALayer();
+ void AttachCALayer(void *aCALayer);
+#ifdef DEBUG
+ static void SaveToDisk(MacIOSurface *surf);
+#endif
+private:
+ // aWidth and aHeight are in "display pixels". Multiply by
+ // mContentsScaleFactor to get device pixels.
+ void SetBounds(int aWidth, int aHeight);
+ // aWidth and aHeight are in "display pixels". Multiply by
+ // mContentsScaleFactor to get device pixels.
+ void SetViewport(int aWidth, int aHeight);
+ void Destroy();
+
+ void *mCARenderer;
+ void *mWrapperCALayer;
+ GLuint mFBOTexture;
+ _CGLContextObject *mOpenGLContext;
+ CGImageRef mCGImage;
+ void *mCGData;
+ RefPtr<MacIOSurface> mIOSurface;
+ uint32_t mFBO;
+ uint32_t mIOTexture;
+ int mUnsupportedWidth;
+ int mUnsupportedHeight;
+ AllowOfflineRendererEnum mAllowOfflineRenderer;
+ double mContentsScaleFactor;
+};
+
+#endif // XP_MACOSX
+#endif // nsCoreAnimationSupport_h__
+