Restore Image as the default container type, with ImageBuffer underneath

This commit is contained in:
Joshua Granick
2014-08-01 21:50:44 -07:00
parent 1749a18ab4
commit d66f48a482
6 changed files with 210 additions and 190 deletions

View File

@@ -5,7 +5,7 @@ package lime;
import haxe.Unserializer;
import lime.graphics.Font;
import lime.media.AudioBuffer;
import lime.media.ImageBuffer;
import lime.media.Image;
import lime.utils.ByteArray;
@@ -189,7 +189,7 @@ class Assets {
* @param useCache (Optional) Whether to use BitmapData from the cache(Default: true)
* @return A new BitmapData object
*/
public static function getImageBuffer (id:String, useCache:Bool = true):ImageBuffer {
public static function getImage (id:String, useCache:Bool = true):Image {
initialize ();
@@ -217,7 +217,7 @@ class Assets {
if (library.isLocal (symbolName, cast AssetType.IMAGE)) {
var image = library.getImageBuffer (symbolName);
var image = library.getImage (symbolName);
if (useCache && cache.enabled) {
@@ -500,7 +500,7 @@ class Assets {
}
private static function isValidImage (buffer:ImageBuffer):Bool {
private static function isValidImage (buffer:Image):Bool {
#if (tools && !display)
#if (cpp || neko)
@@ -651,7 +651,7 @@ class Assets {
}
public static function loadImageBuffer (id:String, handler:ImageBuffer -> Void, useCache:Bool = true):Void {
public static function loadImage (id:String, handler:Image -> Void, useCache:Bool = true):Void {
initialize ();
@@ -680,7 +680,7 @@ class Assets {
if (useCache && cache.enabled) {
library.loadImageBuffer (symbolName, function (image:ImageBuffer):Void {
library.loadImage (symbolName, function (image:Image):Void {
cache.image.set (id, image);
handler (image);
@@ -689,7 +689,7 @@ class Assets {
} else {
library.loadImageBuffer (symbolName, handler);
library.loadImage (symbolName, handler);
}
@@ -965,7 +965,7 @@ class AssetLibrary {
}
public function getImageBuffer (id:String):ImageBuffer {
public function getImage (id:String):Image {
return null;
@@ -1046,9 +1046,9 @@ class AssetLibrary {
}
public function loadImageBuffer (id:String, handler:ImageBuffer -> Void):Void {
public function loadImage (id:String, handler:Image -> Void):Void {
handler (getImageBuffer (id));
handler (getImage (id));
}
@@ -1097,7 +1097,7 @@ class AssetCache {
public var audio:Map<String, AudioBuffer>;
public var enabled:Bool = true;
public var image:Map<String, ImageBuffer>;
public var image:Map<String, Image>;
public var font:Map<String, Font>;
@@ -1105,7 +1105,7 @@ class AssetCache {
audio = new Map<String, AudioBuffer> ();
font = new Map<String, Font> ();
image = new Map<String, ImageBuffer> ();
image = new Map<String, Image> ();
}
@@ -1116,7 +1116,7 @@ class AssetCache {
audio = new Map<String, AudioBuffer> ();
font = new Map<String, Font> ();
image = new Map<String, ImageBuffer> ();
image = new Map<String, Image> ();
} else {

View File

@@ -21,7 +21,7 @@ typedef GlyphRect = {
}
typedef GlyphData = {
var image:ImageBuffer;
var image:Image;
var glyphs:StringMap<GlyphRect>;
};
@@ -135,7 +135,7 @@ class Font {
image.src = __canvas.toDataURL();
return {
glyphs: glyphRects,
image: ImageBuffer.fromImage (image)
image: Image.fromImage (image)
}
#elseif flash
@@ -207,7 +207,7 @@ class Font {
return {
glyphs: glyphRects,
image: ImageBuffer.fromBitmapData (bd)
image: Image.fromBitmapData (bd)
}
#elseif (cpp || neko)
@@ -236,7 +236,7 @@ class Font {
return {
glyphs: glyphRects,
image: new ImageBuffer (new UInt8Array (data.image.data), data.image.width, data.image.height, data.image.bpp)
image: new Image (new ImageBuffer (new UInt8Array (data.image.data), data.image.width, data.image.height, data.image.bpp))
};
}

View File

@@ -2,6 +2,7 @@ package lime.media;
import lime.app.Application;
import lime.graphics.RenderContext;
import lime.graphics.Renderer;
import lime.utils.ByteArray;
import lime.utils.UInt8Array;
@@ -10,6 +11,7 @@ import lime.system.System;
#if js
import js.html.CanvasElement;
import js.html.CanvasRenderingContext2D;
import js.html.Image in HTMLImage;
import js.Browser;
#elseif flash
import flash.display.BitmapData;
@@ -27,27 +29,25 @@ class Image {
#end
public var buffer:ImageBuffer;
public var data (get, set):UInt8Array;
public var height:Int;
public var offsetX:Int;
public var offsetY:Int;
public var powerOfTwo (get, set):Bool;
public var premultiplied (get, set):Bool;
public var src (get, set):Dynamic;
public var width:Int;
private var __renderer:Renderer;
private var __type:StoreType;
public function new (buffer:ImageBuffer, renderer:Renderer = null) {
public function new (buffer:ImageBuffer, context:RenderContext = null) {
this.buffer = buffer;
if (renderer == null) {
if (context == null) {
__renderer = Application.__instance.window.currentRenderer;
} else {
__renderer = renderer;
context = Application.__instance.window.currentRenderer.context;
}
@@ -56,37 +56,91 @@ class Image {
offsetX = 0;
offsetY = 0;
switch (__renderer.context) {
__type = switch (context) {
case OPENGL (_):
#if js
if (buffer.data == null && buffer.src != null && buffer.width > 0 && buffer.height > 0) {
if (__canvas == null) {
__canvas = cast Browser.document.createElement ("canvas");
__context = cast __canvas.getContext ("2d");
}
__canvas.width = buffer.width;
__canvas.height = buffer.height;
__context.drawImage (buffer.src, 0, 0);
var pixels = __context.getImageData (0, 0, buffer.width, buffer.height);
buffer.data = pixels.data;
}
#end
default:
case DOM (_), CANVAS (_): HTML5;
case FLASH (_): FLASH;
default: DATA;
}
}
#if flash
public static function fromBitmapData (bitmapData:BitmapData):Image {
var buffer = new ImageBuffer (null, bitmapData.width, bitmapData.height);
buffer.src = bitmapData;
return new Image (buffer);
}
#end
public static function fromBytes (bytes:ByteArray):Image {
#if (cpp || neko)
var data = lime_image_load (bytes);
if (data != null) {
var buffer = new ImageBuffer (new UInt8Array (data.data), data.width, data.height, data.bpp);
return new Image (buffer);
} else {
return null;
}
#else
throw "ImageBuffer.loadFromFile not supported on this target";
#end
}
public static function fromFile (path:String):Image {
#if (cpp || neko)
var data = lime_image_load (path);
if (data != null) {
var buffer = new ImageBuffer (new UInt8Array (data.data), data.width, data.height, data.bpp);
return new Image (buffer);
} else {
return null;
}
#else
throw "ImageBuffer.loadFromFile not supported on this target";
#end
}
#if js
public static function fromImage (image:HTMLImage):Image {
var buffer = new ImageBuffer (null, image.width, image.height);
buffer.src = image;
return new Image (buffer);
}
#end
public function getPixel (x:Int, y:Int):Int {
// TODO: cache context type?
@@ -94,18 +148,18 @@ class Image {
x += offsetX;
y += offsetY;
switch (__renderer.context) {
switch (__type) {
case OPENGL (_):
case DATA:
// TODO: handle premultiplied
var data = buffer.data;
var data = this.data;
var index = (y * buffer.width + x) * 4;
return ((data[index + 3] << 24) | (data[index] << 16 ) | (data[index + 1] << 8) | data[index + 2]);
case FLASH (_):
case FLASH:
#if flash
return buffer.src.getPixel (x, y);
@@ -113,22 +167,12 @@ class Image {
return 0;
#end
case DOM (_):
case HTML5:
// TODO
return 0;
case CANVAS (_):
// TODO
return 0;
default:
return 0;
}
@@ -140,13 +184,13 @@ class Image {
x += offsetX;
y += offsetY;
switch (__renderer.context) {
switch (__type) {
case OPENGL (_):
case DATA:
// TODO: handle premultiplied
var data = buffer.data;
var data = this.data;
var index = (y * buffer.width + x) * 4;
data[index + 3] = (value >> 24) & 0xFF;
@@ -154,22 +198,16 @@ class Image {
data[index + 1] = (value >> 8) & 0xFF;
data[index + 2] = value & 0xFF;
case FLASH (_):
case FLASH:
#if flash
buffer.src.setPixel (x, y, value);
#end
case DOM (_):
case HTML5:
// TODO
case CANVAS (_):
// TODO
default:
}
}
@@ -182,6 +220,47 @@ class Image {
private function get_data ():UInt8Array {
if (buffer.data == null && buffer.src != null && buffer.width > 0 && buffer.height > 0) {
#if js
if (__canvas == null) {
__canvas = cast Browser.document.createElement ("canvas");
__context = cast __canvas.getContext ("2d");
}
__canvas.width = width;
__canvas.height = height;
__context.drawImage (src, 0, 0);
var pixels = __context.getImageData (0, 0, buffer.width, buffer.height);
buffer.data = new UInt8Array (pixels.data);
#elseif flash
var pixels = buffer.src.getPixels (buffer.src.rect);
buffer.data = new UInt8Array (pixels);
#end
}
return buffer.data;
}
private function set_data (value:UInt8Array):UInt8Array {
return buffer.data = value;
}
private function get_powerOfTwo ():Bool {
return ((buffer.width != 0) && ((buffer.width & (~buffer.width + 1)) == buffer.width)) && ((buffer.height != 0) && ((buffer.height & (~buffer.height + 1)) == buffer.height));
@@ -208,11 +287,11 @@ class Image {
}
switch (__renderer.context) {
switch (__type) {
case OPENGL (_):
case DATA:
var data = buffer.data;
var data = this.data;
var newData = new UInt8Array (newWidth * newHeight * 4);
var sourceIndex:Int, index:Int;
@@ -236,7 +315,7 @@ class Image {
buffer.width = newWidth;
buffer.height = newHeight;
case FLASH (_):
case FLASH:
#if flash
var bitmapData = new BitmapData (newWidth, newHeight, true, 0x000000);
@@ -247,7 +326,7 @@ class Image {
buffer.height = newHeight;
#end
default:
case HTML5:
// TODO
@@ -271,9 +350,9 @@ class Image {
if (value && !buffer.premultiplied) {
switch (__renderer.context) {
switch (__type) {
case OPENGL (_):
case DATA:
var data = buffer.data;
var index, a;
@@ -309,4 +388,39 @@ class Image {
}
public function get_src ():Dynamic {
return buffer.src;
}
private function set_src (value:Dynamic):Dynamic {
return buffer.src = value;
}
// Native Methods
#if (cpp || neko)
private static var lime_image_load:Dynamic = System.load ("lime", "lime_image_load", 1);
#end
}
private enum StoreType {
DATA;
HTML5;
FLASH;
}

View File

@@ -1,16 +1,8 @@
package lime.media;
import lime.system.System;
import lime.utils.ByteArray;
import lime.utils.UInt8Array;
#if js
import js.html.Image in HTMLImage;
#elseif flash
import flash.display.BitmapData;
#end
class ImageBuffer {
@@ -19,15 +11,8 @@ class ImageBuffer {
public var data:UInt8Array;
public var height:Int;
public var premultiplied:Bool;
public var width:Int;
#if js
public var src:HTMLImage;
#elseif flash
public var src:BitmapData;
#else
public var src:Dynamic;
#end
public var width:Int;
public function new (data:UInt8Array = null, width:Int = 0, height:Int = 0, bitsPerPixel:Int = 4) {
@@ -40,81 +25,4 @@ class ImageBuffer {
}
#if flash
public static function fromBitmapData (bitmapData:BitmapData):ImageBuffer {
var buffer = new ImageBuffer (null, bitmapData.width, bitmapData.height);
buffer.src = bitmapData;
return buffer;
}
#end
public static function fromBytes (bytes:ByteArray):ImageBuffer {
#if (cpp || neko)
var data = lime_image_load (bytes);
if (data != null) {
return new ImageBuffer (new UInt8Array (data.data), data.width, data.height, data.bpp);
} else {
return null;
}
#else
throw "ImageBuffer.loadFromFile not supported on this target";
#end
}
public static function fromFile (path:String):ImageBuffer {
#if (cpp || neko)
var data = lime_image_load (path);
if (data != null) {
return new ImageBuffer (new UInt8Array (data.data), data.width, data.height, data.bpp);
} else {
return null;
}
#else
throw "ImageBuffer.loadFromFile not supported on this target";
#end
}
#if js
public static function fromImage (image:HTMLImage):ImageBuffer {
var buffer = new ImageBuffer (null, image.width, image.height);
buffer.src = image;
return buffer;
}
#end
#if (cpp || neko)
private static var lime_image_load:Dynamic = System.load ("lime", "lime_image_load", 1);
#end
}

View File

@@ -4,7 +4,7 @@ package;
import lime.app.Application;
import lime.graphics.opengl.*;
import lime.graphics.RenderContext;
import lime.media.ImageBuffer;
import lime.media.Image;
import lime.utils.Float32Array;
import lime.utils.GLUtils;
import lime.utils.Matrix4;
@@ -15,7 +15,7 @@ class Main extends Application {
private var buffer:GLBuffer;
private var image:ImageBuffer;
private var image:Image;
private var matrixUniform:GLUniformLocation;
private var program:GLProgram;
private var texture:GLTexture;
@@ -32,7 +32,7 @@ class Main extends Application {
public override function init (context:RenderContext):Void {
image = Assets.getImageBuffer ("assets/lime.png");
image = Assets.getImage ("assets/lime.png");
switch (context) {
@@ -44,10 +44,8 @@ class Main extends Application {
case DOM (element):
#if js
element.style.backgroundColor = "#" + StringTools.hex (config.background, 6);
element.appendChild (image.src);
#end
case FLASH (sprite):
@@ -119,7 +117,7 @@ class Main extends Application {
#if js
gl.texImage2D (gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image.src);
#else
gl.texImage2D (gl.TEXTURE_2D, 0, gl.RGBA, image.width, image.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, image.data);
gl.texImage2D (gl.TEXTURE_2D, 0, gl.RGBA, image.buffer.width, image.buffer.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, image.data);
#end
gl.texParameteri (gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri (gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);

View File

@@ -5,7 +5,7 @@ import haxe.Timer;
import haxe.Unserializer;
import lime.app.Preloader;
import lime.media.AudioBuffer;
import lime.media.ImageBuffer;
import lime.media.Image;
import lime.media.openal.AL;
import lime.utils.ByteArray;
import lime.utils.UInt8Array;
@@ -224,19 +224,19 @@ class DefaultAssetLibrary extends AssetLibrary {
}
public override function getImageBuffer (id:String):ImageBuffer {
public override function getImage (id:String):Image {
#if flash
return ImageBuffer.fromBitmapData (cast (Type.createInstance (className.get (id), []), BitmapData));
return Image.fromBitmapData (cast (Type.createInstance (className.get (id), []), BitmapData));
#elseif js
return ImageBuffer.fromImage (Preloader.images.get (path.get (id)));
return Image.fromImage (Preloader.images.get (path.get (id)));
#else
return ImageBuffer.fromFile (path.get (id));
return Image.fromFile (path.get (id));
#end
@@ -439,7 +439,7 @@ class DefaultAssetLibrary extends AssetLibrary {
}
public override function loadImageBuffer (id:String, handler:ImageBuffer -> Void):Void {
public override function loadImage (id:String, handler:Image -> Void):Void {
#if flash
@@ -449,20 +449,20 @@ class DefaultAssetLibrary extends AssetLibrary {
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, function (event:Event) {
var bitmapData = cast (event.currentTarget.content, Bitmap).bitmapData;
handler (ImageBuffer.fromBitmapData (bitmapData));
handler (Image.fromBitmapData (bitmapData));
});
loader.load (new URLRequest (path.get (id)));
} else {
handler (getImageBuffer (id));
handler (getImage (id));
}
#else
handler (getImageBuffer (id));
handler (getImage (id));
#end