summaryrefslogtreecommitdiffstats
path: root/o3d/tests
diff options
context:
space:
mode:
authorapatrick@google.com <apatrick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-12 19:56:24 +0000
committerapatrick@google.com <apatrick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-12 19:56:24 +0000
commitccf02ac9bd67d4d49ad8264ae7fc6098e361ff4b (patch)
treefc6e4a0552431c7297798fad46f57fb76c35a3b3 /o3d/tests
parentdfe9d1d2de7fd8d244599b79a22898cce8df7c81 (diff)
downloadchromium_src-ccf02ac9bd67d4d49ad8264ae7fc6098e361ff4b.zip
chromium_src-ccf02ac9bd67d4d49ad8264ae7fc6098e361ff4b.tar.gz
chromium_src-ccf02ac9bd67d4d49ad8264ae7fc6098e361ff4b.tar.bz2
Made all line endings consistently LF and added svn:eol-style=LF property to files with these names / extensions.
c cc h mm txt idl py js html css gyp gypi xml shader json htm README DEPS git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31811 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/tests')
-rw-r--r--o3d/tests/lab/runner_constants.py2
-rw-r--r--o3d/tests/selenium/pdiff_test.py264
-rw-r--r--o3d/tests/selenium/tests/render-target-clear-test.html312
3 files changed, 289 insertions, 289 deletions
diff --git a/o3d/tests/lab/runner_constants.py b/o3d/tests/lab/runner_constants.py
index a7ec00b..33afbe5 100644
--- a/o3d/tests/lab/runner_constants.py
+++ b/o3d/tests/lab/runner_constants.py
@@ -74,7 +74,7 @@ elif util.IsMac():
BUILD_PATH = join(BASE_PATH, 'xcodebuild')
else:
BUILD_PATH = join(BASE_PATH, 'sconsbuild')
-
+
# Product directory.
if os.path.exists(join(BUILD_PATH, 'Debug')):
PRODUCT_DIR_PATH = join(BUILD_PATH, 'Debug')
diff --git a/o3d/tests/selenium/pdiff_test.py b/o3d/tests/selenium/pdiff_test.py
index d1d4940..0a91f55 100644
--- a/o3d/tests/selenium/pdiff_test.py
+++ b/o3d/tests/selenium/pdiff_test.py
@@ -1,132 +1,132 @@
-import os
-import re
-import subprocess
-import unittest
-import sys
-
-import selenium_utilities
-import selenium_constants
-
-class PDiffTest(unittest.TestCase):
- """A perceptual diff test class, for running perceptual diffs on any
- number of screenshots."""
-
- def __init__(self, name, num_screenshots, screenshot_name, pdiff_path,
- gen_dir, ref_dir, options):
- unittest.TestCase.__init__(self, name)
- self.name = name
- self.num_screenshots = num_screenshots
- self.screenshot_name = screenshot_name
- self.pdiff_path = pdiff_path
- self.gen_dir = gen_dir
- self.ref_dir = ref_dir
- self.options = options
-
- def shortDescription(self):
- """override unittest.TestCase shortDescription for our own descriptions."""
- return "Screenshot comparison for: " + self.name
-
- def PDiffTest(self):
- """Runs a generic Perceptual Diff test."""
- # Get arguments for perceptual diff.
- pixel_threshold = "10"
- alpha_threshold = "1.0"
- use_colorfactor = False
- use_downsample = False
- use_edge = True
- edge_threshold = "5"
-
- for opt in self.options:
- if opt.startswith("pdiff_threshold"):
- pixel_threshold = selenium_utilities.GetArgument(opt)
- elif (opt.startswith("pdiff_threshold_mac") and
- sys.platform == "darwin"):
- pixel_threshold = selenium_utilities.GetArgument(opt)
- elif (opt.startswith("pdiff_threshold_win") and
- sys.platform == 'win32' or sys.platform == "cygwin"):
- pixel_threshold = selenium_utilities.GetArgument(opt)
- elif (opt.startswith("pdiff_threshold_linux") and
- sys.platform[:5] == "linux"):
- pixel_threshold = selenium_utilities.GetArgument(opt)
- elif (opt.startswith("colorfactor")):
- colorfactor = selenium_utilities.GetArgument(opt)
- use_colorfactor = True
- elif (opt.startswith("downsample")):
- downsample_factor = selenium_utilities.GetArgument(opt)
- use_downsample = True
- elif (opt.startswith("pdiff_edge_ignore_off")):
- use_edge = False
- elif (opt.startswith("pdiff_edge_threshold")):
- edge_threshold = selenium_utilities.GetArgument(opt)
-
- results = []
- # Loop over number of screenshots.
- for screenshot_no in range(self.num_screenshots):
- # Find reference image.
- shotname = self.screenshot_name + str(screenshot_no + 1)
- J = os.path.join
- platform_img_path = J(self.ref_dir,
- selenium_constants.PLATFORM_SCREENSHOT_DIR,
- shotname + '_reference.png')
- reg_img_path = J(self.ref_dir,
- selenium_constants.DEFAULT_SCREENSHOT_DIR,
- shotname + '_reference.png')
-
- if os.path.exists(platform_img_path):
- ref_img_path = platform_img_path
- elif os.path.exists(reg_img_path):
- ref_img_path = reg_img_path
- else:
- self.fail('Reference image for ' + shotname + ' not found.')
-
- # Find generated image.
- gen_img_path = J(self.gen_dir, shotname + '.png')
- diff_img_path = J(self.gen_dir, 'cmp_' + shotname + '.png')
-
- self.assertTrue(os.path.exists(gen_img_path),
- 'Generated screenshot for ' + shotname + ' not found.\n')
-
- # Run perceptual diff
- arguments = [self.pdiff_path,
- ref_img_path,
- gen_img_path,
- "-output", diff_img_path,
- "-fov", "45",
- "-alphaThreshold", alpha_threshold,
- # Turn on verbose output for the percetual diff so we
- # can see how far off we are on the threshold.
- "-verbose",
- # Set the threshold to zero so we can get a count
- # of the different pixels. This causes the program
- # to return failure for most images, but we can compare
- # the values ourselves below.
- "-threshold", "0"]
- if use_colorfactor:
- arguments += ["-colorfactor", colorfactor]
- if use_downsample:
- arguments += ["-downsample", downsample_factor]
- if use_edge:
- arguments += ["-ignoreEdges", edge_threshold]
-
- pdiff_pipe = subprocess.Popen(arguments,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- (pdiff_stdout, pdiff_stderr) = pdiff_pipe.communicate()
- result = pdiff_pipe.returncode
- # Find out how many pixels were different by looking at the output.
- pixel_re = re.compile("(\d+) pixels are different", re.DOTALL)
- pixel_match = pixel_re.search(pdiff_stdout)
- different_pixels = "0"
- if pixel_match:
- different_pixels = pixel_match.group(1)
-
- results += [(shotname, int(different_pixels))]
-
- all_tests_passed = True
- msg = "Pixel threshold is %s. Failing screenshots:\n" % pixel_threshold
- for name, pixels in results:
- if pixels >= int(pixel_threshold):
- all_tests_passed = False
- msg += " %s, differing by %s\n" % (name, str(pixels))
-
- self.assertTrue(all_tests_passed, msg)
+import os
+import re
+import subprocess
+import unittest
+import sys
+
+import selenium_utilities
+import selenium_constants
+
+class PDiffTest(unittest.TestCase):
+ """A perceptual diff test class, for running perceptual diffs on any
+ number of screenshots."""
+
+ def __init__(self, name, num_screenshots, screenshot_name, pdiff_path,
+ gen_dir, ref_dir, options):
+ unittest.TestCase.__init__(self, name)
+ self.name = name
+ self.num_screenshots = num_screenshots
+ self.screenshot_name = screenshot_name
+ self.pdiff_path = pdiff_path
+ self.gen_dir = gen_dir
+ self.ref_dir = ref_dir
+ self.options = options
+
+ def shortDescription(self):
+ """override unittest.TestCase shortDescription for our own descriptions."""
+ return "Screenshot comparison for: " + self.name
+
+ def PDiffTest(self):
+ """Runs a generic Perceptual Diff test."""
+ # Get arguments for perceptual diff.
+ pixel_threshold = "10"
+ alpha_threshold = "1.0"
+ use_colorfactor = False
+ use_downsample = False
+ use_edge = True
+ edge_threshold = "5"
+
+ for opt in self.options:
+ if opt.startswith("pdiff_threshold"):
+ pixel_threshold = selenium_utilities.GetArgument(opt)
+ elif (opt.startswith("pdiff_threshold_mac") and
+ sys.platform == "darwin"):
+ pixel_threshold = selenium_utilities.GetArgument(opt)
+ elif (opt.startswith("pdiff_threshold_win") and
+ sys.platform == 'win32' or sys.platform == "cygwin"):
+ pixel_threshold = selenium_utilities.GetArgument(opt)
+ elif (opt.startswith("pdiff_threshold_linux") and
+ sys.platform[:5] == "linux"):
+ pixel_threshold = selenium_utilities.GetArgument(opt)
+ elif (opt.startswith("colorfactor")):
+ colorfactor = selenium_utilities.GetArgument(opt)
+ use_colorfactor = True
+ elif (opt.startswith("downsample")):
+ downsample_factor = selenium_utilities.GetArgument(opt)
+ use_downsample = True
+ elif (opt.startswith("pdiff_edge_ignore_off")):
+ use_edge = False
+ elif (opt.startswith("pdiff_edge_threshold")):
+ edge_threshold = selenium_utilities.GetArgument(opt)
+
+ results = []
+ # Loop over number of screenshots.
+ for screenshot_no in range(self.num_screenshots):
+ # Find reference image.
+ shotname = self.screenshot_name + str(screenshot_no + 1)
+ J = os.path.join
+ platform_img_path = J(self.ref_dir,
+ selenium_constants.PLATFORM_SCREENSHOT_DIR,
+ shotname + '_reference.png')
+ reg_img_path = J(self.ref_dir,
+ selenium_constants.DEFAULT_SCREENSHOT_DIR,
+ shotname + '_reference.png')
+
+ if os.path.exists(platform_img_path):
+ ref_img_path = platform_img_path
+ elif os.path.exists(reg_img_path):
+ ref_img_path = reg_img_path
+ else:
+ self.fail('Reference image for ' + shotname + ' not found.')
+
+ # Find generated image.
+ gen_img_path = J(self.gen_dir, shotname + '.png')
+ diff_img_path = J(self.gen_dir, 'cmp_' + shotname + '.png')
+
+ self.assertTrue(os.path.exists(gen_img_path),
+ 'Generated screenshot for ' + shotname + ' not found.\n')
+
+ # Run perceptual diff
+ arguments = [self.pdiff_path,
+ ref_img_path,
+ gen_img_path,
+ "-output", diff_img_path,
+ "-fov", "45",
+ "-alphaThreshold", alpha_threshold,
+ # Turn on verbose output for the percetual diff so we
+ # can see how far off we are on the threshold.
+ "-verbose",
+ # Set the threshold to zero so we can get a count
+ # of the different pixels. This causes the program
+ # to return failure for most images, but we can compare
+ # the values ourselves below.
+ "-threshold", "0"]
+ if use_colorfactor:
+ arguments += ["-colorfactor", colorfactor]
+ if use_downsample:
+ arguments += ["-downsample", downsample_factor]
+ if use_edge:
+ arguments += ["-ignoreEdges", edge_threshold]
+
+ pdiff_pipe = subprocess.Popen(arguments,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ (pdiff_stdout, pdiff_stderr) = pdiff_pipe.communicate()
+ result = pdiff_pipe.returncode
+ # Find out how many pixels were different by looking at the output.
+ pixel_re = re.compile("(\d+) pixels are different", re.DOTALL)
+ pixel_match = pixel_re.search(pdiff_stdout)
+ different_pixels = "0"
+ if pixel_match:
+ different_pixels = pixel_match.group(1)
+
+ results += [(shotname, int(different_pixels))]
+
+ all_tests_passed = True
+ msg = "Pixel threshold is %s. Failing screenshots:\n" % pixel_threshold
+ for name, pixels in results:
+ if pixels >= int(pixel_threshold):
+ all_tests_passed = False
+ msg += " %s, differing by %s\n" % (name, str(pixels))
+
+ self.assertTrue(all_tests_passed, msg)
diff --git a/o3d/tests/selenium/tests/render-target-clear-test.html b/o3d/tests/selenium/tests/render-target-clear-test.html
index 91c50b7..65ccbb1 100644
--- a/o3d/tests/selenium/tests/render-target-clear-test.html
+++ b/o3d/tests/selenium/tests/render-target-clear-test.html
@@ -1,156 +1,156 @@
-<!--
-Copyright 2009, Google 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:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * 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.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
-OWNER OR 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.
--->
-<!--
-Tests that Render Targets clear correctly.
--->
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<title>
-Render Target Clear Test.
-</title>
-<link rel="stylesheet" type="text/css" href="assets/style.css" />
-<!-- Include sample javascript library functions-->
-<script type="text/javascript" src="../../../samples/o3djs/base.js"></script>
-
-<!-- Our javascript code -->
-<script type="text/javascript" id="o3dscript">
-o3djs.require('o3djs.util');
-o3djs.require('o3djs.math');
-o3djs.require('o3djs.rendergraph');
-o3djs.require('o3djs.primitives');
-o3djs.require('o3djs.material');
-
-// Events
-// init() once the page has finished loading.
-// unload() when the page is unloaded.
-window.onload = init;
-window.onunload = unload;
-
-// global variables
-var g_o3dElement;
-var g_o3d;
-var g_math;
-var g_client;
-var g_viewInfo;
-var g_pack;
-var g_root;
-var g_o3dElement;
-
-/**
- * Creates the client area.
- */
-function init() {
- o3djs.util.makeClients(initStep2);
-}
-
-/**
- * Initializes O3D and creates one shape.
- * @param {Array} clientElements Array of o3d object elements.
- */
-function initStep2(clientElements) {
- // Initializes global variables and libraries.
- g_o3dElement = clientElements[0];
- g_o3d = g_o3dElement.o3d;
- g_math = o3djs.math;
- g_client = g_o3dElement.client;
-
- // Creates a pack to manage our resources/assets
- g_pack = g_client.createPack();
-
- g_root = g_pack.createObject('Transform');
-
- g_viewInfo = o3djs.rendergraph.createBasicView(
- g_pack,
- g_root,
- g_client.renderGraphRoot,
- [0.2, 0.3, 0.4, 1]);
-
- var clientWidth = g_client.width;
- var clientHeight = g_client.height;
- g_viewInfo.drawContext.projection = g_math.matrix4.orthographic(
- -clientWidth * 0.5 + 0.5,
- clientWidth * 0.5 + 0.5,
- -clientHeight * 0.5 + 0.5,
- clientHeight * 0.5 + 0.5,
- 0.001,
- 1000);
- g_viewInfo.drawContext.view = g_math.matrix4.lookAt(
- [0, 500, 0], // eye
- [0, 0, 0], // target
- [0, 0, -1]); // up
-
- for (var ii = 0; ii < 3; ++ii) {
- var texture = g_pack.createTexture2D(
- 256, 256, g_o3d.Texture.ARGB8, 1, true);
- var surface = texture.getRenderSurface(0);
- var renderSet = g_pack.createObject('RenderSurfaceSet');
- renderSet.renderSurface = surface;
- // Make render before the main display.
- renderSet.priority = -10 + ii;
-
- var material = o3djs.material.createConstantMaterial(
- g_pack, g_viewInfo, texture);
- var shape = o3djs.primitives.createPlane(g_pack, material, 128, 128, 1, 1);
- var transform = g_pack.createObject("Transform");
- transform.translate(-200 + 150 * ii, 0, 0);
- transform.parent = g_root;
- transform.addShape(shape);
- var clearColor = [0, 0, 0, 1];
- clearColor[ii] = 1;
- var viewInfo = o3djs.rendergraph.createBasicView(
- g_pack, null, renderSet, clearColor);
- // Splice it into the render graph AFTER everything is setup.
- renderSet.parent = g_client.renderGraphRoot;
- }
-
- window.g_testResult = true;
-}
-
-/**
- * Remove any callbacks so they don't get called after the page has unloaded.
- */
-function unload() {
- if (g_client) {
- g_client.cleanup();
- }
-}
-</script>
-</head>
-<body>
-<h1>Tests that render targets clear correctly.</h1>
-Should be red, green, blue on dark blue background.
-<div id="o3d" style="width: 600px; height: 600px"></div>
-</body>
-</html>
-
+<!--
+Copyright 2009, Google 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:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+OWNER OR 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.
+-->
+<!--
+Tests that Render Targets clear correctly.
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<title>
+Render Target Clear Test.
+</title>
+<link rel="stylesheet" type="text/css" href="assets/style.css" />
+<!-- Include sample javascript library functions-->
+<script type="text/javascript" src="../../../samples/o3djs/base.js"></script>
+
+<!-- Our javascript code -->
+<script type="text/javascript" id="o3dscript">
+o3djs.require('o3djs.util');
+o3djs.require('o3djs.math');
+o3djs.require('o3djs.rendergraph');
+o3djs.require('o3djs.primitives');
+o3djs.require('o3djs.material');
+
+// Events
+// init() once the page has finished loading.
+// unload() when the page is unloaded.
+window.onload = init;
+window.onunload = unload;
+
+// global variables
+var g_o3dElement;
+var g_o3d;
+var g_math;
+var g_client;
+var g_viewInfo;
+var g_pack;
+var g_root;
+var g_o3dElement;
+
+/**
+ * Creates the client area.
+ */
+function init() {
+ o3djs.util.makeClients(initStep2);
+}
+
+/**
+ * Initializes O3D and creates one shape.
+ * @param {Array} clientElements Array of o3d object elements.
+ */
+function initStep2(clientElements) {
+ // Initializes global variables and libraries.
+ g_o3dElement = clientElements[0];
+ g_o3d = g_o3dElement.o3d;
+ g_math = o3djs.math;
+ g_client = g_o3dElement.client;
+
+ // Creates a pack to manage our resources/assets
+ g_pack = g_client.createPack();
+
+ g_root = g_pack.createObject('Transform');
+
+ g_viewInfo = o3djs.rendergraph.createBasicView(
+ g_pack,
+ g_root,
+ g_client.renderGraphRoot,
+ [0.2, 0.3, 0.4, 1]);
+
+ var clientWidth = g_client.width;
+ var clientHeight = g_client.height;
+ g_viewInfo.drawContext.projection = g_math.matrix4.orthographic(
+ -clientWidth * 0.5 + 0.5,
+ clientWidth * 0.5 + 0.5,
+ -clientHeight * 0.5 + 0.5,
+ clientHeight * 0.5 + 0.5,
+ 0.001,
+ 1000);
+ g_viewInfo.drawContext.view = g_math.matrix4.lookAt(
+ [0, 500, 0], // eye
+ [0, 0, 0], // target
+ [0, 0, -1]); // up
+
+ for (var ii = 0; ii < 3; ++ii) {
+ var texture = g_pack.createTexture2D(
+ 256, 256, g_o3d.Texture.ARGB8, 1, true);
+ var surface = texture.getRenderSurface(0);
+ var renderSet = g_pack.createObject('RenderSurfaceSet');
+ renderSet.renderSurface = surface;
+ // Make render before the main display.
+ renderSet.priority = -10 + ii;
+
+ var material = o3djs.material.createConstantMaterial(
+ g_pack, g_viewInfo, texture);
+ var shape = o3djs.primitives.createPlane(g_pack, material, 128, 128, 1, 1);
+ var transform = g_pack.createObject("Transform");
+ transform.translate(-200 + 150 * ii, 0, 0);
+ transform.parent = g_root;
+ transform.addShape(shape);
+ var clearColor = [0, 0, 0, 1];
+ clearColor[ii] = 1;
+ var viewInfo = o3djs.rendergraph.createBasicView(
+ g_pack, null, renderSet, clearColor);
+ // Splice it into the render graph AFTER everything is setup.
+ renderSet.parent = g_client.renderGraphRoot;
+ }
+
+ window.g_testResult = true;
+}
+
+/**
+ * Remove any callbacks so they don't get called after the page has unloaded.
+ */
+function unload() {
+ if (g_client) {
+ g_client.cleanup();
+ }
+}
+</script>
+</head>
+<body>
+<h1>Tests that render targets clear correctly.</h1>
+Should be red, green, blue on dark blue background.
+<div id="o3d" style="width: 600px; height: 600px"></div>
+</body>
+</html>
+