Показать сообщение отдельно
Старый 22.11.2014, 17:30
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 1  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
По умолчанию readGraphicsData ошибается в конструкторе

Здравствуйте. Внезапно наткнулся на совершенно неожиданный момент, который затормозил мой проект и скоро добавит седых волос.
Идея была простая - вытащить из шейпа его растровую заливку (bitmapData) при помощи readGraphicsData. Но вдруг обнаружилось, что если это сделать из конструктора, то вылетает ошибка Error #2015: Invalid BitmapData как топор в спину. А если сделать это вне конструктора, то - всё работает.

Какова причина этой ошибки и как её избежать? Ведь мне необходимо проделывать эту операцию в конструкторе.
p.s. flashPlayer 14, -swf-version=25 прописано.

Набросал очень простой пример с этим багом(?), и если что, проект FD прикрепляю тоже.
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.GraphicsBitmapFill;
	import flash.display.IGraphicsData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.setTimeout;
 
	/**
	 * ...
	 * @author samana
	 */
	public class Main extends Sprite 
	{
		[Embed(source = "../images/flasher_logo_2013.png")]
		private var ImageClass:Class;
 
		private var _shape:Shape;
 
		public function Main():void 
		{
			//если вызвать в конструкторе то Error #2015: Invalid BitmapData. 
			stage_click();
 
 
			//если вызвать после отработки конструктора, то всё хорошо
			//stage.addEventListener(MouseEvent.CLICK, stage_click);
			//setTimeout(stage_click, 1);
		}
 
 
		private function stage_click(e:MouseEvent=null):void 
		{
			// создаю шейп с растровой заливкой 
			_shape = new Shape();
			_shape.graphics.beginBitmapFill((new ImageClass() as Bitmap).bitmapData);
			_shape.graphics.drawRect(0, 0, 800, 300);
			_shape.graphics.endFill();
 
			addChild(_shape);
 
			// пытаюсь вытянуть заливку из шейпа
			var graphicsData:Vector.<IGraphicsData> = _shape.graphics.readGraphicsData();
			trace(graphicsData);// [object GraphicsBitmapFill],[object GraphicsPath],[object GraphicsEndFill]
 
			var fill:GraphicsBitmapFill = graphicsData[0] as GraphicsBitmapFill;
			trace(fill);// [object GraphicsBitmapFill]
 
			trace(fill.bitmapData);// [object BitmapData]
 
			trace(fill.bitmapData.width); //[Fault] exception, information=ArgumentError: Error #2015: Invalid BitmapData.
		}
 
	}
 
}
bug.rar