Skip to content

Instantly share code, notes, and snippets.

@ali1234
Created September 7, 2013 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ali1234/6478049 to your computer and use it in GitHub Desktop.
Save ali1234/6478049 to your computer and use it in GitHub Desktop.
This is a quick hack to generate gradient pngs for xfwm4 themes...
#!/usr/bin/python
borders = ['bottom','bottom-left','bottom-right',
'left','right',
'title-1','title-2','title-3','title-4','title-5',
'top-left','top-right']
basecolour = '#EEEEEE'
def calc_ac(x, b):
if x == b:
c = 0.0
a = 0.0
elif x < b:
c = 0.0
a = 1.0 - (x/b)
else:
a = (b - x)/(b - 1)
c = 1.0
return (a,c)
def calc_ac_byte(x, b):
x = x/255.0
b = b/255.0
(a,c) = calc_ac(x,b)
return (int(255*a), int(255*c))
import Image
class Xpm(object):
def __init__(self, basename, active):
self.basename = basename
self.active = active
data = open(basename+'-'+active+'.xpm')
assert(data.next() == '/* XPM */\n')
data.next()
self.width, self.height, self.colours, self.pixelsize = [int(x) for x in self.strip(data.next()).split()]
self.palette = {}
for n in range(self.colours):
tmp = self.strip(data.next())
colour = tmp[0:self.pixelsize]
self.palette[colour] = tmp[self.pixelsize:].split()
self.pixels = []
for n in range(self.height):
self.pixels.append(self.strip(data.next()))
def strip(self, line):
return line.strip().strip(',"')
def getpixel(self, (x,y)):
colour = ''.join(self.pixels[y][x:x+self.pixelsize])
return self.palette[colour][1]
def alphadiff(self, basecolour):
data = []
base = int(basecolour[1:3], 16)
for y in range(self.height):
for x in range(self.width):
pixel = self.getpixel((x,y))
if pixel == 'None':
data.append('\x00\x00\x00\x00')
else:
colour = int(pixel[1:3], 16)
a,c = calc_ac_byte(colour, base)
if base < colour:
data.append('\xFF\xFF\xFF'+chr(a))
else:
data.append('\x00\x00\x00'+chr(a))
png = Image.frombytes('RGBA', (self.width, self.height), ''.join(data))
png.save(self.basename+'-'+self.active+'.png')
def savexpm(self, basecolour):
f = open(self.basename+'-'+self.active+'.xpm', 'w')
f.write('/* XPM */\n')
f.write('static char * '+self.basename.replace('-','_')+'_'+self.active+'_xpm[] = {\n')
f.write('"%d %d %d %d",\n' % (self.width, self.height, 2, 1))
f.write('" \tc None",\n')
f.write('".\tc '+basecolour+' s inactive_color_2",\n')
for y in range(self.height):
f.write('"')
for x in range(self.width):
f.write(' ' if self.getpixel((x,y)) == 'None' else '.')
f.write('",\n')
f.write('}\n')
def process(basename, active, basecolour):
orig = Xpm(basename,active)
orig.alphadiff(basecolour)
orig.savexpm(basecolour)
for b in borders:
process(b, 'active', basecolour)
process(b, 'inactive', basecolour)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment