241 lines
7.3 KiB
JavaScript
241 lines
7.3 KiB
JavaScript
|
const isWeex = typeof WXEnvironment !== 'undefined';
|
||
|
const isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform);
|
||
|
const isWeexAndroid = isWeex && !isWeexIOS;
|
||
|
|
||
|
import GLmethod from '../context-webgl/GLmethod';
|
||
|
|
||
|
const GCanvasModule =
|
||
|
(typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) :
|
||
|
(typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {};
|
||
|
|
||
|
let isDebugging = false;
|
||
|
|
||
|
let isComboDisabled = false;
|
||
|
|
||
|
const logCommand = (function () {
|
||
|
const methodQuery = [];
|
||
|
Object.keys(GLmethod).forEach(key => {
|
||
|
methodQuery[GLmethod[key]] = key;
|
||
|
})
|
||
|
const queryMethod = (id) => {
|
||
|
return methodQuery[parseInt(id)] || 'NotFoundMethod';
|
||
|
}
|
||
|
const logCommand = (id, cmds) => {
|
||
|
const mId = cmds.split(',')[0];
|
||
|
const mName = queryMethod(mId);
|
||
|
console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`);
|
||
|
}
|
||
|
return logCommand;
|
||
|
})();
|
||
|
|
||
|
function joinArray(arr, sep) {
|
||
|
let res = '';
|
||
|
for (let i = 0; i < arr.length; i++) {
|
||
|
if (i !== 0) {
|
||
|
res += sep;
|
||
|
}
|
||
|
res += arr[i];
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
const commandsCache = {}
|
||
|
|
||
|
const GBridge = {
|
||
|
|
||
|
callEnable: (ref, configArray) => {
|
||
|
|
||
|
commandsCache[ref] = [];
|
||
|
|
||
|
return GCanvasModule.enable({
|
||
|
componentId: ref,
|
||
|
config: configArray
|
||
|
});
|
||
|
},
|
||
|
|
||
|
callEnableDebug: () => {
|
||
|
isDebugging = true;
|
||
|
},
|
||
|
|
||
|
callEnableDisableCombo: () => {
|
||
|
isComboDisabled = true;
|
||
|
},
|
||
|
|
||
|
callSetContextType: function (componentId, context_type) {
|
||
|
GCanvasModule.setContextType(context_type, componentId);
|
||
|
},
|
||
|
|
||
|
callReset: function(id){
|
||
|
GCanvasModule.resetComponent && canvasModule.resetComponent(componentId);
|
||
|
},
|
||
|
|
||
|
render: isWeexIOS ? function (componentId) {
|
||
|
return GCanvasModule.extendCallNative({
|
||
|
contextId: componentId,
|
||
|
type: 0x60000001
|
||
|
});
|
||
|
} : function (componentId) {
|
||
|
return callGCanvasLinkNative(componentId, 0x60000001, 'render');
|
||
|
},
|
||
|
|
||
|
render2d: isWeexIOS ? function (componentId, commands, callback) {
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> >>> render2d ===');
|
||
|
console.log('>>> commands: ' + commands);
|
||
|
}
|
||
|
|
||
|
GCanvasModule.render([commands, callback?true:false], componentId, callback);
|
||
|
|
||
|
} : function (componentId, commands,callback) {
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> >>> render2d ===');
|
||
|
console.log('>>> commands: ' + commands);
|
||
|
}
|
||
|
|
||
|
callGCanvasLinkNative(componentId, 0x20000001, commands);
|
||
|
if(callback){
|
||
|
callback();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) {
|
||
|
|
||
|
throw 'should not be here anymore ' + cmdArgs;
|
||
|
|
||
|
} : function (componentId, cmdArgs) {
|
||
|
|
||
|
throw 'should not be here anymore ' + cmdArgs;
|
||
|
|
||
|
},
|
||
|
|
||
|
|
||
|
flushNative: isWeexIOS ? function (componentId) {
|
||
|
|
||
|
const cmdArgs = joinArray(commandsCache[componentId], ';');
|
||
|
commandsCache[componentId] = [];
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> >>> flush native ===');
|
||
|
console.log('>>> commands: ' + cmdArgs);
|
||
|
}
|
||
|
|
||
|
const result = GCanvasModule.extendCallNative({
|
||
|
"contextId": componentId,
|
||
|
"type": 0x60000000,
|
||
|
"args": cmdArgs
|
||
|
});
|
||
|
|
||
|
const res = result && result.result;
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> result: ' + res);
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
|
||
|
} : function (componentId) {
|
||
|
|
||
|
const cmdArgs = joinArray(commandsCache[componentId], ';');
|
||
|
commandsCache[componentId] = [];
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> >>> flush native ===');
|
||
|
console.log('>>> commands: ' + cmdArgs);
|
||
|
}
|
||
|
|
||
|
const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs);
|
||
|
|
||
|
if (isDebugging) {
|
||
|
console.log('>>> result: ' + result);
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
callNative: function (componentId, cmdArgs, cache) {
|
||
|
|
||
|
if (isDebugging) {
|
||
|
logCommand(componentId, cmdArgs);
|
||
|
}
|
||
|
|
||
|
commandsCache[componentId].push(cmdArgs);
|
||
|
|
||
|
if (!cache || isComboDisabled) {
|
||
|
return GBridge.flushNative(componentId);
|
||
|
} else {
|
||
|
return undefined;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
texImage2D(componentId, ...args) {
|
||
|
if (isWeexIOS) {
|
||
|
if (args.length === 6) {
|
||
|
const [target, level, internalformat, format, type, image] = args;
|
||
|
GBridge.callNative(
|
||
|
componentId,
|
||
|
GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src
|
||
|
)
|
||
|
} else if (args.length === 9) {
|
||
|
const [target, level, internalformat, width, height, border, format, type, image] = args;
|
||
|
GBridge.callNative(
|
||
|
componentId,
|
||
|
GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' +
|
||
|
+ format + ',' + type + ',' + (image ? image.src : 0)
|
||
|
)
|
||
|
}
|
||
|
} else if (isWeexAndroid) {
|
||
|
if (args.length === 6) {
|
||
|
const [target, level, internalformat, format, type, image] = args;
|
||
|
GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src);
|
||
|
} else if (args.length === 9) {
|
||
|
const [target, level, internalformat, width, height, border, format, type, image] = args;
|
||
|
GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0));
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) {
|
||
|
if (isWeexIOS) {
|
||
|
if (arguments.length === 8) {
|
||
|
GBridge.callNative(
|
||
|
componentId,
|
||
|
GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src
|
||
|
)
|
||
|
}
|
||
|
} else if (isWeexAndroid) {
|
||
|
GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
bindImageTexture(componentId, src, imageId) {
|
||
|
GCanvasModule.bindImageTexture([src, imageId], componentId);
|
||
|
},
|
||
|
|
||
|
perloadImage([url, id], callback) {
|
||
|
GCanvasModule.preLoadImage([url, id], function (image) {
|
||
|
image.url = url;
|
||
|
image.id = id;
|
||
|
callback(image);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
measureText(text, fontStyle, componentId) {
|
||
|
return GCanvasModule.measureText([text, fontStyle], componentId);
|
||
|
},
|
||
|
|
||
|
getImageData (componentId, x, y, w, h, callback) {
|
||
|
GCanvasModule.getImageData([x, y,w,h],componentId,callback);
|
||
|
},
|
||
|
|
||
|
putImageData (componentId, data, x, y, w, h, callback) {
|
||
|
GCanvasModule.putImageData([x, y,w,h,data],componentId,callback);
|
||
|
},
|
||
|
|
||
|
toTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){
|
||
|
GCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default GBridge;
|