[Exposed=(Window,Worker), Serializable, Transferable]
interface ImageBitmap {
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;
  void close();
};
typedef (CanvasImageSource or
         Blob or
         ImageData) ImageBitmapSource;
enum ImageOrientation { "none", "flipY" };
enum PremultiplyAlpha { "none", "premultiply", "default" };
enum ColorSpaceConversion { "none", "default" };
enum ResizeQuality { "pixelated", "low", "medium", "high" };
dictionary ImageBitmapOptions {
  ImageOrientation imageOrientation = "none";
  PremultiplyAlpha premultiplyAlpha = "default";
  ColorSpaceConversion colorSpaceConversion = "default";
  [EnforceRange] unsigned long resizeWidth;
  [EnforceRange] unsigned long resizeHeight;
  ResizeQuality resizeQuality = "low";
};
  An ImageBitmap object represents a bitmap image that can be painted to a canvas
  without undue latency.
The exact judgement of what is undue latency of this is left up to the implementer, but in general if making use of the bitmap requires network I/O, or even local disk I/O, then the latency is probably undue; whereas if it only requires a blocking read from a GPU or system RAM, the latency is probably acceptable.
createImageBitmap(image [, options ])createImageBitmap(image, sx, sy, sw, sh [, options ])Takes image, which can be an img element, an SVG
    image element, a video element, a canvas
    element, a Blob object, an ImageData object, or another
    ImageBitmap object, and returns a promise that is resolved when a new
    ImageBitmap is created.
If no ImageBitmap object can be constructed, for example because the provided
    image data is not actually an image, then the promise is rejected instead.
If sx, sy, sw, and sh arguments are provided, the source image is cropped to the given pixels, with any pixels missing in the original replaced by transparent black. These coordinates are in the source image's pixel coordinate space, not in CSS pixels.
If options is provided, the ImageBitmap object's bitmap
    data is modified according to options. For example,
    if the premultiplyAlpha
    option is set to "premultiply",
    the bitmap data's color channels are
    premultiplied by its alpha channel.
    
Rejects the promise with an "InvalidStateError"
    DOMException if the source image is not in a valid state (e.g. an img
    element that hasn't loaded successfully, an ImageBitmap object whose
    [[Detached]] internal slot value is true, an ImageData object whose
    data attribute value's [[Detached]]
    internal slot value is true, or a Blob whose data cannot be interpreted as a bitmap
    image).
Rejects the promise with a "SecurityError"
    DOMException if the script is not allowed to access the image data of the source
    image (e.g. a video that is CORS-cross-origin, or a
    canvas being drawn on by a script in a worker from another
    origin).
close()Releases imageBitmap's underlying bitmap data.
widthReturns the intrinsic width of the image, in CSS pixels.
heightReturns the intrinsic height of the image, in CSS pixels.
An ImageBitmap object whose [[Detached]] internal slot value
  is false always has associated bitmap data,
  with a width and a height. However, it is possible for this data to be corrupted. If an
  ImageBitmap object's media data can be decoded without errors, it is said to be fully decodable.
An ImageBitmap object's bitmap has an origin-clean flag, which indicates whether the
  bitmap is tainted by content from a different origin. The flag is initially set to
  true and may be changed to false by the steps of createImageBitmap().
ImageBitmap objects are serializable objects and transferable
  objects.
Their serialization steps, given value and serialized, are:
Set serialized.[[BitmapData]] to a copy of value's bitmap data.
Set serialized.[[OriginClean]] to true if value's origin-clean flag is set, and false otherwise.
Their deserialization steps, given serialized and value, are:
Set value's bitmap data to serialized.[[BitmapData]].
If serialized.[[OriginClean]] is true, set value's origin-clean flag.
Their transfer steps, given value and dataHolder, are:
Set dataHolder.[[BitmapData]] to value's bitmap data.
Set dataHolder.[[OriginClean]] to true if value's origin-clean flag is set, and false otherwise.
Unset value's bitmap data.
Their transfer-receiving steps, given dataHolder and value, are:
Set value's bitmap data to dataHolder.[[BitmapData]].
If dataHolder.[[OriginClean]] is true, set value's origin-clean flag.
An ImageBitmap object can be obtained from a variety of different objects, using
  the createImageBitmap() method. When
  invoked, the method must act as follows:
