summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandrewhayden@chromium.org <andrewhayden@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-16 22:25:24 +0000
committerandrewhayden@chromium.org <andrewhayden@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-16 22:25:24 +0000
commitd4df5dbb7cfd5fbfd7bd6f7de25ab816433b1617 (patch)
tree8e4b332e7c98d843bd3132149c1c2eb75e743ee9
parent6dc38f7817366651d281b13e6ac0f61f9623ba7e (diff)
downloadchromium_src-d4df5dbb7cfd5fbfd7bd6f7de25ab816433b1617.zip
chromium_src-d4df5dbb7cfd5fbfd7bd6f7de25ab816433b1617.tar.gz
chromium_src-d4df5dbb7cfd5fbfd7bd6f7de25ab816433b1617.tar.bz2
Add third-party library 'webtreemap' for use in tools.
BUG= Review URL: https://codereview.chromium.org/131463006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245353 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--third_party/webtreemap/OWNERS2
-rw-r--r--third_party/webtreemap/README.chromium21
-rw-r--r--third_party/webtreemap/src/COPYING202
-rw-r--r--third_party/webtreemap/src/README.markdown63
-rw-r--r--third_party/webtreemap/src/webtreemap.css84
-rw-r--r--third_party/webtreemap/src/webtreemap.js232
6 files changed, 604 insertions, 0 deletions
diff --git a/third_party/webtreemap/OWNERS b/third_party/webtreemap/OWNERS
new file mode 100644
index 0000000..85027eb
--- /dev/null
+++ b/third_party/webtreemap/OWNERS
@@ -0,0 +1,2 @@
+torne@chromium.org
+bulach@chromium.org
diff --git a/third_party/webtreemap/README.chromium b/third_party/webtreemap/README.chromium
new file mode 100644
index 0000000..c551041
--- /dev/null
+++ b/third_party/webtreemap/README.chromium
@@ -0,0 +1,21 @@
+Name: webtreemap
+Short Name: webtreemap
+URL: https://github.com/martine/webtreemap
+Version: 0
+Date: Tue Apr 23 08:57:05 2013 -0700
+Revision: a2fa353833eca1a4821ba4c93fb6a7d546aed02a
+License: Apache 2.0
+License File: src/COPYING
+Security Critical: No
+License Android Compatible: Yes
+
+Description:
+A standalone javascript visualization library that generates DOM-based treemaps
+for arbitrary data.
+
+IMPORTANT:
+This library is currently used only for internal tools, and has not been
+security reviewed for use in any shipping or web-facing code.
+
+Local Modifications:
+Deleted demo directory
diff --git a/third_party/webtreemap/src/COPYING b/third_party/webtreemap/src/COPYING
new file mode 100644
index 0000000..131cb1d
--- /dev/null
+++ b/third_party/webtreemap/src/COPYING
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2010
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/third_party/webtreemap/src/README.markdown b/third_party/webtreemap/src/README.markdown
new file mode 100644
index 0000000..78903ba
--- /dev/null
+++ b/third_party/webtreemap/src/README.markdown
@@ -0,0 +1,63 @@
+# webtreemap
+
+A simple treemap implementation using web technologies (DOM nodes, CSS
+styling and transitions) rather than a big canvas/svg/plugin.
+
+Play with a [demo][].
+
+[demo]: http://martine.github.com/webtreemap/demo/demo.html
+
+## Creating your own
+
+1. Create a page with a DOM node (i.e. a `<div>`) that will contain
+ your treemap.
+2. Add the treemap to the node via something like
+
+ appendTreemap(document.getElementById('mynode'), mydata);
+3. Style the treemap using CSS.
+
+### Input format
+
+The input data (`mydata` in the overview snippet) is a tree of nodes,
+likely imported via a separate JSON file. Each node (including the
+root) should contain data in the following format.
+
+ {
+ name: (HTML that is displayed via .innerHTML on the caption),
+ data: {
+ "$area": (a number, in arbitrary units)
+ },
+ children: (list of child tree nodes)
+ }
+
+(This strange format for data comes from the the [JavaScript InfoVis
+Toolkit][thejit]. I might change it in the future.)
+
+The `$area` of a node should be the sum of the `$area` of all of its
+`children`.
+
+(At runtime, tree nodes will dynamically will gain two extra
+attributes, `parent` and `dom`; this is only worth pointing out so
+that you don't accidentally conflict with them.)
+
+### CSS styling
+
+The treemap is constructed with one `div` per region with a separate
+`div` for the caption. Each div is styleable via the
+`webtreemap-node` CSS class. The captions are stylable as
+`webtreemap-caption`.
+
+Each level of the tree also gets a per-level CSS class,
+`webtreemap-level0` through `webtreemap-level4`. These can be
+adjusted to e.g. made different levels different colors. To control
+the caption on a per-level basis, use a CSS selector like
+`.webtreemap-level2 > .webtreemap-caption`.
+
+Your best bet is to modify the included `webtreemap.css`, which
+contains comments about required and optional CSS attributes.
+
+## Related projects
+
+* [JavaScript InfoVis Toolkit][thejit]
+
+[thejit]: http://thejit.org/
diff --git a/third_party/webtreemap/src/webtreemap.css b/third_party/webtreemap/src/webtreemap.css
new file mode 100644
index 0000000..750bd01
--- /dev/null
+++ b/third_party/webtreemap/src/webtreemap.css
@@ -0,0 +1,84 @@
+.webtreemap-node {
+ /* Required attributes. */
+ position: absolute;
+ overflow: hidden; /* To hide overlong captions. */
+ background: white; /* Nodes must be opaque for zIndex layering. */
+ border: solid 1px black; /* Calculations assume 1px border. */
+
+ /* Optional: CSS animation. */
+ -webkit-transition: top 0.3s,
+ left 0.3s,
+ width 0.3s,
+ height 0.3s;
+}
+
+/* Optional: highlight nodes on mouseover. */
+.webtreemap-node:hover {
+ background: #eee;
+}
+
+/* Optional: Different background colors depending on symbol. */
+.webtreemap-symbol-bss {
+ background: #66C2A5;
+}
+.webtreemap-symbol-data {
+ background: #FC8D62;
+}
+.webtreemap-symbol-read-only_data {
+ background: #8DA0CB;
+}
+.webtreemap-symbol-code {
+ background: #E78AC3;
+}
+.webtreemap-symbol-weak_symbol {
+ background: #A6D854;
+}
+.webtreemap-symbol-bss.webtreemap-aggregate {
+ background: #B3E2CD;
+}
+.webtreemap-symbol-data.webtreemap-aggregate {
+ background: #FDCDAC;
+}
+.webtreemap-symbol-read-only_data.webtreemap-aggregate {
+ background: #CBD5E8;
+}
+.webtreemap-symbol-code.webtreemap-aggregate {
+ background: #F4CAE4;
+}
+.webtreemap-symbol-weak_symbol.webtreemap-aggregate {
+ background: #E6F5C9;
+}
+
+#legend > * {
+ border: solid 1px #444;
+}
+
+/* Optional: Different borders depending on level. */
+.webtreemap-level0 {
+ border: solid 1px #444;
+}
+.webtreemap-level1 {
+ border: solid 1px #666;
+}
+.webtreemap-level2 {
+ border: solid 1px #888;
+}
+.webtreemap-level3 {
+ border: solid 1px #aaa;
+}
+.webtreemap-level4 {
+ border: solid 1px #ccc;
+}
+
+/* Optional: styling on node captions. */
+.webtreemap-caption {
+ font-family: sans-serif;
+ font-size: 11px;
+ padding: 2px;
+ text-align: center;
+}
+
+/* Optional: styling on captions on mouse hover. */
+/*.webtreemap-node:hover > .webtreemap-caption {
+ text-decoration: underline;
+}*/
diff --git a/third_party/webtreemap/src/webtreemap.js b/third_party/webtreemap/src/webtreemap.js
new file mode 100644
index 0000000..85feb6e
--- /dev/null
+++ b/third_party/webtreemap/src/webtreemap.js
@@ -0,0 +1,232 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Size of border around nodes.
+// We could support arbitrary borders using getComputedStyle(), but I am
+// skeptical the extra complexity (and performance hit) is worth it.
+var kBorderWidth = 1;
+
+// Padding around contents.
+// TODO: do this with a nested div to allow it to be CSS-styleable.
+var kPadding = 4;
+
+var focused = null;
+
+function focus(tree) {
+ focused = tree;
+
+ // Hide all visible siblings of all our ancestors by lowering them.
+ var level = 0;
+ var root = tree;
+ while (root.parent) {
+ root = root.parent;
+ level += 1;
+ for (var i = 0, sibling; sibling = root.children[i]; ++i) {
+ if (sibling.dom)
+ sibling.dom.style.zIndex = 0;
+ }
+ }
+ var width = root.dom.offsetWidth;
+ var height = root.dom.offsetHeight;
+ // Unhide (raise) and maximize us and our ancestors.
+ for (var t = tree; t.parent; t = t.parent) {
+ // Shift off by border so we don't get nested borders.
+ // TODO: actually make nested borders work (need to adjust width/height).
+ position(t.dom, -kBorderWidth, -kBorderWidth, width, height);
+ t.dom.style.zIndex = 1;
+ }
+ // And layout into the topmost box.
+ layout(tree, level, width, height);
+}
+
+function makeDom(tree, level) {
+ var dom = document.createElement('div');
+ dom.style.zIndex = 1;
+ dom.className = 'webtreemap-node webtreemap-level' + Math.min(level, 4);
+ if (tree.data['$symbol']) {
+ dom.className += (' webtreemap-symbol-' +
+ tree.data['$symbol'].replace(' ', '_'));
+ }
+ if (tree.data['$dominant_symbol']) {
+ dom.className += (' webtreemap-symbol-' +
+ tree.data['$dominant_symbol'].replace(' ', '_'));
+ dom.className += (' webtreemap-aggregate');
+ }
+
+ dom.onmousedown = function(e) {
+ if (e.button == 0) {
+ if (focused && tree == focused && focused.parent) {
+ focus(focused.parent);
+ } else {
+ focus(tree);
+ }
+ }
+ e.stopPropagation();
+ return true;
+ };
+
+ var caption = document.createElement('div');
+ caption.className = 'webtreemap-caption';
+ caption.innerHTML = tree.name;
+ dom.appendChild(caption);
+
+ tree.dom = dom;
+ return dom;
+}
+
+function position(dom, x, y, width, height) {
+ // CSS width/height does not include border.
+ width -= kBorderWidth*2;
+ height -= kBorderWidth*2;
+
+ dom.style.left = x + 'px';
+ dom.style.top = y + 'px';
+ dom.style.width = Math.max(width, 0) + 'px';
+ dom.style.height = Math.max(height, 0) + 'px';
+}
+
+// Given a list of rectangles |nodes|, the 1-d space available
+// |space|, and a starting rectangle index |start|, compute an span of
+// rectangles that optimizes a pleasant aspect ratio.
+//
+// Returns [end, sum], where end is one past the last rectangle and sum is the
+// 2-d sum of the rectangles' areas.
+function selectSpan(nodes, space, start) {
+ // Add rectangle one by one, stopping when aspect ratios begin to go
+ // bad. Result is [start,end) covering the best run for this span.
+ // http://scholar.google.com/scholar?cluster=5972512107845615474
+ var node = nodes[start];
+ var rmin = node.data['$area']; // Smallest seen child so far.
+ var rmax = rmin; // Largest child.
+ var rsum = 0; // Sum of children in this span.
+ var last_score = 0; // Best score yet found.
+ for (var end = start; node = nodes[end]; ++end) {
+ var size = node.data['$area'];
+ if (size < rmin)
+ rmin = size;
+ if (size > rmax)
+ rmax = size;
+ rsum += size;
+
+ // This formula is from the paper, but you can easily prove to
+ // yourself it's taking the larger of the x/y aspect ratio or the
+ // y/x aspect ratio. The additional magic fudge constant of 5
+ // makes us prefer wider rectangles to taller ones.
+ var score = Math.max(5*space*space*rmax / (rsum*rsum),
+ 1*rsum*rsum / (space*space*rmin));
+ if (last_score && score > last_score) {
+ rsum -= size; // Undo size addition from just above.
+ break;
+ }
+ last_score = score;
+ }
+ return [end, rsum];
+}
+
+function layout(tree, level, width, height) {
+ if (!('children' in tree))
+ return;
+
+ var total = tree.data['$area'];
+
+ // XXX why do I need an extra -1/-2 here for width/height to look right?
+ var x1 = 0, y1 = 0, x2 = width - 1, y2 = height - 2;
+ x1 += kPadding; y1 += kPadding;
+ x2 -= kPadding; y2 -= kPadding;
+ y1 += 14; // XXX get first child height for caption spacing
+
+ var pixels_to_units = Math.sqrt(total / ((x2 - x1) * (y2 - y1)));
+
+ for (var start = 0, child; child = tree.children[start]; ++start) {
+ if (x2 - x1 < 60 || y2 - y1 < 40) {
+ if (child.dom) {
+ child.dom.style.zIndex = 0;
+ position(child.dom, -2, -2, 0, 0);
+ }
+ continue;
+ }
+
+ // In theory we can dynamically decide whether to split in x or y based
+ // on aspect ratio. In practice, changing split direction with this
+ // layout doesn't look very good.
+ // var ysplit = (y2 - y1) > (x2 - x1);
+ var ysplit = true;
+
+ var space; // Space available along layout axis.
+ if (ysplit)
+ space = (y2 - y1) * pixels_to_units;
+ else
+ space = (x2 - x1) * pixels_to_units;
+
+ var span = selectSpan(tree.children, space, start);
+ var end = span[0], rsum = span[1];
+
+ // Now that we've selected a span, lay out rectangles [start,end) in our
+ // available space.
+ var x = x1, y = y1;
+ for (var i = start; i < end; ++i) {
+ child = tree.children[i];
+ if (!child.dom) {
+ child.parent = tree;
+ child.dom = makeDom(child, level + 1);
+ tree.dom.appendChild(child.dom);
+ } else {
+ child.dom.style.zIndex = 1;
+ }
+ var size = child.data['$area'];
+ var frac = size / rsum;
+ if (ysplit) {
+ width = rsum / space;
+ height = size / width;
+ } else {
+ height = rsum / space;
+ width = size / height;
+ }
+ width /= pixels_to_units;
+ height /= pixels_to_units;
+ width = Math.round(width);
+ height = Math.round(height);
+ position(child.dom, x, y, width, height);
+ if ('children' in child) {
+ layout(child, level + 1, width, height);
+ }
+ if (ysplit)
+ y += height;
+ else
+ x += width;
+ }
+
+ // Shrink our available space based on the amount we used.
+ if (ysplit)
+ x1 += Math.round((rsum / space) / pixels_to_units);
+ else
+ y1 += Math.round((rsum / space) / pixels_to_units);
+
+ // end points one past where we ended, which is where we want to
+ // begin the next iteration, but subtract one to balance the ++ in
+ // the loop.
+ start = end - 1;
+ }
+}
+
+function appendTreemap(dom, data) {
+ var style = getComputedStyle(dom, null);
+ var width = parseInt(style.width);
+ var height = parseInt(style.height);
+ if (!data.dom)
+ makeDom(data, 0);
+ dom.appendChild(data.dom);
+ position(data.dom, 0, 0, width, height);
+ layout(data, 0, width, height);
+}