Сам себе градиент


Началось это вчера - захотелось нарисовать подобный фон. Резво придумал алгоритм и ничо не получил:

Шустро нашлась заметка Using Color Gradients in Win32_SDK Programs:
Код выглядит примерно так:

If InitSprite() And OpenWindow(0,0,0,640,480,"SineWave",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  StartDrawing(ScreenOutput()) 
  
;       /* Start color; Change the R,G,B values 
;     To the color of your choice */
  r1.a = 255
  g1.a = 0
  b1.a = 0;
    
;     /* End Color; Change the R,G,B values 
;     To the color of your choice */
  r2.a = 255
  g2.a = 255
  b2.a = 0;
    
;    /* loop To create the gradient */
;    For(int i=0;i<rect.right;i++) 
    For x=0 To 639
;         /* Color ref. For the gradient */
;         int r,g,b; 
;         /* Determine the colors */
        r.a = r1 + (x * (r2-r1) / 640); 
        g.a = g1 + (x * (g2-g1) / 640);
        b.a = b1 + (x * (b2-b1) / 640);
        LineXY( x,0,x,479,RGB(r,g,b) )
   Next x
        StopDrawing() 
        FlipBuffers() 
  Repeat 
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

На основе готового кода написал следующее:

If InitSprite() And OpenWindow(0,0,0,640,480,"gradient",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  StartDrawing(ScreenOutput()) 
  
;       /* Start color; Change the R,G,B values 
;     To the color of your choice */
  r1.a = 255
  g1.a = 0
  b1.a = 0;
    
;     /* End Color; Change the R,G,B values 
;     To the color of your choice */
  r2.a = 0;255
  g2.a = 255
  b2.a = 0;
  
  ;add
  r3.a=0
  g3.a=0
  b3.a=255
  
  r4.a=255
  g4.a=255
  b4.a=255
;    /* loop To create the gradient */
;    For(int i=0;i<rect.right;i++) 
  
  For y=0 To 479
    r01=r1 + (y * (r3-r1) / 480);
    g01=g1 + (y * (g3-g1) / 480);
    b01=b1 + (y * (b3-b1) / 480);
    
    r02=r2 + (y * (r4-r2) / 480);
    g02=g2 + (y * (g4-g2) / 480);
    b02=b2 + (y * (b4-b2) / 480);
    For x=0 To 639
;         /* Color ref. For the gradient */
;         int r,g,b; 
;         /* Determine the colors */
        r.a = r01 + (x * (r02-r01) / 640); 
        g.a = g01 + (x * (g02-g01) / 640);
        b.a = b01 + (x * (b02-b01) / 640);
        Box( x,y,1,1,RGB(r,g,b) )
   Next x
   Next y
        StopDrawing() 
        FlipBuffers() 
  Repeat 
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

Все гениальное просто, а все сложное ненужно.

Комментарии