diff options
Diffstat (limited to 'gfx/2d')
-rw-r--r-- | gfx/2d/2D.h | 5 | ||||
-rw-r--r-- | gfx/2d/DrawEventRecorder.cpp | 4 | ||||
-rw-r--r-- | gfx/2d/DrawEventRecorder.h | 4 | ||||
-rw-r--r-- | gfx/2d/DrawTargetSkia.cpp | 2 | ||||
-rw-r--r-- | gfx/2d/Factory.cpp | 34 | ||||
-rw-r--r-- | gfx/2d/MacIOSurface.cpp | 67 | ||||
-rw-r--r-- | gfx/2d/MacIOSurface.h | 31 | ||||
-rw-r--r-- | gfx/2d/ScaledFontMac.cpp | 6 | ||||
-rw-r--r-- | gfx/2d/moz.build | 6 |
9 files changed, 100 insertions, 59 deletions
diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h index 024723868b..e6b94f86ea 100644 --- a/gfx/2d/2D.h +++ b/gfx/2d/2D.h @@ -1987,7 +1987,7 @@ class DrawTarget : public external::AtomicRefCounted<DrawTarget> { SurfaceFormat mFormat; }; -class DrawEventRecorder : public RefCounted<DrawEventRecorder> { +class DrawEventRecorder : public external::AtomicRefCounted<DrawEventRecorder> { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawEventRecorder) virtual RecorderType GetRecorderType() const { return RecorderType::UNKNOWN; } @@ -2160,6 +2160,9 @@ class GFX2D_API Factory { SurfaceFormat aFormat, SourceSurfaceDeallocator aDeallocator = nullptr, void* aClosure = nullptr); + static already_AddRefed<DataSourceSurface> CopyDataSourceSurface( + DataSourceSurface* aSource); + static void CopyDataSourceSurface(DataSourceSurface* aSource, DataSourceSurface* aDest); diff --git a/gfx/2d/DrawEventRecorder.cpp b/gfx/2d/DrawEventRecorder.cpp index 967c02f8a0..51f8b836ec 100644 --- a/gfx/2d/DrawEventRecorder.cpp +++ b/gfx/2d/DrawEventRecorder.cpp @@ -16,9 +16,7 @@ namespace gfx { DrawEventRecorderPrivate::DrawEventRecorderPrivate() : mExternalFonts(false) {} -DrawEventRecorderPrivate::~DrawEventRecorderPrivate() { - NS_ASSERT_OWNINGTHREAD(DrawEventRecorderPrivate); -} +DrawEventRecorderPrivate::~DrawEventRecorderPrivate() = default; void DrawEventRecorderPrivate::SetDrawTarget(ReferencePtr aDT) { NS_ASSERT_OWNINGTHREAD(DrawEventRecorderPrivate); diff --git a/gfx/2d/DrawEventRecorder.h b/gfx/2d/DrawEventRecorder.h index 13380b014a..d62f098784 100644 --- a/gfx/2d/DrawEventRecorder.h +++ b/gfx/2d/DrawEventRecorder.h @@ -41,7 +41,7 @@ class DrawEventRecorderPrivate : public DrawEventRecorder { return true; } virtual void FlushItem(IntRect) {} - void DetachResources() { + virtual void DetachResources() { NS_ASSERT_OWNINGTHREAD(DrawEventRecorderPrivate); nsTHashSet<ScaledFont*> fonts = std::move(mStoredFonts); @@ -116,7 +116,7 @@ class DrawEventRecorderPrivate : public DrawEventRecorder { return mStoredObjects.EnsureInserted(aObject); } - void AddPendingDeletion(std::function<void()>&& aPendingDeletion) { + virtual void AddPendingDeletion(std::function<void()>&& aPendingDeletion) { auto lockedPendingDeletions = mPendingDeletions.Lock(); lockedPendingDeletions->emplace_back(std::move(aPendingDeletion)); } diff --git a/gfx/2d/DrawTargetSkia.cpp b/gfx/2d/DrawTargetSkia.cpp index 098ff81117..508dac3f62 100644 --- a/gfx/2d/DrawTargetSkia.cpp +++ b/gfx/2d/DrawTargetSkia.cpp @@ -1398,7 +1398,7 @@ void DrawTargetSkia::Mask(const Pattern& aSource, const Pattern& aMask, SkPaint maskPaint; SetPaintPattern(maskPaint, aMask, lock); - sk_sp<SkShader> maskShader(maskPaint.getShader()); + sk_sp<SkShader> maskShader(maskPaint.refShader()); if (!maskShader && maskPaint.getAlpha() != 0xFF) { if (maskPaint.getAlpha() == 0) { return; diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp index abf7a8669b..1bdf597142 100644 --- a/gfx/2d/Factory.cpp +++ b/gfx/2d/Factory.cpp @@ -1106,6 +1106,40 @@ already_AddRefed<DataSourceSurface> Factory::CreateDataSourceSurfaceWithStride( return nullptr; } +already_AddRefed<DataSourceSurface> Factory::CopyDataSourceSurface( + DataSourceSurface* aSource) { + // Don't worry too much about speed. + MOZ_ASSERT(aSource->GetFormat() == SurfaceFormat::R8G8B8A8 || + aSource->GetFormat() == SurfaceFormat::R8G8B8X8 || + aSource->GetFormat() == SurfaceFormat::B8G8R8A8 || + aSource->GetFormat() == SurfaceFormat::B8G8R8X8); + + DataSourceSurface::ScopedMap srcMap(aSource, DataSourceSurface::READ); + if (NS_WARN_IF(!srcMap.IsMapped())) { + MOZ_ASSERT_UNREACHABLE("CopyDataSourceSurface: Failed to map surface."); + return nullptr; + } + + IntSize size = aSource->GetSize(); + SurfaceFormat format = aSource->GetFormat(); + + RefPtr<DataSourceSurface> dst = CreateDataSourceSurfaceWithStride( + size, format, srcMap.GetStride(), /* aZero */ false); + if (NS_WARN_IF(!dst)) { + return nullptr; + } + + DataSourceSurface::ScopedMap dstMap(dst, DataSourceSurface::WRITE); + if (NS_WARN_IF(!dstMap.IsMapped())) { + MOZ_ASSERT_UNREACHABLE("CopyDataSourceSurface: Failed to map surface."); + return nullptr; + } + + SwizzleData(srcMap.GetData(), srcMap.GetStride(), format, dstMap.GetData(), + dstMap.GetStride(), format, size); + return dst.forget(); +} + void Factory::CopyDataSourceSurface(DataSourceSurface* aSource, DataSourceSurface* aDest) { // Don't worry too much about speed. diff --git a/gfx/2d/MacIOSurface.cpp b/gfx/2d/MacIOSurface.cpp index 8c1c24bc10..1701731d61 100644 --- a/gfx/2d/MacIOSurface.cpp +++ b/gfx/2d/MacIOSurface.cpp @@ -5,11 +5,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "MacIOSurface.h" -#include <OpenGL/gl.h> -#include <OpenGL/CGLIOSurface.h> +#ifdef XP_MACOSX +# include <OpenGL/gl.h> +# include <OpenGL/CGLIOSurface.h> +#endif #include <QuartzCore/QuartzCore.h> #include "GLConsts.h" -#include "GLContextCGL.h" +#ifdef XP_MACOSX +# include "GLContextCGL.h" +#else +# include "GLContextEAGL.h" +#endif #include "gfxMacUtils.h" #include "nsPrintfCString.h" #include "mozilla/Assertions.h" @@ -223,6 +229,7 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateNV12OrP010Surface( surfaceRef.get(), CFSTR("IOSurfaceTransferFunction"), gfxMacUtils::CFStringForTransferFunction(aTransferFunction)); +#ifdef XP_MACOSX // Override the color space to be the same as the main display, so that // CoreAnimation won't try to do any color correction (from the IOSurface // space, to the display). In the future we may want to try specifying this @@ -234,6 +241,7 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateNV12OrP010Surface( CGColorSpaceCopyICCData(colorSpace.get())); IOSurfaceSetValue(surfaceRef.get(), CFSTR("IOSurfaceColorSpace"), colorData.get()); +#endif RefPtr<MacIOSurface> ioSurface = new MacIOSurface(std::move(surfaceRef), false, aColorSpace); @@ -285,6 +293,8 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateYUV422Surface( IOSurfaceSetValue(surfaceRef.get(), CFSTR("IOSurfaceYCbCrMatrix"), CFSTR("ITU_R_709_2")); } + +#ifdef XP_MACOSX // Override the color space to be the same as the main display, so that // CoreAnimation won't try to do any color correction (from the IOSurface // space, to the display). In the future we may want to try specifying this @@ -296,6 +306,7 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateYUV422Surface( CGColorSpaceCopyICCData(colorSpace.get())); IOSurfaceSetValue(surfaceRef.get(), CFSTR("IOSurfaceColorSpace"), colorData.get()); +#endif RefPtr<MacIOSurface> ioSurface = new MacIOSurface(std::move(surfaceRef), false, aColorSpace); @@ -482,19 +493,10 @@ ColorDepth MacIOSurface::GetColorDepth() const { } } -CGLError MacIOSurface::CGLTexImageIOSurface2D(CGLContextObj ctx, GLenum target, - GLenum internalFormat, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - GLuint plane) const { - return ::CGLTexImageIOSurface2D(ctx, target, internalFormat, width, height, - format, type, mIOSurfaceRef.get(), plane); -} - -CGLError MacIOSurface::CGLTexImageIOSurface2D( - mozilla::gl::GLContext* aGL, CGLContextObj ctx, size_t plane, - mozilla::gfx::SurfaceFormat* aOutReadFormat) { - MOZ_ASSERT(plane >= 0); +bool MacIOSurface::BindTexImage(mozilla::gl::GLContext* aGL, size_t aPlane, + mozilla::gfx::SurfaceFormat* aOutReadFormat) { +#ifdef XP_MACOSX + MOZ_ASSERT(aPlane >= 0); bool isCompatibilityProfile = aGL->IsCompatibilityProfile(); OSType pixelFormat = GetPixelFormat(); @@ -504,12 +506,12 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( if (pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange || pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) { MOZ_ASSERT(GetPlaneCount() == 2); - MOZ_ASSERT(plane < 2); + MOZ_ASSERT(aPlane < 2); // The LOCAL_GL_LUMINANCE and LOCAL_GL_LUMINANCE_ALPHA are the deprecated // format. So, use LOCAL_GL_RED and LOCAL_GL_RB if we use core profile. // https://www.khronos.org/opengl/wiki/Image_Format#Legacy_Image_Formats - if (plane == 0) { + if (aPlane == 0) { internalFormat = format = (isCompatibilityProfile) ? (LOCAL_GL_LUMINANCE) : (LOCAL_GL_RED); } else { @@ -523,12 +525,12 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( } else if (pixelFormat == kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange || pixelFormat == kCVPixelFormatType_420YpCbCr10BiPlanarFullRange) { MOZ_ASSERT(GetPlaneCount() == 2); - MOZ_ASSERT(plane < 2); + MOZ_ASSERT(aPlane < 2); // The LOCAL_GL_LUMINANCE and LOCAL_GL_LUMINANCE_ALPHA are the deprecated // format. So, use LOCAL_GL_RED and LOCAL_GL_RB if we use core profile. // https://www.khronos.org/opengl/wiki/Image_Format#Legacy_Image_Formats - if (plane == 0) { + if (aPlane == 0) { internalFormat = format = (isCompatibilityProfile) ? (LOCAL_GL_LUMINANCE) : (LOCAL_GL_RED); } else { @@ -541,7 +543,7 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( } } else if (pixelFormat == kCVPixelFormatType_422YpCbCr8_yuvs || pixelFormat == kCVPixelFormatType_422YpCbCr8FullRange) { - MOZ_ASSERT(plane == 0); + MOZ_ASSERT(aPlane == 0); // The YCBCR_422_APPLE ext is only available in compatibility profile. So, // we should use RGB_422_APPLE for core profile. The difference between // YCBCR_422_APPLE and RGB_422_APPLE is that the YCBCR_422_APPLE converts @@ -565,7 +567,7 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( internalFormat = LOCAL_GL_RGB; type = LOCAL_GL_UNSIGNED_SHORT_8_8_REV_APPLE; } else { - MOZ_ASSERT(plane == 0); + MOZ_ASSERT(aPlane == 0); internalFormat = HasAlpha() ? LOCAL_GL_RGBA : LOCAL_GL_RGB; format = LOCAL_GL_BGRA; @@ -576,10 +578,13 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( } } - auto err = - CGLTexImageIOSurface2D(ctx, LOCAL_GL_TEXTURE_RECTANGLE_ARB, - internalFormat, GetDevicePixelWidth(plane), - GetDevicePixelHeight(plane), format, type, plane); + size_t width = GetDevicePixelWidth(aPlane); + size_t height = GetDevicePixelHeight(aPlane); + + auto err = ::CGLTexImageIOSurface2D( + gl::GLContextCGL::Cast(aGL)->GetCGLContext(), + LOCAL_GL_TEXTURE_RECTANGLE_ARB, internalFormat, width, height, format, + type, mIOSurfaceRef.get(), aPlane); if (err) { const auto formatChars = (const char*)&pixelFormat; const char formatStr[] = {formatChars[3], formatChars[2], formatChars[1], @@ -587,13 +592,15 @@ CGLError MacIOSurface::CGLTexImageIOSurface2D( const nsPrintfCString errStr( "CGLTexImageIOSurface2D(context, target, 0x%04x," " %u, %u, 0x%04x, 0x%04x, iosurfPtr, %u) -> %i", - internalFormat, uint32_t(GetDevicePixelWidth(plane)), - uint32_t(GetDevicePixelHeight(plane)), format, type, - (unsigned int)plane, err); + internalFormat, uint32_t(width), uint32_t(height), format, type, + (unsigned int)aPlane, err); gfxCriticalError() << errStr.get() << " (iosurf format: " << formatStr << ")"; } - return err; + return !err; +#else + MOZ_CRASH("unimplemented"); +#endif } void MacIOSurface::SetColorSpace(const mozilla::gfx::ColorSpace2 cs) const { diff --git a/gfx/2d/MacIOSurface.h b/gfx/2d/MacIOSurface.h index ef176430d1..d0ee3baeef 100644 --- a/gfx/2d/MacIOSurface.h +++ b/gfx/2d/MacIOSurface.h @@ -8,7 +8,7 @@ #define MacIOSurface_h__ #ifdef XP_DARWIN # include <CoreVideo/CoreVideo.h> -# include <IOSurface/IOSurface.h> +# include <IOSurface/IOSurfaceRef.h> # include <QuartzCore/QuartzCore.h> # include <dlfcn.h> @@ -21,20 +21,19 @@ class GLContext; } } // namespace mozilla +# ifdef XP_MACOSX struct _CGLContextObject; typedef _CGLContextObject* CGLContextObj; -typedef uint32_t IOSurfaceID; - -# ifdef XP_IOS -typedef kern_return_t IOReturn; -typedef int CGLError; # endif +typedef uint32_t IOSurfaceID; # ifdef XP_MACOSX # import <OpenGL/OpenGL.h> # else -# import <OpenGLES/ES2/gl.h> +# include "GLTypes.h" +typedef realGLboolean GLboolean; +# include <OpenGLES/ES2/gl.h> # endif # include "2D.h" @@ -123,15 +122,15 @@ class MacIOSurface final return mozilla::gfx::ColorRange::LIMITED; } - // We would like to forward declare NSOpenGLContext, but it is an @interface - // and this file is also used from c++, so we use a void *. - CGLError CGLTexImageIOSurface2D( - mozilla::gl::GLContext* aGL, CGLContextObj ctxt, size_t plane, - mozilla::gfx::SurfaceFormat* aOutReadFormat = nullptr); - CGLError CGLTexImageIOSurface2D(CGLContextObj ctxt, GLenum target, - GLenum internalFormat, GLsizei width, - GLsizei height, GLenum format, GLenum type, - GLuint plane) const; + // Bind this IOSurface to a texture using the most efficient mechanism + // available on the current platform. + // + // Note that on iOS simulator, due to incomplete support for + // texImageIOSurface, this will only use texImage2D to upload, and cannot be + // used to read-back the GL texture to an IOSurface. + bool BindTexImage(mozilla::gl::GLContext* aGL, size_t aPlane, + mozilla::gfx::SurfaceFormat* aOutReadFormat = nullptr); + already_AddRefed<SourceSurface> GetAsSurface(); // Creates a DrawTarget that wraps the data in the IOSurface. Rendering to diff --git a/gfx/2d/ScaledFontMac.cpp b/gfx/2d/ScaledFontMac.cpp index 9528b3527e..7ac1cfc9c9 100644 --- a/gfx/2d/ScaledFontMac.cpp +++ b/gfx/2d/ScaledFontMac.cpp @@ -7,7 +7,9 @@ #include "ScaledFontMac.h" #include "UnscaledFontMac.h" #include "mozilla/webrender/WebRenderTypes.h" -#include "nsCocoaFeatures.h" +#ifdef MOZ_WIDGET_COCOA +# include "nsCocoaFeatures.h" +#endif #include "PathSkia.h" #include "skia/include/core/SkPaint.h" #include "skia/include/core/SkPath.h" @@ -73,6 +75,7 @@ class AutoRelease final { CTFontRef CreateCTFontFromCGFontWithVariations(CGFontRef aCGFont, CGFloat aSize, bool aInstalledFont, CTFontDescriptorRef aFontDesc) { +#ifdef MOZ_WIDGET_COCOA // New implementation (see bug 1856035) for macOS 13+. if (nsCocoaFeatures::OnVenturaOrLater()) { // Create CTFont, applying any descriptor that was passed (used by @@ -96,6 +99,7 @@ CTFontRef CreateCTFontFromCGFontWithVariations(CGFontRef aCGFont, CGFloat aSize, // No variations to set, just return the default CTFont. return ctFont.forget(); } +#endif // Older implementation used up to macOS 12. CTFontRef ctFont; diff --git a/gfx/2d/moz.build b/gfx/2d/moz.build index c04530c72b..d1408b9dc9 100644 --- a/gfx/2d/moz.build +++ b/gfx/2d/moz.build @@ -69,6 +69,7 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("cocoa", "uikit"): "UnscaledFontMac.h", ] UNIFIED_SOURCES += [ + "MacIOSurface.cpp", "NativeFontResourceMac.cpp", "ScaledFontMac.cpp", ] @@ -188,11 +189,6 @@ SOURCES += [ "InlineTranslator.cpp", ] -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa": - SOURCES += [ - "MacIOSurface.cpp", - ] - if CONFIG["TARGET_CPU"] == "aarch64" or CONFIG["BUILD_ARM_NEON"]: SOURCES += [ "BlurNEON.cpp", |