constructor(options){
        $.console.assert( options.viewer, "[Drawer] options.viewer is required" );
        $.console.assert( options.viewport, "[Drawer] options.viewport is required" );
        $.console.assert( options.element, "[Drawer] options.element is required" );

        this._id = this.getType() + $.now();
        this.viewer = options.viewer;
        this.viewport = options.viewport;
        this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;
        this.options = $.extend({}, this.defaultOptions, options.options);

        this.container  = $.getElement( options.element );

        this._renderingTarget = this._createDrawingElement();


        this.canvas.style.width     = "100%";
        this.canvas.style.height    = "100%";
        this.canvas.style.position  = "absolute";
        // set canvas.style.left = 0 so the canvas is positioned properly in ltr and rtl html
        this.canvas.style.left = "0";
        $.setElementOpacity( this.canvas, this.viewer.opacity, true );

        // Allow pointer events to pass through the canvas element so implicit
        //   pointer capture works on touch devices
        $.setElementPointerEventsNone( this.canvas );
        $.setElementTouchActionNone( this.canvas );

        // explicit left-align
        this.container.style.textAlign = "left";
        this.container.appendChild( this.canvas );

        this._checkInterfaceImplementation();
        this.setInternalCacheNeedsRefresh();  // initializes stamp
    }
@class OpenSeadragon.DrawerBase
@classdesc Base class for Drawers that handle rendering of tiles 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 {HTMLElement} options.element - Parent element.
@abstract