Blitter.inl
Go to the documentation of this file.00001 //*** Blitter.inl *** 00002 00003 #include "ColorHelper.h" 00004 00005 //*** OpFill_Color_TC *** 00006 00007 void Blitter::OpFill_Color_TC(OpArgs& opArgs) 00008 { 00009 // targetColor is filled with color 00010 *opArgs.targetColor=opArgs.color; 00011 } 00012 00013 00014 //*** OpFill_Alpha_TA *** 00015 00016 void Blitter::OpFill_Alpha_TA(OpArgs& opArgs) 00017 { 00018 // targetAlpha is filled with alpha 00019 *opArgs.targetAlpha=opArgs.alpha; 00020 } 00021 00022 00023 //*** OpCopy_SC_TC *** 00024 00025 void Blitter::OpCopy_SC_TC(OpArgs& opArgs) 00026 { 00027 // sourceColor is copied to targetColor 00028 *opArgs.targetColor=*opArgs.sourceColor; 00029 } 00030 00031 00032 //*** OpCopy_Color_SC_TC *** 00033 00034 void Blitter::OpCopy_Color_SC_TC(OpArgs& opArgs) 00035 { 00036 // sourceColor*color is copied to targetColor 00037 *opArgs.targetColor=RGBModulate16(*opArgs.sourceColor,opArgs.color); 00038 } 00039 00040 00041 //*** OpCopy_SA_TA *** 00042 00043 void Blitter::OpCopy_SA_TA(OpArgs& opArgs) 00044 { 00045 // sourceAlpha is copied to targetAlpha 00046 *opArgs.targetAlpha=*opArgs.sourceAlpha; 00047 } 00048 00049 00050 //*** OpBlend_SC_SA_TC *** 00051 00052 void Blitter::OpBlend_SC_SA_TC(OpArgs& opArgs) 00053 { 00054 // sourceColor is blended (sourceAlpha) with targetColor 00055 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,*opArgs.sourceColor,*opArgs.sourceAlpha); 00056 } 00057 00058 00059 //*** OpBlend_Color_SC_SA_TC *** 00060 00061 void Blitter::OpBlend_Color_SC_SA_TC(OpArgs& opArgs) 00062 { 00063 // sourceColor*color is blended (sourceAlpha) with targetColor 00064 unsigned short color=RGBModulate16(*opArgs.sourceColor,opArgs.color); 00065 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,color,*opArgs.sourceAlpha); 00066 } 00067 00068 00069 //*** OpBlend_Alpha_SC_TC *** 00070 00071 void Blitter::OpBlend_Alpha_SC_TC(OpArgs& opArgs) 00072 { 00073 // sourceColor is blended (alpha) with targetColor 00074 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,*opArgs.sourceColor,opArgs.alpha); 00075 } 00076 00077 00078 //*** OpBlend_Color_Alpha_SC_TC *** 00079 00080 void Blitter::OpBlend_Color_Alpha_SC_TC(OpArgs& opArgs) 00081 { 00082 // sourceColor*color is blended (alpha) with targetColor 00083 unsigned short color=RGBModulate16(*opArgs.sourceColor,opArgs.color); 00084 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,color,opArgs.alpha); 00085 } 00086 00087 00088 //*** OpBlend_Alpha_SC_SA_TC *** 00089 00090 void Blitter::OpBlend_Alpha_SC_SA_TC(OpArgs& opArgs) 00091 { 00092 // sourceColor is blended (sourceAlpha*alpha) with targetColor 00093 unsigned char alpha=((*opArgs.sourceAlpha)*opArgs.alpha)>>8; 00094 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,*opArgs.sourceColor,alpha); 00095 } 00096 00097 00098 //*** OpBlend_Color_Alpha_SC_SA_TC *** 00099 00100 void Blitter::OpBlend_Color_Alpha_SC_SA_TC(OpArgs& opArgs) 00101 { 00102 // sourceColor*color is blended (sourceAlpha*alpha) with targetColor 00103 unsigned char alpha=((*opArgs.sourceAlpha)*opArgs.alpha)>>8; 00104 unsigned short color=RGBModulate16(*opArgs.sourceColor,opArgs.color); 00105 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,color,alpha); 00106 } 00107 00108 00109 //*** OpBlend_Color_Alpha_TC *** 00110 00111 void Blitter::OpBlend_Color_Alpha_TC(OpArgs& opArgs) 00112 { 00113 // color is blended (alpha) with targetColor 00114 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,opArgs.color,opArgs.alpha); 00115 } 00116 00117 00118 //*** OpBlend_Color_SA_TC *** 00119 00120 void Blitter::OpBlend_Color_SA_TC(OpArgs& opArgs) 00121 { 00122 // color is blended (sourceAlpha) with targetColor 00123 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,opArgs.color,*opArgs.sourceAlpha); 00124 } 00125 00126 00127 //*** OpBlend_Color_Alpha_SA_TC *** 00128 00129 void Blitter::OpBlend_Color_Alpha_SA_TC(OpArgs& opArgs) 00130 { 00131 // color is blended (sourceAlpha*alpha) with targetColor 00132 unsigned char alpha=((*opArgs.sourceAlpha)*opArgs.alpha)>>8; 00133 *opArgs.targetColor=AlphaBlend16(*opArgs.targetColor,opArgs.color,alpha); 00134 } 00135 00136 00137 //*** OpMax_Alpha_TA *** 00138 00139 void Blitter::OpMax_Alpha_TA(OpArgs& opArgs) 00140 { 00141 // targetAlpha is set to max(alpha,targetAlpha) 00142 if (opArgs.alpha>*opArgs.targetAlpha) 00143 { 00144 *opArgs.targetAlpha=opArgs.alpha; 00145 } 00146 } 00147 00148 00149 //*** OpMax_SA_TA *** 00150 00151 void Blitter::OpMax_SA_TA(OpArgs& opArgs) 00152 { 00153 // targetAlpha is set to max(sourceAlpha,targetAlpha) 00154 if (*opArgs.sourceAlpha>*opArgs.targetAlpha) 00155 { 00156 *opArgs.targetAlpha=*opArgs.sourceAlpha; 00157 } 00158 } 00159 00160 00161 //*** OpMax_Alpha_SA_TA *** 00162 00163 void Blitter::OpMax_Alpha_SA_TA(OpArgs& opArgs) 00164 { 00165 // targetAlpha is set to max(sourceAlpha*alpha,targetAlpha) 00166 unsigned char alpha=((*opArgs.sourceAlpha)*opArgs.alpha)>>8; 00167 if (alpha>*opArgs.targetAlpha) 00168 { 00169 *opArgs.targetAlpha=alpha; 00170 } 00171 } 00172 00173 00174 //*** Normal *** 00175 00176 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00177 static void Blitter::Normal(BlitArgs& blitArgs) 00178 { 00179 int sourceStart=blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch; 00180 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00181 00182 OpArgs opArgs; 00183 opArgs.color=blitArgs.color; 00184 opArgs.alpha=blitArgs.alpha; 00185 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00186 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00187 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00188 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00189 00190 StepArgs stepArgs; 00191 stepArgs.sourceRowStep=blitArgs.sourceHPitch-blitArgs.sourceWidth; 00192 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00193 00194 for (int y=0; y<blitArgs.sourceHeight; y++) 00195 { 00196 for (int x=0; x<blitArgs.sourceWidth; x++) 00197 { 00198 operation(opArgs); 00199 00200 stepX(opArgs,stepArgs); 00201 } 00202 00203 stepY(opArgs,stepArgs); 00204 } 00205 } 00206 00207 00208 //**** Rot090 *** 00209 00210 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00211 static void Blitter::Rot090(BlitArgs& blitArgs) 00212 { 00213 int sourceStart=blitArgs.sourceY+((blitArgs.sourceVPitch-1)-blitArgs.sourceX)*blitArgs.sourceHPitch; 00214 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00215 00216 OpArgs opArgs; 00217 opArgs.color=blitArgs.color; 00218 opArgs.alpha=blitArgs.alpha; 00219 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00220 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00221 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00222 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00223 00224 StepArgs stepArgs; 00225 stepArgs.sourceRowStep=blitArgs.sourceWidth*blitArgs.sourceHPitch+1; 00226 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00227 stepArgs.sourceHPitch=blitArgs.sourceHPitch; 00228 00229 00230 for (int y=0; y<blitArgs.sourceHeight; y++) 00231 { 00232 for (int x=0; x<blitArgs.sourceWidth; x++) 00233 { 00234 operation(opArgs); 00235 00236 stepX(opArgs,stepArgs); 00237 } 00238 00239 stepY(opArgs,stepArgs); 00240 } 00241 } 00242 00243 00244 //**** Rot180 *** 00245 00246 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00247 static void Blitter::Rot180(BlitArgs& blitArgs) 00248 { 00249 int sourceStart=(blitArgs.sourceHPitch-1)-blitArgs.sourceX+((blitArgs.sourceVPitch-1)-blitArgs.sourceY)*blitArgs.sourceHPitch; 00250 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00251 00252 OpArgs opArgs; 00253 opArgs.color=blitArgs.color; 00254 opArgs.alpha=blitArgs.alpha; 00255 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00256 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00257 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00258 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00259 00260 StepArgs stepArgs; 00261 stepArgs.sourceRowStep=-(blitArgs.sourceHPitch-blitArgs.sourceWidth); 00262 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00263 stepArgs.sourceHPitch=blitArgs.sourceHPitch; 00264 00265 for (int y=0; y<blitArgs.sourceHeight; y++) 00266 { 00267 for (int x=0; x<blitArgs.sourceWidth; x++) 00268 { 00269 operation(opArgs); 00270 00271 stepX(opArgs,stepArgs); 00272 } 00273 00274 stepY(opArgs,stepArgs); 00275 } 00276 } 00277 00278 00279 //**** Rot270 *** 00280 00281 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00282 static void Blitter::Rot270(BlitArgs& blitArgs) 00283 { 00284 int sourceStart=(blitArgs.sourceHPitch-1-blitArgs.sourceY)+blitArgs.sourceX*blitArgs.sourceHPitch; 00285 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00286 00287 OpArgs opArgs; 00288 opArgs.color=blitArgs.color; 00289 opArgs.alpha=blitArgs.alpha; 00290 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00291 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00292 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00293 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00294 00295 StepArgs stepArgs; 00296 stepArgs.sourceRowStep=-(blitArgs.sourceWidth*blitArgs.sourceHPitch+1); 00297 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00298 stepArgs.sourceHPitch=blitArgs.sourceHPitch; 00299 00300 for (int y=0; y<blitArgs.sourceHeight; y++) 00301 { 00302 for (int x=0; x<blitArgs.sourceWidth; x++) 00303 { 00304 operation(opArgs); 00305 00306 stepX(opArgs,stepArgs); 00307 } 00308 00309 stepY(opArgs,stepArgs); 00310 } 00311 } 00312 00313 00314 //**** Flip_X *** 00315 00316 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00317 static void Blitter::Flip_X(BlitArgs& blitArgs) 00318 { 00319 int sourceStart=(blitArgs.sourceHPitch-1)-blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch; 00320 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00321 00322 OpArgs opArgs; 00323 opArgs.color=blitArgs.color; 00324 opArgs.alpha=blitArgs.alpha; 00325 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00326 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00327 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00328 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00329 00330 StepArgs stepArgs; 00331 stepArgs.sourceRowStep=blitArgs.sourceHPitch+blitArgs.sourceWidth; 00332 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00333 stepArgs.sourceHPitch=blitArgs.sourceHPitch; 00334 00335 for (int y=0; y<blitArgs.sourceHeight; y++) 00336 { 00337 for (int x=0; x<blitArgs.sourceWidth; x++) 00338 { 00339 operation(opArgs); 00340 00341 stepX(opArgs,stepArgs); 00342 } 00343 00344 stepY(opArgs,stepArgs); 00345 } 00346 } 00347 00348 00349 //**** Flip_Y *** 00350 00351 template<Blitter::Operation operation, Blitter::Step stepX, Blitter::Step stepY> 00352 static void Blitter::Flip_Y(BlitArgs& blitArgs) 00353 { 00354 int sourceStart=blitArgs.sourceX+((blitArgs.sourceVPitch-1)-blitArgs.sourceY)*blitArgs.sourceHPitch; 00355 int targetStart=blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch; 00356 00357 OpArgs opArgs; 00358 opArgs.color=blitArgs.color; 00359 opArgs.alpha=blitArgs.alpha; 00360 opArgs.sourceColor=&blitArgs.sourceColor[sourceStart]; 00361 opArgs.sourceAlpha=&blitArgs.sourceAlpha[sourceStart]; 00362 opArgs.targetColor=&blitArgs.targetColor[targetStart]; 00363 opArgs.targetAlpha=&blitArgs.targetAlpha[targetStart]; 00364 00365 StepArgs stepArgs; 00366 stepArgs.sourceRowStep=-(blitArgs.sourceHPitch+blitArgs.sourceWidth); 00367 stepArgs.targetRowStep=blitArgs.targetHPitch-blitArgs.sourceWidth; 00368 stepArgs.sourceHPitch=blitArgs.sourceHPitch; 00369 00370 for (int y=0; y<blitArgs.sourceHeight; y++) 00371 { 00372 for (int x=0; x<blitArgs.sourceWidth; x++) 00373 { 00374 operation(opArgs); 00375 00376 stepX(opArgs,stepArgs); 00377 } 00378 00379 stepY(opArgs,stepArgs); 00380 } 00381 } 00382 00383 00384 // targetAlpha is filled with alpha 00385 void Blitter::Normal_Fill_Alpha_TA(BlitArgs& blitArgs) 00386 { 00387 // Fill with a single memset when we can 00388 if (blitArgs.sourceWidth==blitArgs.targetHPitch) 00389 { 00390 unsigned char* destination=&blitArgs.targetAlpha[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00391 MemSet(destination,blitArgs.alpha,blitArgs.sourceWidth*blitArgs.sourceHeight); 00392 return; 00393 } 00394 00395 // Fill row by row 00396 unsigned char* destination=&blitArgs.targetAlpha[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00397 int rowStep=blitArgs.targetHPitch; 00398 00399 for (int y=0; y<blitArgs.sourceHeight; y++) 00400 { 00401 MemSet(destination,blitArgs.alpha,blitArgs.sourceWidth); 00402 00403 destination+=rowStep; // Step to the next row 00404 } 00405 } 00406 00407 // sourceColor is copied to targetColor 00408 void Blitter::Normal_Copy_SC_TC(BlitArgs& blitArgs) 00409 { 00411 if (blitArgs.sourceHPitch==blitArgs.sourceWidth && blitArgs.targetHPitch==blitArgs.sourceWidth) 00412 { 00413 MemCpy( &blitArgs.targetColor[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch], 00414 &blitArgs.sourceColor[blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch], 00415 2*blitArgs.sourceWidth*blitArgs.sourceHeight 00416 ); 00417 return; 00418 } 00419 00420 unsigned short* source=&blitArgs.sourceColor[blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch]; 00421 unsigned short* destination=&blitArgs.targetColor[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00422 int rowSize=blitArgs.sourceWidth*2; 00423 00424 for (int y=0; y<blitArgs.sourceHeight; y++) 00425 { 00426 MemCpy(destination,source,rowSize); 00427 source+=blitArgs.sourceHPitch; 00428 destination+=blitArgs.targetHPitch; 00429 } 00430 } 00431 00432 00433 // sourceColor is copied to targetColor 00434 void Blitter::Flip_Y_Copy_SC_TC(BlitArgs& blitArgs) 00435 { 00436 unsigned short* source=&blitArgs.sourceColor[blitArgs.sourceX+((blitArgs.sourceVPitch-1)-blitArgs.sourceY)*blitArgs.sourceHPitch]; 00437 unsigned short* destination=&blitArgs.targetColor[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00438 int rowSize=blitArgs.sourceWidth*2; 00439 int sourceRowStep=-blitArgs.sourceHPitch; 00440 int destinationRowStep=blitArgs.targetHPitch; 00441 00442 for (int y=0; y<blitArgs.sourceHeight; y++) 00443 { 00444 MemCpy(destination,source,rowSize); 00445 source+=sourceRowStep; 00446 destination+=destinationRowStep; 00447 } 00448 } 00449 00450 00451 // sourceAlpha is copied to targetAlpha 00452 void Blitter::Normal_Copy_SA_TA(BlitArgs& blitArgs) 00453 { 00455 if (blitArgs.sourceHPitch==blitArgs.sourceWidth && blitArgs.targetHPitch==blitArgs.sourceWidth) 00456 { 00457 MemCpy( &blitArgs.targetAlpha[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch], 00458 &blitArgs.sourceAlpha[blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch], 00459 blitArgs.sourceWidth*blitArgs.sourceHeight) 00460 ; 00461 return; 00462 } 00463 00464 unsigned char* source=&blitArgs.sourceAlpha[blitArgs.sourceX+blitArgs.sourceY*blitArgs.sourceHPitch]; 00465 unsigned char* destination=&blitArgs.targetAlpha[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00466 00467 for (int y=0; y<blitArgs.sourceHeight; y++) 00468 { 00469 MemCpy(destination,source,blitArgs.sourceWidth); 00470 source+=blitArgs.sourceHPitch; 00471 destination+=blitArgs.targetHPitch; 00472 } 00473 } 00474 00475 00476 // sourceAlpha is copied to targetAlpha 00477 void Blitter::Flip_Y_Copy_SA_TA(BlitArgs& blitArgs) 00478 { 00479 unsigned char* source=&blitArgs.sourceAlpha[blitArgs.sourceX+((blitArgs.sourceVPitch-1)-blitArgs.sourceY)*blitArgs.sourceHPitch]; 00480 unsigned char* destination=&blitArgs.targetAlpha[blitArgs.targetX+blitArgs.targetY*blitArgs.targetHPitch]; 00481 int sourceRowStep=-blitArgs.sourceHPitch; 00482 int destinationRowStep=blitArgs.targetHPitch; 00483 00484 for (int y=0; y<blitArgs.sourceHeight; y++) 00485 { 00486 MemCpy(destination,source,blitArgs.sourceWidth); 00487 source+=sourceRowStep; 00488 destination+=destinationRowStep; 00489 } 00490 }
Reproduction/republishing of any material on this site without permission is strictly prohibited.
