Coverage Report

Created: 2018-09-25 14:53

/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_ */