progressiveemojipaletterenderer.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2008 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /**
  15. * @fileoverview Progressive Emoji Palette renderer implementation.
  16. *
  17. */
  18. goog.provide('goog.ui.emoji.ProgressiveEmojiPaletteRenderer');
  19. goog.require('goog.dom.TagName');
  20. goog.require('goog.style');
  21. goog.require('goog.ui.emoji.EmojiPaletteRenderer');
  22. /**
  23. * Progressively renders an emoji palette. The progressive renderer tries to
  24. * use img tags instead of background-image for sprited emoji, since most
  25. * browsers render img tags progressively (i.e., as the data comes in), while
  26. * only very new browsers render background-image progressively.
  27. *
  28. * @param {string} defaultImgUrl Url of the img that should be used to fill up
  29. * the cells in the emoji table, to prevent jittering. Will be stretched
  30. * to the emoji cell size. A good image is a transparent dot.
  31. * @constructor
  32. * @extends {goog.ui.emoji.EmojiPaletteRenderer}
  33. * @final
  34. */
  35. goog.ui.emoji.ProgressiveEmojiPaletteRenderer = function(defaultImgUrl) {
  36. goog.ui.emoji.EmojiPaletteRenderer.call(this, defaultImgUrl);
  37. };
  38. goog.inherits(
  39. goog.ui.emoji.ProgressiveEmojiPaletteRenderer,
  40. goog.ui.emoji.EmojiPaletteRenderer);
  41. /** @override */
  42. goog.ui.emoji.ProgressiveEmojiPaletteRenderer.prototype
  43. .buildElementFromSpriteMetadata = function(dom, spriteInfo, displayUrl) {
  44. var width = spriteInfo.getWidthCssValue();
  45. var height = spriteInfo.getHeightCssValue();
  46. var x = spriteInfo.getXOffsetCssValue();
  47. var y = spriteInfo.getYOffsetCssValue();
  48. // Need this extra div for proper vertical centering.
  49. var inner = dom.createDom(goog.dom.TagName.IMG, {'src': displayUrl});
  50. var el = dom.createDom(
  51. goog.dom.TagName.DIV, goog.getCssName('goog-palette-cell-extra'), inner);
  52. goog.style.setStyle(el, {
  53. 'width': width,
  54. 'height': height,
  55. 'overflow': 'hidden',
  56. 'position': 'relative'
  57. });
  58. goog.style.setStyle(inner, {'left': x, 'top': y, 'position': 'absolute'});
  59. return el;
  60. };
  61. /** @override */
  62. goog.ui.emoji.ProgressiveEmojiPaletteRenderer.prototype
  63. .updateAnimatedPaletteItem = function(item, animatedImg) {
  64. // Just to be safe, we check for the existence of the img element within this
  65. // palette item before attempting to modify it.
  66. /** @type {!HTMLImageElement|undefined} */
  67. var img;
  68. var el = item.firstChild;
  69. while (el) {
  70. if ('IMG' == /** @type {!Element} */ (el).tagName) {
  71. img = /** @type {!HTMLImageElement} */ (el);
  72. break;
  73. }
  74. el = el.firstChild;
  75. }
  76. if (!img) {
  77. return;
  78. }
  79. img.width = animatedImg.width;
  80. img.height = animatedImg.height;
  81. goog.style.setStyle(img, {'left': 0, 'top': 0});
  82. img.src = animatedImg.src;
  83. };