Page 1 of 1

ColorEffex - Module

Posted: Wed Jan 20, 2016 11:10 pm
by StarBootics
Hello everyone,

A small module to manipulate color. I deserve credit only to convert the original code into a Module.

Best regards
StarBootics

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : ColorEffex - Module
; File Name : ColorEffex - Module.pb
; File version: 2.0.0
; Programming : OK
; Programmed by : Le Soldat Inconnu
; Date : 07-08-2004
; Last Update : 20-01-2016
; PureBasic code : V5.41 LTS
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; This code was originally created by 
; Le Soldat Inconnu to manipulate colors.
;
; I deserve credit only to convert the original 
; code into a Module.
;
; This code is free to be use where ever you like 
; but you use it at your own risk.
;
; The author can in no way be held responsible 
; for data loss, damage or other annoying 
; situations that may occur.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

DeclareModule ColorEffex
  
  Declare.l Luminosity(Color.l, Scale.f) 
  Declare.l Contrast(Color.l, Scale.f)
  Declare.l Grey(Color.l)
  Declare.l Negative(Color.l)
  Declare.l RedIntensity(Color.l, Scale.f)
  Declare.l GreenIntensity(Color.l, Scale.f)
  Declare.l BlueIntensity(Color.l, Scale.f)
  Declare.l YellowIntensity(Color, Level.f)
  Declare.l CyanIntensity(Color, Level.f)
  Declare.l MagentaIntensity(Color, Level.f)
  Declare.l Tint(Color.l, Scale.f)
  Declare.l Blending(Color1.l, Color2.l, Scale.f)
  Declare.l Add(Color1.l, Color2.l)
  Declare.l Level(Color, Minimum, Maximum)
  
EndDeclareModule

