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