All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scaffold.libs_as.starling.textures.ConcreteTexture.as Maven / Gradle / Ivy

// =================================================================================================
//
//	Starling Framework
//	Copyright 2011-2015 Gamua. All Rights Reserved.
//
//	This program is free software. You can redistribute and/or modify it
//	in accordance with the terms of the accompanying license agreement.
//
// =================================================================================================

package starling.textures
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display3D.textures.TextureBase;
    import flash.media.Camera;
    import flash.net.NetStream;
    import flash.system.Capabilities;
    import flash.utils.ByteArray;
    import flash.utils.getQualifiedClassName;

    import starling.core.Starling;
    import starling.errors.AbstractClassError;
    import starling.errors.AbstractMethodError;
    import starling.errors.NotSupportedError;
    import starling.events.Event;
    import starling.rendering.Painter;
    import starling.utils.Color;
    import starling.utils.execute;

    /** A ConcreteTexture wraps a Stage3D texture object, storing the properties of the texture
     *  and providing utility methods for data upload, etc.
     *
     *  

This class cannot be instantiated directly; create instances using * Texture.fromTextureBase instead. However, that's only necessary when * you need to wrap a TextureBase object in a Starling texture; * the preferred way of creating textures is to use one of the other * Texture.from... factory methods in the Texture class.

* * @see Texture */ public class ConcreteTexture extends Texture { private var _base:TextureBase; private var _format:String; private var _width:int; private var _height:int; private var _mipMapping:Boolean; private var _premultipliedAlpha:Boolean; private var _optimizedForRenderTexture:Boolean; private var _scale:Number; private var _onRestore:Function; private var _dataUploaded:Boolean; /** @private * * Creates a ConcreteTexture object from a TextureBase, storing information about size, * mip-mapping, and if the channels contain premultiplied alpha values. May only be * called from subclasses. * *

Note that width and height are expected in pixels, * i.e. they do not take the scale factor into account.

*/ public function ConcreteTexture(base:TextureBase, format:String, width:int, height:int, mipMapping:Boolean, premultipliedAlpha:Boolean, optimizedForRenderTexture:Boolean=false, scale:Number=1) { if (Capabilities.isDebugger && getQualifiedClassName(this) == "starling.textures::ConcreteTexture") { throw new AbstractClassError(); } _scale = scale <= 0 ? 1.0 : scale; _base = base; _format = format; _width = width; _height = height; _mipMapping = mipMapping; _premultipliedAlpha = premultipliedAlpha; _optimizedForRenderTexture = optimizedForRenderTexture; _onRestore = null; _dataUploaded = false; } /** Disposes the TextureBase object. */ public override function dispose():void { if (_base) _base.dispose(); this.onRestore = null; // removes event listener super.dispose(); } // texture data upload /** Uploads a bitmap to the texture. The existing contents will be replaced. * If the size of the bitmap does not match the size of the texture, the bitmap will be * cropped or filled up with transparent pixels */ public function uploadBitmap(bitmap:Bitmap):void { uploadBitmapData(bitmap.bitmapData); } /** Uploads bitmap data to the texture. The existing contents will be replaced. * If the size of the bitmap does not match the size of the texture, the bitmap will be * cropped or filled up with transparent pixels */ public function uploadBitmapData(data:BitmapData):void { throw new NotSupportedError(); } /** Uploads ATF data from a ByteArray to the texture. Note that the size of the * ATF-encoded data must be exactly the same as the original texture size. * *

The 'async' parameter may be either a boolean value or a callback function. * If it's false or null, the texture will be decoded * synchronously and will be visible right away. If it's true or a function, * the data will be decoded asynchronously. The texture will remain unchanged until the * upload is complete, at which time the callback function will be executed. This is the * expected function definition: function(texture:Texture):void;

*/ public function uploadAtfData(data:ByteArray, offset:int=0, async:*=null):void { throw new NotSupportedError(); } /** Specifies a video stream to be rendered within the texture. */ public function attachNetStream(netStream:NetStream, onComplete:Function=null):void { attachVideo("NetStream", netStream, onComplete); } /** Specifies a video stream from a camera to be rendered within the texture. */ public function attachCamera(camera:Camera, onComplete:Function=null):void { attachVideo("Camera", camera, onComplete); } /** @private */ internal function attachVideo(type:String, attachment:Object, onComplete:Function=null):void { throw new NotSupportedError(); } // texture backup (context loss) private function onContextCreated():void { _dataUploaded = false; _base = createBase(); // recreate the underlying texture execute(_onRestore, this); // restore contents // if no texture has been uploaded above, we init the texture with transparent pixels. if (!_dataUploaded) clear(); } /** Recreates the underlying Stage3D texture object with the same dimensions and attributes * as the one that was passed to the constructor. You have to upload new data before the * texture becomes usable again. Beware: this method does not dispose * the current base. */ protected function createBase():TextureBase { throw new AbstractMethodError(); } /** Clears the texture with a certain color and alpha value. The previous contents of the * texture is wiped out. */ public function clear(color:uint=0x0, alpha:Number=0.0):void { if (_premultipliedAlpha && alpha < 1.0) color = Color.rgb(Color.getRed(color) * alpha, Color.getGreen(color) * alpha, Color.getBlue(color) * alpha); var painter:Painter = Starling.painter; painter.pushState(); painter.state.renderTarget = this; // we wrap the clear call in a try/catch block as a workaround for a problem of // FP 11.8 plugin/projector: calling clear on a compressed texture doesn't work there // (while it *does* work on iOS + Android). try { painter.clear(color, alpha); } catch (e:Error) {} painter.popState(); setDataUploaded(); } /** Notifies the instance that the base texture may now be used for rendering. */ protected function setDataUploaded():void { _dataUploaded = true; } // properties /** Indicates if the base texture was optimized for being used in a render texture. */ public function get optimizedForRenderTexture():Boolean { return _optimizedForRenderTexture; } /** The function that you provide here will be called after a context loss. * On execution, a new base texture will already have been created; however, * it will be empty. Call one of the "upload..." methods from within the callback * to restore the actual texture data. * * * var texture:Texture = Texture.fromBitmap(new EmbeddedBitmap()); * texture.root.onRestore = function():void * { * texture.root.uploadFromBitmap(new EmbeddedBitmap()); * }; */ public function get onRestore():Function { return _onRestore; } public function set onRestore(value:Function):void { Starling.current.removeEventListener(Event.CONTEXT3D_CREATE, onContextCreated); if (value != null) { _onRestore = value; Starling.current.addEventListener(Event.CONTEXT3D_CREATE, onContextCreated); } else _onRestore = null; } /** @inheritDoc */ public override function get base():TextureBase { return _base; } /** @inheritDoc */ public override function get root():ConcreteTexture { return this; } /** @inheritDoc */ public override function get format():String { return _format; } /** @inheritDoc */ public override function get width():Number { return _width / _scale; } /** @inheritDoc */ public override function get height():Number { return _height / _scale; } /** @inheritDoc */ public override function get nativeWidth():Number { return _width; } /** @inheritDoc */ public override function get nativeHeight():Number { return _height; } /** The scale factor, which influences width and height properties. */ public override function get scale():Number { return _scale; } /** @inheritDoc */ public override function get mipMapping():Boolean { return _mipMapping; } /** @inheritDoc */ public override function get premultipliedAlpha():Boolean { return _premultipliedAlpha; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy