123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- const Fs = require('fs');
- const { dialog } = require('electron').remote;
- Editor.Panel.extend({
- style: Fs.readFileSync(Editor.url('packages://bitmapfont/panel/index.css', 'utf8')),
- template: Fs.readFileSync(Editor.url('packages://bitmapfont/panel/index.html', 'utf8')),
- $: {
- fontCanvas: "#fontCanvas"
- },
- ready() {
- let self = this;
- this.plugin = new window.Vue({
- el: this.shadowRoot,
- data() {
- return {
- filePath: "",
- imageList: [],
- updateImageList: [],
- canvasWidth: 256,
- canvasHeight: 256,
- fontInfo: '',
- }
- },
- methods: {
- dragEnter(e) {
- e.stopPropagation();
- e.preventDefault();
- },
- dragOver(e) {
- e.stopPropagation();
- e.preventDefault();
- },
- onDrop(e) {
- this.removeAll();
- this.canvasWidth = 256;
- this.canvasHeight = 256;
- e.stopPropagation();
- e.preventDefault();
- let dt = e.dataTransfer;
- let files = dt.files;
- this.showImgData(files);
- },
- showImgData(files) {
- let that = this;
- if (files.length) {
- let successCount = 0;
- for (var i = 0; i < files.length; i++) {
- let file = files[i];
- if (!/^image\//.test(file.type)) continue;
- let fileReader = new FileReader();
- fileReader.onload = (function() {
- return function(e) {
- if (that.updateImageList.indexOf(e.target.result) !== -1) return;
- var img = new Image();
- img.src = e.target.result;
- img.onload = () => {
- let fileName = file.name.split('.')[0];
- that.imageList.push({
- img: e.target.result,
- char: fileName.substr(fileName.length - 1, 1),
- width: img.width,
- height: img.height,
- x: 0,
- y: 0,
- });
- that.updateImageList.push(e.target.result);
- that.updateCanvas(null, (maxX, maxY) => {
- successCount++;
- if (successCount >= files.length) {
- that.canvasWidth = maxX + 2;
- that.canvasHeight = maxY;
- setTimeout(() => {
- that.updateCanvas(null)
- }, 10)
- }
- });
- };
- };
- })();
- fileReader.readAsDataURL(file);
- }
- }
- },
- updateCanvas(data, func) {
- if (!this.imageList.length) return;
- let that = this;
- let height = 0;
- let space = 2;
- let x = space;
- let y = space;
- let maxX = x;
- let maxY = y;
- this.imageList.forEach(img => {
- if (img.height > height) height = img.height;
- });
- height = Math.ceil(height);
- this.fontSize = height;
- let content = self.$fontCanvas.getContext('2d');
- content.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
- this.imageList.forEach(img2 => {
- let img = new Image();
- img.src = img2.img;
- if (x + img2.width + space > that.canvasWidth) {
- y += height + space;
- if (y + height + space > that.canvasHeight) {
- that.canvasWidth += (x + img2.width + space);
- that.canvasHeight += y;
- }
- x = space;
- }
- content.drawImage(img, x, y);
- img2.x = x;
- img2.y = y;
- x += img2.width + space;
- if (maxX < x) {
- maxX = x;
- }
- if (maxY < y + height + space) {
- maxY = y + height + space;
- }
- });
- func && func(maxX, maxY);
- },
- loadFileData() {
- let str = `info size=${this.fontSize} unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
- common lineHeight=${this.fontSize} base=23 scaleW=${this.canvasWidth} scaleH=${this.canvasHeight} pages=1 packed=0
- page id=0 file="${this.fontName}.png"
- chars count=${this.imageList.length}`;
- this.imageList.forEach(img => {
- str += `char id=${this.caseConvertEasy(img.char).charCodeAt(0)} x=${img.x} y=${img.y} width=${img.width} height=${img.height} xoffset=0 yoffset=0 xadvance=${img.width} \n`;
- })
- this.fontInfo = str;
- },
- caseConvertEasy(str) {
- return str.split('').map(s => {
- if (s.charCodeAt() <= 90) {
- return s.toUpperCase()
- }
- return s.toLowerCase()
- }).join('')
- },
- removeAll() {
- this.imageList = [];
- this.updateImageList = [];
- this.updateCanvas();
- },
- save() {
- this.selectFolder(() => {
- this.loadFileData();
- this.savePng();
- this.saveFnt();
- })
- },
- selectFolder(func) {
- let self = this;
- Editor.Scene.callSceneScript('bitmapfont', 'getCocosVersion', function(err, version) {
- let result = self.compareVersion(version, "2.4.5");
- Editor.log("版本号: ", version, "结果", result);
- if (result >= 0) { //大于等于2.4.5版本
- dialog.showSaveDialog({ properties: ['openDirectory'] }).then(result => {
- let fontPath = result.filePath;
- Editor.log("保存路径: ", fontPath);
- self.selectSuccess(fontPath, func);
- }).catch(err => {
- Editor.log(err)
- })
- } else { //
- let fontPath = dialog.showSaveDialog({ properties: ['openDirectory', ] });
- Editor.log("保存路径: ", fontPath);
- self.selectSuccess(fontPath, func);
- }
- });
- },
- compareVersion(v1, v2) {
- let vers1 = v1.split('.');
- let vers2 = v2.split('.');
- const len = Math.max(v1.length, v2.length)
- while (vers1.length < len) {
- vers1.push('0')
- }
- while (vers2.length < len) {
- vers2.push('0')
- }
- for (let i = 0; i < len; i++) {
- const num1 = parseInt(vers1[i])
- const num2 = parseInt(vers2[i])
- if (num1 > num2) {
- return 1
- } else if (num1 < num2) {
- return -1
- }
- }
- return 0
- },
- selectSuccess(fontPath, func) {
- if (fontPath) {
- var agent = navigator.userAgent.toLowerCase();
- let fontArr = [];
- var isMac = /macintosh|mac os x/i.test(navigator.userAgent);
- /**32或者64位 windoiws系统 */
- let isWindows = (agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0) || (agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0)
- if (isWindows) {
- fontArr = fontPath.split("\\");
- }
- if (isMac) {
- fontArr = fontPath.split("/");
- }
- this.fontName = fontArr[fontArr.length - 1];
- this.filePath = fontPath.replace("\\" + this.fontName, "");
- if (this.filePath) {
- Editor.log("选择完成,保存中");
- func();
- }
- }
- },
- saveFnt() {
- Fs.writeFileSync(this.filePath.replace(/\\/g, "/") + '/' + this.fontName + '.fnt', this.fontInfo);
- },
- savePng() {
- let src = self.$fontCanvas.toDataURL("image/png");
- let data = src.replace(/^data:image\/\w+;base64,/, "");
- let buffer = new window.Buffer(data, 'base64');
- Fs.writeFileSync(this.filePath.replace(/\\/g, "/") + '/' + this.fontName + '.png', buffer);
- Editor.log("保存成功");
- }
- }
- })
- },
- });
|