00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "sdlmm_config.h"
00022
00023 #include <SDL.h>
00024 #include "sdlmm_basesurface.h"
00025
00026
00027
00028 namespace SDLmm {
00029
00030 bool BaseSurface::Lock() {
00031 if(SDL_MUSTLOCK(me)) {
00032 return SDL_LockSurface(me) == 0;
00033 }
00034 else return true;
00035 }
00036
00037 void BaseSurface::Unlock() {
00038 if(SDL_MUSTLOCK(me)) {
00039 SDL_UnlockSurface(me);
00040 }
00041 }
00042
00043 void BaseSurface::SetPixel1(int x, int y, Color color) {
00044
00045 ASSERT(x >= 0);
00046 ASSERT(x < w());
00047 ASSERT(y >= 0);
00048 ASSERT(y < h());
00049 ASSERT(GetPixelFormat().BytesPerPixel() == 1);
00050 *((Uint8 *)pixels() + y * pitch() + x) = color;
00051 }
00052
00053 void BaseSurface::SetPixel2(int x, int y, Color color) {
00054
00055 ASSERT(x >= 0);
00056 ASSERT(x < w());
00057 ASSERT(y >= 0);
00058 ASSERT(y < h());
00059 ASSERT(GetPixelFormat().BytesPerPixel() == 2);
00060 *((Uint16 *)pixels() + y * pitch()/2 + x) = color;
00061 }
00062
00063 void BaseSurface::SetPixel3(int x, int y, Color color) {
00064
00065 ASSERT(x >= 0);
00066 ASSERT(x < w());
00067 ASSERT(y >= 0);
00068 ASSERT(y < h());
00069 ASSERT(GetPixelFormat().BytesPerPixel() == 3);
00070 Uint8 *pix = (Uint8 *)pixels() + y * pitch() + x * 3;
00071
00072 if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
00073 pix[2] = color;
00074 pix[1] = color >> 8;
00075 pix[0] = color >> 16;
00076 } else {
00077 pix[0] = color;
00078 pix[1] = color >> 8;
00079 pix[2] = color >> 16;
00080 }
00081 }
00082
00083 void BaseSurface::SetPixel4(int x, int y, Color color) {
00084
00085 ASSERT(x >= 0);
00086 ASSERT(x < w());
00087 ASSERT(y >= 0);
00088 ASSERT(y < h());
00089 ASSERT(GetPixelFormat().BytesPerPixel() == 4);
00090 *((Uint32 *)pixels() + y * pitch()/4 + x) = color;
00091 }
00092
00093 void BaseSurface::SetPixel(int x, int y, Color color) {
00094
00095 ASSERT(x >= 0);
00096 ASSERT(x < w());
00097 ASSERT(y >= 0);
00098 ASSERT(y < h());
00099
00100 switch(GetPixelFormat().BytesPerPixel())
00101 {
00102 case 1:
00103 SetPixel1(x, y, color);
00104 break;
00105
00106 case 2:
00107 SetPixel2(x, y, color);
00108 break;
00109
00110 case 3:
00111 SetPixel3(x, y, color);
00112 break;
00113
00114 case 4:
00115 SetPixel4(x, y, color);
00116 break;
00117
00118 default:
00119 ASSERT(false);
00120 break;
00121 }
00122 }
00123
00124 Color BaseSurface::GetPixel(int x, int y) const {
00125 ASSERT(x >= 0);
00126 ASSERT(x < w());
00127 ASSERT(y >= 0);
00128 ASSERT(y < h());
00129
00130 PixelFormat pf(GetPixelFormat());
00131
00132 const Uint8* the_pixel = (const Uint8*)pixels() + y * pitch() + x * pf.BytesPerPixel();
00133
00134 switch(pf.BytesPerPixel())
00135 {
00136 case 1:
00137 return *((const Uint8 *)the_pixel);
00138 break;
00139
00140 case 2:
00141 return *((const Uint16 *)the_pixel);
00142 break;
00143
00144 case 3:
00145 {
00146 Uint32 r, g, b;
00147 Color color;
00148 r = *(the_pixel + pf.Rshift()/8);
00149 g = *(the_pixel + pf.Gshift()/8);
00150 b = *(the_pixel + pf.Bshift()/8);
00151 color = r << pf.Rshift();
00152 color |= g << pf.Rshift();
00153 color |= b << pf.Bshift();
00154 return color;
00155 }
00156 break;
00157
00158 case 4:
00159 return *((const Uint32 *)(the_pixel));
00160 break;
00161
00162 default:
00163 ASSERT(false);
00164 return 0;
00165 break;
00166 }
00167 }
00168
00169 int BaseSurface::Blit(const BaseSurface& src, const SDL_Rect& srcrect, SDL_Rect& dstrect) {
00170 return SDL_BlitSurface(src.me, const_cast<SDL_Rect*>(&srcrect), me, &dstrect);
00171 }
00172
00173 int BaseSurface::Blit(const BaseSurface& src, const SDL_Rect& srcrect, const SPoint& dstpoint) {
00174 SDL_Rect rect;
00175 rect.x = dstpoint.x; rect.y = dstpoint.y;
00176 return Blit(src, srcrect, rect);
00177 }
00178
00179 int BaseSurface::Blit(const BaseSurface& src, SDL_Rect& dstrect) {
00180 return SDL_BlitSurface(src.me, 0, me, &dstrect);
00181 }
00182
00183 int BaseSurface::Blit(const BaseSurface& src, const SPoint& dstpoint) {
00184 SDL_Rect rect;
00185 rect.x = dstpoint.x; rect.y = dstpoint.y;
00186 return Blit(src, rect);
00187 }
00188
00189 int BaseSurface::Blit(const BaseSurface& src) {
00190 return SDL_BlitSurface(src.me, 0, me, 0);
00191 }
00192
00193 bool BaseSurface::Fill(Color color) {
00194 return SDL_FillRect(me, 0, color) == 0;
00195 }
00196
00197 bool BaseSurface::FillRect(SDL_Rect& dstrect, Color color) {
00198 return SDL_FillRect(me, &dstrect, color) == 0;
00199 }
00200
00201
00202 bool BaseSurface::SetColorKey(Uint32 flag, Color key) {
00203 return SDL_SetColorKey(me, flag, key) == 0;
00204 }
00205
00206 bool BaseSurface::SetAlpha(Uint32 flag, Uint8 alpha) {
00207 return SDL_SetAlpha(me, flag, alpha) == 0;
00208 }
00209
00210 void BaseSurface::SetClipRect(const SDL_Rect& rect) {
00211 SDL_SetClipRect(me, const_cast<SDL_Rect*>(&rect));
00212 }
00213
00214 void BaseSurface::ResetClipRect() {
00215 SDL_SetClipRect(me, 0);
00216 }
00217
00218 void BaseSurface::GetClipRect(SDL_Rect& rect) const {
00219 SDL_GetClipRect(me, &rect);
00220 }
00221
00222 bool BaseSurface::SaveBMP(const char *file) const {
00223 if(me) {
00224 return SDL_SaveBMP(me, file) == 0;
00225 }
00226 return false;
00227 }
00228 }
00229