mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 13:23:07 +00:00
aec5e5666e
- bug 1083930 - cpu spin during large h2/spdy upload r=hurley (0949388a6a)
- Bug 1241906 - Spdy deadlock on suspended channel r=hurley (f40e9677d5)
- Bug 1247205 - dont loop on http2 softerror r=dragana (2ab3cb69ef)
- Bug 1246778 - dont loop in nshttpconnection during shutdown r=dragana (0677b9d34b)
- Bug 1201037 - only send "HTTP pings" on seemingly idle connections, r=mcmanus (134198bc79)
- Bug 1174899 - discarded spdy data with fin attributed to wrong stream r=bagder (f3b801c734)
- Bug 1236170 - Make Http2Session::UncompressAndDiscard push-aware. r=mcmanus (e71634e853)
- Bug 1240025 - incorrect close state on pushed stream r=hurley (eb2832177a)
- Bug 1227931 - init Http2Stream::mReceivedData in the constructor. r=nwgh (44f1d8e897)
- Bug 241788 - net_FilterURIString should filter \r\n\t from the entire URL r=honzab (734d9b8cae)
- Bug 1259459 - h2 0 length options puts end-stream on headers r=hurley (31ac211a9b)
- Bug 1174899 - fixup log format strings for spdy/h2 r=bagder (967c9ff71e)
- Bug 1211694 - dataLength has been added twice. r=mcmanus (6773981db3)
- cleanup (26517f5de0)
- Bug 1247998 - Let nsHttpChannel::AsyncOpen* throw after nsHttpHandler has been shutdown, r=mcmanus (90bb2364be)
- Bug 1231512 - Allow nsIHttpChannel.redirectTo() work also on an open channel, r=jduell (198fb72816)
- Bug 1242472 - Properly propagate mTopWindowURI through redirects. r=francois/ckerschb (1d27a15770)
- Bug 1133873 - some spdy logs r=hurley (cd95cfed5a)
- bug 1215724 - enable brotli on spdy r=hurley (83cca72fa5)
- Bug 137852 - Add a new working HTTP authentication identity to the begining of the session cache list. r=honzab (f670349771)
- Bug 1245414, part 1 - Delete the mfbt/decimal/LICENSE* files since upstream now just uses inline comments. r=Waldo (15bb211e14)
- Bug 1245414, part 2 - Update mfbt/decimal/update.sh to reflect Blink's switch from svn to git, and the different files we now pull. r=Waldo (4dd0b5916a)
- Bug 1245414, part 3 - Overwrite mfbt/decimal/Decimal.* with vanilla upstream copies. r=Waldo (98f7ba4711)
- Bug 1245414, part 4 - Update mfbt/decimal/zero-serialization.patch. r =Waldo (055e1354a7)
- Bug 1245414, part 5 - Update mfbt/decimal/comparison-with-nan.patch. r=Waldo (583e0f3e76)
- Bug 1245414, part 6 - Update mfbt/decimal/mfbt-abi-markers.patch. r=Waldo (148b1ac08b)
- Bug 1245414, part 7 - Update mfbt/decimal/to-moz-dependencies.patch. r=Waldo (2e2a6a33d7)
- Bug 1245414, part 8 - Remove mfbt/decimal/floor-ceiling.patch now that the issue is fixed upstream. r=Waldo (84fc02c068)
- Bug 1245414, part 9 - Disable mfbt/decimal/fix-wshadow-warnings.patch. r=cpeterson (4476d04c5d)
- Bug 1245414, part 10 - Apply the Mozilla patches via mfbt/decimal/update.sh. r=Waldo (1f95ef5524)
- Bug 1247082 - Suppress rendering of nsBackdropFrame for VR content r=dholbert (0ffeae4267)
- Bug 1206545 - Initialize AccessibleCaretEventHub in nsCanvasFrame. r=roc (687d4997fb)
- Bug 591737 - Add SummaryFrame. r=bz (1b750bfeb8)
- Bug 1165893 - Fix rounding issue in nsDisplaySelectionOverlay::Paint. r=mattwoodro (9994cc983a)
- Bug 1245450 - Only setup AutoSaveRestorePerspectiveIndex for the descendants of the element with perspective. r=roc (fe8a350417)
- Bug 1243282 - Wrap items having clips with a separator. r=mattwoodrow (915737e3d0)
- Bug 1223232 - Use GetUsedBorder() instead of the computed border value when calculating CB size. r=roc (f4c05b30c7)
- Bug 1223232 - Crashtest. (394e112818)
- Bug 1230665 - Make anonymous flex/grid items non-tabbable and non-focusable. r=roc (0d3f70e672)
- Bug 1142295 - Closing descriptor when GECKO_DISPLAY_REFLOW_RULES_FILE is setted. r=erahm (664ae6ba0a)
- minor change (b914bd2602)
- Bug 1237754 part 1 - [css-grid][css-align] Make 'align/justify-content:normal' behave as 'stretch' for Grid containers. r=dholbert (09a9a09629)
- Bug 1237754 part 2 - [css-grid][css-align] Test updates to account for new default behavior for 'align/justify-content'. (5e62e837ff)
- minor of Bug 1141931 part 2 (a12f5b430e)
- Bu 974309: Fixes the IsEditable() logic for table cells. r=ehsan (2a3caa932f)
- Bug 1238137 - Telemetry pings for main thread keyboard-driven scroll input methods. r=ehsan (e9c07427f9)
- Bug 1238137 - Telemetry pings for main thread scrolling to bring the caret into view after moving it in response to keyboard input. r=ehsan (834bc12b7a)
- Bug 1246405 - Declare mTextRun earlier to avoid alignment spill on 64-bit architectures. r=roc (7ba93b72c9)
- Fixing bug 440486. Work around a Windows XP fax dialog bug. r=rstrong. (a59409acd6)
- Bug 1240911 - Prevent SerializedStructuredCloneBuffer from escaping into the heap. r=amarchesini (2c0b7c474b)
- Bug 1240985 - Hold off processing some messages during timeout (r=dvander) (10f6f6d7a2)
- Bug 1146471 - Release thread asserts for IPC (r=dvander) (f94d0ee09a)
- Bug 1240985 - Fix bug where mAwaitingSyncReply can be overwritten in Send after Cancel (r=dvander) (7b95acdca6)
- Bug 1193861: Log to the process log when launching a sandboxed process on Windows. r=billm (0ad1afd0d0)
- Bug 1233061 - add override declarations for MessagePumpForNonMainUIThreads; r=billm (94b9a5bfe9)
- Bug 1172467: Fix an IPC channel file descriptor leak from Nuwa to the child process. r=khuey (908601ed0e)
- Bug 1240985 - Check WasTransactionCanceled after timeout (and avoid timing out) (r=dvander) (33aade0a92)
- Bug 1237458 - Use MOZ_RELEASE_ASSERT for IPC assertions (r=jld) (cb0f058205)
- Bug 1247429 - Warn instead of error if shmem deallocated before IPDL sends it. r=nical (3c94d99b21)
- Bug 1175999 - Deallocate mach SharedMemory properly. r=blassey. (542649b570)
- Bug 1188186 - Fix leak of FDs in |CreateTransport|. r=bds (a40b9a0c58)
- Bg 1240607 - Force CreateWindow hooks to be detours. r=jmathies (895d1c21c4)
- Bug 1209464: Fix missing neutered window region in MessageChannel::WaitForInterruptNotify. Regression from bug 1189709; r=jimm (204256880b)
- Bug 1229825 - Make GIF deinterlacer respect the frame rect bounds. r=tn (904f6bd9b7)
- Bug 1242093 - Fix assertion in Downscaler::ClearRow. r=njn (63ffe82e99)
- Bug 1235859 - Add FrameSize to non-skia downscaler. r=edwin (e7474630e0)
- Bug 1237709: During RasterImage error-handling cleanup, set UniquePtr mAnim to null instead of using reset(), to avoid leaking. r=dholbert (b064f9c20d)
- Bug 1235605 - Use CheckedInt in Deinterlacer and make its buffer allocation fallible. r=tn (f6f3858c65)
- cleanup (f02aa9441e)
- Bug 1242778: Add MOZ_COUNT_CTOR & MOZ_COUNT_DTOR calls to track leaks of imagelib's FrameAnimator class. r=tn (b1aa366694)
- Bug 1241728. Add crashtest. (17d80a3387)
- Bug 1241729. Add crashtest. (bd6d7337d7)
- Bug 1241728. Limit the size of images that we will downscale from to 1048576 pixels. r=edwin (ad38a82aad)
- Bug 1218782 - use fallible allocations in Downscaler.cpp; r=seth (b22caa1121)
- Bug 1224979. Check if we compute usable filters for the downscaler, and if not put the downscaler in error state so it's not used. r=edwin (8fb59463ef)
- Bug 1235297 - Annotate intentional switch fallthroughs to suppress -Wimplicit-fallthrough warnings in image/decoders/. r=tn (094c37c0fe)
- Bug 1238558 (part 1) - Add Decoder::BeforeFinishInternal(). r=tnikkel. (c7922054d6)
- Bug 1238558 (part 2) - Add a test. r=tnikkel. (7e09caf47f)
- Bug 1238551 (part 2) - Add a test. r=tn. (f548a2cb97)
- Bug 1238551 (part 1) - Reject BITMAPV3INFOHEADER BMP images. r=tn. (c4c8f95cb3)
- Bug 1240629. Don't buffer image file data that we are never going to look at in the gap between the header and the pixel data for BMP files. r=njn (f580910cd3)
- Bug 1237171 - Improve a case where ICO and BMP files disagree on an image size. r=tn. (615db65802)
- Bug 1220021 (part 1) - Don't treat 0RGB ICO files as transparent. r=seth. (b97298285f)
- Bug 1220021 (part 2) - Add four reftests. r=seth. (b1e7b58a98)
- Bug 1163856 (Part 2) - Fix tests that depended on image load event timing. r=tn (4304c676a0)
- Bug 1207958 - Fix heuristic for choosing which ICO sub-image to render - r=tn (3d4db5a033)
- Bug 987625 - Conditionally define MOZ_PNG_MAX_DIMENSION. r=jrmuizel (859bae490c)
- Bug 75077 - Interpolate interlaced PNG images instead of libpng blocky display. r=seth (bc17b43fa6)
- fix side-effect of 1219405 (6536821e18)
- Bug 1245845, part 1 - Stop Moz2D Path::CopyToBuilder/TransformedCopyToBuilder implicitly converting the Path's FillRule. r=Bas (ecc552f359)
- Bug 1245845, part 2 - Remove code that is now useless from gfxContext::EnsurePath. r=Bas (2430be2837)
- Bug 1237448 - Moz2Dify two functions in gfxSurfaceDrawable. r=roc. (bb768302c5)
- Bug 1231888 (follow-up) - Simplify CurrentSurface(). r=jrmuizel. (303cea98f3)
- Bug 1247380: Only copy the background if we can succesfully get a snapshot. r=jrmuizel (13b64445e9)
- Bug 1228507 - Initialize mBlendOpacity. r=Bas (b301a2c9f4)
- Bug 1238846 (part 2) - Remove gfxContext::mOriginalDT, which is unused. r=mattwoodrow. (a5b0f948b7)
- Bug 1240819 - cleanup dead branches in gfxXlibNativeRender.cpp. r=jrmuizel (57bbec6693)
- Bug 1234950 - When advancing APZ animations, use the next vsync timestamp instead of the current one, since that is what will be composited. r=mstange (421829d459)
- Bug 1021845 - Don't skip checkerboarding layers during compositing, even if the layer's visible region is empty. r=botond (6cf1497019)
- Bug 1230149 - check bigImgIter to see if it's not null. r=jmuizelaar (aeef579f9f)
- Bug 1248325 - Update BufferTextureHost::GetAsSurface() r=nical (39a8b3ca71)
- reapply per misspatch Bug 1200595 - Consolidate the TextureClient's destruction logic (68966e4dc3)
- Bug 1249245 - Add missing header gfxPrefs.h to GrallocTextureClient.cpp. r=cyu (676669eb01)
- Bug 1245057: Refer to |gfx::IntPoint| in |GrallocTextureHostOGL::SetCropRect|, r=sotaro (99e572f3f6)
- Bug 1240867 - Fix non-unified build bustage in OGLShaderProgram.cpp. r=nical (0071f08285)
- Bug 1238015 - Make sure PTexture actors are destroyed after all messages referring to them are sent. r=sotaro (250f99b4a4)
- Bug 1220895 - Add layerviewer for layer tree & display list visualization NPOTB. r=botond (fa211145a1)
- Bug 1213464 - ImageBridgeChild and CompositorChild should delete their Transport. r=billm (a37a0dbdfd)
- Bug 1234343 (part 1) - Make GfxMemoryImageReporter::sAmount signed. r=Bas. (18f0cb61ec)
- Bug 1234343 (part 2) - Add a missing GfxMemoryImageReporter::DidAlloc() call. r=Bas. (69df7f3674)
- Bug 1245249 - Check actor state before calling Send__delete__(); r=luke (65716a5915)
- Bug 1221418 - A better cleanup method for AsmJSCache::ChildRunnable, r=janv (5c8c023b9d)
- Bug 1235657 - Session storage needs to handle origin attributes correctly - part 1 - createOriginAttributesWithUserContextId, r=huseby (f2df8109ef)
- Bug 1245954 - Console StartTimer/StopTimer and IncrementCounter should run in the owning thread, r=bz (64f73d7759)
- Bug 1245957 - Adding assertions in Console about in which thread is running what, r=bz (291ee70e2d)
- Bug 1248022 - ConsoleEvent.styles can be a sequence of nullable strings, r=bz (b94ec79ac0)
- Bug 1245242 - Normalize to unit vector for DOMMatrix.rotateAxisAngleSelf. r=roc (3a9e684b4d)
- Bug 1236329. Back out the patch for bug 492933 (revision d8012b35413b) because it's not web-compatible in practice. r=smaug (f6540d84c3)
- mTarget can be null in CanvasRenderingContext2D::ClearRect(), return early if so. (13e8a4e26a)
657 lines
16 KiB
C++
657 lines
16 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/dom/BindingUtils.h"
|
|
#include "mozilla/dom/DOMMatrixBinding.h"
|
|
#include "mozilla/dom/DOMPointBinding.h"
|
|
#include "mozilla/dom/BindingDeclarations.h"
|
|
#include "mozilla/dom/ToJSValue.h"
|
|
|
|
#include "mozilla/dom/DOMPoint.h"
|
|
#include "mozilla/dom/DOMMatrix.h"
|
|
|
|
#include "SVGTransformListParser.h"
|
|
#include "SVGTransform.h"
|
|
|
|
#include "nsAutoPtr.h"
|
|
#include <math.h>
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
static const double radPerDegree = 2.0 * M_PI / 360.0;
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMMatrixReadOnly, mParent)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMMatrixReadOnly, AddRef)
|
|
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMMatrixReadOnly, Release)
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Translate(double aTx,
|
|
double aTy,
|
|
double aTz) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->TranslateSelf(aTx, aTy, aTz);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Scale(double aScale,
|
|
double aOriginX,
|
|
double aOriginY) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->ScaleSelf(aScale, aOriginX, aOriginY);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Scale3d(double aScale,
|
|
double aOriginX,
|
|
double aOriginY,
|
|
double aOriginZ) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->Scale3dSelf(aScale, aOriginX, aOriginY, aOriginZ);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::ScaleNonUniform(double aScaleX,
|
|
double aScaleY,
|
|
double aScaleZ,
|
|
double aOriginX,
|
|
double aOriginY,
|
|
double aOriginZ) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->ScaleNonUniformSelf(aScaleX, aScaleY, aScaleZ, aOriginX, aOriginY, aOriginZ);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Rotate(double aAngle,
|
|
double aOriginX ,
|
|
double aOriginY) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->RotateSelf(aAngle, aOriginX, aOriginY);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::RotateFromVector(double x,
|
|
double y) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->RotateFromVectorSelf(x, y);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::RotateAxisAngle(double aX,
|
|
double aY,
|
|
double aZ,
|
|
double aAngle) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->RotateAxisAngleSelf(aX, aY, aZ, aAngle);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::SkewX(double aSx) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->SkewXSelf(aSx);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::SkewY(double aSy) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->SkewYSelf(aSy);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Multiply(const DOMMatrix& other) const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->MultiplySelf(other);
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::FlipX() const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
if (mMatrix3D) {
|
|
gfx::Matrix4x4 m;
|
|
m._11 = -1;
|
|
retval->mMatrix3D = new gfx::Matrix4x4(m * *mMatrix3D);
|
|
} else {
|
|
gfx::Matrix m;
|
|
m._11 = -1;
|
|
retval->mMatrix2D = new gfx::Matrix(mMatrix2D ? m * *mMatrix2D : m);
|
|
}
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::FlipY() const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
if (mMatrix3D) {
|
|
gfx::Matrix4x4 m;
|
|
m._22 = -1;
|
|
retval->mMatrix3D = new gfx::Matrix4x4(m * *mMatrix3D);
|
|
} else {
|
|
gfx::Matrix m;
|
|
m._22 = -1;
|
|
retval->mMatrix2D = new gfx::Matrix(mMatrix2D ? m * *mMatrix2D : m);
|
|
}
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrixReadOnly::Inverse() const
|
|
{
|
|
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
|
|
retval->InvertSelf();
|
|
|
|
return retval.forget();
|
|
}
|
|
|
|
bool
|
|
DOMMatrixReadOnly::Is2D() const
|
|
{
|
|
return !mMatrix3D;
|
|
}
|
|
|
|
bool
|
|
DOMMatrixReadOnly::Identity() const
|
|
{
|
|
if (mMatrix3D) {
|
|
return mMatrix3D->IsIdentity();
|
|
}
|
|
|
|
return mMatrix2D->IsIdentity();
|
|
}
|
|
|
|
already_AddRefed<DOMPoint>
|
|
DOMMatrixReadOnly::TransformPoint(const DOMPointInit& point) const
|
|
{
|
|
RefPtr<DOMPoint> retval = new DOMPoint(mParent);
|
|
|
|
if (mMatrix3D) {
|
|
gfx::Point4D transformedPoint;
|
|
transformedPoint.x = point.mX;
|
|
transformedPoint.y = point.mY;
|
|
transformedPoint.z = point.mZ;
|
|
transformedPoint.w = point.mW;
|
|
|
|
transformedPoint = *mMatrix3D * transformedPoint;
|
|
|
|
retval->SetX(transformedPoint.x);
|
|
retval->SetY(transformedPoint.y);
|
|
retval->SetZ(transformedPoint.z);
|
|
retval->SetW(transformedPoint.w);
|
|
} else if (point.mZ != 0 || point.mW != 1.0) {
|
|
gfx::Matrix4x4 tempMatrix(gfx::Matrix4x4::From2D(*mMatrix2D));
|
|
|
|
gfx::Point4D transformedPoint;
|
|
transformedPoint.x = point.mX;
|
|
transformedPoint.y = point.mY;
|
|
transformedPoint.z = point.mZ;
|
|
transformedPoint.w = point.mW;
|
|
|
|
transformedPoint = tempMatrix * transformedPoint;
|
|
|
|
retval->SetX(transformedPoint.x);
|
|
retval->SetY(transformedPoint.y);
|
|
retval->SetZ(transformedPoint.z);
|
|
retval->SetW(transformedPoint.w);
|
|
} else {
|
|
gfx::Point transformedPoint;
|
|
transformedPoint.x = point.mX;
|
|
transformedPoint.y = point.mY;
|
|
|
|
transformedPoint = *mMatrix2D * transformedPoint;
|
|
|
|
retval->SetX(transformedPoint.x);
|
|
retval->SetY(transformedPoint.y);
|
|
retval->SetZ(point.mZ);
|
|
retval->SetW(point.mW);
|
|
}
|
|
return retval.forget();
|
|
}
|
|
|
|
template <typename T> void GetDataFromMatrix(const DOMMatrixReadOnly* aMatrix, T* aData)
|
|
{
|
|
aData[0] = static_cast<T>(aMatrix->M11());
|
|
aData[1] = static_cast<T>(aMatrix->M12());
|
|
aData[2] = static_cast<T>(aMatrix->M13());
|
|
aData[3] = static_cast<T>(aMatrix->M14());
|
|
aData[4] = static_cast<T>(aMatrix->M21());
|
|
aData[5] = static_cast<T>(aMatrix->M22());
|
|
aData[6] = static_cast<T>(aMatrix->M23());
|
|
aData[7] = static_cast<T>(aMatrix->M24());
|
|
aData[8] = static_cast<T>(aMatrix->M31());
|
|
aData[9] = static_cast<T>(aMatrix->M32());
|
|
aData[10] = static_cast<T>(aMatrix->M33());
|
|
aData[11] = static_cast<T>(aMatrix->M34());
|
|
aData[12] = static_cast<T>(aMatrix->M41());
|
|
aData[13] = static_cast<T>(aMatrix->M42());
|
|
aData[14] = static_cast<T>(aMatrix->M43());
|
|
aData[15] = static_cast<T>(aMatrix->M44());
|
|
}
|
|
|
|
void
|
|
DOMMatrixReadOnly::ToFloat32Array(JSContext* aCx, JS::MutableHandle<JSObject*> aResult, ErrorResult& aRv) const
|
|
{
|
|
AutoTArray<float, 16> arr;
|
|
arr.SetLength(16);
|
|
GetDataFromMatrix(this, arr.Elements());
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
if (!ToJSValue(aCx, TypedArrayCreator<Float32Array>(arr), &value)) {
|
|
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
|
return;
|
|
}
|
|
aResult.set(&value.toObject());
|
|
}
|
|
|
|
void
|
|
DOMMatrixReadOnly::ToFloat64Array(JSContext* aCx, JS::MutableHandle<JSObject*> aResult, ErrorResult& aRv) const
|
|
{
|
|
AutoTArray<double, 16> arr;
|
|
arr.SetLength(16);
|
|
GetDataFromMatrix(this, arr.Elements());
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
if (!ToJSValue(aCx, TypedArrayCreator<Float64Array>(arr), &value)) {
|
|
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
|
return;
|
|
}
|
|
aResult.set(&value.toObject());
|
|
}
|
|
|
|
void
|
|
DOMMatrixReadOnly::Stringify(nsAString& aResult)
|
|
{
|
|
nsAutoString matrixStr;
|
|
if (mMatrix3D) {
|
|
matrixStr.AppendPrintf("matrix3d(%g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g)",
|
|
M11(), M12(), M13(), M14(),
|
|
M21(), M22(), M23(), M24(),
|
|
M31(), M32(), M33(), M34(),
|
|
M41(), M42(), M43(), M44());
|
|
} else {
|
|
matrixStr.AppendPrintf("matrix(%g, %g, %g, %g, %g, %g)", A(), B(), C(), D(), E(), F());
|
|
}
|
|
|
|
aResult = matrixStr;
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
|
|
return obj.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, const nsAString& aTransformList, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
|
|
|
|
obj = obj->SetMatrixValue(aTransformList, aRv);
|
|
return obj.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, const DOMMatrixReadOnly& aOther, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports(), aOther);
|
|
return obj.forget();
|
|
}
|
|
|
|
template <typename T> void SetDataInMatrix(DOMMatrix* aMatrix, const T* aData, int aLength, ErrorResult& aRv)
|
|
{
|
|
if (aLength == 16) {
|
|
aMatrix->SetM11(aData[0]);
|
|
aMatrix->SetM12(aData[1]);
|
|
aMatrix->SetM13(aData[2]);
|
|
aMatrix->SetM14(aData[3]);
|
|
aMatrix->SetM21(aData[4]);
|
|
aMatrix->SetM22(aData[5]);
|
|
aMatrix->SetM23(aData[6]);
|
|
aMatrix->SetM24(aData[7]);
|
|
aMatrix->SetM31(aData[8]);
|
|
aMatrix->SetM32(aData[9]);
|
|
aMatrix->SetM33(aData[10]);
|
|
aMatrix->SetM34(aData[11]);
|
|
aMatrix->SetM41(aData[12]);
|
|
aMatrix->SetM42(aData[13]);
|
|
aMatrix->SetM43(aData[14]);
|
|
aMatrix->SetM44(aData[15]);
|
|
} else if (aLength == 6) {
|
|
aMatrix->SetA(aData[0]);
|
|
aMatrix->SetB(aData[1]);
|
|
aMatrix->SetC(aData[2]);
|
|
aMatrix->SetD(aData[3]);
|
|
aMatrix->SetE(aData[4]);
|
|
aMatrix->SetF(aData[5]);
|
|
} else {
|
|
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
|
|
}
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
|
|
aArray32.ComputeLengthAndData();
|
|
SetDataInMatrix(obj, aArray32.Data(), aArray32.Length(), aRv);
|
|
|
|
return obj.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
|
|
aArray64.ComputeLengthAndData();
|
|
SetDataInMatrix(obj, aArray64.Data(), aArray64.Length(), aRv);
|
|
|
|
return obj.forget();
|
|
}
|
|
|
|
already_AddRefed<DOMMatrix>
|
|
DOMMatrix::Constructor(const GlobalObject& aGlobal, const Sequence<double>& aNumberSequence, ErrorResult& aRv)
|
|
{
|
|
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
|
|
SetDataInMatrix(obj, aNumberSequence.Elements(), aNumberSequence.Length(), aRv);
|
|
|
|
return obj.forget();
|
|
}
|
|
|
|
void DOMMatrix::Ensure3DMatrix()
|
|
{
|
|
if (!mMatrix3D) {
|
|
mMatrix3D = new gfx::Matrix4x4(gfx::Matrix4x4::From2D(*mMatrix2D));
|
|
mMatrix2D = nullptr;
|
|
}
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::MultiplySelf(const DOMMatrix& aOther)
|
|
{
|
|
if (aOther.Identity()) {
|
|
return this;
|
|
}
|
|
|
|
if (aOther.Is2D()) {
|
|
if (mMatrix3D) {
|
|
*mMatrix3D = gfx::Matrix4x4::From2D(*aOther.mMatrix2D) * *mMatrix3D;
|
|
} else {
|
|
*mMatrix2D = *aOther.mMatrix2D * *mMatrix2D;
|
|
}
|
|
} else {
|
|
Ensure3DMatrix();
|
|
*mMatrix3D = *aOther.mMatrix3D * *mMatrix3D;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::PreMultiplySelf(const DOMMatrix& aOther)
|
|
{
|
|
if (aOther.Identity()) {
|
|
return this;
|
|
}
|
|
|
|
if (aOther.Is2D()) {
|
|
if (mMatrix3D) {
|
|
*mMatrix3D = *mMatrix3D * gfx::Matrix4x4::From2D(*aOther.mMatrix2D);
|
|
} else {
|
|
*mMatrix2D = *mMatrix2D * *aOther.mMatrix2D;
|
|
}
|
|
} else {
|
|
Ensure3DMatrix();
|
|
*mMatrix3D = *mMatrix3D * *aOther.mMatrix3D;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::TranslateSelf(double aTx,
|
|
double aTy,
|
|
double aTz)
|
|
{
|
|
if (aTx == 0 && aTy == 0 && aTz == 0) {
|
|
return this;
|
|
}
|
|
|
|
if (mMatrix3D || aTz != 0) {
|
|
Ensure3DMatrix();
|
|
mMatrix3D->PreTranslate(aTx, aTy, aTz);
|
|
} else {
|
|
mMatrix2D->PreTranslate(aTx, aTy);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::ScaleSelf(double aScale, double aOriginX, double aOriginY)
|
|
{
|
|
ScaleNonUniformSelf(aScale, aScale, 1.0, aOriginX, aOriginY, 0);
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::Scale3dSelf(double aScale, double aOriginX,
|
|
double aOriginY, double aOriginZ)
|
|
{
|
|
ScaleNonUniformSelf(aScale, aScale, aScale, aOriginX, aOriginY, aOriginZ);
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::ScaleNonUniformSelf(double aScaleX,
|
|
double aScaleY,
|
|
double aScaleZ,
|
|
double aOriginX,
|
|
double aOriginY,
|
|
double aOriginZ)
|
|
{
|
|
if (aScaleX == 1.0 && aScaleY == 1.0 && aScaleZ == 1.0) {
|
|
return this;
|
|
}
|
|
|
|
TranslateSelf(aOriginX, aOriginY, aOriginZ);
|
|
|
|
if (mMatrix3D || aScaleZ != 1.0 || aOriginZ != 0) {
|
|
Ensure3DMatrix();
|
|
gfx::Matrix4x4 m;
|
|
m._11 = aScaleX;
|
|
m._22 = aScaleY;
|
|
m._33 = aScaleZ;
|
|
*mMatrix3D = m * *mMatrix3D;
|
|
} else {
|
|
gfx::Matrix m;
|
|
m._11 = aScaleX;
|
|
m._22 = aScaleY;
|
|
*mMatrix2D = m * *mMatrix2D;
|
|
}
|
|
|
|
TranslateSelf(-aOriginX, -aOriginY, -aOriginZ);
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::RotateFromVectorSelf(double aX, double aY)
|
|
{
|
|
if (aX == 0.0 || aY == 0.0) {
|
|
return this;
|
|
}
|
|
|
|
RotateSelf(atan2(aY, aX) / radPerDegree);
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::RotateSelf(double aAngle, double aOriginX, double aOriginY)
|
|
{
|
|
if (fmod(aAngle, 360) == 0) {
|
|
return this;
|
|
}
|
|
|
|
TranslateSelf(aOriginX, aOriginY);
|
|
|
|
if (mMatrix3D) {
|
|
RotateAxisAngleSelf(0, 0, 1, aAngle);
|
|
} else {
|
|
*mMatrix2D = mMatrix2D->PreRotate(aAngle * radPerDegree);
|
|
}
|
|
|
|
TranslateSelf(-aOriginX, -aOriginY);
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::RotateAxisAngleSelf(double aX, double aY,
|
|
double aZ, double aAngle)
|
|
{
|
|
if (fmod(aAngle, 360) == 0) {
|
|
return this;
|
|
}
|
|
|
|
aAngle *= radPerDegree;
|
|
|
|
Ensure3DMatrix();
|
|
gfx::Matrix4x4 m;
|
|
m.SetRotateAxisAngle(aX, aY, aZ, aAngle);
|
|
|
|
*mMatrix3D = m * *mMatrix3D;
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::SkewXSelf(double aSx)
|
|
{
|
|
if (fmod(aSx, 360) == 0) {
|
|
return this;
|
|
}
|
|
|
|
if (mMatrix3D) {
|
|
gfx::Matrix4x4 m;
|
|
m._21 = tan(aSx * radPerDegree);
|
|
*mMatrix3D = m * *mMatrix3D;
|
|
} else {
|
|
gfx::Matrix m;
|
|
m._21 = tan(aSx * radPerDegree);
|
|
*mMatrix2D = m * *mMatrix2D;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::SkewYSelf(double aSy)
|
|
{
|
|
if (fmod(aSy, 360) == 0) {
|
|
return this;
|
|
}
|
|
|
|
if (mMatrix3D) {
|
|
gfx::Matrix4x4 m;
|
|
m._12 = tan(aSy * radPerDegree);
|
|
*mMatrix3D = m * *mMatrix3D;
|
|
} else {
|
|
gfx::Matrix m;
|
|
m._12 = tan(aSy * radPerDegree);
|
|
*mMatrix2D = m * *mMatrix2D;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::InvertSelf()
|
|
{
|
|
if (mMatrix3D) {
|
|
if (!mMatrix3D->Invert()) {
|
|
mMatrix3D->SetNAN();
|
|
}
|
|
} else if (!mMatrix2D->Invert()) {
|
|
mMatrix2D = nullptr;
|
|
|
|
mMatrix3D = new gfx::Matrix4x4();
|
|
mMatrix3D->SetNAN();
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
DOMMatrix*
|
|
DOMMatrix::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
|
|
{
|
|
SVGTransformListParser parser(aTransformList);
|
|
if (!parser.Parse()) {
|
|
aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
|
|
} else {
|
|
mMatrix3D = nullptr;
|
|
mMatrix2D = new gfx::Matrix();
|
|
gfxMatrix result;
|
|
const nsTArray<nsSVGTransform>& mItems = parser.GetTransformList();
|
|
|
|
for (uint32_t i = 0; i < mItems.Length(); ++i) {
|
|
result.PreMultiply(mItems[i].GetMatrix());
|
|
}
|
|
|
|
SetA(result._11);
|
|
SetB(result._12);
|
|
SetC(result._21);
|
|
SetD(result._22);
|
|
SetE(result._31);
|
|
SetF(result._32);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
JSObject*
|
|
DOMMatrix::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
|
{
|
|
return DOMMatrixBinding::Wrap(aCx, this, aGivenProto);
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|