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.
 
 
 
 
 

161 lines
8.2 KiB

#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import sys, os
sys.path.append(os.path.join(sys.path[0],'../../libs/pyTermTk'))
import TermTk as ttk
ttk.TTkLog.use_default_file_logging()
from TermTk import TTkWidget, TTkColor, TTkString
class TTkPeppered(TTkWidget):
# to save space I just recycle the 20x20 imageArray (~10K)
# used in the "TtkAbout" Widget
peppered_20= ttk.TTkAbout.peppered
peppered_10=[
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x67,0x01], [0x25,0x93,0x1c], [0x22,0x7e,0x12], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x0a,0x00,0x00], [0x3e,0x29,0x08], [0x2f,0x97,0x2d], [0x2e,0x9a,0x2b], [0x6b,0x3b,0x10], [0x92,0x15,0x16], [0x4b,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0xcd,0x1e,0x1e], [0xff,0x82,0x82], [0xec,0x0a,0x0c], [0xfb,0x80,0x61], [0x61,0x9f,0x33], [0xea,0x4e,0x42], [0xff,0x70,0x71], [0x81,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0xa7,0x00,0x00], [0xdd,0x00,0x00], [0xc7,0x00,0x00], [0xff,0x12,0x0e], [0xff,0x2f,0x1d], [0xf1,0x00,0x00], [0x6b,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x3e,0x00,0x00], [0x65,0x00,0x00], [0xb8,0x00,0x00], [0xdc,0x00,0x00], [0x97,0x00,0x00], [0x86,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x3f,0x00,0x00], [0xd4,0x00,0x00], [0xc0,0x00,0x00], [0xff,0x00,0x00], [0xea,0x00,0x00], [0xd9,0x00,0x00], [0x22,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x15,0x00,0x00], [0xd7,0x00,0x00], [0xff,0x05,0x06], [0xff,0x09,0x09], [0xff,0x0a,0x0a], [0xe0,0x00,0x00], [0x1e,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0xa2,0x00,0x00], [0xff,0x00,0x00], [0xff,0x69,0x69], [0xff,0x00,0x00], [0xbc,0x00,0x00], [0x14,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x58,0x00,0x00], [0xb0,0x00,0x00], [0xff,0x72,0x71], [0xe0,0x05,0x05], [0x7c,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00]],
[[0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x15,0x00,0x00], [0x55,0x00,0x00], [0x21,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00], [0x00,0x00,0x00]]]
peppered_old=[
['#000000', '#000000', '#000000', '#006701', '#25931c', '#227e12', '#000000', '#000000', '#000000', '#000000'],
['#000000', '#000000', '#0a0000', '#3e2908', '#2f972d', '#2e9a2b', '#6b3b10', '#921516', '#4b0000', '#000000'],
['#000000', '#cd1e1e', '#ff8282', '#ec0a0c', '#fb8061', '#619f33', '#ea4e42', '#ff7071', '#810000', '#000000'],
['#000000', '#a70000', '#dd0000', '#c70000', '#ff120e', '#ff2f1d', '#f10000', '#6b0000', '#000000', '#000000'],
['#000000', '#000000', '#3e0000', '#650000', '#b80000', '#dc0000', '#970000', '#860000', '#000000', '#000000'],
['#000000', '#000000', '#3f0000', '#d40000', '#c00000', '#ff0000', '#ea0000', '#d90000', '#220000', '#000000'],
['#000000', '#000000', '#150000', '#d70000', '#ff0506', '#ff0909', '#ff0a0a', '#e00000', '#1e0000', '#000000'],
['#000000', '#000000', '#000000', '#a20000', '#ff0000', '#ff6969', '#ff0000', '#bc0000', '#140000', '#000000'],
['#000000', '#000000', '#000000', '#580000', '#b00000', '#ff7271', '#e00505', '#7c0000', '#000000', '#000000'],
['#000000', '#000000', '#000000', '#000000', '#150000', '#550000', '#210000', '#000000', '#000000', '#000000']]
def __init__(self, *args, **kwargs):
TTkWidget.__init__(self, *args, **kwargs)
self.setGeometry(0,0,40,40)
def reduce(self, a,b,c,d):
# quadblitter notcurses like
l = (a,b,c,d)
def delta(i):
return max([v[i] for v in l]) - min([v[i] for v in l])
deltaR = delta(0)
deltaG = delta(1)
deltaB = delta(2)
def midColor(c1,c2):
return ((c1[0]+c2[0])//2,(c1[1]+c2[1])//2,(c1[2]+c2[2])//2)
def closer(a,b,c):
return \
( (a[0]-c[0])**2 + (a[1]-c[1])**2 + (a[2]-c[2])**2 ) > \
( (b[0]-c[0])**2 + (b[1]-c[1])**2 + (b[2]-c[2])**2 )
def splitReduce(i):
s = sorted(l,key=lambda x:x[i])
mid = (s[3][i]+s[0][i])//2
if s[1][i] < mid:
if s[2][i] > mid:
c1 = midColor(s[0],s[1])
c2 = midColor(s[2],s[3])
else:
c1 = midColor(s[0],s[1])
c1 = midColor(c1,s[2])
c2 = s[3]
else:
c1 = s[0]
c2 = midColor(s[1],s[2])
c2 = midColor(c1,s[3])
ch = 0x01 if closer(c1,c2,l[0]) else 0
ch |= 0x02 if closer(c1,c2,l[1]) else 0
ch |= 0x04 if closer(c1,c2,l[2]) else 0
ch |= 0x08 if closer(c1,c2,l[3]) else 0
# 0x00 0x01 0x02 0x03
quad = [ ' ', '', '', '',
# 0x04 0x05 0x06 0x07
'', '', '', '',
# 0x08 0x09 0x0A 0x0B
'', '', '', '',
# 0x0C 0x0D 0x0E 0x0F
'', '', '', '']
return TTkString() + \
(TTkColor.bg(f'#{c1[0]:02X}{c1[1]:02X}{c1[2]:02X}') + \
TTkColor.fg(f'#{c2[0]:02X}{c2[1]:02X}{c2[2]:02X}')) + \
quad[ch]
if deltaR >= deltaG and deltaR >= deltaB:
# Use Red as splitter
return splitReduce(0)
elif deltaG >= deltaB and deltaG >= deltaR:
# Use Green as splitter
return splitReduce(1)
else:
# Use Blue as splitter
return splitReduce(2)
def paintEvent(self, canvas):
for y, row in enumerate(TTkPeppered.peppered_old):
for x, col in enumerate(row):
if col == "#000000":
color=TTkColor.RST
else:
color=TTkColor.bg(col)
canvas.drawText(pos=(x,y), text=' ', color=color)
img = self.peppered_20
for y in range(0, len(img)&(~1), 2):
for x in range(0, min(len(img[y])&(~1),len(img[y+1])&(~1)), 2):
canvas.drawText( \
pos=(x//2+11,y//2), \
text=self.reduce(
img[y][x] , img[y][x+1] ,
img[y+1][x] , img[y+1][x+1] ))
img = self.peppered_10
for y in range(0, len(img)&(~1), 2):
for x in range(0, min(len(img[y])&(~1),len(img[y+1])&(~1)), 2):
canvas.drawText( \
pos=(x//2+22,y//2), \
text=self.reduce(
img[y][x] , img[y][x+1] ,
img[y+1][x] , img[y+1][x+1] ))
canvas.drawText(pos=(22,6), text='TEST Peppered')
root = ttk.TTk()
win = ttk.TTkWindow(parent=root,pos = (1,1), size=(40,15), title="About", border=True)
TTkPeppered(parent=win)
root.mainloop()