<!--
  Copyright (C) 2015-2018 Apple Inc. 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.
-->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">

    <title>About MotionMark</title>

    <link rel="stylesheet" href="resources/runner/motionmark.css">

    <script src="resources/strings.js"></script>
</head>
<body class="images-loaded">
    <main>
    <section id="about" class="selected">
        <div class="logo"><svg><use xlink:href="resources/runner/logo.svg#root" /></svg></div>

        <div class="body">
            <h1>About MotionMark <span class="version"></span></h1>

            <p>MotionMark is a web benchmark that focuses on graphics performance. It draws multiple rendering elements, each of which uses the same set of graphics primitives. An element could be an SVG node, an HTML element with CSS style, or a series of canvas operations. Slight variations among the elements avoid trivial caching optimizations by the browser. Although fairly simple, the effects were chosen to reflect techniques commonly used on the web. Tests are visually rich, being designed to stress the graphics system rather than JavaScript.</p>

            <p>After an initial warm-up, each test runs for a fixed period of time. Based on measurements of the browser’s frame rate, MotionMark adjusts the number of elements to draw, and concentrates around a narrow range where the browser starts to fail animating at 60 frames per second (fps). A piecewise linear regression is applied to the data, and the change point is reported as the test's score. The confidence interval is calculated through <a href="https://en.wikipedia.org/wiki/Bootstrapping_(statistics)">bootstrapping</a>. MotionMark calculates the geometric mean of all of the tests’ scores to report the single score for the run.</p>

            <p>MotionMark can be run on a wide variety of devices. Using the device’s screen dimensions it adjusts the drawing area into one of three sizes:</p>

            <ol>
                <li>Small (568 x 320), targeted at mobile phones</li>
                <li>Medium (900 x 600), targeted at tablets and laptops</li>
                <li>Large (1600 x 800), targeted at desktops</li>
            </ol>

            <p>The design of the benchmark is modular. This makes it easy to write new tests and use different controllers, which can assist a developer working on improving the performance of a web engine. For the purpose of a public benchmark, the MotionMark master suite tests a variety of drawing operations using techniques including CSS, SVG, and Canvas:</p>

            <ul>
                <li><strong>Multiply</strong>: CSS border radius, transforms, opacity</li>
                <li><strong>Arcs and Fills</strong>: Canvas path fills and arcs</li>
                <li><strong>Leaves</strong>: CSS-transformed elements</li>
                <li><strong>Paths</strong>: Canvas line, quadratic, and Bezier paths</li>
                <li><strong>Lines</strong>: Canvas line segments</li>
                <li><strong>Focus</strong>: CSS blur filter, opacity</li>
                <li><strong>Images</strong>: Canvas <code>getImageData()</code> and <code>putImageData()</code></li>
                <li><strong>Design</strong>: HTML text rendering</li>
                <li><strong>Suits</strong>: SVG clip paths, gradients and transforms</li>
            </ul>

            <p>To achieve consistent results on mobile devices, put the device in landscape orientation. On laptops and desktops, use the default display resolution and make the browser window fullscreen. Make sure that screen automatic display sleep is turned off or set to longer than 8 minutes.</p>

            <center><button onclick="location.href='./'">Return to homepage</button></center>
        </div>
        </section>
    </main>

    <script>
        document.title = "About MotionMark " + Strings.version;
        document.querySelector(".version").textContent = Strings.version;
    </script>
</body>
</html>