Простой пример для вывода примитива на поверхность GDI с Cairo на основе примера из справки ЧЯ:
## Код:
```
MODULE PrivCairoWin32;
(* testing GDI output of Cairo library*)

   IMPORT S := SYSTEM, WinApi, C := LibsCairo, Cwin := LibsCairoWin32;

   CONST
      iconId = 1;

   VAR
      instance: WinApi.HINSTANCE;
      mainWnd: WinApi.HWND;

   PROCEDURE DrawObject (hdc: WinApi.HDC);
      CONST pi = 3.14159265;
      VAR ctx: C.cairo_t; surface: C.cairo_surface_t;
   BEGIN
      surface := Cwin.cairo_win32_surface_create(hdc);
      ctx := C.cairo_create(surface);
      C.cairo_set_source_rgb (ctx, 0, 0, 1);
      C.cairo_arc(ctx, 500, 300, 200.0, 0.0, 2.0 * pi);
      C.cairo_stroke(ctx);
      C.cairo_destroy(ctx);
      C.cairo_surface_destroy(surface);
   END DrawObject;
   
   PROCEDURE WndHandler (wnd, msg, wParam, lParam: INTEGER): INTEGER;
      VAR res: INTEGER; ps: WinApi.PAINTSTRUCT; dc: WinApi.HDC;
   BEGIN
      IF msg = WinApi.WM_DESTROY THEN
         WinApi.PostQuitMessage(0)
      ELSIF msg = WinApi.WM_PAINT THEN
         dc := WinApi.BeginPaint(wnd, ps);
         DrawObject (dc);
         res := WinApi.EndPaint(wnd, ps)
      ELSIF msg = WinApi.WM_CHAR THEN
         res := WinApi.Beep(800, 200)
      ELSE
         RETURN WinApi.DefWindowProc(wnd, msg, wParam, lParam)
      END;
      RETURN 0
   END WndHandler;

   PROCEDURE OpenWindow;
      VAR class: WinApi.WNDCLASS; res: INTEGER;
   BEGIN
      class.hCursor := WinApi.LoadCursor(0, S.VAL(WinApi.PtrSTR,
                                                         WinApi.IDC_ARROW));
      class.hIcon := WinApi.LoadIcon(instance, S.VAL(WinApi.PtrSTR, iconId));
      class.lpszMenuName := NIL;
      class.lpszClassName := "Simple";
      class.hbrBackground := WinApi.GetStockObject(WinApi.WHITE_BRUSH);
      class.style := WinApi.CS_VREDRAW + WinApi.CS_HREDRAW
                  (* + WinApi.CS_OWNDC + WinApi.CS_PARENTDC *);
      class.hInstance := instance;
      class.lpfnWndProc := WndHandler;
      class.cbClsExtra := 0;
      class.cbWndExtra := 0;
      res := WinApi.RegisterClass(class);
      mainWnd := WinApi.CreateWindowEx({}, "Simple", "Cairo GDI output demo",
                                          WinApi.WS_OVERLAPPEDWINDOW,
                                          WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
                                          WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
                                          0, 0, instance, 0);
      res := WinApi.ShowWindow(mainWnd, WinApi.SW_SHOWDEFAULT);
      res := WinApi.UpdateWindow(mainWnd);
   END OpenWindow;

   PROCEDURE MainLoop;
      VAR msg: WinApi.MSG; res: INTEGER;
   BEGIN
      WHILE WinApi.GetMessage(msg, 0, 0, 0) # 0 DO
         res := WinApi.TranslateMessage(msg);
         res := WinApi.DispatchMessage(msg);
      END;
      WinApi.ExitProcess(msg.wParam)
   END MainLoop;

BEGIN
   instance := WinApi.GetModuleHandle(NIL);
   OpenWindow;
   MainLoop
END PrivCairoWin32.
```

DevLinker.LinkExe cairo2gdi.exe := PrivCairoWin32 ~

Вопрос про переписывание HostPorts с использованием сторонних библиотек типа Cairo лучше отделить в отдельную тему.