docs: def generate_filename(self, mark, **kwargs):
          """Comes up with a good filename for the watermarked image"""
  
          kwargs = kwargs.copy()
  
          kwargs['opacity'] = int(kwargs['opacity'] * 100)
          kwargs['st_mtime'] = kwargs['fstat'].st_mtime
          kwargs['st_size'] = kwargs['fstat'].st_size
  
          params = [
              '%(original_basename)s',
              'wm',
              'w%(watermark)i',
              'o%(opacity)i',
              'gs%(greyscale)i',
              'r%(rotation)i',
              'fm%(st_mtime)i',
              'fz%(st_size)i',
              'p%(position)s',
          ]
  
          scale = kwargs.get('scale', None)
          if scale and scale != mark.size:
              params.append('_s%i' % (float(kwargs['scale'][0]) / mark.size[0] * 100))
  
          if kwargs.get('tile', None):
              params.append('_tiled')
  
          # make thumbnail filename
          filename = '%s%s' % ('_'.join(params), kwargs['ext'])
  
          return filename % kwargs