code: def tile_images(img1, img2, mask1, mask2, opts):
      
      w1, h1 = img1.size
      w2, h2 = img2.size
  
      if opts.orientation == 'auto':
          opts.orientation = pick_orientation(img1, img2, opts.spacing)
  
      B, S = opts.border, opts.spacing
  
      if opts.orientation == 'lr':
          w, h = (B + w1 + S + w2 + B, B + max(h1, h2) + B)
          pos1 = (B, (h - h1) // 2)
          pos2 = (B + w1 + S, (h - h2) // 2)
          separator_line = [(B + w1 + S//2, 0), (B + w1 + S//2, h)]
      else:
          w, h = (B + max(w1, w2) + B, B + h1 + S + h2 + B)
          pos1 = ((w - w1) // 2, B)
          pos2 = ((w - w2) // 2, B + h1 + S)
          separator_line = [(0, B + h1 + S//2), (w, B + h1 + S//2)]
  
      img = Image.new('RGBA', (w, h), opts.bgcolor)
  
      img.paste(img1, pos1, mask1)
      img.paste(img2, pos2, mask2)
  
      ImageDraw.Draw(img).line(separator_line, fill=opts.sepcolor)
  
      return img
docs: Combine two images into one by tiling them.
  
      ``mask1`` and ``mask2`` provide optional masks for alpha-blending;
      pass None to avoid.
  
      Fills unused areas with ``opts.bgcolor``.
  
      Puts a ``opts.spacing``-wide bar with a thin line of ``opts.sepcolor``
      color between them.
  
      ``opts.orientation`` can be 'lr' for left-and-right, 'tb' for
      top-and-bottom, or 'auto' for automatic.