/work/obj-fuzz/dist/include/mozilla/gfx/Matrix.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #ifndef MOZILLA_GFX_MATRIX_H_ |
8 | | #define MOZILLA_GFX_MATRIX_H_ |
9 | | |
10 | | #include "Types.h" |
11 | | #include "Triangle.h" |
12 | | #include "Rect.h" |
13 | | #include "Point.h" |
14 | | #include "Quaternion.h" |
15 | | #include <iosfwd> |
16 | | #include <math.h> |
17 | | #include "mozilla/Attributes.h" |
18 | | #include "mozilla/DebugOnly.h" |
19 | | #include "mozilla/FloatingPoint.h" |
20 | | |
21 | | namespace mozilla { |
22 | | namespace gfx { |
23 | | |
24 | 0 | static inline bool FuzzyEqual(Float aV1, Float aV2) { |
25 | 0 | // XXX - Check if fabs does the smart thing and just negates the sign bit. |
26 | 0 | return fabs(aV2 - aV1) < 1e-6; |
27 | 0 | } Unexecuted instantiation: SandboxBroker.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SandboxBrokerPolicyFactory.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SandboxCrash.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SandboxPrefBridge.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SandboxLaunch.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_base1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_base2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_ds1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_io0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_io1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: IdleTaskRunner.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_threads0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_threads1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_threads2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: xptdata.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_chrome0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_build0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_modules_libpref0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: hnjstdio.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_intl_locale0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_intl_strres0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_unicharutil_util0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_intl_l10n0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_base1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_base2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_base3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsCookieService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_cookie0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_dns0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_cache21.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_about0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_data0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_file0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_protocol_ftp0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsHttpChannelAuthProvider.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsHttpHandler.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_http0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_http1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_http2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_protocol_res0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_viewsource0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_websocket0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_protocol_wyciwyg0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DataChannel.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsNetModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ipc_chromium0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ipc_chromium1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ipc_chromium2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BackgroundChildImpl.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BackgroundParentImpl.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: FileDescriptorSetChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: FileDescriptorSetParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ipc_glue0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ipc_glue1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols10.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols12.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols13.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols14.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols15.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols16.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols17.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols18.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols19.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols20.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols21.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols22.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols23.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols24.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols25.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols26.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols27.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols28.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols29.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols30.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols31.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedProtocols9.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: IPCMessageTypeName.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TestShellChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TestShellParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: XPCShellEnvironment.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_js_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Hal.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_hal0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: XrayWrapper.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpconnect_wrappers0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: mozJSComponentLoader.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_js_xpconnect_loader0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_js_xpconnect_src0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_js_xpconnect_src1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_modules_libjar0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_storage0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_extensions_cookie0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_permissions0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_src_media-conduit0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_src_mediapipeline0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_src_peerconnection0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nr_socket_prsock.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_media_mtransport_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_uriloader_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsOSHelperAppService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_uriloader_exthandler0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_uriloader_prefetch0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BasePrincipal.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_caps0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_parser_htmlparser0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_parser_html0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_parser_html1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_parser_html2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: JobScheduler_posix.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ScaledFontFontconfig.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_ycbcr0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsDeviceContext.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_src0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: GLContextProviderGLX.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SharedSurfaceGLX.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: SkiaGLGlue.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_gl0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_gl1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ImageContainer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PersistentBufferProvider.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BasicImageLayer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TextureClientX11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: X11BasicCompositor.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: X11TextureSourceBasic.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: X11TextureHost.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: X11TextureSourceOGL.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: WebRenderTextureHost.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_layers9.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PrintTarget.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PrintTargetPDF.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PrintTargetPS.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PrintTargetSkPDF.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PrintTargetThebes.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxASurface.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxDrawable.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxFT2FontBase.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxFT2Utils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxFcPlatformFontList.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxFontUtils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxGdkNativeRenderer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxPlatform.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxPlatformGtk.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxPrefs.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxXlibNativeRenderer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxXlibSurface.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_thebes0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_thebes1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: GPUParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VRDisplayHost.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VRDisplayLocal.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxVRExternal.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxVROpenVR.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: gfxVRPuppet.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_vr0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_vr1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_vr_service0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_config0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_webrender_bindings0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsImageModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image_decoders0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsIconChannel.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image_decoders_icon0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsPNGEncoder.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_abort0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_animation0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DOMIntersectionObserver.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsContentUtils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsDOMWindowUtils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsFrameMessageManager.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsGlobalWindowInner.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsGlobalWindowOuter.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsImageLoadingContent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsObjectLoadingContent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsPluginArray.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RegisterBindings.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RegisterWorkerBindings.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RegisterWorkerDebuggerBindings.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RegisterWorkletBindings.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ResolveSystemBinding.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnionTypes.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings10.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings12.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings13.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings14.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings15.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings16.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings17.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings18.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings19.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings20.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings21.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings22.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings23.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UnifiedBindings9.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: StructuredClone.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BatteryManager.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: BrowserElementParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_cache0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_cache1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ImageUtils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_canvas6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_webgpu0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_webgpu1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_clients_api0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_clients_manager0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_clients_manager1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_commandhandler0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_credentialmanagement0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_crypto0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_encoding0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: EventStateManager.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_events0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_events1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_events2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_events3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_fetch0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_file0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_file_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_file_uri0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_filehandle0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_filesystem0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_filesystem_compat0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_gamepad0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PositionError.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsGeolocation.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AutoplayPermissionManager.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AutoplayPermissionRequest.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PluginDocument.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_html_input0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_jsurl0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AsmJSCache.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_mathml0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: CubebUtils.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DecoderTraits.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media10.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media11.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media9.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_eme0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_encoder0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_flac0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_gmp0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_gmp1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_gmp2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_media_imagecapture0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RemoteVideoDecoder.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VideoDecoderChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VideoDecoderManagerChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VideoDecoderManagerParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VideoDecoderParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_mediacapabilities0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_mediasink0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_media_mediasource0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_mp30.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_ogg0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_platforms0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_agnostic_eme0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_agnostic_gmp0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_media_platforms_omx0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: FFVPXRuntimeLinker.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_ffvpx0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_platforms_ffmpeg0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_libav530.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_libav540.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_libav550.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_ffmpeg570.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ffmpeg_ffmpeg580.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_systemservices0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_wave0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AudioNodeEngineSSE2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_webaudio0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_webaudio1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_webaudio2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_webaudio_blink0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_webm0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: MediaEngineWebRTC.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_webrtc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_webspeech_synth0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_synth_speechd0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_recognition0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_mp40.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: MediaModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_midi0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_midi1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_notification0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_offline0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_power0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_push0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_quota0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_security0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_storage0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg5.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_network0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_permission0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsNPAPIPlugin.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsPluginHost.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_plugins_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: PluginInstanceChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_plugins_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_plugins_ipc1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ActorsParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_indexedDB0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_indexedDB1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_system0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ContentChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ProcessHangMonitor.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_ipc1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_workers0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_workers1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_audiochannel0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_broadcastchannel0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_messagechannel0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_promise0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_smil0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_smil1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_url0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_webauthn0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xbl0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xbl1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xml0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xml0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xpath0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xpath1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xpath2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xslt0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xslt_xslt1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_vr0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_u2f0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_console0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_performance0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_webbrowserpersist0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_xhr0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_worklet0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_script0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_payments0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_payments_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_websocket0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_serviceworkers0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_serviceworkers1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_serviceworkers2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_simpledb0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_prio0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_presentation0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_presentation1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_view0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: WindowSurfaceX11SHM.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsBaseDragService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsBaseWidget.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsShmImage.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget_headless0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsWindow.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget_gtk0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget_gtk1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_widget_gtk2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_editor_libeditor0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_editor_libeditor1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_editor_libeditor2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_editor_spellchecker0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_editor_composer0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsLayoutStylesheetCache.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_style1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_style3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_style4.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsRefreshDriver.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_base2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsPluginFrame.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_forms0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_tables0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VsyncChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: VsyncParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_inspector0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_printing0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_build0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_base_timeline0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_docshell_shistory0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsDocShellModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpfe_appshell0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AccessibleWrap.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ApplicationAccessibleWrap.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: AtkSocketAccessible.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DOMtoATK.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DocAccessibleWrap.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Platform.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: RootAccessibleWrap.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: UtilInterface.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiHyperlink.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceAction.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceComponent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceDocument.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceEditableText.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceHyperlinkImpl.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceHypertext.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceImage.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceSelection.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceTable.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceTableCell.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceText.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsMaiInterfaceValue.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_aom0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_base0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_base1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_generic0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DocAccessibleChild.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ProxyAccessible.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_xpcom0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_accessible_xul0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_tools_profiler0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_hunspell_glue0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_spellcheck_src0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_security_manager_ssl0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_security_manager_ssl1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_security_manager_ssl2.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsDBusRemoteService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsGTKRemoteService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsXRemoteService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_components_alerts0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_antitracking0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_ackgroundhangmonitor0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_components_browser0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsWebBrowserModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_clearsitedata0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: DownloadPlatform.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_extensions0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_webrequest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_components_find0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_perfmonitoring0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_components_places0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_reputationservice0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_resistfingerprinting0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_sessionstore0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Telemetry.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryEvent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryHistogram.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryScalar.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryIPC.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryIPCAccumulator.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TelemetryGeckoViewPersistence.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: CombinedStacks.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsTypeAheadFind.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsUrlClassifierStreamUpdater.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_url-classifier0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_windowwatcher0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_autocomplete0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_printingui_ipc0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsFormFillController.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsToolkitCompsModule.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_mozapps_extensions0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_toolkit_recordreplay0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsAppRunner.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsEmbedFunctions.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_toolkit_xre0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_pref_autoconfig_src0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: FileDescriptorOutputStream.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: HeapSnapshot.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: HeapSnapshotTempFileHelperParent.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsAlertsIconListener.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: ProtocolFuzzer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: nsGNOMEShellService.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TestBroker.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_tests_gtest1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_xpcom_tests_gtest3.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_test0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_netwerk_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: mediaconduit_unittests.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: mediapipeline_unittest.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: videoconduit_unittests.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_apz_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_tests_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TestDownscalingFilterNoSkia.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_image_test_gtest1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: TestDecoders.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_base_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_dom_media_gtest1.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_security_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: csp_fuzzer.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: content_parent_ipc_libfuzz.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_style_test_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_layout_base_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_tests_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_tests0.cpp:mozilla::gfx::FuzzyEqual(float, float) Unexecuted instantiation: Unified_cpp_geckoview_gtest0.cpp:mozilla::gfx::FuzzyEqual(float, float) |
28 | | |
29 | | template<class T> |
30 | | class BaseMatrix |
31 | | { |
32 | | // Alias that maps to either Point or PointDouble depending on whether T is a |
33 | | // float or a double. |
34 | | typedef PointTyped<UnknownUnits, T> MatrixPoint; |
35 | | // Same for size and rect |
36 | | typedef SizeTyped<UnknownUnits, T> MatrixSize; |
37 | | typedef RectTyped<UnknownUnits, T> MatrixRect; |
38 | | |
39 | | public: |
40 | | BaseMatrix() |
41 | | : _11(1.0f), _12(0) |
42 | | , _21(0), _22(1.0f) |
43 | | , _31(0), _32(0) |
44 | | {} |
45 | | BaseMatrix(T a11, T a12, T a21, T a22, T a31, T a32) |
46 | | : _11(a11), _12(a12) |
47 | | , _21(a21), _22(a22) |
48 | | , _31(a31), _32(a32) |
49 | 0 | {} |
50 | | union { |
51 | | struct { |
52 | | T _11, _12; |
53 | | T _21, _22; |
54 | | T _31, _32; |
55 | | }; |
56 | | T components[6]; |
57 | | }; |
58 | | |
59 | | MOZ_ALWAYS_INLINE BaseMatrix Copy() const |
60 | 0 | { |
61 | 0 | return BaseMatrix<T>(*this); |
62 | 0 | } |
63 | | |
64 | | friend std::ostream& operator<<(std::ostream& aStream, const BaseMatrix& aMatrix) |
65 | | { |
66 | | return aStream << "[ " << aMatrix._11 |
67 | | << " " << aMatrix._12 |
68 | | << "; " << aMatrix._21 |
69 | | << " " << aMatrix._22 |
70 | | << "; " << aMatrix._31 |
71 | | << " " << aMatrix._32 |
72 | | << "; ]"; |
73 | | } |
74 | | |
75 | | MatrixPoint TransformPoint(const MatrixPoint &aPoint) const |
76 | 0 | { |
77 | 0 | MatrixPoint retPoint; |
78 | 0 |
|
79 | 0 | retPoint.x = aPoint.x * _11 + aPoint.y * _21 + _31; |
80 | 0 | retPoint.y = aPoint.x * _12 + aPoint.y * _22 + _32; |
81 | 0 |
|
82 | 0 | return retPoint; |
83 | 0 | } |
84 | | |
85 | | MatrixSize TransformSize(const MatrixSize &aSize) const |
86 | 0 | { |
87 | 0 | MatrixSize retSize; |
88 | 0 |
|
89 | 0 | retSize.width = aSize.width * _11 + aSize.height * _21; |
90 | 0 | retSize.height = aSize.width * _12 + aSize.height * _22; |
91 | 0 |
|
92 | 0 | return retSize; |
93 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::TransformSize(mozilla::gfx::SizeTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::TransformSize(mozilla::gfx::SizeTyped<mozilla::gfx::UnknownUnits, double> const&) const |
94 | | |
95 | | /** |
96 | | * In most cases you probably want to use TransformBounds. This function |
97 | | * just transforms the top-left and size separately and constructs a rect |
98 | | * from those results. |
99 | | */ |
100 | | MatrixRect TransformRect(const MatrixRect& aRect) const |
101 | 0 | { |
102 | 0 | return MatrixRect(TransformPoint(aRect.TopLeft()), |
103 | 0 | TransformSize(aRect.Size())); |
104 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::TransformRect(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::TransformRect(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&) const |
105 | | |
106 | | GFX2D_API MatrixRect TransformBounds(const MatrixRect& aRect) const |
107 | 0 | { |
108 | 0 | int i; |
109 | 0 | MatrixPoint quad[4]; |
110 | 0 | T min_x, max_x; |
111 | 0 | T min_y, max_y; |
112 | 0 |
|
113 | 0 | quad[0] = TransformPoint(aRect.TopLeft()); |
114 | 0 | quad[1] = TransformPoint(aRect.TopRight()); |
115 | 0 | quad[2] = TransformPoint(aRect.BottomLeft()); |
116 | 0 | quad[3] = TransformPoint(aRect.BottomRight()); |
117 | 0 |
|
118 | 0 | min_x = max_x = quad[0].x; |
119 | 0 | min_y = max_y = quad[0].y; |
120 | 0 |
|
121 | 0 | for (i = 1; i < 4; i++) { |
122 | 0 | if (quad[i].x < min_x) |
123 | 0 | min_x = quad[i].x; |
124 | 0 | if (quad[i].x > max_x) |
125 | 0 | max_x = quad[i].x; |
126 | 0 |
|
127 | 0 | if (quad[i].y < min_y) |
128 | 0 | min_y = quad[i].y; |
129 | 0 | if (quad[i].y > max_y) |
130 | 0 | max_y = quad[i].y; |
131 | 0 | } |
132 | 0 |
|
133 | 0 | return MatrixRect(min_x, min_y, max_x - min_x, max_y - min_y); |
134 | 0 | } |
135 | | |
136 | | static BaseMatrix<T> Translation(T aX, T aY) |
137 | 0 | { |
138 | 0 | return BaseMatrix<T>(1.0f, 0.0f, 0.0f, 1.0f, aX, aY); |
139 | 0 | } |
140 | | |
141 | | static BaseMatrix<T> Translation(MatrixPoint aPoint) |
142 | 0 | { |
143 | 0 | return Translation(aPoint.x, aPoint.y); |
144 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::Translation(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float>) Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::Translation(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double>) |
145 | | |
146 | | /** |
147 | | * Apply a translation to this matrix. |
148 | | * |
149 | | * The "Pre" in this method's name means that the translation is applied |
150 | | * -before- this matrix's existing transformation. That is, any vector that |
151 | | * is multiplied by the resulting matrix will first be translated, then be |
152 | | * transformed by the original transform. |
153 | | * |
154 | | * Calling this method will result in this matrix having the same value as |
155 | | * the result of: |
156 | | * |
157 | | * BaseMatrix<T>::Translation(x, y) * this |
158 | | * |
159 | | * (Note that in performance critical code multiplying by the result of a |
160 | | * Translation()/Scaling() call is not recommended since that results in a |
161 | | * full matrix multiply involving 12 floating-point multiplications. Calling |
162 | | * this method would be preferred since it only involves four floating-point |
163 | | * multiplications.) |
164 | | */ |
165 | | BaseMatrix<T> &PreTranslate(T aX, T aY) |
166 | 0 | { |
167 | 0 | _31 += _11 * aX + _21 * aY; |
168 | 0 | _32 += _12 * aX + _22 * aY; |
169 | 0 |
|
170 | 0 | return *this; |
171 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::PreTranslate(double, double) Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::PreTranslate(float, float) |
172 | | |
173 | | BaseMatrix<T> &PreTranslate(const MatrixPoint &aPoint) |
174 | 0 | { |
175 | 0 | return PreTranslate(aPoint.x, aPoint.y); |
176 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::PreTranslate(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> const&) Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::PreTranslate(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> const&) |
177 | | |
178 | | /** |
179 | | * Similar to PreTranslate, but the translation is applied -after- this |
180 | | * matrix's existing transformation instead of before it. |
181 | | * |
182 | | * This method is generally less used than PreTranslate since typically code |
183 | | * want to adjust an existing user space to device space matrix to create a |
184 | | * transform to device space from a -new- user space (translated from the |
185 | | * previous user space). In that case consumers will need to use the Pre* |
186 | | * variants of the matrix methods rather than using the Post* methods, since |
187 | | * the Post* methods add a transform to the device space end of the |
188 | | * transformation. |
189 | | */ |
190 | | BaseMatrix<T> &PostTranslate(T aX, T aY) |
191 | | { |
192 | | _31 += aX; |
193 | | _32 += aY; |
194 | | return *this; |
195 | | } |
196 | | |
197 | | BaseMatrix<T> &PostTranslate(const MatrixPoint &aPoint) |
198 | | { |
199 | | return PostTranslate(aPoint.x, aPoint.y); |
200 | | } |
201 | | |
202 | | static BaseMatrix<T> Scaling(T aScaleX, T aScaleY) |
203 | 0 | { |
204 | 0 | return BaseMatrix<T>(aScaleX, 0.0f, 0.0f, aScaleY, 0.0f, 0.0f); |
205 | 0 | } |
206 | | |
207 | | /** |
208 | | * Similar to PreTranslate, but applies a scale instead of a translation. |
209 | | */ |
210 | | BaseMatrix<T> &PreScale(T aX, T aY) |
211 | 0 | { |
212 | 0 | _11 *= aX; |
213 | 0 | _12 *= aX; |
214 | 0 | _21 *= aY; |
215 | 0 | _22 *= aY; |
216 | 0 |
|
217 | 0 | return *this; |
218 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::PreScale(double, double) Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::PreScale(float, float) |
219 | | |
220 | | /** |
221 | | * Similar to PostTranslate, but applies a scale instead of a translation. |
222 | | */ |
223 | | BaseMatrix<T> &PostScale(T aScaleX, T aScaleY) |
224 | 0 | { |
225 | 0 | _11 *= aScaleX; |
226 | 0 | _12 *= aScaleY; |
227 | 0 | _21 *= aScaleX; |
228 | 0 | _22 *= aScaleY; |
229 | 0 | _31 *= aScaleX; |
230 | 0 | _32 *= aScaleY; |
231 | 0 |
|
232 | 0 | return *this; |
233 | 0 | } |
234 | | |
235 | | GFX2D_API static BaseMatrix<T> Rotation(T aAngle); |
236 | | |
237 | | /** |
238 | | * Similar to PreTranslate, but applies a rotation instead of a translation. |
239 | | */ |
240 | | BaseMatrix<T> &PreRotate(T aAngle) |
241 | 0 | { |
242 | 0 | return *this = BaseMatrix<T>::Rotation(aAngle) * *this; |
243 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::PreRotate(double) Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::PreRotate(float) |
244 | | |
245 | | bool Invert() |
246 | 0 | { |
247 | 0 | // Compute co-factors. |
248 | 0 | T A = _22; |
249 | 0 | T B = -_21; |
250 | 0 | T C = _21 * _32 - _22 * _31; |
251 | 0 | T D = -_12; |
252 | 0 | T E = _11; |
253 | 0 | T F = _31 * _12 - _11 * _32; |
254 | 0 |
|
255 | 0 | T det = Determinant(); |
256 | 0 |
|
257 | 0 | if (!det) { |
258 | 0 | return false; |
259 | 0 | } |
260 | 0 | |
261 | 0 | T inv_det = 1 / det; |
262 | 0 |
|
263 | 0 | _11 = inv_det * A; |
264 | 0 | _12 = inv_det * D; |
265 | 0 | _21 = inv_det * B; |
266 | 0 | _22 = inv_det * E; |
267 | 0 | _31 = inv_det * C; |
268 | 0 | _32 = inv_det * F; |
269 | 0 |
|
270 | 0 | return true; |
271 | 0 | } |
272 | | |
273 | | BaseMatrix<T> Inverse() const |
274 | | { |
275 | | BaseMatrix<T> clone = *this; |
276 | | DebugOnly<bool> inverted = clone.Invert(); |
277 | | MOZ_ASSERT(inverted, "Attempted to get the inverse of a non-invertible matrix"); |
278 | | return clone; |
279 | | } |
280 | | |
281 | | T Determinant() const |
282 | 0 | { |
283 | 0 | return _11 * _22 - _12 * _21; |
284 | 0 | } |
285 | | |
286 | | BaseMatrix<T> operator*(const BaseMatrix<T> &aMatrix) const |
287 | 0 | { |
288 | 0 | BaseMatrix<T> resultMatrix; |
289 | 0 |
|
290 | 0 | resultMatrix._11 = this->_11 * aMatrix._11 + this->_12 * aMatrix._21; |
291 | 0 | resultMatrix._12 = this->_11 * aMatrix._12 + this->_12 * aMatrix._22; |
292 | 0 | resultMatrix._21 = this->_21 * aMatrix._11 + this->_22 * aMatrix._21; |
293 | 0 | resultMatrix._22 = this->_21 * aMatrix._12 + this->_22 * aMatrix._22; |
294 | 0 | resultMatrix._31 = this->_31 * aMatrix._11 + this->_32 * aMatrix._21 + aMatrix._31; |
295 | 0 | resultMatrix._32 = this->_31 * aMatrix._12 + this->_32 * aMatrix._22 + aMatrix._32; |
296 | 0 |
|
297 | 0 | return resultMatrix; |
298 | 0 | } |
299 | | |
300 | | BaseMatrix<T>& operator*=(const BaseMatrix<T> &aMatrix) |
301 | 0 | { |
302 | 0 | *this = *this * aMatrix; |
303 | 0 | return *this; |
304 | 0 | } |
305 | | |
306 | | /** |
307 | | * Multiplies *this with aMatrix and returns the result. |
308 | | */ |
309 | | Matrix4x4 operator*(const Matrix4x4& aMatrix) const; |
310 | | |
311 | | /** |
312 | | * Multiplies in the opposite order to operator=*. |
313 | | */ |
314 | | BaseMatrix<T> &PreMultiply(const BaseMatrix<T> &aMatrix) |
315 | 0 | { |
316 | 0 | *this = aMatrix * *this; |
317 | 0 | return *this; |
318 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::PreMultiply(mozilla::gfx::BaseMatrix<float> const&) Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::PreMultiply(mozilla::gfx::BaseMatrix<double> const&) |
319 | | |
320 | | /** |
321 | | * Please explicitly use either FuzzyEquals or ExactlyEquals. |
322 | | */ |
323 | | bool operator==(const BaseMatrix<T>& other) const = delete; |
324 | | bool operator!=(const BaseMatrix<T>& other) const = delete; |
325 | | |
326 | | /* Returns true if the other matrix is fuzzy-equal to this matrix. |
327 | | * Note that this isn't a cheap comparison! |
328 | | */ |
329 | | bool FuzzyEquals(const BaseMatrix<T>& o) const |
330 | 0 | { |
331 | 0 | return FuzzyEqual(_11, o._11) && FuzzyEqual(_12, o._12) && |
332 | 0 | FuzzyEqual(_21, o._21) && FuzzyEqual(_22, o._22) && |
333 | 0 | FuzzyEqual(_31, o._31) && FuzzyEqual(_32, o._32); |
334 | 0 | } |
335 | | |
336 | | bool ExactlyEquals(const BaseMatrix<T>& o) const |
337 | | { |
338 | | return _11 == o._11 && _12 == o._12 && |
339 | | _21 == o._21 && _22 == o._22 && |
340 | | _31 == o._31 && _32 == o._32; |
341 | | } |
342 | | |
343 | | /* Verifies that the matrix contains no Infs or NaNs. */ |
344 | | bool IsFinite() const |
345 | 0 | { |
346 | 0 | return mozilla::IsFinite(_11) && mozilla::IsFinite(_12) && |
347 | 0 | mozilla::IsFinite(_21) && mozilla::IsFinite(_22) && |
348 | 0 | mozilla::IsFinite(_31) && mozilla::IsFinite(_32); |
349 | 0 | } |
350 | | |
351 | | /* Returns true if the matrix is a rectilinear transformation (i.e. |
352 | | * grid-aligned rectangles are transformed to grid-aligned rectangles) |
353 | | */ |
354 | | bool IsRectilinear() const { |
355 | | if (FuzzyEqual(_12, 0) && FuzzyEqual(_21, 0)) { |
356 | | return true; |
357 | | } else if (FuzzyEqual(_22, 0) && FuzzyEqual(_11, 0)) { |
358 | | return true; |
359 | | } |
360 | | |
361 | | return false; |
362 | | } |
363 | | |
364 | | /** |
365 | | * Returns true if the matrix is anything other than a straight |
366 | | * translation by integers. |
367 | | */ |
368 | 0 | bool HasNonIntegerTranslation() const { |
369 | 0 | return HasNonTranslation() || |
370 | 0 | !FuzzyEqual(_31, floor(_31 + T(0.5))) || |
371 | 0 | !FuzzyEqual(_32, floor(_32 + T(0.5))); |
372 | 0 | } |
373 | | |
374 | | /** |
375 | | * Returns true if the matrix only has an integer translation. |
376 | | */ |
377 | | bool HasOnlyIntegerTranslation() const { |
378 | | return !HasNonIntegerTranslation(); |
379 | | } |
380 | | |
381 | | /** |
382 | | * Returns true if the matrix has any transform other |
383 | | * than a straight translation. |
384 | | */ |
385 | 0 | bool HasNonTranslation() const { |
386 | 0 | return !FuzzyEqual(_11, 1.0) || !FuzzyEqual(_22, 1.0) || |
387 | 0 | !FuzzyEqual(_12, 0.0) || !FuzzyEqual(_21, 0.0); |
388 | 0 | } |
389 | | |
390 | | /** |
391 | | * Returns true if the matrix has any transform other |
392 | | * than a translation or a -1 y scale (y axis flip) |
393 | | */ |
394 | | bool HasNonTranslationOrFlip() const { |
395 | | return !FuzzyEqual(_11, 1.0) || |
396 | | (!FuzzyEqual(_22, 1.0) && !FuzzyEqual(_22, -1.0)) || |
397 | | !FuzzyEqual(_21, 0.0) || !FuzzyEqual(_12, 0.0); |
398 | | } |
399 | | |
400 | | /* Returns true if the matrix is an identity matrix. |
401 | | */ |
402 | | bool IsIdentity() const |
403 | 0 | { |
404 | 0 | return _11 == 1.0f && _12 == 0.0f && |
405 | 0 | _21 == 0.0f && _22 == 1.0f && |
406 | 0 | _31 == 0.0f && _32 == 0.0f; |
407 | 0 | } |
408 | | |
409 | | /* Returns true if the matrix is singular. |
410 | | */ |
411 | | bool IsSingular() const |
412 | 0 | { |
413 | 0 | T det = Determinant(); |
414 | 0 | return !mozilla::IsFinite(det) || det == 0; |
415 | 0 | } |
416 | | |
417 | | GFX2D_API BaseMatrix<T>& NudgeToIntegers() |
418 | 0 | { |
419 | 0 | NudgeToInteger(&_11); |
420 | 0 | NudgeToInteger(&_12); |
421 | 0 | NudgeToInteger(&_21); |
422 | 0 | NudgeToInteger(&_22); |
423 | 0 | NudgeToInteger(&_31); |
424 | 0 | NudgeToInteger(&_32); |
425 | 0 | return *this; |
426 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::NudgeToIntegers() Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::NudgeToIntegers() |
427 | | |
428 | | bool IsTranslation() const |
429 | 0 | { |
430 | 0 | return FuzzyEqual(_11, 1.0f) && FuzzyEqual(_12, 0.0f) && |
431 | 0 | FuzzyEqual(_21, 0.0f) && FuzzyEqual(_22, 1.0f); |
432 | 0 | } |
433 | | |
434 | | static bool FuzzyIsInteger(T aValue) |
435 | 0 | { |
436 | 0 | return FuzzyEqual(aValue, floorf(aValue + 0.5f)); |
437 | 0 | } |
438 | | |
439 | | bool IsIntegerTranslation() const |
440 | 0 | { |
441 | 0 | return IsTranslation() && FuzzyIsInteger(_31) && FuzzyIsInteger(_32); |
442 | 0 | } |
443 | | |
444 | | bool IsAllIntegers() const |
445 | | { |
446 | | return FuzzyIsInteger(_11) && FuzzyIsInteger(_12) && |
447 | | FuzzyIsInteger(_21) && FuzzyIsInteger(_22) && |
448 | | FuzzyIsInteger(_31) && FuzzyIsInteger(_32); |
449 | | } |
450 | | |
451 | 0 | MatrixPoint GetTranslation() const { |
452 | 0 | return MatrixPoint(_31, _32); |
453 | 0 | } |
454 | | |
455 | | /** |
456 | | * Returns true if matrix is multiple of 90 degrees rotation with flipping, |
457 | | * scaling and translation. |
458 | | */ |
459 | 0 | bool PreservesAxisAlignedRectangles() const { |
460 | 0 | return ((FuzzyEqual(_11, 0.0) && FuzzyEqual(_22, 0.0)) |
461 | 0 | || (FuzzyEqual(_12, 0.0) && FuzzyEqual(_21, 0.0))); |
462 | 0 | } |
463 | | |
464 | | /** |
465 | | * Returns true if the matrix has any transform other |
466 | | * than a translation or scale; this is, if there is |
467 | | * rotation. |
468 | | */ |
469 | 0 | bool HasNonAxisAlignedTransform() const { |
470 | 0 | return !FuzzyEqual(_21, 0.0) || !FuzzyEqual(_12, 0.0); |
471 | 0 | } |
472 | | |
473 | | /** |
474 | | * Returns true if the matrix has negative scaling (i.e. flip). |
475 | | */ |
476 | 0 | bool HasNegativeScaling() const { |
477 | 0 | return (_11 < 0.0) || (_22 < 0.0); |
478 | 0 | } |
479 | | |
480 | | /** |
481 | | * Computes the scale factors of this matrix; that is, |
482 | | * the amounts each basis vector is scaled by. |
483 | | * The xMajor parameter indicates if the larger scale is |
484 | | * to be assumed to be in the X direction or not. |
485 | | */ |
486 | 0 | MatrixSize ScaleFactors(bool xMajor) const { |
487 | 0 | T det = Determinant(); |
488 | 0 |
|
489 | 0 | if (det == 0.0) { |
490 | 0 | return MatrixSize(0.0, 0.0); |
491 | 0 | } |
492 | 0 | |
493 | 0 | MatrixSize sz = xMajor ? MatrixSize(1.0, 0.0) : MatrixSize(0.0, 1.0); |
494 | 0 | sz = TransformSize(sz); |
495 | 0 |
|
496 | 0 | T major = sqrt(sz.width * sz.width + sz.height * sz.height); |
497 | 0 | T minor = 0.0; |
498 | 0 |
|
499 | 0 | // ignore mirroring |
500 | 0 | if (det < 0.0) { |
501 | 0 | det = - det; |
502 | 0 | } |
503 | 0 |
|
504 | 0 | if (major) { |
505 | 0 | minor = det / major; |
506 | 0 | } |
507 | 0 |
|
508 | 0 | if (xMajor) { |
509 | 0 | return MatrixSize(major, minor); |
510 | 0 | } |
511 | 0 | |
512 | 0 | return MatrixSize(minor, major); |
513 | 0 | } Unexecuted instantiation: mozilla::gfx::BaseMatrix<float>::ScaleFactors(bool) const Unexecuted instantiation: mozilla::gfx::BaseMatrix<double>::ScaleFactors(bool) const |
514 | | }; |
515 | | |
516 | | typedef BaseMatrix<Float> Matrix; |
517 | | typedef BaseMatrix<Double> MatrixDouble; |
518 | | |
519 | | // Helper functions used by Matrix4x4Typed defined in Matrix.cpp |
520 | | double |
521 | | SafeTangent(double aTheta); |
522 | | double |
523 | | FlushToZero(double aVal); |
524 | | |
525 | | template<class Units, class F> |
526 | | Point4DTyped<Units, F> |
527 | | ComputePerspectivePlaneIntercept(const Point4DTyped<Units, F>& aFirst, |
528 | | const Point4DTyped<Units, F>& aSecond) |
529 | 0 | { |
530 | 0 | // This function will always return a point with a w value of 0. |
531 | 0 | // The X, Y, and Z components will point towards an infinite vanishing |
532 | 0 | // point. |
533 | 0 |
|
534 | 0 | // We want to interpolate aFirst and aSecond to find the point intersecting |
535 | 0 | // with the w=0 plane. |
536 | 0 |
|
537 | 0 | // Since we know what we want the w component to be, we can rearrange the |
538 | 0 | // interpolation equation and solve for t. |
539 | 0 | float t = -aFirst.w / (aSecond.w - aFirst.w); |
540 | 0 |
|
541 | 0 | // Use t to find the remainder of the components |
542 | 0 | return aFirst + (aSecond - aFirst) * t; |
543 | 0 | } Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> mozilla::gfx::ComputePerspectivePlaneIntercept<mozilla::LayerPixel, float>(mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> const&, mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> const&) Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::ComputePerspectivePlaneIntercept<mozilla::gfx::UnknownUnits, float>(mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, float> const&) Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::ComputePerspectivePlaneIntercept<mozilla::gfx::UnknownUnits, double>(mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> const&, mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> const&) |
544 | | |
545 | | |
546 | | template <typename SourceUnits, typename TargetUnits> |
547 | | class Matrix4x4Typed |
548 | | { |
549 | | public: |
550 | | typedef PointTyped<SourceUnits> SourcePoint; |
551 | | typedef PointTyped<TargetUnits> TargetPoint; |
552 | | typedef Point3DTyped<SourceUnits> SourcePoint3D; |
553 | | typedef Point3DTyped<TargetUnits> TargetPoint3D; |
554 | | typedef Point4DTyped<SourceUnits> SourcePoint4D; |
555 | | typedef Point4DTyped<TargetUnits> TargetPoint4D; |
556 | | typedef RectTyped<SourceUnits> SourceRect; |
557 | | typedef RectTyped<TargetUnits> TargetRect; |
558 | | |
559 | | Matrix4x4Typed() |
560 | | : _11(1.0f), _12(0.0f), _13(0.0f), _14(0.0f) |
561 | | , _21(0.0f), _22(1.0f), _23(0.0f), _24(0.0f) |
562 | | , _31(0.0f), _32(0.0f), _33(1.0f), _34(0.0f) |
563 | | , _41(0.0f), _42(0.0f), _43(0.0f), _44(1.0f) |
564 | 0 | {} Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::CSSTransformedLayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ScreenPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::Matrix4x4Typed() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::Matrix4x4Typed() |
565 | | |
566 | | Matrix4x4Typed(Float a11, Float a12, Float a13, Float a14, |
567 | | Float a21, Float a22, Float a23, Float a24, |
568 | | Float a31, Float a32, Float a33, Float a34, |
569 | | Float a41, Float a42, Float a43, Float a44) |
570 | | : _11(a11), _12(a12), _13(a13), _14(a14) |
571 | | , _21(a21), _22(a22), _23(a23), _24(a24) |
572 | | , _31(a31), _32(a32), _33(a33), _34(a34) |
573 | | , _41(a41), _42(a42), _43(a43), _44(a44) |
574 | 0 | {} Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::CSSTransformedLayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::RenderTargetPixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::Matrix4x4Typed(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float) |
575 | | |
576 | | explicit Matrix4x4Typed(const Float aArray[16]) |
577 | 0 | { |
578 | 0 | memcpy(components, aArray, sizeof(components)); |
579 | 0 | } |
580 | | |
581 | | Matrix4x4Typed(const Matrix4x4Typed& aOther) |
582 | 0 | { |
583 | 0 | memcpy(this, &aOther, sizeof(*this)); |
584 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Matrix4x4Typed(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::Matrix4x4Typed(mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::Matrix4x4Typed(mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::Matrix4x4Typed(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel> const&) |
585 | | |
586 | | union { |
587 | | struct { |
588 | | Float _11, _12, _13, _14; |
589 | | Float _21, _22, _23, _24; |
590 | | Float _31, _32, _33, _34; |
591 | | Float _41, _42, _43, _44; |
592 | | }; |
593 | | Float components[16]; |
594 | | }; |
595 | | |
596 | | friend std::ostream& operator<<(std::ostream& aStream, const Matrix4x4Typed& aMatrix) |
597 | 0 | { |
598 | 0 | const Float *f = &aMatrix._11; |
599 | 0 | aStream << "[ " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4; |
600 | 0 | aStream << " " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4; |
601 | 0 | aStream << " " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4; |
602 | 0 | aStream << " " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ]" << std::endl; |
603 | 0 | return aStream; |
604 | 0 | } Unexecuted instantiation: mozilla::gfx::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel> const&) Unexecuted instantiation: mozilla::gfx::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel> const&) Unexecuted instantiation: mozilla::gfx::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) |
605 | | |
606 | | Point4D& operator[](int aIndex) |
607 | 0 | { |
608 | 0 | MOZ_ASSERT(aIndex >= 0 && aIndex <= 3, "Invalid matrix array index"); |
609 | 0 | return *reinterpret_cast<Point4D*>((&_11)+4*aIndex); |
610 | 0 | } |
611 | | const Point4D& operator[](int aIndex) const |
612 | 0 | { |
613 | 0 | MOZ_ASSERT(aIndex >= 0 && aIndex <= 3, "Invalid matrix array index"); |
614 | 0 | return *reinterpret_cast<const Point4D*>((&_11)+4*aIndex); |
615 | 0 | } |
616 | | |
617 | | /** |
618 | | * Returns true if the matrix is isomorphic to a 2D affine transformation. |
619 | | */ |
620 | | bool Is2D() const |
621 | 0 | { |
622 | 0 | if (_13 != 0.0f || _14 != 0.0f || |
623 | 0 | _23 != 0.0f || _24 != 0.0f || |
624 | 0 | _31 != 0.0f || _32 != 0.0f || _33 != 1.0f || _34 != 0.0f || |
625 | 0 | _43 != 0.0f || _44 != 1.0f) { |
626 | 0 | return false; |
627 | 0 | } |
628 | 0 | return true; |
629 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Is2D() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::Is2D() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::Is2D() const |
630 | | |
631 | 0 | bool Is2D(Matrix* aMatrix) const { |
632 | 0 | if (!Is2D()) { |
633 | 0 | return false; |
634 | 0 | } |
635 | 0 | if (aMatrix) { |
636 | 0 | aMatrix->_11 = _11; |
637 | 0 | aMatrix->_12 = _12; |
638 | 0 | aMatrix->_21 = _21; |
639 | 0 | aMatrix->_22 = _22; |
640 | 0 | aMatrix->_31 = _41; |
641 | 0 | aMatrix->_32 = _42; |
642 | 0 | } |
643 | 0 | return true; |
644 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Is2D(mozilla::gfx::BaseMatrix<float>*) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::Is2D(mozilla::gfx::BaseMatrix<float>*) const |
645 | | |
646 | | Matrix As2D() const |
647 | 0 | { |
648 | 0 | MOZ_ASSERT(Is2D(), "Matrix is not a 2D affine transform"); |
649 | 0 |
|
650 | 0 | return Matrix(_11, _12, _21, _22, _41, _42); |
651 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::As2D() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::As2D() const |
652 | | |
653 | 0 | bool CanDraw2D(Matrix* aMatrix = nullptr) const { |
654 | 0 | if (_14 != 0.0f || |
655 | 0 | _24 != 0.0f || |
656 | 0 | _44 != 1.0f) { |
657 | 0 | return false; |
658 | 0 | } |
659 | 0 | if (aMatrix) { |
660 | 0 | aMatrix->_11 = _11; |
661 | 0 | aMatrix->_12 = _12; |
662 | 0 | aMatrix->_21 = _21; |
663 | 0 | aMatrix->_22 = _22; |
664 | 0 | aMatrix->_31 = _41; |
665 | 0 | aMatrix->_32 = _42; |
666 | 0 | } |
667 | 0 | return true; |
668 | 0 | } |
669 | | |
670 | 0 | Matrix4x4Typed& ProjectTo2D() { |
671 | 0 | _31 = 0.0f; |
672 | 0 | _32 = 0.0f; |
673 | 0 | _13 = 0.0f; |
674 | 0 | _23 = 0.0f; |
675 | 0 | _33 = 1.0f; |
676 | 0 | _43 = 0.0f; |
677 | 0 | _34 = 0.0f; |
678 | 0 | // Some matrices, such as those derived from perspective transforms, |
679 | 0 | // can modify _44 from 1, while leaving the rest of the fourth column |
680 | 0 | // (_14, _24) at 0. In this case, after resetting the third row and |
681 | 0 | // third column above, the value of _44 functions only to scale the |
682 | 0 | // coordinate transform divide by W. The matrix can be converted to |
683 | 0 | // a true 2D matrix by normalizing out the scaling effect of _44 on |
684 | 0 | // the remaining components ahead of time. |
685 | 0 | if (_14 == 0.0f && _24 == 0.0f && |
686 | 0 | _44 != 1.0f && _44 != 0.0f) { |
687 | 0 | Float scale = 1.0f / _44; |
688 | 0 | _11 *= scale; |
689 | 0 | _12 *= scale; |
690 | 0 | _21 *= scale; |
691 | 0 | _22 *= scale; |
692 | 0 | _41 *= scale; |
693 | 0 | _42 *= scale; |
694 | 0 | _44 = 1.0f; |
695 | 0 | } |
696 | 0 | return *this; |
697 | 0 | } |
698 | | |
699 | | template<class F> |
700 | | Point4DTyped<TargetUnits, F> |
701 | 0 | ProjectPoint(const PointTyped<SourceUnits, F>& aPoint) const { |
702 | 0 | // Find a value for z that will transform to 0. |
703 | 0 |
|
704 | 0 | // The transformed value of z is computed as: |
705 | 0 | // z' = aPoint.x * _13 + aPoint.y * _23 + z * _33 + _43; |
706 | 0 |
|
707 | 0 | // Solving for z when z' = 0 gives us: |
708 | 0 | F z = -(aPoint.x * _13 + aPoint.y * _23 + _43) / _33; |
709 | 0 |
|
710 | 0 | // Compute the transformed point |
711 | 0 | return this->TransformPoint(Point4DTyped<SourceUnits, F>(aPoint.x, aPoint.y, z, 1)); |
712 | 0 | } Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::ProjectPoint<float>(mozilla::gfx::PointTyped<mozilla::ScreenPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ScreenPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ScreenPixel>::ProjectPoint<float>(mozilla::gfx::PointTyped<mozilla::ScreenPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::ProjectPoint<float>(mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectPoint<float>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectPoint<double>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> const&) const |
713 | | |
714 | | template<class F> |
715 | | RectTyped<TargetUnits, F> |
716 | | ProjectRectBounds(const RectTyped<SourceUnits, F>& aRect, const RectTyped<TargetUnits, F>& aClip) const |
717 | 0 | { |
718 | 0 | // This function must never return std::numeric_limits<Float>::max() or any |
719 | 0 | // other arbitrary large value in place of inifinity. This often occurs when |
720 | 0 | // aRect is an inversed projection matrix or when aRect is transformed to be |
721 | 0 | // partly behind and in front of the camera (w=0 plane in homogenous |
722 | 0 | // coordinates) - See Bug 1035611 |
723 | 0 |
|
724 | 0 | // Some call-sites will call RoundGfxRectToAppRect which clips both the |
725 | 0 | // extents and dimensions of the rect to be bounded by nscoord_MAX. |
726 | 0 | // If we return a Rect that, when converted to nscoords, has a width or height |
727 | 0 | // greater than nscoord_MAX, RoundGfxRectToAppRect will clip the overflow |
728 | 0 | // off both the min and max end of the rect after clipping the extents of the |
729 | 0 | // rect, resulting in a translation of the rect towards the infinite end. |
730 | 0 |
|
731 | 0 | // The bounds returned by ProjectRectBounds are expected to be clipped only on |
732 | 0 | // the edges beyond the bounds of the coordinate system; otherwise, the |
733 | 0 | // clipped bounding box would be smaller than the correct one and result |
734 | 0 | // bugs such as incorrect culling (eg. Bug 1073056) |
735 | 0 |
|
736 | 0 | // To address this without requiring all code to work in homogenous |
737 | 0 | // coordinates or interpret infinite values correctly, a specialized |
738 | 0 | // clipping function is integrated into ProjectRectBounds. |
739 | 0 |
|
740 | 0 | // Callers should pass an aClip value that represents the extents to clip |
741 | 0 | // the result to, in the same coordinate system as aRect. |
742 | 0 | Point4DTyped<TargetUnits, F> points[4]; |
743 | 0 |
|
744 | 0 | points[0] = ProjectPoint(aRect.TopLeft()); |
745 | 0 | points[1] = ProjectPoint(aRect.TopRight()); |
746 | 0 | points[2] = ProjectPoint(aRect.BottomRight()); |
747 | 0 | points[3] = ProjectPoint(aRect.BottomLeft()); |
748 | 0 |
|
749 | 0 | F min_x = std::numeric_limits<F>::max(); |
750 | 0 | F min_y = std::numeric_limits<F>::max(); |
751 | 0 | F max_x = -std::numeric_limits<F>::max(); |
752 | 0 | F max_y = -std::numeric_limits<F>::max(); |
753 | 0 |
|
754 | 0 | for (int i=0; i<4; i++) { |
755 | 0 | // Only use points that exist above the w=0 plane |
756 | 0 | if (points[i].HasPositiveWCoord()) { |
757 | 0 | PointTyped<TargetUnits, F> point2d = aClip.ClampPoint(points[i].As2DPoint()); |
758 | 0 | min_x = std::min<F>(point2d.x, min_x); |
759 | 0 | max_x = std::max<F>(point2d.x, max_x); |
760 | 0 | min_y = std::min<F>(point2d.y, min_y); |
761 | 0 | max_y = std::max<F>(point2d.y, max_y); |
762 | 0 | } |
763 | 0 |
|
764 | 0 | int next = (i == 3) ? 0 : i + 1; |
765 | 0 | if (points[i].HasPositiveWCoord() != points[next].HasPositiveWCoord()) { |
766 | 0 | // If the line between two points crosses the w=0 plane, then interpolate |
767 | 0 | // to find the point of intersection with the w=0 plane and use that |
768 | 0 | // instead. |
769 | 0 | Point4DTyped<TargetUnits, F> intercept = |
770 | 0 | ComputePerspectivePlaneIntercept(points[i], points[next]); |
771 | 0 | // Since intercept.w will always be 0 here, we interpret x,y,z as a |
772 | 0 | // direction towards an infinite vanishing point. |
773 | 0 | if (intercept.x < 0.0f) { |
774 | 0 | min_x = aClip.X(); |
775 | 0 | } else if (intercept.x > 0.0f) { |
776 | 0 | max_x = aClip.XMost(); |
777 | 0 | } |
778 | 0 | if (intercept.y < 0.0f) { |
779 | 0 | min_y = aClip.Y(); |
780 | 0 | } else if (intercept.y > 0.0f) { |
781 | 0 | max_y = aClip.YMost(); |
782 | 0 | } |
783 | 0 | } |
784 | 0 | } |
785 | 0 |
|
786 | 0 | if (max_x < min_x || max_y < min_y) { |
787 | 0 | return RectTyped<TargetUnits, F>(0, 0, 0, 0); |
788 | 0 | } |
789 | 0 | |
790 | 0 | return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y); |
791 | 0 | } Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::LayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::ProjectRectBounds<float>(mozilla::gfx::RectTyped<mozilla::ParentLayerPixel, float> const&, mozilla::gfx::RectTyped<mozilla::LayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectRectBounds<float>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectRectBounds<double>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&) const |
792 | | |
793 | | /** |
794 | | * TransformAndClipBounds transforms aRect as a bounding box, while clipping |
795 | | * the transformed bounds to the extents of aClip. |
796 | | */ |
797 | | template<class F> |
798 | | RectTyped<TargetUnits, F> TransformAndClipBounds(const RectTyped<SourceUnits, F>& aRect, |
799 | | const RectTyped<TargetUnits, F>& aClip) const |
800 | 0 | { |
801 | 0 | PointTyped<UnknownUnits, F> verts[kTransformAndClipRectMaxVerts]; |
802 | 0 | size_t vertCount = TransformAndClipRect(aRect, aClip, verts); |
803 | 0 |
|
804 | 0 | F min_x = std::numeric_limits<F>::max(); |
805 | 0 | F min_y = std::numeric_limits<F>::max(); |
806 | 0 | F max_x = -std::numeric_limits<F>::max(); |
807 | 0 | F max_y = -std::numeric_limits<F>::max(); |
808 | 0 | for (size_t i=0; i < vertCount; i++) { |
809 | 0 | min_x = std::min(min_x, verts[i].x); |
810 | 0 | max_x = std::max(max_x, verts[i].x); |
811 | 0 | min_y = std::min(min_y, verts[i].y); |
812 | 0 | max_y = std::max(max_y, verts[i].y); |
813 | 0 | } |
814 | 0 |
|
815 | 0 | if (max_x < min_x || max_y < min_y) { |
816 | 0 | return RectTyped<TargetUnits, F>(0, 0, 0, 0); |
817 | 0 | } |
818 | 0 | |
819 | 0 | return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y); |
820 | 0 | } |
821 | | |
822 | | template<class F> |
823 | | RectTyped<TargetUnits, F> TransformAndClipBounds(const TriangleTyped<SourceUnits, F>& aTriangle, |
824 | | const RectTyped<TargetUnits, F>& aClip) const |
825 | | { |
826 | | return TransformAndClipBounds(aTriangle.BoundingBox(), aClip); |
827 | | } |
828 | | |
829 | | /** |
830 | | * TransformAndClipRect projects a rectangle and clips against view frustum |
831 | | * clipping planes in homogenous space so that its projected vertices are |
832 | | * constrained within the 2d rectangle passed in aClip. |
833 | | * The resulting vertices are populated in aVerts. aVerts must be |
834 | | * pre-allocated to hold at least kTransformAndClipRectMaxVerts Points. |
835 | | * The vertex count is returned by TransformAndClipRect. It is possible to |
836 | | * emit fewer that 3 vertices, indicating that aRect will not be visible |
837 | | * within aClip. |
838 | | */ |
839 | | template<class F> |
840 | | size_t TransformAndClipRect(const RectTyped<SourceUnits, F>& aRect, |
841 | | const RectTyped<TargetUnits, F>& aClip, |
842 | | PointTyped<TargetUnits, F>* aVerts) const |
843 | 0 | { |
844 | 0 | // Initialize a double-buffered array of points in homogenous space with |
845 | 0 | // the input rectangle, aRect. |
846 | 0 | Point4DTyped<UnknownUnits, F> points[2][kTransformAndClipRectMaxVerts]; |
847 | 0 | Point4DTyped<UnknownUnits, F>* dstPoint = points[0]; |
848 | 0 |
|
849 | 0 | *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.X(), aRect.Y(), 0, 1)); |
850 | 0 | *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.XMost(), aRect.Y(), 0, 1)); |
851 | 0 | *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.XMost(), aRect.YMost(), 0, 1)); |
852 | 0 | *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.X(), aRect.YMost(), 0, 1)); |
853 | 0 |
|
854 | 0 | // View frustum clipping planes are described as normals originating from |
855 | 0 | // the 0,0,0,0 origin. |
856 | 0 | Point4DTyped<UnknownUnits, F> planeNormals[4]; |
857 | 0 | planeNormals[0] = Point4DTyped<UnknownUnits, F>(1.0, 0.0, 0.0, -aClip.X()); |
858 | 0 | planeNormals[1] = Point4DTyped<UnknownUnits, F>(-1.0, 0.0, 0.0, aClip.XMost()); |
859 | 0 | planeNormals[2] = Point4DTyped<UnknownUnits, F>(0.0, 1.0, 0.0, -aClip.Y()); |
860 | 0 | planeNormals[3] = Point4DTyped<UnknownUnits, F>(0.0, -1.0, 0.0, aClip.YMost()); |
861 | 0 |
|
862 | 0 | // Iterate through each clipping plane and clip the polygon. |
863 | 0 | // In each pass, we double buffer, alternating between points[0] and |
864 | 0 | // points[1]. |
865 | 0 | for (int plane=0; plane < 4; plane++) { |
866 | 0 | planeNormals[plane].Normalize(); |
867 | 0 | Point4DTyped<UnknownUnits, F>* srcPoint = points[plane & 1]; |
868 | 0 | Point4DTyped<UnknownUnits, F>* srcPointEnd = dstPoint; |
869 | 0 |
|
870 | 0 | dstPoint = points[~plane & 1]; |
871 | 0 | Point4DTyped<UnknownUnits, F>* dstPointStart = dstPoint; |
872 | 0 |
|
873 | 0 | Point4DTyped<UnknownUnits, F>* prevPoint = srcPointEnd - 1; |
874 | 0 | F prevDot = planeNormals[plane].DotProduct(*prevPoint); |
875 | 0 | while (srcPoint < srcPointEnd && ((dstPoint - dstPointStart) < kTransformAndClipRectMaxVerts)) { |
876 | 0 | F nextDot = planeNormals[plane].DotProduct(*srcPoint); |
877 | 0 |
|
878 | 0 | if ((nextDot >= 0.0) != (prevDot >= 0.0)) { |
879 | 0 | // An intersection with the clipping plane has been detected. |
880 | 0 | // Interpolate to find the intersecting point and emit it. |
881 | 0 | F t = -prevDot / (nextDot - prevDot); |
882 | 0 | *dstPoint++ = *srcPoint * t + *prevPoint * (1.0 - t); |
883 | 0 | } |
884 | 0 |
|
885 | 0 | if (nextDot >= 0.0) { |
886 | 0 | // Emit any source points that are on the positive side of the |
887 | 0 | // clipping plane. |
888 | 0 | *dstPoint++ = *srcPoint; |
889 | 0 | } |
890 | 0 |
|
891 | 0 | prevPoint = srcPoint++; |
892 | 0 | prevDot = nextDot; |
893 | 0 | } |
894 | 0 |
|
895 | 0 | if (dstPoint == dstPointStart) { |
896 | 0 | break; |
897 | 0 | } |
898 | 0 | } |
899 | 0 |
|
900 | 0 | size_t dstPointCount = 0; |
901 | 0 | size_t srcPointCount = dstPoint - points[0]; |
902 | 0 | for (Point4DTyped<UnknownUnits, F>* srcPoint = points[0]; srcPoint < points[0] + srcPointCount; srcPoint++) { |
903 | 0 |
|
904 | 0 | PointTyped<TargetUnits, F> p; |
905 | 0 | if (srcPoint->w == 0.0) { |
906 | 0 | // If a point lies on the intersection of the clipping planes at |
907 | 0 | // (0,0,0,0), we must avoid a division by zero w component. |
908 | 0 | p = PointTyped<TargetUnits, F>(0.0, 0.0); |
909 | 0 | } else { |
910 | 0 | p = srcPoint->As2DPoint(); |
911 | 0 | } |
912 | 0 | // Emit only unique points |
913 | 0 | if (dstPointCount == 0 || p != aVerts[dstPointCount - 1]) { |
914 | 0 | aVerts[dstPointCount++] = p; |
915 | 0 | } |
916 | 0 | } |
917 | 0 |
|
918 | 0 | return dstPointCount; |
919 | 0 | } |
920 | | |
921 | | static const int kTransformAndClipRectMaxVerts = 32; |
922 | | |
923 | | static Matrix4x4Typed From2D(const Matrix &aMatrix) { |
924 | | Matrix4x4Typed matrix; |
925 | | matrix._11 = aMatrix._11; |
926 | | matrix._12 = aMatrix._12; |
927 | | matrix._21 = aMatrix._21; |
928 | | matrix._22 = aMatrix._22; |
929 | | matrix._41 = aMatrix._31; |
930 | | matrix._42 = aMatrix._32; |
931 | | return matrix; |
932 | | } |
933 | | |
934 | | bool Is2DIntegerTranslation() const |
935 | 0 | { |
936 | 0 | return Is2D() && As2D().IsIntegerTranslation(); |
937 | 0 | } |
938 | | |
939 | | TargetPoint4D TransposeTransform4D(const SourcePoint4D& aPoint) const |
940 | 0 | { |
941 | 0 | Float x = aPoint.x * _11 + aPoint.y * _12 + aPoint.z * _13 + aPoint.w * _14; |
942 | 0 | Float y = aPoint.x * _21 + aPoint.y * _22 + aPoint.z * _23 + aPoint.w * _24; |
943 | 0 | Float z = aPoint.x * _31 + aPoint.y * _32 + aPoint.z * _33 + aPoint.w * _34; |
944 | 0 | Float w = aPoint.x * _41 + aPoint.y * _42 + aPoint.z * _43 + aPoint.w * _44; |
945 | 0 |
|
946 | 0 | return TargetPoint4D(x, y, z, w); |
947 | 0 | } |
948 | | |
949 | | template<class F> |
950 | | Point4DTyped<TargetUnits, F> TransformPoint(const Point4DTyped<SourceUnits, F>& aPoint) const |
951 | 0 | { |
952 | 0 | Point4DTyped<TargetUnits, F> retPoint; |
953 | 0 |
|
954 | 0 | retPoint.x = aPoint.x * _11 + aPoint.y * _21 + aPoint.z * _31 + aPoint.w * _41; |
955 | 0 | retPoint.y = aPoint.x * _12 + aPoint.y * _22 + aPoint.z * _32 + aPoint.w * _42; |
956 | 0 | retPoint.z = aPoint.x * _13 + aPoint.y * _23 + aPoint.z * _33 + aPoint.w * _43; |
957 | 0 | retPoint.w = aPoint.x * _14 + aPoint.y * _24 + aPoint.z * _34 + aPoint.w * _44; |
958 | 0 |
|
959 | 0 | return retPoint; |
960 | 0 | } Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformPoint<double>(mozilla::gfx::Point4DTyped<mozilla::gfx::UnknownUnits, double> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ScreenPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ScreenPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ScreenPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ScreenPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ScreenPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::LayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::RenderTargetPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::RenderTargetPixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::Point4DTyped<mozilla::LayoutDevicePixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::TransformPoint<float>(mozilla::gfx::Point4DTyped<mozilla::LayoutDevicePixel, float> const&) const |
961 | | |
962 | | template<class F> |
963 | | Point3DTyped<TargetUnits, F> TransformPoint(const Point3DTyped<SourceUnits, F>& aPoint) const |
964 | 0 | { |
965 | 0 | Point3DTyped<TargetUnits, F> result; |
966 | 0 | result.x = aPoint.x * _11 + aPoint.y * _21 + aPoint.z * _31 + _41; |
967 | 0 | result.y = aPoint.x * _12 + aPoint.y * _22 + aPoint.z * _32 + _42; |
968 | 0 | result.z = aPoint.x * _13 + aPoint.y * _23 + aPoint.z * _33 + _43; |
969 | 0 |
|
970 | 0 | result /= (aPoint.x * _14 + aPoint.y * _24 + aPoint.z * _34 + _44); |
971 | 0 |
|
972 | 0 | return result; |
973 | 0 | } |
974 | | |
975 | | template<class F> |
976 | | PointTyped<TargetUnits, F> TransformPoint(const PointTyped<SourceUnits, F> &aPoint) const |
977 | 0 | { |
978 | 0 | Point4DTyped<SourceUnits, F> temp(aPoint.x, aPoint.y, 0, 1); |
979 | 0 | return TransformPoint(temp).As2DPoint(); |
980 | 0 | } Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::ScreenPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::LayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::ScreenPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::LayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::RenderTargetPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::RenderTargetPixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformPoint<double>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::LayoutDevicePixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::TransformPoint<float>(mozilla::gfx::PointTyped<mozilla::LayoutDevicePixel, float> const&) const |
981 | | |
982 | | template<class F> |
983 | | GFX2D_API RectTyped<TargetUnits, F> TransformBounds(const RectTyped<SourceUnits, F>& aRect) const |
984 | 0 | { |
985 | 0 | PointTyped<TargetUnits, F> quad[4]; |
986 | 0 | F min_x, max_x; |
987 | 0 | F min_y, max_y; |
988 | 0 |
|
989 | 0 | quad[0] = TransformPoint(aRect.TopLeft()); |
990 | 0 | quad[1] = TransformPoint(aRect.TopRight()); |
991 | 0 | quad[2] = TransformPoint(aRect.BottomLeft()); |
992 | 0 | quad[3] = TransformPoint(aRect.BottomRight()); |
993 | 0 |
|
994 | 0 | min_x = max_x = quad[0].x; |
995 | 0 | min_y = max_y = quad[0].y; |
996 | 0 |
|
997 | 0 | for (int i = 1; i < 4; i++) { |
998 | 0 | if (quad[i].x < min_x) { |
999 | 0 | min_x = quad[i].x; |
1000 | 0 | } |
1001 | 0 | if (quad[i].x > max_x) { |
1002 | 0 | max_x = quad[i].x; |
1003 | 0 | } |
1004 | 0 |
|
1005 | 0 | if (quad[i].y < min_y) { |
1006 | 0 | min_y = quad[i].y; |
1007 | 0 | } |
1008 | 0 | if (quad[i].y > max_y) { |
1009 | 0 | max_y = quad[i].y; |
1010 | 0 | } |
1011 | 0 | } |
1012 | 0 |
|
1013 | 0 | return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y); |
1014 | 0 | } Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformBounds<float>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::TransformBounds<float>(mozilla::gfx::RectTyped<mozilla::LayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::ParentLayerPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::TransformBounds<float>(mozilla::gfx::RectTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::RenderTargetPixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::RenderTargetPixel>::TransformBounds<float>(mozilla::gfx::RectTyped<mozilla::ParentLayerPixel, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::LayoutDevicePixel, float> mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::TransformBounds<float>(mozilla::gfx::RectTyped<mozilla::LayoutDevicePixel, float> const&) const |
1015 | | |
1016 | | static Matrix4x4Typed Translation(Float aX, Float aY, Float aZ) |
1017 | 0 | { |
1018 | 0 | return Matrix4x4Typed(1.0f, 0.0f, 0.0f, 0.0f, |
1019 | 0 | 0.0f, 1.0f, 0.0f, 0.0f, |
1020 | 0 | 0.0f, 0.0f, 1.0f, 0.0f, |
1021 | 0 | aX, aY, aZ, 1.0f); |
1022 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Translation(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Translation(float, float, float) |
1023 | | |
1024 | | static Matrix4x4Typed Translation(const TargetPoint3D& aP) |
1025 | 0 | { |
1026 | 0 | return Translation(aP.x, aP.y, aP.z); |
1027 | 0 | } |
1028 | | |
1029 | | static Matrix4x4Typed Translation(const TargetPoint& aP) |
1030 | 0 | { |
1031 | 0 | return Translation(aP.x, aP.y, 0); |
1032 | 0 | } |
1033 | | |
1034 | | /** |
1035 | | * Apply a translation to this matrix. |
1036 | | * |
1037 | | * The "Pre" in this method's name means that the translation is applied |
1038 | | * -before- this matrix's existing transformation. That is, any vector that |
1039 | | * is multiplied by the resulting matrix will first be translated, then be |
1040 | | * transformed by the original transform. |
1041 | | * |
1042 | | * Calling this method will result in this matrix having the same value as |
1043 | | * the result of: |
1044 | | * |
1045 | | * Matrix4x4::Translation(x, y) * this |
1046 | | * |
1047 | | * (Note that in performance critical code multiplying by the result of a |
1048 | | * Translation()/Scaling() call is not recommended since that results in a |
1049 | | * full matrix multiply involving 64 floating-point multiplications. Calling |
1050 | | * this method would be preferred since it only involves 12 floating-point |
1051 | | * multiplications.) |
1052 | | */ |
1053 | | Matrix4x4Typed &PreTranslate(Float aX, Float aY, Float aZ) |
1054 | 0 | { |
1055 | 0 | _41 += aX * _11 + aY * _21 + aZ * _31; |
1056 | 0 | _42 += aX * _12 + aY * _22 + aZ * _32; |
1057 | 0 | _43 += aX * _13 + aY * _23 + aZ * _33; |
1058 | 0 | _44 += aX * _14 + aY * _24 + aZ * _34; |
1059 | 0 |
|
1060 | 0 | return *this; |
1061 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::PreTranslate(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::PreTranslate(float, float, float) |
1062 | | |
1063 | 0 | Matrix4x4Typed &PreTranslate(const Point3D& aPoint) { |
1064 | 0 | return PreTranslate(aPoint.x, aPoint.y, aPoint.z); |
1065 | 0 | } |
1066 | | |
1067 | | /** |
1068 | | * Similar to PreTranslate, but the translation is applied -after- this |
1069 | | * matrix's existing transformation instead of before it. |
1070 | | * |
1071 | | * This method is generally less used than PreTranslate since typically code |
1072 | | * wants to adjust an existing user space to device space matrix to create a |
1073 | | * transform to device space from a -new- user space (translated from the |
1074 | | * previous user space). In that case consumers will need to use the Pre* |
1075 | | * variants of the matrix methods rather than using the Post* methods, since |
1076 | | * the Post* methods add a transform to the device space end of the |
1077 | | * transformation. |
1078 | | */ |
1079 | | Matrix4x4Typed &PostTranslate(Float aX, Float aY, Float aZ) |
1080 | 0 | { |
1081 | 0 | _11 += _14 * aX; |
1082 | 0 | _21 += _24 * aX; |
1083 | 0 | _31 += _34 * aX; |
1084 | 0 | _41 += _44 * aX; |
1085 | 0 | _12 += _14 * aY; |
1086 | 0 | _22 += _24 * aY; |
1087 | 0 | _32 += _34 * aY; |
1088 | 0 | _42 += _44 * aY; |
1089 | 0 | _13 += _14 * aZ; |
1090 | 0 | _23 += _24 * aZ; |
1091 | 0 | _33 += _34 * aZ; |
1092 | 0 | _43 += _44 * aZ; |
1093 | 0 |
|
1094 | 0 | return *this; |
1095 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::PostTranslate(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::PostTranslate(float, float, float) |
1096 | | |
1097 | 0 | Matrix4x4Typed &PostTranslate(const TargetPoint3D& aPoint) { |
1098 | 0 | return PostTranslate(aPoint.x, aPoint.y, aPoint.z); |
1099 | 0 | } |
1100 | | |
1101 | 0 | Matrix4x4Typed &PostTranslate(const TargetPoint& aPoint) { |
1102 | 0 | return PostTranslate(aPoint.x, aPoint.y, 0); |
1103 | 0 | } |
1104 | | |
1105 | | static Matrix4x4Typed Scaling(Float aScaleX, Float aScaleY, float aScaleZ) |
1106 | 0 | { |
1107 | 0 | return Matrix4x4Typed(aScaleX, 0.0f, 0.0f, 0.0f, |
1108 | 0 | 0.0f, aScaleY, 0.0f, 0.0f, |
1109 | 0 | 0.0f, 0.0f, aScaleZ, 0.0f, |
1110 | 0 | 0.0f, 0.0f, 0.0f, 1.0f); |
1111 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Scaling(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Scaling(float, float, float) |
1112 | | |
1113 | | /** |
1114 | | * Similar to PreTranslate, but applies a scale instead of a translation. |
1115 | | */ |
1116 | | Matrix4x4Typed &PreScale(Float aX, Float aY, Float aZ) |
1117 | 0 | { |
1118 | 0 | _11 *= aX; |
1119 | 0 | _12 *= aX; |
1120 | 0 | _13 *= aX; |
1121 | 0 | _14 *= aX; |
1122 | 0 | _21 *= aY; |
1123 | 0 | _22 *= aY; |
1124 | 0 | _23 *= aY; |
1125 | 0 | _24 *= aY; |
1126 | 0 | _31 *= aZ; |
1127 | 0 | _32 *= aZ; |
1128 | 0 | _33 *= aZ; |
1129 | 0 | _34 *= aZ; |
1130 | 0 |
|
1131 | 0 | return *this; |
1132 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::PreScale(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::PreScale(float, float, float) |
1133 | | |
1134 | | /** |
1135 | | * Similar to PostTranslate, but applies a scale instead of a translation. |
1136 | | */ |
1137 | | Matrix4x4Typed &PostScale(Float aScaleX, Float aScaleY, Float aScaleZ) |
1138 | 0 | { |
1139 | 0 | _11 *= aScaleX; |
1140 | 0 | _21 *= aScaleX; |
1141 | 0 | _31 *= aScaleX; |
1142 | 0 | _41 *= aScaleX; |
1143 | 0 | _12 *= aScaleY; |
1144 | 0 | _22 *= aScaleY; |
1145 | 0 | _32 *= aScaleY; |
1146 | 0 | _42 *= aScaleY; |
1147 | 0 | _13 *= aScaleZ; |
1148 | 0 | _23 *= aScaleZ; |
1149 | 0 | _33 *= aScaleZ; |
1150 | 0 | _43 *= aScaleZ; |
1151 | 0 |
|
1152 | 0 | return *this; |
1153 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::PostScale(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::PostScale(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::PostScale(float, float, float) |
1154 | | |
1155 | | void SkewXY(Float aSkew) |
1156 | 0 | { |
1157 | 0 | (*this)[1] += (*this)[0] * aSkew; |
1158 | 0 | } |
1159 | | |
1160 | | void SkewXZ(Float aSkew) |
1161 | 0 | { |
1162 | 0 | (*this)[2] += (*this)[0] * aSkew; |
1163 | 0 | } |
1164 | | |
1165 | | void SkewYZ(Float aSkew) |
1166 | 0 | { |
1167 | 0 | (*this)[2] += (*this)[1] * aSkew; |
1168 | 0 | } |
1169 | | |
1170 | | Matrix4x4Typed &ChangeBasis(const Point3D& aOrigin) |
1171 | 0 | { |
1172 | 0 | return ChangeBasis(aOrigin.x, aOrigin.y, aOrigin.z); |
1173 | 0 | } |
1174 | | |
1175 | | Matrix4x4Typed &ChangeBasis(Float aX, Float aY, Float aZ) |
1176 | 0 | { |
1177 | 0 | // Translate to the origin before applying this matrix |
1178 | 0 | PreTranslate(-aX, -aY, -aZ); |
1179 | 0 |
|
1180 | 0 | // Translate back into position after applying this matrix |
1181 | 0 | PostTranslate(aX, aY, aZ); |
1182 | 0 |
|
1183 | 0 | return *this; |
1184 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ChangeBasis(float, float, float) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::ChangeBasis(float, float, float) |
1185 | | |
1186 | 0 | Matrix4x4Typed& Transpose() { |
1187 | 0 | std::swap(_12, _21); |
1188 | 0 | std::swap(_13, _31); |
1189 | 0 | std::swap(_14, _41); |
1190 | 0 |
|
1191 | 0 | std::swap(_23, _32); |
1192 | 0 | std::swap(_24, _42); |
1193 | 0 |
|
1194 | 0 | std::swap(_34, _43); |
1195 | 0 |
|
1196 | 0 | return *this; |
1197 | 0 | } |
1198 | | |
1199 | | bool operator==(const Matrix4x4Typed& o) const |
1200 | 0 | { |
1201 | 0 | // XXX would be nice to memcmp here, but that breaks IEEE 754 semantics |
1202 | 0 | return _11 == o._11 && _12 == o._12 && _13 == o._13 && _14 == o._14 && |
1203 | 0 | _21 == o._21 && _22 == o._22 && _23 == o._23 && _24 == o._24 && |
1204 | 0 | _31 == o._31 && _32 == o._32 && _33 == o._33 && _34 == o._34 && |
1205 | 0 | _41 == o._41 && _42 == o._42 && _43 == o._43 && _44 == o._44; |
1206 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::operator==(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::operator==(mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel> const&) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::operator==(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel> const&) const |
1207 | | |
1208 | | bool operator!=(const Matrix4x4Typed& o) const |
1209 | 0 | { |
1210 | 0 | return !((*this) == o); |
1211 | 0 | } |
1212 | | |
1213 | | template <typename NewTargetUnits> |
1214 | | Matrix4x4Typed<SourceUnits, NewTargetUnits> operator*(const Matrix4x4Typed<TargetUnits, NewTargetUnits> &aMatrix) const |
1215 | 0 | { |
1216 | 0 | Matrix4x4Typed<SourceUnits, NewTargetUnits> matrix; |
1217 | 0 |
|
1218 | 0 | matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21 + _13 * aMatrix._31 + _14 * aMatrix._41; |
1219 | 0 | matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21 + _23 * aMatrix._31 + _24 * aMatrix._41; |
1220 | 0 | matrix._31 = _31 * aMatrix._11 + _32 * aMatrix._21 + _33 * aMatrix._31 + _34 * aMatrix._41; |
1221 | 0 | matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21 + _43 * aMatrix._31 + _44 * aMatrix._41; |
1222 | 0 | matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22 + _13 * aMatrix._32 + _14 * aMatrix._42; |
1223 | 0 | matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22 + _23 * aMatrix._32 + _24 * aMatrix._42; |
1224 | 0 | matrix._32 = _31 * aMatrix._12 + _32 * aMatrix._22 + _33 * aMatrix._32 + _34 * aMatrix._42; |
1225 | 0 | matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22 + _43 * aMatrix._32 + _44 * aMatrix._42; |
1226 | 0 | matrix._13 = _11 * aMatrix._13 + _12 * aMatrix._23 + _13 * aMatrix._33 + _14 * aMatrix._43; |
1227 | 0 | matrix._23 = _21 * aMatrix._13 + _22 * aMatrix._23 + _23 * aMatrix._33 + _24 * aMatrix._43; |
1228 | 0 | matrix._33 = _31 * aMatrix._13 + _32 * aMatrix._23 + _33 * aMatrix._33 + _34 * aMatrix._43; |
1229 | 0 | matrix._43 = _41 * aMatrix._13 + _42 * aMatrix._23 + _43 * aMatrix._33 + _44 * aMatrix._43; |
1230 | 0 | matrix._14 = _11 * aMatrix._14 + _12 * aMatrix._24 + _13 * aMatrix._34 + _14 * aMatrix._44; |
1231 | 0 | matrix._24 = _21 * aMatrix._14 + _22 * aMatrix._24 + _23 * aMatrix._34 + _24 * aMatrix._44; |
1232 | 0 | matrix._34 = _31 * aMatrix._14 + _32 * aMatrix._24 + _33 * aMatrix._34 + _34 * aMatrix._44; |
1233 | 0 | matrix._44 = _41 * aMatrix._14 + _42 * aMatrix._24 + _43 * aMatrix._34 + _44 * aMatrix._44; |
1234 | 0 |
|
1235 | 0 | return matrix; |
1236 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel> mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::operator*<mozilla::ParentLayerPixel>(mozilla::gfx::Matrix4x4Typed<mozilla::CSSTransformedLayerPixel, mozilla::ParentLayerPixel> const&) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ScreenPixel> mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::operator*<mozilla::ScreenPixel>(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel> const&) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel> mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::operator*<mozilla::ParentLayerPixel>(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel> const&) const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel> mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::operator*<mozilla::ParentLayerPixel>(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel> const&) const |
1237 | | |
1238 | | Matrix4x4Typed& operator*=(const Matrix4x4Typed<TargetUnits, TargetUnits> &aMatrix) |
1239 | 0 | { |
1240 | 0 | *this = *this * aMatrix; |
1241 | 0 | return *this; |
1242 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::operator*=(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::operator*=(mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel> const&) |
1243 | | |
1244 | | /* Returns true if the matrix is an identity matrix. |
1245 | | */ |
1246 | | bool IsIdentity() const |
1247 | 0 | { |
1248 | 0 | return _11 == 1.0f && _12 == 0.0f && _13 == 0.0f && _14 == 0.0f && |
1249 | 0 | _21 == 0.0f && _22 == 1.0f && _23 == 0.0f && _24 == 0.0f && |
1250 | 0 | _31 == 0.0f && _32 == 0.0f && _33 == 1.0f && _34 == 0.0f && |
1251 | 0 | _41 == 0.0f && _42 == 0.0f && _43 == 0.0f && _44 == 1.0f; |
1252 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::IsIdentity() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::IsIdentity() const |
1253 | | |
1254 | | bool IsSingular() const |
1255 | 0 | { |
1256 | 0 | return Determinant() == 0.0; |
1257 | 0 | } |
1258 | | |
1259 | | Float Determinant() const |
1260 | 0 | { |
1261 | 0 | return _14 * _23 * _32 * _41 |
1262 | 0 | - _13 * _24 * _32 * _41 |
1263 | 0 | - _14 * _22 * _33 * _41 |
1264 | 0 | + _12 * _24 * _33 * _41 |
1265 | 0 | + _13 * _22 * _34 * _41 |
1266 | 0 | - _12 * _23 * _34 * _41 |
1267 | 0 | - _14 * _23 * _31 * _42 |
1268 | 0 | + _13 * _24 * _31 * _42 |
1269 | 0 | + _14 * _21 * _33 * _42 |
1270 | 0 | - _11 * _24 * _33 * _42 |
1271 | 0 | - _13 * _21 * _34 * _42 |
1272 | 0 | + _11 * _23 * _34 * _42 |
1273 | 0 | + _14 * _22 * _31 * _43 |
1274 | 0 | - _12 * _24 * _31 * _43 |
1275 | 0 | - _14 * _21 * _32 * _43 |
1276 | 0 | + _11 * _24 * _32 * _43 |
1277 | 0 | + _12 * _21 * _34 * _43 |
1278 | 0 | - _11 * _22 * _34 * _43 |
1279 | 0 | - _13 * _22 * _31 * _44 |
1280 | 0 | + _12 * _23 * _31 * _44 |
1281 | 0 | + _13 * _21 * _32 * _44 |
1282 | 0 | - _11 * _23 * _32 * _44 |
1283 | 0 | - _12 * _21 * _33 * _44 |
1284 | 0 | + _11 * _22 * _33 * _44; |
1285 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::Determinant() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Determinant() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::Determinant() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::Determinant() const |
1286 | | |
1287 | | // Invert() is not unit-correct. Prefer Inverse() where possible. |
1288 | | bool Invert() |
1289 | 0 | { |
1290 | 0 | Float det = Determinant(); |
1291 | 0 | if (!det) { |
1292 | 0 | return false; |
1293 | 0 | } |
1294 | 0 | |
1295 | 0 | Matrix4x4Typed<SourceUnits, TargetUnits> result; |
1296 | 0 | result._11 = _23 * _34 * _42 - _24 * _33 * _42 + _24 * _32 * _43 - _22 * _34 * _43 - _23 * _32 * _44 + _22 * _33 * _44; |
1297 | 0 | result._12 = _14 * _33 * _42 - _13 * _34 * _42 - _14 * _32 * _43 + _12 * _34 * _43 + _13 * _32 * _44 - _12 * _33 * _44; |
1298 | 0 | result._13 = _13 * _24 * _42 - _14 * _23 * _42 + _14 * _22 * _43 - _12 * _24 * _43 - _13 * _22 * _44 + _12 * _23 * _44; |
1299 | 0 | result._14 = _14 * _23 * _32 - _13 * _24 * _32 - _14 * _22 * _33 + _12 * _24 * _33 + _13 * _22 * _34 - _12 * _23 * _34; |
1300 | 0 | result._21 = _24 * _33 * _41 - _23 * _34 * _41 - _24 * _31 * _43 + _21 * _34 * _43 + _23 * _31 * _44 - _21 * _33 * _44; |
1301 | 0 | result._22 = _13 * _34 * _41 - _14 * _33 * _41 + _14 * _31 * _43 - _11 * _34 * _43 - _13 * _31 * _44 + _11 * _33 * _44; |
1302 | 0 | result._23 = _14 * _23 * _41 - _13 * _24 * _41 - _14 * _21 * _43 + _11 * _24 * _43 + _13 * _21 * _44 - _11 * _23 * _44; |
1303 | 0 | result._24 = _13 * _24 * _31 - _14 * _23 * _31 + _14 * _21 * _33 - _11 * _24 * _33 - _13 * _21 * _34 + _11 * _23 * _34; |
1304 | 0 | result._31 = _22 * _34 * _41 - _24 * _32 * _41 + _24 * _31 * _42 - _21 * _34 * _42 - _22 * _31 * _44 + _21 * _32 * _44; |
1305 | 0 | result._32 = _14 * _32 * _41 - _12 * _34 * _41 - _14 * _31 * _42 + _11 * _34 * _42 + _12 * _31 * _44 - _11 * _32 * _44; |
1306 | 0 | result._33 = _12 * _24 * _41 - _14 * _22 * _41 + _14 * _21 * _42 - _11 * _24 * _42 - _12 * _21 * _44 + _11 * _22 * _44; |
1307 | 0 | result._34 = _14 * _22 * _31 - _12 * _24 * _31 - _14 * _21 * _32 + _11 * _24 * _32 + _12 * _21 * _34 - _11 * _22 * _34; |
1308 | 0 | result._41 = _23 * _32 * _41 - _22 * _33 * _41 - _23 * _31 * _42 + _21 * _33 * _42 + _22 * _31 * _43 - _21 * _32 * _43; |
1309 | 0 | result._42 = _12 * _33 * _41 - _13 * _32 * _41 + _13 * _31 * _42 - _11 * _33 * _42 - _12 * _31 * _43 + _11 * _32 * _43; |
1310 | 0 | result._43 = _13 * _22 * _41 - _12 * _23 * _41 - _13 * _21 * _42 + _11 * _23 * _42 + _12 * _21 * _43 - _11 * _22 * _43; |
1311 | 0 | result._44 = _12 * _23 * _31 - _13 * _22 * _31 + _13 * _21 * _32 - _11 * _23 * _32 - _12 * _21 * _33 + _11 * _22 * _33; |
1312 | 0 |
|
1313 | 0 | result._11 /= det; |
1314 | 0 | result._12 /= det; |
1315 | 0 | result._13 /= det; |
1316 | 0 | result._14 /= det; |
1317 | 0 | result._21 /= det; |
1318 | 0 | result._22 /= det; |
1319 | 0 | result._23 /= det; |
1320 | 0 | result._24 /= det; |
1321 | 0 | result._31 /= det; |
1322 | 0 | result._32 /= det; |
1323 | 0 | result._33 /= det; |
1324 | 0 | result._34 /= det; |
1325 | 0 | result._41 /= det; |
1326 | 0 | result._42 /= det; |
1327 | 0 | result._43 /= det; |
1328 | 0 | result._44 /= det; |
1329 | 0 | *this = result; |
1330 | 0 |
|
1331 | 0 | return true; |
1332 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::Invert() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Invert() Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::Invert() |
1333 | | |
1334 | | Matrix4x4Typed<TargetUnits, SourceUnits> Inverse() const |
1335 | 0 | { |
1336 | 0 | typedef Matrix4x4Typed<TargetUnits, SourceUnits> InvertedMatrix; |
1337 | 0 | InvertedMatrix clone = InvertedMatrix::FromUnknownMatrix(ToUnknownMatrix()); |
1338 | 0 | DebugOnly<bool> inverted = clone.Invert(); |
1339 | 0 | MOZ_ASSERT(inverted, "Attempted to get the inverse of a non-invertible matrix"); |
1340 | 0 | return clone; |
1341 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::Inverse() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::Inverse() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::Inverse() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::Inverse() const |
1342 | | |
1343 | | Maybe<Matrix4x4Typed<TargetUnits, SourceUnits>> MaybeInverse() const |
1344 | 0 | { |
1345 | 0 | typedef Matrix4x4Typed<TargetUnits, SourceUnits> InvertedMatrix; |
1346 | 0 | InvertedMatrix clone = InvertedMatrix::FromUnknownMatrix(ToUnknownMatrix()); |
1347 | 0 | if (clone.Invert()) { |
1348 | 0 | return Some(clone); |
1349 | 0 | } |
1350 | 0 | return Nothing(); |
1351 | 0 | } |
1352 | | |
1353 | | void Normalize() |
1354 | 0 | { |
1355 | 0 | for (int i = 0; i < 4; i++) { |
1356 | 0 | for (int j = 0; j < 4; j++) { |
1357 | 0 | (*this)[i][j] /= (*this)[3][3]; |
1358 | 0 | } |
1359 | 0 | } |
1360 | 0 | } |
1361 | | |
1362 | | bool FuzzyEqual(const Matrix4x4Typed& o) const |
1363 | 0 | { |
1364 | 0 | return gfx::FuzzyEqual(_11, o._11) && gfx::FuzzyEqual(_12, o._12) && |
1365 | 0 | gfx::FuzzyEqual(_13, o._13) && gfx::FuzzyEqual(_14, o._14) && |
1366 | 0 | gfx::FuzzyEqual(_21, o._21) && gfx::FuzzyEqual(_22, o._22) && |
1367 | 0 | gfx::FuzzyEqual(_23, o._23) && gfx::FuzzyEqual(_24, o._24) && |
1368 | 0 | gfx::FuzzyEqual(_31, o._31) && gfx::FuzzyEqual(_32, o._32) && |
1369 | 0 | gfx::FuzzyEqual(_33, o._33) && gfx::FuzzyEqual(_34, o._34) && |
1370 | 0 | gfx::FuzzyEqual(_41, o._41) && gfx::FuzzyEqual(_42, o._42) && |
1371 | 0 | gfx::FuzzyEqual(_43, o._43) && gfx::FuzzyEqual(_44, o._44); |
1372 | 0 | } |
1373 | | |
1374 | | bool FuzzyEqualsMultiplicative(const Matrix4x4Typed& o) const |
1375 | 0 | { |
1376 | 0 | return ::mozilla::FuzzyEqualsMultiplicative(_11, o._11) && |
1377 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_12, o._12) && |
1378 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_13, o._13) && |
1379 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_14, o._14) && |
1380 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_21, o._21) && |
1381 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_22, o._22) && |
1382 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_23, o._23) && |
1383 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_24, o._24) && |
1384 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_31, o._31) && |
1385 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_32, o._32) && |
1386 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_33, o._33) && |
1387 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_34, o._34) && |
1388 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_41, o._41) && |
1389 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_42, o._42) && |
1390 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_43, o._43) && |
1391 | 0 | ::mozilla::FuzzyEqualsMultiplicative(_44, o._44); |
1392 | 0 | } |
1393 | | |
1394 | | bool IsBackfaceVisible() const |
1395 | 0 | { |
1396 | 0 | // Inverse()._33 < 0; |
1397 | 0 | Float det = Determinant(); |
1398 | 0 | Float __33 = _12*_24*_41 - _14*_22*_41 + |
1399 | 0 | _14*_21*_42 - _11*_24*_42 - |
1400 | 0 | _12*_21*_44 + _11*_22*_44; |
1401 | 0 | return (__33 * det) < 0; |
1402 | 0 | } |
1403 | | |
1404 | | Matrix4x4Typed &NudgeToIntegersFixedEpsilon() |
1405 | 0 | { |
1406 | 0 | NudgeToInteger(&_11); |
1407 | 0 | NudgeToInteger(&_12); |
1408 | 0 | NudgeToInteger(&_13); |
1409 | 0 | NudgeToInteger(&_14); |
1410 | 0 | NudgeToInteger(&_21); |
1411 | 0 | NudgeToInteger(&_22); |
1412 | 0 | NudgeToInteger(&_23); |
1413 | 0 | NudgeToInteger(&_24); |
1414 | 0 | NudgeToInteger(&_31); |
1415 | 0 | NudgeToInteger(&_32); |
1416 | 0 | NudgeToInteger(&_33); |
1417 | 0 | NudgeToInteger(&_34); |
1418 | 0 | static const float error = 1e-5f; |
1419 | 0 | NudgeToInteger(&_41, error); |
1420 | 0 | NudgeToInteger(&_42, error); |
1421 | 0 | NudgeToInteger(&_43, error); |
1422 | 0 | NudgeToInteger(&_44, error); |
1423 | 0 | return *this; |
1424 | 0 | } |
1425 | | |
1426 | | Point4D TransposedVector(int aIndex) const |
1427 | 0 | { |
1428 | 0 | MOZ_ASSERT(aIndex >= 0 && aIndex <= 3, "Invalid matrix array index"); |
1429 | 0 | return Point4D(*((&_11)+aIndex), *((&_21)+aIndex), *((&_31)+aIndex), *((&_41)+aIndex)); |
1430 | 0 | } |
1431 | | |
1432 | | void SetTransposedVector(int aIndex, Point4D &aVector) |
1433 | 0 | { |
1434 | 0 | MOZ_ASSERT(aIndex >= 0 && aIndex <= 3, "Invalid matrix array index"); |
1435 | 0 | *((&_11)+aIndex) = aVector.x; |
1436 | 0 | *((&_21)+aIndex) = aVector.y; |
1437 | 0 | *((&_31)+aIndex) = aVector.z; |
1438 | 0 | *((&_41)+aIndex) = aVector.w; |
1439 | 0 | } |
1440 | | |
1441 | | bool Decompose(Point3D& translation, Quaternion& rotation, Point3D& scale) const |
1442 | | { |
1443 | | // Ensure matrix can be normalized |
1444 | | if (gfx::FuzzyEqual(_44, 0.0f)) { |
1445 | | return false; |
1446 | | } |
1447 | | Matrix4x4Typed mat = *this; |
1448 | | mat.Normalize(); |
1449 | | if (HasPerspectiveComponent()) { |
1450 | | // We do not support projection matrices |
1451 | | return false; |
1452 | | } |
1453 | | |
1454 | | // Extract translation |
1455 | | translation.x = mat._41; |
1456 | | translation.y = mat._42; |
1457 | | translation.z = mat._43; |
1458 | | |
1459 | | // Remove translation |
1460 | | mat._41 = 0.0f; |
1461 | | mat._42 = 0.0f; |
1462 | | mat._43 = 0.0f; |
1463 | | |
1464 | | // Extract scale |
1465 | | scale.x = sqrtf(_11 * _11 + _21 * _21 + _31 * _31); |
1466 | | scale.y = sqrtf(_12 * _12 + _22 * _22 + _32 * _32); |
1467 | | scale.z = sqrtf(_13 * _13 + _23 * _23 + _33 * _33); |
1468 | | |
1469 | | // Remove scale |
1470 | | if (gfx::FuzzyEqual(scale.x, 0.0f) || |
1471 | | gfx::FuzzyEqual(scale.y, 0.0f) || |
1472 | | gfx::FuzzyEqual(scale.z, 0.0f)) { |
1473 | | // We do not support matrices with a zero scale component |
1474 | | return false; |
1475 | | } |
1476 | | Float invXS = 1.0f / scale.x; |
1477 | | Float invYS = 1.0f / scale.y; |
1478 | | Float invZS = 1.0f / scale.z; |
1479 | | mat._11 *= invXS; |
1480 | | mat._21 *= invXS; |
1481 | | mat._31 *= invXS; |
1482 | | mat._12 *= invYS; |
1483 | | mat._22 *= invYS; |
1484 | | mat._32 *= invYS; |
1485 | | mat._13 *= invZS; |
1486 | | mat._23 *= invZS; |
1487 | | mat._33 *= invZS; |
1488 | | |
1489 | | // Extract rotation |
1490 | | rotation.SetFromRotationMatrix(mat); |
1491 | | return true; |
1492 | | } |
1493 | | |
1494 | | // Sets this matrix to a rotation matrix given by aQuat. |
1495 | | // This quaternion *MUST* be normalized! |
1496 | | // Implemented in Quaternion.cpp |
1497 | | void SetRotationFromQuaternion(const Quaternion& q) |
1498 | 0 | { |
1499 | 0 | const Float x2 = q.x + q.x, y2 = q.y + q.y, z2 = q.z + q.z; |
1500 | 0 | const Float xx = q.x * x2, xy = q.x * y2, xz = q.x * z2; |
1501 | 0 | const Float yy = q.y * y2, yz = q.y * z2, zz = q.z * z2; |
1502 | 0 | const Float wx = q.w * x2, wy = q.w * y2, wz = q.w * z2; |
1503 | 0 |
|
1504 | 0 | _11 = 1.0f - (yy + zz); |
1505 | 0 | _21 = xy + wz; |
1506 | 0 | _31 = xz - wy; |
1507 | 0 | _41 = 0.0f; |
1508 | 0 |
|
1509 | 0 | _12 = xy - wz; |
1510 | 0 | _22 = 1.0f - (xx + zz); |
1511 | 0 | _32 = yz + wx; |
1512 | 0 | _42 = 0.0f; |
1513 | 0 |
|
1514 | 0 | _13 = xz + wy; |
1515 | 0 | _23 = yz - wx; |
1516 | 0 | _33 = 1.0f - (xx + yy); |
1517 | 0 | _43 = 0.0f; |
1518 | 0 |
|
1519 | 0 | _14 = _42 = _43 = 0.0f; |
1520 | 0 | _44 = 1.0f; |
1521 | 0 | } |
1522 | | |
1523 | | // Set all the members of the matrix to NaN |
1524 | | void SetNAN() |
1525 | 0 | { |
1526 | 0 | _11 = UnspecifiedNaN<Float>(); |
1527 | 0 | _21 = UnspecifiedNaN<Float>(); |
1528 | 0 | _31 = UnspecifiedNaN<Float>(); |
1529 | 0 | _41 = UnspecifiedNaN<Float>(); |
1530 | 0 | _12 = UnspecifiedNaN<Float>(); |
1531 | 0 | _22 = UnspecifiedNaN<Float>(); |
1532 | 0 | _32 = UnspecifiedNaN<Float>(); |
1533 | 0 | _42 = UnspecifiedNaN<Float>(); |
1534 | 0 | _13 = UnspecifiedNaN<Float>(); |
1535 | 0 | _23 = UnspecifiedNaN<Float>(); |
1536 | 0 | _33 = UnspecifiedNaN<Float>(); |
1537 | 0 | _43 = UnspecifiedNaN<Float>(); |
1538 | 0 | _14 = UnspecifiedNaN<Float>(); |
1539 | 0 | _24 = UnspecifiedNaN<Float>(); |
1540 | 0 | _34 = UnspecifiedNaN<Float>(); |
1541 | 0 | _44 = UnspecifiedNaN<Float>(); |
1542 | 0 | } |
1543 | | |
1544 | | void SkewXY(double aXSkew, double aYSkew) |
1545 | 0 | { |
1546 | 0 | // XXX Is double precision really necessary here |
1547 | 0 | float tanX = SafeTangent(aXSkew); |
1548 | 0 | float tanY = SafeTangent(aYSkew); |
1549 | 0 | float temp; |
1550 | 0 |
|
1551 | 0 | temp = _11; |
1552 | 0 | _11 += tanY * _21; |
1553 | 0 | _21 += tanX * temp; |
1554 | 0 |
|
1555 | 0 | temp = _12; |
1556 | 0 | _12 += tanY * _22; |
1557 | 0 | _22 += tanX * temp; |
1558 | 0 |
|
1559 | 0 | temp = _13; |
1560 | 0 | _13 += tanY * _23; |
1561 | 0 | _23 += tanX * temp; |
1562 | 0 |
|
1563 | 0 | temp = _14; |
1564 | 0 | _14 += tanY * _24; |
1565 | 0 | _24 += tanX * temp; |
1566 | 0 | } |
1567 | | |
1568 | | void RotateX(double aTheta) |
1569 | 0 | { |
1570 | 0 | // XXX Is double precision really necessary here |
1571 | 0 | double cosTheta = FlushToZero(cos(aTheta)); |
1572 | 0 | double sinTheta = FlushToZero(sin(aTheta)); |
1573 | 0 |
|
1574 | 0 | float temp; |
1575 | 0 |
|
1576 | 0 | temp = _21; |
1577 | 0 | _21 = cosTheta * _21 + sinTheta * _31; |
1578 | 0 | _31 = -sinTheta * temp + cosTheta * _31; |
1579 | 0 |
|
1580 | 0 | temp = _22; |
1581 | 0 | _22 = cosTheta * _22 + sinTheta * _32; |
1582 | 0 | _32 = -sinTheta * temp + cosTheta * _32; |
1583 | 0 |
|
1584 | 0 | temp = _23; |
1585 | 0 | _23 = cosTheta * _23 + sinTheta * _33; |
1586 | 0 | _33 = -sinTheta * temp + cosTheta * _33; |
1587 | 0 |
|
1588 | 0 | temp = _24; |
1589 | 0 | _24 = cosTheta * _24 + sinTheta * _34; |
1590 | 0 | _34 = -sinTheta * temp + cosTheta * _34; |
1591 | 0 | } |
1592 | | |
1593 | | void RotateY(double aTheta) |
1594 | 0 | { |
1595 | 0 | // XXX Is double precision really necessary here |
1596 | 0 | double cosTheta = FlushToZero(cos(aTheta)); |
1597 | 0 | double sinTheta = FlushToZero(sin(aTheta)); |
1598 | 0 |
|
1599 | 0 | float temp; |
1600 | 0 |
|
1601 | 0 | temp = _11; |
1602 | 0 | _11 = cosTheta * _11 + -sinTheta * _31; |
1603 | 0 | _31 = sinTheta * temp + cosTheta * _31; |
1604 | 0 |
|
1605 | 0 | temp = _12; |
1606 | 0 | _12 = cosTheta * _12 + -sinTheta * _32; |
1607 | 0 | _32 = sinTheta * temp + cosTheta * _32; |
1608 | 0 |
|
1609 | 0 | temp = _13; |
1610 | 0 | _13 = cosTheta * _13 + -sinTheta * _33; |
1611 | 0 | _33 = sinTheta * temp + cosTheta * _33; |
1612 | 0 |
|
1613 | 0 | temp = _14; |
1614 | 0 | _14 = cosTheta * _14 + -sinTheta * _34; |
1615 | 0 | _34 = sinTheta * temp + cosTheta * _34; |
1616 | 0 | } |
1617 | | |
1618 | | void RotateZ(double aTheta) |
1619 | 0 | { |
1620 | 0 | // XXX Is double precision really necessary here |
1621 | 0 | double cosTheta = FlushToZero(cos(aTheta)); |
1622 | 0 | double sinTheta = FlushToZero(sin(aTheta)); |
1623 | 0 |
|
1624 | 0 | float temp; |
1625 | 0 |
|
1626 | 0 | temp = _11; |
1627 | 0 | _11 = cosTheta * _11 + sinTheta * _21; |
1628 | 0 | _21 = -sinTheta * temp + cosTheta * _21; |
1629 | 0 |
|
1630 | 0 | temp = _12; |
1631 | 0 | _12 = cosTheta * _12 + sinTheta * _22; |
1632 | 0 | _22 = -sinTheta * temp + cosTheta * _22; |
1633 | 0 |
|
1634 | 0 | temp = _13; |
1635 | 0 | _13 = cosTheta * _13 + sinTheta * _23; |
1636 | 0 | _23 = -sinTheta * temp + cosTheta * _23; |
1637 | 0 |
|
1638 | 0 | temp = _14; |
1639 | 0 | _14 = cosTheta * _14 + sinTheta * _24; |
1640 | 0 | _24 = -sinTheta * temp + cosTheta * _24; |
1641 | 0 | } |
1642 | | |
1643 | | // Sets this matrix to a rotation matrix about a |
1644 | | // vector [x,y,z] by angle theta. The vector is normalized |
1645 | | // to a unit vector. |
1646 | | // https://drafts.csswg.org/css-transforms-2/#Rotate3dDefined |
1647 | | void SetRotateAxisAngle(double aX, double aY, double aZ, double aTheta) |
1648 | 0 | { |
1649 | 0 | Point3D vector(aX, aY, aZ); |
1650 | 0 | if (!vector.Length()) { |
1651 | 0 | return; |
1652 | 0 | } |
1653 | 0 | vector.RobustNormalize(); |
1654 | 0 |
|
1655 | 0 | double x = vector.x; |
1656 | 0 | double y = vector.y; |
1657 | 0 | double z = vector.z; |
1658 | 0 |
|
1659 | 0 | double cosTheta = FlushToZero(cos(aTheta)); |
1660 | 0 | double sinTheta = FlushToZero(sin(aTheta)); |
1661 | 0 |
|
1662 | 0 | // sin(aTheta / 2) * cos(aTheta / 2) |
1663 | 0 | double sc = sinTheta / 2; |
1664 | 0 | // pow(sin(aTheta / 2), 2) |
1665 | 0 | double sq = (1 - cosTheta) / 2; |
1666 | 0 |
|
1667 | 0 | _11 = 1 - 2 * (y * y + z * z) * sq; |
1668 | 0 | _12 = 2 * (x * y * sq + z * sc); |
1669 | 0 | _13 = 2 * (x * z * sq - y * sc); |
1670 | 0 | _14 = 0.0f; |
1671 | 0 | _21 = 2 * (x * y * sq - z * sc); |
1672 | 0 | _22 = 1 - 2 * (x * x + z * z) * sq; |
1673 | 0 | _23 = 2 * (y * z * sq + x * sc); |
1674 | 0 | _24 = 0.0f; |
1675 | 0 | _31 = 2 * (x * z * sq + y * sc); |
1676 | 0 | _32 = 2 * (y * z * sq - x * sc); |
1677 | 0 | _33 = 1 - 2 * (x * x + y * y) * sq; |
1678 | 0 | _34 = 0.0f; |
1679 | 0 | _41 = 0.0f; |
1680 | 0 | _42 = 0.0f; |
1681 | 0 | _43 = 0.0f; |
1682 | 0 | _44 = 1.0f; |
1683 | 0 | } |
1684 | | |
1685 | | void Perspective(float aDepth) |
1686 | 0 | { |
1687 | 0 | MOZ_ASSERT(aDepth > 0.0f, "Perspective must be positive!"); |
1688 | 0 | _31 += -1.0/aDepth * _41; |
1689 | 0 | _32 += -1.0/aDepth * _42; |
1690 | 0 | _33 += -1.0/aDepth * _43; |
1691 | 0 | _34 += -1.0/aDepth * _44; |
1692 | 0 | } |
1693 | | |
1694 | | Point3D GetNormalVector() const |
1695 | 0 | { |
1696 | 0 | // Define a plane in transformed space as the transformations |
1697 | 0 | // of 3 points on the z=0 screen plane. |
1698 | 0 | Point3D a = TransformPoint(Point3D(0, 0, 0)); |
1699 | 0 | Point3D b = TransformPoint(Point3D(0, 1, 0)); |
1700 | 0 | Point3D c = TransformPoint(Point3D(1, 0, 0)); |
1701 | 0 |
|
1702 | 0 | // Convert to two vectors on the surface of the plane. |
1703 | 0 | Point3D ab = b - a; |
1704 | 0 | Point3D ac = c - a; |
1705 | 0 |
|
1706 | 0 | return ac.CrossProduct(ab); |
1707 | 0 | } |
1708 | | |
1709 | | /** |
1710 | | * Returns true if the matrix has any transform other |
1711 | | * than a straight translation. |
1712 | | */ |
1713 | 0 | bool HasNonTranslation() const { |
1714 | 0 | return !gfx::FuzzyEqual(_11, 1.0) || !gfx::FuzzyEqual(_22, 1.0) || |
1715 | 0 | !gfx::FuzzyEqual(_12, 0.0) || !gfx::FuzzyEqual(_21, 0.0) || |
1716 | 0 | !gfx::FuzzyEqual(_13, 0.0) || !gfx::FuzzyEqual(_23, 0.0) || |
1717 | 0 | !gfx::FuzzyEqual(_31, 0.0) || !gfx::FuzzyEqual(_32, 0.0) || |
1718 | 0 | !gfx::FuzzyEqual(_33, 1.0); |
1719 | 0 | } |
1720 | | |
1721 | | /** |
1722 | | * Returns true if the matrix is anything other than a straight |
1723 | | * translation by integers. |
1724 | | */ |
1725 | 0 | bool HasNonIntegerTranslation() const { |
1726 | 0 | return HasNonTranslation() || |
1727 | 0 | !gfx::FuzzyEqual(_41, floor(_41 + 0.5)) || |
1728 | 0 | !gfx::FuzzyEqual(_42, floor(_42 + 0.5)) || |
1729 | 0 | !gfx::FuzzyEqual(_43, floor(_43 + 0.5)); |
1730 | 0 | } |
1731 | | |
1732 | | /** |
1733 | | * Return true if the matrix is with perspective (w). |
1734 | | */ |
1735 | 0 | bool HasPerspectiveComponent() const { |
1736 | 0 | return _14 != 0 || _24 != 0 || _34 != 0 || _44 != 1; |
1737 | 0 | } |
1738 | | |
1739 | | /* Returns true if the matrix is a rectilinear transformation (i.e. |
1740 | | * grid-aligned rectangles are transformed to grid-aligned rectangles). |
1741 | | * This should only be called on 2D matrices. |
1742 | | */ |
1743 | | bool IsRectilinear() const { |
1744 | | MOZ_ASSERT(Is2D()); |
1745 | | if (gfx::FuzzyEqual(_12, 0) && gfx::FuzzyEqual(_21, 0)) { |
1746 | | return true; |
1747 | | } else if (gfx::FuzzyEqual(_22, 0) && gfx::FuzzyEqual(_11, 0)) { |
1748 | | return true; |
1749 | | } |
1750 | | return false; |
1751 | | } |
1752 | | |
1753 | | /** |
1754 | | * Convert between typed and untyped matrices. |
1755 | | */ |
1756 | 0 | Matrix4x4 ToUnknownMatrix() const { |
1757 | 0 | return Matrix4x4{_11, _12, _13, _14, |
1758 | 0 | _21, _22, _23, _24, |
1759 | 0 | _31, _32, _33, _34, |
1760 | 0 | _41, _42, _43, _44}; |
1761 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::ToUnknownMatrix() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ToUnknownMatrix() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::ToUnknownMatrix() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::ToUnknownMatrix() const Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::ToUnknownMatrix() const |
1762 | 0 | static Matrix4x4Typed FromUnknownMatrix(const Matrix4x4& aUnknown) { |
1763 | 0 | return Matrix4x4Typed{aUnknown._11, aUnknown._12, aUnknown._13, aUnknown._14, |
1764 | 0 | aUnknown._21, aUnknown._22, aUnknown._23, aUnknown._24, |
1765 | 0 | aUnknown._31, aUnknown._32, aUnknown._33, aUnknown._34, |
1766 | 0 | aUnknown._41, aUnknown._42, aUnknown._43, aUnknown._44}; |
1767 | 0 | } Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::CSSTransformedLayerPixel, mozilla::ParentLayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::CSSTransformedLayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayerPixel, mozilla::ParentLayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ScreenPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::ParentLayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ScreenPixel, mozilla::ParentLayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::LayerPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::ParentLayerPixel, mozilla::RenderTargetPixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) Unexecuted instantiation: mozilla::gfx::Matrix4x4Typed<mozilla::LayoutDevicePixel, mozilla::LayoutDevicePixel>::FromUnknownMatrix(mozilla::gfx::Matrix4x4Typed<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits> const&) |
1768 | | }; |
1769 | | |
1770 | | typedef Matrix4x4Typed<UnknownUnits, UnknownUnits> Matrix4x4; |
1771 | | |
1772 | | class Matrix5x4 |
1773 | | { |
1774 | | public: |
1775 | | Matrix5x4() |
1776 | | : _11(1.0f), _12(0), _13(0), _14(0) |
1777 | | , _21(0), _22(1.0f), _23(0), _24(0) |
1778 | | , _31(0), _32(0), _33(1.0f), _34(0) |
1779 | | , _41(0), _42(0), _43(0), _44(1.0f) |
1780 | | , _51(0), _52(0), _53(0), _54(0) |
1781 | | {} |
1782 | | Matrix5x4(Float a11, Float a12, Float a13, Float a14, |
1783 | | Float a21, Float a22, Float a23, Float a24, |
1784 | | Float a31, Float a32, Float a33, Float a34, |
1785 | | Float a41, Float a42, Float a43, Float a44, |
1786 | | Float a51, Float a52, Float a53, Float a54) |
1787 | | : _11(a11), _12(a12), _13(a13), _14(a14) |
1788 | | , _21(a21), _22(a22), _23(a23), _24(a24) |
1789 | | , _31(a31), _32(a32), _33(a33), _34(a34) |
1790 | | , _41(a41), _42(a42), _43(a43), _44(a44) |
1791 | | , _51(a51), _52(a52), _53(a53), _54(a54) |
1792 | 0 | {} |
1793 | | |
1794 | | bool operator==(const Matrix5x4 &o) const |
1795 | 0 | { |
1796 | 0 | return _11 == o._11 && _12 == o._12 && _13 == o._13 && _14 == o._14 && |
1797 | 0 | _21 == o._21 && _22 == o._22 && _23 == o._23 && _24 == o._24 && |
1798 | 0 | _31 == o._31 && _32 == o._32 && _33 == o._33 && _34 == o._34 && |
1799 | 0 | _41 == o._41 && _42 == o._42 && _43 == o._43 && _44 == o._44 && |
1800 | 0 | _51 == o._51 && _52 == o._52 && _53 == o._53 && _54 == o._54; |
1801 | 0 | } |
1802 | | |
1803 | | bool operator!=(const Matrix5x4 &aMatrix) const |
1804 | 0 | { |
1805 | 0 | return !(*this == aMatrix); |
1806 | 0 | } |
1807 | | |
1808 | | Matrix5x4 operator*(const Matrix5x4 &aMatrix) const |
1809 | 0 | { |
1810 | 0 | Matrix5x4 resultMatrix; |
1811 | 0 |
|
1812 | 0 | resultMatrix._11 = this->_11 * aMatrix._11 + this->_12 * aMatrix._21 + this->_13 * aMatrix._31 + this->_14 * aMatrix._41; |
1813 | 0 | resultMatrix._12 = this->_11 * aMatrix._12 + this->_12 * aMatrix._22 + this->_13 * aMatrix._32 + this->_14 * aMatrix._42; |
1814 | 0 | resultMatrix._13 = this->_11 * aMatrix._13 + this->_12 * aMatrix._23 + this->_13 * aMatrix._33 + this->_14 * aMatrix._43; |
1815 | 0 | resultMatrix._14 = this->_11 * aMatrix._14 + this->_12 * aMatrix._24 + this->_13 * aMatrix._34 + this->_14 * aMatrix._44; |
1816 | 0 | resultMatrix._21 = this->_21 * aMatrix._11 + this->_22 * aMatrix._21 + this->_23 * aMatrix._31 + this->_24 * aMatrix._41; |
1817 | 0 | resultMatrix._22 = this->_21 * aMatrix._12 + this->_22 * aMatrix._22 + this->_23 * aMatrix._32 + this->_24 * aMatrix._42; |
1818 | 0 | resultMatrix._23 = this->_21 * aMatrix._13 + this->_22 * aMatrix._23 + this->_23 * aMatrix._33 + this->_24 * aMatrix._43; |
1819 | 0 | resultMatrix._24 = this->_21 * aMatrix._14 + this->_22 * aMatrix._24 + this->_23 * aMatrix._34 + this->_24 * aMatrix._44; |
1820 | 0 | resultMatrix._31 = this->_31 * aMatrix._11 + this->_32 * aMatrix._21 + this->_33 * aMatrix._31 + this->_34 * aMatrix._41; |
1821 | 0 | resultMatrix._32 = this->_31 * aMatrix._12 + this->_32 * aMatrix._22 + this->_33 * aMatrix._32 + this->_34 * aMatrix._42; |
1822 | 0 | resultMatrix._33 = this->_31 * aMatrix._13 + this->_32 * aMatrix._23 + this->_33 * aMatrix._33 + this->_34 * aMatrix._43; |
1823 | 0 | resultMatrix._34 = this->_31 * aMatrix._14 + this->_32 * aMatrix._24 + this->_33 * aMatrix._34 + this->_34 * aMatrix._44; |
1824 | 0 | resultMatrix._41 = this->_41 * aMatrix._11 + this->_42 * aMatrix._21 + this->_43 * aMatrix._31 + this->_44 * aMatrix._41; |
1825 | 0 | resultMatrix._42 = this->_41 * aMatrix._12 + this->_42 * aMatrix._22 + this->_43 * aMatrix._32 + this->_44 * aMatrix._42; |
1826 | 0 | resultMatrix._43 = this->_41 * aMatrix._13 + this->_42 * aMatrix._23 + this->_43 * aMatrix._33 + this->_44 * aMatrix._43; |
1827 | 0 | resultMatrix._44 = this->_41 * aMatrix._14 + this->_42 * aMatrix._24 + this->_43 * aMatrix._34 + this->_44 * aMatrix._44; |
1828 | 0 | resultMatrix._51 = this->_51 * aMatrix._11 + this->_52 * aMatrix._21 + this->_53 * aMatrix._31 + this->_54 * aMatrix._41 + aMatrix._51; |
1829 | 0 | resultMatrix._52 = this->_51 * aMatrix._12 + this->_52 * aMatrix._22 + this->_53 * aMatrix._32 + this->_54 * aMatrix._42 + aMatrix._52; |
1830 | 0 | resultMatrix._53 = this->_51 * aMatrix._13 + this->_52 * aMatrix._23 + this->_53 * aMatrix._33 + this->_54 * aMatrix._43 + aMatrix._53; |
1831 | 0 | resultMatrix._54 = this->_51 * aMatrix._14 + this->_52 * aMatrix._24 + this->_53 * aMatrix._34 + this->_54 * aMatrix._44 + aMatrix._54; |
1832 | 0 |
|
1833 | 0 | return resultMatrix; |
1834 | 0 | } |
1835 | | |
1836 | | Matrix5x4& operator*=(const Matrix5x4 &aMatrix) |
1837 | 0 | { |
1838 | 0 | *this = *this * aMatrix; |
1839 | 0 | return *this; |
1840 | 0 | } |
1841 | | |
1842 | | union { |
1843 | | struct { |
1844 | | Float _11, _12, _13, _14; |
1845 | | Float _21, _22, _23, _24; |
1846 | | Float _31, _32, _33, _34; |
1847 | | Float _41, _42, _43, _44; |
1848 | | Float _51, _52, _53, _54; |
1849 | | }; |
1850 | | Float components[20]; |
1851 | | }; |
1852 | | }; |
1853 | | |
1854 | | /* This Matrix class will carry one additional type field in order to |
1855 | | * track what type of 4x4 matrix we're dealing with, it can then execute |
1856 | | * simplified versions of certain operations when applicable. |
1857 | | * This does not allow access to the parent class directly, as a caller |
1858 | | * could then mutate the parent class without updating the type. |
1859 | | */ |
1860 | | template <typename SourceUnits, typename TargetUnits> |
1861 | | class Matrix4x4TypedFlagged : protected Matrix4x4Typed<SourceUnits, TargetUnits> |
1862 | | { |
1863 | | public: |
1864 | | using Parent = Matrix4x4Typed<SourceUnits, TargetUnits>; |
1865 | | using TargetPoint = PointTyped<TargetUnits>; |
1866 | | using Parent::_11; using Parent::_12; using Parent::_13; using Parent::_14; |
1867 | | using Parent::_21; using Parent::_22; using Parent::_23; using Parent::_24; |
1868 | | using Parent::_31; using Parent::_32; using Parent::_33; using Parent::_34; |
1869 | | using Parent::_41; using Parent::_42; using Parent::_43; using Parent::_44; |
1870 | | |
1871 | | Matrix4x4TypedFlagged() |
1872 | | : mType(MatrixType::Identity) |
1873 | 0 | {} |
1874 | | |
1875 | | Matrix4x4TypedFlagged(Float a11, Float a12, Float a13, Float a14, |
1876 | | Float a21, Float a22, Float a23, Float a24, |
1877 | | Float a31, Float a32, Float a33, Float a34, |
1878 | | Float a41, Float a42, Float a43, Float a44) |
1879 | | : Parent(a11, a12, a13, a14, a21, a22, a23, a24, |
1880 | | a31, a32, a33, a34, a41, a42, a43, a44) |
1881 | | { |
1882 | | Analyze(); |
1883 | | } |
1884 | | |
1885 | | MOZ_IMPLICIT Matrix4x4TypedFlagged(const Parent& aOther) |
1886 | | : Parent(aOther) |
1887 | 0 | { |
1888 | 0 | Analyze(); |
1889 | 0 | } |
1890 | | |
1891 | | template<class F> |
1892 | | PointTyped<TargetUnits, F> TransformPoint(const PointTyped<SourceUnits, F> &aPoint) const |
1893 | 0 | { |
1894 | 0 | if (mType == MatrixType::Identity) { |
1895 | 0 | return aPoint; |
1896 | 0 | } |
1897 | 0 | |
1898 | 0 | if (mType == MatrixType::Simple) { |
1899 | 0 | return TransformPointSimple(aPoint); |
1900 | 0 | } |
1901 | 0 | |
1902 | 0 | return Parent::TransformPoint(aPoint); |
1903 | 0 | } |
1904 | | |
1905 | | template<class F> |
1906 | | RectTyped<TargetUnits, F> TransformAndClipBounds(const RectTyped<SourceUnits, F>& aRect, |
1907 | | const RectTyped<TargetUnits, F>& aClip) const |
1908 | 0 | { |
1909 | 0 | if (mType == MatrixType::Identity) { |
1910 | 0 | const RectTyped<SourceUnits, F>& clipped = aRect.Intersect(aClip); |
1911 | 0 | return RectTyped<TargetUnits, F>(clipped.X(), clipped.Y(), |
1912 | 0 | clipped.Width(), clipped.Height()); |
1913 | 0 | } |
1914 | 0 | |
1915 | 0 | if (mType == MatrixType::Simple) { |
1916 | 0 | PointTyped<UnknownUnits, F> p1 = TransformPointSimple(aRect.TopLeft()); |
1917 | 0 | PointTyped<UnknownUnits, F> p2 = TransformPointSimple(aRect.TopRight()); |
1918 | 0 | PointTyped<UnknownUnits, F> p3 = TransformPointSimple(aRect.BottomLeft()); |
1919 | 0 | PointTyped<UnknownUnits, F> p4 = TransformPointSimple(aRect.BottomRight()); |
1920 | 0 |
|
1921 | 0 | F min_x = std::min(std::min(std::min(p1.x, p2.x), p3.x), p4.x); |
1922 | 0 | F max_x = std::max(std::max(std::max(p1.x, p2.x), p3.x), p4.x); |
1923 | 0 | F min_y = std::min(std::min(std::min(p1.y, p2.y), p3.y), p4.y); |
1924 | 0 | F max_y = std::max(std::max(std::max(p1.y, p2.y), p3.y), p4.y); |
1925 | 0 |
|
1926 | 0 | TargetPoint topLeft(std::max(min_x, aClip.x), std::max(min_y, aClip.y)); |
1927 | 0 | F xMost = std::min(max_x, aClip.XMost()) - topLeft.x; |
1928 | 0 | F yMost = std::min(max_y, aClip.YMost()) - topLeft.y; |
1929 | 0 |
|
1930 | 0 | return RectTyped<TargetUnits, F>(topLeft.x, topLeft.y, xMost, yMost); |
1931 | 0 | } |
1932 | 0 | return Parent::TransformAndClipBounds(aRect, aClip); |
1933 | 0 | } Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformAndClipBounds<float>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformAndClipBounds<double>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&) const |
1934 | | |
1935 | | bool FuzzyEqual(const Parent& o) const |
1936 | 0 | { |
1937 | 0 | return Parent::FuzzyEqual(o); |
1938 | 0 | } |
1939 | | |
1940 | | bool FuzzyEqual(const Matrix4x4TypedFlagged& o) const |
1941 | 0 | { |
1942 | 0 | if (mType == MatrixType::Identity && o.mType == MatrixType::Identity) { |
1943 | 0 | return true; |
1944 | 0 | } |
1945 | 0 | return Parent::FuzzyEqual(o); |
1946 | 0 | } |
1947 | | |
1948 | | Matrix4x4TypedFlagged &PreTranslate(Float aX, Float aY, Float aZ) |
1949 | 0 | { |
1950 | 0 | if (mType == MatrixType::Identity) { |
1951 | 0 | _41 = aX; |
1952 | 0 | _42 = aY; |
1953 | 0 | _43 = aZ; |
1954 | 0 |
|
1955 | 0 | if (!aZ) { |
1956 | 0 | mType = MatrixType::Simple; |
1957 | 0 | return *this; |
1958 | 0 | } |
1959 | 0 | mType = MatrixType::Full; |
1960 | 0 | return *this; |
1961 | 0 | } |
1962 | 0 | |
1963 | 0 | Parent::PreTranslate(aX, aY, aZ); |
1964 | 0 |
|
1965 | 0 | if (aZ != 0) { |
1966 | 0 | mType = MatrixType::Full; |
1967 | 0 | } |
1968 | 0 |
|
1969 | 0 | return *this; |
1970 | 0 | } |
1971 | | |
1972 | | Matrix4x4TypedFlagged &PostTranslate(Float aX, Float aY, Float aZ) |
1973 | 0 | { |
1974 | 0 | if (mType == MatrixType::Identity) { |
1975 | 0 | _41 = aX; |
1976 | 0 | _42 = aY; |
1977 | 0 | _43 = aZ; |
1978 | 0 |
|
1979 | 0 | if (!aZ) { |
1980 | 0 | mType = MatrixType::Simple; |
1981 | 0 | return *this; |
1982 | 0 | } |
1983 | 0 | mType = MatrixType::Full; |
1984 | 0 | return *this; |
1985 | 0 | } |
1986 | 0 | |
1987 | 0 | Parent::PostTranslate(aX, aY, aZ); |
1988 | 0 |
|
1989 | 0 | if (aZ != 0) { |
1990 | 0 | mType = MatrixType::Full; |
1991 | 0 | } |
1992 | 0 |
|
1993 | 0 | return *this; |
1994 | 0 | } |
1995 | | |
1996 | | Matrix4x4TypedFlagged &ChangeBasis(Float aX, Float aY, Float aZ) |
1997 | 0 | { |
1998 | 0 | // Translate to the origin before applying this matrix |
1999 | 0 | PreTranslate(-aX, -aY, -aZ); |
2000 | 0 |
|
2001 | 0 | // Translate back into position after applying this matrix |
2002 | 0 | PostTranslate(aX, aY, aZ); |
2003 | 0 |
|
2004 | 0 | return *this; |
2005 | 0 | } |
2006 | | |
2007 | | bool IsIdentity() const |
2008 | | { |
2009 | | return mType == MatrixType::Identity; |
2010 | | } |
2011 | | |
2012 | | template<class F> |
2013 | | Point4DTyped<TargetUnits, F> |
2014 | 0 | ProjectPoint(const PointTyped<SourceUnits, F>& aPoint) const { |
2015 | 0 | if (mType == MatrixType::Identity) { |
2016 | 0 | return Point4DTyped<TargetUnits, F>(aPoint.x, aPoint.y, 0, 1); |
2017 | 0 | } |
2018 | 0 | |
2019 | 0 | if (mType == MatrixType::Simple) { |
2020 | 0 | TargetPoint point = TransformPointSimple(aPoint); |
2021 | 0 | return Point4DTyped<TargetUnits, F>(point.x, point.y, 0, 1); |
2022 | 0 | } |
2023 | 0 | |
2024 | 0 | return Parent::ProjectPoint(aPoint); |
2025 | 0 | } |
2026 | | |
2027 | 0 | Matrix4x4TypedFlagged& ProjectTo2D() { |
2028 | 0 | if (mType == MatrixType::Full) { |
2029 | 0 | Parent::ProjectTo2D(); |
2030 | 0 | } |
2031 | 0 | return *this; |
2032 | 0 | } |
2033 | | |
2034 | | bool IsSingular() const |
2035 | 0 | { |
2036 | 0 | if (mType == MatrixType::Identity) { |
2037 | 0 | return false; |
2038 | 0 | } |
2039 | 0 | return Parent::Determinant() == 0.0; |
2040 | 0 | } |
2041 | | |
2042 | | bool Invert() |
2043 | 0 | { |
2044 | 0 | if (mType == MatrixType::Identity) { |
2045 | 0 | return true; |
2046 | 0 | } |
2047 | 0 | |
2048 | 0 | return Parent::Invert(); |
2049 | 0 | } |
2050 | | |
2051 | | Matrix4x4TypedFlagged<TargetUnits, SourceUnits> Inverse() const |
2052 | 0 | { |
2053 | 0 | typedef Matrix4x4TypedFlagged<TargetUnits, SourceUnits> InvertedMatrix; |
2054 | 0 | InvertedMatrix clone = InvertedMatrix::FromUnknownMatrix(ToUnknownMatrix()); |
2055 | 0 | if (mType == MatrixType::Identity) { |
2056 | 0 | return clone; |
2057 | 0 | } |
2058 | 0 | DebugOnly<bool> inverted = clone.Invert(); |
2059 | 0 | MOZ_ASSERT(inverted, "Attempted to get the inverse of a non-invertible matrix"); |
2060 | 0 |
|
2061 | 0 | // Inverting a 2D Matrix should result in a 2D matrix, ergo mType doesn't change. |
2062 | 0 | return clone; |
2063 | 0 | } |
2064 | | |
2065 | | template <typename NewTargetUnits> |
2066 | | bool operator==(const Matrix4x4TypedFlagged<TargetUnits, NewTargetUnits> &aMatrix) const |
2067 | | { |
2068 | | if (mType == MatrixType::Identity && aMatrix.mType == MatrixType::Identity) { |
2069 | | return true; |
2070 | | } |
2071 | | // Depending on the usage it may make sense to compare more flags. |
2072 | | return Parent::operator==(aMatrix); |
2073 | | } |
2074 | | |
2075 | | template <typename NewTargetUnits> |
2076 | | bool operator!=(const Matrix4x4TypedFlagged<TargetUnits, NewTargetUnits> &aMatrix) const |
2077 | 0 | { |
2078 | 0 | if (mType == MatrixType::Identity && aMatrix.mType == MatrixType::Identity) { |
2079 | 0 | return false; |
2080 | 0 | } |
2081 | 0 | // Depending on the usage it may make sense to compare more flags. |
2082 | 0 | return Parent::operator!=(aMatrix); |
2083 | 0 | } |
2084 | | |
2085 | | template <typename NewTargetUnits> |
2086 | | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> operator*(const Matrix4x4Typed<TargetUnits, NewTargetUnits> &aMatrix) const |
2087 | | { |
2088 | | if (mType == MatrixType::Identity) { |
2089 | | return aMatrix; |
2090 | | } |
2091 | | |
2092 | | if (mType == MatrixType::Simple) { |
2093 | | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> matrix; |
2094 | | matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21; |
2095 | | matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21; |
2096 | | matrix._31 = aMatrix._31; |
2097 | | matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21; |
2098 | | matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22; |
2099 | | matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22; |
2100 | | matrix._32 = aMatrix._32; |
2101 | | matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22; |
2102 | | matrix._13 = _11 * aMatrix._13 + _12 * aMatrix._23; |
2103 | | matrix._23 = _21 * aMatrix._13 + _22 * aMatrix._23; |
2104 | | matrix._33 = aMatrix._33; |
2105 | | matrix._43 = _41 * aMatrix._13 + _42 * aMatrix._23; |
2106 | | matrix._14 = _11 * aMatrix._14 + _12 * aMatrix._24; |
2107 | | matrix._24 = _21 * aMatrix._14 + _22 * aMatrix._24; |
2108 | | matrix._34 = aMatrix._34; |
2109 | | matrix._44 = _41 * aMatrix._14 + _42 * aMatrix._24; |
2110 | | matrix.Analyze(); |
2111 | | return matrix; |
2112 | | } |
2113 | | |
2114 | | return Parent::operator*(aMatrix); |
2115 | | } |
2116 | | |
2117 | | template <typename NewTargetUnits> |
2118 | | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> operator*(const Matrix4x4TypedFlagged<TargetUnits, NewTargetUnits> &aMatrix) const |
2119 | 0 | { |
2120 | 0 | if (mType == MatrixType::Identity) { |
2121 | 0 | return aMatrix; |
2122 | 0 | } |
2123 | 0 | |
2124 | 0 | if (aMatrix.mType == MatrixType::Identity) { |
2125 | 0 | return Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits>::FromUnknownMatrix(this->ToUnknownMatrix()); |
2126 | 0 | } |
2127 | 0 | |
2128 | 0 | if (mType == MatrixType::Simple && aMatrix.mType == MatrixType::Simple) { |
2129 | 0 | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> matrix; |
2130 | 0 | matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21; |
2131 | 0 | matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21; |
2132 | 0 | matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21 + aMatrix._41; |
2133 | 0 | matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22; |
2134 | 0 | matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22; |
2135 | 0 | matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22 + aMatrix._42; |
2136 | 0 | matrix.mType = MatrixType::Simple; |
2137 | 0 | return matrix; |
2138 | 0 | } else if (mType == MatrixType::Simple) { |
2139 | 0 | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> matrix; |
2140 | 0 | matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21; |
2141 | 0 | matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21; |
2142 | 0 | matrix._31 = aMatrix._31; |
2143 | 0 | matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21 + aMatrix._41; |
2144 | 0 | matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22; |
2145 | 0 | matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22; |
2146 | 0 | matrix._32 = aMatrix._32; |
2147 | 0 | matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22 + aMatrix._42; |
2148 | 0 | matrix._13 = _11 * aMatrix._13 + _12 * aMatrix._23; |
2149 | 0 | matrix._23 = _21 * aMatrix._13 + _22 * aMatrix._23; |
2150 | 0 | matrix._33 = aMatrix._33; |
2151 | 0 | matrix._43 = _41 * aMatrix._13 + _42 * aMatrix._23 + aMatrix._43; |
2152 | 0 | matrix._14 = _11 * aMatrix._14 + _12 * aMatrix._24; |
2153 | 0 | matrix._24 = _21 * aMatrix._14 + _22 * aMatrix._24; |
2154 | 0 | matrix._34 = aMatrix._34; |
2155 | 0 | matrix._44 = _41 * aMatrix._14 + _42 * aMatrix._24 + aMatrix._44; |
2156 | 0 | matrix.mType = MatrixType::Full; |
2157 | 0 | return matrix; |
2158 | 0 | } else if (aMatrix.mType == MatrixType::Simple) { |
2159 | 0 | Matrix4x4TypedFlagged<SourceUnits, NewTargetUnits> matrix; |
2160 | 0 | matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21 + _14 * aMatrix._41; |
2161 | 0 | matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21 + _24 * aMatrix._41; |
2162 | 0 | matrix._31 = _31 * aMatrix._11 + _32 * aMatrix._21 + _34 * aMatrix._41; |
2163 | 0 | matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21 + _44 * aMatrix._41; |
2164 | 0 | matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22 + _14 * aMatrix._42; |
2165 | 0 | matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22 + _24 * aMatrix._42; |
2166 | 0 | matrix._32 = _31 * aMatrix._12 + _32 * aMatrix._22 + _34 * aMatrix._42; |
2167 | 0 | matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22 + _44 * aMatrix._42; |
2168 | 0 | matrix._13 = _13; |
2169 | 0 | matrix._23 = _23; |
2170 | 0 | matrix._33 = _33; |
2171 | 0 | matrix._43 = _43; |
2172 | 0 | matrix._14 = _14; |
2173 | 0 | matrix._24 = _24; |
2174 | 0 | matrix._34 = _34; |
2175 | 0 | matrix._44 = _44; |
2176 | 0 | matrix.mType = MatrixType::Full; |
2177 | 0 | return matrix; |
2178 | 0 | } |
2179 | 0 | |
2180 | 0 | return Parent::operator*(aMatrix); |
2181 | 0 | } |
2182 | | |
2183 | | bool Is2D() const |
2184 | 0 | { |
2185 | 0 | return mType != MatrixType::Full; |
2186 | 0 | } |
2187 | | |
2188 | | bool CanDraw2D(Matrix* aMatrix = nullptr) const |
2189 | 0 | { |
2190 | 0 | if (mType != MatrixType::Full) { |
2191 | 0 | if (aMatrix) { |
2192 | 0 | aMatrix->_11 = _11; |
2193 | 0 | aMatrix->_12 = _12; |
2194 | 0 | aMatrix->_21 = _21; |
2195 | 0 | aMatrix->_22 = _22; |
2196 | 0 | aMatrix->_31 = _41; |
2197 | 0 | aMatrix->_32 = _42; |
2198 | 0 | } |
2199 | 0 | return true; |
2200 | 0 | } |
2201 | 0 | return Parent::CanDraw2D(aMatrix); |
2202 | 0 | } |
2203 | | |
2204 | 0 | bool Is2D(Matrix* aMatrix) const { |
2205 | 0 | if (!Is2D()) { |
2206 | 0 | return false; |
2207 | 0 | } |
2208 | 0 | if (aMatrix) { |
2209 | 0 | aMatrix->_11 = _11; |
2210 | 0 | aMatrix->_12 = _12; |
2211 | 0 | aMatrix->_21 = _21; |
2212 | 0 | aMatrix->_22 = _22; |
2213 | 0 | aMatrix->_31 = _41; |
2214 | 0 | aMatrix->_32 = _42; |
2215 | 0 | } |
2216 | 0 | return true; |
2217 | 0 | } |
2218 | | |
2219 | | template<class F> |
2220 | | RectTyped<TargetUnits, F> |
2221 | | ProjectRectBounds(const RectTyped<SourceUnits, F>& aRect, const RectTyped<TargetUnits, F>& aClip) const |
2222 | 0 | { |
2223 | 0 | return Parent::ProjectRectBounds(aRect, aClip); |
2224 | 0 | } Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectRectBounds<float>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::ProjectRectBounds<double>(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> const&) const |
2225 | | |
2226 | 0 | const Parent &GetMatrix() const { return *this; } |
2227 | | private: |
2228 | | enum class MatrixType : uint8_t |
2229 | | { |
2230 | | Identity, |
2231 | | Simple, // 2x3 Matrix |
2232 | | Full // 4x4 Matrix |
2233 | | }; |
2234 | | |
2235 | | Matrix4x4TypedFlagged(Float a11, Float a12, Float a13, Float a14, |
2236 | | Float a21, Float a22, Float a23, Float a24, |
2237 | | Float a31, Float a32, Float a33, Float a34, |
2238 | | Float a41, Float a42, Float a43, Float a44, |
2239 | | typename Matrix4x4TypedFlagged::MatrixType aType) |
2240 | | : Parent(a11, a12, a13, a14, a21, a22, a23, a24, |
2241 | | a31, a32, a33, a34, a41, a42, a43, a44) |
2242 | 0 | { |
2243 | 0 | mType = aType; |
2244 | 0 | } |
2245 | 0 | static Matrix4x4TypedFlagged FromUnknownMatrix(const Matrix4x4Flagged& aUnknown) { |
2246 | 0 | return Matrix4x4TypedFlagged{ aUnknown._11, aUnknown._12, aUnknown._13, aUnknown._14, |
2247 | 0 | aUnknown._21, aUnknown._22, aUnknown._23, aUnknown._24, |
2248 | 0 | aUnknown._31, aUnknown._32, aUnknown._33, aUnknown._34, |
2249 | 0 | aUnknown._41, aUnknown._42, aUnknown._43, aUnknown._44, aUnknown.mType }; |
2250 | 0 | } |
2251 | 0 | Matrix4x4Flagged ToUnknownMatrix() const { |
2252 | 0 | return Matrix4x4Flagged{ _11, _12, _13, _14, |
2253 | 0 | _21, _22, _23, _24, |
2254 | 0 | _31, _32, _33, _34, |
2255 | 0 | _41, _42, _43, _44, mType }; |
2256 | 0 | } |
2257 | | |
2258 | | template<class F> |
2259 | | PointTyped<TargetUnits, F> TransformPointSimple(const PointTyped<SourceUnits, F> &aPoint) const |
2260 | 0 | { |
2261 | 0 | PointTyped<SourceUnits, F> temp; |
2262 | 0 | temp.x = aPoint.x * _11 + aPoint.y * +_21 + _41; |
2263 | 0 | temp.y = aPoint.x * _12 + aPoint.y * +_22 + _42; |
2264 | 0 | return temp; |
2265 | 0 | } Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformPointSimple<float>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, float> const&) const Unexecuted instantiation: mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> mozilla::gfx::Matrix4x4TypedFlagged<mozilla::gfx::UnknownUnits, mozilla::gfx::UnknownUnits>::TransformPointSimple<double>(mozilla::gfx::PointTyped<mozilla::gfx::UnknownUnits, double> const&) const |
2266 | | |
2267 | 0 | void Analyze() { |
2268 | 0 | if (Parent::IsIdentity()) { |
2269 | 0 | mType = MatrixType::Identity; |
2270 | 0 | return; |
2271 | 0 | } |
2272 | 0 | |
2273 | 0 | if (Parent::Is2D()) { |
2274 | 0 | mType = MatrixType::Simple; |
2275 | 0 | return; |
2276 | 0 | } |
2277 | 0 | |
2278 | 0 | mType = MatrixType::Full; |
2279 | 0 | } |
2280 | | |
2281 | | MatrixType mType; |
2282 | | }; |
2283 | | |
2284 | | using Matrix4x4Flagged = Matrix4x4TypedFlagged<UnknownUnits, UnknownUnits>; |
2285 | | |
2286 | | } // namespace gfx |
2287 | | } // namespace mozilla |
2288 | | |
2289 | | #endif /* MOZILLA_GFX_MATRIX_H_ */ |