/**
 * Modern Albufeira Prolog Interpreter
 *
 * Warranty & Liability
 * To the extent permitted by applicable law and unless explicitly
 * otherwise agreed upon, XLOG Technologies AG makes no warranties
 * regarding the provided information. XLOG Technologies AG assumes
 * no liability that any problems might be solved with the information
 * provided by XLOG Technologies AG.
 *
 * Rights & License
 * All industrial property rights regarding the information - copyright
 * and patent rights in particular - are the sole property of XLOG
 * Technologies AG. If the company was not the originator of some
 * excerpts, XLOG Technologies AG has at least obtained the right to
 * reproduce, change and translate the information.
 *
 * Reproduction is restricted to the whole unaltered document. Reproduction
 * of the information is only allowed for non-commercial uses. Selling,
 * giving away or letting of the execution of the library is prohibited.
 * The library can be distributed as part of your applications and libraries
 * for execution provided this comment remains unchanged.
 *
 * Restrictions
 * Only to be distributed with programs that add significant and primary
 * functionality to the library. Not to be distributed with additional
 * software intended to replace any components of the library.
 *
 * Trademarks
 * Jekejeke is a registered trademark of XLOG Technologies AG.
 */

import {
    set, check_number, exec_build, exec_unify,
    narrow_float, norm_float, make_check
} from "../../nova/core.mjs";
import {
    check_element
} from "./domlib.mjs";

/*****************************************************************/
/* Event Translation                                             */
/*****************************************************************/

/**
 * svg_view_inverse(E, I):
 * The predicate succeeds in I with the inverse transform of the element E.
 */
function test_svg_view_inverse(args) {
    let at = exec_build(args[0]);
    check_element(at);
    return exec_unify(args[1], at.getScreenCTM().inverse());
}

/**
 * svg_apply_transform(I, CX, CY, SX, SY):
 * The predicate succeeds in the viewport coordinates (SX,SY) with
 * the transform I applied to the client coordinates (CX,CY).
 */
function test_svg_apply_transform(args) {
    let matrix = exec_build(args[0]);
    let clientX = exec_build(args[1]);
    check_number(clientX);
    let clientY = exec_build(args[2]);
    check_number(clientY);
    let pt = new DOMPoint();
    pt.x = narrow_float(clientX);
    pt.y = narrow_float(clientY);
    pt = pt.matrixTransform(matrix);
    if (!exec_unify(args[3], norm_float(pt.x)))
        return false;
    return exec_unify(args[4], norm_float(pt.y));
}

/*********************************************************************/
/* Port Lib Init                                                     */
/*********************************************************************/

export function main() {
    set("svg_view_inverse", 2, make_check(test_svg_view_inverse));
    set("svg_apply_transform", 5, make_check(test_svg_apply_transform));
}