UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

499 lines (461 loc) 26.6 kB
import Point from "openfl/geom/Point"; import MatrixUtil from "./../../starling/utils/MatrixUtil"; import TextureOptions from "./../../starling/textures/TextureOptions"; import Rectangle from "openfl/geom/Rectangle"; import Matrix from "openfl/geom/Matrix"; import Bitmap from "openfl/display/Bitmap"; import BitmapData from "openfl/display/BitmapData"; import ByteArray from "openfl/utils/ByteArray"; import ArgumentError from "openfl/errors/ArgumentError"; import Texture from "openfl/display3D/textures/Texture"; import ConcretePotTexture from "./../../starling/textures/ConcretePotTexture"; import RectangleTexture from "openfl/display3D/textures/RectangleTexture"; import ConcreteRectangleTexture from "./../../starling/textures/ConcreteRectangleTexture"; import VideoTexture from "openfl/display3D/textures/VideoTexture"; import ConcreteVideoTexture from "./../../starling/textures/ConcreteVideoTexture"; import Starling from "./../../starling/core/Starling"; import MissingContextError from "./../../starling/errors/MissingContextError"; import AtfData from "./../../starling/textures/AtfData"; import Reflect from "./../../Reflect"; import SystemUtil from "./../../starling/utils/SystemUtil"; import NotSupportedError from "./../../starling/errors/NotSupportedError"; import MathUtil from "./../../starling/utils/MathUtil"; import SubTexture from "./../../starling/textures/SubTexture"; import TextureBase from "openfl/display3D/textures/TextureBase"; import ConcreteTexture from "./ConcreteTexture"; import Context3DTextureFormat from "openfl/display3D/Context3DTextureFormat"; import NetStream from "openfl/net/NetStream"; import VertexData from "./../rendering/VertexData"; declare namespace starling.textures { /** <p>A texture stores the information that represents an image. It cannot be added to the * display list directly; instead it has to be mapped onto a display object. In Starling, * the most probably candidate for this job is the <code>Image</code> class.</p> * * <strong>Creating a texture</strong> * * <p>The <code>Texture</code> class is abstract, i.e. you cannot create instance of this * class through its constructor. Instead, it offers a variety of factory methods, like * <code>fromBitmapData</code> or <code>fromEmbeddedAsset</code>.</p> * * <strong>Texture Formats</strong> * * <p>Since textures can be created from a "BitmapData" object, Starling supports any bitmap * format that is supported by Flash. And since you can render any Flash display object into * a BitmapData object, you can use this to display non-Starling content in Starling - e.g. * Shape objects.</p> * * <p>Starling also supports ATF textures (Adobe Texture Format), which is a container for * compressed texture formats that can be rendered very efficiently by the GPU. Refer to * the Flash documentation for more information about this format.</p> * * <p>Beginning with AIR 17, you can use Starling textures to show video content (if the * current platform supports it; see "SystemUtil.supportsVideoTexture"). * The two factory methods "fromCamera" and "fromNetStream" allow you to make use of * this feature.</p> * * <strong>Mip Mapping</strong> * * <p>MipMaps are scaled down versions of a texture. When an image is displayed smaller than * its natural size, the GPU may display the mip maps instead of the original texture. This * reduces aliasing and accelerates rendering. It does, however, also need additional memory; * for that reason, mipmapping is disabled by default.</p> * * <strong>Texture Frame</strong> * * <p>The frame property of a texture allows you to let a texture appear inside the bounds of * an image, leaving a transparent border around the texture. The frame rectangle is specified * in the coordinate system of the texture (not the image):</p> * * <listing> * frame:Rectangle = new Rectangle(-10, -10, 30, 30); * texture:Texture = Texture.fromTexture(anotherTexture, null, frame); * image:Image = new Image(texture);</listing> * * <p>This code would create an image with a size of 30x30, with the texture placed at * <code>x=10, y=10</code> within that image (assuming that 'anotherTexture' has a width and * height of 10 pixels, it would appear in the middle of the image).</p> * * <p>The texture atlas makes use of this feature, as it allows to crop transparent edges * of a texture and making up for the changed size by specifying the original texture frame. * Tools like <a href="http://www.texturepacker.com/">TexturePacker</a> use this to * optimize the atlas.</p> * * <strong>Texture Coordinates</strong> * * <p>If, on the other hand, you want to show only a part of the texture in an image * (i.e. to crop the the texture), you can either create a subtexture (with the method * 'Texture.fromTexture()' and specifying a rectangle for the region), or you can manipulate * the texture coordinates of the image object. The method <code>image.setTexCoords</code> * allows you to do that.</p> * * <strong>Context Loss</strong> * * <p>When the current rendering context is lost (which can happen on all platforms, but is * especially common on Android and Windows), all texture data is destroyed. However, * Starling will try to restore the textures. To do that, it will keep the bitmap * and ATF data in memory - at the price of increased RAM consumption. You can optimize * this behavior, though, by restoring the texture directly from its source, like in this * example:</p> * * <listing> * texture:Texture = Texture.fromBitmap(new EmbeddedBitmap()); * texture.root.onRestore = function():void * { * texture.root.uploadFromBitmap(new EmbeddedBitmap()); * };</listing> * * <p>The <code>onRestore</code>-method will be called when the context was lost and the * texture has been recreated (but is still empty). If you use the "AssetManager" class to * manage your textures, this will be done automatically.</p> * * @see starling.display.Image * @see starling.utils.AssetManager * @see starling.utils.SystemUtil * @see TextureAtlas */ export class Texture { /** Disposes the underlying texture data. Note that not all textures need to be disposed: * SubTextures (created with 'Texture.fromTexture') just reference other textures and * and do not take up resources themselves; this is also true for textures from an * atlas. */ public dispose():void; /** Creates a texture from any of the supported data types, using the specified options. * * @param data Either an embedded asset class, a Bitmap, BitmapData, or a ByteArray * with ATF data. * @param options Specifies options about the texture settings, e.g. the scale factor. * If left empty, the default options will be used. */ public static fromData(data:any, options?:TextureOptions):Texture; /** Creates a texture from a <code>TextureBase</code> object. * * @param base a Stage3D texture object created through the current context. * @param width the width of the texture in pixels (not points!). * @param height the height of the texture in pixels (not points!). * @param options specifies options about the texture settings, e.g. the scale factor. * If left empty, the default options will be used. Note that not all * options are supported by all texture types. */ public static fromTextureBase(base:TextureBase, width:number, height:number, options?:TextureOptions):ConcreteTexture; /** Creates a texture object from an embedded asset class. Textures created with this * method will be restored directly from the asset class in case of a context loss, * which guarantees a very economic memory usage. * * @param assetClass must contain either a Bitmap or a ByteArray with ATF data. * @param mipMapping for Bitmaps, indicates if mipMaps will be created; * for ATF data, indicates if the contained mipMaps will be used. * @param optimizeForRenderToTexture indicates if this texture will be used as * render target. * @param scale the scale factor of the created texture. * @param format the context3D texture format to use. Ignored for ATF data. * @param forcePotTexture indicates if the underlying Stage3D texture should be created * as the power-of-two based "Texture" class instead of the more memory * efficient "RectangleTexture". (Only applicable to bitmaps; ATF * textures are always POT-textures, anyway.) */ public static fromEmbeddedAsset(assetClass:any, mipMapping?:boolean, optimizeForRenderToTexture?:boolean, scale?:number, format?:Context3DTextureFormat, forcePotTexture?:boolean):Texture; /** Creates a texture object from a bitmap. * Beware: you must not dispose the bitmap's data if Starling should handle a lost device * context (except if you handle restoration yourself via "texture.root.onRestore"). * * @param bitmap the texture will be created with the bitmap data of this object. * @param generateMipMaps indicates if mipMaps will be created. * @param optimizeForRenderToTexture indicates if this texture will be used as * render target * @param scale the scale factor of the created texture. This affects the reported * width and height of the texture object. * @param format the context3D texture format to use. Pass one of the packed or * compressed formats to save memory (at the price of reduced image * quality). * @param forcePotTexture indicates if the underlying Stage3D texture should be created * as the power-of-two based "Texture" class instead of the more memory * efficient "RectangleTexture". * @param async If you pass a callback function, the texture will be uploaded * asynchronously, which allows smooth rendering even during the * loading process. However, don't use the texture before the callback * has been executed. This is the expected definition: * <code>function(texture:Texture, error:ErrorEvent):void;</code> * The second parameter is optional and typically <code>null</code>. */ public static fromBitmap(bitmap:Bitmap, generateMipMaps?:boolean, optimizeForRenderToTexture?:boolean, scale?:number, format?:Context3DTextureFormat, forcePotTexture?:boolean, async?:(Texture)=>void):Texture; /** Creates a texture object from bitmap data. * Beware: you must not dispose 'data' if Starling should handle a lost device context * (except if you handle restoration yourself via "texture.root.onRestore"). * * @param data the bitmap data to upload to the texture. * @param generateMipMaps indicates if mipMaps will be created. * @param optimizeForRenderToTexture indicates if this texture will be used as * render target * @param scale the scale factor of the created texture. This affects the reported * width and height of the texture object. * @param format the context3D texture format to use. Pass one of the packed or * compressed formats to save memory (at the price of reduced image * quality). * @param forcePotTexture indicates if the underlying Stage3D texture should be created * as the power-of-two based "Texture" class instead of the more memory * efficient "RectangleTexture". * @param async If you pass a callback function, the texture will be uploaded * asynchronously, which allows smooth rendering even during the * loading process. However, don't use the texture before the callback * has been executed. This is the expected definition: * <code>function(texture:Texture, error:ErrorEvent):void;</code> * The second parameter is optional and typically <code>null</code>. */ public static fromBitmapData(data:BitmapData, generateMipMaps?:boolean, optimizeForRenderToTexture?:boolean, scale?:number, format?:Context3DTextureFormat, forcePotTexture?:boolean, async?:(Texture)=>void):Texture; /** Creates a texture from ATF data (Adobe Texture Compression). * Beware: you must not dispose 'data' if Starling should handle a lost device context; * alternatively, you can handle restoration yourself via "texture.root.onRestore". * * @param data the raw data from an ATF file. * @param scale the scale factor of the created texture. This affects the reported * width and height of the texture object. * @param useMipMaps If the ATF data contains mipmaps, this parameter controls if they * are used; if it does not, this parameter has no effect. * @param async If you pass a callback function, the texture will be decoded * asynchronously, which allows a smooth framerate even during the * loading process. However, don't use the texture before the callback * has been executed. This is the expected definition: * <code>function(texture:Texture):void;</code> * @param premultipliedAlpha Indicates if the ATF data contains pixels in PMA format. * This is "false" for most ATF files, but can be customized in some * tools. */ public static fromAtfData(data:ByteArray, scale?:number, useMipMaps?:boolean, async?:(Texture)=>void, premultipliedAlpha?:boolean):Texture; /** Creates a video texture from a NetStream. * * <p>Below, you'll find a minimal sample showing how to stream a video from a file. * Note that <code>ns.play()</code> is called only after creating the texture, and * outside the <code>onComplete</code>-callback. It's recommended to always make the * calls in this order; otherwise, playback won't start on some platforms.</p> * * <listing> * nc:NetConnection = new NetConnection(); * nc.connect(null); * * ns:NetStream = new NetStream(nc); * texture:Texture = Texture.fromNetStream(ns, 1, function():void * { * addChild(new Image(texture)); * }); * * file:File = File.applicationDirectory.resolvePath("bugs-bunny.m4v"); * ns.play(file.url);</listing> * * @param stream the NetStream from which the video data is streamed. Beware that 'play' * should be called only after the method returns, and outside the * <code>onComplete</code> callback. * @param scale the scale factor of the created texture. This affects the reported * width and height of the texture object. * @param onComplete will be executed when the texture is ready. Contains a parameter * of type 'Texture'. */ public static fromNetStream(stream:NetStream, scale?:number, onComplete?:(Texture)=>void):Texture; /** Creates a video texture from a camera. Beware that the texture must not be used * before the 'onComplete' callback has been executed; until then, it will have a size * of zero pixels. * * <p>Here is a minimal sample showing how to display a camera video:</p> * * <listing> * camera:Camera = Camera.getCamera(); * texture:Texture = Texture.fromCamera(camera, 1, function():void * { * addChild(new Image(texture)); * });</listing> * * @param camera the camera from which the video data is streamed. * @param scale the scale factor of the created texture. This affects the reported * width and height of the texture object. * @param onComplete will be executed when the texture is ready. May contain a parameter * of type 'Texture'. */ // #if flash // public static fromCamera(camera:Camera, scale?:number, // onComplete?:(Texture)=>void):Texture; // #end /** Creates a texture with a certain size and color. * * @param width in points; number of pixels depends on scale parameter * @param height in points; number of pixels depends on scale parameter * @param color the RGB color the texture will be filled up * @param alpha the alpha value that will be used for every pixel * @param optimizeForRenderToTexture indicates if this texture will be used as render target * @param scale if you omit this parameter, 'Starling.contentScaleFactor' will be used. * @param format the context3D texture format to use. Pass one of the packed or * compressed formats to save memory. * @param forcePotTexture indicates if the underlying Stage3D texture should be created * as the power-of-two based "Texture" class instead of the more memory * efficient "RectangleTexture". */ public static fromColor(width:number, height:number, color?:number, alpha?:number, optimizeForRenderToTexture?:boolean, scale?:number, format?:string, forcePotTexture?:boolean):Texture; /** Creates an empty texture of a certain size. * Beware that the texture can only be used after you either upload some color data * ("texture.root.upload...") or clear the texture ("texture.root.clear()"). * * @param width in points; number of pixels depends on scale parameter * @param height in points; number of pixels depends on scale parameter * @param premultipliedAlpha the PMA format you will use the texture with. If you will * use the texture for bitmap data, use "true"; for ATF data, use "false". * @param mipMapping indicates if mipmaps should be used for this texture. When you upload * bitmap data, this decides if mipmaps will be created; when you upload ATF * data, this decides if mipmaps inside the ATF file will be displayed. * @param optimizeForRenderToTexture indicates if this texture will be used as render target * @param scale if you omit this parameter, 'Starling.contentScaleFactor' will be used. * @param format the context3D texture format to use. Pass one of the packed or * compressed formats to save memory (at the price of reduced image quality). * @param forcePotTexture indicates if the underlying Stage3D texture should be created * as the power-of-two based "Texture" class instead of the more memory * efficient "RectangleTexture". */ public static empty(width:number, height:number, premultipliedAlpha?:boolean, mipMapping?:boolean, optimizeForRenderToTexture?:boolean, scale?:number, format?:string, forcePotTexture?:boolean):Texture; /** Creates a texture that contains a region (in pixels) of another texture. The new * texture will reference the base texture; no data is duplicated. * * @param texture The texture you want to create a SubTexture from. * @param region The region of the parent texture that the SubTexture will show * (in points). * @param frame If the texture was trimmed, the frame rectangle can be used to restore * the trimmed area. * @param rotated If true, the SubTexture will show the parent region rotated by * 90 degrees (CCW). * @param scaleModifier The scale factor of the new texture will be calculated by * multiplying the parent texture's scale factor with this value. */ public static fromTexture(texture:Texture, region?:Rectangle, frame?:Rectangle, rotated?:boolean, scaleModifier?:number):Texture; /** Sets up a VertexData instance with the correct positions for 4 vertices so that * the texture can be mapped onto it unscaled. If the texture has a <code>frame</code>, * the vertices will be offset accordingly. * * @param vertexData the VertexData instance to which the positions will be written. * @param vertexID the start position within the VertexData instance. * @param attrName the attribute name referencing the vertex positions. * @param bounds useful only for textures with a frame. This will position the * vertices at the correct position within the given bounds, * distorted appropriately. */ public setupVertexPositions(vertexData:VertexData, vertexID?:number, attrName?:string, bounds?:Rectangle):void; /** Sets up a VertexData instance with the correct texture coordinates for * 4 vertices so that the texture is mapped to the complete quad. * * @param vertexData the vertex data to which the texture coordinates will be written. * @param vertexID the start position within the VertexData instance. * @param attrName the attribute name referencing the vertex positions. */ public setupTextureCoordinates(vertexData:VertexData, vertexID?:number, attrName?:string):void; /** Transforms the given texture coordinates from the local coordinate system * into the root texture's coordinate system. */ public localToGlobal(u:number, v:number, out?:Point):Point; /** Transforms the given texture coordinates from the root texture's coordinate system * to the local coordinate system. */ public globalToLocal(u:number, v:number, out?:Point):Point; /** Writes the given texture coordinates to a VertexData instance after transforming * them into the root texture's coordinate system. That way, the texture coordinates * can be used directly to sample the texture in the fragment shader. */ public setTexCoords(vertexData:VertexData, vertexID:number, attrName:string, u:number, v:number):void; /** Reads a pair of texture coordinates from the given VertexData instance and transforms * them into the current texture's coordinate system. (Remember, the VertexData instance * will always contain the coordinates in the root texture's coordinate system!) */ public getTexCoords(vertexData:VertexData, vertexID:number, attrName?:string, out?:Point):Point; // properties /** The texture frame if it has one (see class description), otherwise <code>null</code>. * <p>CAUTION: not a copy, but the actual object! Do not modify!</p> */ public readonly frame:Rectangle; protected get_frame():Rectangle; /** The height of the texture in points, taking into account the frame rectangle * (if there is one). */ public readonly frameWidth:number; protected get_frameWidth():number; /** The width of the texture in points, taking into account the frame rectangle * (if there is one). */ public readonly frameHeight:number; protected get_frameHeight():number; /** The width of the texture in points. */ public readonly width:number; protected get_width():number; /** The height of the texture in points. */ public readonly height:number; protected get_height():number; /** The width of the texture in pixels (without scale adjustment). */ public readonly nativeWidth:number; protected get_nativeWidth():number; /** The height of the texture in pixels (without scale adjustment). */ public readonly nativeHeight:number; protected get_nativeHeight():number; /** The scale factor, which influences width and height properties. */ public readonly scale:number; protected get_scale():number; /** The Stage3D texture object the texture is based on. */ public readonly base:TextureBase; protected get_base():TextureBase; /** The concrete texture the texture is based on. */ public readonly root:ConcreteTexture; protected get_root():ConcreteTexture; /** The <code>Context3DTextureFormat</code> of the underlying texture data. */ public readonly format:Context3DTextureFormat; protected get_format():Context3DTextureFormat; /** Indicates if the texture contains mip maps. */ public readonly mipMapping:boolean; protected get_mipMapping():boolean; /** Indicates if the alpha values are premultiplied into the RGB values. */ public readonly premultipliedAlpha:boolean; protected get_premultipliedAlpha():boolean; /** The matrix that is used to transform the texture coordinates into the coordinate * space of the parent texture, if there is one. @default null * * <p>CAUTION: not a copy, but the actual object! Never modify this matrix!</p> */ public readonly transformationMatrix:Matrix; protected get_transformationMatrix():Matrix; /** The matrix that is used to transform the texture coordinates into the coordinate * space of the root texture, if this instance is not the root. @default null * * <p>CAUTION: not a copy, but the actual object! Never modify this matrix!</p> */ public readonly transformationMatrixToRoot:Matrix; protected get_transformationMatrixToRoot():Matrix; /** Returns the maximum size constraint (for both width and height) for uncompressed * textures in the current Context3D profile. */ public static readonly maxSize:number; protected static get_maxSize():number; public static getMaxSize(textureFormat?:Context3DTextureFormat):number; /** Indicates if it should be attempted to upload bitmaps asynchronously when the <code>async</code> parameter * is supplied to supported methods. Since this feature is still not 100% reliable in AIR 26 (especially on * Android), it defaults to 'false' for now. * * <p>If the feature is disabled or not available in the current AIR/Flash runtime, the async callback will * still be executed; however, the upload itself will be made synchronously.</p> */ public static asyncBitmapUploadEnabled:boolean; protected static get_asyncBitmapUploadEnabled():boolean; protected static set_asyncBitmapUploadEnabled(value:boolean):boolean; } } export default starling.textures.Texture;