X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fflexui%2Ffui_gfx_gl.pas;h=a226deee0cc7175a2a7d7ddafadae3e1229d8992;hb=92c7868df227201d6914f9f07c9a29ba0e2863cb;hp=476d74909df582c9eecd5b07672e6a646b83bbd2;hpb=7da841038d5a4e415324d4441cd397f6664e892d;p=d2df-sdl.git diff --git a/src/flexui/fui_gfx_gl.pas b/src/flexui/fui_gfx_gl.pas index 476d749..a226dee 100644 --- a/src/flexui/fui_gfx_gl.pas +++ b/src/flexui/fui_gfx_gl.pas @@ -21,8 +21,9 @@ unit fui_gfx_gl; interface uses + {$INCLUDE ../nogl/noGLuses.inc} SysUtils, Classes, - GL, GLExt, SDL2, + SDL2, sdlcarcass, fui_common, fui_events; @@ -115,6 +116,14 @@ type function combineClip (constref aclip: TGxRect): TGxRect; // returns previous clip + // vertical scrollbar + procedure drawVSBar (x, y, wdt, hgt: Integer; cur, min, max: Integer; constref clrfull, clrempty: TGxRGBA); + // horizontal scrollbar + procedure drawHSBar (x, y, wdt, hgt: Integer; cur, min, max: Integer; constref clrfull, clrempty: TGxRGBA); + + class function sbarFilled (wh: Integer; cur, min, max: Integer): Integer; + class function sbarPos (cxy: Integer; xy, wh: Integer; min, max: Integer): Integer; + public //HACK! procedure glSetScale (ascale: Single); procedure glSetTrans (ax, ay: Single); @@ -178,9 +187,9 @@ end; function isScaled (): Boolean; var - mt: packed array [0..15] of Double; + mt: packed array [0..15] of GLfloat; begin - glGetDoublev(GL_MODELVIEW_MATRIX, @mt[0]); + glGetFloatv(GL_MODELVIEW_MATRIX, @mt[0]); result := (mt[0] <> 1.0) or (mt[1*4+1] <> 1.0); end; @@ -253,7 +262,7 @@ var // set active context; `ctx` can be `nil` procedure gxSetContextInternal (ctx: TGxContext; ascale: Single; domatrix: Boolean); var - mt: packed array [0..15] of Double; + mt: packed array [0..15] of GLfloat; begin if (savedGLState.saved) then savedGLState.restore(); @@ -278,7 +287,7 @@ begin else begin // assume uniform scale - glGetDoublev(GL_MODELVIEW_MATRIX, @mt[0]); + glGetFloatv(GL_MODELVIEW_MATRIX, @mt[0]); ctx.mScaled := (mt[0] <> 1.0) or (mt[1*4+1] <> 1.0); ctx.mScale := mt[0]; oglSetup2DState(); @@ -1312,6 +1321,61 @@ begin end; +// vertical scroll bar +procedure TGxContext.drawVSBar (x, y, wdt, hgt: Integer; cur, min, max: Integer; constref clrfull, clrempty: TGxRGBA); +var + filled: Integer; +begin + if (wdt < 1) or (hgt < 1) then exit; + filled := sbarFilled(hgt, cur, min, max); + color := clrfull; + fillRect(x, y, wdt, filled); + color := clrempty; + fillRect(x, y+filled, wdt, hgt-filled); +end; + + +// horizontal scrollbar +procedure TGxContext.drawHSBar (x, y, wdt, hgt: Integer; cur, min, max: Integer; constref clrfull, clrempty: TGxRGBA); +var + filled: Integer; +begin + if (wdt < 1) or (hgt < 1) then exit; + filled := sbarFilled(wdt, cur, min, max); + color := clrfull; + fillRect(x, y, filled, hgt); + color := clrempty; + fillRect(x+filled, y, wdt-filled, hgt); +end; + + +class function TGxContext.sbarFilled (wh: Integer; cur, min, max: Integer): Integer; +begin + if (wh < 1) then result := 0 + else if (min > max) then result := 0 + else if (min = max) then result := wh + else + begin + if (cur < min) then cur := min else if (cur > max) then cur := max; + result := wh*(cur-min) div (max-min); + end; +end; + + +class function TGxContext.sbarPos (cxy: Integer; xy, wh: Integer; min, max: Integer): Integer; +begin + if (wh < 1) then begin result := 0; exit; end; + if (min > max) then begin result := 0; exit; end; + if (min = max) then begin result := max; exit; end; + if (cxy < xy) then begin result := min; exit; end; + if (cxy >= xy+wh) then begin result := max; exit; end; + result := min+((max-min)*(cxy-xy) div wh); + assert((result >= min) and (result <= max)); +end; + + + + // ////////////////////////////////////////////////////////////////////////// // (* procedure oglRestoreMode (doClear: Boolean); @@ -1347,8 +1411,8 @@ end; *) -//procedure onWinFocus (); begin end; -//procedure onWinBlur (); begin fuiResetKMState(true); end; +//procedure onWinFocus (); begin uiFocus(); end; +//procedure onWinBlur (); begin fuiResetKMState(true); uiBlur(); end; //procedure onPreRender (); begin oglRestoreMode(gGfxDoClear); end; procedure onPostRender (); begin oglDrawCursor(); end;