No. With OpenGL however you can play with the texture co-ordinates or the vertices to achieve that. Not sure how appropriate this question is for this forum.
Yes. It's quite trivial as image transforms go... Code: SDL_LockSurface(m_pSurface); int nHH = m_pSurface->h / 2; int nPitch = m_pSurface->pitch; byte* pBuf = new byte[nPitch]; byte* pSrc = (byte*) m_pSurface->pixels; byte* pDst = (byte*) m_pSurface->pixels + nPitch*(m_pSurface->h - 1); while (nHH--) { memcpy(pBuf, pSrc, nPitch); memcpy(pSrc, pDst, nPitch); memcpy(pDst, pBuf, nPitch); pSrc += nPitch; pDst -= nPitch; } delete[] pBuf; SDL_UnlockSurface(m_pSurface); (Yeah, yeah, it could be optimized in assembler with SSE and MMX, unrolled, and written in Haskell, but you shouldn't be doing flips too often in realtime, nor optimizing prematurely!)
On a slightly related note, I thought I'd mention the following easy (but not always obvious) trick: glScalef(1.0f, -1.0f, 1.0f);