vidutil.pp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. unit VidUtil;
  2. {$MODE objfpc}{$H+}
  3. interface
  4. uses
  5. KbdUtil;
  6. procedure TextOut(X, Y: Integer; const S: AnsiString; TextAttr: Byte);
  7. procedure DrawKey(const Key: TKey; TextAttr: Byte);
  8. procedure DrawKeyboard(const Kbd: TKeyboard);
  9. implementation
  10. uses
  11. Video;
  12. procedure TextOut(X, Y: Integer; const S: AnsiString; TextAttr: Byte);
  13. var
  14. W, P, I, M: Integer;
  15. begin
  16. P := ((X-1)+(Y-1)*ScreenWidth);
  17. M := Length(S);
  18. if (P+M) > ScreenWidth*ScreenHeight then
  19. M := ScreenWidth*ScreenHeight-P;
  20. for I := 1 to M do
  21. VideoBuf^[P+I-1] := Ord(S[I]) + (TextAttr shl 8);
  22. end;
  23. procedure DrawKey(const Key: TKey; TextAttr: Byte);
  24. var
  25. Y: Integer;
  26. begin
  27. for Y := Key.YTop to Key.YBottom do
  28. begin
  29. if Y = Key.Y then
  30. TextOut(Key.X + 1, Y + 1, Key.KeyLabel, TextAttr)
  31. else
  32. TextOut(Key.X + 1, Y + 1, StringOfChar(' ', Length(Key.KeyLabel)), TextAttr);
  33. end;
  34. end;
  35. procedure DrawKeyboard(const Kbd: TKeyboard);
  36. var
  37. I: Integer;
  38. begin
  39. for I := Low(kbd.Keys) to High(kbd.Keys) do
  40. DrawKey(kbd.Keys[I], $70);
  41. end;
  42. end.