constructor(options){
        super(options);

        /**
         * The HTML element (div) that this drawer uses for drawing
         * @member {Element} canvas
         * @memberof OpenSeadragon.HTMLDrawer#
         */

        /**
         * The parent element of this Drawer instance, passed in when the Drawer was created.
         * The parent of {@link OpenSeadragon.WebGLDrawer#canvas}.
         * @member {Element} container
         * @memberof OpenSeadragon.HTMLDrawer#
         */

        // Reject listening for the tile-drawing event, which this drawer does not fire
        this.viewer.rejectEventHandler("tile-drawing", "The HTMLDrawer does not raise the tile-drawing event");
        // Since the tile-drawn event is fired by this drawer, make sure handlers can be added for it
        this.viewer.allowEventHandler("tile-drawn");

        // works with canvas & image objects
        function _prepareTile(tile, data) {
            const element = $.makeNeutralElement( "div" );
            const imgElement = data.cloneNode();
            imgElement.style.msInterpolationMode = "nearest-neighbor";
            imgElement.style.width = "100%";
            imgElement.style.height = "100%";

            const style = element.style;
            style.position = "absolute";

            return {
                element, imgElement, style, data
            };
        }

        // The actual placing logics will not happen at draw event, but when the cache is created:
        $.converter.learn("context2d", HTMLDrawer.canvasCacheType, (t, d) => _prepareTile(t, d.canvas), 1, 1);
        $.converter.learn("image", HTMLDrawer.imageCacheType, _prepareTile, 1, 1);
        // Also learn how to move back, since these elements can be just used as-is
        $.converter.learn(HTMLDrawer.canvasCacheType, "context2d", (t, d) => d.data.getContext('2d'), 1, 3);
        $.converter.learn(HTMLDrawer.imageCacheType, "image", (t, d) => d.data, 1, 3);

        function _freeTile(data) {
            if ( data.imgElement && data.imgElement.parentNode ) {
                data.imgElement.parentNode.removeChild( data.imgElement );
            }
            if ( data.element && data.element.parentNode ) {
                data.element.parentNode.removeChild( data.element );
            }
        }

        $.converter.learnDestroy(HTMLDrawer.canvasCacheType, _freeTile);
        $.converter.learnDestroy(HTMLDrawer.imageCacheType, _freeTile);
    }
@class OpenSeadragon.HTMLDrawer
@extends OpenSeadragon.DrawerBase
@classdesc HTML-based implementation of DrawerBase for an {@link OpenSeadragon.Viewer}.
@param {Object} options - Options for this Drawer.
@param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.
@param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.
@param {Element} options.element - Parent element.
@param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.