#include <stdlib.h> #include "surface.h" HRESULT Surface::QueryInterface(REFIID iid, void ** ppvObject) { if (InlineIsEqualGUID(iid, IID_IUnknown) || InlineIsEqualGUID(iid, IID_ISurface)) { AddRef(); *ppvObject = (ISurface*) this; return S_OK; } else return E_FAIL; } HRESULT Surface::Blt(ISurface* pSrc, int x, int y, int nWidth, int nHeight, int nSrcX, int nSrcY, pixel_t pixTrans) { /*SurfaceDesc srcDesc; HRESULT hr; int line, nBytesPerLine; if (FAILED(hr = pSrc->Lock(&srcDesc))) return hr; if (srcDesc.nBpp != fBpp) { pSrc->Unlock(); return E_NOTIMPLEMENTED; } nBytesPerLine = fBpp / 8; for (line = nSrcY; line < nSrcY + nHeight; line++) memcpy(pBuf + (nBytesPerLine * (fWidth * (line + y) + x)), (BYTE*) srcDesc.pMemory + srcDesc.nPitch * line + nSrcX * nBytesPerLine, nWidth * nBytesPerLine); pSrc->Unlock(); return S_OK;*/ int ax, ay; pixel_t pix; for (ax = 0; ax < nWidth; ax++) for (ay = 0; ay < nHeight; ay++) if (ax + x < fWidth && ay + y < fHeight) { pix = pSrc->GetPixel(nSrcX + ax, nSrcY + ay); if (pix != pixTrans) SetPixel(ax + x, ay + y, pix); } return S_OK; } DrawMode Surface::SetDrawMode(DrawMode mode) { DrawMode oldMode = fDrawMode; fDrawMode = mode; return oldMode; } HRESULT Surface::FillRect(const rectangle_t* rect, pixel_t pix) { int x, y; for (y = max(0, rect->top); y < min(fHeight, rect->bottom); y++) for (x = max(0, rect->left); x < min(fWidth, rect->right); x++) SetPixel(x, y, pix); return S_OK; } HRESULT Surface::Rect3d(const rectangle_t* rect, pixel_t pixTop, pixel_t pixBottom, int nWidth) { FillRect(rectangle_t(rect->left, rect->top, rect->right, rect->top + nWidth), pixTop); FillRect(rectangle_t(rect->left, rect->top + nWidth, rect->left + nWidth, rect->bottom), pixTop); FillRect(rectangle_t(rect->right - nWidth, rect->top + nWidth, rect->right, rect->bottom), pixBottom); FillRect(rectangle_t(rect->left + nWidth, rect->bottom - nWidth, rect->right - nWidth, rect->bottom), pixBottom); return S_OK; } HRESULT Surface::GetClipRect(rectangle_t* rect) { rect->left = rect->top = 0; rect->right = fWidth; rect->bottom = fHeight; return S_OK; }