emblem-generator
Version:
Generate SVG emblems
159 lines (121 loc) • 4.36 kB
JavaScript
import Raphael from 'raphael'
import defaultAssets from './defaultAssets'
import * as defaultBgImg from '../../assets/img_bg.png'
class EmblemGenerator {
constructor() {
this.flags_defs = {
"FlipBackgroundVertical": 1,
"FlipBackgroundHorizontal": 2,
"FlipForegroundVertical": 4,
"FlipForegroundHorizontal": 8
}
this.defaultAssets = {
defs: defaultAssets.defs,
bg_defs: defaultAssets.bg_defs
}
}
init(id, size, assets, bgColor) {
this.paper = Raphael(id, size, size);
// used for shadow over color
this.pto2_color = '#000000';
this.pto2_op = 0.3;
// used for cross color transparency
this.pt1_op = 0.3;
// used for emblem background
this.bg_op = 1;
// assets
this.defs = (assets && assets.defs) ? assets.defs : this.defaultAssets.defs
this.bg_defs = (assets && assets.bg_defs) ? assets.bg_defs : this.defaultAssets.bg_defs
// paper background
this.bg_color = bgColor || '';
this.bg_img = defaultBgImg.default;
// config required for transformation
this.base_size = 256;
this.flip = 0; // 1 - flipV_Bg, 2 - flipH_Bg, 4 - flipV_Fg, 8 - flipH_Fg
return this;
}
drawEmblemObj (EGobj) {
this.setFlipsEG(EGobj.flags);
const colorBg = EGobj.background_color || '#000000',
color1 = EGobj.foreground_primary_color || '#FF0000',
color2 = EGobj.foreground_secondary_color || '#FFFFFF';
this.pto2_op = EGobj.black_opacity || this.pto2_op;
const defFg = this.defs[EGobj.foreground_id] || '',
defBg = this.bg_defs[EGobj.background_id] || '';
this.drawEmblem(defFg, color1, color2, defBg, colorBg);
}
drawEmblem (defFg, color1, color2, defBg, colorBg) {
const paper = this.paper;
paper.clear();
// set background
if (this.bg_color !== '')
paper.rect(0, 0, paper.width, paper.height).attr({'fill':this.bg_color, 'stroke':this.bg_color});
else
paper.image(this.bg_img, 0, 0, paper.width, paper.height);
this.drawEmblemBg(defBg, colorBg);
this.drawEmblemFg(defFg, color1, color2);
}
drawEmblemFg (def, color1, color2) {
const paper = this.paper;
let i;
const scale = paper.width / this.base_size;
let transformStr = (scale !== 1) ? 's'.concat(scale, ',', scale, ',0,0') : '';
if (this.flip > 3)
{
transformStr = transformStr.concat(' s',((this.flip & 8) !== 0) ? -1 : 1,',',((this.flip & 4) !== 0) ? -1 : 1,',',this.base_size/2,',',this.base_size/2);
}
this.paths = [];
const paths = this.paths;
if (def.p1)
{
for(i=0;i<def.p1.length;i++)
paths[paths.length] = paper.path(def.p1[i]).attr({'fill':color1, 'stroke':'none'}).transform(transformStr);
}
if (def.p2)
{
for(i=0;i<def.p2.length;i++)
paths[paths.length] = paper.path(def.p2[i]).attr({'fill':color2, 'stroke':'none'}).transform(transformStr);
}
if (def.pto2)
{
for(i=0;i<def.pto2.length;i++)
paths[paths.length] = paper.path(def.pto2[i]).attr({'fill':this.pto2_color, 'stroke':'none', 'opacity':this.pto2_op}).transform(transformStr);
}
if (def.pt1)
{
for(i=0;i<def.pt1.length;i++)
paths[paths.length] = paper.path(def.pt1[i]).attr({'fill':color1, 'stroke':'none', 'opacity':this.pt1_op}).transform(transformStr);
}
return paths;
}
drawEmblemBg (def, color) {
const paper = this.paper;
let i;
const opacity = def.t ? this.bg_op : 1;
const scale = paper.width / this.base_size;
let transformStr = (scale !== 1) ? 's'.concat(scale, ',', scale, ',0,0') : '';
if ((this.flip & 1) !== 0 || (this.flip & 2) !== 0)
{
transformStr = transformStr.concat(' s',((this.flip & 2) !== 0) ? -1 : 1,',',((this.flip & 1) !== 0) ? -1 : 1,',',this.base_size/2,',',this.base_size/2);
}
this.bg_paths = [];
const paths = this.bg_paths;
if (def.p)
{
for(i=0;i<def.p.length;i++)
paths[paths.length] = paper.path(def.p[i]).attr({'fill':color, 'stroke':'none', 'opacity': opacity}).transform(transformStr);
}
return paths;
}
setFlipsEG (flags) {
this.flip = 0;
for(let i=0; i<flags.length; i++)
{
if (this.flags_defs[flags[i]])
{
this.flip += this.flags_defs[flags[i]];
}
}
}
}
export default EmblemGenerator