  type, extends(tPetscObject) ::  tPetscDraw
  end type tPetscDraw
  PetscDraw, parameter :: PETSC_NULL_DRAW = tPetscDraw(0)
  PetscDraw, target :: PETSC_NULL_DRAW_ARRAY(1) = [tPetscDraw(0)]
  PetscDraw, pointer :: PETSC_NULL_DRAW_POINTER(:) => PETSC_NULL_DRAW_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAW
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAW_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAW_POINTER
#endif

  type, extends(tPetscObject) ::  tPetscDrawAxis
  end type tPetscDrawAxis
  PetscDrawAxis, parameter :: PETSC_NULL_DRAWAXIS = tPetscDrawAxis(0)
  PetscDrawAxis, target :: PETSC_NULL_DRAWAXIS_ARRAY(1) = [tPetscDrawAxis(0)]
  PetscDrawAxis, pointer :: PETSC_NULL_DRAWAXIS_POINTER(:) => PETSC_NULL_DRAWAXIS_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWAXIS
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWAXIS_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWAXIS_POINTER
#endif

  type, extends(tPetscObject) ::  tPetscDrawLG
  end type tPetscDrawLG
  PetscDrawLG, parameter :: PETSC_NULL_DRAWLG = tPetscDrawLG(0)
  PetscDrawLG, target :: PETSC_NULL_DRAWLG_ARRAY(1) = [tPetscDrawLG(0)]
  PetscDrawLG, pointer :: PETSC_NULL_DRAWLG_POINTER(:) => PETSC_NULL_DRAWLG_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWLG
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWLG_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWLG_POINTER
#endif

  type, extends(tPetscObject) ::  tPetscDrawSP
  end type tPetscDrawSP
  PetscDrawSP, parameter :: PETSC_NULL_DRAWSP = tPetscDrawSP(0)
  PetscDrawSP, target :: PETSC_NULL_DRAWSP_ARRAY(1) = [tPetscDrawSP(0)]
  PetscDrawSP, pointer :: PETSC_NULL_DRAWSP_POINTER(:) => PETSC_NULL_DRAWSP_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWSP
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWSP_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWSP_POINTER
#endif

  type, extends(tPetscObject) ::  tPetscDrawHG
  end type tPetscDrawHG
  PetscDrawHG, parameter :: PETSC_NULL_DRAWHG = tPetscDrawHG(0)
  PetscDrawHG, target :: PETSC_NULL_DRAWHG_ARRAY(1) = [tPetscDrawHG(0)]
  PetscDrawHG, pointer :: PETSC_NULL_DRAWHG_POINTER(:) => PETSC_NULL_DRAWHG_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWHG
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWHG_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWHG_POINTER
#endif

  type, extends(tPetscObject) ::  tPetscDrawBar
  end type tPetscDrawBar
  PetscDrawBar, parameter :: PETSC_NULL_DRAWBAR = tPetscDrawBar(0)
  PetscDrawBar, target :: PETSC_NULL_DRAWBAR_ARRAY(1) = [tPetscDrawBar(0)]
  PetscDrawBar, pointer :: PETSC_NULL_DRAWBAR_POINTER(:) => PETSC_NULL_DRAWBAR_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWBAR
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWBAR_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWBAR_POINTER
#endif

  type ePetscDrawMarkerType
    PetscEnum:: v = PETSC_FORTRAN_TYPE_INITIALIZE
  end type ePetscDrawMarkerType

  PetscDrawMarkerType, parameter :: PETSC_NULL_DRAWMARKERTYPE = ePetscDrawMarkerType(-50)
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWMARKERTYPE
#endif
    PetscDrawMarkerType, parameter :: PETSC_DRAW_MARKER_CROSS = ePetscDrawMarkerType(0)
    PetscDrawMarkerType, parameter :: PETSC_DRAW_MARKER_POINT = ePetscDrawMarkerType(1)
    PetscDrawMarkerType, parameter :: PETSC_DRAW_MARKER_PLUS = ePetscDrawMarkerType(2)
    PetscDrawMarkerType, parameter :: PETSC_DRAW_MARKER_CIRCLE = ePetscDrawMarkerType(3)

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_MARKER_CROSS
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_MARKER_POINT
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_MARKER_PLUS
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_MARKER_CIRCLE
#endif

  type ePetscDrawButton
    PetscEnum:: v = PETSC_FORTRAN_TYPE_INITIALIZE
  end type ePetscDrawButton

  PetscDrawButton, parameter :: PETSC_NULL_DRAWBUTTON = ePetscDrawButton(-50)
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_DRAWBUTTON
#endif
    PetscDrawButton, parameter :: PETSC_BUTTON_NONE = ePetscDrawButton(0)
    PetscDrawButton, parameter :: PETSC_BUTTON_LEFT = ePetscDrawButton(1)
    PetscDrawButton, parameter :: PETSC_BUTTON_CENTER = ePetscDrawButton(2)
    PetscDrawButton, parameter :: PETSC_BUTTON_RIGHT = ePetscDrawButton(3)
    PetscDrawButton, parameter :: PETSC_BUTTON_WHEEL_UP = ePetscDrawButton(4)
    PetscDrawButton, parameter :: PETSC_BUTTON_WHEEL_DOWN = ePetscDrawButton(5)
    PetscDrawButton, parameter :: PETSC_BUTTON_LEFT_SHIFT = ePetscDrawButton(6)
    PetscDrawButton, parameter :: PETSC_BUTTON_CENTER_SHIFT = ePetscDrawButton(7)
    PetscDrawButton, parameter :: PETSC_BUTTON_RIGHT_SHIFT = ePetscDrawButton(8)

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_NONE
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_LEFT
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_CENTER
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_RIGHT
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_WHEEL_UP
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_WHEEL_DOWN
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_LEFT_SHIFT
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_CENTER_SHIFT
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_BUTTON_RIGHT_SHIFT
#endif

  CHARACTER(LEN=*), PARAMETER :: PETSC_DRAW_X = 'x'
  CHARACTER(LEN=*), PARAMETER :: PETSC_DRAW_NULL = 'null'
  CHARACTER(LEN=*), PARAMETER :: PETSC_DRAW_WIN32 = 'win32'
  CHARACTER(LEN=*), PARAMETER :: PETSC_DRAW_TIKZ = 'tikz'
  CHARACTER(LEN=*), PARAMETER :: PETSC_DRAW_IMAGE = 'image'

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_X
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_NULL
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_WIN32
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_TIKZ
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_DRAW_IMAGE
#endif

