Skip to content

Instantly share code, notes, and snippets.

@mrchnk
Last active April 22, 2019 11:08
Show Gist options
  • Select an option

  • Save mrchnk/064516eee42d1bb2ad2a to your computer and use it in GitHub Desktop.

Select an option

Save mrchnk/064516eee42d1bb2ad2a to your computer and use it in GitHub Desktop.
function renderWithAlpha(source: DisplayObject, target: BitmapData, tranform: Matrix = null, currentStarling: Starling = null): Boolean {
if (!tranform) {
_helpMatrix.identity();
tranform = _helpMatrix;
}
var rect: Rectangle = target.rect;
if (!_render(source, target, rect, tranform, 0, 0, null, currentStarling)) {
return false;
}
var alphaBitmap: BitmapData = new BitmapData(target.width, target.height, false);
if (!_render(source, alphaBitmap, rect, tranform, 0xffffff, 1, BlendMode.ERASE)) {
return false;
}
alphaBitmap.applyFilter(alphaBitmap, rect, ZERO_POINT, INVERT_COLOR);
target.copyChannel(alphaBitmap, rect, ZERO_POINT, BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
return true;
}
function _render(source: DisplayObject, target: BitmapData, clip: Rectangle = null, transform: Matrix = null, bgColor: uint = 0, bgAlpha: Number = 0, blendMode: String = null, currentStarling: Starling = null): Boolean {
var mStage: Stage = Starling.current.stage;
var _support: Utils_RenderSupport = _getSupport();
_support.nextFrame();
_support.setOrthographicProjection(0, 0, mStage.stageWidth, mStage.stageHeight);
try {
_support.clear(bgColor, bgAlpha);
} catch (err: Error) {
// context is lost
return false;
}
_support.setBlendMode(blendMode ? blendMode : BlendMode.NORMAL);
if (transform) {
_support.pushMatrix();
_support.prependMatrix(transform);
}
if (clip) {
_support.pushClipRect(clip);
}
source.render(_support, 1);
_support.finishQuadBatch();
if (clip) {
_support.popClipRect();
}
Starling.context.drawToBitmapData(target);
return true;
}
class Utils_RenderSupport extends RenderSupport {
public function setBlendMode(mode: String): void {
super.blendMode = mode;
}
public override function get blendMode(): String {
return super.blendMode;
}
public override function set blendMode(value: String): void {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment