/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package feuille.drawing.ornament;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import feuille.drawing.lib.BSpline;
import feuille.drawing.lib.Bezier;
import feuille.drawing.lib.ControlPoint;
import feuille.drawing.lib.IShape;
import feuille.drawing.lib.Layer;
import feuille.drawing.lib.Line;
import feuille.drawing.lib.Move;
import feuille.drawing.lib.ReStart;
/**
*
* @author The Wingate 2940
*/
public class OrnDo {
AssLine al = new AssLine();
OrnLayer ol = new OrnLayer();
int resx = 1280;
private double currentX = 0;
private List<Double> positionX = new ArrayList<Double>();
private List<Double> positionY = new ArrayList<Double>();
public OrnDo(){
}
// <editor-fold defaultstate="collapsed" desc="Processus">
private double processXY(long mst, long duration, feuille.drawing.ornament.IShape s, double xpos1, double ypos1){
double xpos2 = 0d;
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
duration = duration / denom;
}else if(s.getDuration().equals("0")==false){
duration = Math.abs(Long.parseLong(s.getDuration()));
}
java.awt.Point S = s.getOriginPoint();
java.awt.Point E = s.getLastPoint();
//Longueur sur x et y
double distanceX = E.getX() - S.getX();
double distanceY = E.getY() - S.getY();
//Produit en croix
//distanceX = duration
//x = mst
//x = mst*distanceX / duration
long entTime = 0;
while(entTime < duration){
if(s instanceof OrnMMLine){
OrnMMLine l = (OrnMMLine)s;
double x = entTime * distanceX / duration + xpos1; xpos2 = x;
double y = l.getY(x) + ypos1;
positionX.add(x); System.out.println("Pour "+entTime+", on a x="+x+" | "+(x-1000));
positionY.add(y); System.out.println("Pour "+entTime+", on a y="+y+" | "+(y-1000));
}else if(s instanceof OrnMMBezier){
OrnMMBezier b = (OrnMMBezier)s;
}
entTime += mst;
}
return xpos2;
}
private void processXY(long mst, long duration, feuille.drawing.ornament.IShape s){
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
duration = duration / denom;
}else if(s.getDuration().equals("0")==false){
duration = Math.abs(Long.parseLong(s.getDuration()));
}
java.awt.Point S = s.getOriginPoint();
java.awt.Point E = s.getLastPoint();
//Longueur sur x et y
double distanceX = E.getX() - S.getX(); // double distanceY = E.getY() - S.getY();
long entTime = 0;
while(entTime < duration){
if(s instanceof OrnMMLine){
OrnMMLine l = (OrnMMLine)s;
//Produit en croix
//distanceX = duration
//x = mst
//x = mst*distanceX / duration
double x = entTime * distanceX / duration;
double y = l.getY(x);
positionX.add(x); System.out.println("Pour "+entTime+", on a x="+x+" | "+(x-1000));
positionY.add(y); System.out.println("Pour "+entTime+", on a y="+y+" | "+(y-1000));
}else if(s instanceof OrnMMBezier){
OrnMMBezier b = (OrnMMBezier)s;
//On obtient le temps de la forme avec duration
//On sait que pour la forme t=0 lorsque x et y sont à P0 et t=1 losraque x et y sopnt à P3
//Il nous faut donc trouver x et y en fonction de t
//Il nous faut d'abord déterminer t qui est fonction du temps de la forme
// t=1 <> duration
// t=? <> entTime
//De ce produit en croix découle : t=? = entTime * t=1 / duration
//Simplifions ? = entTime /duration
double t = (double)entTime / (double)duration;
double x = b.getX(t) - b.getX(0);
double y = b.getY(t) - b.getY(0);
positionX.add(x); System.out.println("Pour "+t+" ("+entTime+"), on a x="+x+" | "+(x-1000));
positionY.add(y); System.out.println("Pour "+t+" ("+entTime+"), on a y="+y+" | "+(y-1000));
}
entTime += mst;
}
}
// </editor-fold>
public List<Double> getPosX(){
return positionX;
}
public List<Double> getPosY(){
return positionY;
}
// <editor-fold defaultstate="collapsed" desc="Pas de mouvement">
public List<AssLine> getLinesForNoMove(OrnLayer olay, List<AssLine> asslines, Object[] olayers, int imgX, int imgY){
//Un nouveau tableau dynamique pour enregistrer les données DANS l'ORDRE.
List<AssLine> newlist = new ArrayList<AssLine>();
//On traite d'abord le dessin qui doit aller derrière
for(AssLine line : asslines){
int countLayers = 1;
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
String newhead = line.changeLayer(al.getHead(), countLayers+"");
String newbody = "{\\p1}"+commands+"{\\p0}";
newlist.add(new AssLine(newhead,newbody));
countLayers+=1;
}
}
}
//On traite ensuite le dessin qui doit aller dessus avec les \clip
for(AssLine line : asslines){
int countLayers = 101;
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
String newhead = line.changeLayer(al.getHead(), countLayers+"");
String newbody = line.try_addToBody("{\\clip("+commands+")}");
newlist.add(new AssLine(newhead,newbody));
countLayers+=1;
}
}
}
return newlist;
}
public void getLinesForNoMove2(OrnLayer olay, List<AssLine> asslines, Object[] olayers, int imgX, int imgY, String path,
int imgWidth, int imgHeight) throws FileNotFoundException, UnsupportedEncodingException, IOException{
// On crée un fichier pour les valeurs de retour.
FileOutputStream fos = new FileOutputStream(path);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
PrintWriter pw = new PrintWriter(bw);
// Entête
pw.println("[Script Info]");
pw.println("; This is an Advanced Sub Station Alpha v4+ script."
+ " For Sub Station Alpha info and downloads,"
+ " go to http://www.eswat.demon.co.uk/");
pw.println("; Created by AssSketchpad."
+ " \"Fansub is for everyone and forever !\" -"
+ " Chien-Rouge@http://redaffaire.wordpress.com/");
pw.println("ScriptType: v4.00+");
pw.println("PlayResX: "+imgWidth);
pw.println("PlayResY: "+imgHeight);
pw.println("");
pw.println("[V4+ Styles]");
pw.println("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic" +
", Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle" +
", BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding");
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
// Création du style pour le dessin
AssStyle as_one = new AssStyle();
as_one.setName(lay.getName());
as_one.setAlignment(7);
as_one.setMarginL(0);
as_one.setMarginR(0);
as_one.setMarginV(0);
as_one.setTextColor(lay.getColor(), "00");
pw.println(as_one.toAssStyleString());
//Création du style pour le texte
AssStyle as_two = new AssStyle();
as_two.setName(lay.getName()+"Text");
as_two.setTextColor(lay.getColor().brighter(), "00");
pw.println(as_two.toAssStyleString());
}
}
pw.println("");
pw.println("[Events]");
pw.println("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text");
//On traite d'abord le dessin qui doit aller derrière
for(AssLine line : asslines){
int countLayers = 1;
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
String newhead = line.changeLayer(line.getHead(), countLayers+"");
newhead = line.changeStyle(newhead, lay.getName());
String newbody = "{\\p1}"+commands+"{\\p0}";
pw.println(new AssLine(newhead,newbody));
countLayers+=1;
}
}
}
//On traite ensuite le dessin qui doit aller dessus avec les \clip
for(AssLine line : asslines){
int countLayers = 101;
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
String newhead = line.changeLayer(line.getHead(), countLayers+"");
newhead = line.changeStyle(newhead, lay.getName()+"Text");
String newbody = line.try_addToBody("{\\clip("+commands+")}");
pw.println(new AssLine(newhead,newbody));
countLayers+=1;
}
}
}
pw.close();
bw.close();
fos.close();
}
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Mouvement général">
public List<AssLine> getLinesForMainMoveOnly(OrnLayer olay, List<AssLine> asslines,
int frequency, Object[] olayers, int imgX, int imgY){
// On crée un tableau dynamique pour les valeurs de retour.
List<AssLine> newlines = new ArrayList<AssLine>();
// On utilise deux variables pour stocker la position en cours
currentX = 0; double resetX;
// Pour chaque forme de la liste des formes (sauf points
// et points de contrôle), on éxecute la suite des événements.
for(feuille.drawing.ornament.IShape s : olay.getList()){
if(s instanceof OrnMMLine | s instanceof OrnMMBezier){
// A chaque fois qu'on change de forme, on s'assure
// d'être à la suite de la dernière.
resetX = currentX;
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (DESSIN DE DESSOUS).
for(AssLine als : asslines){
// On compte les couches pour pouvoir incrémenter sur
// les commandes de dessin avec cette variable.
int countLayers = 1;
// On recherche les positions de x et y en fonction
// du temps de la phrase ou de la forme.
currentX = processXY(frequency, Long.parseLong(als.getMillisecondsDur()), s, resetX, 0);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque couche de dessin on éxecute la suite.
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
// On obtient les commandes associées.
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
// On change le numéro de couche pour cette ligne.
String newhead = als.changeLayer(als.getHead(), countLayers+"");
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
String sx = Xvalues.toArray()[i].toString();
String sy = Yvalues.toArray()[i].toString();
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+i*frequency+","+i*frequency+","+"\\alpha&H00&)"+
"\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = "{\\pos("+sx+","+sy+")"+temp+"\\p1}"+commands+"{\\p0}";
// On ajoute cette ligne de code au
// tableau dynamique.
newlines.add(new AssLine(newhead,newbody));
}
// On incrémente le numéro de couche de la ligne.
countLayers+=1;
}
}
//On réinitialise les variables.
positionX.clear();
positionY.clear();
}
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (ZONE DE VISIBILITE).
for(AssLine als : asslines){
// On compte les couches pour pouvoir incrémenter sur
// les commandes de dessin avec cette variable.
int countLayers = 101;
// On recherche les positions de x et y en fonction
// du temps de la phrase ou de la forme.
currentX = processXY(frequency, Long.parseLong(als.getMillisecondsDur()), s, resetX, 0);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque couche de dessin on éxecute la suite.
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
// On prépare la variable pour les commandes associées.
String commands;
// On change le numéro de couche pour cette ligne.
String newhead = als.changeLayer(als.getHead(), countLayers+"");
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
String sx = Xvalues.toArray()[i].toString();
String sy = Yvalues.toArray()[i].toString();
// On s'assure que les commandes soient
// personnalisés à la ligne et donne une
// nouvelle visibilité.
int x = (int)Double.parseDouble(sx);
int y = (int)Double.parseDouble(sy);
commands = getOrnamentCommands(lay,-x,-y,imgX,imgY);
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+i*frequency+","+i*frequency+","+"\\alpha&H00&)"+
"\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = als.try_addToBody("{"+temp+"\\clip("+commands+")}");
// On ajoute cette ligne de code au
// tableau dynamique.
newlines.add(new AssLine(newhead,newbody));
}
// On incrémente le numéro de couche de la ligne.
countLayers+=1;
}
}
//On réinitialise les variables.
positionX.clear();
positionY.clear();
}
}
}
return newlines;
}
public List<AssLine> getLinesForMainMoveOnly2(OrnLayer olay, List<AssLine> asslines,
int frequency, Object[] olayers, int imgX, int imgY){
// On crée un tableau dynamique pour les valeurs de retour.
List<AssLine> newlines = new ArrayList<AssLine>();
// On va boucler sur toutes les lignes
for(AssLine line : asslines){
// ON sait que :
// Au début d'une ligne, le temps est égal à 0
// Au début d'une ligne, x=0
long linetime = 0;
double xpos = 0;
double ypos = 0;
int countLayers = 1, clipLayers = 100;
// On va boucler sur toutes les copuches de dessins
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
//On va boucler sur toutes les formes formant le chemin.
for(feuille.drawing.ornament.IShape s : olay.getList()){
if(s instanceof OrnMMLine | s instanceof OrnMMBezier){
// On efface les tableaux pour les remplir avec de nouvelles valeurs
positionX.clear();
positionY.clear();
processXY(frequency, Long.parseLong(line.getMillisecondsDur()), s);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (DESSIN DE DESSOUS).
//**************************************************
// On obtient les commandes associées.
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
// On change le numéro de couche pour cette ligne.
String newhead = line.changeLayer(line.getHead(), countLayers+"");
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
double dx = Xvalues.get(i);// String sx = Double.toString(dx);
double dy = Yvalues.get(i);// String sy = Double.toString(dy);
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0 && linetime==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+(i*frequency+linetime)+","+(i*frequency+linetime)+","+"\\alpha&H00&)"+
"\\t("+((i+1)*frequency+linetime)+","+((i+1)*frequency+linetime)+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = "{\\pos("+(dx+xpos)+","+(dy+ypos)+")"+temp+"\\p1}"+commands+"{\\p0}";
// On ajoute cette ligne de code au
// tableau dynamique.
newlines.add(new AssLine(newhead,newbody));
}
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
linetime += Long.parseLong(line.getMillisecondsDur()) / denom;
}else if(s.getDuration().equals("0")==false){
linetime += Math.abs(Long.parseLong(s.getDuration()));
}
xpos = xpos + Xvalues.get(Xvalues.size()-1);
ypos = ypos + Yvalues.get(Yvalues.size()-1);
countLayers += 1;
}
}
//Reinitilisation
linetime = 0;
xpos = 0;
ypos = 0;
//On va boucler sur toutes les formes formant le chemin.
for(feuille.drawing.ornament.IShape s : olay.getList()){
if(s instanceof OrnMMLine | s instanceof OrnMMBezier){
// On efface les tableaux pour les remplir avec de nouvelles valeurs
positionX.clear();
positionY.clear();
processXY(frequency, Long.parseLong(line.getMillisecondsDur()), s);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (ZONE DE VISIBILITE).
//**************************************************
// On prépare la variable pour les commandes associées.
// variable commands
// On change le numéro de couche pour cette ligne.
String newhead = line.changeLayer(line.getHead(), (countLayers+clipLayers)+"");
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
double dx = Xvalues.get(i);// String sx = Double.toString(dx);
double dy = Yvalues.get(i);// String sy = Double.toString(dy);
// On s'assure que les commandes soient
// personnalisés à la ligne et donne une
// nouvelle visibilité.
int x = (int)dx - (int)xpos;
int y = (int)dy - (int)ypos;
String commands = getOrnamentCommands(lay,-x,-y,imgX,imgY);
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0 && linetime==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+(i*frequency+linetime)+","+(i*frequency+linetime)+","+"\\alpha&H00&)"+
"\\t("+((i+1)*frequency+linetime)+","+((i+1)*frequency+linetime)+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = line.try_addToBody("{"+temp+"\\clip("+commands+")}");
// On ajoute cette ligne de code au
// tableau dynamique.
newlines.add(new AssLine(newhead,newbody));
}
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
linetime += Long.parseLong(line.getMillisecondsDur()) / denom;
}else if(s.getDuration().equals("0")==false){
linetime += Math.abs(Long.parseLong(s.getDuration()));
}
xpos = xpos + Xvalues.get(0)-Xvalues.get(Xvalues.size()-1);
ypos = ypos + Yvalues.get(0)-Yvalues.get(Yvalues.size()-1);
countLayers += 1;
}
}
// On réinitialise la variable
//Reinitilisation
linetime = 0;
xpos = 0;
ypos = 0;
}
}
}
return newlines;
}
public void getLinesForMainMoveOnly3(OrnLayer olay, List<AssLine> asslines,
int frequency, Object[] olayers, int imgX, int imgY, String path,
int imgWidth, int imgHeight) throws FileNotFoundException, UnsupportedEncodingException, IOException{
// On crée un fichier pour les valeurs de retour.
FileOutputStream fos = new FileOutputStream(path);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
PrintWriter pw = new PrintWriter(bw);
// Entête
pw.println("[Script Info]");
pw.println("; This is an Advanced Sub Station Alpha v4+ script."
+ " For Sub Station Alpha info and downloads,"
+ " go to http://www.eswat.demon.co.uk/");
pw.println("; Created by AssSketchpad."
+ " \"Fansub is for everyone and forever !\" -"
+ " Chien-Rouge@http://redaffaire.wordpress.com/");
pw.println("ScriptType: v4.00+");
pw.println("PlayResX: "+imgWidth);
pw.println("PlayResY: "+imgHeight);
pw.println("");
pw.println("[V4+ Styles]");
pw.println("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic" +
", Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle" +
", BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding");
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
// Création du style pour le dessin
AssStyle as_one = new AssStyle();
as_one.setName(lay.getName());
as_one.setAlignment(7);
as_one.setMarginL(0);
as_one.setMarginR(0);
as_one.setMarginV(0);
as_one.setTextColor(lay.getColor(), "00");
pw.println(as_one.toAssStyleString());
//Création du style pour le texte
AssStyle as_two = new AssStyle();
as_two.setName(lay.getName()+"Text");
as_two.setTextColor(lay.getColor().brighter(), "00");
pw.println(as_two.toAssStyleString());
}
}
pw.println("");
pw.println("[Events]");
pw.println("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text");
// On va boucler sur toutes les lignes
for(AssLine line : asslines){
// ON sait que :
// Au début d'une ligne, le temps est égal à 0
// Au début d'une ligne, x=0
long linetime = 0;
double xpos = 0;
double ypos = 0;
int countLayers = 1, clipLayers = 100;
// On va boucler sur toutes les couches de dessins
for(Object o : olayers){
if(o instanceof Layer){
Layer lay = (Layer)o;
//On va boucler sur toutes les formes formant le chemin.
for(feuille.drawing.ornament.IShape s : olay.getList()){
if(s instanceof OrnMMLine | s instanceof OrnMMBezier){
// On efface les tableaux pour les remplir avec de nouvelles valeurs
positionX.clear();
positionY.clear();
processXY(frequency, Long.parseLong(line.getMillisecondsDur()), s);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (DESSIN DE DESSOUS).
//**************************************************
// On obtient les commandes associées.
String commands = getOrnamentCommands(lay,0,0,imgX,imgY);
// On change le numéro de couche pour cette ligne.
String newhead = line.changeLayer(line.getHead(), countLayers+"");
newhead = line.changeStyle(newhead, lay.getName());
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
double dx = Xvalues.get(i);// String sx = Double.toString(dx);
double dy = Yvalues.get(i);// String sy = Double.toString(dy);
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0 && linetime==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+(i*frequency+linetime)+","+(i*frequency+linetime)+","+"\\alpha&H00&)"+
"\\t("+((i+1)*frequency+linetime)+","+((i+1)*frequency+linetime)+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = "{\\pos("+(dx+xpos)+","+(dy+ypos)+")"+temp+"\\p1}"+commands+"{\\p0}";
// On ajoute cette ligne de code au
// tableau dynamique.
pw.println(new AssLine(newhead,newbody));
}
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
linetime += Long.parseLong(line.getMillisecondsDur()) / denom;
}else if(s.getDuration().equals("0")==false){
linetime += Math.abs(Long.parseLong(s.getDuration()));
}
xpos = xpos + Xvalues.get(Xvalues.size()-1);
ypos = ypos + Yvalues.get(Yvalues.size()-1);
countLayers += 1;
}
}
//Reinitilisation
linetime = 0;
xpos = 0;
ypos = 0;
//On va boucler sur toutes les formes formant le chemin.
for(feuille.drawing.ornament.IShape s : olay.getList()){
if(s instanceof OrnMMLine | s instanceof OrnMMBezier){
// On efface les tableaux pour les remplir avec de nouvelles valeurs
positionX.clear();
positionY.clear();
processXY(frequency, Long.parseLong(line.getMillisecondsDur()), s);
List<Double> Xvalues = getPosX();
List<Double> Yvalues = getPosY();
// Pour chaque lignes de karaoké, on éxecute la suite
// des commandes (ZONE DE VISIBILITE).
//**************************************************
// On prépare la variable pour les commandes associées.
// variable commands
// On change le numéro de couche pour cette ligne.
String newhead = line.changeLayer(line.getHead(), (countLayers+clipLayers)+"");
newhead = line.changeStyle(newhead, lay.getName()+"Text");
// Pour chaque valeur x et y on éxecute la suite.
for(int i=0; i<Xvalues.size(); i++){
// On transforme ces valeurs Double en String
// en les prenant de leur liste.
double dx = Xvalues.get(i);// String sx = Double.toString(dx);
double dy = Yvalues.get(i);// String sy = Double.toString(dy);
// On s'assure que les commandes soient
// personnalisés à la ligne et donne une
// nouvelle visibilité.
int x = (int)dx - (int)xpos;
int y = (int)dy - (int)ypos;
String commands = getOrnamentCommands(lay,-x,-y,imgX,imgY);
// On crée une variable pour stocker un
// bout de commande.
String temp;
// On crée le code de la commande.
if(i==0 && linetime==0){
temp = "\\t("+(i+1)*frequency+","+(i+1)*frequency+","+"\\alpha&HFF&)";
}else{
temp = "\\alpha&HFF&"+"\\t("+(i*frequency+linetime)+","+(i*frequency+linetime)+","+"\\alpha&H00&)"+
"\\t("+((i+1)*frequency+linetime)+","+((i+1)*frequency+linetime)+","+"\\alpha&HFF&)";
}
// On crée concrètement la nouvelle
// ligne de code.
String newbody = line.try_addToBody("{"+temp+"\\clip("+commands+")}");
// On ajoute cette ligne de code au
// tableau dynamique.
pw.println(new AssLine(newhead,newbody));
}
if(s.getDuration().contains("/")){
int denom = Integer.parseInt(s.getDuration().substring(s.getDuration().lastIndexOf("/")+1));
linetime += Long.parseLong(line.getMillisecondsDur()) / denom;
}else if(s.getDuration().equals("0")==false){
linetime += Math.abs(Long.parseLong(s.getDuration()));
}
xpos = xpos + Xvalues.get(0)-Xvalues.get(Xvalues.size()-1);
ypos = ypos + Yvalues.get(0)-Yvalues.get(Yvalues.size()-1);
countLayers += 1;
}
}
// On réinitialise la variable
//Reinitilisation
linetime = 0;
xpos = 0;
ypos = 0;
}
}
}
pw.close();
bw.close();
fos.close();
}
// </editor-fold>
/** Obtient les commandes pour l'ornement à partir de la couche sélectionnée.
* @param lay La couche sélectionnée.
* @param xt Le décalage sur x.
* @param yt Le décalage sur y.
* @return La commande de l'ornement.
*/
public String getOrnamentCommands(Layer lay, int xt, int yt, int imgX, int imgY){
//On obtient la position de l'image (valeur à toujours soustraire)
int posX = imgX + xt;
int posY = imgY + yt;
String commands = "";
try{
for(IShape s : lay.getShapesList().getShapes()){
if(s instanceof Line){
Line line = (Line)s;
int x = (int)line.getLastPoint().getX();
int y = (int)line.getLastPoint().getY();
int xb = x-posX;
int yb = y-posY;
commands = commands + "l "+xb+" "+yb+" ";
}else if(s instanceof Bezier){
Bezier bezier = (Bezier)s;
int x1 = (int)bezier.getControl1().getOriginPoint().getX();
int y1 = (int)bezier.getControl1().getOriginPoint().getY();
int x2 = (int)bezier.getControl2().getOriginPoint().getX();
int y2 = (int)bezier.getControl2().getOriginPoint().getY();
int x3 = (int)bezier.getLastPoint().getX();
int y3 = (int)bezier.getLastPoint().getY();
int xe = x1-posX;
int ye = y1-posY;
int xf = x2-posX;
int yf = y2-posY;
int xg = x3-posX;
int yg = y3-posY;
commands = commands + "b "+xe+" "+ye+" "+xf+" "+yf+" "+xg+" "+yg+" ";
}else if(s instanceof BSpline){
BSpline bs = (BSpline)s;
List<ControlPoint> lcp = bs.getControlPoints();
int lastcp = lcp.size()-1;
commands = commands + "s ";
for(ControlPoint cp : lcp){
int x = (int)cp.getOriginPoint().getX();
int y = (int)cp.getOriginPoint().getY();
int xi = x-posX;
int yi = y-posY;
if(bs.isNextExist()==true && cp.equals(lcp.get(lastcp))==true){
//rien
}else{
commands = commands + xi+" "+yi+" ";
}
}
if(bs.isClosed()==true){
commands = commands + "c ";
}
if(bs.isNextExist()==true){
int x = (int)bs.getNextPoint().getX();
int y = (int)bs.getNextPoint().getY();
int xi = x-posX;
int yi = y-posY;
commands = commands + "p "+xi+" "+yi+" ";
}
}else if(s instanceof Move){
Move move = (Move)s;
int x = (int)move.getLastPoint().getX();
int y = (int)move.getLastPoint().getY();
int xb = x-posX;
int yb = y-posY;
commands = commands + "n "+xb+" "+yb+" ";
}else if(s instanceof ReStart){
ReStart move = (ReStart)s;
int x = (int)move.getLastPoint().getX();
int y = (int)move.getLastPoint().getY();
int xb = x-posX;
int yb = y-posY;
commands = commands + "m "+xb+" "+yb+" ";
}
}
return commands;
}catch(Exception exc){
return "";
}
}
}