img element
   image element
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
If image is not completely available, then
     return a promise rejected with an "InvalidStateError"
     DOMException and abort these steps.
If image's media data has no intrinsic dimensions (e.g. it's a
     vector graphic with no specified content size), and both or either of the resizeWidth and resizeHeight options are not specified,
     then return a promise rejected with an "InvalidStateError"
     DOMException and abort these steps.
If image's media data has no intrinsic dimensions (e.g. it's a vector
     graphics with no specified content size), it should be rendered to a bitmap of the size
     specified by the resizeWidth and the
     resizeHeight options.
If the sw and sh arguments are not specified and
     image's media data has both or either of its intrinsic width and
     intrinsic height values equal to 0, then return a promise rejected with an
     "InvalidStateError" DOMException and abort these
     steps.
If the sh argument is not specified and image's media data has
     an intrinsic height of 0, then return a promise rejected with an
     "InvalidStateError" DOMException and abort these
     steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be a copy of image's
     media data, cropped to the source rectangle with formatting. If this is an
     animated image, the ImageBitmap object's bitmap data must only be taken from the
     default image of the animation (the one that the format defines is to be used when animation
     is not supported or is disabled), or, if there is no such image, the first frame of the
     animation.
If the origin of image's image is not the same
     origin as the origin specified by
     the entry settings object, then set the origin-clean flag of the ImageBitmap
     object's bitmap to false.
Return a new promise, but continue running these steps in parallel.
Resolve the promise with the new ImageBitmap object as the value.
video element
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
If the video element's networkState attribute is NETWORK_EMPTY, then return a promise rejected with an
     "InvalidStateError" DOMException and abort these
     steps.
If the video element's readyState attribute is either HAVE_NOTHING or HAVE_METADATA, then return a promise rejected with an
     "InvalidStateError" DOMException and abort these
     steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be a copy of the frame at the
     current playback position, at the media resource's intrinsic width and intrinsic height (i.e. after any aspect-ratio
     correction has been applied), cropped to the source rectangle with formatting.
If the origin of the video element is not the same
     origin as the origin specified by
     the entry settings object, then set the origin-clean flag of the ImageBitmap
     object's bitmap to false.
Return a new promise, but continue running these steps in parallel.
Resolve the promise with the new ImageBitmap object as the value.
canvas element
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
If the canvas element's bitmap has either a horizontal dimension or a
     vertical dimension equal to zero, then return a promise rejected with an
     "InvalidStateError" DOMException and abort these
     steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be a copy of the
     canvas element's bitmap data, cropped to the source
     rectangle with formatting.
Set the origin-clean flag of the
     ImageBitmap object's bitmap to the same value as the origin-clean flag of the canvas
     element's bitmap.
Return a new promise, but continue running these steps in parallel.
Resolve the promise with the new ImageBitmap object as the value.
Blob object
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
Return a new promise, but continue running these steps in parallel.
Read the Blob object's data. If an error
     occurs during reading of the object, then reject the promise with an
     "InvalidStateError" DOMException, and abort these
     steps.
