Transpor um array 2D

Como você transpõe eficientemente uma matriz? Existem bibliotecas para isso, ou qual algoritmo você usaria?

Por exemplo.:

short src[W*H] = {
  {1,2,3},
  {4,5,6}
};
short dest[W*H];


rotate_90_clockwise(dest,src,W,H); //<-- magic in here, no need for in-place

//dest is now:

{
  {4, 1},
  {5, 2},
  {6, 3}
};

(No meu caso específico, sua matriz src é um dado de imagem bruta, e o destino é um framebuffer, e estou embutido no ARM em um conjunto de ferramentas que não suporta montagem)

questionAnswers(6)

yourAnswerToTheQuestion