You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
4.9 KiB
220 lines
4.9 KiB
13 years ago
|
#!/usr/bin/env python
|
||
|
|
||
|
import sys
|
||
|
from qt import *
|
||
|
|
||
|
seed = 0.353535353535
|
||
|
KINDA_RAND_MAX = 32767
|
||
|
|
||
|
def kindaRand():
|
||
|
global seed
|
||
|
seed = seed * 147
|
||
|
seed = seed - int(seed)
|
||
|
return int(seed*(KINDA_RAND_MAX + 1))
|
||
|
|
||
|
velmax = 15
|
||
|
velmin = 4
|
||
|
|
||
|
def velocity(i):
|
||
|
if i == 1 or i == 2:
|
||
|
i = (kindaRand()&0x7fff % velmax)/3 + velmin
|
||
|
else:
|
||
|
i = (kindaRand()&0x7fff % velmax) + velmin
|
||
|
|
||
|
maxpoints = 5
|
||
|
maxcurves = 8
|
||
|
|
||
|
def poly():
|
||
|
d = QApplication.desktop()
|
||
|
d.setBackgroundColor(white)
|
||
|
xvel = [ 0 ] * 8
|
||
|
yvel = [ 0 ] * 8
|
||
|
head = 0
|
||
|
tail = -maxcurves + 2
|
||
|
a = QPointArray() * maxcurves
|
||
|
r = d.rect()
|
||
|
for i in range(maxcurves):
|
||
|
a[i].resize(maxpoints)
|
||
|
p = a[0]
|
||
|
for i in range(maxpoints):
|
||
|
p.setPoint(i, (kindaRand()&0x7fff) % r.width(),
|
||
|
(kindaRand()&0x7fff) % r.height() )
|
||
|
xvel[i] = velocity(i)
|
||
|
yvel[i] = velocity(i)
|
||
|
|
||
|
paint = QPainter()
|
||
|
paint.begin(d)
|
||
|
|
||
|
for ntimes in range(2000):
|
||
|
paint.setBrush(QColor(kindaRand()%360,180,255, QColor.Hsv))
|
||
|
paint.drawPolygon(a[head])
|
||
|
tail = tail + 1
|
||
|
if tail >= maxcurves:
|
||
|
tail = 0
|
||
|
minx = r.left()
|
||
|
maxx = r.right()
|
||
|
miny = r.top()
|
||
|
maxy = r.bottom()
|
||
|
p = a[head]
|
||
|
head = head + 1
|
||
|
if head >= maxcurves:
|
||
|
head = 0
|
||
|
for i in range(maxpoints):
|
||
|
x, y = p.point(i)
|
||
|
x = x + xvel[i]
|
||
|
y = y + yvel[i]
|
||
|
if x >= maxx:
|
||
|
x = maxx - (x - maxx + 1)
|
||
|
xvel[i] = -velocity(i)
|
||
|
if x <= minx:
|
||
|
x = minx + (minx - x + 1)
|
||
|
xvel[i] = velocity(i)
|
||
|
if y >= maxy:
|
||
|
y = maxy - (y - maxy + 1)
|
||
|
yvel[i] = -velocity(i)
|
||
|
if y <= miny:
|
||
|
y = miny + (miny - y + 1)
|
||
|
yvel[i] = velocity(i)
|
||
|
a[head].setPoint(i, x, y)
|
||
|
paint.end()
|
||
|
|
||
|
def rotate():
|
||
|
w = 64
|
||
|
h = 64
|
||
|
image = QImage(w, h, 8, 128)
|
||
|
for i in range(128):
|
||
|
image.setColor(i, qRgb(i,0,0))
|
||
|
for y in range(h):
|
||
|
for x in range(w):
|
||
|
image.setPixel(x,y,(x+y)%128)
|
||
|
|
||
|
pm = QPixmap()
|
||
|
pm.convertFromImage(image)
|
||
|
#pm.optimize(1)
|
||
|
|
||
|
d = QApplication.desktop()
|
||
|
|
||
|
for i in range(0,361,2):
|
||
|
m = QWMatrix()
|
||
|
m.rotate(i)
|
||
|
rpm = pm.xForm(m)
|
||
|
d.setBackgroundPixmap(rpm)
|
||
|
d.update()
|
||
|
|
||
|
def generateStone(pm, c1, c2, c3):
|
||
|
p = QPainter()
|
||
|
p1 = QPen(c1, 0)
|
||
|
p2 = QPen(c2, 0)
|
||
|
p3 = QPen(c3, 0)
|
||
|
|
||
|
p.begin(pm)
|
||
|
for i in range(pm.width()):
|
||
|
for j in range(pm.height()):
|
||
|
r = kindaRand()
|
||
|
if r < KINDA_RAND_MAX / 3:
|
||
|
p.setPen(p1)
|
||
|
elif r < KINDA_RAND_MAX / 3 * 2:
|
||
|
p.setPen(p2)
|
||
|
else:
|
||
|
p.setPen(p3)
|
||
|
p.drawPoint(i, j)
|
||
|
p.end()
|
||
|
|
||
|
def drawShadeText(p, x, y, text, topColor, bottomColor, sw=2):
|
||
|
if not p.isActive():
|
||
|
return
|
||
|
|
||
|
p.setPen(bottomColor)
|
||
|
p.drawText(x+sw, y+sw, text)
|
||
|
p.setPen(topColor)
|
||
|
p.drawText(x, y, text)
|
||
|
|
||
|
class DesktopWidget(QWidget):
|
||
|
def __init__(self, s, parent=None, name=''):
|
||
|
QWidget.__init__(self, parent, name, WType_Desktop | WPaintDesktop)
|
||
|
self.text = s
|
||
|
self.pm = None
|
||
|
|
||
|
def paintEvent(self, pe):
|
||
|
c1 = self.backgroundColor()
|
||
|
c2 = c1.light(104)
|
||
|
c3 = c1.dark(106)
|
||
|
if not self.pm:
|
||
|
self.pm = QPixmap(64, 64)
|
||
|
generateStone(self.pm, c1, c2, c3)
|
||
|
self.setBackgroundPixmap(self.pm)
|
||
|
self.update()
|
||
|
br = self.fontMetrics().boundingRect(self.text)
|
||
|
offscreen = QPixmap(br.width(), br.height())
|
||
|
x = self.width()/2 - br.width()/2
|
||
|
y = self.height()/2 - br.height()/2
|
||
|
offscreen.fill(self, x, y)
|
||
|
p = QPainter()
|
||
|
p.begin(offscreen)
|
||
|
drawShadeText(p, -br.x(), -br.y(), self.text, c2, c3, 3)
|
||
|
p.end()
|
||
|
bitBlt(self, x, y, offscreen)
|
||
|
|
||
|
def desktopWidget(s='Troll Tech'):
|
||
|
t = DesktopWidget(s)
|
||
|
t.update()
|
||
|
qApp.exec_loop()
|
||
|
|
||
|
def desktopText(s='Troll Tech'):
|
||
|
border = 20
|
||
|
|
||
|
c1 = qApp.palette().normal().background()
|
||
|
c2 = c1.light(104)
|
||
|
c3 = c1.dark(106)
|
||
|
|
||
|
pm = QPixmap(10, 10)
|
||
|
p = QPainter()
|
||
|
p.begin(pm)
|
||
|
r = p.fontMetrics().boundingRect(s)
|
||
|
p.end()
|
||
|
|
||
|
appWidth = qApp.desktop().width()
|
||
|
appHeight = qApp.desktop().height()
|
||
|
if r.width() > appWidth - border*2:
|
||
|
r.setWidth(appWidth - border*2)
|
||
|
if r.height() > appHeight - border*2:
|
||
|
r.setHeight(appHeight - border*2)
|
||
|
|
||
|
pm.resize(r.size().width()+border*2,r.size().height()+border*2)
|
||
|
generateStone(pm, c1, c2, c3)
|
||
|
p.begin(pm)
|
||
|
drawShadeText(p, -r.x()+border, -r.y()+border, s, c2, c3)
|
||
|
p.end()
|
||
|
|
||
|
qApp.desktop().setBackgroundPixmap(pm)
|
||
|
|
||
|
a = QApplication(sys.argv)
|
||
|
if len(sys.argv) > 1:
|
||
|
f = QFont('charter', 96, QFont.Weight.Black)
|
||
|
f.setStyleHint(QFont.StyleHint.Times)
|
||
|
a.setFont(f)
|
||
|
validOptions = 0
|
||
|
if len(sys.argv) == 2:
|
||
|
validOptions = 1
|
||
|
if sys.argv[1] == '-poly':
|
||
|
poly()
|
||
|
elif sys.argv[1] == '-rotate':
|
||
|
rotate()
|
||
|
elif sys.argv[1] == '-troll':
|
||
|
desktopText()
|
||
|
elif sys.argv[1] == '-trollwidget':
|
||
|
desktopWidget()
|
||
|
else:
|
||
|
validOptions = 0
|
||
|
if len(sys.argv) == 3:
|
||
|
validOptions = 1
|
||
|
if sys.argv[1] == '-shadetext':
|
||
|
desktopText(sys.argv[2])
|
||
|
elif sys.argv[1] == '-shadewidget':
|
||
|
desktopWidget(sys.argv[2])
|
||
|
else:
|
||
|
validOptions = 0
|
||
|
|
||
|
if not validOptions:
|
||
|
rotate()
|