Blob Blame History Raw

#include <math.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include "helianthus.h"


#define CW  96
#define CH 128
#define CR  16
#define CB   1
#define SW   8
#define FS  64

#define CWW (CW - 2*CB)
#define CHH (CH - 2*CB)

const char *letters[][5] = {
  {"Ա", "ա", "а", "", "0"},
  {"Բ", "բ", "б", "", "1"},
  {"Գ", "գ", "г", "", "1"},
  {"Դ", "դ", "д", "", "1"},
  {"Ե", "ե", "е", "", "0"},
  {"Զ", "զ", "з", "", "1"},
  {"Է", "է", "э", "", "0"},
  {"Ը", "ը", "ыэ", "", "0"},
  {"Թ", "թ", "тх", "", "3"},
  {"Ժ", "ժ", "ж", "", "1"},
  {"Ի", "ի", "и", "", "0"},
  {"Լ", "լ", "л", "", "1"},
  {"Խ", "խ", "х", "", "2"},
  {"Ծ", "ծ", "тц", "", "2"},
  {"Կ", "կ", "к", "", "2"},
  {"Հ", "հ", "Հ", "", "3"},
  {"Ձ", "ձ", "дз", "", "1"},
  {"Ղ", "ղ", "гх", "", "3"},
  {"Ճ", "ճ", "тч", "", "2"},
  {"Մ", "մ", "м", "", "1"},
  {"Յ", "յ", "й", "", "2"},
  {"Ն", "ն", "н", "", "1"},
  {"Շ", "շ", "ш", "", "2"},
  {"Ո", "ո", "(в)о", "", "0"},
  {"Չ", "չ", "ч", "", "3"},
  {"Պ", "պ", "п", "", "2"},
  {"Ջ", "ջ", "дж", "", "1"},
  {"Ռ", "ռ", "рр", "", "1"},
  {"Ս", "ս", "с", "", "2"},
  {"Վ", "վ", "в", "", "1"},
  {"Տ", "տ", "т", "", "2"},
  {"Ր", "ր", "р", "", "1"},
  {"Ց", "ց", "ц", "", "3"},
  {"Ու", "ու", "у", "", "0"},
  {"Փ", "փ", "пх", "", "3"},
  {"Ք", "ք", "кх", "", "3"},
  {"Օ", "օ", "о", "", "0"},
  {"Ֆ", "ֆ", "ф", "", "2"},
  {"և", "և", "ев", "եւ", "0"},
};


Animation bgtex;
Font fontNew;
Font fontHand;
Font fontClassic;
Framebuffer fb;
int seed;


void drawLetter(const char **letter) {
  const char *syms[4] = { letter[2], letter[0], letter[1], letter[3] };
  Font fonts[4] = { fontNew, fontNew, fontNew, fontHand };
  double size[4] = { 0.8, 1, 1, 1 };
  double offset[4] = { 0, 0.05, 0, 0 };
  if (!strcmp(syms[0], "Հ")) fonts[0] = fontClassic;
  if (!syms[3][0]) syms[3] = syms[2];

  unsigned int colors[4] = { COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_YELLOW };
  int ci = letter[4][0] - '0';
  if (ci < 0 || ci >= 4) ci = 2;
  unsigned int color = colors[ci];

  for(int r = 0, i = 0; r < 2; ++r)
  for(int c = 0; c < 2; ++c, ++i) {
    if (!syms[i][0]) continue;
    saveState();
    translate(c*CW + CB, r*CH + CB);

    noStroke();
    double ts = 512/2;
    fillTexture(bgtex, randomFloat()*ts, randomFloat()*ts, ts, ts, FALSE);
    rectRounded(0, 0, CWW, CHH, CR);

    noFill();
    stroke(colorWithAlpha(COLOR_BLACK, 0.5));
    strokeWidth(1);
    rectRounded(0.5, 0.5, CWW - 1, CHH - 1, CR);

    stroke(colorWithAlpha(color, 0.25));
    strokeWidth(SW);
    rectRounded(0.5*SW, 0.5*SW, CWW - SW, CHH - SW, CR - 0.5*SW);

    stroke(colorWithAlpha(COLOR_BLACK, 0.75));
    textAlign(HALIGN_CENTER, VALIGN_CENTER);
    textFont(fonts[i]);
    textSize(FS*size[i]);
    text(0.5*CWW, (0.5 + offset[i])*CHH, syms[i]);

    restoreState();
  }
}


void drawLetters() {
  srand(seed);
  for(int i = 0; i < sizeof(letters)/sizeof(*letters); ++i) {
    saveState();
    translate(CW*2*(i%8), CH*2*(i/8));
    drawLetter(letters[i]);
    restoreState();
  }
}


void save(const char *filename) {
  saveState();
  resetState();
  target(fb);
  background(COLOR_TRANSPARENT);
  clear();
  drawLetters();
  if (viewportSave(filename))
    printf("saved to %s\n", filename);
  restoreState();
}


void init() {
  fb = createFramebuffer(CW*2*8, CH*2*5);
  bgtex = createAnimationEx("data/shisen/wood4.png", TRUE, TRUE, TRUE);
  fontNew = createFont("data/shisen/arnamu.ttf");
  fontHand = createFont("data/shisen/Vrdznagir.otf");
  fontClassic = createFont("data/shisen/Arian_Grqi_i_U.ttf");
  seed = rand();
}


void draw() {
  saveState();
  //zoom(0.5);
  drawLetters();
  if (keyWentDown("space")) seed = rand();
  if (keyWentDown("s")) save("data/shisen/letters-gen.png");
  restoreState();
}


int main() {
  windowSetResizable(TRUE);
  windowSetVariableFrameRate();
  windowSetInit(&init);
  windowSetDraw(&draw);
  windowRun();
}