/*
 * Copyright (C) 2020 Igalia S.L. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

// This represents the native resolution of the device, but may not reflect the viewport exposed to the page.
// https://immersive-web.github.io/webxr/#xrviewport
[
    EnabledBySetting=WebXREnabled,
    Conditional=WEBXR,
] dictionary FakeXRDeviceResolution {
    required long width;
    required long height;
};

// A set of 4 angles which describe the view from a center point, units are degrees.
[
    EnabledBySetting=WebXREnabled,
    Conditional=WEBXR,
] dictionary FakeXRFieldOfViewInit {
    required float upDegrees;
    required float downDegrees;
    required float leftDegrees;
    required float rightDegrees;
};

// https://immersive-web.github.io/webxr/#xrview
[
    EnabledBySetting=WebXREnabled,
    Conditional=WEBXR,
] dictionary FakeXRViewInit {
    required XREye eye;
    // https://immersive-web.github.io/webxr/#view-projection-matrix
    required sequence<float> projectionMatrix;
    // https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport
    required FakeXRDeviceResolution resolution;
    // https://immersive-web.github.io/webxr/#view-offset
    // This is the origin of the view in the viewer space. In other words, this is
    // a transform from the view space to the viewer space.
    required FakeXRRigidTransformInit viewOffset;
    // This is an optional means of specifying a decomposed form of the projection
    // matrix.  If specified, the projectionMatrix should be ignored.
    // Any test that wishes to test clip planes or similar features that would require
    // decomposing/recomposing the projectionMatrix should use this instead of
    // the projection matrix.
    FakeXRFieldOfViewInit fieldOfView;
};
