Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
ressource:code:processing:atelier_typo [2022/09/08 17:49]
gweltaz créée
ressource:code:processing:atelier_typo [2022/12/05 17:05] (Version actuelle)
gweltaz
Ligne 1: Ligne 1:
 +{{tag>​processing typographie}}
 ====== Atelier Processing : typographie ====== ====== Atelier Processing : typographie ======
  
 +===== Ressources de fonts à télécharger =====
 +  * https://​fonts.google.com
 +  * https://​fontawesome.com
 +  * http://​www.fontsaddict.com
 +
 +Sous linux, c'est grace à la font "Noto Color Emoji",​ installée par défaut, que l'on peut afficher des émojis dans diverses applications (dont le Terminal).
 +Comme il n'est pas possible d'​utiliser une font de couleur dans Processing on pourra utiliser "Noto Emoji" à la place https://​fonts.google.com/​noto/​specimen/​Noto+Emoji.
 +
 +===== Voir le contenu d'une font =====
  
 <​accordion><​panel title="​fontViewer.pde">​ <​accordion><​panel title="​fontViewer.pde">​
Ligne 22: Ligne 32:
 int size = 32; int size = 32;
 int margin = 2; int margin = 2;
 +int old_width, old_height;
  
 ArrayList<​MyGlyph>​ glyphs = new ArrayList();​ ArrayList<​MyGlyph>​ glyphs = new ArrayList();​
Ligne 34: Ligne 45:
 void setup() { void setup() {
   size(800, 600);   size(800, 600);
 +  //​surface.setResizable(true);​
   //​fullScreen();​   //​fullScreen();​
 +  old_width = width;
 +  old_height = height;
 +  ​
   printArray(PFont.list());​   printArray(PFont.list());​
   ​   ​
Ligne 54: Ligne 69:
   selected = -1;   selected = -1;
  
-  int x = margin; +  ​//int x = margin; 
-  int y = font.getSize() + margin;+  ​//int y = font.getSize() + margin;
   int numChars = 0;   int numChars = 0;
   for (int i = 0; i < 0x10ffff; i++) {   for (int i = 0; i < 0x10ffff; i++) {
Ligne 65: Ligne 80:
       glyph.w = textWidth(glyph.s);​       glyph.w = textWidth(glyph.s);​
       glyph.h = font.getSize();​       glyph.h = font.getSize();​
-      if (x + glyph.w + margin > width) {+      ​/*if (x + glyph.w + margin > width) {
         x = margin;         x = margin;
         y += font.getSize() + margin;         y += font.getSize() + margin;
Ligne 71: Ligne 86:
       glyph.x = x;       glyph.x = x;
       glyph.y = y;       glyph.y = y;
-      x += glyph.w + margin;+      x += glyph.w + margin;*/
       glyphs.add(glyph);​       glyphs.add(glyph);​
     }     }
   }   }
 +  updateFont();​
 +  ​
   if (!glyphs.isEmpty())   if (!glyphs.isEmpty())
     yMax = max(0, glyphs.get(glyphs.size()-1).y + 4 * margin - height);     yMax = max(0, glyphs.get(glyphs.size()-1).y + 4 * margin - height);
  
   println(numChars,​ "​glyphs in font"​);​   println(numChars,​ "​glyphs in font"​);​
 +}
 +
 +void updateFont() {
 +  int x = margin;
 +  int y = font.getSize() + margin;
 +  for (MyGlyph glyph : glyphs) {
 +    if (x + glyph.w + margin > width) {
 +        x = margin;
 +        y += font.getSize() + margin;
 +      }
 +      glyph.x = x;
 +      glyph.y = y;
 +      x += glyph.w + margin;
 +  }
 } }
  
Ligne 85: Ligne 116:
   background(255);​   background(255);​
   ​   ​
-  if (font == null)+  if (font == null) 
 +    fill(0); 
 +    textSize(32);​ 
 +    String mess = "​Glissez-déposez une font dans la fenêtre";​ 
 +    float w = textWidth(mess);​ 
 +    text(mess, (width - w) * 0.5f, height/2);
     return;     return;
 +  }
  
   yOffset = constrain(yOffset + yVel, 0, yMax);   yOffset = constrain(yOffset + yVel, 0, yMax);
Ligne 126: Ligne 163:
     text(text, glyph.x + 0.5*(glyph.w - tw) + 8, glyph.y + 4 + th + 4);     text(text, glyph.x + 0.5*(glyph.w - tw) + 8, glyph.y + 4 + th + 4);
   }   }
 +  ​
   popMatrix();​   popMatrix();​
 } }
