GLBasic forum

Codesnippets => Code Snippets => Topic started by: Quentin on 2007-Dec-31

Title: Farbverläufe
Post by: Quentin on 2007-Dec-31
Grundlage ist ein PureBasic-Listing von http://www.purearea.net/pb/CodeArchiv/Graphics/Image/GradientImage.pb

Code (glbasic) Select
// --------------------------------- //
// Project: Farbverlauf
// Start: Monday, December 31, 2007
// IDE Version: 5.110



color1 = RGB(255, 0, 10)
color2 = RGB(60, 255, 255)

WHILE TRUE
  Farbverlauf(100, 0, 500, 200, color1, color2, 0)
  Farbverlauf(100, 220, 500, 450, color2, color1, 1)
  SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// ---  FARBVERLAUF  ---
// x1, y1, x2, y2    --- Koordinaten des Rechteckes für den
//                       Farbverlauf
// co1, col2         --- Farben für den Farbverlauf (von .. bis)
// direction         --- 0 = horizontaler Verlauf
//                       <> 0 = vertikaler Verlauf
// ------------------------------------------------------------- //
FUNCTION Farbverlauf: x1, y1, x2, y2, col1, col2, direction

  LOCAL i
  LOCAL cr1, cg1, cb1
  LOCAL cr2, cg2, cb2
  LOCAL dr, dg, db
  LOCAL red, green, blue
  LOCAL count

  SplitColor(col1, cr1, cg1, cb1)
  SplitColor(col2, cr2, cg2, cb2)

  IF direction = 0
    count = x2 - x1 + 1
  ELSE
    count = y2 - y1 + 1
  ENDIF
 
  dr = (cr1 - cr2) / count
  dg = (cg1 - cg2) / count
  db = (cb1 - cb2) / count

  FOR i = 0 TO count
    red = cr1 - i * dr
    green = cg1 - i * dg
    blue = cb1 - i * db
    IF direction = 0
      DRAWLINE x1 + i, y1, x1 + i, y2, RGB(red, green, blue)
    ELSE
      DRAWLINE x1, y1 + i, x2, y1 + i, RGB(red, green, blue)
    ENDIF
  NEXT

ENDFUNCTION // FARBVERLAUF


// ------------------------------------------------------------- //
// ---  SPLITCOLOR  ---
// ------------------------------------------------------------- //
FUNCTION SplitColor: color, BYREF red, BYREF green, BYREF blue

  red = bAND(color, 255)
  green = bAND(color / 256, 255)
  blue = bAND(color / POW(256, 2), 255)

ENDFUNCTION // SPLITCOLOR
Title: Farbverläufe
Post by: Schranz0r on 2007-Dec-31
Was haste den vor?


EDIT:

ohhh jetzt seh ich es ein Farbverlauf :D

werd ich mal antesten!


EDIT2:

Coole sache!
Title: Farbverläufe
Post by: Quentin on 2007-Dec-31
jau, naja vielleicht auch nicht wirklich sinnvoll, aber so sinnarme Spielereien machen mir zur Zeit Spaß ;)

mit Verwendung von ALPHAMODE kann man so auch die Farbverläufe auf angezeigte Grafiken übertragen

Code (glbasic) Select
// --------------------------------- //
// Project: Farbverlauf
// Start: Monday, December 31, 2007
// IDE Version: 5.110


FOR i = 0 TO 19
  DRAWRECT i * 5, i * 5, 200 - i * 10, 200 - i * 10, RGB(RND(255), RND(255), RND(255))
NEXT
GRABSPRITE 0, 0, 0, 200, 200
color1 = RGB(255, 0, 10)
color2 = RGB(60, 255, 255)
alpha = 0
addi = 0.01
alpha = 0

WHILE TRUE
  INC alpha, addi
  IF alpha > 1 OR alpha < 0 THEN addi = -addi
  DRAWSPRITE 0, 300, 0
  Farbverlauf(100, 0, 500, 200, color1, color2, 0, alpha)
  Farbverlauf(100, 220, 500, 450, color2, color1, 1, alpha)
  SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// ---  FARBVERLAUF  ---
// x1, y1, x2, y2    --- Koordinaten des Rechteckes für den
//                       Farbverlauf
// co1, col2         --- Farben für den Farbverlauf (von .. bis)
// direction         --- 0 = horizontaler Verlauf
//                       <> 0 = vertikaler Verlauf
// alpha             --- Alphamode für Einfärbeffekte
// ------------------------------------------------------------- //
FUNCTION Farbverlauf: x1, y1, x2, y2, col1, col2, direction, alpha

  LOCAL width, i
  LOCAL cr1, cg1, cb1
  LOCAL cr2, cg2, cb2
  LOCAL dr, dg, db
  LOCAL red, green, blue
  LOCAL count

  SplitColor(col1, cr1, cg1, cb1)
  SplitColor(col2, cr2, cg2, cb2)

  IF direction = 0
    count = x2 - x1 + 1
  ELSE
    count = y2 - y1 + 1
  ENDIF

  dr = (cr1 - cr2) / count
  dg = (cg1 - cg2) / count
  db = (cb1 - cb2) / count

  FOR i = 0 TO count
    red = cr1 - i * dr
    green = cg1 - i * dg
    blue = cb1 - i * db
    IF direction = 0
      ALPHAMODE alpha
      DRAWLINE x1 + i, y1, x1 + i, y2, RGB(red, green, blue)
    ELSE
      ALPHAMODE alpha
      DRAWLINE x1, y1 + i, x2, y1 + i, RGB(red, green, blue)
    ENDIF
  NEXT

ENDFUNCTION // FARBVERLAUF


// ------------------------------------------------------------- //
// ---  SPLITCOLOR  ---
// ------------------------------------------------------------- //
FUNCTION SplitColor: color, BYREF red, BYREF green, BYREF blue

  red = bAND(color, 255)
  green = bAND(color / 256, 255)
  blue = bAND(color / POW(256, 2), 255)

ENDFUNCTION // SPLITCOLOR
Title: Farbverläufe
Post by: Kitty Hello on 2008-Jan-01
Unter Win32 macht man Farbverläufe besser mit POLYVECTOR.
Title: Farbverläufe
Post by: Schranz0r on 2008-Jan-01
ist die einfachste Lösung ja, aber nicht so schön verspielt ^^
Title: Farbverläufe
Post by: Quentin on 2008-Jan-01
stimmt, das mit POLYVECTOR ist mir nachher auch noch eingefallen, habs nur noch nicht hinbekommen ;)
Title: Farbverläufe
Post by: S.O.P.M. on 2008-Jan-02
Au ja, das ist traumhaft mit den Farbverläufen bei POLYVECTOR. Vor allem, weil sich wirklich jede Ecke anders einfärben lässt und dann alles perfekt ineinander fließt. Das muss intern ein toller Algorithmus sein!