Module ColorEffex
  
  Macro ColorLimit(Color, Minimum, Maximum)
    
    If Color > Maximum
      Color = Maximum
    ElseIf Color < Minimum
      Color = Minimum
    EndIf
    
  EndMacro 
  
  Procedure.l Luminosity(Color.l, Scale.f) ; Eclaicir ou foncer une Couleur
    
    Red.l = (Color & $FF) * Scale
    Green.l = (Color >> 8 & $FF) * Scale
    Blue.l = (Color >> 16 & $FF) * Scale
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l Contrast(Color.l, Scale.f) ; Contraster la Couleur, échelle négative pour diminuer et positive pour augmenter.
    
    Red.l = (Color & $FF) * Scale + 127 * (1 - Scale)
    Green.l = (Color >> 8 & $FF) * Scale + 127 * (1 - Scale)
    Blue.l = (Color >> 16 & $FF) * Scale + 127 * (1 - Scale)
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l Grey(Color.l) ; Rendre la Couleur en nuance de gris
    
    Color.l = ((Color & $FF) + (Color >> 8 & $FF) + (Color >> 16 & $FF)) / 3
    
    ProcedureReturn (((Color << 8 + Color) << 8) + Color)
  EndProcedure
  
  Procedure.l Negative(Color.l) ; Renvoi la couleur en négatif
    
    Red = 255 - Color & $FF
    Green = 255 - Color >> 8 & $FF
    Blue = 255 - Color >> 16 & $FF
    Alpha = Color >> 24
    
    ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
  EndProcedure
  
  Procedure.l RedIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Red d'une Couleur
    
    Red.l = (Color & $FF) * Scale
    Green.l = (Color >> 8 & $FF)
    Blue.l = (Color >> 16 & $FF)
    
    ColorLimit(Red, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l GreenIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Greene d'une Couleur
    
    Red.l = (Color & $FF)
    Green.l = (Color >> 8 & $FF) * Scale
    Blue.l = (Color >> 16 & $FF)
    
    ColorLimit(Green, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l BlueIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Blue d'une Couleur
    
    Red.l = (Color & $FF)
    Green.l = (Color >> 8 & $FF)
    Blue.l = (Color >> 16 & $FF) * Scale
    
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
    
  Procedure.l YellowIntensity(Color, Level.f)
    Protected Red, Green
    
    Red = Color & $FF
    Green = Color >> 8 & $FF
    Red * Level
    Green * Level
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    
    ProcedureReturn (Color & $FFFF0000 | Red | Green << 8)
  EndProcedure
  
  Procedure.l CyanIntensity(Color, Level.f)
    Protected Green, Blue
    
    Green = Color >> 8 & $FF
    Blue = Color >> 16 & $FF
    Green * Level
    Blue * Level
    
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (Color & $FF0000FF | Green << 8 | Blue << 16)
  EndProcedure
  
  Procedure.l MagentaIntensity(Color, Level.f)
    Protected Red, Blue
    
    Red = Color & $FF
    Blue = Color >> 16 & $FF
    Red * Level
    Blue * Level
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (Color & $FF00FF00 | Red | Blue << 16)
  EndProcedure
  
  Procedure.l Tint(Color.l, Scale.f) ; Changer la teinte d'une Couleur (Scale comprise entre -1 et 1)
    
    Red.l = (Color & $FF)
    Green.l = (Color >> 8 & $FF)
    Blue.l = (Color >> 16 & $FF)
    
    If Scale > 0
      Red = Red * (1 - Scale) + Blue * Scale
      Green = Green * (1 - Scale) + Red * Scale
      Blue = Blue * (1 - Scale) + Green * Scale
    Else
      Red = Red * (1 + Scale) - Green * Scale
      Green = Green * (1 + Scale) - Blue * Scale
      Blue = Blue * (1 + Scale) - Red * Scale
    EndIf
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l Blending(Color1.l, Color2.l, Scale.f) ; Mélanger 2 couleurs
    
    Red.l = Color1 & $FF
    Green.l = Color1 >> 8 & $FF
    Blue.l = Color1 >> 16 & $FF
    Red2.l = Color2 & $FF
    Green2.l = Color2 >> 8 & $FF
    Blue2.l = Color2 >> 16 & $FF
    
    Red = Red * Scale + Red2 * (1 - Scale)
    Green = Green * Scale + Green2 * (1 - Scale)
    Blue = Blue * Scale + Blue2 * (1 - Scale)
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
  EndProcedure
  
  Procedure.l Add(Color1.l, Color2.l) ; Ajouter 2 couleurs
    
    Protected Red, Green, Blue, Alpha
    
    Red = Color1 & $FF + Color2 & $FF
    Green = Color1 >> 8 & $FF + Color2 >> 8 & $FF
    Blue = Color1 >> 16 & $FF + Color2 >> 16 & $FF
    Alpha = Color1 >> 24
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
  EndProcedure
  
  Procedure.l Level(Color, Minimum, Maximum) ; Changer les niveaux de blanc et de noir de la couleur
    
    Protected Red, Green, Blue, Alpha, a.f, b.f
    
    a = 255 / (Maximum - Minimum)
    b = -a * Minimum
    
    Red = Color & $FF
    Green = Color >> 8 & $FF
    Blue = Color >> 16 & $FF
    Alpha = Color >> 24
    Red * a + b
    Green * a + b
    Blue * a + b
    
    ColorLimit(Red, 0, 255)
    ColorLimit(Green, 0, 255)
    ColorLimit(Blue, 0, 255)
    
    ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
  EndProcedure
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  Enumeration
    
    #Frame_Luminosity
    #Frame_Contrast
    #Frame_Grey
    #Frame_RedIntensity
    #Frame_GreenIntensity
    #Frame_BlueIntensity
    #Frame_Tint
    #Frame_Blending
    #Frame_Add
    
  EndEnumeration
  
  Macro GadgetDown(GadgetID, Gap = 0)
    
    (GadgetY(GadgetID) + GadgetHeight(GadgetID) + (Gap))
    
  EndMacro
  
  If OpenWindow(0, 0, 0, 320, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ;- Eclaicir et foncer une couleur
    FrameGadget(#Frame_Luminosity, 5, 5, 310, 55, "Color Luminosity", #PB_Text_Center)
    
    Couleur = RGB(40, 177, 40) ; Couleur de base
    Image = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::Luminosity(Couleur, 1.2)) ; On eclaircie la couleur
    Box(200, 0, 100, 25, ColorEffex::Luminosity(Couleur, 0.8)) ; On fonce la couleur
                                                               ; ColorLuminosity(Couleur, Echelle)
                                                               ; Echelle = 0 à infini
                                                               ; 0 donne une couleur noire
                                                               ; 1 donne la même couleur
                                                               ; inifini donne du blanc
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "thinning")
    DrawText(205, 2, "darkened")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 30, 300, 25, ImageID(Image)) ; On affiche l'image
    
    ;- Changer le contraste d'une couleur
    FrameGadget(#Frame_Contrast, 5, GadgetDown(#Frame_Luminosity, 5), 310, 55, "Color Contrast", #PB_Text_Center)
    
    Couleur = RGB(144, 153, 255) ; Couleur de base
    Image2 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image2))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::Contrast(Couleur, 2)) ; On augmente le contraste de la couleur
    Box(200, 0, 100, 25, ColorEffex::Contrast(Couleur, 0.3)) ; On diminue le contraste de la couleur
                                                             ; ColorContrast(Couleur, Echelle)
                                                             ; Echelle = 0 à infini
                                                             ; 0 donne une couleur grise RGB(127, 127, 127) (contraste minimum)
                                                             ; 1 donne la même couleur
                                                             ; inifini donne le contraste maximum
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Increased") 
    DrawText(205, 2, "Decreased")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 90, 300, 25, ImageID(Image2)) ; On affiche l'image
    
    FrameGadget(#Frame_Grey, 5, GadgetDown(#Frame_Contrast, 5), 310, 55, "Color into shade of grey")
    
    Couleur = RGB(100, 200, 255) ; Couleur de base
    Image3 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image3))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 200, 25, ColorEffex::Grey(Couleur)) ; On transforme la couleur en nuance de gris
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Shade of grey")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 150, 50, 25, ImageID(Image3)) ; On affiche l'image
    
    ;- Changer l'intensité de la composante Red d'une couleur
    FrameGadget(#Frame_RedIntensity,5, GadgetDown(#Frame_Grey, 5), 310, 55, "Change red component")
    
    Couleur = RGB(170, 153, 255) ; Couleur de base
    Image4 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image4))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::RedIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Red
    Box(200, 0, 100, 25, ColorEffex::RedIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Red
                                                                 ; ColorRedIntensity(Couleur, Echelle)
                                                                 ; Echelle = 0 à infini
                                                                 ; 0 donne la composante Red égale à 0
                                                                 ; 1 donne la même couleur
                                                                 ; inifini donne la composante Red égale à 255
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Increased") 
    DrawText(205, 2, "Decreased")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 210, 50, 25, ImageID(Image4)) ; On affiche l'image
                                                           ;   
                                                           ;- Changer l'intensité de la composante Greene d'une couleur
    FrameGadget(#Frame_GreenIntensity, 5, GadgetDown(#Frame_RedIntensity, 5), 310, 55, "Change green component")
    
    Couleur = RGB(170, 153, 200) ; Couleur de base
    Image5 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image5))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::GreenIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Greene
    Box(200, 0, 100, 25, ColorEffex::GreenIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Greene
                                                                   ; ColorGreenIntensity(Couleur, Echelle)
                                                                   ; Echelle = 0 à infini
                                                                   ; 0 donne la composante Greene égale à 0
                                                                   ; 1 donne la même couleur
                                                                   ; inifini donne la composante Greene égale à 255
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Increased") 
    DrawText(205, 2, "Decreased")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 270, 50, 25, ImageID(Image5)) ; On affiche l'image
    
    ;- Changer l'intensité de la composante Blue d'une couleur
    FrameGadget(#Frame_BlueIntensity, 5, GadgetDown(#Frame_GreenIntensity, 5), 310, 55, "Change Blue component")
    
    Couleur = RGB(170, 153, 150) ; Couleur de base
    Image6 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image6))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::BlueIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Blue
    Box(200, 0, 100, 25, ColorEffex::BlueIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Blue
                                                                  ; ColorBlueIntensity(Couleur, Echelle)
                                                                  ; Echelle = 0 à infini
                                                                  ; 0 donne la composante Blue égale à 0
                                                                  ; 1 donne la même couleur
                                                                  ; inifini donne la composante Blue égale à 255
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Increased") 
    DrawText(205, 2, "Decreased")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 330, 50, 25, ImageID(Image6)) ; On affiche l'image
    
    ;- Changer la teinte d'une couleur 
    FrameGadget(#Frame_Tint, 5, GadgetDown(#Frame_BlueIntensity, 5), 310, 55, "Change color tint")
    
    Couleur = RGB(120, 255, 80) ; Couleur de base
    Image7 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image7))
    Box(0, 0, 100, 25, Couleur)
    Box(100, 0, 100, 25, ColorEffex::Tint(Couleur, 0.2)) ; On augmente la teinte de la couleur
    Box(200, 0, 100, 25, ColorEffex::Tint(Couleur, -0.2)); On diminue la teinte de la couleur
                                                         ; ColorTint(Couleur, Echelle)
                                                         ; Echelle = -1 à 1
                                                         ; -1 donne la couleur RGB(Blue(Couleur), Red(Couleur), Green(Couleur))
                                                         ; 0 donne la même couleur
                                                         ; 1 donne la couleur RGB(Green(Couleur), Blue(Couleur), Red(Couleur))
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(105, 2, "Increased") 
    DrawText(205, 2, "Decreased")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 390, 50, 25, ImageID(Image7)) ; On affiche l'image
    
    FrameGadget(#Frame_Blending, 5, GadgetDown(#Frame_Tint, 5), 310, 55, "Colors Blending")
    
    Couleur1 = RGB(255, 0, 0) ; Couleur de base 1
    Couleur2 = RGB(0, 255, 0) ; Couleur de base 2
    Image8 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image8))
    Box(0, 0, 100, 25, Couleur1)
    Box(100, 0, 100, 25, Couleur2) ; On augmente la teinte de la couleur
    Box(200, 0, 100, 25, ColorEffex::Blending(Couleur1, Couleur2, 0.5)) ; On mélange les couleurs
                                                                        ; ColorBlending(Couleur1.l, Couleur2.l, Echelle.f)
                                                                        ; Echelle = 0 à 1
                                                                        ; L'échelle représentage le pourcentage de la couleur 1 dans le mélange
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(5, 2, "Color #1")
    DrawText(105, 2, "Color #2")
    DrawText(205, 2, "Blend")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 450, 50, 25, ImageID(Image8)) ; On affiche l'image
    
    FrameGadget(#Frame_Add, 5, GadgetDown(#Frame_Blending, 5), 310, 55, "Colors Adding")
    
    Couleur1 = RGB(255, 0, 0) ; Couleur de base 1
    Couleur2 = RGB(0, 255, 0) ; Couleur de base 2
    Image9 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
    StartDrawing(ImageOutput(Image9))
    Box(0, 0, 100, 25, Couleur1)
    Box(100, 0, 100, 25, Couleur2) ; On augmente la teinte de la couleur
    Box(200, 0, 100, 25, ColorEffex::Add(Couleur1, Couleur2)) ; On ajoute les couleurs
    
    DrawingMode(1)
    FrontColor(0)
    DrawText(5, 2, "Color #1")
    DrawText(105, 2, "Color #2")
    DrawText(205, 2, "Added")
    
    StopDrawing()
    ImageGadget(#PB_Any, 10, 510, 50, 25, ImageID(Image9)) ; On affiche l'image
    
    Repeat
      Event = WaitWindowEvent()
      
    Until Event = #PB_Event_CloseWindow
    
  EndIf 
  
CompilerEndIf

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: ColorEffex - Module

Posted: Thu Jan 21, 2016 5:42 am
by collectordave
Any chance of a small demonstration programme?

Cheers :D

Re: ColorEffex - Module

Posted: Thu Jan 21, 2016 10:08 pm
by StarBootics
collectordave wrote:Any chance of a small demonstration programme?

Cheers :D
It's done see the previous code

Best regards
StarBootics

Re: ColorEffex - Module

Posted: Fri Jan 22, 2016 5:26 am
by collectordave
Thanks

Re: ColorEffex - Module

Posted: Mon Feb 01, 2016 12:03 am
by Andre
Good! Seems like it have a lot of potential to easily get nice coloring effects.

More examples about using/combining the available functions would be nice... :D

Re: ColorEffex - Module

Posted: Tue Feb 02, 2016 4:01 pm
by StarBootics
Hello everyone,

This is a new version with a better demonstration program. See the first post !

Best regards
StarBootics