Ligne 131: Ligne 169:
  
 void mousePressed() { void mousePressed() {
 +  if (font == null)
 +    return;
 +  ​
   selected = -1;   selected = -1;
   ​   ​
Ligne 147: Ligne 188:
 } }
  
 +void mouseReleased() {
 +  if (width != old_width || height != old_height) {
 +    updateFont();​
 +    println("​update"​);​
 +    old_width = width;
 +    old_height = height;
 +  }
 +}
  
 void mouseWheel(MouseEvent event) { void mouseWheel(MouseEvent event) {
Ligne 168: Ligne 217:
 </​code>​ </​code>​
 </​panel></​accordion>​ </​panel></​accordion>​
 +
 +===== Effets de fonts avec Processing =====
 +
 +<​accordion><​panel title="​textEffects.pde">​
 +<code java>
 +abstract class TextEffect<​T extends TextEffect>​ {
 +  protected String text;
 +  protected PVector position = new PVector();
 +  protected int delay = 0;
 +  protected PFont font;
 +  protected color col;
 +  protected int init = -1;
 +  protected boolean removable = false;
 +
 +  protected TextEffect() {
 +    font = g.textFont;
 +  }
 +
 +  public T delay(float seconds) {
 +    delay = round(seconds * 1000);
 +    return (T)this;
 +  }
 +
 +  public T setText(String text) {
 +    this.text = text;
 +    reset();
 +    return (T)this;
 +  }
 +  ​
 +  public T setPosition(float x, float y) {
 +    this.position.set(x,​ y);
 +    reset();
 +    return (T)this;
 +  }
 +
 +  public T setFont(String font, int size) {
 +    this.font = createFont(font,​ size);
 +    return (T)this;
 +  }
 +
 +  public T setFont(PFont font) {
 +    this.font = font;
 +    return (T)this;
 +  }
 +
 +  public T setColor(int r, int g, int b) {
 +    col = color(r, g, b);
 +    return (T)this;
 +  }
 +  ​
 +  public T setColor(color c) {
 +    col = c;
 +    return (T)this;
 +  }
 +
 +  public abstract void update();
 +
 +  public boolean isRemovable() {
 +    return removable;
 +  }
 +  ​
 +  public void reset() {
 +    init = -1;
 +    removable = false;
 +  }
 +}
 +
 +
 +
 +class TextFade extends TextEffect<​TextFade>​ {
 +  private int fadein = 2000;
 +  private int sustain;
 +  private int fadeout = 2000;
 +
 +  public TextFade(String text, float x, float y) {
 +    super();
 +    this.text = text;
 +    this.position.set(x,​ y);
 +    sustain = text.length() * 60;
 +  }
 +
 +  public TextFade setDuration(float fadein, float sustain, float fadeout) {
 +    this.fadein = round(fadein * 1000);
 +    this.sustain = round(sustain * 1000);
 +    this.fadeout = round(fadeout * 1000);
 +    return this;
 +  }
 +
 +  public void update() {
 +    int time = millis();
 +
 +    if (init < 0) {
 +      init = time;
 +    }
 +
 +    if (time < init + delay) {
 +      return;
 +    } else if (time < init + delay + fadein) {
 +      float alpha = (time - init - delay) / float(fadein);​
 +      alpha *= g.colorModeA;​
 +      fill(col, alpha);
 +      if (font != null) textFont(font);​
 +      text(text, position.x, position.y);​
 +    } else if (time < init + delay + fadein + sustain) {
 +      fill(col);
 +      if (font != null) textFont(font);​
 +      text(text, position.x, position.y);​
 +    } else if (time < init + delay + fadein + sustain + fadeout) {
 +      float alpha = (time - init - delay - fadein - sustain) / float(fadeout);​
 +      alpha = (1.0 - alpha) * g.colorModeA;​
 +      fill(col, alpha);
 +      if (font != null) textFont(font);​
 +      text(text, position.x, position.y);​
 +    } else {
 +      removable = true;
 +    }
 +  }
 +}
 +
 +
 +
 +class TextHScroll extends TextEffect<​TextHScroll>​ {
 +  private float speed;
 +  private float textWidth;
 +
 +  public TextHScroll(String text, float y, float speed) {
 +    super();
 +    this.text = text;
 +    position.y = y;
 +    this.speed = speed;
 +  }
 +
 +  public void update() {
 +    int time = millis();
 +
 +    if (init < 0) {
 +      init = time;
 +      if (speed > 0)
 +        position.x = -textWidth;
 +      else
 +        position.x = width;
 +    }
 +
 +    if (time < init + delay) {
 +      return;
 +    } else if (speed > 0 && position.x < width || speed < 0 && position.x + textWidth > 0) {
 +      position.x += speed;
 +      fill(col);
 +      if (font != null) textFont(font);​
 +      text(text, position.x, position.y);​
 +    } else {
 +      removable = true;
 +    }
 +  }
 +}
 +</​code>​
 +</​panel></​accordion>​
 +
 +==== Utilisation ====
 +
 +<code java>
 +TextEffect te;
 +te = new TextFade("​Hello",​ 100, 180).setFont("​FreeMono Bold", 50);
 +
 +void draw() {
 +  te.update();​
 +}
 +</​code>​
 +
 +<code java>
 +TextEffect te = TextHScroll(String "​Bonjour",​ 400, 2)
 +</​code>​
 +
 +Types d'​effets:​
 +  * TextFade(String text, int x, int y);
 +  * TextHScroll(String text, int y, float speed);
 +
 +Methodes de la classe TextEffect:
 +  * setFont(String font, int size)
 +  * setFont(PFont font)
 +  * delay(float seconds)
 +  * setText(String text)
 +  * setPosition(float x, float y)
 +  * setColor(int r, int g, int b)
 +  * setColor(color c)
 +  * reset()
  • ressource/code/processing/atelier_typo.1662652165.txt.gz
  • Dernière modification: 2022/09/08 17:49
  • par gweltaz