X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_gui.pas;h=00fb568b7511e2e74ae01315f3b054acde145321;hb=refs%2Fheads%2Frenders;hp=039af7597385388d892d44dafce23fb4d086d468;hpb=57eea56cadbee2ab1e505f50144d1e1671deaa30;p=d2df-sdl.git diff --git a/src/game/opengl/r_gui.pas b/src/game/opengl/r_gui.pas index 039af75..00fb568 100644 --- a/src/game/opengl/r_gui.pas +++ b/src/game/opengl/r_gui.pas @@ -23,7 +23,10 @@ interface procedure r_GUI_Free; procedure r_GUI_GetSize (ctrl: TGUIControl; out w, h: Integer); - procedure r_GUI_GetLogoSize (out w, h: WORD); + procedure r_GUI_GetLogoSize (out w, h: Integer); + procedure r_GUI_GetMaxFontSize (BigFont: Boolean; out w, h: Integer); + procedure r_GUI_GetStringSize (BigFont: Boolean; str: String; out w, h: Integer); + procedure r_GUI_Draw_Window (win: TGUIWindow); implementation @@ -47,6 +50,40 @@ implementation BOX8 = 'BOX8'; BOX9 = 'BOX9'; + MAINMENU_MARKER1 = 'MAINMENU_MARKER1'; + MAINMENU_MARKER2 = 'MAINMENU_MARKER2'; + SCROLL_LEFT = 'SCROLL_LEFT'; + SCROLL_RIGHT = 'SCROLL_RIGHT'; + SCROLL_MIDDLE = 'SCROLL_MIDDLE'; + SCROLL_MARKER = 'SCROLL_MARKER'; + EDIT_LEFT = 'EDIT_LEFT'; + EDIT_RIGHT = 'EDIT_RIGHT'; + EDIT_MIDDLE = 'EDIT_MIDDLE'; + EDIT_CURSORCOLOR: TRGB = (R:200; G:0; B:0); + EDIT_CURSORLEN = 10; + BSCROLL_UPA = 'BSCROLL_UP_A'; + BSCROLL_UPU = 'BSCROLL_UP_U'; + BSCROLL_DOWNA = 'BSCROLL_DOWN_A'; + BSCROLL_DOWNU = 'BSCROLL_DOWN_U'; + BSCROLL_MIDDLE = 'BSCROLL_MIDDLE'; + + type + TFontType = (Texture, Character); + + TFont = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} + private + FID: DWORD; + FScale: Single; + FFontType: TFontType; + public + constructor Create(FontID: DWORD; FontType: TFontType); + destructor Destroy; override; + procedure Draw(X, Y: Integer; Text: string; R, G, B: Byte); + procedure GetTextSize(Text: string; var w, h: Word); + property Scale: Single read FScale write FScale; + property ID: DWORD read FID; + end; + var Box: Array [0..8] of DWORD; MarkerID: array [Boolean] of DWORD; @@ -56,12 +93,66 @@ implementation Font: array [boolean] of TFont; (* Small[FALSE] / Big[TRUE] *) LogoTex: DWORD; - procedure r_GUI_GetLogoSize (out w, h: WORD); + constructor TFont.Create (FontID: DWORD; FontType: TFontType); begin - w := 0; - h := 0; + FID := FontID; + FScale := 1; + FFontType := FontType; + end; + + destructor TFont.Destroy; + begin + inherited; + end; + + procedure TFont.Draw (X, Y: Integer; Text: string; R, G, B: Byte); + begin + if FFontType = TFontType.Character then + e_CharFont_PrintEx(ID, X, Y, Text, _RGB(R, G, B), FScale) + else + e_TextureFontPrintEx(X, Y, Text, ID, R, G, B, FScale) + end; + + procedure TFont.GetTextSize (Text: string; var w, h: Word); + var cw, ch: Byte; + begin + if FFontType = TFontType.Character then + e_CharFont_GetSize(ID, Text, w, h) + else + begin + e_TextureFontGetSize(ID, cw, ch); + w := cw * Length(Text); + h := ch; + end; + w := Round(w * FScale); + h := Round(h * FScale); + end; + + procedure r_GUI_GetMaxFontSize (BigFont: Boolean; out w, h: Integer); + var f: TFont; + begin + f := Font[BigFont]; + w := e_CharFont_GetMaxWidth(f.ID); + h := e_CharFont_GetMaxHeight(f.ID); + end; + + procedure r_GUI_GetStringSize (BigFont: Boolean; str: String; out w, h: Integer); + var ww, hh: WORD; + begin + e_CharFont_GetSize(Font[BigFont].ID, str, ww, hh); + w := ww; + h := hh; + end; + + procedure r_GUI_GetLogoSize (out w, h: Integer); + var ww, hh: WORD; + begin + ww := 0; + hh := 0; if LogoTex <> 0 then - e_GetTextureSize(LogoTex, @w, @h); + e_GetTextureSize(LogoTex, @ww, @hh); + w := ww; + h := hh; end; procedure r_GUI_Load; @@ -150,26 +241,28 @@ implementation end; procedure r_GUI_GetSize_TextButton (ctrl: TGUITextButton; out w, h: Integer); - var ww, hh: WORD; + var ww, hh: WORD; f: TFont; begin - ctrl.Font.GetTextSize(ctrl.Caption, ww, hh); + f := Font[ctrl.BigFont]; + f.GetTextSize(ctrl.Caption, ww, hh); w := ww; h := hh; end; procedure r_GUI_GetSize_Label (ctrl: TGUILabel; out w, h: Integer); - var ww, hh: WORD; + var ww, hh: WORD; f: TFont; begin - ctrl.Font.GetTextSize(ctrl.Text, ww, hh); + f := Font[ctrl.BigFont]; + f.GetTextSize(ctrl.Text, ww, hh); h := hh; if ctrl.FixedLength = 0 then w := ww else - w := e_CharFont_GetMaxWidth(ctrl.Font.ID) * ctrl.FixedLength + w := e_CharFont_GetMaxWidth(f.ID) * ctrl.FixedLength end; procedure r_GUI_GetSize_Switch (ctrl: TGUISwitch; out w, h: Integer); - var i: Integer; ww, hh: WORD; + var i: Integer; ww, hh: WORD; f: TFont; begin w := 0; h := 0; @@ -177,7 +270,8 @@ implementation begin for i := 0 to High(ctrl.Items) do begin - ctrl.Font.GetTextSize(ctrl.Items[i], ww, hh); + f := Font[ctrl.BigFont]; + f.GetTextSize(ctrl.Items[i], ww, hh); if ww > w then w := ww; end; @@ -185,18 +279,19 @@ implementation end; procedure r_GUI_GetSize_KeyRead (ctrl: TGUIKeyRead; out w, h: Integer); - var i: Integer; ww, hh: WORD; + var i: Integer; ww, hh: WORD; f: TFont; begin w := 0; h := 0; // ??? always 0 + f := Font[ctrl.BigFont]; for i := 0 to 255 do begin - ctrl.Font.GetTextSize(e_KeyNames[i], ww, hh); + f.GetTextSize(e_KeyNames[i], ww, hh); w := MAX(w, ww); end; - ctrl.Font.GetTextSize(KEYREAD_QUERY, ww, hh); + f.GetTextSize(KEYREAD_QUERY, ww, hh); if ww > w then w := ww; - ctrl.Font.GetTextSize(KEYREAD_CLEAR, ww, hh); + f.GetTextSize(KEYREAD_CLEAR, ww, hh); if ww > w then w := ww; end; @@ -238,20 +333,23 @@ implementation procedure r_GUI_Draw_Control (ctrl: TGUIControl); forward; procedure r_GUI_Draw_TextButton (ctrl: TGUITextButton); + var f: TFont; begin - ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Caption, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B) + f := Font[ctrl.BigFont]; + f.Draw(ctrl.X, ctrl.Y, ctrl.Caption, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B) end; procedure r_GUI_Draw_Label (ctrl: TGUILabel); - var w, h: Word; + var w, h: Word; f: TFont; begin + f := Font[ctrl.BigFont]; if ctrl.RightAlign then begin - ctrl.Font.GetTextSize(ctrl.Text, w, h); - ctrl.Font.Draw(ctrl.X + ctrl.CMaxWidth - w, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); + f.GetTextSize(ctrl.Text, w, h); + f.Draw(ctrl.X + ctrl.CMaxWidth - w, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); end else - ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); + f.Draw(ctrl.X, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); end; procedure r_GUI_Draw_Scroll (ctrl: TGUIScroll); @@ -265,12 +363,14 @@ implementation end; procedure r_GUI_Draw_Switch (ctrl: TGUISwitch); + var f: TFont; begin - ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Items[ctrl.ItemIndex], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); + f := Font[ctrl.BigFont]; + f.Draw(ctrl.X, ctrl.Y, ctrl.Items[ctrl.ItemIndex], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); end; procedure r_GUI_Draw_Edit (ctrl: TGUIEdit); - var c, w, h: Word; r, g, b: Byte; + var c, w, h: Word; r, g, b: Byte; f: TFont; begin e_Draw(EditLeft, ctrl.X, ctrl.Y, 0, True, False); e_Draw(EditRight, ctrl.X + 8 + ctrl.Width * 16, ctrl.Y, 0, True, False); @@ -285,17 +385,18 @@ implementation g := 128; b := 128; end; - ctrl.Font.Draw(ctrl.X + 8, ctrl.Y, ctrl.Text, r, g, b); + f := Font[ctrl.BigFont]; + f.Draw(ctrl.X + 8, ctrl.Y, ctrl.Text, r, g, b); if ctrl.Window.ActiveControl = ctrl then begin - ctrl.Font.GetTextSize(Copy(ctrl.Text, 1, ctrl.CaretPos), w, h); - h := e_CharFont_GetMaxHeight(ctrl.Font.ID); + f.GetTextSize(Copy(ctrl.Text, 1, ctrl.CaretPos), w, h); + h := e_CharFont_GetMaxHeight(f.ID); e_DrawLine(2, ctrl.X + 8 + w, ctrl.Y + h - 3, ctrl.X + 8 + w + EDIT_CURSORLEN, ctrl.Y + h - 3, EDIT_CURSORCOLOR.R, EDIT_CURSORCOLOR.G, EDIT_CURSORCOLOR.B); end; end; procedure r_GUI_Draw_KeyRead (ctrl: TGUIKeyRead); - var k: AnsiString; + var k: AnsiString; f: TFont; begin if ctrl.IsQuery then k := KEYREAD_QUERY @@ -303,13 +404,14 @@ implementation k := e_KeyNames[ctrl.Key] else k := KEYREAD_CLEAR; - ctrl.Font.Draw(ctrl.X, ctrl.Y, k, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); + f := Font[ctrl.BigFont]; + f.Draw(ctrl.X, ctrl.Y, k, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); end; procedure r_GUI_Draw_KeyRead2 (ctrl: TGUIKeyRead2); procedure drawText (idx: Integer); - var x, y: Integer; r, g, b: Byte; kk: DWORD; str: AnsiString; + var x, y: Integer; r, g, b: Byte; kk: DWORD; str: AnsiString; f: TFont; begin if idx = 0 then kk := ctrl.Key0 else kk := ctrl.Key1; y := ctrl.Y; @@ -321,9 +423,10 @@ implementation begin r := 255; g := 255; b := 255; end; + f := Font[ctrl.BigFont]; if ctrl.IsQuery and (ctrl.KeyIdx = idx) then begin - ctrl.Font.Draw(x, y, KEYREAD_QUERY, r, g, b) + f.Draw(x, y, KEYREAD_QUERY, r, g, b) end else begin @@ -331,7 +434,7 @@ implementation str := e_KeyNames[kk] else str := KEYREAD_CLEAR; - ctrl.Font.Draw(x, y, str, r, g, b); + f.Draw(x, y, str, r, g, b); end end; @@ -418,8 +521,12 @@ implementation end else begin - if g_Texture_Get(ctrl.ImageRes, ID) then - e_Draw(ID, ctrl.X, ctrl.Y, 0, True, False); + if g_Texture_CreateWADEx(ctrl.ImageRes, ctrl.ImageRes) then + begin + if g_Texture_Get(ctrl.ImageRes, ID) then + e_Draw(ID, ctrl.X, ctrl.Y, 0, True, False); + g_Texture_Delete(ctrl.ImageRes); + end; end; end; @@ -443,7 +550,7 @@ implementation end; procedure r_GUI_Draw_ListBox (ctrl: TGUIListBox); // + TGUIFileListBox - var w2, h2: Word; a: Integer; s: string; + var w2, h2: Word; a: Integer; s: string; f: TFont; begin if ctrl.DrawBack then DrawBox(ctrl.X, ctrl.Y, ctrl.Width + 1, ctrl.Height); @@ -451,33 +558,35 @@ implementation DrawScroll(ctrl.X + 4 + ctrl.Width * 16, ctrl.Y + 4, ctrl.Height, (ctrl.StartLine > 0) and (ctrl.Items <> nil), (ctrl.StartLine + ctrl.Height - 1 < High(ctrl.Items)) and (ctrl.Items <> nil)); if ctrl.Items <> nil then begin + f := Font[ctrl.BigFont]; for a := ctrl.StartLine to Min(High(ctrl.Items), ctrl.StartLine + ctrl.Height - 1) do begin s := ctrl.Items[a]; - ctrl.Font.GetTextSize(s, w2, h2); + f.GetTextSize(s, w2, h2); while (Length(s) > 0) and (w2 > ctrl.Width * 16) do begin SetLength(s, Length(s) - 1); - ctrl.Font.GetTextSize(s, w2, h2); + f.GetTextSize(s, w2, h2); end; if a = ctrl.ItemIndex then - ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.ActiveColor.R, ctrl.ActiveColor.G, ctrl.ActiveColor.B) + f.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.ActiveColor.R, ctrl.ActiveColor.G, ctrl.ActiveColor.B) else - ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.UnActiveColor.R, ctrl.UnActiveColor.G, ctrl.UnActiveColor.B); + f.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.UnActiveColor.R, ctrl.UnActiveColor.G, ctrl.UnActiveColor.B); end; end; end; procedure r_GUI_Draw_Memo (ctrl: TGUIMemo); - var a: Integer; + var a: Integer; f: TFont; begin + f := Font[ctrl.BigFont]; if ctrl.DrawBack then DrawBox(ctrl.X, ctrl.Y, ctrl.Width + 1, ctrl.Height); if ctrl.DrawScrollBar then DrawScroll(ctrl.X + 4 + ctrl.Width * 16, ctrl.Y + 4, ctrl.Height, (ctrl.StartLine > 0) and (ctrl.Lines <> nil), (ctrl.StartLine + ctrl.Height - 1 < High(ctrl.Lines)) and (ctrl.Lines <> nil)); if ctrl.Lines <> nil then for a := ctrl.StartLine to Min(High(ctrl.Lines), ctrl.StartLine + ctrl.Height - 1) do - ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, ctrl.Lines[a], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); + f.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, ctrl.Lines[a], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B); end; procedure r_GUI_Draw_MainMenu (ctrl: TGUIMainMenu); @@ -506,7 +615,7 @@ implementation end; procedure r_GUI_Draw_Menu (ctrl: TGUIMenu); - var a, locx, locy: Integer; + var a, locx, locy: Integer; f: TFont; begin if ctrl.Header <> nil then r_GUI_Draw_Label(ctrl.Header); @@ -539,8 +648,9 @@ implementation locx := ctrl.Items[ctrl.Index].Control.X; locy := ctrl.Items[ctrl.Index].Control.Y; end; - locx := locx - e_CharFont_GetMaxWidth(ctrl.FontID); - e_CharFont_PrintEx(ctrl.FontID, locx, locy, #16, _RGB(255, 0, 0)); + f := Font[ctrl.BigFont]; + locx := locx - e_CharFont_GetMaxWidth(f.ID); + e_CharFont_PrintEx(f.ID, locx, locy, #16, _RGB(255, 0, 0)); end; end;