Apply the image sniffing rules to
     determine the file format of the image data, with MIME type of the Blob (as given
     by the Blob object's type attribute) giving
     the official type.
If the image data is not in a supported image file format (e.g. it's not an image at
     all), or if the image data is corrupted in some fatal way such that the image dimensions
     cannot be obtained (e.g. a vector graphic with no intrinsic size), then reject the promise
     with an "InvalidStateError" DOMException, and abort
     these steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be the image data read from the
     Blob object, cropped to the source rectangle with formatting.
     If this is an animated image, the ImageBitmap object's bitmap data must only be taken from the
     default image of the animation (the one that the format defines is to be used when animation
     is not supported or is disabled), or, if there is no such image, the first frame of the
     animation.
Resolve the promise with the new ImageBitmap object as the value.
ImageData object
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
If the image object's data attribute
     value's [[Detached]] internal slot value is true, return a promise rejected with
     an "InvalidStateError" DOMException and abort these
     steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be the image data given by the
     ImageData object, cropped to the source rectangle with formatting.
Return a new promise, but continue running these steps in parallel.
Resolve the promise with the new ImageBitmap object as the value.
ImageBitmap object
   If either the sw or sh arguments are specified
     but zero, return a promise rejected with an "IndexSizeError"
     DOMException and abort these steps.
If image's [[Detached]] internal slot value is true, return a
     promise rejected with an "InvalidStateError"
     DOMException and abort these steps.
Create a new ImageBitmap object.
Let the ImageBitmap object's bitmap data be a copy of the image
     argument's bitmap data, cropped
     to the source rectangle with formatting.
Set the origin-clean flag of the
     ImageBitmap object's bitmap to the same value as the origin-clean flag of the bitmap of the
     image argument.
Return a new promise, but continue running these steps in parallel.
Resolve the promise with the new ImageBitmap object as the value.
When the steps above require that the user agent crop bitmap data to the source rectangle with formatting, the user agent must run the following steps:
Let input be the bitmap data being transformed.
If either or both of resizeWidth
   and resizeHeight members of
   options are less than or equal to 0, then return a promise rejected with
   "InvalidStateError" DOMException and abort these steps.
If sx, sy, sw and sh are specified, let sourceRectangle be a rectangle whose corners are the four points (sx, sy), (sx+sw, sy),(sx+sw, sy+sh), (sx,sy+sh). Otherwise let sourceRectangle be a rectangle whose corners are the four points (0,0), (width of input, 0), (width of input, height of input), (0, height of input).
If either sw or sh are negative, then the top-left corner of this rectangle will be to the left or above the (sx, sy) point.
Clip sourceRectangle to the dimensions of input.
Let outputWidth be determined as follows:
resizeWidth member of
     options is specifiedresizeWidth
     member of optionsresizeWidth member of
     options is not specified, but the resizeHeight member is specifiedresizeHeight member of options,
     divided by the height of sourceRectangle, rounded up to the nearest integerresizeWidth nor resizeHeight are specifiedLet outputHeight be determined as follows:
resizeHeight member of
     options is specifiedresizeHeight
     member of optionsresizeHeight member of
     options is not specified, but the resizeWidth member is specifiedresizeWidth member of options,
     divided by the width of sourceRectangle, rounded up to the nearest integerresizeWidth nor resizeHeight are specifiedPlace input on an infinite transparent black grid plane, positioned so that its top left corner is at the origin of the plane, with the x-coordinate increasing to the right, and the y-coordinate increasing down, and with each pixel in the input image data occupying a cell on the plane's grid.
Let output be the rectangle on the plane denoted by sourceRectangle.
Scale output to the size specified by outputWidth and
   outputHeight. The user agent should use the value of the resizeQuality option to guide the
   choice of scaling algorithm.
If the value of the imageOrientation member of
    options is "flipY",
    output must be flipped vertically, disregarding any image orientation metadata of
    the source (such as EXIF metadata), if any. [EXIF]
If the value is "none", no extra step is required.
If image is an img element or a Blob object, let
    val be the value of the colorSpaceConversion member
    of options, and then run these substeps:
If val is "default",
     the color space conversion behavior is implementation-specific, and should be chosen according
     to the color space that the implementation uses for drawing images onto the canvas.
If val is "none", output must be decoded
     without performing any color space conversions. This means that the image decoding algorithm
     must ignore color profile metadata embedded in the source data as well as the display device
     color profile.
The native color space of canvas is currently unspecified, but this is expected to change in the future.
Let val be the value of premultiplyAlpha member of
    options, and then run these substeps:
If val is "default", the alpha premultiplication
     behavior is implementation-specific, and should be chosen according to implementation deems
     optimal for drawing images onto the canvas.
If val is "premultiply", the output
     that is not premultiplied by alpha must have its color components multiplied by alpha and
     that is premultiplied by alpha must be left untouched.
If val is "none", the output that is not
     premultiplied by alpha must be left untouched and that is premultiplied by alpha must have
     its color components divided by alpha.
Return output.
When the close() method is called, the
  user agent must run these steps:
Set this ImageBitmap object's [[Detached]] internal slot value
   to true.
Unset this ImageBitmap object's bitmap data.
The width attribute's getter must run
  these steps:
If this ImageBitmap object's [[Detached]] internal slot's
   value is true, then return 0.
Return this ImageBitmap object's width, in CSS
   pixels.
The height attribute's getter must run
  these steps:
If this ImageBitmap object's [[Detached]] internal slot's
   value is true, then return 0.
Return this ImageBitmap object's height, in CSS
   pixels.
The ResizeQuality enumeration is used to express a preference for the interpolation quality to use when scaling images.
The "pixelated" value indicates
  a preference to scale the image that maximizes the appearance. Scaling algorithms that "smooth"
  colors are acceptable, such as bilinear interpolation.
The "low" value
  indicates a preference for a low level of image interpolation quality. Low-quality image
  interpolation may be more computationally efficient than higher settings.
The "medium" value indicates
  a preference for a medium level of image interpolation quality.
The "high" value indicates a
  preference for a high level of image interpolation quality. High-quality image
  interpolation may be more computationally expensive than lower settings.
Bilinear scaling is an example of a relatively fast, lower-quality image-smoothing algorithm. Bicubic or Lanczos scaling are examples of image-scaling algorithms that produce higher-quality output. This specification does not mandate that specific interpolation algorithms be used unless the value is "pixelated".
Using this API, a sprite sheet can be precut and prepared:
var sprites = {};
function loadMySprites() {
  var image = new Image();
  image.src = 'mysprites.png';
  var resolver;
  var promise = new Promise(function (arg) { resolver = arg });
  image.onload = function () {
    resolver(Promise.all([
      createImageBitmap(image,  0,  0, 40, 40).then(function (image) { sprites.woman = image }),
      createImageBitmap(image, 40,  0, 40, 40).then(function (image) { sprites.man   = image }),
      createImageBitmap(image, 80,  0, 40, 40).then(function (image) { sprites.tree  = image }),
      createImageBitmap(image,  0, 40, 40, 40).then(function (image) { sprites.hut   = image }),
      createImageBitmap(image, 40, 40, 40, 40).then(function (image) { sprites.apple = image }),
      createImageBitmap(image, 80, 40, 40, 40).then(function (image) { sprites.snake = image })
    ]));
  };
  return promise;
}
function runDemo() {
  var canvas = document.querySelector('canvas#demo');
  var context = canvas.getContext('2d');
  context.drawImage(sprites.tree, 30, 10);
  context.drawImage(sprites.snake, 70, 10);
}
loadMySprites().then(runDemo);
  Support: requestanimationframeChrome for Android 59+Chrome 24+iOS Safari 7.0+UC Browser for Android 11.4+Firefox 23+IE 10+Samsung Internet 4+Opera Mini NoneSafari 6.1+Android Browser 4.4+Opera 15+Edge 12+
Source: caniuse.com
Each Document has a list of animation frame callbacks, which must be
  initially empty, and an animation frame callback identifier, which is a number which
  must initially be zero.
When the requestAnimationFrame() method is called,
  the user agent must run the following steps:
Let document be this Window object's associated Document.
Increment document's animation frame callback identifier by one.
Append the method's argument to document's list of animation frame callbacks, associated with document's animation frame callback identifier's current value.
Return document's animation frame callback identifier's current value.
When the cancelAnimationFrame() method is called,
  the user agent must run the following steps:
Let document be this Window object's associated Document.
Find the entry in document's list of animation frame callbacks that is associated with the value given by the method's argument.
If there is such an entry, remove it from document's list of animation frame callbacks.
When the user agent is to run the animation frame callbacks for a
  Document doc with a timestamp now, it must run the following
  steps:
Let callbacks be a list of the entries in doc's list of animation frame callbacks, in the order in which they were added to the list.
Set doc's list of animation frame callbacks to the empty list.
For each entry in callbacks, in order: invoke the callback, passing now as the only argument, and if an exception is thrown, report the exception. [WEBIDL]