UNPKG

w-vue-dusion-keyboard-master

Version:

基于vue.js的web键盘,支持离线模式。

116 lines (94 loc) 4.2 kB
var handWrite = undefined if (window.require) { const ffi = window.require('ffi'); const ref = window.require('ref'); const p_uchar = ref.refType('uchar'); const iconv = window.require('iconv-lite') var _dll = null; const path = { CN_path: "plug\\handWrite\\hz.mrd", EN_path: "plug\\handWrite\\English.mrd" } try { _dll = ffi.Library('plug\\handWrite\\XDLL.dll', { 'ZZ_CreateLib': ['int', ['string', 'int', 'string']], 'ZZ_RecgTuxg': ['int', ['int', p_uchar, p_uchar, p_uchar, p_uchar, p_uchar, 'int', p_uchar, p_uchar, 'int', p_uchar, p_uchar]], 'ZZ_DeleteLib': ['int', []], }); handWrite = {} /**加载文字库 */ handWrite.createLib = function (lib) { return new Promise(function (success, fail) { try { var deleteLib = _dll.ZZ_DeleteLib(); var create_result = _dll.ZZ_CreateLib("47497DB3-6FA0-4FC5-9EB8-868DA935FB96", 0, path[lib + '_path']) success(create_result) } catch (error) { fail(error) } }) } function shortsToPtr(buffer, shorts) { buffer.type = ref.types.uchar; for (let i = 0; i < shorts.length; i += 2) { buffer.writeInt16LE(shorts[i], i); } } //这些变量是dll需要用到的内存指针,定义在全局防止被CG var zcsids = Buffer.alloc(64); zcsids.writeInt32LE(5, 0); zcsids.writeInt32LE(7, 4); var subRectCbn = ref.alloc(ref.types.uchar, 0) var ms_lpCodes = Buffer.alloc(48); ms_lpCodes.types = ref.types.uchar; var ms_lpPssbs = Buffer.alloc(48); ms_lpPssbs.types = ref.types.uchar; var lp16TestLongsCbz = Buffer.alloc(3072 * 4); lp16TestLongsCbz.types = ref.types.uchar; /** * 获取候选文字 * 参数:lpXis, lpYis:关键点数组;lpCis:标志位数组,每一笔的最后一个关键点为1,其余为0 * 返回:候选字数组 */ handWrite.GetWords = function (lpXis, lpYis, lpCis) { return new Promise(function (success, fail) { try { if (!lpXis || !lpYis || !lpCis) { fail("缺少参数") } if (!(lpXis.length === lpYis.length && lpXis.length === lpCis.length)) { fail("参数长度不一致") } var lpXisBuffer = Buffer.alloc(3072 * 2); var lpYisBuffer = Buffer.alloc(3072 * 2); var lpCisBuffer = Buffer.alloc(3072 * 2); shortsToPtr(lpXisBuffer, lpXis); shortsToPtr(lpYisBuffer, lpYis); shortsToPtr(lpCisBuffer, lpCis); var sResult = Buffer.alloc(3072 * 4); sResult.types = ref.types.uchar; _dll.ZZ_RecgTuxg.async(0, zcsids, subRectCbn, lpXisBuffer, lpYisBuffer, lpCisBuffer, lpXis.length, ms_lpCodes, ms_lpPssbs, 12, sResult, lp16TestLongsCbz, err => { // console.log(ms_lpCodes); var result = [] for (let i = 0; i < ms_lpCodes.length; i += 4) { let readint = ms_lpCodes.readInt32LE(i) if (readint < 19968) { result.push(iconv.decode(ms_lpCodes.slice(i, i + 1), 'utf8')) } else { result.push(unescape("%u" + readint.toString(16))); } } success(result); }) } catch (error) { fail(error) } }) } } catch (error) { console.error(error); } } else { console.error("手写模块已关闭,请在electron环境下运行或添加互联网接口地址\'hand-write-api\'"); } export default handWrite