Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Unified Diff: experimental/flocking_geese/js/speedometer.js

Issue 10928195: First round of dead file removal (Closed) Base URL: https://github.com/samclegg/nativeclient-sdk.git@master
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « experimental/flocking_geese/js/slider_event.js ('k') | experimental/flocking_geese/manifest.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/flocking_geese/js/speedometer.js
diff --git a/experimental/flocking_geese/js/speedometer.js b/experimental/flocking_geese/js/speedometer.js
deleted file mode 100644
index ce67a4390029775285328a2c122f45d4936cfdd7..0000000000000000000000000000000000000000
--- a/experimental/flocking_geese/js/speedometer.js
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright (c) 2011 The Native Client Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @file
- * The speedometer object. This draws an array of speedometers as adjacent
- * vertical bars. The height of the bars is a percentage of the maximum
- * possible speed.
- */
-
-
-goog.provide('Speedometer');
-goog.provide('Speedometer.Attributes');
-
-goog.require('goog.Disposable');
-goog.require('goog.events');
-goog.require('goog.events.EventTarget');
-
-/**
- * Manages a map of individual speedometers. Use addMeterWithName()
- * to add speedometer bars.
- * @param {Canvas} opt_canvas The <CANVAS> element to use for drawing.
- * @constructor
- * @extends {goog.events.EventTarget}
- */
-Speedometer = function(opt_canvas) {
- goog.events.EventTarget.call(this);
-
- /**
- * Speedometer has two canvases, one is the "offscreen" canvas used to
- * assemble the final speedometer image and the other is the "onscreen"
- * canvas in the DOM which renders the final image.
- * @type {Canvas}
- * @private
- */
- this.domCanvas_ = opt_canvas || null;
- this.offscreenCanvas_ = null;
-
- /**
- * The dictionary of individual meters.
- * @type {Array.Object}
- * @private
- */
- this.meters_ = [];
-
- /**
- * The number of unique meters added to the speedometer.
- * @type {number}
- * @private
- */
- this.meterCount_ = 0;
-
- /**
- * The maximum speed that any meter can reach. Meters that go past this
- * value are clipped.
- * @type {real}
- * @private
- */
- this.maxSpeed_ = 1.0;
-
- /**
- * Display timers. There is a timer for updating the needles and one for
- * updating the odometers, these run on different frequencies. These
- * timers are started with the first call to render().
- * @type {Timer}
- * @private
- */
- this.needleUpdateTimer_ = null;
- this.odometerUpdateTimer_ = null;
-
- /**
- * The images.
- * @type {Object.Image}
- * @private
- */
- this.images_ = {}
-};
-goog.inherits(Speedometer, goog.events.EventTarget);
-
-/**
- * Meter dictionary values.
- * @enum {string}
- */
-Speedometer.Attributes = {
- DISPLAY_VALUE: 'displayValue',
- THEME: 'theme', // The needle theme. Has value Speedometer.Themes.
- NAME: 'name', // The name of the meter. Not optional.
- ODOMETER_DISPLAY_VALUE: 'odometerDisplayValue',
- ODOMETER_LEFT: 'odometerLeft', // The left coordinate of the odometer.
- ODOMETER_TOP: 'odometerTop',
- VALUE: 'value', // The value of the meter. Not optional.
-};
-
-/**
- * Drawing themes.
- * @enum {string}
- */
-Speedometer.Themes = {
- DEFAULT: 'greenTheme',
- GREEN: 'greenTheme',
- RED: 'redTheme'
-};
-
-/**
- * Odometer dimensions.
- * @enum {number}
- * @private
- */
-Speedometer.prototype.OdometerDims_ = {
- COLUMN_HEIGHT: 16,
- COLUMN_WIDTH: 12,
- DIGIT_HEIGHT: 14,
- DIGIT_WIDTH: 8
-};
-
-/**
- * The needle update interval time. Measured in milliseconds.
- * @type {number}
- * @private
- */
-Speedometer.prototype.NEEDLE_UPDATE_INTERVAL_ = 83.0; // About 12 frames/sec.
-
-/**
- * Beginning and ending angles for the meter. |METER_ANGLE_START_| represents
- * "speed" of 0, |METER_ANGLE_RANGE_| is the angular range of the meter needle.
- * maximumSpeed() is |METER_ANGLE_START_ + METER_ANGLE_RANGE_|. Measured
- * cockwise in radians from the line y = 0.
- * @type {number}
- * @private
- */
-Speedometer.prototype.METER_ANGLE_START_ = 3.0 * Math.PI / 4.0;
-Speedometer.prototype.METER_ANGLE_RANGE_ = 6.0 * Math.PI / 4.0;
-
-/**
- * Value used to provde damping to the meter. The meter reading can change by
- * at most this amount per frame. Measured in radians.
- * @type {number}
- * @private
- */
-Speedometer.prototype.DAMPING_FACTOR_ = Math.PI / 36.0;
-
-/**
- * Maximum odometer value. Speeds are clapmed to this.
- * @type {number}
- * @private
- */
-Speedometer.prototype.MAX_ODOMETER_VALUE_ = 999999.99;
-
-/**
- * The odometer update interval time. Measured in milliseconds.
- * @type {number}
- * @private
- */
-Speedometer.prototype.ODOMETER_UPDATE_INTERVAL_ = 2000.0;
-
-/**
- * The amount of time to roll a digit. Measured in number of needle update
- * intervals. So, if NEEDLE_UPDATE_INTERVAL_ is 12 fps (83 msec), then a roll
- * time of 6 means each digit takes about 1/2 sec to roll.
- * @type {number}
- * @private
- */
-Speedometer.prototype.ODOMETER_ROLL_TIME_ = 6;
-
-/**
- * The number of odometer digits.
- * @type {number}
- * @private
- */
-Speedometer.prototype.ODOMETER_DIGIT_COUNT_ = 7;
-
-/**
- * Override of disposeInternal() to dispose of retained objects and unhook all
- * events.
- * @override
- */
-Speedometer.prototype.disposeInternal = function() {
- function stopTimer(timer) {
- if (timer) {
- clearTimeout(timer);
- }
- }
-
- stopTimer(this.needleUpdateTimer_);
- this.needleUpdateTimer_ = null;
- stopTimer(this.odometerUpdateTimer_);
- this.odometerUpdateTimer_ = null;
- for (image in this.images_) {
- delete this.images_[image];
- this.images_[image] = null;
- }
- this.domCanvas_ = null;
- delete this.offscreenCanvas_;
- this.offscreenCanvas_ = null;
- Speedometer.superClass_.disposeInternal.call(this);
-}
-
-/**
- * Set the canvas for drawing.
- * @param !{Canvas} canvas The <CANVAS> element for drawing.
- */
-Speedometer.prototype.setCanvas = function(canvas) {
- this.domCanvas_ = canvas;
- if (this.offscreenCanvas_) {
- delete this.offscreenCanvas_;
- this.offscreenCanvas_ = null;
- }
- if (!canvas) {
- return;
- }
- this.offscreenCanvas_ = document.createElement('canvas');
- this.offscreenCanvas_.width = canvas.width;
- this.offscreenCanvas_.height = canvas.height;
-}
-
-/**
- * Return the current maximum speed.
- * @return {real} The current maximum speed. Guaranteed to be >= 0.0
- */
-Speedometer.prototype.maximumSpeed = function() {
- return this.maxSpeed_;
-}
-
-/**
- * Set the maximum speed value for all meters.
- * @param {real} maxSpeed The new maximum speed. Must be > 0.
- * @return {real} The previous maximum speed.
- */
-Speedometer.prototype.setMaximumSpeed = function(maxSpeed) {
- if (maxSpeed <= 0.0) {
- throw Error('maxSpeed must be >= 0.0');
- }
- var oldMaxSpeed = this.maxSpeed_;
- this.maxSpeed_ = maxSpeed;
- return oldMaxSpeed;
-}
-
-/**
- * Add a named meter. If a meter with |meterName| already exists, then do
- * nothing.
- * @param {!string} meterName The name for the new meter.
- * @param {?Object} opt_attributes A dictionary containing optional attributes
- * for the meter. Some key names are special, for example the 'valueLabel'
- * key contains the id of a value label DOM element for the meter - this
- * label will be updated with a text representation of the meter's value.
- */
-Speedometer.prototype.addMeterWithName = function(meterName, opt_attributes) {
- if (!(meterName in this.meters_)) {
- this.meterCount_++;
- }
- var attributes = opt_attributes || {};
- // Fill in the non-optional attributes.
- var meter = {
- name: meterName,
- value: 0.0,
- displayValue: 0.0, // Updated every NEEDLE_UPDATE_INTERVAL_.
- maxValue: 0.0,
- theme: Speedometer.Themes.DEFAULT,
- odometerLeft: 0,
- odometerTop: 0,
- previousAngle: 0.0,
- odometerDisplayValue: 0.0 // Updated every ODOMETER_UPDATE_INTERVAL_.
- };
- for (attrib in attributes) {
- // Overwrite meter defaults with passed-in values if present. Otherwise,
- // add the passed-in element.
- meter[attrib] = attributes[attrib];
- }
- // Each digit has its current display offset and a delta value used to
- // compute its next display offset when rolling the digit.
- meter.odometerDigits_ = new Array(this.ODOMETER_DIGIT_COUNT_);
- for (var i = 0; i < this.ODOMETER_DIGIT_COUNT_; i++) {
- meter.odometerDigits_[i] = this.createOdometerDigitDict_();
- }
-
- this.meters_[meterName] = meter;
-}
-
-/**
- * Update the value of a named meter. If the meter does not exist, then do
- * nothing. If the value is successfully changed, then post a VALUE_CHANGED
- * event.
- * @param {!string} meterName The name of the meter.
- * @param {!real} value The new value for the meter. Must be >= 0
- * @return {real} The previous value of the meter.
- */
-Speedometer.prototype.updateMeterNamed =
- function(meterName, value) {
- var oldValue = 0.0;
- if (meterName in this.meters_) {
- var meter = this.meters_[meterName];
- oldValue = meter.value;
- // Update the actual values. Display values are updated by the update
- // interval handlers.
- meter.value = value;
- meter.maxValue = Math.max(meter.maxValue, value);
- }
- return oldValue;
-}
-
-/**
- * The value for a meter. If the meter doesn't exist, or if the given key is
- * not valid, returns -1.
- * @param {!string} meterName The name of the meter.
- * @param {?string} opt_key The key name of the value. Defaults to 'value'.
- * @return {number} The current meter's value or -1 if the meter doesn't exist.
- */
-Speedometer.prototype.valueForMeterNamed = function(meterName, opt_key) {
- if (meterName in this.meters_) {
- var key = opt_key || Speedometer.Attributes.VALUE;
- var meter = this.meters_[meterName];
- if (key in meter) {
- return meter[key];
- }
- }
- return -1;
-}
-
-/**
- * Update the needles to their new values, and restart the needle update timer.
- */
-Speedometer.prototype.updateNeedles = function() {
- for (meterName in this.meters_) {
- var meter = this.meters_[meterName];
- meter.displayValue = meter.value;
- }
- this.render();
- this.needleUpdateTimer_ = setTimeout(goog.bind(this.updateNeedles, this),
- this.NEEDLE_UPDATE_INTERVAL_);
-}
-
-/**
- * Update the odometers to their new values, and restart the odometer update
- * timer. Recomputes all the animation parameters for rolling the digits to
- * their new values.
- */
-Speedometer.prototype.updateOdometers = function() {
- for (meterName in this.meters_) {
- var meter = this.meters_[meterName];
- meter.odometerDisplayValue = meter.value;
- var odometerValue = Math.min(meter.odometerDisplayValue.toFixed(2),
- this.MAX_ODOMETER_VALUE_);
- for (var digit = this.ODOMETER_DIGIT_COUNT_ - 1; digit >= 0; digit--) {
- var digitDict = this.createOdometerDigitDict_();
- var digitValue = (odometerValue - Math.floor(odometerValue)) * 10;
- var prevOffset = meter.odometerDigits_[digit].previousOffset;
- digitDict.offset = Math.floor(digitValue) *
- this.OdometerDims_.DIGIT_HEIGHT;
- digitDict.rollDelta = (digitDict.offset - prevOffset) /
- this.ODOMETER_ROLL_TIME_;
- digitDict.previousOffset = prevOffset;
- meter.odometerDigits_[digit] = digitDict;
- odometerValue /= 10;
- }
- }
- this.odometerUpdateTimer_ = setTimeout(goog.bind(this.updateOdometers, this),
- this.ODOMETER_UPDATE_INTERVAL_);
-}
-
-/**
- * Start the display timers if needed and perform any other display
- * initialization.
- */
-Speedometer.prototype.reset = function() {
- this.loadImages_();
- for (meterName in this.meters_) {
- var meter = this.meters_[meterName];
- meter.displayValue = meter.value;
- meter.odometerDisplayValue = meter.maxValue;
- }
- if (!this.needleUpdateTimer_) {
- this.needleUpdateTimer_ = setTimeout(goog.bind(this.updateNeedles, this),
- this.NEEDLE_UPDATE_INTERVAL_);
- }
- if (!this.odometerUpdateTimer_) {
- this.odometerUpdateTimer_ = setTimeout(
- goog.bind(this.updateOdometers, this), this.ODOMETER_UPDATE_INTERVAL_);
- }
-}
-
-/**
- * Render the speedometer.
- */
-Speedometer.prototype.render = function() {
- if (!this.offscreenCanvas_) {
- this.setCanvas(this.domCanvas_);
- if (!this.offscreenCanvas_) {
- return;
- }
- }
- var context2d = this.offscreenCanvas_.getContext('2d');
- context2d.save();
- this.drawBackground_(context2d,
- this.offscreenCanvas_.width,
- this.offscreenCanvas_.height);
- // Paint the meters.
- for (meterName in this.meters_) {
- var meter = this.meters_[meterName];
- this.drawOdometer_(context2d, meter);
- this.drawNeedle_(context2d, meter);
- }
- // Draw the hub over the needles.
- var canvasCenterX = context2d.canvas.width / 2;
- var canvasCenterY = context2d.canvas.height / 2;
- var hubRadius = this.images_.hub.width / 2;
- context2d.translate(canvasCenterX - hubRadius, canvasCenterY - hubRadius);
- context2d.drawImage(this.images_.hub, 0, 0);
- context2d.restore();
- this.flushDrawing_();
-}
-
-/**
- * Flush the contents of the offscreen canvas to the onscreen one.
- * @private
- */
-Speedometer.prototype.flushDrawing_ = function() {
- if (!this.domCanvas_ || !this.offscreenCanvas_) {
- return;
- }
- var context2d = this.domCanvas_.getContext('2d');
- context2d.drawImage(this.offscreenCanvas_, 0, 0);
-}
-
-/**
- * Draw the background.
- * @param {Graphics2d} context2d The 2D canvas context.
- * @param {number} width The background width, measured in pixels.
- * @param {number} height The background height, measured in pixels.
- * @private
- */
-Speedometer.prototype.drawBackground_ = function(context2d, width, height) {
- // Paint the background image.
- if (this.images_.background.complete) {
- context2d.drawImage(this.images_.background, 0, 0);
- } else {
- context2d.fillStyle = 'black';
- context2d.fillRect(0, 0, width, height);
- }
-}
-
-/**
- * Draw a meter's needle.
- * @param {Graphics2d} context2d The 2D canvas context.
- * @param {Object} meter The meter.
- * @private
- */
-Speedometer.prototype.drawNeedle_ = function(context2d, meter) {
- var canvasCenterX = context2d.canvas.width / 2;
- var canvasCenterY = context2d.canvas.height / 2;
- var meterAngle = (meter.displayValue / this.maxSpeed_) *
- this.METER_ANGLE_RANGE_;
- meterAngle = Math.min(meterAngle, this.METER_ANGLE_RANGE_);
- meterAngle = Math.max(meterAngle, 0.0);
- // Dampen the meter's angular change.
- var delta = meterAngle - meter.previousAngle;
- if (Math.abs(delta) > this.DAMPING_FACTOR_) {
- delta = delta < 0 ? -this.DAMPING_FACTOR_ : this.DAMPING_FACTOR_;
- }
- var dampedAngle = meter.previousAngle + delta;
- meter.previousAngle = dampedAngle;
- dampedAngle += this.METER_ANGLE_START_;
- context2d.save();
- context2d.translate(canvasCenterX, canvasCenterY);
- context2d.rotate(dampedAngle);
- // Select the needle image based on the meter's theme and value.
- var needleImage = null;
- if (meter.displayValue == 0) {
- needleImage = this.images_.stoppedNeedle;
- } else if (meter.theme == Speedometer.Themes.GREEN) {
- needleImage = this.images_.greenNeedle;
- } else if (meter.theme == Speedometer.Themes.RED) {
- needleImage = this.images_.redNeedle;
- }
- if (needleImage && needleImage.complete) {
- context2d.drawImage(
- needleImage,
- 0, 0, needleImage.width, needleImage.height,
- -5, -5, needleImage.width, needleImage.height);
- }
- context2d.restore();
-}
-
-/**
- * Create an odometer digit dictionary.
- * @return {Object} a newly-created digit dictionary.
- * @private
- */
-Speedometer.prototype.createOdometerDigitDict_ = function() {
- var digitDict = {
- rollDelta: 0,
- previousOffset: 0,
- offset: 0
- };
- return digitDict;
-}
-
-/**
- * Draw the odometer for a given meter.
- * @param {Graphics2d} context2d The 2D canvas context.
- * @param {Object} meter The meter.
- * @private
- */
-Speedometer.prototype.drawOdometer_ = function(context2d, meter) {
- if (!this.images_.odometerTenths.complete ||
- !this.images_.odometerDigits.complete) {
- return;
- }
- context2d.save();
- context2d.translate(meter.odometerLeft, meter.odometerTop);
- context2d.drawImage(this.images_.odometer, 0, 0);
- // Center the odometer digits in the odometer cells.
- context2d.translate(
- (this.OdometerDims_.COLUMN_WIDTH - this.OdometerDims_.DIGIT_WIDTH) / 2,
- (this.OdometerDims_.COLUMN_HEIGHT - this.OdometerDims_.DIGIT_HEIGHT) / 2);
- // Draw the tenths digit.
- this.drawOdometerDigit_(context2d, meter, 6, this.images_.odometerTenths);
- // Draw the integer part, up to 5 digits (max value is 999,999.9).
- for (var column = 5; column >= 0; column--) {
- this.drawOdometerDigit_(context2d, meter, column,
- this.images_.odometerDigits);
- }
- context2d.restore();
-}
-
-/**
- * Draw a single odometer digit. The digit source is a vertical strip of
- * pre-rendered numbers. When drawing the last digit in the strip, the image
- * source is wrapped back to the beginning of the strip. In this way, drawing
- * a partial '9' will also draw part of the '0'.
- * @param {Graphics2d} context2d The drawing context.
- * @param {Object} meter The meter related to this odometer.
- * @param {number} column The odometer column index, 0-based numbered from the
- * left-most (most significant) digit. For example, column 0 is the
- * 100,000's place, column 6 is the 1/10's place.
- * @param {Image} digits The digit source image.
- * @private
- */
-Speedometer.prototype.drawOdometerDigit_ = function(
- context2d, meter, column, digits) {
- var digitDict = meter.odometerDigits_[column];
- var offset = digitDict.previousOffset;
- var digitHeight = Math.min(digits.height - offset,
- this.OdometerDims_.DIGIT_HEIGHT);
- var digitWrapHeight = this.OdometerDims_.DIGIT_HEIGHT - digitHeight;
- context2d.drawImage(digits,
- 0, offset,
- this.OdometerDims_.DIGIT_WIDTH, digitHeight,
- column * this.OdometerDims_.COLUMN_WIDTH, 0,
- this.OdometerDims_.DIGIT_WIDTH, digitHeight);
- if (digitWrapHeight > 0) {
- context2d.drawImage(digits,
- 0, 0,
- this.OdometerDims_.DIGIT_WIDTH, digitWrapHeight,
- column * this.OdometerDims_.COLUMN_WIDTH,
- this.OdometerDims_.DIGIT_HEIGHT - digitWrapHeight,
- this.OdometerDims_.DIGIT_WIDTH, digitWrapHeight);
- }
- if (digitDict.rollDelta == 0) {
- return;
- }
- if ((digitDict.rollDelta > 0 && offset >= digitDict.offset) ||
- (digitDict.rollDelta < 0 && offset <= digitDict.offset)) {
- digitDict.previousOffset = digitDict.offset;
- digitDict.rollDelta = 0;
- return;
- }
- digitDict.previousOffset += digitDict.rollDelta;
- if (digitDict.previousOffset < 0) {
- // Wrap the offset around to the end of the digits image.
- digitDict.previousOffset += digits.height;
- }
- if (digitDict.previousOffset > digits.height) {
- // Wrap the offset around to the top of the digits image.
- digitDict.previousOffset = digitDict.previousOffset - digits.height;
- }
-}
-
-/**
- * Load all the images.
- * @private
- */
-Speedometer.prototype.loadImages_ = function() {
- this.images_.background = new Image();
- this.images_.background.src = 'images/DialFace.png';
- this.images_.hub = new Image();
- this.images_.hub.src = 'images/hub.png';
- this.images_.odometer = new Image();
- this.images_.odometer.src = 'images/odometer.png';
- this.images_.odometerDigits = new Image();
- this.images_.odometerDigits.src = 'images/numbers_grey.png';
- this.images_.odometerTenths = new Image();
- this.images_.odometerTenths.src = 'images/numbers_red.png';
- this.images_.stoppedNeedle = new Image();
- this.images_.stoppedNeedle.src = 'images/pointer_grey.png'
- this.images_.greenNeedle = new Image();
- this.images_.greenNeedle.src = 'images/pointer_green.png'
- this.images_.redNeedle = new Image();
- this.images_.redNeedle.src = 'images/pointer_red.png'
-}
-
« no previous file with comments | « experimental/flocking_geese/js/slider_event.js ('k') | experimental/flocking_geese/manifest.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698