\pgfset{
  rectangle with rounded corners north west radius/.initial=.5\pgflinewidth,
  rectangle with rounded corners north east radius/.initial=.5\pgflinewidth,
  rectangle with rounded corners south west radius/.initial=.5\pgflinewidth,
  rectangle with rounded corners south east radius/.initial=.5\pgflinewidth,
  rectangle with rounded corners radius/.style={
    /pgf/rectangle with rounded corners north west radius={#1},
    /pgf/rectangle with rounded corners north east radius={#1},
    /pgf/rectangle with rounded corners south west radius={#1},
    /pgf/rectangle with rounded corners south east radius={#1}}
}%
\pgfdeclareshape{rectangle with rounded corners}{%
  \savedmacro\rectanglewithroundedcornersparameter{%
    %
    % width = max(text width + 2 * inner xseps, minimum width) + 2 * outer xseps
    \pgf@x=\wd\pgfnodeparttextbox
    \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
    \advance\pgf@x by 2\pgf@xc
    \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}%
    \ifdim\pgf@x<\pgf@xc
      \pgf@x=\pgf@xc
    \fi
    %
    \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/outer xsep}}%
    \edef\outerxsep{\the\pgf@xc}%
    \addtosavedmacro\outerxsep
    \advance\pgf@x by 2\pgf@xc
    \pgf@x=.5\pgf@x
    \edef\halfwidth{\the\pgf@x}%
    \addtosavedmacro\halfwidth
    %
    % height = max(text height + text depth + 2 * inner yseps, minimum height) + 2 * outer yseps
    \pgf@y=\ht\pgfnodeparttextbox
    \advance\pgf@y by \dp\pgfnodeparttextbox
    \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
    \advance\pgf@y by 2\pgf@yc
    \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}%
    \ifdim\pgf@y<\pgf@yc
      \pgf@y=\pgf@yc
    \fi
    %
    \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}%
    \edef\outerysep{\the\pgf@yc}%
    \addtosavedmacro\outerysep
    \advance\pgf@y by 2\pgf@yc
    \pgf@y=.5\pgf@y
    \edef\halfheight{\the\pgf@y}%
    \addtosavedmacro\halfheight
    %
    % \centerpoint
    \pgf@x=.5\wd\pgfnodeparttextbox
    \pgf@y=.5\ht\pgfnodeparttextbox
    \advance\pgf@y by -.5\dp\pgfnodeparttextbox
    \pgfextract@process\centerpoint{}%
    \addtosavedmacro\centerpoint
    %
    \pgfmathsetlengthmacro\northwestradius{\pgfkeysvalueof{/pgf/rectangle with rounded corners north west radius}}
    \pgfmathsetlengthmacro\northeastradius{\pgfkeysvalueof{/pgf/rectangle with rounded corners north east radius}}
    \pgfmathsetlengthmacro\southwestradius{\pgfkeysvalueof{/pgf/rectangle with rounded corners south west radius}}
    \pgfmathsetlengthmacro\southeastradius{\pgfkeysvalueof{/pgf/rectangle with rounded corners south east radius}}
    \addtosavedmacro\northwestradius
    \addtosavedmacro\northeastradius
    \addtosavedmacro\southwestradius
    \addtosavedmacro\southeastradius
  }%
  \anchor{center}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
  }
  \anchor{west}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \advance\pgf@x by -\halfwidth
  }
  \anchor{east}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \advance\pgf@x by \halfwidth
  }
  \anchor{north}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \advance\pgf@y by \halfheight
  }
  \anchor{south}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \advance\pgf@y by -\halfheight
  }
  \anchor{mid}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \pgfmathsetlength\pgf@y{+.5ex}%
  }
  \anchor{mid west}{%
    \csname pgf@anchor@rectangle with rounded corners@west\endcsname
    \pgfmathsetlength\pgf@y{+.5ex}%
  }
  \anchor{mid east}{%
    \csname pgf@anchor@rectangle with rounded corners@east\endcsname
    \pgfmathsetlength\pgf@y{+.5ex}%
  }
  \anchor{base}{%
    \rectanglewithroundedcornersparameter
    \centerpoint
    \pgf@y=0pt
  }
  \anchor{base west}{%
    \csname pgf@anchor@rectangle with rounded corners@west\endcsname
    \pgf@y=0pt
  }
  \anchor{base east}{%
    \csname pgf@anchor@rectangle with rounded corners@east\endcsname
    \pgf@y=0pt
  }
  \anchor{north west}{%
    \csname pgf@anchor@rectangle with rounded corners@north west center\endcsname
    \ifdim\northwestradius=0pt
    \else
      \pgf@process{\pgfpointadd{}{\pgfpointpolar{135}{\northwestradius+\outerxsep and \northwestradius+\outerysep}}}%
    \fi
  }
  \anchor{north west center}{%
    \rectanglewithroundedcornersparameter
    \pgf@x=-\halfwidth
    \pgf@y=\halfheight
    \ifdim\northwestradius=0pt
    \else
      \advance\pgf@x by \outerxsep
      \advance\pgf@x by \northwestradius
      \advance\pgf@y by -\outerysep
      \advance\pgf@y by -\northwestradius
    \fi
    \pgf@process{\pgfpointadd{}{\centerpoint}}%
  }
  \anchor{north east}{%
    \csname pgf@anchor@rectangle with rounded corners@north east center\endcsname
    \ifdim\northeastradius=0pt
    \else
      \pgf@process{\pgfpointadd{}{\pgfpointpolar{45}{\northeastradius+\outerxsep and \northeastradius+\outerysep}}}%
    \fi
  }
  \anchor{north east center}{%
    \rectanglewithroundedcornersparameter
    \pgf@x=\halfwidth
    \pgf@y=\halfheight
    \ifdim\northeastradius=0pt
    \else
      \advance\pgf@x by -\outerxsep
      \advance\pgf@x by -\northeastradius
      \advance\pgf@y by -\outerysep
      \advance\pgf@y by -\northeastradius
    \fi
    \pgf@process{\pgfpointadd{}{\centerpoint}}%
  }
  \anchor{south west}{%
    \csname pgf@anchor@rectangle with rounded corners@south west center\endcsname
    \ifdim\southwestradius=0pt
    \else
      \pgf@process{\pgfpointadd{}{\pgfpointpolar{225}{\southwestradius+\outerxsep and \southwestradius+\outerysep}}}%
    \fi
  }
  \anchor{south west center}{%
    \rectanglewithroundedcornersparameter
    \pgf@x=-\halfwidth
    \pgf@y=-\halfheight
    \ifdim\southwestradius=0pt
    \else
      \advance\pgf@x by \outerxsep
      \advance\pgf@x by \southwestradius
      \advance\pgf@y by \outerysep
      \advance\pgf@y by \southwestradius
    \fi
    \pgf@process{\pgfpointadd{}{\centerpoint}}%
  }
  \anchor{south east}{%
    \csname pgf@anchor@rectangle with rounded corners@south east center\endcsname
    \ifdim\southeastradius=0pt
    \else
      \pgf@process{\pgfpointadd{}{\pgfpointpolar{315}{\southeastradius+\outerxsep and \southeastradius+\outerysep}}}%
    \fi
  }
  \anchor{south east center}{%
    \rectanglewithroundedcornersparameter
    \pgf@x=\halfwidth
    \pgf@y=-\halfheight
    \ifdim\southeastradius=0pt
    \else
      \advance\pgf@x by -\outerxsep
      \advance\pgf@x by -\southeastradius
      \advance\pgf@y by \outerysep
      \advance\pgf@y by \southeastradius
    \fi
    \pgf@process{\pgfpointadd{}{\centerpoint}}%
  }
  \anchor{below north west}{%
    \csname pgf@anchor@rectangle with rounded corners@north west center\endcsname
    \advance\pgf@x by -\northwestradius
    \advance\pgf@x by -\outerxsep
  }
  \anchor{above south west}{%
    \csname pgf@anchor@rectangle with rounded corners@south west center\endcsname
    \advance\pgf@x by -\southwestradius
    \advance\pgf@x by -\outerxsep
  }
  \anchor{below north east}{%
    \csname pgf@anchor@rectangle with rounded corners@north east center\endcsname
    \advance\pgf@x by \northeastradius
    \advance\pgf@x by \outerxsep
  }
  \anchor{above south east}{%
    \csname pgf@anchor@rectangle with rounded corners@south east center\endcsname
    \advance\pgf@x by \southeastradius
    \advance\pgf@x by \outerxsep
  }
  \anchor{right north west}{%
    \csname pgf@anchor@rectangle with rounded corners@north west center\endcsname
    \advance\pgf@y by \northwestradius
    \advance\pgf@y by \outerysep
  }
  \anchor{right south west}{%
    \csname pgf@anchor@rectangle with rounded corners@south west center\endcsname
    \advance\pgf@y by -\southwestradius
    \advance\pgf@y by -\outerysep
  }
  \anchor{left north east}{%
    \csname pgf@anchor@rectangle with rounded corners@north east center\endcsname
    \advance\pgf@y by \northeastradius
    \advance\pgf@y by \outerysep
  }
  \anchor{left south east}{%
    \csname pgf@anchor@rectangle with rounded corners@south east center\endcsname
    \advance\pgf@y by -\southeastradius
    \advance\pgf@y by -\outerysep
  }
  \backgroundpath{%
    \rectanglewithroundedcornersparameter
    %
    \pgf@xa=\halfwidth
    \advance\pgf@xa by -\outerxsep
    \edef\HalfWidth{\the\pgf@xa}%
    %
    \pgf@ya=\halfheight
    \advance\pgf@ya by -\outerysep
    \edef\HalfHeight{\the\pgf@ya}%
    %
    \pgftransformshift{\centerpoint}%
    %
    \pgfpathmoveto{\pgfqpoint{\HalfWidth}{0pt}}%
    \pgfpathlineto{\pgfpoint {+\HalfWidth}{\HalfHeight-\northeastradius}}%
    \pgfpatharc{0}{90}{\northeastradius}%
    \pgfpathlineto{\pgfpoint{-\HalfWidth+\northwestradius}{+\HalfHeight}}
    \pgfpatharc{90}{180}{\northwestradius}%
    \pgfpathlineto{\pgfpoint{+-\HalfWidth}{-\HalfHeight+\southwestradius}}%
    \pgfpatharc{180}{270}{\southwestradius}%
    \pgfpathlineto{\pgfpoint{\HalfWidth-\southeastradius}{+-\HalfHeight}}%
    \pgfpatharc{270}{360}{\southeastradius}%
    \pgfpathclose
    \pgftransformshift{\pgfqpointscale{-1}{\centerpoint}}%
  }%
  \anchorborder{%
    \pgfextract@process\externalpoint{}%
    \ifdim\pgf@x=0pt
      \ifdim\pgf@y<0pt
        \csname pgf@anchor@rectangle with rounded corners@south\endcsname
      \else
        \csname pgf@anchor@rectangle with rounded corners@north\endcsname
      \fi
    \else
      \ifdim\pgf@y=0pt
        \ifdim\pgf@x<0pt
          \csname pgf@anchor@rectangle with rounded corners@west\endcsname
        \else
          \csname pgf@anchor@rectangle with rounded corners@east\endcsname
        \fi
      \else
        \rectanglewithroundedcornersparameter
        \pgfmathanglebetweenpoints{\pgfpointorigin}{\externalpoint}%
        \let\angle\pgfmathresult
        \pgf@xa=\pgf@x
        \pgf@ya=\pgf@y
        \pgfextract@process\externalPoint{\pgfpointadd{}{\centerpoint}}%
        \ifdim\pgf@xa<0pt
          \ifdim\pgf@ya<0pt
            % south west
            \pgf@sh@rwrc@anchorborder{above south west}{right south west}{south west}{180}{270}{\southwestradius}%
          \else
            % north west
            \pgf@sh@rwrc@anchorborder{right north west}{below north west}{north west}{90}{180}{\northwestradius}%
          \fi
        \else
          \ifdim\pgf@ya<0pt
            % south east
            \pgf@sh@rwrc@anchorborder{left south east}{above south east}{south east}{270}{360}{\southeastradius}%
          \else
            % north east
            \pgf@sh@rwrc@anchorborder{below north east}{left north east}{north east}{0}{90}{\northeastradius}%
          \fi
        \fi
      \fi
    \fi
  }
}
\def\pgf@sh@rwrc@anchorborder#1#2#3#4#5#6{%
  \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rectangle with rounded corners@#1\endcsname}%
  \let\angleA\pgfmathresult
  \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rectangle with rounded corners@#2\endcsname}%
  \let\angleB\pgfmathresult
  \if\ifdim\angle pt>\angleA pt 0\else1\fi\ifdim\angle pt<\angleB pt 0\else 2\fi
    \pgfmathpointintersectionoflineandarc{\externalPoint}{\centerpoint}
      {\csname pgf@anchor@rectangle with rounded corners@#3 center\endcsname}
      {#4}{#5}{#6+\outerxsep and #6+\outerysep}%
  \else
    \pgf@process{\pgfpointadd{\pgfpointborderrectangle{\externalpoint}{\pgfqpoint{\halfwidth}{\halfheight}}}{\centerpoint}}%
  \fi
}

\endinput
