PureBasic Forum http://forums.purebasic.com/english/ |
|
ColorSpectrum - Module http://forums.purebasic.com/english/viewtopic.php?f=12&t=72323 |
Page 1 of 1 |
Author: | StarBootics [ Thu Feb 21, 2019 2:43 am ] |
Post subject: | ColorSpectrum - Module |
Hello everyone, A ColorRequester() alternative, more compact than the currently available one apparently very similar to the MS Paint one's. I deserve credit for converting the original code into a Module. Function to translate/customize the requester are included. Best regards StarBootics Code: ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : ColorSpectrum - Module ; File Name : ColorSpectrum - Module.pb ; File version: 1.0.1 ; Programming : OK ; Programmed by : StarBootics ; Date : 19-02-2019 ; Last Update : 21-02-2019 ; PureBasic code : V5.70 LTS ; Platform : Windows, Linux, MacOS X ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Programming notes ; ; Based on original code for GallyHC and Guimauve (French Forum) ; See here : https://www.purebasic.fr/french/viewtopic.php?f=6&t=12596 ; ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DeclareModule ColorSpectrum Declare Initialize() Declare Requester(Color = -1) Declare Reset() Declare SetTextTitle(Title.s) Declare SetTextHue(Hue.s) Declare SetTextSaturation(Saturation.s) Declare SetTextLightness(Lightness.s) Declare SetTextRed(Red.s) Declare SetTextGreen(Green.s) Declare SetTextBlue(Blue.s) Declare SetTextRefresh(Refresh.s) Declare SetTextValidate(Validate.s) Declare SetTextCancel(Cancel.s) EndDeclareModule Module ColorSpectrum Enumeration #COLOR_SPECTRUM_TARGET_HUE #COLOR_SPECTRUM_TARGET_SATURATION #COLOR_SPECTRUM_TARGET_LIGHTNESS #COLOR_SPECTRUM_TARGET_RED #COLOR_SPECTRUM_TARGET_GREEN #COLOR_SPECTRUM_TARGET_BLUE #COLOR_SPECTRUM_TARGET_MAX EndEnumeration Enumeration #COLOR_SPECTRUM_TEXT_HUE #COLOR_SPECTRUM_TEXT_SATURATION #COLOR_SPECTRUM_TEXT_LIGHTNESS #COLOR_SPECTRUM_TEXT_RED #COLOR_SPECTRUM_TEXT_GREEN #COLOR_SPECTRUM_TEXT_BLUE #COLOR_SPECTRUM_TEXT_WIN_TITLE #COLOR_SPECTRUM_TEXT_BTN_REFRESH #COLOR_SPECTRUM_TEXT_BTN_VALIDATE #COLOR_SPECTRUM_TEXT_BTN_CANCEL #COLOR_SPECTRUM_TEXT_MAX EndEnumeration Enumeration #COLOR_SPECTRUM_BTN_REFRESH #COLOR_SPECTRUM_BTN_VALIDATE #COLOR_SPECTRUM_BTN_CANCEL #COLOR_SPECTRUM_BTN_MAX EndEnumeration #COLOR_SPECTRUM_SIZE_MAX = 255 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Déclaration des Structures <<<<< Structure Color StructureUnion Red.a Hue.a EndStructureUnion StructureUnion Green.a Saturation.a EndStructureUnion StructureUnion Blue.a Lightness.a EndStructureUnion EndStructure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les observateurs <<<<< Macro GetColorRed(ColorA) ColorA\Red EndMacro Macro GetColorHue(ColorA) ColorA\Hue EndMacro Macro GetColorGreen(ColorA) ColorA\Green EndMacro Macro GetColorSaturation(ColorA) ColorA\Saturation EndMacro Macro GetColorBlue(ColorA) ColorA\Blue EndMacro Macro GetColorLightness(ColorA) ColorA\Lightness EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les mutateurs <<<<< Macro SetColorRed(ColorA, P_Red) GetColorRed(ColorA) = P_Red EndMacro Macro SetColorHue(ColorA, P_Hue) GetColorHue(ColorA) = P_Hue EndMacro Macro SetColorGreen(ColorA, P_Green) GetColorGreen(ColorA) = P_Green EndMacro Macro SetColorLightness(ColorA, P_Lightness) GetColorLightness(ColorA) = P_Lightness EndMacro Macro SetColorBlue(ColorA, P_Blue) GetColorBlue(ColorA) = P_Blue EndMacro Macro SetColorSaturation(ColorA, P_Saturation) GetColorSaturation(ColorA) = P_Saturation EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Conversion vers couleur entier long <<<<< Macro ColorSpectrum_RGB() (Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE] << 16 + Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN] << 8 + Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED]) EndMacro Macro Color_RGB(ColorA) (GetColorBlue(ColorA) << 16 + GetColorGreen(ColorA) << 8 + GetColorRed(ColorA)) EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Conversion RGB vers Hexa <<<<< Macro ColorSpectrum_RGB_To_Hexa() RSet(Hex(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED]), 2, "0") + RSet(Hex(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN]), 2, "0") + RSet(Hex(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE]), 2, "0") EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Min et Max de 3 nombres <<<<< Macro MinMaxNumber(P_Min, P_Max, P_Number01, P_Number02, P_Number03) P_Min = P_Number01 If P_Number02 < P_Min P_Min = P_Number02 EndIf If P_Number03 < P_Min P_Min = P_Number03 EndIf P_Max = P_Number01 If P_Number02 > P_Max P_Max = P_Number02 EndIf If P_Number03 > P_Max P_Max = P_Number03 EndIf EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Déclaration de la Structure <<<<< Structure Instance HSLRGB.a[#COLOR_SPECTRUM_TARGET_MAX] ; Hue, Saturation, Lightness, Red, Green, Blue SafeHSLRGB.a[#COLOR_SPECTRUM_TARGET_MAX] ; SafeHue, SafeSaturation, SafeLightness, SafeRed, SafeGreen, SafeBlue BackgroundLayer.i SpectrumCanvas.i LightnessCanvas.i WindowHandle.i WindowBackgroundColor.i ColorPreviewHandle.i Text.s[#COLOR_SPECTRUM_TEXT_MAX] TextHandle.i[#COLOR_SPECTRUM_TARGET_MAX] StringHandle.i[#COLOR_SPECTRUM_TARGET_MAX] ButtonHandle.i[#COLOR_SPECTRUM_BTN_MAX] EndStructure Global Instance.Instance Procedure GetWindowBackgroundColor() CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Windows BackgroundColor = GetSysColor_(#COLOR_3DFACE) CompilerCase #PB_OS_Linux BackgroundColor = RGB(232, 232, 231) CompilerCase #PB_OS_MacOS BackgroundColor = RGB(237, 235, 236) CompilerEndSelect ProcedureReturn BackgroundColor EndProcedure Procedure UpdateColorPreviewGadget(GadgetID, Color) If GetGadgetData(GadgetID) <> #Null Width = GadgetWidth(GadgetID) Height = GadgetHeight(GadgetID) If StartDrawing(ImageOutput(GetGadgetData(GadgetID))) Box(0, 0, Width, Height, Color) DrawingMode(#PB_2DDrawing_Outlined) Box(0, 0, Width, Height, 0) StopDrawing() SetGadgetState(GadgetID, ImageID(GetGadgetData(GadgetID))) EndIf EndIf EndProcedure Procedure ColorPreviewGadget(GadgetID, x.w, y.w, Width.w, Height.w, Color) GadgetHandle = ImageGadget(GadgetID, x, y, Width, Height, 0) If GadgetID = #PB_Any GadgetID = GadgetHandle EndIf SetGadgetData(GadgetID, CreateImage(#PB_Any, Width, Height)) UpdateColorPreviewGadget(GadgetID, Color) ProcedureReturn GadgetHandle EndProcedure Procedure FreeColorPreviewGadget(GadgetID) If GetGadgetData(GadgetID) <> #Null If IsImage(GetGadgetData(GadgetID)) FreeImage(GetGadgetData(GadgetID)) EndIf EndIf EndProcedure Procedure Private_ConvertRM(M1.f, M2.f, HueColor.f) ; ROUTINE DE CALCUL DE LA COMPOSANTE DE COULEUR. If HueColor > 360 HueColor - 360 EndIf If HueColor < 0 HueColor + 360 EndIf If HueColor < 60 M1 = M1 + (M2 - M1) * HueColor / 60 Else If HueColor < 180 M1 = M2 Else If HueColor < 240 M1 = M1 + (M2 - M1) * (240 - HueColor) / 60 EndIf EndIf EndIf ProcedureReturn M1 * 255 EndProcedure Procedure Convert_HSL_To_RGB(HueColor.f, LightnessColor.f, SaturationColor.f, *RGBColorA.Color) ; ROUTINE DE CONSERTION DU HSL EN RGB. HueColor = HueColor * 360 / #COLOR_SPECTRUM_SIZE_MAX SaturationColor = SaturationColor / #COLOR_SPECTRUM_SIZE_MAX LightnessColor = LightnessColor / #COLOR_SPECTRUM_SIZE_MAX If SaturationColor = 0.0 SetColorRed(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) SetColorGreen(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) SetColorBlue(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) Else If LightnessColor <= 0.5 M2.f = LightnessColor + LightnessColor * SaturationColor Else M2 = LightnessColor + SaturationColor - LightnessColor * SaturationColor EndIf M1.f = 2 * LightnessColor - M2 SetColorRed(*RGBColorA, Private_ConvertRm(M1, M2, HueColor + 120)) SetColorGreen(*RGBColorA, Private_ConvertRm(M1, M2, HueColor)) SetColorBlue(*RGBColorA, Private_ConvertRm(M1, M2, HueColor - 120)) EndIf EndProcedure Procedure Convert_RGB_To_HSL(*RGBColorA.Color, *HSLColorA.Color) ; ROUTINE DE CONVERTION DU RGB EN HLS. MinMaxNumber(Min, Max, GetColorRed(*RGBColorA), GetColorGreen(*RGBColorA), GetColorBlue(*RGBColorA)) DeltaMaxMin = Max - Min SumMaxMin = Max + Min LightnessColor.f = SumMaxMin / 510 If Max = Min HueColor.f = 0 SaturationColor.f = 0 Else NormalizedRed = (Max - GetColorRed(*RGBColorA)) / DeltaMaxMin NormalizedGreen = (Max - GetColorGreen(*RGBColorA)) / DeltaMaxMin NormalizedBlue = (Max - GetColorBlue(*RGBColorA)) / DeltaMaxMin If LightnessColor <= 0.5 SaturationColor = DeltaMaxMin / SumMaxMin Else SaturationColor = DeltaMaxMin / (510 - SumMaxMin) EndIf If GetColorRed(*RGBColorA) = Max HueColor = 60 * (6 + NormalizedBlue - NormalizedGreen) EndIf If GetColorGreen(*RGBColorA) = Max HueColor = 60 * (2 + NormalizedRed - NormalizedBlue) EndIf If GetColorBlue(*RGBColorA) = Max HueColor = 60 * (4 + NormalizedGreen - NormalizedRed) EndIf EndIf If HueColor = 360 HueColor = 0 EndIf HueColor = HueColor / 360 * #COLOR_SPECTRUM_SIZE_MAX LightnessColor = LightnessColor * #COLOR_SPECTRUM_SIZE_MAX SaturationColor = SaturationColor * #COLOR_SPECTRUM_SIZE_MAX SetColorHue(*HSLColorA, Int(HueColor)) SetColorSaturation(*HSLColorA, Int(SaturationColor)) SetColorLightness(*HSLColorA, Int(LightnessColor)) EndProcedure Procedure GenerateColorSpectrumBackgroundLayer() ; ROUTINE DE PRECALCUL DU SPECTRE DE COULEUR. Instance\BackgroundLayer = CreateImage(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2) If Instance\BackgroundLayer <> #Null If StartDrawing(ImageOutput(Instance\BackgroundLayer)) Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000) For SaturationID = 1 To #COLOR_SPECTRUM_SIZE_MAX For HueID = 1 To #COLOR_SPECTRUM_SIZE_MAX Convert_HSL_To_RGB(HueID, #COLOR_SPECTRUM_SIZE_MAX >> 1, SaturationID, RGBColor.Color) Plot(HueID, (#COLOR_SPECTRUM_SIZE_MAX - SaturationID) + 1, Color_RGB(RGBColor)) Next Next StopDrawing() EndIf EndIf EndProcedure Procedure ColorSpectrum_DrawCross() ; ROUTINE DE TRACAGE DE LA CROIX DU SPECTRE. PosX = Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE] PosY = #COLOR_SPECTRUM_SIZE_MAX - Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION] If PosX < #COLOR_SPECTRUM_SIZE_MAX PosX + 1 EndIf If PosY < #COLOR_SPECTRUM_SIZE_MAX PosY + 1 EndIf Box(PosX - 1, PosY - 9, 3, 5, 0) Box(PosX - 1, PosY + 5, 3, 5, 0) Box(PosX - 9, PosY - 1, 5, 3, 0) Box(PosX + 5, PosY - 1, 5, 3, 0) EndProcedure Procedure ColorSpectrum_DrawArrow() ; ROUTINE DE TRACAGE DE LA BARRE DE LIGHTNESS y1 = #COLOR_SPECTRUM_SIZE_MAX - Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] If y1 => #COLOR_SPECTRUM_SIZE_MAX y1 = #COLOR_SPECTRUM_SIZE_MAX - 1 EndIf x1 = 22 x2 = 33 y1 + 1 y2 = y1 + 5 y3 = y1 - 5 xm = (x1 + x2) >> 1 LineXY(x1, y1, x2, y2, 0) LineXY(x2, y2, x2, y3, 0) LineXY(x2, y3, x1, y1, 0) FillArea(xm, y1, 0, 0) EndProcedure Procedure ColorSpectrum_SpectrumRedraw() ; ROUTINE D'AFFICHAGE DU SPECTRE ET CROIX. If StartDrawing(CanvasOutput(Instance\SpectrumCanvas)) If Instance\BackgroundLayer <> #Null DrawImage(ImageID(Instance\BackgroundLayer), 0, 0) EndIf ColorSpectrum_DrawCross() StopDrawing() Convert_HSL_To_RGB(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) UpdateColorPreviewGadget(Instance\ColorPreviewHandle, Color_RGB(RGBColor)) EndIf EndProcedure Procedure ColorSpectrum_LightnessRedraw() ; ROUTINE DE TRACAGE DE LA BARRE LUMIERE. If StartDrawing(CanvasOutput(Instance\LightnessCanvas)) CurrentLightness = Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, Instance\WindowBackgroundColor) Box(0, 0, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000) For LightnessID = 1 To #COLOR_SPECTRUM_SIZE_MAX Convert_HSL_To_RGB(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE], LightnessID, Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) LineXY(1, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, 18, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, Color_RGB(RGBColor)) Next Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = CurrentLightness ColorSpectrum_DrawArrow() StopDrawing() Convert_HSL_To_RGB(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) UpdateColorPreviewGadget(Instance\ColorPreviewHandle, Color_RGB(RGBColor)) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshHSLColorOutput <<<<< Procedure RefreshHSLColorOutput() For TargetID = #COLOR_SPECTRUM_TARGET_HUE To #COLOR_SPECTRUM_TARGET_LIGHTNESS SetGadgetText(Instance\StringHandle[TargetID], Str(Instance\HSLRGB[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshRGBColorOutput <<<<< Procedure RefreshRGBColorOutput() Convert_HSL_To_RGB(Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS], Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED] = GetColorRed(RGBColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN] = GetColorGreen(RGBColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE] = GetColorBlue(RGBColor) For TargetID = #COLOR_SPECTRUM_TARGET_RED To #COLOR_SPECTRUM_TARGET_BLUE SetGadgetText(Instance\StringHandle[TargetID], Str(Instance\HSLRGB[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur CatchSafeHSLRGB <<<<< Procedure CatchSafeHSLRGB() For TargetID = #COLOR_SPECTRUM_TARGET_HUE To #COLOR_SPECTRUM_TARGET_BLUE Instance\SafeHSLRGB[TargetID] = Val(GetGadgetText(Instance\StringHandle[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur CatchRGBColorInput <<<<< Procedure CatchRGBColorInput() For TargetID = #COLOR_SPECTRUM_TARGET_RED To #COLOR_SPECTRUM_TARGET_BLUE Instance\HSLRGB[TargetID] = Val(GetGadgetText(Instance\StringHandle[TargetID])) Next SetColorRed(RGBColor.Color, Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED]) SetColorGreen(RGBColor, Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN]) SetColorBlue(RGBColor, Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE]) Convert_RGB_To_HSL(RGBColor, HSLColor.Color) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE] = GetColorHue(HSLColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION] = GetColorSaturation(HSLColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = GetColorLightness(HSLColor) EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshSpectrum <<<<< Procedure RefeshColorSpectrum() Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE] = 0 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION] = 0 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = 127 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED] = 0 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN] = 0 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE] = 0 ColorSpectrum_SpectrumRedraw() ColorSpectrum_LightnessRedraw() RefreshHSLColorOutput() RefreshRGBColorOutput() CatchSafeHSLRGB() EndProcedure Procedure ForceColorSpectrumStartColor(Color) If Color <> - 1 Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_RED] = Red(Color) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_GREEN] = Green(Color) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_BLUE] = Blue(Color) For TargetID = #COLOR_SPECTRUM_TARGET_RED To #COLOR_SPECTRUM_TARGET_BLUE SetGadgetText(Instance\StringHandle[TargetID], Str(Instance\HSLRGB[TargetID])) Next CatchRGBColorInput() RefreshHSLColorOutput() Else RefreshRGBColorOutput() RefreshHSLColorOutput() EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur ColorSpectrum_SpectrumCanvas_EventManager <<<<< Procedure ColorSpectrum_SpectrumCanvas_EventManager() EventType = EventType() If EventType = #PB_EventType_LeftButtonDown Or ( EventType = #PB_EventType_MouseMove And GetGadgetAttribute(Instance\SpectrumCanvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) MouseX = GetGadgetAttribute(Instance\SpectrumCanvas, #PB_Canvas_MouseX) MouseY = GetGadgetAttribute(Instance\SpectrumCanvas, #PB_Canvas_MouseY) If MouseX < 0 MouseX = 0 Else If MouseX > #COLOR_SPECTRUM_SIZE_MAX MouseX = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf If MouseY < 0 MouseY = 0 Else If MouseY > #COLOR_SPECTRUM_SIZE_MAX MouseY = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE] = MouseX Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION] = #COLOR_SPECTRUM_SIZE_MAX - MouseY ColorSpectrum_SpectrumRedraw() ColorSpectrum_LightnessRedraw() RefreshHSLColorOutput() RefreshRGBColorOutput() CatchSafeHSLRGB() EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur ColorSpectrum_LightnessCanvas_EventManager <<<<< Procedure ColorSpectrum_LightnessCanvas_EventManager() EventType = EventType() If EventType = #PB_EventType_LeftButtonDown Or (EventType = #PB_EventType_MouseMove And GetGadgetAttribute(Instance\LightnessCanvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) MouseY = GetGadgetAttribute(Instance\LightnessCanvas, #PB_Canvas_MouseY) If MouseY < 0 MouseY = 0 Else If MouseY > #COLOR_SPECTRUM_SIZE_MAX MouseY = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = #COLOR_SPECTRUM_SIZE_MAX - MouseY ColorSpectrum_LightnessRedraw() RefreshHSLColorOutput() RefreshRGBColorOutput() CatchSafeHSLRGB() EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur Hue Input Control <<<<< Procedure ColorSpectrum_Input_Control(Target.b) EventType = EventType() If EventType = #PB_EventType_Change Instance\SafeHSLRGB[Target] = Val(GetGadgetText(Instance\StringHandle[Target])) If Instance\SafeHSLRGB[Target] < 0 Instance\SafeHSLRGB[Target] = 0 EndIf If Instance\SafeHSLRGB[Target] > 255 Instance\SafeHSLRGB[Target] = 255 EndIf Select Target Case #COLOR_SPECTRUM_TARGET_HUE, #COLOR_SPECTRUM_TARGET_LIGHTNESS, #COLOR_SPECTRUM_TARGET_SATURATION Instance\HSLRGB[Target] = Instance\SafeHSLRGB[Target] Case #COLOR_SPECTRUM_TARGET_RED, #COLOR_SPECTRUM_TARGET_GREEN, #COLOR_SPECTRUM_TARGET_BLUE Instance\HSLRGB[Target] = Instance\SafeHSLRGB[Target] SetColorRed(RGBColor.Color, Instance\SafeHSLRGB[#COLOR_SPECTRUM_TARGET_RED]) SetColorGreen(RGBColor, Instance\SafeHSLRGB[#COLOR_SPECTRUM_TARGET_GREEN]) SetColorBlue(RGBColor, Instance\SafeHSLRGB[#COLOR_SPECTRUM_TARGET_BLUE]) Convert_RGB_To_HSL(RGBColor, HSLColor.Color) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_HUE] = GetColorHue(HSLColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_SATURATION] = GetColorSaturation(HSLColor) Instance\HSLRGB[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = GetColorLightness(HSLColor) EndSelect ColorSpectrum_SpectrumRedraw() ColorSpectrum_LightnessRedraw() ElseIf EventType = #PB_EventType_LostFocus SetGadgetText(Instance\StringHandle[Target], Str(Instance\SafeHSLRGB[Target])) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur Initialize <<<<< Procedure Initialize() Instance\Text[#COLOR_SPECTRUM_TEXT_WIN_TITLE] = "Color Spectrum" Instance\Text[#COLOR_SPECTRUM_TEXT_HUE] = "Hue" Instance\Text[#COLOR_SPECTRUM_TEXT_SATURATION] = "Saturation" Instance\Text[#COLOR_SPECTRUM_TEXT_LIGHTNESS] = "Lightness" Instance\Text[#COLOR_SPECTRUM_TEXT_RED] = "Red" Instance\Text[#COLOR_SPECTRUM_TEXT_GREEN] = "Green" Instance\Text[#COLOR_SPECTRUM_TEXT_BLUE] = "Blue" Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_REFRESH] = "Refresh" Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_VALIDATE] = "Validate" Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_CANCEL] = "Cancel" EndProcedure Procedure SetTextTitle(Title.s) Instance\Text[#COLOR_SPECTRUM_TEXT_WIN_TITLE] = Title EndProcedure Procedure SetTextHue(Hue.s) Instance\Text[#COLOR_SPECTRUM_TEXT_HUE] = Hue EndProcedure Procedure SetTextSaturation(Saturation.s) Instance\Text[#COLOR_SPECTRUM_TEXT_SATURATION] = Saturation EndProcedure Procedure SetTextLightness(Lightness.s) Instance\Text[#COLOR_SPECTRUM_TEXT_LIGHTNESS] = Lightness EndProcedure Procedure SetTextRed(Red.s) Instance\Text[#COLOR_SPECTRUM_TEXT_RED] = Red EndProcedure Procedure SetTextGreen(Green.s) Instance\Text[#COLOR_SPECTRUM_TEXT_GREEN] = Green EndProcedure Procedure SetTextBlue(Blue.s) Instance\Text[#COLOR_SPECTRUM_TEXT_BLUE] = Blue EndProcedure Procedure SetTextRefresh(Refresh.s) Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_REFRESH] = Refresh EndProcedure Procedure SetTextValidate(Validate.s) Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_VALIDATE] = Validate EndProcedure Procedure SetTextCancel(Cancel.s) Instance\Text[#COLOR_SPECTRUM_TEXT_BTN_CANCEL] = Cancel EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur Reset <<<<< Procedure Reset() For HSLRGBID = 0 To #COLOR_SPECTRUM_TARGET_MAX - 1 Instance\HSLRGB[HSLRGBID] = 0 Instance\SafeHSLRGB[HSLRGBID] = 0 Next If IsImage(Instance\BackgroundLayer) FreeImage(Instance\BackgroundLayer) Instance\BackgroundLayer = 0 EndIf Instance\SpectrumCanvas = 0 Instance\LightnessCanvas = 0 Instance\WindowHandle = 0 Instance\WindowBackgroundColor = 0 Instance\ColorPreviewHandle = 0 For TextID = 0 To #COLOR_SPECTRUM_TEXT_MAX - 1 Instance\Text[TextID] = "" Next For Index = 0 To #COLOR_SPECTRUM_TARGET_MAX - 1 Instance\TextHandle[Index] = 0 Instance\StringHandle[Index] = 0 Next For BtnID = 0 To #COLOR_SPECTRUM_BTN_MAX - 1 Instance\ButtonHandle[BtnID] = 0 Next EndProcedure Procedure Requester(Color = -1) Instance\WindowHandle = OpenWindow(#PB_Any, 0, 0, #COLOR_SPECTRUM_SIZE_MAX + 197, #COLOR_SPECTRUM_SIZE_MAX + 34+15, Instance\Text[#COLOR_SPECTRUM_TEXT_WIN_TITLE] , #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If Instance\WindowHandle <> #Null Instance\SpectrumCanvas = CanvasGadget(#PB_Any, 5, 5, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2) Instance\LightnessCanvas = CanvasGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 15, 5, 35, #COLOR_SPECTRUM_SIZE_MAX + 2) PosY = 5 For Index = 0 To #COLOR_SPECTRUM_TARGET_MAX - 1 Instance\TextHandle[Index] = StringGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 55, PosY, 95, 34, Instance\Text[Index], #PB_String_ReadOnly) Instance\StringHandle[Index] = StringGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 150, PosY, 42, 34, "000") PosY + 34 Next Instance\ColorPreviewHandle = ColorPreviewGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 55, PosY+5, 137, 47, 0) PosX = ((#COLOR_SPECTRUM_SIZE_MAX + 197) - 135*3+10) >> 1 For BtnID = 0 To #COLOR_SPECTRUM_BTN_MAX - 1 Instance\ButtonHandle[BtnID] = ButtonGadget(#PB_Any, PosX, #COLOR_SPECTRUM_SIZE_MAX+10, 135, 34, Instance\Text[BtnID + #COLOR_SPECTRUM_TEXT_BTN_REFRESH]) PosX + 140 Next Instance\WindowBackgroundColor = GetWindowBackgroundColor() GenerateColorSpectrumBackgroundLayer() ForceColorSpectrumStartColor(Color) CatchSafeHSLRGB() ColorSpectrum_SpectrumRedraw() ColorSpectrum_LightnessRedraw() ReturnSelectedColor = -1 Repeat EventID = WaitWindowEvent() Select EventID Case #PB_Event_Gadget Select EventGadget() Case Instance\SpectrumCanvas ColorSpectrum_SpectrumCanvas_EventManager() Case Instance\LightnessCanvas ColorSpectrum_LightnessCanvas_EventManager() Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_HUE] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_HUE) Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_LIGHTNESS] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_LIGHTNESS) Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_SATURATION] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_SATURATION) Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_RED] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_RED) Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_GREEN] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_GREEN) Case Instance\StringHandle[#COLOR_SPECTRUM_TARGET_BLUE] ColorSpectrum_Input_Control(#COLOR_SPECTRUM_TARGET_BLUE) Case Instance\ButtonHandle[#COLOR_SPECTRUM_BTN_REFRESH] RefeshColorSpectrum() Case Instance\ButtonHandle[#COLOR_SPECTRUM_BTN_VALIDATE] ReturnSelectedColor = ColorSpectrum_RGB() EventID = #PB_Event_CloseWindow Case Instance\ButtonHandle[#COLOR_SPECTRUM_BTN_CANCEL] EventID = #PB_Event_CloseWindow EndSelect EndSelect Until EventID = #PB_Event_CloseWindow If IsImage(Instance\BackgroundLayer) FreeImage(Instance\BackgroundLayer) Instance\BackgroundLayer = 0 EndIf FreeColorPreviewGadget(Instance\ColorPreviewHandle) CloseWindow(Instance\WindowHandle) EndIf ProcedureReturn ReturnSelectedColor EndProcedure EndModule CompilerIf #PB_Compiler_IsMainFile ColorSpectrum::Initialize() Color = ColorSpectrum::Requester() If Color <> -1 Debug "RGB(" + Str(Red(Color)) + ", " + Str(Green(Color)) + ", " + Str(Blue(Color)) + ")" Else Debug "The User click the Cancel button" EndIf ; Translation in French ColorSpectrum::SetTextTitle("Choix d'une couleur") ColorSpectrum::SetTextHue("Teinte") ColorSpectrum::SetTextSaturation("Saturation") ColorSpectrum::SetTextLightness("Luminosité") ColorSpectrum::SetTextRed("Rouge") ColorSpectrum::SetTextGreen("Vert") ColorSpectrum::SetTextBlue("Bleu") ColorSpectrum::SetTextRefresh("Rafraichir") ColorSpectrum::SetTextValidate("Sélectionner") ColorSpectrum::SetTextCancel("Annuler") Color = ColorSpectrum::Requester() If Color <> -1 Debug "RGB(" + Str(Red(Color)) + ", " + Str(Green(Color)) + ", " + Str(Blue(Color)) + ")" Else Debug "The User click the Cancel button" EndIf ColorSpectrum::Reset() CompilerEndIf ; <<<<<<<<<<<<<<<<<<<<<<< ; <<<<< END OF FILE <<<<< ; <<<<<<<<<<<<<<<<<<<<<<< |
Author: | mestnyi [ Thu Feb 21, 2019 4:18 am ] |
Post subject: | Re: ColorSpectrum - Module |
in my mac book x64 It doesn’t work because of this ".l" instead of ".i" |
Author: | davido [ Thu Feb 21, 2019 6:17 am ] |
Post subject: | Re: ColorSpectrum - Module |
@StarBootics , I like this, thank you. ![]() @mestnyi, Thank you. I made your suggested changes. |
Author: | Denis [ Thu Feb 21, 2019 12:05 pm ] |
Post subject: | Re: ColorSpectrum - Module |
Nice StarBootics. First window is in english and when i validate, French translation appears. I didn't take a deeper look to your code but for me it will be interresting to get all in French. ![]() |
Author: | StarBootics [ Thu Feb 21, 2019 2:00 pm ] |
Post subject: | Re: ColorSpectrum - Module |
mestnyi wrote: in my mac book x64 It doesn’t work because of this ".l" instead of ".i" Just change that, should work fine now. Best regards StarBootics |
Author: | Kwai chang caine [ Thu Feb 28, 2019 1:07 pm ] |
Post subject: | Re: ColorSpectrum - Module |
Works fine on W7 x86, can be usefull Thanks for sharing ![]() |
Author: | gally [ Sun Mar 31, 2019 8:48 pm ] |
Post subject: | Re: ColorSpectrum - Module |
Hello All, here is the version I'm using now (sorry for my bad English). Code: ; +======================================================+ ; | | ; +------------------------------------------------------+ ; | COPYRIGHT(C)2017-2018, ALL RIGHT RESERVED KOAKDESIGN | ; +--------------+---------------------------------------+ ; | Program type | PUREBASIC 5.62 (MODULE) | ; +--------------+---------------------------------------+ ; | VER & REV | 0.0.4 | ; +--------------+---------------------------------------+ ; | Program name | | ; +======================================================+ ; +======================================================+ ; | Original Version: 0.0.4 | ; +--------------+---------------------------------------+ ; | Created by | GallyHomeCorp | ; | Graphix by | GallyHomeCorp | ; +--------------+---------------------------------------+ ; | Comments: | | ; +--------------+ | ; | | ; | | ; | | ; +======================================================+ ; +======================================================+ ; | Système d'Exploitation | ; +--------------+---------------------------------------+ ; | Window | Oui | ; | Linux | Oui | ; | MacOS | Oui | ; +======================================================+ ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** ;- INITIALISATION DES DIRECTIVES DU COMPILEUR. DisableASM CompilerIf #PB_Compiler_EnableExplicit EnableExplicit CompilerEndIf ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** #PB_Event_CustomGadget_Color = #PB_Event_FirstCustomValue + 102 ; **************************************************************************** ; **************************************************************************** ; **************************************************************************** DeclareModule ColorSelector ; DisableASM CompilerIf #PB_Compiler_EnableExplicit EnableExplicit CompilerEndIf ; ;- DECLARATION PUBLIQUES DU MODULE. ; CompilerIf Defined(PB_Event_CustomGadget_Color, #PB_Constant) = #False #PB_Event_CustomGadget_Color = #PB_Event_FirstCustomValue + 102 CompilerEndIf ; CompilerIf Defined(_CONVERTRM, #PB_Procedure) = #False Declare.l _CONVERTRM(fM1.f, fM2.f, fCH.f) CompilerEndIf CompilerIf Defined(_RGB_TO_HSL, #PB_Procedure) = #False Declare.l _RGB_TO_HSL(red.a, green.a, blue.a, alpha=0) CompilerEndIf CompilerIf Defined(_HSL_TO_RGB, #PB_Procedure) = #False Declare _HSL_TO_RGB(fCH.f, fCL.f, fCS.f, *bCR, *bCG, *bCB) CompilerEndIf ; Declare _CreateGadget (gadget.i, x.l, y.l) Declare _GetGadgetState (gadget.i) Declare _SetGadgetState (gadget.i, color.i) Declare _GetGadgetData (gadget.i, colortype.s) Declare _SetGadgetData (gadget.i, colortype.s, value.l) Declare _DisableGadget (gadget.i, stat.b) Declare _HideGadget (gadget.i, stat.b) Declare _FreeGadget (gadget.i) Declare _GetGadgetBackColor (gadget.i) Declare _SetGadgetBackColor (gadget.i, color.i) EndDeclareModule ; ; ; Module ColorSelector ; DisableASM CompilerIf #PB_Compiler_EnableExplicit EnableExplicit CompilerEndIf ; ;- DECLARATION PRIVES DU MODULE. ; #COLOR_SELECTOR_SIZE_MAX = 256 #COLOR_SELECTOR_LIGHT_PX = 263 #COLOR_SELECTOR_LIGHT_PY = 31 ; CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Structure point x.l y.l EndStructure CompilerEndIf CompilerIf Defined(_WINDOW_BACKGROUND, #PB_Procedure) = #False Procedure _WINDOW_BACKGROUND(hwnd.i = 0) ; ; http://www.purebasic.fr/english/viewtopic.php?p=472982#p472982 ; CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Windows ; Protected color = GetSysColor_(#COLOR_WINDOW) If color = $FFFFFF Or color=0 color = GetSysColor_(#COLOR_BTNFACE) EndIf ProcedureReturn color ; CompilerCase #PB_OS_Linux ; Protected *style.GtkStyle, *color.GdkColor *style = gtk_widget_get_style_(hwnd) *color = *style\bg[0] ProcedureReturn RGB(*color\red >> 8, *color\green >> 8, *color\blue >> 8) ; CompilerCase #PB_OS_MacOS ; Protected.i color, Rect.NSRect, Image Protected.i NSColor = CocoaMessage(#Null, #Null, "NSColor windowBackgroundColor") If NSColor Rect\size\width = 1 Rect\size\height = 1 Image = CreateImage(#PB_Any, 1, 1) StartDrawing(ImageOutput(Image)) CocoaMessage(#Null, NSColor, "drawSwatchInRect:@", @Rect) color = Point(0, 0) StopDrawing() FreeImage(Image) ProcedureReturn color Else ProcedureReturn -1 EndIf ; CompilerEndSelect EndProcedure CompilerEndIf Structure _STRUTURE_COLORSELECT window.i gadget.i gadgetid.i x.l y.l position.point state.l bordercolor.i background.i disable.b actived.b hide.b bCH.l bCS.l bCL.l bCY.l iImage.i ; lchannel_r.l lchannel_g.l lchannel_b.l EndStructure Global.i iimage_selectcolor Global.i iimage_selectcross Global.i iimage_selectarrow Global NewMap _CREATE_COLORSELECT._STRUTURE_COLORSELECT() ; ;- ; Procedure.l _CONVERTRM(fM1.f, fM2.f, fCH.f) ; ; ; If fCH > 360 fCH - 360 ElseIf fCH < 0 fCH + 360 EndIf ; If fCH < 60 fM1 = fM1 + (fM2 - fM1) * fCH / 60 ElseIf fCH < 180 fM1 = fM2 ElseIf fCH < 240 fM1 = fM1 + (fM2 - fM1) * (240 - fCH) / 60 EndIf ; ; ; ProcedureReturn fM1 * (#COLOR_SELECTOR_SIZE_MAX - 1) EndProcedure ; ;- ; Procedure.l _RGB_TO_HSL(red.a, green.a, blue.a, alpha=0) ; ; ; Protected.f r = red / 255 Protected.f g = green / 255 Protected.f b = blue / 255 Protected.f cmax, cmin, h_, c, m, h, s, l Protected.l imax, imin ; If r>=g And r>=b imax=1 cmax=r EndIf If g>=r And g>=b imax=2 cmax=g EndIf If b>=r And b>=g imax=3 cmax=b EndIf If r<=g And r<=b imin=1 cmin=r EndIf If g<=r And g<=b imin=2 cmin=g EndIf If b<=r And b<=g imin=3 cmin=b EndIf c=cmax-cmin Select imax Case 1 h_ = Mod((g - b) / c + 6, 6) Case 2 h_ = (b - r) / c + 2 Case 3 h_ = (r - g) / c + 4 EndSelect h = h_ / 6 l = (cmax + cmin) / 2 If l <> 1 s = c / (1 - Abs(2 * l - 1)) Else s=0 EndIf ProcedureReturn RGB(h * 255, s * 255, l *255) EndProcedure ; Procedure _HSL_TO_RGB(fCH.f, fCL.f, fCS.f, *bCR, *bCG, *bCB) ; ; ROUTINE DE CONSERTION DU HLS EN RGB. ; Protected.f fM1, fM2 ; fCH = fCH * 360 / (#COLOR_SELECTOR_SIZE_MAX - 1) fCL = fCL / #COLOR_SELECTOR_SIZE_MAX fCS = fCS / (#COLOR_SELECTOR_SIZE_MAX - 1) If fCL < 0.5 fM2 = fCL + fCL * fCS Else fM2 = fCL + fCS - fCL * fCS EndIf fM1 = 2 * fCL - fM2 ; ; ; If fCS = 0 PokeL(*bCR, fCL * 255) PokeL(*bCG, fCL * 255) PokeL(*bCB, fCL * 255) Else PokeL(*bCR, _CONVERTRM(fM1, fM2, fCH + 120)) PokeL(*bCG, _CONVERTRM(fM1, fM2, fCH )) PokeL(*bCB, _CONVERTRM(fM1, fM2, fCH - 120)) EndIf EndProcedure ; ;- ; Procedure CUSTUMGadget_ColorCross(lX.l, lY.l) ; ; ROUTINE DE TRACAGE DE LA CROIX DU PAN/TILT. ; If IsImage(iimage_selectcross) = 0 iimage_selectcross = CreateImage(#PB_Any, (lX * 2) + 1, (lY * 2) + 1, 32, #PB_Image_Transparent) If IsImage(iimage_selectcross) If StartDrawing(ImageOutput(iimage_selectcross)) DrawingMode(#PB_2DDrawing_AllChannels) Box(lX - 1, lY - 9, 3, 5, $FF010101) Box(lX - 1, lY + 5, 3, 5, $FF010101) Box(lX - 9, lY - 1, 5, 3, $FF010101) Box(lX + 5, lY - 1, 5, 3, $FF010101) Box(lX - 3, lY - 3, 7, 7, $FF010101) Box(lX - 1, lY - 1, 3, 3, $000000FF) StopDrawing() EndIf EndIf EndIf EndProcedure Procedure CUSTUMGadget_ColorArrow(lX.l, lY.l) ; ; ; If IsImage(iimage_selectarrow) = 0 iimage_selectarrow = CreateImage(#PB_Any, 6, 11, 32, #PB_Image_Transparent) If IsImage(iimage_selectarrow) If StartDrawing(ImageOutput(iimage_selectarrow)) DrawingMode(#PB_2DDrawing_AlphaChannel) Box ( 0, 0, 6, 11, RGBA(255, 255, 255, 0)) DrawingMode(#PB_2DDrawing_AlphaBlend) Line(lX, lY, 5, -5, $FF444444) Line(lX, lY, 5, 5, $FF444444) LineXY(lX + 5, lY - 5, lX + 5, lY + 5, $FF444444) FillArea(lX + 2, lY, $FF444444, $FF444444) StopDrawing() EndIf EndIf EndIf EndProcedure Procedure CUSTUMGadget_ColorBox() ; ; ROUTINE DE PRECALCUL DU SPECTRE DE COULEUR. ; Protected.l lH, lS Protected.l bCR, bCG, bCB If IsImage(iimage_selectcolor) = 0 iimage_selectcolor = CreateImage(#PB_Any, #COLOR_SELECTOR_SIZE_MAX + 2, #COLOR_SELECTOR_SIZE_MAX + 2, 24, $0) If IsImage(iimage_selectcolor) If StartDrawing(ImageOutput(iimage_selectcolor)) For lS = 1 To #COLOR_SELECTOR_SIZE_MAX For lH = 1 To #COLOR_SELECTOR_SIZE_MAX _HSL_TO_RGB (lH - 1, (#COLOR_SELECTOR_SIZE_MAX - 1) / 2, lS, @bCR, @bCG, @bCB) Plot(lH, (#COLOR_SELECTOR_SIZE_MAX - lS) + 1, RGB(bCR, bCG, bCB)) Next lH Next lS StopDrawing() EndIf EndIf EndIf EndProcedure Procedure CUSTUMGadget_DrawColorLight(gadget.i) ; ; ROUTINE DE TRACAGE DE LA BARRE LUMIERE. ; Protected.l j, bCR, bCG, bCB Protected.f fpas = 255 / 216 ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null If IsImage(_CREATE_COLORSELECT()\iImage) FreeImage(_CREATE_COLORSELECT()\iImage) EndIf _CREATE_COLORSELECT()\iImage = CreateImage(#PB_Any, 27, #COLOR_SELECTOR_SIZE_MAX - 27) If IsImage(_CREATE_COLORSELECT()\iImage) If StartDrawing(ImageOutput(_CREATE_COLORSELECT()\iImage)) DrawingMode(#PB_2DDrawing_Default) Box(0, 0, 27, #COLOR_SELECTOR_SIZE_MAX - 27, _CREATE_COLORSELECT()\background) DrawingMode(#PB_2DDrawing_Outlined) Box(0, 4, 19, #COLOR_SELECTOR_SIZE_MAX - 37 , _CREATE_COLORSELECT()\bordercolor) ; For j = 0 To #COLOR_SELECTOR_SIZE_MAX - 40 _HSL_TO_RGB(_CREATE_COLORSELECT()\bCH, j * fpas, _CREATE_COLORSELECT()\bCS, @bCR, @bCG, @bCB) LineXY(1, (#COLOR_SELECTOR_SIZE_MAX - 40 + 5) - j, 17, (#COLOR_SELECTOR_SIZE_MAX - 40 + 5) - j, RGB(bCR, bCG, bCB)) Next j ; DrawingMode(#PB_2DDrawing_Default) LineXY(19, 5, 22, 5, _CREATE_COLORSELECT()\bordercolor) LineXY(19, 221, 22, 221, _CREATE_COLORSELECT()\bordercolor) LineXY(19, ((#COLOR_SELECTOR_SIZE_MAX - 27) / 2) - 1, 22, ((#COLOR_SELECTOR_SIZE_MAX - 27) / 2) - 1, _CREATE_COLORSELECT()\bordercolor) ; StopDrawing() EndIf EndIf EndIf EndProcedure Procedure CUSTUMGadget_DrawColorselect(gadget.i) ; ; ROUTINE DE TRACAGE DU . ; Protected.l iCR, iCG, iCB Protected.l x, y, j ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null _HSL_TO_RGB (_CREATE_COLORSELECT()\bCH, _CREATE_COLORSELECT()\bCL, _CREATE_COLORSELECT()\bCS, @iCR, @iCG, @iCB) ; If _CREATE_COLORSELECT()\actived = #True And IsGadget(_CREATE_COLORSELECT()\gadget) If StartDrawing(CanvasOutput(_CREATE_COLORSELECT()\gadget)) DrawingMode(#PB_2DDrawing_Default) Box(0, 0, 290, 258, _CREATE_COLORSELECT()\background) ; If IsImage(iimage_selectcolor) DrawImage(ImageID(iimage_selectcolor), 0, 0) EndIf If IsImage(iimage_selectcross) DrawAlphaImage(ImageID(iimage_selectcross), _CREATE_COLORSELECT()\position\x - 9, _CREATE_COLORSELECT()\position\y - 9) EndIf Box(258, 0, 290, 258, _CREATE_COLORSELECT()\background) ; Box(262, 0, 28, 28, _CREATE_COLORSELECT()\bordercolor) Box(263, 1, 26, 26, RGB(iCR, iCG, iCB)) If IsImage(_CREATE_COLORSELECT()\iImage) DrawImage(ImageID(_CREATE_COLORSELECT()\iImage), #COLOR_SELECTOR_LIGHT_PX, #COLOR_SELECTOR_LIGHT_PY) EndIf If IsImage(iimage_selectarrow) DrawAlphaImage(ImageID(iimage_selectarrow), #COLOR_SELECTOR_LIGHT_PX + 21, #COLOR_SELECTOR_LIGHT_PY + _CREATE_COLORSELECT()\bCY - 5) EndIf DrawingMode(#PB_2DDrawing_Outlined) Box(0, 0, #COLOR_SELECTOR_SIZE_MAX + 2, #COLOR_SELECTOR_SIZE_MAX + 2, $606060) ; If _CREATE_COLORSELECT()\disable = #True DrawingMode(#PB_2DDrawing_AlphaBlend) Box(0, 0, 290, 258, RGBA(Red(_CREATE_COLORSELECT()\background), Green(_CREATE_COLORSELECT()\background), Blue(_CREATE_COLORSELECT()\background), 144)) EndIf StopDrawing() EndIf EndIf EndIf EndProcedure ; ;- ; Procedure _OnEvent_SCANBORDERS(lvalue.l, lmin.l, lmax.l) ; ; ; If lvalue < lmin lvalue = lmin ElseIf lvalue > lmax lvalue = lmax EndIf ; ProcedureReturn lvalue EndProcedure ; Procedure _OnEvent_CUSTUMCOLOR() ; ; ; Protected.i event = EventType () Protected.i gadget = EventGadget() Protected.i _SAV_MOUSE_X, _SAV_MOUSE_Y Static.b _SAV_MOUSE_CLIC, _SAV_CAPTURE ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null If GetGadgetAttribute(gadget, #PB_Canvas_WheelDelta) ; If _CREATE_COLORSELECT()\disable = #False _CREATE_COLORSELECT()\bCL + GetGadgetAttribute(gadget, #PB_Canvas_WheelDelta) _CREATE_COLORSELECT()\bCL = _OnEvent_SCANBORDERS(_CREATE_COLORSELECT()\bCL, 0, #COLOR_SELECTOR_SIZE_MAX) _CREATE_COLORSELECT()\bCY = 221 - Round(_CREATE_COLORSELECT()\bCL / (256 / 216), #PB_Round_Up) ; PostEvent(#PB_Event_CustomGadget_Color, _CREATE_COLORSELECT()\window, _CREATE_COLORSELECT()\gadget) CUSTUMGadget_DrawColorselect(_CREATE_COLORSELECT()\gadget) ; ProcedureReturn EndIf ; EndIf If event = #PB_EventType_LeftButtonDown Or (event = #PB_EventType_MouseMove And GetGadgetAttribute(gadget, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) And _SAV_CAPTURE = #True _SAV_CAPTURE = #True ; _SAV_MOUSE_X = GetGadgetAttribute(gadget, #PB_Canvas_MouseX) _SAV_MOUSE_Y = GetGadgetAttribute(gadget, #PB_Canvas_MouseY) ; If _SAV_MOUSE_CLIC = 0 If _SAV_MOUSE_X >= 0 And _SAV_MOUSE_Y >= 0 And _SAV_MOUSE_X <= #COLOR_SELECTOR_SIZE_MAX And _SAV_MOUSE_Y <= #COLOR_SELECTOR_SIZE_MAX _SAV_MOUSE_CLIC = 1 EndIf If _SAV_MOUSE_X >= #COLOR_SELECTOR_LIGHT_PX And _SAV_MOUSE_Y >= #COLOR_SELECTOR_LIGHT_PY And _SAV_MOUSE_X <= #COLOR_SELECTOR_LIGHT_PX + 17 And _SAV_MOUSE_Y <= #COLOR_SELECTOR_LIGHT_PY + (#COLOR_SELECTOR_SIZE_MAX - 27) _SAV_MOUSE_CLIC = 2 EndIf EndIf ; If _SAV_MOUSE_CLIC <> 0 If _CREATE_COLORSELECT()\disable = #False If _SAV_MOUSE_CLIC = 1 _SAV_MOUSE_X = _OnEvent_SCANBORDERS(_SAV_MOUSE_X, 1, #COLOR_SELECTOR_SIZE_MAX) _SAV_MOUSE_Y = _OnEvent_SCANBORDERS(_SAV_MOUSE_Y, 1, #COLOR_SELECTOR_SIZE_MAX) ; _CREATE_COLORSELECT()\position\x = _SAV_MOUSE_X _CREATE_COLORSELECT()\position\y = _SAV_MOUSE_Y _CREATE_COLORSELECT()\bCH = _CREATE_COLORSELECT()\position\x - 1 _CREATE_COLORSELECT()\bCS = #COLOR_SELECTOR_SIZE_MAX - _CREATE_COLORSELECT()\position\y ; CUSTUMGadget_DrawColorLight (_CREATE_COLORSELECT()\gadget) EndIf If _SAV_MOUSE_CLIC = 2 _SAV_MOUSE_Y = _OnEvent_SCANBORDERS(_SAV_MOUSE_Y, #COLOR_SELECTOR_LIGHT_PY + 5, #COLOR_SELECTOR_LIGHT_PY + (#COLOR_SELECTOR_SIZE_MAX - 35)) ; _CREATE_COLORSELECT()\bCY = (_SAV_MOUSE_Y - #COLOR_SELECTOR_LIGHT_PY) _CREATE_COLORSELECT()\bCL = 256 - Int(((_SAV_MOUSE_Y - #COLOR_SELECTOR_LIGHT_PY) - 5) * (256 / 216)) EndIf ; If _SAV_MOUSE_CLIC <> 0 PostEvent(#PB_Event_CustomGadget_Color, _CREATE_COLORSELECT()\window, _CREATE_COLORSELECT()\gadget) EndIf CUSTUMGadget_DrawColorselect(_CREATE_COLORSELECT()\gadget) ; EndIf EndIf ; Else If _SAV_MOUSE_CLIC <> 0 _SAV_MOUSE_CLIC = 0 EndIf If event = #PB_EventType_MouseLeave _SAV_CAPTURE = #False EndIf EndIf EndIf EndProcedure ; ;- ; Procedure _CreateGadget(gadget.i, x.l, y.l) ; ; ; Protected.i ivalue ; ; ; If gadget = #PB_Any gadget = CanvasGadget(#PB_Any, x, y, 290, 258, #PB_Container_BorderLess | #PB_Canvas_Keyboard) ivalue = gadget Else ivalue = CanvasGadget(gadget, x, y, 290, 258, #PB_Container_BorderLess | #PB_Canvas_Keyboard) EndIf AddMapElement(_CREATE_COLORSELECT(), Str(gadget), #PB_Map_ElementCheck) ; ; ; _CREATE_COLORSELECT()\window = GetActiveWindow() _CREATE_COLORSELECT()\gadget = gadget _CREATE_COLORSELECT()\gadgetid = ivalue _CREATE_COLORSELECT()\x = x _CREATE_COLORSELECT()\y = y _CREATE_COLORSELECT()\position\x = _CREATE_COLORSELECT()\bCH + 1 _CREATE_COLORSELECT()\position\y = #COLOR_SELECTOR_SIZE_MAX - _CREATE_COLORSELECT()\bCS _CREATE_COLORSELECT()\disable = #False _CREATE_COLORSELECT()\actived = #True _CREATE_COLORSELECT()\state = 2 ; _CREATE_COLORSELECT()\bordercolor = $505050 CompilerIf #PB_Compiler_OS = #PB_OS_Windows _CREATE_COLORSELECT()\background = _WINDOW_BACKGROUND(#Null) CompilerElse _CREATE_COLORSELECT()\background = _WINDOW_BACKGROUND(WindowID(_CREATE_COLORSELECT()\window)) CompilerEndIf ; _CREATE_COLORSELECT()\bCH = 0 _CREATE_COLORSELECT()\bCS = 0 _CREATE_COLORSELECT()\bCL = 0 _CREATE_COLORSELECT()\bCY = 216 - Int(_CREATE_COLORSELECT()\bCL * (216 / 255)) + 5 ; ; ; CUSTUMGadget_DrawColorLight (_CREATE_COLORSELECT()\gadget) CUSTUMGadget_DrawColorselect(_CREATE_COLORSELECT()\gadget) ; BindGadgetEvent (_CREATE_COLORSELECT()\gadget, @_OnEvent_CUSTUMCOLOR(), #PB_All) ; ProcedureReturn ivalue EndProcedure Procedure _GetGadgetState(gadget.i) ; ; ; Protected.l iCR, iCG, iCB ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null _HSL_TO_RGB (_CREATE_COLORSELECT()\bCH, _CREATE_COLORSELECT()\bCL, _CREATE_COLORSELECT()\bCS, @iCR, @iCG, @iCB) ProcedureReturn RGB(iCR, iCG, iCB) EndIf EndProcedure Procedure _SetGadgetState(gadget.i, color.i) ; ; ; EndProcedure Procedure _GetGadgetBackColor(gadget.i) ; ; ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null ProcedureReturn _CREATE_COLORSELECT()\background EndIf EndProcedure Procedure _SetGadgetBackColor(gadget.i, color.i) ; ; ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null _CREATE_COLORSELECT()\background = color CUSTUMGadget_DrawColorLight (_CREATE_COLORSELECT()\gadget) CUSTUMGadget_DrawColorselect(_CREATE_COLORSELECT()\gadget) EndIf EndProcedure Procedure _GetGadgetData(gadget.i, colortype.s) ; ; ROUTINE DE RECUPERATION DU LA VALEUR DU SLIDER. ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null Select LCase(colortype) Case "red" ProcedureReturn _CREATE_COLORSELECT()\lchannel_r Case "green" ProcedureReturn _CREATE_COLORSELECT()\lchannel_g Case "blue" ProcedureReturn _CREATE_COLORSELECT()\lchannel_b EndSelect EndIf EndProcedure Procedure _SetGadgetData(gadget.i, colortype.s, value.l) ; ; ROUTINE DE CHANGEMENT DE LA VALEUR DU SLIDER. ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null Select LCase(colortype) Case "red" _CREATE_COLORSELECT()\lchannel_r = value Case "green" _CREATE_COLORSELECT()\lchannel_g = value Case "blue" _CREATE_COLORSELECT()\lchannel_b = value EndSelect EndIf EndProcedure Procedure _DisableGadget(gadget.i, value.b) ; ; ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null _CREATE_COLORSELECT()\disable = value ; CUSTUMGadget_DrawColorselect(_CREATE_COLORSELECT()\gadget) EndIf EndProcedure Procedure _HideGadget(gadget.i, value.b) ; ; ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null _CREATE_COLORSELECT()\hide = value HideGadget(gadget, value) EndIf EndProcedure Procedure _FreeGadget(gadget.i) ; ; ; If FindMapElement(_CREATE_COLORSELECT(), Str(gadget)) <> #Null UnbindGadgetEvent(_CREATE_COLORSELECT()\gadget, @_OnEvent_CUSTUMCOLOR()) ; FreeGadget(_CREATE_COLORSELECT()\gadget) DeleteMapElement(_CREATE_COLORSELECT(), Str(gadget)) EndIf EndProcedure ; CUSTUMGadget_ColorBox () CUSTUMGadget_ColorArrow (0, 5) CUSTUMGadget_ColorCross (9, 9) EndModule ; ; **************************************************************************** ; ; **************************************************************************** ; ; **************************************************************************** ; ;- ; ;- ROUTINE DE TEST DES FONCTIONS (MODULE). ; CompilerIf #PB_Compiler_IsMainFile = 1 Define.l event, i, j = 1 Define.b aa, ba, ab, bb OpenWindow (0, 0, 0, 640, 425, "Custum Gadget", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered) Define a = ColorSelector::_CreateGadget(#PB_Any, 10, 10) Define b = ColorSelector::_CreateGadget(#PB_Any, 340, 10) ButtonGadget(10, 10, 280, 150, 40, "hide Selector 1") ButtonGadget(11, 10, 322, 150, 40, "hide Selector 2") ButtonGadget(12, 162, 280, 150, 40, "Disable Selector 1") ButtonGadget(13, 162, 322, 150, 40, "Disable Selector 2") ButtonGadget(14, 314, 280, 150, 40, "Delete Selector 1") ButtonGadget(15, 314, 322, 150, 40, "Delete Selector 2") TextGadget (16, 10, 380, 400, 20, "COLOR: $0") TextGadget (17, 10, 405, 400, 20, "COLOR: $0") Repeat event = WaitWindowEvent(10) If event = #PB_Event_Gadget Select EventGadget() Case 10 aa ! 1 ColorSelector::_HideGadget(a, aa) Case 11 ba ! 1 ColorSelector::_HideGadget(b, ba) Case 12 ab ! 1 ColorSelector::_DisableGadget(a, ab) Case 13 bb ! 1 ColorSelector::_DisableGadget(b, bb) Case 14 ColorSelector::_FreeGadget(a) Case 15 ColorSelector::_FreeGadget(b) EndSelect EndIf If event = #PB_Event_CustomGadget_Color Select EventGadget() Case a SetGadgetText(16, "COLOR: $" + Hex(ColorSelector::_GetGadgetState(a))) Case b SetGadgetText(17, "COLOR: $" + Hex(ColorSelector::_GetGadgetState(b))) EndSelect EndIf Until event = #PB_Event_CloseWindow CompilerEndIf cordially, GallyHC |
Author: | StarBootics [ Sun Mar 31, 2019 9:03 pm ] |
Post subject: | Re: ColorSpectrum - Module |
Hello gally, Your code don't work under Linux. There is a problem with this line : Code: _CREATE_COLORSELECT()\background = _WINDOW_BACKGROUND(WindowID(_CREATE_SLIDER()\window)) Quote: [15 :58 :12] [COMPILER] Ligne 575: _CREATE_SLIDER() is Not a function, Array, List, Map Or Macro. Best regards StarBootics |
Author: | gally [ Sun Mar 31, 2019 9:19 pm ] |
Post subject: | Re: ColorSpectrum - Module |
thank you Just a little forgetfulness, and I had not retested for Linux. I corrected in the post. Code: _CREATE_COLORSELECT()\background = _WINDOW_BACKGROUND(WindowID(_CREATE_COLORSELECT()\window)) I'm tested in my virtual machine in linux. Best regards GallyHC |
Author: | StarBootics [ Mon May 25, 2020 3:39 pm ] |
Post subject: | Re: ColorSpectrum - Module |
Hello everyone, A little update of the Color Spectrum Requester : OOP style and RGBA color support. Sorry I'm very busy right now and I don't have the time to update the Module version of this code. Code: ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Project name : ColorSpectrum - OOP ; File Name : ColorSpectrum - OOP.pb ; File version: 1.1.0 ; Programming : OK ; Programmed by : StarBootics ; Date : 21-05-2020 ; Last Update : 25-05-2020 ; PureBasic code : V5.72 LTS ; Platform : Windows, Linux, MacOS X ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Programming notes ; ; Based on original code for GallyHC and Guimauve (French Forum) ; See here : https://www.purebasic.fr/french/viewtopic.php?f=6&t=12596 ; ; Update : OOP style and RGBA color support added. ; ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DeclareModule ColorSpectrum Interface ColorSpectrum GetActivateAlpha.a() SetActivateAlpha(P_ActivateAlpha.a) SetTextTitle(P_Title.s) SetTextHue(P_Hue.s) SetTextSaturation(P_Saturation.s) SetTextLightness(P_Lightness.s) SetTextRed(P_Red.s) SetTextGreen(P_Green.s) SetTextBlue(P_Blue.s) SetTextAlpha(P_Alpha.s) SetTextRefresh(P_Refresh.s) SetTextValidate(P_Validate.s) SetTextCancel(P_Cancel.s) Requester.q(Color.q = -1) Free() EndInterface Declare.i New(P_ActivateAlpha.a) EndDeclareModule Module ColorSpectrum Enumeration #COLOR_SPECTRUM_TARGET_HUE #COLOR_SPECTRUM_TARGET_SATURATION #COLOR_SPECTRUM_TARGET_LIGHTNESS #COLOR_SPECTRUM_TARGET_RED #COLOR_SPECTRUM_TARGET_GREEN #COLOR_SPECTRUM_TARGET_BLUE #COLOR_SPECTRUM_TARGET_ALPHA #COLOR_SPECTRUM_TARGET_MAX EndEnumeration Enumeration #COLOR_SPECTRUM_TEXT_HUE #COLOR_SPECTRUM_TEXT_SATURATION #COLOR_SPECTRUM_TEXT_LIGHTNESS #COLOR_SPECTRUM_TEXT_RED #COLOR_SPECTRUM_TEXT_GREEN #COLOR_SPECTRUM_TEXT_BLUE #COLOR_SPECTRUM_TEXT_ALPHA #COLOR_SPECTRUM_TEXT_WIN_TITLE #COLOR_SPECTRUM_TEXT_BTN_REFRESH #COLOR_SPECTRUM_TEXT_BTN_VALIDATE #COLOR_SPECTRUM_TEXT_BTN_CANCEL #COLOR_SPECTRUM_TEXT_MAX EndEnumeration Enumeration #COLOR_SPECTRUM_BTN_REFRESH #COLOR_SPECTRUM_BTN_VALIDATE #COLOR_SPECTRUM_BTN_CANCEL #COLOR_SPECTRUM_BTN_MAX EndEnumeration #COLOR_SPECTRUM_SIZE_MAX = 255 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Déclaration des Structures <<<<< Structure Color StructureUnion Red.a Hue.a EndStructureUnion StructureUnion Green.a Saturation.a EndStructureUnion StructureUnion Blue.a Lightness.a EndStructureUnion Alpha.a EndStructure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les observateurs <<<<< Macro GetColorRed(ColorA) ColorA\Red EndMacro Macro GetColorHue(ColorA) ColorA\Hue EndMacro Macro GetColorGreen(ColorA) ColorA\Green EndMacro Macro GetColorSaturation(ColorA) ColorA\Saturation EndMacro Macro GetColorBlue(ColorA) ColorA\Blue EndMacro Macro GetColorLightness(ColorA) ColorA\Lightness EndMacro Macro GetColorAlpha(ColorA) ColorA\Alpha EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les mutateurs <<<<< Macro SetColorRed(ColorA, P_Red) GetColorRed(ColorA) = P_Red EndMacro Macro SetColorHue(ColorA, P_Hue) GetColorHue(ColorA) = P_Hue EndMacro Macro SetColorGreen(ColorA, P_Green) GetColorGreen(ColorA) = P_Green EndMacro Macro SetColorLightness(ColorA, P_Lightness) GetColorLightness(ColorA) = P_Lightness EndMacro Macro SetColorBlue(ColorA, P_Blue) GetColorBlue(ColorA) = P_Blue EndMacro Macro SetColorSaturation(ColorA, P_Saturation) GetColorSaturation(ColorA) = P_Saturation EndMacro Macro SetColorAlpha(ColorA, P_Alpha) GetColorAlpha(ColorA) = P_Alpha EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Conversion vers couleur entier long <<<<< Macro ColorSpectrum_RGB() (*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] << 16 + *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] << 8 + *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED]) EndMacro Macro ColorSpectrum_RGBA() (*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_ALPHA] << 24 + *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] << 16 + *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] << 8 + *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED]) EndMacro Macro Color_RGB(ColorA) (GetColorBlue(ColorA) << 16 + GetColorGreen(ColorA) << 8 + GetColorRed(ColorA)) EndMacro Macro Color_RGBA(ColorA) (GetColorAlpha(ColorA) << 24 + GetColorBlue(ColorA) << 16 + GetColorGreen(ColorA) << 8 + GetColorRed(ColorA)) EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Min et Max de 3 nombres <<<<< Macro MinMaxNumber(P_Min, P_Max, P_Number01, P_Number02, P_Number03) P_Min = P_Number01 If P_Number02 < P_Min P_Min = P_Number02 EndIf If P_Number03 < P_Min P_Min = P_Number03 EndIf P_Max = P_Number01 If P_Number02 > P_Max P_Max = P_Number02 EndIf If P_Number03 > P_Max P_Max = P_Number03 EndIf EndMacro ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Déclaration de la Structure <<<<< Structure Private_Members VirtualTable.i ActivateAlpha.a HSLRGBA.a[#COLOR_SPECTRUM_TARGET_MAX] ; Hue, Saturation, Lightness, Red, Green, Blue SafeHSLRGBA.a[#COLOR_SPECTRUM_TARGET_MAX] ; SafeHue, SafeSaturation, SafeLightness, SafeRed, SafeGreen, SafeBlue BackgroundLayer.i AlphaBackgroundLayer.i SpectrumCanvas.i LightnessCanvas.i AlphaCanvas.i WindowHandle.i WindowBackgroundColor.i ColorPreviewHandle.i Text.s[#COLOR_SPECTRUM_TEXT_MAX] TextHandle.i[#COLOR_SPECTRUM_TARGET_MAX] StringHandle.i[#COLOR_SPECTRUM_TARGET_MAX] ButtonHandle.i[#COLOR_SPECTRUM_BTN_MAX] EndStructure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les observateurs <<<<< Procedure.b GetActivateAlpha(*This.Private_Members) ProcedureReturn *This\ActivateAlpha EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les mutateurs <<<<< Procedure SetActivateAlpha(*This.Private_Members, P_ActivateAlpha.a) If P_ActivateAlpha = 0 *This\ActivateAlpha = #False ElseIf P_ActivateAlpha >= 1 *This\ActivateAlpha = #True EndIf EndProcedure Procedure SetTextTitle(*This.Private_Members, P_Title.s) *This\Text[#COLOR_SPECTRUM_TEXT_WIN_TITLE] = P_Title EndProcedure Procedure SetTextHue(*This.Private_Members, P_Hue.s) *This\Text[#COLOR_SPECTRUM_TEXT_HUE] = P_Hue EndProcedure Procedure SetTextSaturation(*This.Private_Members, P_Saturation.s) *This\Text[#COLOR_SPECTRUM_TEXT_SATURATION] = P_Saturation EndProcedure Procedure SetTextLightness(*This.Private_Members, P_Lightness.s) *This\Text[#COLOR_SPECTRUM_TEXT_LIGHTNESS] = P_Lightness EndProcedure Procedure SetTextRed(*This.Private_Members, P_Red.s) *This\Text[#COLOR_SPECTRUM_TEXT_RED] = P_Red EndProcedure Procedure SetTextGreen(*This.Private_Members, P_Green.s) *This\Text[#COLOR_SPECTRUM_TEXT_GREEN] = P_Green EndProcedure Procedure SetTextBlue(*This.Private_Members, P_Blue.s) *This\Text[#COLOR_SPECTRUM_TEXT_BLUE] = P_Blue EndProcedure Procedure SetTextAlpha(*This.Private_Members, P_Alpha.s) *This\Text[#COLOR_SPECTRUM_TEXT_ALPHA] = P_Alpha EndProcedure Procedure SetTextRefresh(*This.Private_Members, P_Refresh.s) *This\Text[#COLOR_SPECTRUM_TEXT_BTN_REFRESH] = P_Refresh EndProcedure Procedure SetTextValidate(*This.Private_Members, P_Validate.s) *This\Text[#COLOR_SPECTRUM_TEXT_BTN_VALIDATE] = P_Validate EndProcedure Procedure SetTextCancel(*This.Private_Members, P_Cancel.s) *This\Text[#COLOR_SPECTRUM_TEXT_BTN_CANCEL] = P_Cancel EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Nom de la procédure <<<<< Procedure GetWindowBackgroundColor(WindowHandle) If StartDrawing(WindowOutput(WindowHandle)) BackgroundColor.l = Point(3, 3) StopDrawing() EndIf ProcedureReturn BackgroundColor EndProcedure Procedure UpdateColorPreviewGadget(GadgetID, Color) If GetGadgetData(GadgetID) <> #Null Width = GadgetWidth(GadgetID) Height = GadgetHeight(GadgetID) If StartDrawing(ImageOutput(GetGadgetData(GadgetID))) Box(0, 0, Width, Height, Color) DrawingMode(#PB_2DDrawing_Outlined) Box(0, 0, Width, Height, 0) StopDrawing() SetGadgetState(GadgetID, ImageID(GetGadgetData(GadgetID))) EndIf EndIf EndProcedure Procedure ColorPreviewGadget(GadgetID, x.w, y.w, Width.w, Height.w, Color) GadgetHandle = ImageGadget(GadgetID, x, y, Width, Height, 0) If GadgetID = #PB_Any GadgetID = GadgetHandle EndIf SetGadgetData(GadgetID, CreateImage(#PB_Any, Width, Height)) UpdateColorPreviewGadget(GadgetID, Color) ProcedureReturn GadgetHandle EndProcedure Procedure FreeColorPreviewGadget(GadgetID) If GetGadgetData(GadgetID) <> #Null If IsImage(GetGadgetData(GadgetID)) FreeImage(GetGadgetData(GadgetID)) EndIf EndIf EndProcedure Procedure Private_ConvertRM(M1.f, M2.f, HueColor.f) ; ROUTINE DE CALCUL DE LA COMPOSANTE DE COULEUR. If HueColor > 360 HueColor - 360 EndIf If HueColor < 0 HueColor + 360 EndIf If HueColor < 60 M1 = M1 + (M2 - M1) * HueColor / 60 Else If HueColor < 180 M1 = M2 Else If HueColor < 240 M1 = M1 + (M2 - M1) * (240 - HueColor) / 60 EndIf EndIf EndIf ProcedureReturn M1 * 255 EndProcedure Procedure Convert_HSL_To_RGB(HueColor.f, LightnessColor.f, SaturationColor.f, *RGBColorA.Color) ; ROUTINE DE CONSERTION DU HSL EN RGB. HueColor = HueColor * 360 / #COLOR_SPECTRUM_SIZE_MAX SaturationColor = SaturationColor / #COLOR_SPECTRUM_SIZE_MAX LightnessColor = LightnessColor / #COLOR_SPECTRUM_SIZE_MAX If SaturationColor = 0.0 SetColorRed(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) SetColorGreen(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) SetColorBlue(*RGBColorA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX) Else If LightnessColor <= 0.5 M2.f = LightnessColor + LightnessColor * SaturationColor Else M2 = LightnessColor + SaturationColor - LightnessColor * SaturationColor EndIf M1.f = 2 * LightnessColor - M2 SetColorRed(*RGBColorA, Private_ConvertRm(M1, M2, HueColor + 120)) SetColorGreen(*RGBColorA, Private_ConvertRm(M1, M2, HueColor)) SetColorBlue(*RGBColorA, Private_ConvertRm(M1, M2, HueColor - 120)) EndIf EndProcedure Procedure Convert_RGB_To_HSL(*RGBColorA.Color, *HSLColorA.Color) ; ROUTINE DE CONVERTION DU RGB EN HLS. MinMaxNumber(Min, Max, GetColorRed(*RGBColorA), GetColorGreen(*RGBColorA), GetColorBlue(*RGBColorA)) DeltaMaxMin = Max - Min SumMaxMin = Max + Min LightnessColor.f = SumMaxMin / 510 If Max = Min HueColor.f = 0 SaturationColor.f = 0 Else NormalizedRed = (Max - GetColorRed(*RGBColorA)) / DeltaMaxMin NormalizedGreen = (Max - GetColorGreen(*RGBColorA)) / DeltaMaxMin NormalizedBlue = (Max - GetColorBlue(*RGBColorA)) / DeltaMaxMin If LightnessColor <= 0.5 SaturationColor = DeltaMaxMin / SumMaxMin Else SaturationColor = DeltaMaxMin / (510 - SumMaxMin) EndIf If GetColorRed(*RGBColorA) = Max HueColor = 60 * (6 + NormalizedBlue - NormalizedGreen) EndIf If GetColorGreen(*RGBColorA) = Max HueColor = 60 * (2 + NormalizedRed - NormalizedBlue) EndIf If GetColorBlue(*RGBColorA) = Max HueColor = 60 * (4 + NormalizedGreen - NormalizedRed) EndIf EndIf If HueColor = 360 HueColor = 0 EndIf HueColor = HueColor / 360 * #COLOR_SPECTRUM_SIZE_MAX LightnessColor = LightnessColor * #COLOR_SPECTRUM_SIZE_MAX SaturationColor = SaturationColor * #COLOR_SPECTRUM_SIZE_MAX SetColorHue(*HSLColorA, Int(HueColor)) SetColorSaturation(*HSLColorA, Int(SaturationColor)) SetColorLightness(*HSLColorA, Int(LightnessColor)) EndProcedure Procedure GenerateColorSpectrumBackgroundLayer(*This.Private_Members) ; ROUTINE DE PRECALCUL DU SPECTRE DE COULEUR. *This\BackgroundLayer = CreateImage(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2) If *This\BackgroundLayer <> #Null If StartDrawing(ImageOutput(*This\BackgroundLayer)) Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000) For SaturationID = 1 To #COLOR_SPECTRUM_SIZE_MAX For HueID = 1 To #COLOR_SPECTRUM_SIZE_MAX Convert_HSL_To_RGB(HueID, #COLOR_SPECTRUM_SIZE_MAX >> 1, SaturationID, RGBColor.Color) Plot(HueID, (#COLOR_SPECTRUM_SIZE_MAX - SaturationID) + 1, Color_RGB(RGBColor)) Next Next StopDrawing() EndIf EndIf EndProcedure Procedure GenerateAlphaBackgroundLayer(*This.Private_Members) *This\AlphaBackgroundLayer = CreateImage(#PB_Any, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, 32) If *This\AlphaBackgroundLayer <> #Null If StartDrawing(ImageOutput(*This\AlphaBackgroundLayer)) Color1 = 0 Color2 = RGB(255,255,255) For PosY = 0 To #COLOR_SPECTRUM_SIZE_MAX + 2 Step 5 Box(0, PosY, 5, 5, Color1) Box(5, PosY, 5, 5, Color2) Box(10, PosY, 5, 5, Color1) Box(15, PosY, 5, 5, Color2) Swap Color1, Color2 Next DrawingMode(#PB_2DDrawing_Outlined) Box(0, 0, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, RGB(0,0,0)) StopDrawing() EndIf EndIf EndProcedure Procedure ColorSpectrum_DrawCross(*This.Private_Members) ; ROUTINE DE TRACAGE DE LA CROIX DU SPECTRE. PosX = *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE] PosY = #COLOR_SPECTRUM_SIZE_MAX - *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION] If PosX < #COLOR_SPECTRUM_SIZE_MAX PosX + 1 EndIf If PosY < #COLOR_SPECTRUM_SIZE_MAX PosY + 1 EndIf Box(PosX - 1, PosY - 9, 3, 5, 0) Box(PosX - 1, PosY + 5, 3, 5, 0) Box(PosX - 9, PosY - 1, 5, 3, 0) Box(PosX + 5, PosY - 1, 5, 3, 0) EndProcedure Procedure ColorSpectrum_DrawArrow(*This.Private_Members, Target) ; ROUTINE DE TRACAGE DE LA BARRE DE LIGHTNESS y1 = #COLOR_SPECTRUM_SIZE_MAX - *This\HSLRGBA[Target] If y1 => #COLOR_SPECTRUM_SIZE_MAX y1 = #COLOR_SPECTRUM_SIZE_MAX - 1 EndIf x1 = 22 x2 = 33 y1 + 1 y2 = y1 + 5 y3 = y1 - 5 xm = (x1 + x2) >> 1 LineXY(x1, y1, x2, y2, 0) LineXY(x2, y2, x2, y3, 0) LineXY(x2, y3, x1, y1, 0) FillArea(xm, y1, 0, 0) EndProcedure Procedure ColorSpectrum_SpectrumRedraw(*This.Private_Members) ; ROUTINE D'AFFICHAGE DU SPECTRE ET CROIX. If StartDrawing(CanvasOutput(*This\SpectrumCanvas)) If *This\BackgroundLayer <> #Null DrawImage(ImageID(*This\BackgroundLayer), 0, 0) EndIf ColorSpectrum_DrawCross(*This) StopDrawing() Convert_HSL_To_RGB(*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) UpdateColorPreviewGadget(*This\ColorPreviewHandle, Color_RGB(RGBColor)) EndIf EndProcedure Procedure ColorSpectrum_LightnessRedraw(*This.Private_Members) ; ROUTINE DE TRACAGE DE LA BARRE LUMIERE. If StartDrawing(CanvasOutput(*This\LightnessCanvas)) CurrentLightness = *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] Box(0, 0, GadgetWidth(*This\LightnessCanvas), GadgetHeight(*This\LightnessCanvas), *This\WindowBackgroundColor) Box(0, 0, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000) For LightnessID = 1 To #COLOR_SPECTRUM_SIZE_MAX Convert_HSL_To_RGB(*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE], LightnessID, *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) LineXY(1, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, 18, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, Color_RGB(RGBColor)) Next *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = CurrentLightness ColorSpectrum_DrawArrow(*This, #COLOR_SPECTRUM_TARGET_LIGHTNESS) StopDrawing() Convert_HSL_To_RGB(*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) UpdateColorPreviewGadget(*This\ColorPreviewHandle, Color_RGB(RGBColor)) EndIf EndProcedure Procedure ColorSpectrum_AlphaRedraw(*This.Private_Members) ; ROUTINE DE TRACAGE DE LA BARRE ALPHA. TempImage = CreateImage(#PB_Any, 18, GadgetHeight(*This\AlphaCanvas) - 2, 32) If TempImage <> #Null If StartDrawing(ImageOutput(TempImage)) RGBColor.Color\Red = *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED] RGBColor\Green = *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] RGBColor\Blue = *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] DrawingMode(#PB_2DDrawing_AllChannels) For AlphaID = 1 To #COLOR_SPECTRUM_SIZE_MAX RGBColor\Alpha = AlphaID LineXY(1, (#COLOR_SPECTRUM_SIZE_MAX - AlphaID) + 1, 18, (#COLOR_SPECTRUM_SIZE_MAX - AlphaID) + 1, Color_RGBA(RGBColor)) Next StopDrawing() EndIf EndIf TempImage2 = CreateImage(#PB_Any, 20, GadgetHeight(*This\AlphaCanvas)) If TempImage2 <> #Null If StartDrawing(ImageOutput(TempImage2)) DrawImage(ImageID(*This\AlphaBackgroundLayer), 0, 0) DrawingMode(#PB_2DDrawing_AlphaBlend) DrawImage(ImageID(TempImage), 1, 1) StopDrawing() EndIf FreeImage(TempImage) EndIf If StartDrawing(CanvasOutput(*This\AlphaCanvas)) Box(0, 0, GadgetWidth(*This\AlphaCanvas), GadgetHeight(*This\AlphaCanvas), *This\WindowBackgroundColor) DrawImage(ImageID(TempImage2), 0, 0) ColorSpectrum_DrawArrow(*This, #COLOR_SPECTRUM_TARGET_ALPHA) StopDrawing() FreeImage(TempImage2) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshHSLColorOutput <<<<< Procedure RefreshHSLColorOutput(*This.Private_Members) For TargetID = #COLOR_SPECTRUM_TARGET_HUE To #COLOR_SPECTRUM_TARGET_LIGHTNESS SetGadgetText(*This\StringHandle[TargetID], Str(*This\HSLRGBA[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshRGBColorOutput <<<<< Procedure RefreshRGBColorOutput(*This.Private_Members) Convert_HSL_To_RGB(*This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS], *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION], RGBColor.Color) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED] = GetColorRed(RGBColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] = GetColorGreen(RGBColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] = GetColorBlue(RGBColor) If *This\ActivateAlpha = #True LastTarget = #COLOR_SPECTRUM_TARGET_ALPHA Else LastTarget = #COLOR_SPECTRUM_TARGET_BLUE EndIf For TargetID = #COLOR_SPECTRUM_TARGET_RED To LastTarget SetGadgetText(*This\StringHandle[TargetID], Str(*This\HSLRGBA[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur CatchSafeHSLRGBA <<<<< Procedure CatchSafeHSLRGBA(*This.Private_Members) If *This\ActivateAlpha = #True LastTarget = #COLOR_SPECTRUM_TARGET_ALPHA Else LastTarget = #COLOR_SPECTRUM_TARGET_BLUE EndIf For TargetID = #COLOR_SPECTRUM_TARGET_HUE To LastTarget *This\SafeHSLRGBA[TargetID] = Val(GetGadgetText(*This\StringHandle[TargetID])) Next EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur CatchRGBColorInput <<<<< Procedure CatchRGBColorInput(*This.Private_Members) If *This\ActivateAlpha = #True LastTarget = #COLOR_SPECTRUM_TARGET_ALPHA Else LastTarget = #COLOR_SPECTRUM_TARGET_BLUE EndIf For TargetID = #COLOR_SPECTRUM_TARGET_RED To LastTarget *This\HSLRGBA[TargetID] = Val(GetGadgetText(*This\StringHandle[TargetID])) Next SetColorRed(RGBColor.Color, *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED]) SetColorGreen(RGBColor, *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN]) SetColorBlue(RGBColor, *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE]) If *This\ActivateAlpha = #True SetColorAlpha(RGBColor, *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_ALPHA]) EndIf Convert_RGB_To_HSL(RGBColor, HSLColor.Color) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE] = GetColorHue(HSLColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION] = GetColorSaturation(HSLColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = GetColorLightness(HSLColor) EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur RefeshSpectrum <<<<< Procedure RefeshColorSpectrum(*This.Private_Members) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE] = 0 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION] = 0 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = 128 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED] = 0 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] = 0 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] = 0 If *This\ActivateAlpha = #True *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_ALPHA] = 128 EndIf ColorSpectrum_SpectrumRedraw(*This) ColorSpectrum_LightnessRedraw(*This) If *This\ActivateAlpha = #True ColorSpectrum_AlphaRedraw(*This) EndIf RefreshHSLColorOutput(*This) RefreshRGBColorOutput(*This) CatchSafeHSLRGBA(*This) EndProcedure Procedure ForceColorSpectrumStartColor(*This.Private_Members, Color.q) If Color <> - 1 *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_RED] = Red(Color) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN] = Green(Color) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE] = Blue(Color) If *This\ActivateAlpha = #True *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_ALPHA] = Alpha(Color) LastTarget = #COLOR_SPECTRUM_TARGET_ALPHA Else LastTarget = #COLOR_SPECTRUM_TARGET_BLUE EndIf For TargetID = #COLOR_SPECTRUM_TARGET_RED To LastTarget SetGadgetText(*This\StringHandle[TargetID], Str(*This\HSLRGBA[TargetID])) Next CatchRGBColorInput(*This) RefreshHSLColorOutput(*This) Else RefreshRGBColorOutput(*This) RefreshHSLColorOutput(*This) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur ColorSpectrum_SpectrumCanvas_EventManager <<<<< Procedure ColorSpectrum_SpectrumCanvas_EventManager(*This.Private_Members) EventType = EventType() If EventType = #PB_EventType_LeftButtonDown Or ( EventType = #PB_EventType_MouseMove And GetGadgetAttribute(*This\SpectrumCanvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) MouseX = GetGadgetAttribute(*This\SpectrumCanvas, #PB_Canvas_MouseX) MouseY = GetGadgetAttribute(*This\SpectrumCanvas, #PB_Canvas_MouseY) If MouseX < 0 MouseX = 0 Else If MouseX > #COLOR_SPECTRUM_SIZE_MAX MouseX = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf If MouseY < 0 MouseY = 0 Else If MouseY > #COLOR_SPECTRUM_SIZE_MAX MouseY = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE] = MouseX *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION] = #COLOR_SPECTRUM_SIZE_MAX - MouseY ColorSpectrum_SpectrumRedraw(*This) ColorSpectrum_LightnessRedraw(*This) If *This\ActivateAlpha = #True ColorSpectrum_AlphaRedraw(*This) EndIf RefreshHSLColorOutput(*This) RefreshRGBColorOutput(*This) CatchSafeHSLRGBA(*This) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur ColorSpectrum_LightnessCanvas_EventManager <<<<< Procedure ColorSpectrum_LightnessCanvas_EventManager(*This.Private_Members) EventType = EventType() If EventType = #PB_EventType_LeftButtonDown Or (EventType = #PB_EventType_MouseMove And GetGadgetAttribute(*This\LightnessCanvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) MouseY = GetGadgetAttribute(*This\LightnessCanvas, #PB_Canvas_MouseY) If MouseY < 0 MouseY = 0 Else If MouseY > #COLOR_SPECTRUM_SIZE_MAX MouseY = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = #COLOR_SPECTRUM_SIZE_MAX - MouseY ColorSpectrum_LightnessRedraw(*This) If *This\ActivateAlpha = #True ColorSpectrum_AlphaRedraw(*This) EndIf RefreshHSLColorOutput(*This) RefreshRGBColorOutput(*This) CatchSafeHSLRGBA(*This) EndIf EndProcedure Procedure ColorSpectrum_AlphaCanvas_EventManager(*This.Private_Members) EventType = EventType() If EventType = #PB_EventType_LeftButtonDown Or (EventType = #PB_EventType_MouseMove And GetGadgetAttribute(*This\AlphaCanvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton) MouseY = GetGadgetAttribute(*This\AlphaCanvas, #PB_Canvas_MouseY) If MouseY < 0 MouseY = 0 Else If MouseY > #COLOR_SPECTRUM_SIZE_MAX MouseY = #COLOR_SPECTRUM_SIZE_MAX EndIf EndIf *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_ALPHA] = #COLOR_SPECTRUM_SIZE_MAX - MouseY ColorSpectrum_AlphaRedraw(*This) RefreshHSLColorOutput(*This) RefreshRGBColorOutput(*This) CatchSafeHSLRGBA(*This) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< L'opérateur Hue Input Control <<<<< Procedure ColorSpectrum_Input_Control(*This.Private_Members, Target.b) EventType = EventType() If EventType = #PB_EventType_Change *This\SafeHSLRGBA[Target] = Val(GetGadgetText(*This\StringHandle[Target])) If *This\SafeHSLRGBA[Target] < 0 *This\SafeHSLRGBA[Target] = 0 EndIf If *This\SafeHSLRGBA[Target] > 255 *This\SafeHSLRGBA[Target] = 255 EndIf Select Target Case #COLOR_SPECTRUM_TARGET_HUE, #COLOR_SPECTRUM_TARGET_LIGHTNESS, #COLOR_SPECTRUM_TARGET_SATURATION *This\HSLRGBA[Target] = *This\SafeHSLRGBA[Target] Case #COLOR_SPECTRUM_TARGET_RED, #COLOR_SPECTRUM_TARGET_GREEN, #COLOR_SPECTRUM_TARGET_BLUE, #COLOR_SPECTRUM_TARGET_ALPHA *This\HSLRGBA[Target] = *This\SafeHSLRGBA[Target] SetColorRed(RGBColor.Color, *This\SafeHSLRGBA[#COLOR_SPECTRUM_TARGET_RED]) SetColorGreen(RGBColor, *This\SafeHSLRGBA[#COLOR_SPECTRUM_TARGET_GREEN]) SetColorBlue(RGBColor, *This\SafeHSLRGBA[#COLOR_SPECTRUM_TARGET_BLUE]) Convert_RGB_To_HSL(RGBColor, HSLColor.Color) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_HUE] = GetColorHue(HSLColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_SATURATION] = GetColorSaturation(HSLColor) *This\HSLRGBA[#COLOR_SPECTRUM_TARGET_LIGHTNESS] = GetColorLightness(HSLColor) EndSelect ColorSpectrum_SpectrumRedraw(*This) ColorSpectrum_LightnessRedraw(*This) If *This\ActivateAlpha = #True ColorSpectrum_AlphaRedraw(*This) EndIf ElseIf EventType = #PB_EventType_LostFocus SetGadgetText(*This\StringHandle[Target], Str(*This\SafeHSLRGBA[Target])) EndIf EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Nom de la procédure <<<<< Procedure.q Requester(*This.Private_Members, Color.q = -1) If *This\ActivateAlpha = #True WinWidth.w = #COLOR_SPECTRUM_SIZE_MAX + 197 + 45 WinHeight.w = #COLOR_SPECTRUM_SIZE_MAX + 49 + 39 Else WinWidth.w = #COLOR_SPECTRUM_SIZE_MAX + 197 WinHeight.w = #COLOR_SPECTRUM_SIZE_MAX + 49 EndIf *This\WindowHandle = OpenWindow(#PB_Any, 0, 0, WinWidth, WinHeight, *This\Text[#COLOR_SPECTRUM_TEXT_WIN_TITLE] , #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If *This\WindowHandle <> #Null *This\SpectrumCanvas = CanvasGadget(#PB_Any, 5, 5, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2) *This\LightnessCanvas = CanvasGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 15, 5, 35, #COLOR_SPECTRUM_SIZE_MAX + 2) If *This\ActivateAlpha = #True *This\AlphaCanvas = CanvasGadget(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 55, 5, 35, #COLOR_SPECTRUM_SIZE_MAX + 2) EndIf PosY = 5 If *This\ActivateAlpha = #True LastGadget = #COLOR_SPECTRUM_TARGET_MAX - 1 PosX1 = #COLOR_SPECTRUM_SIZE_MAX + 55 + 40 PosX2 = #COLOR_SPECTRUM_SIZE_MAX + 150 + 40 Else LastGadget = #COLOR_SPECTRUM_TARGET_MAX - 2 PosX1 = #COLOR_SPECTRUM_SIZE_MAX + 55 PosX2 = #COLOR_SPECTRUM_SIZE_MAX + 150 EndIf For Index = 0 To LastGadget *This\TextHandle[Index] = StringGadget(#PB_Any, PosX1, PosY, 95, 34, *This\Text[Index], #PB_String_ReadOnly) *This\StringHandle[Index] = StringGadget(#PB_Any, PosX2, PosY, 42, 34, "0") PosY + 34 Next *This\ColorPreviewHandle = ColorPreviewGadget(#PB_Any, PosX1, PosY+5, 137, 47, 0) PosX = (WinWidth - 135*3 - 15) For BtnID = 0 To #COLOR_SPECTRUM_BTN_MAX - 1 *This\ButtonHandle[BtnID] = ButtonGadget(#PB_Any, PosX, PosY+57, 135, 34, *This\Text[BtnID + #COLOR_SPECTRUM_TEXT_BTN_REFRESH]) PosX + 140 Next *This\WindowBackgroundColor = GetWindowBackgroundColor(*This\WindowHandle) GenerateColorSpectrumBackgroundLayer(*This) If Color <> -1 ForceColorSpectrumStartColor(*This, Color) EndIf CatchSafeHSLRGBA(*This) ColorSpectrum_SpectrumRedraw(*This) ColorSpectrum_LightnessRedraw(*This) If *This\ActivateAlpha = #True GenerateAlphaBackgroundLayer(*This) ColorSpectrum_AlphaRedraw(*This) EndIf ReturnSelectedColor = -1 Repeat EventID = WaitWindowEvent() Select EventID Case #PB_Event_Gadget Select EventGadget() Case *This\SpectrumCanvas ColorSpectrum_SpectrumCanvas_EventManager(*This) Case *This\LightnessCanvas ColorSpectrum_LightnessCanvas_EventManager(*This) Case *This\AlphaCanvas ColorSpectrum_AlphaCanvas_EventManager(*This) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_HUE] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_HUE) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_LIGHTNESS] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_LIGHTNESS) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_SATURATION] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_SATURATION) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_RED] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_RED) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_GREEN] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_GREEN) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_BLUE] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_BLUE) Case *This\StringHandle[#COLOR_SPECTRUM_TARGET_ALPHA] ColorSpectrum_Input_Control(*This, #COLOR_SPECTRUM_TARGET_ALPHA) Case *This\ButtonHandle[#COLOR_SPECTRUM_BTN_REFRESH] RefeshColorSpectrum(*This) Case *This\ButtonHandle[#COLOR_SPECTRUM_BTN_VALIDATE] If *This\ActivateAlpha = #False ReturnSelectedColor = ColorSpectrum_RGB() Else ReturnSelectedColor = ColorSpectrum_RGBA() & $FFFFFFFF EndIf EventID = #PB_Event_CloseWindow Case *This\ButtonHandle[#COLOR_SPECTRUM_BTN_CANCEL] EventID = #PB_Event_CloseWindow EndSelect EndSelect Until EventID = #PB_Event_CloseWindow If IsImage(*This\BackgroundLayer) FreeImage(*This\BackgroundLayer) *This\BackgroundLayer = 0 EndIf If IsImage(*This\AlphaBackgroundLayer) FreeImage(*This\AlphaBackgroundLayer) *This\AlphaBackgroundLayer = 0 EndIf FreeColorPreviewGadget(*This\ColorPreviewHandle) CloseWindow(*This\WindowHandle) EndIf ProcedureReturn ReturnSelectedColor EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Le Destructeur <<<<< Procedure Free(*This.Private_Members) ClearStructure(*This, Private_Members) FreeStructure(*This) EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Le Constructeur <<<<< Procedure.i New(P_ActivateAlpha.a) *This.Private_Members = AllocateStructure(Private_Members) *This\VirtualTable = ?START_METHODS SetActivateAlpha(*This, P_ActivateAlpha) SetTextTitle(*This, "Color Spectrum Requester") SetTextHue(*This, "Hue") SetTextSaturation(*This, "Saturation") SetTextLightness(*This, "Lightness") SetTextRed(*This, "Red") SetTextGreen(*This, "Green") SetTextBlue(*This, "Blue") SetTextAlpha(*This, "Alpha") SetTextRefresh(*This, "Refresh") SetTextValidate(*This, "Validate") SetTextCancel(*This, "Cancel") ProcedureReturn *This EndProcedure ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; <<<<< Les entrées de la table virtuelle <<<<< DataSection START_METHODS: Data.i @GetActivateAlpha() Data.i @SetActivateAlpha() Data.i @SetTextTitle() Data.i @SetTextHue() Data.i @SetTextSaturation() Data.i @SetTextLightness() Data.i @SetTextRed() Data.i @SetTextGreen() Data.i @SetTextBlue() Data.i @SetTextAlpha() Data.i @SetTextRefresh() Data.i @SetTextValidate() Data.i @SetTextCancel() Data.i @Requester() Data.i @Free() END_METHODS: EndDataSection EndModule CompilerIf #PB_Compiler_IsMainFile ColorSpectrum.ColorSpectrum::ColorSpectrum = ColorSpectrum::New(0) ColorSpectrum\Requester() ColorSpectrum\SetActivateAlpha(#True) ColorSpectrum\Requester() ColorSpectrum\Free() CompilerEndIf ; <<<<<<<<<<<<<<<<<<<<<<< ; <<<<< END OF FILE <<<<< ; <<<<<<<<<<<<<<<<<<<<<<< Best regards StarBootics |
Page 1 of 1 | All times are UTC + 1 hour |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |