Неплохо для нулевой версии. Вообще, для построения графиков и всяких моделей использую Octave (пытающийся быть аналогом Matlab).

Платформо-зависимые части нужно выность за пределы реализации интерфейса:
## Код:
```
MODULE DiaHost;
   
   IMPORT WinApi, HostFonts, HostPorts, Ports, Fonts, Views;

   PROCEDURE DrawStringA* (f: Views.Frame; x, y, angle: INTEGER; col: Ports.Color; s: ARRAY OF CHAR; font: Fonts.Font);
      VAR n, a, res: INTEGER; df: HostFonts.DevFont; pt: HostPorts.Port;
         dc: WinApi.HANDLE; ind: WinApi.BOOL; NewFont: WinApi.HFONT;
         fsize: WinApi.SIZE;
   BEGIN
      pt := f.rider(HostPorts.Rider).port;
      dc := pt.dc;
      res := WinApi.SaveDC(dc);
      res := WinApi.SetBkMode(dc, WinApi.TRANSPARENT);
      res := WinApi.SetTextColor(dc, col);
      (* Вычисляем длину строки *)
      a := LEN(s) - 1; n := 0;
      WHILE (n < a) & (s[n] # 0X) DO
         INC(n)
      END;
      IF angle MOD 360 = 0 THEN
         (* Если угол поворота кратен 360, то использовать обычный шрифт *)
         df := font(HostFonts.Font).dev;
         res := WinApi.SelectObject(dc, df.id);
         res := WinApi.TextOutW(dc, x, y, s, n);
         res := WinApi.RestoreDC(dc, - 1)
      ELSE
         (* Иначе, создать новый шрифт *)
         NewFont := WinApi.CreateFontW( - ((font.size + pt.unit DIV 2) DIV pt.unit), 0, angle * 10, angle * 10, Fonts.normal, 0, 0, 0, 0, 7, 2, 1, 38, font.typeface);
         (* Вычислить ширину строки
         ind := WinApi.GetTextExtentPoint32W(dc, s, n, fsize); *)
         (* Выбрать шрифт *)
         res := WinApi.SelectObject(dc, NewFont);
         (* Вывести текст *)
         res := WinApi.TextOutW(dc, x, y, s, n);
         res := WinApi.RestoreDC(dc, - 1);
         (* Удалить шрифт *)
         ind := WinApi.DeleteObject(NewFont);
      END
   END DrawStringA;
   
END DiaHost.
```


В последствие такие модули будет легче заменять платформо-независимыми компонентами.