Return-Path: X-Original-To: apmail-flex-commits-archive@www.apache.org Delivered-To: apmail-flex-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id ABF15E5CA for ; Fri, 8 Feb 2013 01:32:46 +0000 (UTC) Received: (qmail 64765 invoked by uid 500); 8 Feb 2013 01:32:46 -0000 Delivered-To: apmail-flex-commits-archive@flex.apache.org Received: (qmail 64744 invoked by uid 500); 8 Feb 2013 01:32:46 -0000 Mailing-List: contact commits-help@flex.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@flex.apache.org Delivered-To: mailing list commits@flex.apache.org Received: (qmail 64736 invoked by uid 99); 8 Feb 2013 01:32:46 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 Feb 2013 01:32:46 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 Feb 2013 01:32:44 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 000DA2388A38; Fri, 8 Feb 2013 01:32:25 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1443817 - /flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as Date: Fri, 08 Feb 2013 01:32:25 -0000 To: commits@flex.apache.org From: quetwo@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130208013226.000DA2388A38@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: quetwo Date: Fri Feb 8 01:32:25 2013 New Revision: 1443817 URL: http://svn.apache.org/r1443817 Log: Refactoring ImageGate, preparing for mustella tests Added: flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as Added: flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as URL: http://svn.apache.org/viewvc/flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as?rev=1443817&view=auto ============================================================================== --- flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as (added) +++ flex/whiteboard/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as Fri Feb 8 01:32:25 2013 @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +// Original component created by Dan Florio (http://www.polygeek.com), and donated +// via Nick Kwiatkowski (quetwo) to the Apache Flex Project +//////////////////////////////////////////////////////////////////////////////// + +package org.apache.components +{ + + import flash.display.Bitmap; + import flash.display.Loader; + import flash.events.Event; + import flash.events.IOErrorEvent; + import flash.filesystem.File; + import flash.filesystem.FileMode; + import flash.filesystem.FileStream; + import flash.net.URLLoader; + import flash.net.URLLoaderDataFormat; + import flash.net.URLRequest; + import flash.system.Capabilities; + import flash.utils.ByteArray; + + import spark.primitives.BitmapImage; + + public class BitmapImageGate extends BitmapImage + { + private var _urlRequest:URLRequest; + private var _urlLoader:URLLoader; + private var _loader:Loader; + private var _fileStream:FileStream; + + private var _url:String; + private var _filename:String; + private var _file:File; + + private var _assetURLallDPI:String; + private var _assetURL160:String; + private var _assetURL240:String; + private var _assetURL320:String; + + private var _cacheFolder:String = "imageCache"; + + public function BitmapImageGate() + { + super(); + } + + private function findImage():void + { + + /** + * The _cacheFolder must be set in order to proceed. + */ + if (_cacheFolder == null) + { + return; + } + + var gotAllMultiScreenURLs:Boolean = false; + + if (_assetURL160 != null + && _assetURL240 != null + && _assetURL320 != null) + { + + gotAllMultiScreenURLs = true; + } + + /** + * If we don't have either of the _assetURL or all of the + * multi-screen URLs then we can not proceed. + */ + if (_assetURLallDPI == null && !gotAllMultiScreenURLs) + { + return + } + + if (_assetURLallDPI == '') + { + return + } + + /** + * Check to see what the _url is going to be for this particular image. + * -If _assetURL != null then use that url. + * -Otherwise find the correct _url based on the current screen resolution. + */ + + if (_assetURLallDPI != null) + { + _url = _assetURLallDPI; + } + else if (Capabilities.screenDPI >= 280) + { + _url = _assetURL320 + } + else if (Capabilities.screenDPI >= 200) + { + _url = _assetURL240 + } + else + { + _url = _assetURL160 + } + + _filename = _url.substring(_url.lastIndexOf('/') + 1); + + if (Capabilities.os.toLowerCase().indexOf('iphone') != -1 || Capabilities.os.toLowerCase().indexOf('ipad') != -1 || Capabilities.os.toLowerCase().indexOf('ipod') != -1) + { + // Store the downloaded files in the Cache directory on iOS devices only. This is to comply with the + // new AppStore guidelines that are in effect as of iOS 5.1 + _file = new File(File.applicationDirectory.nativePath + "/\.\./Library/Caches").resolvePath(_cacheFolder + '/' + _filename); + } + else + { + // Store the downloaded files in the applicationStorage Directory. + _file = File.applicationStorageDirectory.resolvePath(_cacheFolder + '/' + _filename); + } + + if (_file.exists) + { + var byteArray:ByteArray = new ByteArray(); + _fileStream = new FileStream(); + _fileStream.open(_file, FileMode.READ); + _fileStream.readBytes(byteArray); + _fileStream.close(); + _fileStream = null; + _file = null; + + _loader = new Loader(); + _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); + _loader.loadBytes(byteArray); + + } + else + { + downloadRemoteFile(); + } + } + + private function onBytesLoaded(e:Event):void + { + this.source = new Bitmap(e.target.content.bitmapData); + _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onBytesLoaded); + + // Cleanup + _loader = null; + _filename = null; + } + + + private function downloadRemoteFile():void + { + _urlLoader = new URLLoader(); + _urlRequest = new URLRequest(_url); + _urlLoader.dataFormat = URLLoaderDataFormat.BINARY; + _urlLoader.addEventListener(Event.COMPLETE, onDownloadComplete); + _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOerror); + _urlLoader.load(_urlRequest); + } + + private function onDownloadComplete(e:Event):void + { + var byteArray:ByteArray = _urlLoader.data; + _fileStream = new FileStream(); + _fileStream.open(_file, FileMode.WRITE); + _fileStream.writeBytes(byteArray, 0, byteArray.length); + _fileStream.close(); + + _loader = new Loader(); + _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); + _loader.loadBytes(byteArray); + + cleanupAfterDownload(); + } + + private function onIOerror(e:IOErrorEvent):void + { + throw("image download error : " + _url + " : " + _filename); + cleanupAfterDownload(); + } + + private function cleanupAfterDownload():void + { + _urlLoader.close(); + _urlLoader = null; + _fileStream = null; + _urlRequest = null; + _url = null; + } + + /* ************************************************************ + * Setters + * ************************************************************ */ + override public function set source(value:Object):void + { + //super.source = value; + if (_assetURLallDPI != value) + { + _assetURLallDPI = String(value); + findImage(); + } + } + + public function setMultiDPIsource(value:String, dpi:Number = 0):void + { + if (dpi == 0) + { + source = value; + } + if (dpi > 280) + { + _assetURL160 = value; + findImage(); + return; + } + if (dpi > 200) + { + _assetURL240 = value; + findImage(); + return; + } + if (dpi <= 200) + { + _assetURL160 = value; + findImage(); + } + } + + public function set cacheFolder(value:String):void + { + if (_cacheFolder == value) + { + return; + } + _cacheFolder = value; + findImage(); + } + + /* ************************************************************ + * Getters + * ************************************************************ */ + + public function get cacheFolder():String + { + return _cacheFolder; + } + + public function getMultiDPIsource(dpi:Number = 0):String + { + if (dpi == 0) + { + return _assetURLallDPI; + } + if (dpi > 280) + { + return _assetURL320; + } + if (dpi > 200) + { + return _assetURL240; + } + return _assetURL160; + } + + [Inspectable(category="General")] + [Bindable("sourceChanged")] + override public function get source():Object + { + if ((Capabilities.screenDPI > 280 )&&(_assetURL320 != null)) + { + return _assetURL320; + } + if ((Capabilities.screenDPI > 200 )&&(_assetURL240 != null)) + { + return _assetURL240; + } + if ((Capabilities.screenDPI <= 200 )&&(_assetURL160 != null)) + { + return _assetURL160; + } + return _assetURLallDPI; + } + } +}