class_docstr: A point, with center at ``x`` and ``y``.
  
  Points map each record to a single bin.
  Points falling exactly on the upper bounds are treated as a special case,
  mapping into the previous bin rather than being cropped off.
  
  Parameters
  ----------
  x, y : str
      Column names for the x and y coordinates of each point.
class_docstr_tok: ["A","point",",","with","center","at","``","x","``","and","``","y","``",".","Points","map","each","record","to","a","single","bin",".","Points","falling","exactly","on","the","upper","bounds","are","treated","as","a","special","case",",","mapping","into","the","previous","bin","rather","than","being","cropped","off",".","Parameters","--","--","--","--","--","x",",","y",":","str","Column","names","for","the","x","and","y","coordinates","of","each","point","."]
code: def _build_extend(
      self,
      x_mapper,
      y_mapper,
      info,
      append,
      _antialias_stage_2,
      _antialias_stage_2_funcs,
  ):
      x_name = self.x
      y_name = self.y
  
      @ngjit
      @self.expand_aggs_and_cols(append)
      def _perform_extend_points(
          i,
          sx,
          tx,
          sy,
          ty,
          xmin,
          xmax,
          ymin,
          ymax,
          xs,
          ys,
          xxmax,
          yymax,
          *aggs_and_cols,
      ):
          x = xs[i]
          y = ys[i]
  
          # points outside bounds are dropped; remainder
          # are mapped onto pixels
          if (xmin <= x <= xmax) and (ymin <= y <= ymax):
              xx = int(x_mapper(x) * sx + tx)
              yy = int(y_mapper(y) * sy + ty)
  
              xi, yi = (
                  xxmax - 1 if xx >= xxmax else xx,
                  yymax - 1 if yy >= yymax else yy,
              )
              append(i, xi, yi, *aggs_and_cols)
  
      @ngjit
      @self.expand_aggs_and_cols(append)
      def extend_cpu(
          sx,
          tx,
          sy,
          ty,
          xmin,
          xmax,
          ymin,
          ymax,
          xs,
          ys,
          xxmax,
          yymax,
          *aggs_and_cols,
      ):
          for i in range(xs.shape[0]):
              _perform_extend_points(
                  i,
                  sx,
                  tx,
                  sy,
                  ty,
                  xmin,
                  xmax,
                  ymin,
                  ymax,
                  xs,
                  ys,
                  xxmax,
                  yymax,
                  *aggs_and_cols,
              )
  
      @cuda.jit
      @self.expand_aggs_and_cols(append)
      def extend_cuda(
          sx,
          tx,
          sy,
          ty,
          xmin,
          xmax,
          ymin,
          ymax,
          xs,
          ys,
          xxmax,
          yymax,
          *aggs_and_cols,
      ):
          i = cuda.grid(1)
          if i < xs.shape[0]:
              _perform_extend_points(
                  i,
                  sx,
                  tx,
                  sy,
                  ty,
                  xmin,
                  xmax,
                  ymin,
                  ymax,
                  xs,
                  ys,
                  xxmax,
                  yymax,
                  *aggs_and_cols,
              )
  
      def extend(aggs, df, vt, bounds):
          yymax, xxmax = aggs[0].shape[:2]
          aggs_and_cols = aggs + info(df, aggs[0].shape[:2])
          sx, tx, sy, ty = vt
          xmin, xmax, ymin, ymax = bounds
  
          if cudf and isinstance(df, cudf.DataFrame):
              xs = values(df[x_name])
              ys = values(df[y_name])
              do_extend = extend_cuda[cuda_args(xs.shape[0])]
          else:
              xs = df[x_name].values
              ys = df[y_name].values
              do_extend = extend_cpu
  
          do_extend(
              sx,
              tx,
              sy,
              ty,
              xmin,
              xmax,
              ymin,
              ymax,
              xs,
              ys,
              xxmax,
              yymax,
              *aggs_and_cols,
          )
  
      return extend
  
imports: from __future__ import annotations
  from packaging.version import Version
  import numpy
  from toolz import memoize
  from datashader.glyphs.glyph import Glyph
  from datashader.utils import isreal, ngjit
  from numba import cuda
label_desc: Use image node_id 1 for calling the Point obj's underlying member method code with example usage: obj._build_extend(x_mapper, y_mapper, info, append, _antialias_stage_2, _antialias_stage_2_funcs) and returns: extend