' HueAndTone v0.1 - (C) 2011 Nonki Takahashi
' shows hue and tone
'
' History
' 2011/04/07 Created (429 lines)
'
' Reference
' [1] James D. Foley, Andries Van Dam "Fundamentals of Interactive Computer Graphics" 1982
' [2] Japan Color Institute "Digital Color Manual" 2004
'
' Constant
VERSION = "v0.1"
UNDEFINED = "N/A"
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
COLORPICK_X = 170
COLORPICK_Y = 82
' Main
GraphicsWindow.Show()
iX0 = 50
iY0 = 50
GraphicsWindow.Width = 256 * 2 + iX0 * 3 + COLORPICK_X
GraphicsWindow.Height = 256 + iY0 * 2 + COLORPICK_Y
GraphicsWindow.Title = "Hue and Tone " + VERSION
Console_Init()
ColorPick_Init()
' RGB Hue = 0 Lightness x Saturation
uFolder = "http://homepage2.nifty.com/nobukit/smallbasic.files/"
sURL = uFolder + "RGB_Hue0LS.png"
GraphicsWindow.DrawImage(sURL, iX0, iY0)
' Web safe color Hue = 0 Lightness x Saturation
sURL = uFolder + "WSC_Hue0LS.png"
GraphicsWindow.DrawImage(sURL, 256 + iX0 * 2, iY0)
Goto lSkip
rHue = 210
' RGB Lightness x Saturation
For iL = 255 To 0 Step -1
iY = iY0 + (255 - iL)
rLightness = iL / 255
For iS = 0 To 255
iX = iX0 + iS
rSaturation = iS / 255
Color_HSLtoRGB()
GraphicsWindow.SetPixel(iX, iY, sColor)
EndFor
EndFor
' Web safe color Lightness x Saturation
For iL = 255 To 0 Step -1
iY = iY0 + (255 - iL)
rLightness = iL / 255
For iS = 0 To 255
iX = 256 + iX0 * 2 + iS
rSaturation = iS / 255
Color_HSLtoRGB()
Color_ColorToSafe()
GraphicsWindow.SetPixel(iX, iY, sColor)
EndFor
EndFor
lSkip:
ColorPick_Show()
HueAndTone_Init()
bMouseMoved = "False"
While "True"
If bMouseMoved Then
Shapes.Move(oRect, iMX + 10, iMY + 10)
Shapes.Move(oText, iMX + 14, iMY + 14)
sColor = GraphicsWindow.GetPixel(iMX, iMY)
Color_RGBtoHSL()
Color_HSLtoRGB()
If rHue = UNDEFINED Then
iHue = rHue
Else
iHue = Math.Round(rHue * 256 / 360)
EndIf
sText = sColor + CRLF + "H=" + iHue + CRLF + "S=" + Math.Round(rSaturation * 255) + CRLF + "L=" + Math.Round(rLightness * 255)
HueAndTone_ColorToName()
sText = sText + CRLF + sName
Shapes.SetText(oText, sText)
bMouseMoved = "False"
Else
Program.Delay(200)
EndIf
EndWhile
' Color | Convert Color to RGB
' in: sColor - "#rrggbb"
' out: iR, iG, iB - [0, 255]
Sub Color_ColorToRGB
sR = Text.GetSubText(sColor, 2, 2)
sG = Text.GetSubText(sColor, 4, 2)
sB = Text.GetSubText(sColor, 6, 2)
sHex = sR
Math_Hex2Dec()
iR = iDec
sHex = sG
Math_Hex2Dec()
iG = iDec
sHex = sB
Math_Hex2Dec()
iB = iDec
EndSub
' Color | Convert safe color to number
' in: sColor - "#rrggbb"
' out: iNum - web safe color number
Sub Color_SafeToNum
Color_ColorToRGB()
iNum = (iB / 51) * 36 + (iG / 51) * 6 + (iR / 51)
EndSub
' Color | Convert number to safe color
' in: iNum - web safe color number
' out: sColor - "#rrggbb"
Sub Color_NumToSafe
iR = Math.Remainder(iNum, 6) * 51
iG = Math.Remainder(Math.Floor(iNum / 6), 6) * 51
iB = Math.Floor(iNum / 36) * 51
sColor = GraphicsWindow.GetColorFromRGB(iR, iG, iB)
EndSub
' Color | Convert color to safe color
' in/out: sColor - "#rrggbb"
Sub Color_ColorToSafe
Color_ColorToRGB()
iR = Math.Floor(iR / (256 / 6)) * 51
iG = Math.Floor(iG / (256 / 6)) * 51
iB = Math.Floor(iB / (256 / 6)) * 51
sColor = GraphicsWindow.GetColorFromRGB(iR, iG, iB)
EndSub
' Hue and tone | Convert color to name
' in: sColor - "#rrggbb"
' out: sName - hue and tone name
' out: iHue - [1..21]
' out: iTone - [1, 19]
Sub HueAndTone_ColorToName
sColorSaved = sColor
Color_RGBtoHSL()
iH = Math.Round(rHue * 256 / 360)
Color_ColorToSafe()
Color_RGBtoHSL()
iS = Math.Round(rSaturation * 255)
iL = Math.Round(rLightness * 255)
For iHue = 1 To 21
If iH <= HueAndTone_iHMax[iHue] Then
Goto lFoundHue
EndIf
EndFor
TextWindow.WriteLine("Error: hue not found for " + sColorSaved)
lFoundHue:
For iTone = 1 To 21
If HueAndTone_iS[iTone] = iS And HueAndTone_iL[iTone] = iL Then
Goto lFoundTone
EndIf
EndFor
TextWindow.WriteLine("Error: tone not found for " + sColorSaved + " H=" + iH + " S=" + iS + " L=" + iL)
lFoundTone:
If iTone >= 16 Then
sName = HueAndTone_sTone[iTone]
Else
iPtr = Text.GetIndexOf(HueAndTone_sHue[iHue], "の")
If iPtr > 0 And Text.IsSubText(HueAndTone_sTone[iTone], "の") Then
sName = Text.GetSubText(HueAndTone_sHue[iHue], 1, iPtr - 1) + "を帯びた" + Text.GetSubTextToEnd(HueAndTone_sHue[iHue], iPtr + 1)
Else
sName = HueAndTone_sHue[iHue]
EndIf
sName = HueAndTone_sTone[iTone] + sName
EndIf
EndSub