async def METHOD_NAME(self, url, x, y, alpha, w_ratio=False, h_ratio=False):
    self.url = url
    self.x = x
    self.y = y
    self.alpha = alpha
    self.w_ratio = (
        float(w_ratio) / 100.0 if w_ratio and w_ratio != "none" else False
    )
    self.h_ratio = (
        float(h_ratio) / 100.0 if h_ratio and h_ratio != "none" else False
    )
    self.watermark_engine = self.context.modules.engine.__class__(
        self.context
    )
    self.storage = self.context.modules.storage
    try:
        buffer = await self.storage.get(self.url)
        if buffer is not None:
            return self.on_image_ready(buffer)
        if not self.validate(self.url):
            raise tornado.web.HTTPError(400)
        result = await self.context.modules.loader.load(
            self.context, self.url
        )
        if isinstance(result, LoaderResult) and not result.successful:
            logger.warning(
                "bad watermark result error=%s metadata=%s",
                result.error,
                result.metadata,
            )
            raise tornado.web.HTTPError(400)
        if isinstance(result, LoaderResult):
            buffer = result.buffer
        else:
            buffer = result
        await self.storage.put(self.url, buffer)
        await self.storage.put_crypto(self.url)
        self.on_image_ready(buffer)
    except Exception as error:
        if isinstance(error, tornado.web.HTTPError):
            raise error
        logger.warning("bad watermark")
        raise tornado.web.HTTPError(500)