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