49 lines
1.4 KiB
Factor
49 lines
1.4 KiB
Factor
! Copyright (C) 2009 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: kernel accessors math math.vectors locals sequences
|
|
specialized-arrays colors arrays combinators alien.data
|
|
opengl opengl.gl ui.pens ui.pens.caching ;
|
|
FROM: alien.c-types => float ;
|
|
SPECIALIZED-ARRAY: float
|
|
IN: ui.pens.gradient
|
|
|
|
! Gradient pen
|
|
TUPLE: gradient < caching-pen colors last-vertices last-colors ;
|
|
|
|
: <gradient> ( colors -- gradient ) gradient new swap >>colors ;
|
|
|
|
<PRIVATE
|
|
|
|
:: gradient-vertices ( direction dim colors -- seq )
|
|
direction dim v* dim over v- swap
|
|
colors length [ iota ] [ 1 - ] bi v/n [ v*n ] with map
|
|
swap [ over v+ 2array ] curry map
|
|
concat concat float >c-array ;
|
|
|
|
: gradient-colors ( colors -- seq )
|
|
[ >rgba-components 4array dup 2array ] map concat concat
|
|
float >c-array ;
|
|
|
|
M: gradient recompute-pen ( gadget gradient -- )
|
|
[ nip ] [ [ [ orientation>> ] [ dim>> ] bi ] [ colors>> ] bi* ] 2bi
|
|
[ gradient-vertices >>last-vertices ]
|
|
[ gradient-colors >>last-colors ]
|
|
bi drop ;
|
|
|
|
: draw-gradient ( colors -- )
|
|
GL_COLOR_ARRAY [
|
|
[ GL_QUAD_STRIP 0 ] dip length 2 * glDrawArrays
|
|
] do-enabled-client-state ;
|
|
|
|
PRIVATE>
|
|
|
|
M: gradient draw-interior
|
|
{
|
|
[ compute-pen ]
|
|
[ last-vertices>> gl-vertex-pointer ]
|
|
[ last-colors>> gl-color-pointer ]
|
|
[ colors>> draw-gradient ]
|
|
} cleave ;
|
|
|
|
M: gradient pen-background 2drop transparent ;
|