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;
							 |