def render_tiles(self, renderContext, tiles, sdx=1.0, sdy=1.0):

        # create an compose_image that has the same resolution as the tiles
        image = tiles.compose_image()

        QgsImageOperation.adjustBrightnessContrast(image, self.brightness, self.contrast)
        QgsImageOperation.adjustHueSaturation(image, self.saturation)

        # tile extent to pixel
        map2pixel = renderContext.mapToPixel()
        extent = tiles.extent()
        topLeft = map2pixel.transform(extent.xMinimum(), extent.yMaximum())
        bottomRight = map2pixel.transform(extent.xMaximum(), extent.yMinimum())
        rect = QRectF(QPointF(topLeft.x() * sdx, topLeft.y() * sdy),
                      QPointF(bottomRight.x() * sdx, bottomRight.y() * sdy))

        # draw the compose_image on the map canvas
        renderContext.painter().drawImage(rect, image)

        self.log("TilesCollection extent: " + str(extent))
        self.log("Draw into canvas rect: " + str(rect))