aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/skpdiff/diff_viewer.js
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/skpdiff/diff_viewer.js')
-rw-r--r--experimental/skpdiff/diff_viewer.js103
1 files changed, 103 insertions, 0 deletions
diff --git a/experimental/skpdiff/diff_viewer.js b/experimental/skpdiff/diff_viewer.js
new file mode 100644
index 0000000000..700bf4b0e4
--- /dev/null
+++ b/experimental/skpdiff/diff_viewer.js
@@ -0,0 +1,103 @@
+angular.module('diff_viewer', []).
+config(['$routeProvider', function($routeProvider) {
+ // Show the list of differences by default
+ $routeProvider.
+ otherwise({ templateUrl: '/diff_list.html', controller: DiffListController});
+}]).
+directive('swapImg', function() {
+ // Custom directive for showing an image that gets swapped my mouseover.
+ return {
+ restrict: 'E', // The directive can be used as an element name
+ replace: true, // The directive replaces itself with the template
+ template: '<canvas ng-mouseenter="swap()" ng-mouseleave="swap()"></canvas>',
+ scope: { // The attributes below are bound to the scope
+ leftSrc: '@',
+ rightSrc: '@',
+ side: '@'
+ },
+ link: function(scope, elm, attrs, ctrl) {
+ var leftImage = new Image();
+ var rightImage = new Image();
+ var ctx = elm[0].getContext('2d');
+
+ scope.render = function() {
+ var image;
+ if (scope.side == "left") {
+ image = leftImage;
+ } else {
+ image = rightImage;
+ }
+
+ // Make it so the maximum size of an image is 500, and the images are scaled
+ // down in halves.
+ var divisor = 1;
+ while ((image.width / divisor) > 500) {
+ divisor *= 2;
+ }
+
+ // Set canvas to correct size and draw the image into it
+ elm[0].width = image.width / divisor;
+ elm[0].height = image.height / divisor;
+ ctx.drawImage(image, 0, 0, elm[0].width, elm[0].height);
+ };
+
+ // When the leftSrc attribute changes, load the image and then rerender
+ attrs.$observe('leftSrc', function(value) {
+ leftImage.src = value;
+ leftImage.onload = function() {
+ if (scope.side == "left") {
+ scope.render();
+ }
+ };
+ });
+
+ // When the rightSrc attribute changes, load the image and then rerender
+ attrs.$observe('rightSrc', function(value) {
+ rightImage.src = value;
+ rightImage.onload = function() {
+ if (scope.side == "right") {
+ scope.render();
+ }
+ };
+ });
+
+ // Swap which side to draw onto the canvas and then rerender
+ scope.swap = function() {
+ if (scope.side == "left") {
+ scope.side = "right";
+ } else {
+ scope.side = "left";
+ }
+ scope.render();
+ };
+ }
+ };
+});
+
+function DiffListController($scope) {
+ // Label each kind of differ for the sort buttons.
+ $scope.differs = [
+ {
+ "title": "Different Pixels"
+ },
+ {
+ "title": "Perceptual Difference"
+ }
+ ];
+
+ // Puts the records within AngularJS scope
+ $scope.records = SkPDiffRecords.records;
+
+ // Indicates which diff metric is used for sorting
+ $scope.sortIndex = 1;
+
+ // Called by the sort buttons to adjust the metric used for sorting
+ $scope.setSortIndex = function(idx) {
+ $scope.sortIndex = idx;
+ };
+
+ // A predicate for pulling out the number used for sorting
+ $scope.sortingDiffer = function(record) {
+ return record.diffs[$scope.sortIndex].result;
+ };
+}