mirror of
https://github.com/google/blockly.git
synced 2026-01-07 00:50:27 +01:00
* Google changed from an Inc to an LLC. This happened back in 2017 but we didn’t notice. Officially we should update files from Inc to LLC when they are changed as part of regular edits, but this is a nightmare to remember for the next decade. * Remove project description/titles from licenses This is no longer part of Google’s header requirements. Our existing descriptions were useless (“Visual Blocks Editor”) or grossly obselete (“Visual Blocks Language”). * License no longer requires URL. * Fix license regexps.
182 lines
5.4 KiB
Python
182 lines
5.4 KiB
Python
# !/usr/bin/env python
|
|
# Converts a single colour to primary, secondary and tertiary colours.
|
|
# Primary Colour - The colour given
|
|
# Secondary Colour - Lightens the primary colour by .8
|
|
# Tertiary Colour - Darkens the primary colour by .2
|
|
#
|
|
# Copyright 2012 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
#
|
|
# Usage: create_blockStyles.py <fileName>
|
|
#
|
|
# fileName - Name of the file holding the map of style names to colours.
|
|
# Refer to blockStyles_example.json for an example input.
|
|
#
|
|
# Input: A json file with the keys being style names and the values
|
|
# being either a hue (number) or a hex value (string).
|
|
# Ex: {"styleName": 10, "styleName2": "#FFFFFF"}
|
|
#
|
|
# Output: A json file with the keys being style names and the values being an
|
|
# object holding primary, secondary, and tertiary colours in hex format.
|
|
# {"styleName":
|
|
# {"colourPrimary":"hexVal",
|
|
# "colourSecondary":"hexVal",
|
|
# "colourTertiary":"hexVal"
|
|
# }
|
|
# }
|
|
|
|
import math
|
|
import json
|
|
import sys
|
|
|
|
HSV_SATURATION = .45
|
|
BRIGHTNESS_VAL = .65 * 255
|
|
LIGHT_FACTOR = .8
|
|
DARK_FACTOR = .2
|
|
|
|
#Change HSV (Hue Saturation Value) to RGB
|
|
#This is adapted to python from the js version found here:
|
|
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
|
|
def hsvToRgb(h, s, brightness):
|
|
red = 0
|
|
green = 0
|
|
blue = 0
|
|
if (s == 0):
|
|
red = brightness
|
|
green = brightness
|
|
blue = brightness
|
|
else:
|
|
sextant = math.floor(h / 60)
|
|
remainder = (float(h) / float(60)) - sextant
|
|
val1 = brightness * (1 - s)
|
|
val2 = brightness * (1 - (s * remainder))
|
|
val3 = brightness * (1 - (s * (1 - remainder)))
|
|
if sextant == 1:
|
|
red = val2
|
|
green = brightness
|
|
blue = val1
|
|
elif sextant == 2:
|
|
red = val1
|
|
green = brightness
|
|
blue = val3
|
|
elif sextant == 3:
|
|
red = val1
|
|
green = val2
|
|
blue = brightness
|
|
elif sextant == 4:
|
|
red = val3
|
|
green = val1
|
|
blue = brightness
|
|
elif sextant == 5:
|
|
red = brightness
|
|
green = val1
|
|
blue = val2
|
|
elif sextant == 0:
|
|
red = brightness
|
|
green = val3
|
|
blue = val1
|
|
return [math.floor(red), math.floor(green), math.floor(blue)]
|
|
|
|
|
|
#Blend two rgb colours with the factor being the weight given to the first colour
|
|
#This is adapted to python from the js version found here:
|
|
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
|
|
def blend(rgb1, rgb2, factor):
|
|
factor = max(min(factor, 1), 0)
|
|
return [
|
|
round(rgb2[0] + factor * (rgb1[0] - rgb2[0])),
|
|
round(rgb2[1] + factor * (rgb1[1] - rgb2[1])),
|
|
round(rgb2[2] + factor * (rgb1[2] - rgb2[2]))
|
|
]
|
|
|
|
|
|
#Lightens a given rgb colour
|
|
#This is adapted to python from the js version found here:
|
|
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
|
|
def lighten(rgb, factor):
|
|
white = [255, 255, 255]
|
|
return blend(white, rgb, factor)
|
|
|
|
|
|
#Darkens a given rgb colour
|
|
#This is adapted to python from the js version found here:
|
|
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
|
|
def darken(rgb, factor):
|
|
black = [0, 0, 0];
|
|
return blend(black, rgb, factor)
|
|
|
|
|
|
#Converts rgb to hex
|
|
def rgbToHex(rgb):
|
|
#Add checks in here to make sure valid numbers
|
|
return '#%02x%02x%02x' % (rgb[0], rgb[1], rgb[2])
|
|
|
|
|
|
#Calculates the primary, secondary and tertiary colours for the block style
|
|
def findOtherColours(rgb):
|
|
colourPrimary = rgbToHex(rgb)
|
|
colourSecondary = rgbToHex(lighten(rgb, LIGHT_FACTOR))
|
|
colourTertiary = rgbToHex(darken(rgb, DARK_FACTOR))
|
|
return {
|
|
"colourPrimary": colourPrimary,
|
|
"colourSecondary": colourSecondary,
|
|
"colourTertiary": colourTertiary
|
|
}
|
|
|
|
# Converts a hex colour to rgb colour format
|
|
def hexToRgb(hexColour):
|
|
r = int(hexColour[1:3], 16)
|
|
g = int(hexColour[3:5], 16)
|
|
b = int(hexColour[5:7], 16)
|
|
return [r, g, b]
|
|
|
|
# Converts either a hue or hex colour to rgb colour format
|
|
def findRgbVal(colour):
|
|
try:
|
|
hue = int(colour)
|
|
rgb = hsvToRgb(hue, HSV_SATURATION, BRIGHTNESS_VAL)
|
|
except (TypeError, ValueError):
|
|
hexColour = colour
|
|
rgb = hexToRgb(hexColour)
|
|
return rgb
|
|
|
|
# Get info on the input file
|
|
def getFileInfo():
|
|
if (len(sys.argv) < 2):
|
|
print("Please provide a filename")
|
|
sys.exit()
|
|
fileName = sys.argv[1]
|
|
try:
|
|
jsonFile = open(fileName).read()
|
|
except IOError as err:
|
|
print('Could not find that file name')
|
|
sys.exit()
|
|
return (jsonFile, fileName)
|
|
|
|
# Creates a map with the keys being the style names and the values being an object
|
|
# holding colourPrimary, colourSecondary, colourTertiary
|
|
def createColourMap():
|
|
(jsonFile, fileName) = getFileInfo()
|
|
jsonData = json.loads(jsonFile)
|
|
colourObj = {}
|
|
for key in jsonData.keys():
|
|
rgbVal = findRgbVal(jsonData[key])
|
|
colourObj[key] = findOtherColours(rgbVal)
|
|
f= open("new_" + fileName,"w+")
|
|
f.write(json.dumps(colourObj, indent=2, sort_keys=True))
|
|
f.close()
|
|
|
|
createColourMap()
|