#!/usr/bin/python2.7 import re import time from subprocess import call import simplejson as json import sys import os import sha from Config import * from Pb import Pb _default_color_1 = "white" _default_color_2 = "black" _default_bevel_percent = "12"; _halftone_values = { "checkeredfade": "h6x6a", "etchedtransition": "o8x8", "bendaydots": "h16x16o", "smallerdots1": "h8x8o", "smallerdots2": "c7x7w", "flatstripes": "o2x2", } class PbGradient(Pb): _test_params = { "width" : "200", "color1" : "#ffdead", "color2" : "blue", "stripes" : "true", "stripenumber" : "20", "gradienttype" : "radial", "stripeintensity" : "20", "halftone" : "checkeredfade", "percentbeveled" : "30", "flip" : "true", "bevel" : "flatinner", "rotate" : "20", "height" : "200", "filetype" : "jpg", "username" : "whatever" } def __init__(self, width=DEFAULT_WIDTH, height=DEFAULT_HEIGHT, color1=_default_color_1, color2=_default_color_2, stripes=0, stripenumber=0, stripeintensity=0, blurriness=0, contrast=100, brightness=100, saturation=100, hue=100, halftone=None, bevel=None, percentbeveled=_default_bevel_percent, tilt=0, rotate=0, flip=False, flop=False, filetype=DEFAULT_FINALFORMAT, gradienttype="default", username=None, ): super(PbGradient,self).__init__(); self.params.set_val("width", width, value_type="int") self.params.set_val("height", height, value_type="int") self.params.set_val("color1", color1, value_type="color") self.params.set_val("color2", color2, value_type="color") self.params.set_val("stripes", stripes, value_type="int") self.params.set_val("stripenumber", stripenumber, value_type="int") self.params.set_val("stripeintensity", stripeintensity, value_type="int") self.params.set_val("blurriness", blurriness, value_type="int") self.params.set_val("contrast", contrast, value_type="int") self.params.set_val("brightness", brightness, value_type="int") self.params.set_val("saturation", saturation, value_type="int") self.params.set_val("hue", hue, value_type="int") self.params.set_val("halftone", halftone, value_type="enum") self.params.set_val("bevel", bevel, value_type="enum") self.params.set_val("percentbeveled", percentbeveled, value_type="int") self.params.set_val("height", height, value_type="int") self.params.set_val("height", height, value_type="int") for key in PARAM_LIST: if key in kwargs: if key in ['color1', 'color2']: params[key] = self.is_color(kwargs[key]) else: params[key] = self.sanitize(kwargs[key]) if key in ['rotate','tilt','blurriness','stripenumber','stripeintensity']: params[key] = params[key] if self.is_number(params[key]) else "" elif key in ['brightness', 'contrast', 'hue']: if not self.is_number(params[key]) or params[key] == "100": params[key] = "" else: params[key] = "" params['width'] = params['width'] if self.is_number(params['width']) else DEFAULT_WIDTH params['height'] = params['height'] if self.is_number(params['height']) else DEFAULT_HEIGHT params["color1"] = params["color1"] or DEFAULT_COLORS["color1"]; params["color2"] = params["color2"] or DEFAULT_COLORS["color2"]; self.params = params if not self.params['percentbeveled']: self.params['percentbeveled'] = DEFAULT_BEVEL_PERCENT self._bevelvalues = [ "flatout", "flatinner", "evenlyframed", "biginner", "bigouter", "dramaticflatout", "dramaticflatinner", ] def _filename_create(self): _base = "{}{}-{}_{}".format( self.__class__.__name__, self.params.color1.replace('#','').replace('(','-').replace(')','-'), self.params.color2.replace('#','').replace('(','-').replace(')','-'), self._now, ) if self.params.username: _base += "_%s" % self.params.username return _base + ".%s" % self.params.filetype def _build_cmd(self): self.cmd = [BIN_CONVERT] self.cmd.extend([ '-size', "{}x{}".format(self.params["width"],self.params["height"]) ]) if self.params['rotate']: self.cmd.extend(["-rotate", self.params["rotate"]]) if self.params['tilt']: self.cmd.extend(["-distort","SRT",self.params['tilt']]) if self.params['flip'] == "true": self.cmd.append("-flip") if self.params['flop'] == "true": self.cmd.append("-flop") if self.params['contrast']: self.cmd.extend(["-contrast-stretch", self.params['contrast']]) _gradients = { "default" : "gradient:{}-{}".format(self.params['color1'], self.params['color2']), "canvas" : ["canvas:{}".format(self.params['color1'])], "radial" : [ "radial-gradient:{}-{}".format( self.params['color1'], self.params['color2']) ], "colorspace" : [ "-colorspace", "Gray", "plasma:{}-{}".format(self.params['color1'], self.params['color2']) ], "mirrored" : [ "plasma:{}-{}".format(self.params['color1'], self.params['color2']), "\(","+clone","-flop","\)", "append" ], "plasmawash" : [ "plasma:{}-{}".format(self.params['color1'], self.params['color2']), "-set","colorspace","HSB" ], "gradientwash" : [ "gradient:{}-{}".format(self.params['color1'], self.params['color2']), "-set","colorspace","HSB" ], "noise" : ["xc:","+noise","Random","-virtual-pixel","tile"] } cmd += _gradients[self.params.gradienttype] if self.params['blurriness']: self.cmd.extend(["-blur","0x{}".format(self.params["blurriness"]),"-auto-level"]) if self.params['stripes'] == "true" and len(self.params['stripenumber']): self.cmd.extend(["-function","Sinusoid"]) if self.params['stripeintensity']: self.cmd.append("{},{}".format(self.params['stripenumber'],self.params["stripeintensity"])) else: self.cmd.append(self.params['stripenumber']) if self.params["halftone"] in HALFTONEVALUES: self.cmd.extend([ "-ordered-dither", HALFTONEVALUES[self.params["halftone"]] ]) self.cmd += [ '-modulate', "{},{},{}".format( self.params['brightness'] or "100", self.params['saturation'] or "100", self.params['hue'] or "100") ] self.cmd.append(os.path.join(self.directory,self.filename)); self._call_cmd(self.cmd) def _get_bevelvalue(self): w, h = map(int, (self.params['width'], self.params['height'])) if h >= w: bevpercentval = str(int(self.params['percentbeveled'])*0.005*int(h)) else: bevpercentval = str(int(self.params['percentbeveled'])*0.005*int(w)) return { "flatout": ["-s",bevpercentval,"-m","outer"], "flatinner": ["-s",bevpercentval,"-m","inner"], "evenlyframed": ["-s ",bevpercentval,"-m", "split"], "biginner": ["-s",bevpercentval,"-m","outer","-c","50","-b","red","-a","25"], "bigouter": ["-s",bevpercentval,"-m","split","-c","50","-b","red","-a","25"], "dramaticflatout": ["-s",bevpercentval,"-m","outer","-a","25","-b","blue"], "dramaticflatinner": ["-s",bevpercentval,"-m","outer","-a","25","-b","blue"], }[self.params['bevel']] def _make_bevel(self): cmd = [BEVELBORDER] cmd += self._get_bevelvalue() cmd += [ os.path.join(self.directory,self.filename), os.path.join(self.directory, self.filename) ] self._call_cmd(cmd) def create(self): self.filename = self.newfilename() self.filepath = os.path.join(self.directory, self.filename) self._build_cmd() # sys.stderr.write(str(self.cmd)) if self.params['bevel'] in self._bevelvalues: self._make_bevel()