Outro método para isso que também pode ter suporte limitado é o "SVG incorporado no CSS". Eu não tentei isso sozinho, mas a idéia é que você forneça um recurso de imagem como um URL na declaração css para o objeto e passe um URL com escape adequado que contém os dados.
SVG é um formato de texto simples / xml. Um polígono de exemplo (da w3schools ):
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<polygon points="200,10 250,190 160,210"
style="fill:lime;stroke:purple;stroke-width:1"/>
</svg>
Um exemplo de SVG embutido (incorporado) (simplificado) (do stackoverflow ):
url("data:image/svg+xml;utf8, <svg></svg>");
Observe que os dados SVG devem ser "escapados" corretamente para uso em linha, o que o torna um pouco menos atraente do que simplesmente vincular um arquivo SVG.
Há alguma discussão sobre a viabilidade do método no thread vinculado acima. Penso que incorporar algo tão simples como um triângulo branco é uma decisão fácil, desde que o suporte esteja lá. Dados complexos no formato SVG devem ser armazenados como um arquivo SVG em vez de embutidos.
Os arquivos SVG são vetoriais e podem ser redimensionados em porcentagem, diferentemente do método "bordas". Eles também (atualmente) têm suporte melhor (pelo menos não interno) do que o método do caminho de recorte listado. SVG, sendo texto simples, pode até ser emitido on-the-fly usando, por exemplo, PHP ou outro script do lado do servidor.