Advertisement
benshepherd

keyframes.js

Dec 21st, 2017
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var keyframes = {
  2.  
  3.     // The habbo preview that was being shown before the user clicked play
  4.     // We will place this back once they press stop
  5.     beforePlayImage: null,
  6.  
  7.     lastSavedGifURL: null,
  8.  
  9.     // list of all keyframe items
  10.     items: [],
  11.  
  12.     // gifjs instance
  13.     gifjs: null,
  14.  
  15.     // init keyframes
  16.     init: function() {
  17.  
  18.         keyframes.add();
  19.     },
  20.  
  21.     // add keyframe
  22.     add: function () {
  23.  
  24.         keyframes.items.push({
  25.             url: habboCreator.generateUrl()
  26.         });
  27.  
  28.         // Clear last saved GIF url
  29.         keyframes.lastSavedGifURL = null;
  30.  
  31.         // Update keyframes item list
  32.         keyframes.ui.updateItems();
  33.  
  34.         // Update keyframes count
  35.         keyframes.ui.updateCount();
  36.     },
  37.  
  38.     // delete keyframe
  39.     delete: function(self) {
  40.  
  41.         var $keyframeItem = $(self).parents('.keyframe-item');
  42.         var keyframeData = $keyframeItem.data('keyframe');
  43.  
  44.         // delete from list
  45.         $keyframeItem.remove();
  46.  
  47.         // remove from array
  48.         keyframes.items.splice(keyframeData.index, 1);
  49.  
  50.         // Clear last saved GIF url
  51.         keyframes.lastSavedGifURL = null;
  52.  
  53.         // Update keyframes item list
  54.         keyframes.ui.updateItems();
  55.  
  56.         // Update keyframes count
  57.         keyframes.ui.updateCount();
  58.     },
  59.  
  60.     play: function() {
  61.  
  62.         if(keyframes.beforePlayImage !== null) {
  63.             return;
  64.         }
  65.  
  66.         $previewHabboImage = $("#preview-habbo-image");
  67.  
  68.         // Save the current preview URL so we can replace it once gif is stopped
  69.         keyframes.beforePlayImage = $previewHabboImage.attr('src');
  70.  
  71.         keyframes.getURL(function(url) {
  72.             $previewHabboImage.attr('src', url);
  73.         });
  74.     },
  75.  
  76.     stop: function() {
  77.  
  78.         if(keyframes.beforePlayImage == null) {
  79.             return;
  80.         }
  81.  
  82.         $previewHabboImage = $("#preview-habbo-image");
  83.  
  84.         $previewHabboImage.attr('src', keyframes.beforePlayImage);
  85.  
  86.         keyframes.beforePlayImage = null;
  87.     },
  88.  
  89.     saveGIF: function() {
  90.  
  91.     },
  92.  
  93.     // Get URL and print in console
  94.     consoleURL: function() {
  95.  
  96.         keyframes.getURL(function(url) {
  97.  
  98.             console.log(url);
  99.         });
  100.     },
  101.  
  102.     // get GIF url
  103.     getURL: function(callback) {
  104.  
  105.         if(keyframes.lastSavedGifURL == null) {
  106.             keyframes.generate.createURL(callback);
  107.         }
  108.         else {
  109.             callback(keyframes.lastSavedGifURL);
  110.         }
  111.     },
  112.  
  113.     // Generate GIF methods
  114.     generate: {
  115.  
  116.         // Generate the GIF URL
  117.         createURL: function(callback) {
  118.  
  119.             // Show loading
  120.             keyframes.loading.show();
  121.  
  122.             // Get gif.js instance
  123.             keyframes.gifjs = getGifInstance();
  124.  
  125.             // Download all images and save to item
  126.             keyframes.generate.downloadImages(function() {
  127.  
  128.                 // Preload all the images
  129.                 keyframes.generate.preloadImages(function() {
  130.  
  131.                     // Add image frames
  132.                     keyframes.generate.addFrames();
  133.  
  134.                     // Render finished
  135.                     keyframes.gifjs.on('finished', function(blob) {
  136.  
  137.                         // After render, upload blob to server and return url
  138.                         keyframes.generate.uploadGIF(blob, function(response) {
  139.  
  140.                             // Hide loading
  141.                             keyframes.loading.hide();
  142.  
  143.                             // Callback
  144.                             callback(response.url);
  145.                         });
  146.                     });
  147.  
  148.                     // Begin render
  149.                     keyframes.gifjs.render();
  150.                 });
  151.             });
  152.         },
  153.  
  154.         // Download all images
  155.         // Images are stored as url_downloaded
  156.         downloadImages: function(callback) {
  157.  
  158.             var ajaxPromises = [];
  159.             var downloadedCount = 0;
  160.             var downloadedTotal = keyframes.items.length;
  161.  
  162.             for(i in keyframes.items) {
  163.  
  164.                 var item = keyframes.items[i];
  165.  
  166.                 if(typeof item.url_downloaded == 'undefined') {
  167.                     var request = downloadKeyframeURL(item, function (urlDownloaded, item) {
  168.  
  169.  
  170.  
  171.                         // Set downloaded url
  172.                         keyframes.items[item.index].url_downloaded = urlDownloaded;
  173.                         console.log('keyframes: downloaded new url [' + item.index + ']', urlDownloaded);
  174.  
  175.                         // Set percentage
  176.                         downloadedCount++;
  177.                         var percent = downloadedCount * 100 / downloadedTotal;
  178.                         keyframes.loading.setProgress(percent);
  179.                     });
  180.  
  181.  
  182.                     ajaxPromises.push(request);
  183.                 }
  184.             }
  185.  
  186.             $.when.apply(null, ajaxPromises).done(function() {
  187.                 callback();
  188.             });
  189.  
  190.         },
  191.  
  192.         // Preload all downloaded images
  193.         preloadImages: function(callback) {
  194.  
  195.             var imagesTotal = keyframes.items.length;
  196.             var imagesLoaded = 0;
  197.             var imageLoadedIncrementer = function() {
  198.  
  199.                 imagesLoaded++;
  200.                 console.log('keyframes: images loaded ', imagesLoaded, 'out of', imagesTotal);
  201.  
  202.                 if(imagesLoaded == imagesTotal) {
  203.                     callback();
  204.                     return;
  205.                 }
  206.             };
  207.  
  208.             for(i in keyframes.items) {
  209.  
  210.                 var item = keyframes.items[i];
  211.                 keyframes.items[i].img = new Image();
  212.                 keyframes.items[i].img.src = item.url_downloaded;
  213.                 keyframes.items[i].img.addEventListener('load', imageLoadedIncrementer, false);
  214.             }
  215.         },
  216.  
  217.         // Add frames to gifjs instance
  218.         addFrames: function() {
  219.             for(i in keyframes.items) {
  220.                 var canvas = createCanvasOfImage(keyframes.items[i].img);
  221.                 keyframes.gifjs.addFrame(canvas.getContext('2d'), {delay:200, copy: true});
  222.             }
  223.         },
  224.  
  225.         // Upload gif (blob) to server and return url through callback
  226.         uploadGIF: function(blob, callback) {
  227.             var formData = new FormData();
  228.             formData.append('_token', CSRF_TOKEN);
  229.             formData.append('saveBlob', 1);
  230.             formData.append('image', blob);
  231.  
  232.             $.ajax({
  233.                 url: BASE_URL + '/habbocreator',
  234.                 type: 'post',
  235.                 data: formData,
  236.                 dataType: 'json',
  237.                 processData: false,
  238.                 contentType: false
  239.             }).always(function(response) {
  240.                 callback(response);
  241.             });
  242.         },
  243.     },
  244.  
  245.     loading: {
  246.  
  247.         show: function() {
  248.  
  249.             $("#loading-gif").fadeIn();
  250.             $("#loading-gif").find('.progress-bar').width('0%');
  251.         },
  252.  
  253.         hide: function() {
  254.  
  255.             $("#loading-gif").fadeOut();
  256.         },
  257.  
  258.         setProgress: function(percent) {
  259.  
  260.             $("#loading-gif").find('.progress-bar').animate({width: percent + '%'}, 10);
  261.         }
  262.     },
  263.  
  264.     ui: {
  265.  
  266.         updateCount: function() {
  267.  
  268.             $("#keyframe-count").html('(' + keyframes.items.length + ')');
  269.         },
  270.  
  271.         updateItems: function() {
  272.  
  273.             if(keyframes.items.length == 0) {
  274.                 $("#keyframes-items").html('You have not added any keyframes. Click "Add keyframe".');
  275.                 return;
  276.             }
  277.  
  278.             var template = $("#keyframe-template").html();
  279.             var output = "";
  280.  
  281.             for(i in keyframes.items) {
  282.  
  283.                 var item = keyframes.items[i];
  284.                 item.index = i;
  285.                 item.id = (parseInt(i) + 1);
  286.                 item.keyframe = JSON.stringify(item);
  287.  
  288.                 output += Mustache.render(template, item);
  289.             }
  290.  
  291.             $("#keyframes-items").html(output);
  292.         }
  293.     }
  294. };
  295.  
  296. function getGifInstance()
  297. {
  298.     return new GIF({
  299.         workers: 2,
  300.         workerScript: BASE_URL + '/libs/gifjs/dist/gif.worker.js',
  301.         quality: 10,
  302.         width: 64,
  303.         height: 110,
  304.         transparent: '#000',
  305.     });
  306. }
  307.  
  308. function downloadKeyframeURL(keyframe, callback) {
  309.     return $.ajax({
  310.         url: BASE_URL + '/habbocreator',
  311.         type: 'post',
  312.         data: {
  313.             url: keyframe.url,
  314.             getUrl: 1,
  315.         },
  316.         dataType: 'json'
  317.     }).always(function(response) {
  318.         callback(response.url, keyframe)
  319.     });
  320. }
  321. function createCanvasOfImage(img, callback)
  322. {
  323.     var canvas = document.createElement('canvas');
  324.     var ctx = canvas.getContext('2d');
  325.     canvas.width = img.width;
  326.     canvas.height = img.height;
  327.     ctx.drawImage(img, 0, 0);
  328.     return canvas;
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement