Skip to content

Commit

Permalink
adds function to wrap the codes genarated from emscripten
Browse files Browse the repository at this point in the history
  • Loading branch information
seikichi committed Nov 10, 2013
1 parent 5ed26b6 commit ae3f7c0
Show file tree
Hide file tree
Showing 11 changed files with 264 additions and 192 deletions.
17 changes: 13 additions & 4 deletions README.md
@@ -1,7 +1,10 @@
# tiff.js
tiff.js is a port of LibTIFF by compiling the LibTIFF C code with Emscripten.

See [demo](http://seikichi.github.io/tiff.js).
## Demo
- views small TIFF files
- views a large TIFF file using a web worker
- views a multipage TIFF file

## Usage
Use tiff.min.js:
Expand All @@ -11,8 +14,8 @@ Use tiff.min.js:
xhr.open('GET', "tiff-image-url");
xhr.onload = function (e) {
var tiff = new Tiff({buffer: xhr.response});
var width = tiff.width());
var height = tiff.height());
var width = tiff.width();
var height = tiff.height();
console.log('width:', width);
console.log('height:', height);
var arrayBuffer = tiff.readRGBAImage();
Expand All @@ -33,9 +36,15 @@ Use tiff.min.js:
return canvas;
}

## API
see tiff.d.ts

## Note
- This library does not support JPEG-based compressed TIFF image files
- This library does not support JPEG-based compressed TIFF files
-- I failed to link a JPEG library ...
- When you load large tiff file, you will see the error message "Cannot enlarge memory arrays in asm.js"

-- TIFFOpen, TIFFClose, TIFFGetField, TIFFReadRGBAImage, TIFFSetDirectory, TIFFCurrentDirectory, TIFFLastDirectory

## License
LibTIFF is LibTIFF Software License, zlib and additional code are zlib License.
14 changes: 7 additions & 7 deletions build.sh
@@ -1,20 +1,19 @@
#!/bin/bash

TOTAL_MEMORY=16777216
export EMCC_CFLAGS="-O2"
ZLIB_PKGVER=1.2.8
LIBTIFF_PKGVER=4.0.3

# build zlib
# wget http://zlib.net/current/zlib-${ZLIB_PKGVER}.tar.gz
wget http://zlib.net/current/zlib-${ZLIB_PKGVER}.tar.gz
tar xf zlib-${ZLIB_PKGVER}.tar.gz
cd zlib-${ZLIB_PKGVER}
emconfigure ./configure
emmake make
cd ..

# build libtiff
# wget http://download.osgeo.org/libtiff/tiff-${LIBTIFF_PKGVER}.tar.gz
wget http://download.osgeo.org/libtiff/tiff-${LIBTIFF_PKGVER}.tar.gz
tar xzvf tiff-${LIBTIFF_PKGVER}.tar.gz
cd tiff-${LIBTIFF_PKGVER}
# see: https://github.com/kripken/emscripten/issues/662
Expand All @@ -25,7 +24,8 @@ emmake make
cd ..

emcc -o tiff.raw.js \
-s TOTAL_MEMORY=$TOTAL_MEMORY \
--pre-js pre.js \
--post-js post.js \
-s EXPORTED_FUNCTIONS="["\
"'_TIFFOpen',"\
"'_TIFFClose',"\
Expand All @@ -50,12 +50,12 @@ grep '^#define[[:space:]]\+TIFFTAG_[A-Za-z_]\+[[:space:]]\+' \
>> tiff_tag.ts
echo '};' >> tiff_tag.ts

tsc emscripten.d.ts cwrap.ts tiff_tag.ts tiff_api.ts -d
tsc emscripten.d.ts tiff_tag.ts tiff_api.ts -d
cat LICENSE tiff.raw.js > tiff.js
echo '' >> tiff.js
cat cwrap.js tiff_tag.js tiff_api.js >> tiff.js
cat tiff_tag.js tiff_api.js >> tiff.js
mv tiff_api.d.ts tiff.d.ts
rm -f tiff_tag.d.ts cwrap.d.ts tiff_tag.js tiff_api.js cwrap.js
rm -f tiff_tag.d.ts tiff_tag.js tiff_api.js

closure-compiler \
--js=tiff.js \
Expand Down
37 changes: 0 additions & 37 deletions cwrap.ts

This file was deleted.

11 changes: 2 additions & 9 deletions demo/1.html
Expand Up @@ -5,7 +5,7 @@
</head>
<body>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="../tiff.min.js"></script>
<script src="../tiff.js"></script>
<script type="text/javascript">
$(function () {
var imageFiles = [
Expand All @@ -27,16 +27,9 @@
xhr.onload = function (e) {
var buffer = xhr.response;
var tiff = new Tiff({buffer: buffer});
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var canvas = tiff.toCanvas();
var width = tiff.width();
var height = tiff.height();
canvas.width = width;
canvas.height = height;
var imageData = context.createImageData(width, height);
var image = new Uint8Array(tiff.readRGBAImage());
imageData.data.set(image);
context.putImageData(imageData, 0, 0);
if (canvas) {
var $elem = $('<div><div><a href="' + filename + '">' +
filename +
Expand Down
13 changes: 10 additions & 3 deletions demo/2.html
Expand Up @@ -5,9 +5,10 @@
</head>
<body>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="../tiff.min.js"></script>
<script src="../tiff.js"></script>
<script type="text/javascript">
$(function () {
Tiff.initialize({ TOTAL_MEMORY: 16777216 * 30});
var imageFiles = [ '4838.tiff' ];

var loadImage = function (filename) {
Expand All @@ -16,9 +17,15 @@
xhr.responseType = 'arraybuffer';
xhr.onload = function (e) {
var buffer = xhr.response;
var canvas = new Tiff(buffer).toCanvas();
var tiff = new Tiff({buffer: buffer});
var canvas = tiff.toCanvas();
var width = tiff.width();
var height = tiff.height();
if (canvas) {
var $elem = $('<div><div><a href="' + filename + '">' + filename + '</a></div></div>');
var $elem = $('<div><div><a href="' + filename + '">' +
filename +
' (width: ' + width + ', height:' + height + ')' +
'</a></div></div>');
$elem.append(canvas);
$('body').append($elem);
}
Expand Down
130 changes: 53 additions & 77 deletions emscripten.d.ts
@@ -1,81 +1,57 @@
declare var HEAP8: Int8Array;
declare var HEAP16: Int16Array;
declare var HEAP32: Int32Array;
declare var HEAPU8: Uint8Array;
declare var HEAPU16: Uint16Array;
declare var HEAPU32: Uint32Array;
declare var HEAPF32: Float32Array;
declare var HEAPF64: Float64Array;
declare var STACKTOP: number;

declare function ccall(ident: string,
returnType: string,
argTypes: string[],
args: any[]): any;
declare function cwrap(ident: string,
returnType: string,
argTypes: string[]): (...args: any[]) => any;
declare function setValue(ptr: number, value: number, type: string): void;
declare function getValue(ptr: number, type: string): number;
declare function Pointer_stringify(ptr: number): string;

declare module FS {
interface Object {}
function deleteFile(path: string): void;
function createFolder(parent: string, name: string,
canRead: boolean, canWrite: boolean): Object
function createFolder(parent: Object, name: string,
canRead: boolean, canWrite: boolean): Object
function createPath(parent: string, name: string,
canRead: boolean, canWrite: boolean): Object;
function createPath(parent: Object, name: string,
canRead: boolean, canWrite: boolean): Object;
function createDataFile(parent: string, name: string, data: any,
canRead: boolean, canWrite: boolean): Object;
function createDataFile(parent: Object, name: string, data: any,
canRead: boolean, canWrite: boolean): Object;
function createLazyFile(parent: string, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createLazyFile(parent: Object, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createPreloadedFile(parent: string, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createPreloadedFile(parent: Object, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createLink(parent: string, name: string, target: string,
canRead: boolean, canWrite: boolean): Object;
function createLink(parent: Object, name: string, target: string,
canRead: boolean, canWrite: boolean): Object;
function createDevice(parent: string, name: string,
input?: () => number,
output?: (arg: number) => void): Object;
function createDevice(parent: Object, name: string,
input?: () => number,
output?: (arg: number) => void): Object;
}

declare module Module {
var ccall: typeof ccall;
var cwrap: typeof cwrap;
var setValue: typeof setValue;
var getValue: typeof getValue;
var Pointer_stringify: typeof Pointer_stringify;
var HEAP8: Int8Array;
var HEAP16: Int16Array;
var HEAP32: Int32Array;
var HEAPU8: Uint8Array;
var HEAPU16: Uint16Array;
var HEAPU32: Uint32Array;
var HEAPF32: Float32Array;
var HEAPF64: Float64Array;
var STACKTOP: number;

var FS: typeof FS;
var FS_createFolder: typeof FS.createFolder;
var FS_createPath: typeof FS.createPath;
var FS_createDataFile: typeof FS.createDataFile;
var FS_createPreloadedFile: typeof FS.createPreloadedFile;
var FS_createLazyFile: typeof FS.createLazyFile;
var FS_createLink: typeof FS.createLink;
var FS_createDevice: typeof FS.createDevice;
function ccall(ident: string,
returnType: string,
argTypes: string[],
args: any[]): any;
function cwrap(ident: string,
returnType: string,
argTypes: string[]): (...args: any[]) => any;
function setValue(ptr: number, value: number, type: string): void;
function getValue(ptr: number, type: string): number;
function Pointer_stringify(ptr: number): string;

var HEAP8: typeof HEAP8;
var HEAP16: typeof HEAP16;
var HEAP32: typeof HEAP32
var HEAPU8: typeof HEAPU8;
var HEAPU16: typeof HEAPU16;
var HEAPU32: typeof HEAPU32;
var HEAPF32: typeof HEAPF32;
var HEAPF64: typeof HEAPF64;
module FS {
interface Object {}
function deleteFile(path: string): void;
function createFolder(parent: string, name: string,
canRead: boolean, canWrite: boolean): Object
function createFolder(parent: Object, name: string,
canRead: boolean, canWrite: boolean): Object
function createPath(parent: string, name: string,
canRead: boolean, canWrite: boolean): Object;
function createPath(parent: Object, name: string,
canRead: boolean, canWrite: boolean): Object;
function createDataFile(parent: string, name: string, data: any,
canRead: boolean, canWrite: boolean): Object;
function createDataFile(parent: Object, name: string, data: any,
canRead: boolean, canWrite: boolean): Object;
function createLazyFile(parent: string, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createLazyFile(parent: Object, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createPreloadedFile(parent: string, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createPreloadedFile(parent: Object, name: string, url: string,
canRead: boolean, canWrite: boolean): Object;
function createLink(parent: string, name: string, target: string,
canRead: boolean, canWrite: boolean): Object;
function createLink(parent: Object, name: string, target: string,
canRead: boolean, canWrite: boolean): Object;
function createDevice(parent: string, name: string,
input?: () => number,
output?: (arg: number) => void): Object;
function createDevice(parent: Object, name: string,
input?: () => number,
output?: (arg: number) => void): Object;
}
}
2 changes: 2 additions & 0 deletions post.js
@@ -0,0 +1,2 @@
return Module;
};
5 changes: 5 additions & 0 deletions pre.js
@@ -0,0 +1,5 @@
var loadModule = function (options) {
var Module = {};
if ('TOTAL_MEMORY' in options) {
Module['TOTAL_MEMORY'] = options['TOTAL_MEMORY'];
}
9 changes: 8 additions & 1 deletion tiff.d.ts
@@ -1,7 +1,9 @@
declare class Tiff {
private static uniqueIdForFileName;
private _filename;
private _tiffPtr;
private static uniqueIdForFileName;
private static Module;
static initialize(options: Tiff.InitializeOptions): void;
constructor(params: Tiff.Params);
public width(): number;
public height(): number;
Expand All @@ -10,12 +12,17 @@ declare class Tiff {
public setDirectory(index: number): void;
public getField(tag: number): number;
public readRGBAImage(): ArrayBuffer;
public toCanvas(): HTMLCanvasElement;
public toDataURL(): string;
public close(): void;
private static createUniqueFileName();
private static createFileSystemObjectFromURL(url);
private static createFileSystemObjectFromBuffer(buffer);
}
declare module Tiff {
interface InitializeOptions {
TOTAL_MEMORY?: number;
}
interface Params {
url?: string;
buffer?: ArrayBuffer;
Expand Down

0 comments on commit ae3f7c0

Please sign in to comment.