blob: 48be63db54f312a2339e87a0b1c85e29cdc40377 [file] [log] [blame]
/*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global app, bm_eventDispatcher, bm_projectManager, bm_shapeHelper, bm_renderManager, ParagraphJustification, bm_generalUtils*/
var bm_textShapeHelper = (function () {
'use strict';
var ob = {}, chars = [], comp, fontComp, dupl, boxText, layers = [], currentFont, compsAddedFlag = false;
function reset() {
chars.length = 0;
layers.length = 0;
currentFont = '';
compsAddedFlag = false;
}
function addComps() {
if (compsAddedFlag) {
return;
}
compsAddedFlag = true;
comp = app.project.items.addComp('bm_charHelper', 1000, 1000, 1, 1, 1);
fontComp = app.project.items.addComp('bm_fontHelper', 1000, 1000, 1, 1, 1);
boxText = fontComp.layers.addBoxText([500, 500], 'm');
dupl = comp.layers.addText();
var textProp = dupl.property("Source Text");
var textDocument = textProp.value;
textDocument.fontSize = 100;
textDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
textProp.setValue(textDocument);
var fontProp = dupl.property("Source Text");
var fontDocument = fontProp.value;
fontDocument.fontSize = 100;
fontDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
fontProp.setValue(fontDocument);
}
function addTextLayer(layer) {
layers.push(layer);
}
function addChar(ch, size, font, style) {
var i = 0, charData, len = chars.length;
while (i < len) {
if (chars[i].ch === ch && chars[i].font === font && chars[i].style === style) {
return false;
}
i += 1;
}
charData = {
ch: ch,
size: size,
font: font,
style: style
};
chars.push(charData);
return charData;
}
function resetProp(p, def) {
if (!p) {
return;
}
if (p.isModified) {
if (p.expression !== "") {
p.expression = "";
}
while (p.numKeys > 0) {
p.removeKey(1);
}
p.setValue(def);
}
return;
}
function removeLayerAnimators(textLayer) {
var layerInfo = textLayer.property("Text");
var i, len = layerInfo.numProperties;
for (i = 0; i < len; i += 1) {
if (layerInfo.property(i + 1).matchName === "ADBE Text Animators") {
var animatorInfo = layerInfo.property(i + 1);
var j, jLen = animatorInfo.numProperties;
for (j = 0; j < jLen; j += 1) {
if (animatorInfo.property(j + 1).matchName === "ADBE Text Animator") {
animatorInfo.property(j + 1).remove();
j -= 1;
jLen -= 1;
}
}
}
}
if ((textLayer.mask && textLayer.mask.numProperties > 0)) {
textLayer.mask(1).remove();
}
resetProp(textLayer.transform.position, [0, 0, 0]);
resetProp(textLayer.transform.rotation, 0);
}
function createNewChar(layerInfo, ch, charData) {
//"allCaps","applyFill","applyStroke","baselineLocs","baselineShift","boxText","boxTextPos","boxTextSize","fauxBold","fauxItalic","fillColor","font","fontFamily","fontLocation","fontSize","fontStyle","horizontalScale","justification","pointText","resetCharStyle","resetParagraphStyle","smallCaps","strokeColor","strokeOverFill","strokeWidth","subscript","superscript","text","tracking","tsume","verticalScale"
if (ch.charCodeAt(0) === 13) {
return;
}
var shapeLayer;
var l, lLen;
var cmdID = bm_projectManager.getCommandID('shapesFromText');
layerInfo.copyToComp(comp);
var originalTextDocument = layerInfo.property('Source Text').value;
//var dupl = comp.layers[1];
//var dupl = comp.layers.addText();
//removeLayerAnimators(dupl);
var textProp = dupl.property("Source Text");
var textDocument = textProp.value;
if (ch !== ' ') {
textDocument.text = ch + ch;
} else {
textDocument.text = 'i i';
}
textDocument.font = originalTextDocument.font;
textDocument.fontSize = 100;
textDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
textProp.setValue(textDocument);
dupl.enabled = true;
dupl.selected = true;
if (ch !== ' ') {
app.executeCommand(cmdID);
}
dupl.selected = false;
var doubleSize, singleSize;
doubleSize = dupl.sourceRectAtTime(0, false).width;
if (ch !== ' ') {
textDocument.text = ch;
} else {
textDocument.text = 'ii';
}
textProp.setValue(textDocument);
singleSize = dupl.sourceRectAtTime(0, false).width;
charData.w = bm_generalUtils.roundNumber(doubleSize - singleSize, 2);
shapeLayer = comp.layers[1];
charData.data = {};
if (ch !== ' ') {
bm_shapeHelper.exportShape(shapeLayer, charData.data, 1, true);
lLen = charData.data.shapes[0].it.length;
for (l = 0; l < lLen; l += 1) {
var ks = charData.data.shapes[0].it[l].ks;
if (ks) {
var k, kLen = ks.k.i.length;
for (k = 0; k < kLen; k += 1) {
ks.k.i[k][0] += ks.k.v[k][0];
ks.k.i[k][1] += ks.k.v[k][1];
ks.k.o[k][0] += ks.k.v[k][0];
ks.k.o[k][1] += ks.k.v[k][1];
}
} else {
charData.data.shapes[0].it.splice(l, 1);
l -= 1;
lLen -= 1;
}
}
}
shapeLayer.selected = false;
}
function exportChars(fonts) {
comp.openInViewer();
var layerCollection = comp.layers;
var i, len = layers.length, layerInfo;
for (i = 0; i < len; i += 1) {
layerInfo = layers[i];
var textProp = layerInfo.property("Source Text");
var textDocument = textProp.value;
var font = textDocument.font;
var fontFamily = textDocument.fontFamily;
var fontStyle = textDocument.fontStyle;
var fontSize = textDocument.fontSize;
var text = textDocument.allCaps ? textDocument.text.toUpperCase() : textDocument.text;
var j, jLen = text.length;
if (currentFont !== font) {
currentFont = font;
createNewChar(layerInfo, '[]', {});
}
var l, lLen;
for (j = 0; j < jLen; j += 1) {
var ch = text.substr(j, 1);
var charData = addChar(ch, fontSize, font, fontStyle);
if (charData !== false) {
createNewChar(layerInfo, ch, charData);
l = 0;
lLen = fonts.list.length;
while (l < lLen) {
if (fonts.list[l].fName === charData.font) {
charData.fFamily = fonts.list[l].fFamily;
break;
}
l += 1;
}
}
}
}
bm_renderManager.setChars(chars);
}
function exportFonts(fonts) {
fontComp.openInViewer();
var i, len = fonts.list.length, rect;
var fontProp = boxText.property("Source Text");
var fontDocument = fontProp.value;
fontDocument.text = 'm';
for (i = 0; i < len; i += 1) {
fontDocument.font = fonts.list[i].fName;
fontDocument.fontSize = 100;
fontProp.setValue(fontDocument);
rect = boxText.sourceRectAtTime(0, false);
fonts.list[i].ascent = 250 + rect.top + rect.height;
}
}
function removeComps() {
if (compsAddedFlag) {
comp.remove();
fontComp.remove();
compsAddedFlag = false;
}
}
ob.reset = reset;
ob.addChar = addChar;
ob.addTextLayer = addTextLayer;
ob.exportChars = exportChars;
ob.exportFonts = exportFonts;
ob.addComps = addComps;
ob.removeComps = removeComps;
return ob;
}());