summaryrefslogtreecommitdiff
path: root/gfx/2d/MacIOSurface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/2d/MacIOSurface.cpp')
-rw-r--r--gfx/2d/MacIOSurface.cpp615
1 files changed, 0 insertions, 615 deletions
diff --git a/gfx/2d/MacIOSurface.cpp b/gfx/2d/MacIOSurface.cpp
deleted file mode 100644
index 759de8575b..0000000000
--- a/gfx/2d/MacIOSurface.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-/* -*- 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/. */
-
-#include "MacIOSurface.h"
-#include <OpenGL/gl.h>
-#include <QuartzCore/QuartzCore.h>
-#include <dlfcn.h>
-#include "mozilla/RefPtr.h"
-#include "mozilla/Assertions.h"
-#include "GLConsts.h"
-
-using namespace mozilla;
-// IOSurface signatures
-#define IOSURFACE_FRAMEWORK_PATH \
- "/System/Library/Frameworks/IOSurface.framework/IOSurface"
-#define OPENGL_FRAMEWORK_PATH \
- "/System/Library/Frameworks/OpenGL.framework/OpenGL"
-#define COREGRAPHICS_FRAMEWORK_PATH \
- "/System/Library/Frameworks/ApplicationServices.framework/Frameworks/" \
- "CoreGraphics.framework/CoreGraphics"
-#define COREVIDEO_FRAMEWORK_PATH \
- "/System/Library/Frameworks/ApplicationServices.framework/Frameworks/" \
- "CoreVideo.framework/CoreVideo"
-
-#define GET_CONST(const_name) \
- ((CFStringRef*) dlsym(sIOSurfaceFramework, const_name))
-#define GET_IOSYM(dest,sym_name) \
- (typeof(dest)) dlsym(sIOSurfaceFramework, sym_name)
-#define GET_CGLSYM(dest,sym_name) \
- (typeof(dest)) dlsym(sOpenGLFramework, sym_name)
-#define GET_CGSYM(dest,sym_name) \
- (typeof(dest)) dlsym(sCoreGraphicsFramework, sym_name)
-#define GET_CVSYM(dest, sym_name) \
- (typeof(dest)) dlsym(sCoreVideoFramework, sym_name)
-
-MacIOSurfaceLib::LibraryUnloader MacIOSurfaceLib::sLibraryUnloader;
-bool MacIOSurfaceLib::isLoaded = false;
-void* MacIOSurfaceLib::sIOSurfaceFramework;
-void* MacIOSurfaceLib::sOpenGLFramework;
-void* MacIOSurfaceLib::sCoreGraphicsFramework;
-void* MacIOSurfaceLib::sCoreVideoFramework;
-IOSurfaceCreateFunc MacIOSurfaceLib::sCreate;
-IOSurfaceGetIDFunc MacIOSurfaceLib::sGetID;
-IOSurfaceLookupFunc MacIOSurfaceLib::sLookup;
-IOSurfaceGetBaseAddressFunc MacIOSurfaceLib::sGetBaseAddress;
-IOSurfaceGetBaseAddressOfPlaneFunc MacIOSurfaceLib::sGetBaseAddressOfPlane;
-IOSurfaceSizePlaneTFunc MacIOSurfaceLib::sWidth;
-IOSurfaceSizePlaneTFunc MacIOSurfaceLib::sHeight;
-IOSurfaceSizeTFunc MacIOSurfaceLib::sPlaneCount;
-IOSurfaceSizePlaneTFunc MacIOSurfaceLib::sBytesPerRow;
-IOSurfaceGetPropertyMaximumFunc MacIOSurfaceLib::sGetPropertyMaximum;
-IOSurfaceVoidFunc MacIOSurfaceLib::sIncrementUseCount;
-IOSurfaceVoidFunc MacIOSurfaceLib::sDecrementUseCount;
-IOSurfaceLockFunc MacIOSurfaceLib::sLock;
-IOSurfaceUnlockFunc MacIOSurfaceLib::sUnlock;
-CGLTexImageIOSurface2DFunc MacIOSurfaceLib::sTexImage;
-IOSurfaceContextCreateFunc MacIOSurfaceLib::sIOSurfaceContextCreate;
-IOSurfaceContextCreateImageFunc MacIOSurfaceLib::sIOSurfaceContextCreateImage;
-IOSurfaceContextGetSurfaceFunc MacIOSurfaceLib::sIOSurfaceContextGetSurface;
-CVPixelBufferGetIOSurfaceFunc MacIOSurfaceLib::sCVPixelBufferGetIOSurface;
-unsigned int (*MacIOSurfaceLib::sCGContextGetTypePtr) (CGContextRef) = nullptr;
-IOSurfacePixelFormatFunc MacIOSurfaceLib::sPixelFormat;
-
-CFStringRef MacIOSurfaceLib::kPropWidth;
-CFStringRef MacIOSurfaceLib::kPropHeight;
-CFStringRef MacIOSurfaceLib::kPropBytesPerElem;
-CFStringRef MacIOSurfaceLib::kPropBytesPerRow;
-CFStringRef MacIOSurfaceLib::kPropIsGlobal;
-
-bool MacIOSurfaceLib::isInit() {
- // Guard against trying to reload the library
- // if it is not available.
- if (!isLoaded)
- LoadLibrary();
- MOZ_ASSERT(sIOSurfaceFramework);
- return sIOSurfaceFramework;
-}
-
-IOSurfacePtr MacIOSurfaceLib::IOSurfaceCreate(CFDictionaryRef properties) {
- return sCreate(properties);
-}
-
-IOSurfacePtr MacIOSurfaceLib::IOSurfaceLookup(IOSurfaceID aIOSurfaceID) {
- return sLookup(aIOSurfaceID);
-}
-
-IOSurfaceID MacIOSurfaceLib::IOSurfaceGetID(IOSurfacePtr aIOSurfacePtr) {
- return sGetID(aIOSurfacePtr);
-}
-
-void* MacIOSurfaceLib::IOSurfaceGetBaseAddress(IOSurfacePtr aIOSurfacePtr) {
- return sGetBaseAddress(aIOSurfacePtr);
-}
-
-void* MacIOSurfaceLib::IOSurfaceGetBaseAddressOfPlane(IOSurfacePtr aIOSurfacePtr,
- size_t planeIndex) {
- return sGetBaseAddressOfPlane(aIOSurfacePtr, planeIndex);
-}
-
-size_t MacIOSurfaceLib::IOSurfaceGetPlaneCount(IOSurfacePtr aIOSurfacePtr) {
- return sPlaneCount(aIOSurfacePtr);
-}
-
-size_t MacIOSurfaceLib::IOSurfaceGetWidth(IOSurfacePtr aIOSurfacePtr, size_t plane) {
- return sWidth(aIOSurfacePtr, plane);
-}
-
-size_t MacIOSurfaceLib::IOSurfaceGetHeight(IOSurfacePtr aIOSurfacePtr, size_t plane) {
- return sHeight(aIOSurfacePtr, plane);
-}
-
-size_t MacIOSurfaceLib::IOSurfaceGetBytesPerRow(IOSurfacePtr aIOSurfacePtr, size_t plane) {
- return sBytesPerRow(aIOSurfacePtr, plane);
-}
-
-size_t MacIOSurfaceLib::IOSurfaceGetPropertyMaximum(CFStringRef property) {
- return sGetPropertyMaximum(property);
-}
-
-OSType MacIOSurfaceLib::IOSurfaceGetPixelFormat(IOSurfacePtr aIOSurfacePtr) {
- return sPixelFormat(aIOSurfacePtr);
-}
-
-IOReturn MacIOSurfaceLib::IOSurfaceLock(IOSurfacePtr aIOSurfacePtr,
- uint32_t options, uint32_t* seed) {
- return sLock(aIOSurfacePtr, options, seed);
-}
-
-IOReturn MacIOSurfaceLib::IOSurfaceUnlock(IOSurfacePtr aIOSurfacePtr,
- uint32_t options, uint32_t *seed) {
- return sUnlock(aIOSurfacePtr, options, seed);
-}
-
-void MacIOSurfaceLib::IOSurfaceIncrementUseCount(IOSurfacePtr aIOSurfacePtr) {
- sIncrementUseCount(aIOSurfacePtr);
-}
-
-void MacIOSurfaceLib::IOSurfaceDecrementUseCount(IOSurfacePtr aIOSurfacePtr) {
- sDecrementUseCount(aIOSurfacePtr);
-}
-
-CGLError MacIOSurfaceLib::CGLTexImageIOSurface2D(CGLContextObj ctxt,
- GLenum target, GLenum internalFormat,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- IOSurfacePtr ioSurface, GLuint plane) {
- return sTexImage(ctxt, target, internalFormat, width, height,
- format, type, ioSurface, plane);
-}
-
-IOSurfacePtr MacIOSurfaceLib::CVPixelBufferGetIOSurface(CVPixelBufferRef aPixelBuffer) {
- return sCVPixelBufferGetIOSurface(aPixelBuffer);
-}
-
-CGContextRef MacIOSurfaceLib::IOSurfaceContextCreate(IOSurfacePtr aIOSurfacePtr,
- unsigned aWidth, unsigned aHeight,
- unsigned aBitsPerComponent, unsigned aBytes,
- CGColorSpaceRef aColorSpace, CGBitmapInfo bitmapInfo) {
- if (!sIOSurfaceContextCreate)
- return nullptr;
- return sIOSurfaceContextCreate(aIOSurfacePtr, aWidth, aHeight, aBitsPerComponent, aBytes, aColorSpace, bitmapInfo);
-}
-
-CGImageRef MacIOSurfaceLib::IOSurfaceContextCreateImage(CGContextRef aContext) {
- if (!sIOSurfaceContextCreateImage)
- return nullptr;
- return sIOSurfaceContextCreateImage(aContext);
-}
-
-IOSurfacePtr MacIOSurfaceLib::IOSurfaceContextGetSurface(CGContextRef aContext) {
- if (!sIOSurfaceContextGetSurface)
- return nullptr;
- return sIOSurfaceContextGetSurface(aContext);
-}
-
-CFStringRef MacIOSurfaceLib::GetIOConst(const char* symbole) {
- CFStringRef *address = (CFStringRef*)dlsym(sIOSurfaceFramework, symbole);
- if (!address)
- return nullptr;
-
- return *address;
-}
-
-void MacIOSurfaceLib::LoadLibrary() {
- if (isLoaded) {
- return;
- }
- isLoaded = true;
- sIOSurfaceFramework = dlopen(IOSURFACE_FRAMEWORK_PATH,
- RTLD_LAZY | RTLD_LOCAL);
- sOpenGLFramework = dlopen(OPENGL_FRAMEWORK_PATH,
- RTLD_LAZY | RTLD_LOCAL);
-
- sCoreGraphicsFramework = dlopen(COREGRAPHICS_FRAMEWORK_PATH,
- RTLD_LAZY | RTLD_LOCAL);
-
- sCoreVideoFramework = dlopen(COREVIDEO_FRAMEWORK_PATH,
- RTLD_LAZY | RTLD_LOCAL);
-
- if (!sIOSurfaceFramework || !sOpenGLFramework || !sCoreGraphicsFramework ||
- !sCoreVideoFramework) {
- if (sIOSurfaceFramework)
- dlclose(sIOSurfaceFramework);
- if (sOpenGLFramework)
- dlclose(sOpenGLFramework);
- if (sCoreGraphicsFramework)
- dlclose(sCoreGraphicsFramework);
- if (sCoreVideoFramework)
- dlclose(sCoreVideoFramework);
- sIOSurfaceFramework = nullptr;
- sOpenGLFramework = nullptr;
- sCoreGraphicsFramework = nullptr;
- sCoreVideoFramework = nullptr;
- return;
- }
-
- kPropWidth = GetIOConst("kIOSurfaceWidth");
- kPropHeight = GetIOConst("kIOSurfaceHeight");
- kPropBytesPerElem = GetIOConst("kIOSurfaceBytesPerElement");
- kPropBytesPerRow = GetIOConst("kIOSurfaceBytesPerRow");
- kPropIsGlobal = GetIOConst("kIOSurfaceIsGlobal");
- sCreate = GET_IOSYM(sCreate, "IOSurfaceCreate");
- sGetID = GET_IOSYM(sGetID, "IOSurfaceGetID");
- sWidth = GET_IOSYM(sWidth, "IOSurfaceGetWidthOfPlane");
- sHeight = GET_IOSYM(sHeight, "IOSurfaceGetHeightOfPlane");
- sBytesPerRow = GET_IOSYM(sBytesPerRow, "IOSurfaceGetBytesPerRowOfPlane");
- sGetPropertyMaximum = GET_IOSYM(sGetPropertyMaximum, "IOSurfaceGetPropertyMaximum");
- sLookup = GET_IOSYM(sLookup, "IOSurfaceLookup");
- sLock = GET_IOSYM(sLock, "IOSurfaceLock");
- sUnlock = GET_IOSYM(sUnlock, "IOSurfaceUnlock");
- sIncrementUseCount =
- GET_IOSYM(sIncrementUseCount, "IOSurfaceIncrementUseCount");
- sDecrementUseCount =
- GET_IOSYM(sDecrementUseCount, "IOSurfaceDecrementUseCount");
- sGetBaseAddress = GET_IOSYM(sGetBaseAddress, "IOSurfaceGetBaseAddress");
- sGetBaseAddressOfPlane =
- GET_IOSYM(sGetBaseAddressOfPlane, "IOSurfaceGetBaseAddressOfPlane");
- sPlaneCount = GET_IOSYM(sPlaneCount, "IOSurfaceGetPlaneCount");
- sPixelFormat = GET_IOSYM(sPixelFormat, "IOSurfaceGetPixelFormat");
-
- sTexImage = GET_CGLSYM(sTexImage, "CGLTexImageIOSurface2D");
- sCGContextGetTypePtr = (unsigned int (*)(CGContext*))dlsym(RTLD_DEFAULT, "CGContextGetType");
-
- sCVPixelBufferGetIOSurface =
- GET_CVSYM(sCVPixelBufferGetIOSurface, "CVPixelBufferGetIOSurface");
-
- // Optional symbols
- sIOSurfaceContextCreate = GET_CGSYM(sIOSurfaceContextCreate, "CGIOSurfaceContextCreate");
- sIOSurfaceContextCreateImage = GET_CGSYM(sIOSurfaceContextCreateImage, "CGIOSurfaceContextCreateImage");
- sIOSurfaceContextGetSurface = GET_CGSYM(sIOSurfaceContextGetSurface, "CGIOSurfaceContextGetSurface");
-
- if (!sCreate || !sGetID || !sLookup || !sTexImage || !sGetBaseAddress ||
- !sGetBaseAddressOfPlane || !sPlaneCount ||
- !kPropWidth || !kPropHeight || !kPropBytesPerElem || !kPropIsGlobal ||
- !sLock || !sUnlock || !sIncrementUseCount || !sDecrementUseCount ||
- !sWidth || !sHeight || !kPropBytesPerRow ||
- !sBytesPerRow || !sGetPropertyMaximum || !sCVPixelBufferGetIOSurface) {
- CloseLibrary();
- }
-}
-
-void MacIOSurfaceLib::CloseLibrary() {
- if (sIOSurfaceFramework) {
- dlclose(sIOSurfaceFramework);
- }
- if (sOpenGLFramework) {
- dlclose(sOpenGLFramework);
- }
- if (sCoreVideoFramework) {
- dlclose(sCoreVideoFramework);
- }
- sIOSurfaceFramework = nullptr;
- sOpenGLFramework = nullptr;
- sCoreVideoFramework = nullptr;
-}
-
-MacIOSurface::MacIOSurface(const void* aIOSurfacePtr,
- double aContentsScaleFactor, bool aHasAlpha)
- : mIOSurfacePtr(aIOSurfacePtr)
- , mContentsScaleFactor(aContentsScaleFactor)
- , mHasAlpha(aHasAlpha)
-{
- CFRetain(mIOSurfacePtr);
- IncrementUseCount();
-}
-
-MacIOSurface::~MacIOSurface() {
- DecrementUseCount();
- CFRelease(mIOSurfacePtr);
-}
-
-already_AddRefed<MacIOSurface> MacIOSurface::CreateIOSurface(int aWidth, int aHeight,
- double aContentsScaleFactor,
- bool aHasAlpha) {
- if (!MacIOSurfaceLib::isInit() || aContentsScaleFactor <= 0)
- return nullptr;
-
- CFMutableDictionaryRef props = ::CFDictionaryCreateMutable(
- kCFAllocatorDefault, 4,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
- if (!props)
- return nullptr;
-
- MOZ_ASSERT((size_t)aWidth <= GetMaxWidth());
- MOZ_ASSERT((size_t)aHeight <= GetMaxHeight());
-
- int32_t bytesPerElem = 4;
- size_t intScaleFactor = ceil(aContentsScaleFactor);
- aWidth *= intScaleFactor;
- aHeight *= intScaleFactor;
- CFNumberRef cfWidth = ::CFNumberCreate(nullptr, kCFNumberSInt32Type, &aWidth);
- CFNumberRef cfHeight = ::CFNumberCreate(nullptr, kCFNumberSInt32Type, &aHeight);
- CFNumberRef cfBytesPerElem = ::CFNumberCreate(nullptr, kCFNumberSInt32Type, &bytesPerElem);
- ::CFDictionaryAddValue(props, MacIOSurfaceLib::kPropWidth,
- cfWidth);
- ::CFRelease(cfWidth);
- ::CFDictionaryAddValue(props, MacIOSurfaceLib::kPropHeight,
- cfHeight);
- ::CFRelease(cfHeight);
- ::CFDictionaryAddValue(props, MacIOSurfaceLib::kPropBytesPerElem,
- cfBytesPerElem);
- ::CFRelease(cfBytesPerElem);
- ::CFDictionaryAddValue(props, MacIOSurfaceLib::kPropIsGlobal,
- kCFBooleanTrue);
-
- IOSurfacePtr surfaceRef = MacIOSurfaceLib::IOSurfaceCreate(props);
- ::CFRelease(props);
-
- if (!surfaceRef)
- return nullptr;
-
- RefPtr<MacIOSurface> ioSurface = new MacIOSurface(surfaceRef, aContentsScaleFactor, aHasAlpha);
- if (!ioSurface) {
- ::CFRelease(surfaceRef);
- return nullptr;
- }
-
- // Release the IOSurface because MacIOSurface retained it
- CFRelease(surfaceRef);
-
- return ioSurface.forget();
-}
-
-already_AddRefed<MacIOSurface> MacIOSurface::LookupSurface(IOSurfaceID aIOSurfaceID,
- double aContentsScaleFactor,
- bool aHasAlpha) {
- if (!MacIOSurfaceLib::isInit() || aContentsScaleFactor <= 0)
- return nullptr;
-
- IOSurfacePtr surfaceRef = MacIOSurfaceLib::IOSurfaceLookup(aIOSurfaceID);
- if (!surfaceRef)
- return nullptr;
-
- RefPtr<MacIOSurface> ioSurface = new MacIOSurface(surfaceRef, aContentsScaleFactor, aHasAlpha);
- if (!ioSurface) {
- ::CFRelease(surfaceRef);
- return nullptr;
- }
-
- // Release the IOSurface because MacIOSurface retained it
- CFRelease(surfaceRef);
-
- return ioSurface.forget();
-}
-
-IOSurfaceID MacIOSurface::GetIOSurfaceID() {
- return MacIOSurfaceLib::IOSurfaceGetID(mIOSurfacePtr);
-}
-
-void* MacIOSurface::GetBaseAddress() {
- return MacIOSurfaceLib::IOSurfaceGetBaseAddress(mIOSurfacePtr);
-}
-
-void* MacIOSurface::GetBaseAddressOfPlane(size_t aPlaneIndex)
-{
- return MacIOSurfaceLib::IOSurfaceGetBaseAddressOfPlane(mIOSurfacePtr,
- aPlaneIndex);
-}
-
-size_t MacIOSurface::GetWidth(size_t plane) {
- size_t intScaleFactor = ceil(mContentsScaleFactor);
- return GetDevicePixelWidth(plane) / intScaleFactor;
-}
-
-size_t MacIOSurface::GetHeight(size_t plane) {
- size_t intScaleFactor = ceil(mContentsScaleFactor);
- return GetDevicePixelHeight(plane) / intScaleFactor;
-}
-
-size_t MacIOSurface::GetPlaneCount() {
- return MacIOSurfaceLib::IOSurfaceGetPlaneCount(mIOSurfacePtr);
-}
-
-/*static*/ size_t MacIOSurface::GetMaxWidth() {
- if (!MacIOSurfaceLib::isInit())
- return -1;
- return MacIOSurfaceLib::IOSurfaceGetPropertyMaximum(MacIOSurfaceLib::kPropWidth);
-}
-
-/*static*/ size_t MacIOSurface::GetMaxHeight() {
- if (!MacIOSurfaceLib::isInit())
- return -1;
- return MacIOSurfaceLib::IOSurfaceGetPropertyMaximum(MacIOSurfaceLib::kPropHeight);
-}
-
-size_t MacIOSurface::GetDevicePixelWidth(size_t plane) {
- return MacIOSurfaceLib::IOSurfaceGetWidth(mIOSurfacePtr, plane);
-}
-
-size_t MacIOSurface::GetDevicePixelHeight(size_t plane) {
- return MacIOSurfaceLib::IOSurfaceGetHeight(mIOSurfacePtr, plane);
-}
-
-size_t MacIOSurface::GetBytesPerRow(size_t plane) {
- return MacIOSurfaceLib::IOSurfaceGetBytesPerRow(mIOSurfacePtr, plane);
-}
-
-OSType MacIOSurface::GetPixelFormat() {
- return MacIOSurfaceLib::IOSurfaceGetPixelFormat(mIOSurfacePtr);
-}
-
-void MacIOSurface::IncrementUseCount() {
- MacIOSurfaceLib::IOSurfaceIncrementUseCount(mIOSurfacePtr);
-}
-
-void MacIOSurface::DecrementUseCount() {
- MacIOSurfaceLib::IOSurfaceDecrementUseCount(mIOSurfacePtr);
-}
-
-#define READ_ONLY 0x1
-void MacIOSurface::Lock(bool aReadOnly) {
- MacIOSurfaceLib::IOSurfaceLock(mIOSurfacePtr, aReadOnly ? READ_ONLY : 0, nullptr);
-}
-
-void MacIOSurface::Unlock(bool aReadOnly) {
- MacIOSurfaceLib::IOSurfaceUnlock(mIOSurfacePtr, aReadOnly ? READ_ONLY : 0, nullptr);
-}
-
-using mozilla::gfx::SourceSurface;
-using mozilla::gfx::IntSize;
-using mozilla::gfx::SurfaceFormat;
-
-void
-MacIOSurfaceBufferDeallocator(void* aClosure)
-{
- MOZ_ASSERT(aClosure);
-
- delete [] static_cast<unsigned char*>(aClosure);
-}
-
-already_AddRefed<SourceSurface>
-MacIOSurface::GetAsSurface() {
- Lock();
- size_t bytesPerRow = GetBytesPerRow();
- size_t ioWidth = GetDevicePixelWidth();
- size_t ioHeight = GetDevicePixelHeight();
-
- unsigned char* ioData = (unsigned char*)GetBaseAddress();
- unsigned char* dataCpy =
- new unsigned char[bytesPerRow * ioHeight / sizeof(unsigned char)];
- for (size_t i = 0; i < ioHeight; i++) {
- memcpy(dataCpy + i * bytesPerRow,
- ioData + i * bytesPerRow, ioWidth * 4);
- }
-
- Unlock();
-
- SurfaceFormat format = HasAlpha() ? mozilla::gfx::SurfaceFormat::B8G8R8A8 :
- mozilla::gfx::SurfaceFormat::B8G8R8X8;
-
- RefPtr<mozilla::gfx::DataSourceSurface> surf =
- mozilla::gfx::Factory::CreateWrappingDataSourceSurface(dataCpy,
- bytesPerRow,
- IntSize(ioWidth, ioHeight),
- format,
- &MacIOSurfaceBufferDeallocator,
- static_cast<void*>(dataCpy));
-
- return surf.forget();
-}
-
-SurfaceFormat
-MacIOSurface::GetFormat()
-{
- OSType pixelFormat = GetPixelFormat();
- if (pixelFormat == '420v') {
- return SurfaceFormat::NV12;
- } else if (pixelFormat == '2vuy') {
- return SurfaceFormat::YUV422;
- } else {
- return HasAlpha() ? SurfaceFormat::R8G8B8A8 : SurfaceFormat::R8G8B8X8;
- }
-}
-
-SurfaceFormat
-MacIOSurface::GetReadFormat()
-{
- OSType pixelFormat = GetPixelFormat();
- if (pixelFormat == '420v') {
- return SurfaceFormat::NV12;
- } else if (pixelFormat == '2vuy') {
- return SurfaceFormat::R8G8B8X8;
- } else {
- return HasAlpha() ? SurfaceFormat::R8G8B8A8 : SurfaceFormat::R8G8B8X8;
- }
-}
-
-CGLError
-MacIOSurface::CGLTexImageIOSurface2D(CGLContextObj ctx, size_t plane)
-{
- MOZ_ASSERT(plane >= 0);
- OSType pixelFormat = GetPixelFormat();
-
- GLenum internalFormat;
- GLenum format;
- GLenum type;
- if (pixelFormat == '420v') {
- MOZ_ASSERT(GetPlaneCount() == 2);
- MOZ_ASSERT(plane < 2);
-
- if (plane == 0) {
- internalFormat = format = GL_LUMINANCE;
- } else {
- internalFormat = format = GL_LUMINANCE_ALPHA;
- }
- type = GL_UNSIGNED_BYTE;
- } else if (pixelFormat == '2vuy') {
- MOZ_ASSERT(plane == 0);
-
- internalFormat = GL_RGB;
- format = LOCAL_GL_YCBCR_422_APPLE;
- type = GL_UNSIGNED_SHORT_8_8_APPLE;
- } else {
- MOZ_ASSERT(plane == 0);
-
- internalFormat = HasAlpha() ? GL_RGBA : GL_RGB;
- format = GL_BGRA;
- type = GL_UNSIGNED_INT_8_8_8_8_REV;
- }
- CGLError temp = MacIOSurfaceLib::CGLTexImageIOSurface2D(ctx,
- GL_TEXTURE_RECTANGLE_ARB,
- internalFormat,
- GetDevicePixelWidth(plane),
- GetDevicePixelHeight(plane),
- format,
- type,
- mIOSurfacePtr, plane);
- return temp;
-}
-
-static
-CGColorSpaceRef CreateSystemColorSpace() {
- CGColorSpaceRef cspace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
- if (!cspace) {
- cspace = ::CGColorSpaceCreateDeviceRGB();
- }
- return cspace;
-}
-
-CGContextRef MacIOSurface::CreateIOSurfaceContext() {
- CGColorSpaceRef cspace = CreateSystemColorSpace();
- CGContextRef ref = MacIOSurfaceLib::IOSurfaceContextCreate(mIOSurfacePtr,
- GetDevicePixelWidth(),
- GetDevicePixelHeight(),
- 8, 32, cspace, 0x2002);
- ::CGColorSpaceRelease(cspace);
- return ref;
-}
-
-CGImageRef MacIOSurface::CreateImageFromIOSurfaceContext(CGContextRef aContext) {
- if (!MacIOSurfaceLib::isInit())
- return nullptr;
-
- return MacIOSurfaceLib::IOSurfaceContextCreateImage(aContext);
-}
-
-already_AddRefed<MacIOSurface> MacIOSurface::IOSurfaceContextGetSurface(CGContextRef aContext,
- double aContentsScaleFactor,
- bool aHasAlpha) {
- if (!MacIOSurfaceLib::isInit() || aContentsScaleFactor <= 0)
- return nullptr;
-
- IOSurfacePtr surfaceRef = MacIOSurfaceLib::IOSurfaceContextGetSurface(aContext);
- if (!surfaceRef)
- return nullptr;
-
- RefPtr<MacIOSurface> ioSurface = new MacIOSurface(surfaceRef, aContentsScaleFactor, aHasAlpha);
- if (!ioSurface) {
- ::CFRelease(surfaceRef);
- return nullptr;
- }
- return ioSurface.forget();
-}
-
-
-CGContextType GetContextType(CGContextRef ref)
-{
- if (!MacIOSurfaceLib::isInit() || !MacIOSurfaceLib::sCGContextGetTypePtr)
- return CG_CONTEXT_TYPE_UNKNOWN;
-
- unsigned int type = MacIOSurfaceLib::sCGContextGetTypePtr(ref);
- if (type == CG_CONTEXT_TYPE_BITMAP) {
- return CG_CONTEXT_TYPE_BITMAP;
- } else if (type == CG_CONTEXT_TYPE_IOSURFACE) {
- return CG_CONTEXT_TYPE_IOSURFACE;
- } else {
- return CG_CONTEXT_TYPE_UNKNOWN;
- }
-}
-
-