var document = fl.getDocumentDOM(); var level = 0; var optimized = 0; var original = 0; var quality = 1; function main() { var summary; clear(); quality = prompt('Choose a quality setting, between .5 (fewer control points) and 20 (more control points).', 10); quality = (isNaN(Number(quality)) || quality === false || quality === '') ? 10 : Number(quality); quality = Math.min(quality, 20); quality = Math.max(quality, .5); fl.showIdleMessage(false); optimizeSymbols(); fl.showIdleMessage(true); // optimizeFrame(document.getTimeline().currentLayer, document.getTimeline().currentFrame); summary = 'Original: %original, Optimized: %optimized, Ratio: %ratio%'; summary = summary.replace('%original', original); summary = summary.replace('%optimized', optimized); summary = summary.replace('%ratio', Math.round((1 - (optimized / original)) * 100)); trace(summary); } function optimizeSymbols() { var item; var itemList = document.library.getSelectedItems(); if(!itemList.length) itemList = document.library.items.concat(); var itemIndex = itemList.length; if(itemIndex && confirm('Are you sure you want to optimize %count symbols? This may take a very long time.'.replace('%count', itemIndex))) { while(itemIndex--) { item = itemList[itemIndex]; if(item.itemType === 'graphic' || item.itemType === 'movie clip') { document.library.editItem(item.name); trace('Optimizing symbol: %name'.replace('%name', item.name)); optimizeTimeline(); document.exitEditMode(); } } } } function optimizeTimeline() { var layerIndex; var timeline; timeline = document.getTimeline(); document.zoomFactor = quality; layerIndex = timeline.layers.length; if(layerIndex) { while(layerIndex--) { optimizeLayer(layerIndex); } } document.zoomFactor = 1; } function optimizeLayer(layerIndex) { var frameIndex; var layer; var locked; var timeline; var visible; timeline = document.getTimeline(); layer = timeline.layers[layerIndex]; locked = layer.locked; visible = layer.visible; layer.locked = false; layer.visible = true; frameIndex = layer.frames.length; if(frameIndex) { while(frameIndex--) { optimizeFrame(layerIndex, frameIndex); } } layer.locked = locked; layer.visible = visible; } function optimizeFrame(layerIndex, frameIndex) { var element; var elementIndex; var frame; var layer; var timeline; timeline = document.getTimeline(); timeline.currentLayer = layerIndex; timeline.currentFrame = frameIndex; layer = timeline.layers[layerIndex]; frame = layer.frames[frameIndex]; if(frameIndex === frame.startFrame) { document.selectNone(); document.selection = frame.elements.concat(); deleteEmptyShapes(); document.selectNone(); elementIndex = frame.elements.length; if(elementIndex) { while(elementIndex--) { document.selectNone(); optimizeElement(layerIndex, frameIndex, elementIndex); document.selectNone(); } } elementIndex = frame.elements.length; if(elementIndex > 1) { while(elementIndex--) { document.selectNone(); document.selection = [frame.elements[elementIndex]]; document.arrange('front'); document.selectNone(); } } } } function optimizeElement(layerIndex, frameIndex, elementIndex) { var element; var frame; var layer; var timeline; timeline = document.getTimeline(); timeline.currentLayer = layerIndex; timeline.currentFrame = frameIndex; layer = timeline.layers[layerIndex]; frame = layer.frames[frameIndex]; document.selectNone(); document.selection = [frame.elements[elementIndex]]; element = frame.elements[elementIndex]; if(element.elementType === 'shape') { if(element.isGroup) { level++; document.convertToSymbol('graphic','tmp' + level, 'top left'); document.enterEditMode('inPlace'); document.breakApart(); optimizeTimeline(); if(document.getTimeline().layers[0].frames[0].elements.length > 0) { document.selectAll(); document.group(); document.exitEditMode(); document.breakApart(); } else { document.exitEditMode(); document.selection = [frame.elements[frame.elements.length - 1]]; document.deleteSelection(); } document.library.deleteItem('tmp' + level); level--; } else { original += element.vertices.length; document.optimizeCurves(0, true); document.setSelectionRect({ top: 0, right: 0, bottom: 0, left: 0 }); // fix selection bug if(frame.elements[elementIndex]) { optimized += frame.elements[elementIndex].vertices.length; } } } else { document.arrange('front'); } } function deleteEmptyShapes() { var element; var elementsToKeep var elementsToDelete var index; elementsToKeep = new Array(); elementsToDelete = new Array(); if(document.selection && (index = document.selection.length)) { while(index--) { element = document.selection[index]; if(element.elementType === 'shape' && element.width === 0 && element.height === 0) { elementsToDelete.push(element); } else { elementsToKeep.push(element); } } document.setSelectionRect({ top: 0, right: 0, bottom: 0, left: 0 }); document.selectNone(); if(elementsToDelete.length > 0) { document.selection = elementsToDelete; document.deleteSelection(); } document.selection = elementsToKeep; } } function clear() { fl.outputPanel.clear(); } function trace() { var list = Array.prototype.concat; var index = arguments.length; while(index && index--) { if(arguments[index] === undefined) { arguments[index] = 'undefined'; } else if(arguments[index] === null) { arguments[index] = 'null'; } } fl.outputPanel.trace([].join.call(arguments, ' ')); } main();