import MeshSubset from "../utils/MeshSubset";
import RenderState from "./RenderState";
import Program from "./Program";
import BatchToken from "./BatchToken";
import Mesh from "../display/Mesh";
import DisplayObject from "../display/DisplayObject";
import Rectangle from "openfl/geom/Rectangle";
import Matrix from "openfl/geom/Matrix";
import Context3DRenderMode from "openfl/display3D/Context3DRenderMode";
import Context3D from "openfl/display3D/Context3D";
import Stage3D from "openfl/display/Stage3D";
declare namespace starling.rendering {
	/**
	 *  A class that orchestrates rendering of all Starling display objects.
	 *  *
	 *  *  <p>A Starling instance contains exactly one 'Painter' instance that should be used for all
	 *  *  rendering purposes. Each frame, it is passed to the render methods of all rendered display
	 *  *  objects. To access it outside a render method, call <code>Starling.painter</code>.</p>
	 *  *
	 *  *  <p>The painter is responsible for drawing all display objects to the screen. At its
	 *  *  core, it is a wrapper for many Context3D methods, but that's not all: it also provides
	 *  *  a convenient state mechanism, supports masking and acts as __iddleman between display
	 *  *  objects and renderers.</p>
	 *  *
	 *  *  <strong>The State Stack</strong>
	 *  *
	 *  *  <p>The most important concept of the Painter class is the state stack. A RenderState
	 *  *  stores a combination of settings that are currently used for rendering, e.g. the current
	 *  *  projection- and modelview-matrices and context-related settings. It can be accessed
	 *  *  and manipulated via the <code>state</code> property. Use the methods
	 *  *  <code>pushState</code> and <code>popState</code> to store a specific state and restore
	 *  *  it later. That makes it easy to write rendering code that doesn't have any side effects.</p>
	 *  *
	 *  *  <listing>
	 *  *  painter.pushState(); // save a copy of the current state on the stack
	 *  *  painter.state.renderTarget = renderTexture;
	 *  *  painter.state.transformModelviewMatrix(object.transformationMatrix);
	 *  *  painter.state.alpha = 0.5;
	 *  *  painter.prepareToDraw(); // apply all state settings at the render context
	 *  *  drawSomething(); // insert Stage3D rendering code here
	 *  *  painter.popState(); // restores previous state</listing>
	 *  *
	 *  *  @see RenderState
	 *  
	 */
	export class Painter {
		/**
		 *  Creates a new Painter object. Normally, it's not necessary to create any custom
		 *      *  painters; instead, use the global painter found on the Starling instance. 
		 */
		constructor(stage3D: Stage3D, sharedContext?: boolean);
		/**
		 *  The value with which the stencil buffer will be cleared,
		 *         *  and the default reference value used for stencil tests. 
		 */
		static DEFAULT_STENCIL_VALUE: number;
		/**
		 *  Disposes all mesh batches, programs, and - if it is not being shared -
		 *      *  the render context. 
		 */
		dispose(): void;
		/**
		 *  Requests a context3D object from the stage3D object.
		 *      *  This is called by Starling internally during the initialization process.
		 *      *  You normally don't need to call this method yourself. (For a detailed description
		 *      *  of the parameters, look at the documentation of the method with the same name in the
		 *      *  "RenderUtil" class.)
		 *      *
		 *      *  @see starling.utils.RenderUtil
		 *      
		 */
		requestContext3D(renderMode: Context3DRenderMode, profile: any): void;
		/**
		 *  Sets the viewport dimensions and other attributes of the rendering buffer.
		 *      *  Starling will call this method internally, so most apps won't need to mess with this.
		 *      *
		 *      *  <p>Beware: if <code>shareContext</code> is enabled, the method will only update the
		 *      *  painter's context-related information (like the size of the back buffer), but won't
		 *      *  make any actual changes to the context.</p>
		 *      *
		 *      * @param viewPort                the position and size of the area that should be rendered
		 *      *                                into, in pixels.
		 *      * @param contentScaleFactor      only relevant for Desktop (!) HiDPI screens. If you want
		 *      *                                to support high resolutions, pass the 'contentScaleFactor'
		 *      *                                of the Flash stage; otherwise, '1.0'.
		 *      * @param antiAlias               from 0 (none) to 16 (very high quality).
		 *      * @param enableDepthAndStencil   indicates whether the depth and stencil buffers should
		 *      *                                be enabled. Note that on AIR, you also have to enable
		 *      *                                this setting in the app-xml (application descriptor);
		 *      *                                otherwise, this setting will be silently ignored.
		 *      * @param supportBrowserZoom      if enabled, zooming a website will adapt the size of
		 *      *                                the back buffer.
		 *      
		 */
		configureBackBuffer(viewPort: Rectangle, contentScaleFactor: number, antiAlias: number, enableDepthAndStencil: boolean, supportBrowserZoom?: boolean): void;
		/**
		 *  Registers a program under a certain name.
		 *      *  If the name was already used, the previous program is overwritten. 
		 */
		registerProgram(name: string, program: Program): void;
		/**
		 *  Deletes the program of a certain name. 
		 */
		deleteProgram(name: string): void;
		/**
		 *  Returns the program registered under a certain name, or null if no program with
		 *      *  this name has been registered. 
		 */
		getProgram(name: string): Program;
		/**
		 *  Indicates if a program is registered under a certain name. 
		 */
		hasProgram(name: string): boolean;
		/**
		 *  Pushes the current render state to a stack from which it can be restored later.
		 *      *
		 *      *  <p>If you pass a BatchToken, it will be updated to point to the current location within
		 *      *  the render cache. That way, you can later reference this location to render a subset of
		 *      *  the cache.</p>
		 *      
		 */
		pushState(token?: BatchToken): void;
		/**
		 *  Modifies the current state with a transformation matrix, alpha factor, and blend mode.
		 *      *
		 *      *  @param transformationMatrix Used to transform the current <code>modelviewMatrix</code>.
		 *      *  @param alphaFactor          Multiplied with the current alpha value.
		 *      *  @param blendMode            Replaces the current blend mode; except for "auto", which
		 *      *                              means the current value remains unchanged.
		 *      
		 */
		setStateTo(transformationMatrix: Matrix, alphaFactor?: number, blendMode?: string): void;
		/**
		 *  Restores the render state that was last pushed to the stack. If this changes
		 *      *  blend mode, clipping rectangle, render target or culling, the current batch
		 *      *  will be drawn right away.
		 *      *
		 *      *  <p>If you pass a BatchToken, it will be updated to point to the current location within
		 *      *  the render cache. That way, you can later reference this location to render a subset of
		 *      *  the cache.</p>
		 *      
		 */
		popState(token?: BatchToken): void;
		/**
		 *  Restores the render state that was last pushed to the stack, but does NOT remove
		 *      *  it from the stack. 
		 */
		restoreState(): void;
		/**
		 *  Updates all properties of the given token so that it describes the current position
		 *      *  within the render cache. 
		 */
		fillToken(token: BatchToken): void;
		/**
		 *  Draws a display object into the stencil buffer, incrementing the buffer on each
		 *      *  used pixel. The stencil reference value is incremented as well; thus, any subsequent
		 *      *  stencil tests outside of this area will fail.
		 *      *
		 *      *  <p>If 'mask' is part of the display list, it will be drawn at its conventional stage
		 *      *  coordinates. Otherwise, it will be drawn with the current modelview matrix.</p>
		 *      *
		 *      *  <p>As an optimization, this method might update the clipping rectangle of the render
		 *      *  state instead of utilizing the stencil buffer. This is possible when the mask object
		 *      *  is of type <code>starling.display.Quad</code> and is aligned parallel to the stage
		 *      *  axes.</p>
		 *      *
		 *      *  <p>Note that masking breaks the render cache; the masked object must be redrawn anew
		 *      *  in the next frame. If you pass <code>maskee</code>, the method will automatically
		 *      *  call <code>excludeFromCache(maskee)</code> for you.</p>
		 *      
		 */
		drawMask(mask: DisplayObject, maskee?: DisplayObject): void;
		/**
		 *  Draws a display object into the stencil buffer, decrementing the
		 *      *  buffer on each used pixel. This effectively erases the object from the stencil buffer,
		 *      *  restoring the previous state. The stencil reference value will be decremented.
		 *      *
		 *      *  <p>Note: if the mask object meets the requirements of using the clipping rectangle,
		 *      *  it will be assumed that this erase operation undoes the clipping rectangle change
		 *      *  caused by the corresponding <code>drawMask()</code> call.</p>
		 *      
		 */
		eraseMask(mask: DisplayObject, maskee?: DisplayObject): void;
		/**
		 *  Adds a mesh to the current batch of unrendered meshes. If the current batch is not
		 *      *  compatible with the mesh, all previous meshes are rendered at once and the batch
		 *      *  is cleared.
		 *      *
		 *      *  @param mesh    The mesh to batch.
		 *      *  @param subset  The range of vertices to be batched. If <code>null</code>, the complete
		 *      *                 mesh will be used.
		 *      
		 */
		batchMesh(mesh: Mesh, subset?: MeshSubset): void;
		/**
		 *  Finishes the current mesh batch and prepares the next one. 
		 */
		finishMeshBatch(): void;
		/**
		 *  Indicate how often the internally used batches are being trimmed to save memory.
		 *      *
		 *      *  <p>While rendering, the internally used MeshBatches are used in a different way in each
		 *      *  frame. To save memory, they should be trimmed every once in a while. This method defines
		 *      *  how often that happens, if at all. (Default: enabled = true, interval = 250)</p>
		 *      *
		 *      *  @param enabled   If trimming happens at all. Only disable temporarily!
		 *      *  @param interval  The number of frames between each trim operation.
		 *      
		 */
		enableBatchTrimming(enabled?: boolean, interval?: number): void;
		/**
		 *  Completes all unfinished batches, cleanup procedures. 
		 */
		finishFrame(): void;
		/**
		 *  Makes sure that the default context settings Starling relies on will be refreshed
		 *         *  before the next 'draw' operation. This includes blend mode, culling, and depth test. 
		 */
		setupContextDefaults(): void;
		/**
		 *  Resets the current state, state stack, batch processor, stencil reference value,
		 *      *  clipping rectangle, and draw count. Furthermore, depth testing is disabled. 
		 */
		nextFrame(): void;
		/**
		 *  Draws all meshes from the render cache between <code>startToken</code> and
		 *      *  (but not including) <code>endToken</code>. The render cache contains all meshes
		 *      *  rendered in the previous frame. 
		 */
		drawFromCache(startToken: BatchToken, endToken: BatchToken): void;
		/**
		 *  Prevents the object from being drawn from the render cache in the next frame.
		 *      *  Different to <code>setRequiresRedraw()</code>, this does not indicate that the object
		 *      *  has changed in any way, but just that it doesn't support being drawn from cache.
		 *      *
		 *      *  <p>Note that when a container is excluded from the render cache, its children will
		 *      *  still be cached! This just means that batching is interrupted at this object when
		 *      *  the display tree is traversed.</p>
		 *      
		 */
		excludeFromCache(object: DisplayObject): void;
		/**
		 *  Applies all relevant state settings to at the render context. This includes
		 *      *  blend mode, render target and clipping rectangle. Always call this method before
		 *      *  <code>context.drawTriangles()</code>.
		 *      
		 */
		prepareToDraw(): void;
		/**
		 *  Clears the render context with a certain color and alpha value. Since this also
		 *      *  clears the stencil buffer, the stencil reference value is also reset to '0'. 
		 */
		clear(rgb?: number, alpha?: number): void;
		/**
		 *  Resets the render target to the back buffer and displays its contents. 
		 */
		present(): void;
		/**
		 *  Refreshes the values of "backBufferWidth" and "backBufferHeight" from the current
		 *      *  context dimensions and stores the given "backBufferScaleFactor". This method is
		 *      *  called by Starling when the browser zoom factor changes (in case "supportBrowserZoom"
		 *      *  is enabled).
		 *      
		 */
		refreshBackBufferSize(scaleFactor: number): void;
		/**
		 *  Indicates the number of stage3D draw calls. 
		 */
		get drawCount(): number;
		set drawCount(value: number)
		/**
		 *  The current stencil reference value of the active render target. This value
		 *      *  is typically incremented when drawing a mask and decrementing when erasing it.
		 *      *  The painter keeps track of one stencil reference value per render target.
		 *      *  Only change this value if you know what you're doing!
		 *      
		 */
		get stencilReferenceValue(): number;
		set stencilReferenceValue(value: number)
		/**
		 *  Indicates if the render cache is enabled. Normally, this should be left at the default;
		 *      *  however, some custom rendering logic might require to change this property temporarily.
		 *      *  Also note that the cache is automatically reactivated each frame, right before the
		 *      *  render process.
		 *      *
		 *      *  @default true
		 *      
		 */
		get cacheEnabled(): boolean;
		set cacheEnabled(value: boolean)
		/**
		 *  The current render state, containing some of the context settings, projection- and
		 *      *  modelview-matrix, etc. Always returns the same instance, even after calls to "pushState"
		 *      *  and "popState".
		 *      *
		 *      *  <p>When you change the current RenderState, and this change is not compatible with
		 *      *  the current render batch, the batch will be concluded right away. Thus, watch out
		 *      *  for changes of blend mode, clipping rectangle, render target or culling.</p>
		 *      
		 */
		get state(): RenderState;
		/**
		 *  The Stage3D instance this painter renders into. 
		 */
		get stage3D(): Stage3D;
		/**
		 *  The Context3D instance this painter renders into. 
		 */
		get context(): Context3D;
		/**
		 *  Returns the index of the current frame <strong>if</strong> the render cache is enabled;
		 *      *  otherwise, returns zero. To get the frameID regardless of the render cache, call
		 *      *  <code>Starling.frameID</code> instead. 
		 */
		get frameID(): number;
		set frameID(value: number)
		/**
		 *  The size (in points) that represents one pixel in the back buffer. 
		 */
		get pixelSize(): number;
		set pixelSize(value: number)
		/**
		 *  Indicates if another Starling instance (or another Stage3D framework altogether)
		 *      *  uses the same render context. @default false 
		 */
		get shareContext(): boolean;
		set shareContext(value: boolean)
		/**
		 *  Indicates if Stage3D render methods will report errors. Activate only when needed,
		 *      *  as this has a negative impact on performance. @default false 
		 */
		get enableErrorChecking(): boolean;
		set enableErrorChecking(value: boolean)
		/**
		 *  Returns the current width of the back buffer. In most cases, this value is in pixels;
		 *      *  however, if the app is running on an HiDPI display with an activated
		 *      *  'supportHighResolutions' setting, you have to multiply with 'backBufferScaleFactor'
		 *      *  for the actual pixel count. Alternatively, use the Context3D-property with the
		 *      *  same name: it will return the exact pixel values. 
		 */
		get backBufferWidth(): number;
		/**
		 *  Returns the current height of the back buffer. In most cases, this value is in pixels;
		 *      *  however, if the app is running on an HiDPI display with an activated
		 *      *  'supportHighResolutions' setting, you have to multiply with 'backBufferScaleFactor'
		 *      *  for the actual pixel count. Alternatively, use the Context3D-property with the
		 *      *  same name: it will return the exact pixel values. 
		 */
		get backBufferHeight(): number;
		/**
		 *  The number of pixels per point returned by the 'backBufferWidth/Height' properties.
		 *      *  Except for desktop HiDPI displays with an activated 'supportHighResolutions' setting,
		 *      *  this will always return '1'. 
		 */
		get backBufferScaleFactor(): number;
		/**
		 *  Indicates if the Context3D object is currently valid (i.e. it hasn't been lost or
		 *      *  disposed). 
		 */
		get contextValid(): boolean;
		/**
		 *  The Context3D profile of the current render context, or <code>null</code>
		 *      *  if the context has not been created yet. 
		 */
		get profile(): string;
		/**
		 *  A dictionary that can be used to save custom data related to the render context.
		 *      *  If you need to share data that is bound to the render context (e.g. textures), use
		 *      *  this dictionary instead of creating a static class variable. That way, the data will
		 *      *  be available for all Starling instances that use this stage3D / context. 
		 */
		get sharedData(): any;
	}
}
export default starling.rendering.Painter;