diff options
Diffstat (limited to 'experimental/skpdiff/diff_viewer.js')
-rw-r--r-- | experimental/skpdiff/diff_viewer.js | 103 |
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; + }; +} |