00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #include "mmsgui/fb/mmsfbconv.h"
00034 #include <string.h>
00035 
00036 void stretch_byte_buffer_no_antialiasing(unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00037                                          unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00038     
00039     int horifact = (dw<<16)/sw;
00040     int vertfact = (dh<<16)/sh;
00041     int vertcnt;
00042     unsigned char *src_end = src + src_pitch_pix * sh;
00043     if (src_end > src + src_pitch_pix * src_height)
00044         src_end = src + src_pitch_pix * src_height;
00045     unsigned char *dst_end = dst + dst_pitch_pix * dst_height;
00046 
00047     
00048     if (horifact == 0x10000) {
00049         
00050         vertcnt = 0x8000;
00051         while ((src < src_end)&&(dst < dst_end)) {
00052             
00053             vertcnt+=vertfact;
00054             if (vertcnt & 0xffff0000) {
00055                 do {
00056                     memcpy(dst, src, sw);
00057                     vertcnt-=0x10000;
00058                     dst = dst + dst_pitch;
00059                 } while (vertcnt & 0xffff0000);
00060             }
00061             
00062             src+=src_pitch;
00063         }
00064     }
00065     if (horifact == 0x20000) {
00066         
00067         vertcnt = 0x8000;
00068         while ((src < src_end)&&(dst < dst_end)) {
00069             
00070             vertcnt+=vertfact;
00071             if (vertcnt & 0xffff0000) {
00072                 unsigned char *line_end = src + sw;
00073                 unsigned char *old_dst = dst;
00074 
00075                 do {
00076                     
00077                     while (src < line_end) {
00078                         register unsigned short int SRC  = *src;
00079                         *((unsigned short int *)dst) = SRC | (SRC << 8);
00080                         dst+=2;
00081                         src++;
00082                     }
00083                     src-=sw;
00084                     vertcnt-=0x10000;
00085                     dst = old_dst +  dst_pitch;
00086                     old_dst = dst;
00087                 } while (vertcnt & 0xffff0000);
00088             }
00089 
00090             
00091             src+=src_pitch;
00092         }
00093     }
00094     else {
00095         
00096         vertcnt = 0x8000;
00097         while ((src < src_end)&&(dst < dst_end)) {
00098             
00099             vertcnt+=vertfact;
00100             if (vertcnt & 0xffff0000) {
00101                 unsigned char *line_end = src + sw;
00102                 unsigned char *old_dst = dst;
00103 
00104                 do {
00105                     int horicnt = 0x8000;
00106                     while (src < line_end) {
00107                         horicnt+=horifact;
00108                         if (horicnt & 0xffff0000) {
00109                             register unsigned char SRC  = *src;
00110 
00111                             do {
00112                                 *dst = SRC;
00113                                 dst++;
00114                                 horicnt-=0x10000;
00115                             } while (horicnt & 0xffff0000);
00116                         }
00117 
00118                         src++;
00119                     }
00120                     src-=sw;
00121                     vertcnt-=0x10000;
00122                     dst = old_dst +  dst_pitch;
00123                     old_dst = dst;
00124                 } while (vertcnt & 0xffff0000);
00125             }
00126 
00127             
00128             src+=src_pitch;
00129         }
00130     }
00131 }
00132 
00133 void stretch_byte_buffer_v_antialiasing(unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00134                                         unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00135     
00136     int horifact = (dw<<16)/sw;
00137     int vertfact = (dh<<16)/sh;
00138     int vertcnt;
00139     unsigned char *src_end = src + src_pitch_pix * sh;
00140     if (src_end > src + src_pitch_pix * src_height)
00141         src_end = src + src_pitch_pix * src_height;
00142     unsigned char *dst_end = dst + dst_pitch_pix * dst_height;
00143 
00144     
00145     if (vertfact >= 0x10000) {
00146         
00147         if (horifact == 0x10000) {
00148             
00149             vertcnt = 0x8000;
00150             register unsigned char vcnt = 0;
00151             while ((src < src_end)&&(dst < dst_end)) {
00152                 
00153                 vertcnt+=vertfact;
00154                 if (vertcnt & 0xffff0000) {
00155                     unsigned char *line_end = src + sw;
00156 
00157                     bool vaa = (vcnt > 1);
00158                     vcnt = 0;
00159                     if (!vaa) {
00160                         
00161                         do {
00162                             memcpy(dst, src, sw);
00163                             vertcnt-=0x10000;
00164                             dst = dst + dst_pitch;
00165                             vcnt++;
00166                         } while (vertcnt & 0xffff0000);
00167                     }
00168                     else {
00169                         unsigned char *old_dst = dst;
00170                         do {
00171                             if (vaa) {
00172                                 
00173                                 register unsigned int SRC;
00174                                 while (src < line_end) {
00175                                     
00176                                     SRC = *src;
00177 
00178                                     
00179                                     *dst = SRC;
00180                                     *(dst-dst_pitch) = (*(dst-dst_pitch) + SRC) >> 1;
00181                                     dst++;
00182 
00183                                     src++;
00184                                 }
00185                                 src-=sw;
00186                             }
00187                             else {
00188                                 
00189                                 memcpy(dst, src, sw);
00190                             }
00191                             vertcnt-=0x10000;
00192                             dst = old_dst + dst_pitch;
00193                             old_dst = dst;
00194                             vcnt++;
00195                             vaa = false;
00196                         } while (vertcnt & 0xffff0000);
00197                     }
00198                 }
00199 
00200                 
00201                 src+=src_pitch;
00202             }
00203         }
00204         else {
00205             
00206             vertcnt = 0x8000;
00207             register unsigned char vcnt = 0;
00208             while ((src < src_end)&&(dst < dst_end)) {
00209                 
00210                 vertcnt+=vertfact;
00211                 if (vertcnt & 0xffff0000) {
00212                     unsigned char *line_end = src + sw;
00213                     unsigned char *old_dst = dst;
00214 
00215                     bool vaa = (vcnt > 1);
00216                     vcnt = 0;
00217                     if (!vaa) {
00218                         do {
00219                             int horicnt = 0x8000;
00220                             register unsigned int SRC;
00221                             while (src < line_end) {
00222                                 horicnt+=horifact;
00223                                 if (horicnt & 0xffff0000) {
00224                                     
00225                                     SRC = *src;
00226 
00227                                     
00228                                     *dst = SRC;
00229                                     dst++;
00230                                     horicnt-=0x10000;
00231 
00232                                     
00233                                     if (horicnt & 0xffff0000) {
00234                                         do {
00235                                             *dst = SRC;
00236                                             dst++;
00237                                             horicnt-=0x10000;
00238                                         } while (horicnt & 0xffff0000);
00239                                     }
00240                                 }
00241 
00242                                 src++;
00243                             }
00244                             src-=sw;
00245                             vertcnt-=0x10000;
00246                             dst = old_dst + dst_pitch;
00247                             old_dst = dst;
00248                             vcnt++;
00249                         } while (vertcnt & 0xffff0000);
00250                     }
00251                     else {
00252                         do {
00253                             int horicnt = 0x8000;
00254                             register unsigned int SRC;
00255                             if (vaa) {
00256                                 
00257                                 while (src < line_end) {
00258                                     horicnt+=horifact;
00259                                     if (horicnt & 0xffff0000) {
00260                                         
00261                                         SRC = *src;
00262 
00263                                         
00264                                         *dst = SRC;
00265                                         *(dst-dst_pitch) = (*(dst-dst_pitch) + SRC) >> 1;
00266                                         dst++;
00267                                         horicnt-=0x10000;
00268 
00269                                         
00270                                         if (horicnt & 0xffff0000) {
00271                                             do {
00272                                                 *dst = SRC;
00273                                                 *(dst-dst_pitch) = (*(dst-dst_pitch) + SRC) >> 1;
00274                                                 dst++;
00275                                                 horicnt-=0x10000;
00276                                             } while (horicnt & 0xffff0000);
00277                                         }
00278                                     }
00279 
00280                                     src++;
00281                                 }
00282                             }
00283                             else {
00284                                 
00285                                 while (src < line_end) {
00286                                     horicnt+=horifact;
00287                                     if (horicnt & 0xffff0000) {
00288                                         
00289                                         SRC = *src;
00290 
00291                                         
00292                                         *dst = SRC;
00293                                         dst++;
00294                                         horicnt-=0x10000;
00295 
00296                                         
00297                                         if (horicnt & 0xffff0000) {
00298                                             do {
00299                                                 *dst = SRC;
00300                                                 dst++;
00301                                                 horicnt-=0x10000;
00302                                             } while (horicnt & 0xffff0000);
00303                                         }
00304                                     }
00305 
00306                                     src++;
00307                                 }
00308                             }
00309                             src-=sw;
00310                             vertcnt-=0x10000;
00311                             dst = old_dst + dst_pitch;
00312                             old_dst = dst;
00313                             vcnt++;
00314                             vaa = false;
00315                         } while (vertcnt & 0xffff0000);
00316                     }
00317                 }
00318 
00319                 
00320                 src+=src_pitch;
00321             }
00322         }
00323     }
00324     else {
00325         
00326         if (horifact == 0x10000) {
00327             
00328             vertcnt = 0x8000;
00329             bool vaa = false;
00330             while ((src < src_end)&&(dst < dst_end)) {
00331                 
00332                 vertcnt+=vertfact;
00333                 if (vertcnt & 0xffff0000) {
00334                     unsigned char *line_end = src + sw;
00335 
00336                     if (!vaa) {
00337                         
00338                         memcpy(dst, src, sw);
00339                         vertcnt-=0x10000;
00340                         dst = dst + dst_pitch;
00341                     }
00342                     else {
00343                         
00344                         unsigned char *old_dst = dst;
00345                         while (src < line_end) {
00346                             
00347                             *dst = (*(src-src_pitch) + *src) >> 1;
00348                             dst++;
00349                             src++;
00350                         }
00351                         src-=sw;
00352                         vertcnt-=0x10000;
00353                         dst = old_dst + dst_pitch;
00354                         vaa = false;
00355                     }
00356                 }
00357                 else
00358                     vaa = true;
00359 
00360                 
00361                 src+=src_pitch;
00362             }
00363         }
00364         else {
00365             
00366             vertcnt = 0x8000;
00367             bool vaa = false;
00368             while ((src < src_end)&&(dst < dst_end)) {
00369                 
00370                 vertcnt+=vertfact;
00371                 if (vertcnt & 0xffff0000) {
00372                     unsigned char *line_end = src + sw;
00373                     unsigned char *old_dst = dst;
00374 
00375                     if (!vaa) {
00376                         
00377                         int horicnt = 0x8000;
00378                         register unsigned int SRC;
00379                         while (src < line_end) {
00380                             horicnt+=horifact;
00381                             if (horicnt & 0xffff0000) {
00382                                 
00383                                 SRC = *src;
00384 
00385                                 
00386                                 *dst = SRC;
00387                                 dst++;
00388                                 horicnt-=0x10000;
00389 
00390                                 
00391                                 if (horicnt & 0xffff0000) {
00392                                     do {
00393                                         *dst = SRC;
00394                                         dst++;
00395                                         horicnt-=0x10000;
00396                                     } while (horicnt & 0xffff0000);
00397                                 }
00398                             }
00399 
00400                             src++;
00401                         }
00402                         src-=sw;
00403                         vertcnt-=0x10000;
00404                         dst = old_dst + dst_pitch;
00405                         old_dst = dst;
00406                     }
00407                     else {
00408                         
00409                         int horicnt = 0x8000;
00410                         register unsigned int SRC;
00411                         while (src < line_end) {
00412                             horicnt+=horifact;
00413                             if (horicnt & 0xffff0000) {
00414                                 
00415                                 SRC = (*(src-src_pitch) + *src) >> 1;
00416 
00417                                 
00418                                 *dst = SRC;
00419                                 dst++;
00420                                 horicnt-=0x10000;
00421 
00422                                 
00423                                 if (horicnt & 0xffff0000) {
00424                                     do {
00425                                         *dst = SRC;
00426                                         dst++;
00427                                         horicnt-=0x10000;
00428                                     } while (horicnt & 0xffff0000);
00429                                 }
00430                             }
00431 
00432                             src++;
00433                         }
00434                         src-=sw;
00435                         vertcnt-=0x10000;
00436                         dst = old_dst + dst_pitch;
00437                         old_dst = dst;
00438                         vaa = false;
00439                     }
00440                 }
00441                 else
00442                     vaa = true;
00443 
00444                 
00445                 src+=src_pitch;
00446             }
00447         }
00448     }
00449 }
00450 
00451 void stretch_byte_buffer_h_antialiasing(unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00452                                         unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00453     
00454     int horifact = (dw<<16)/sw;
00455     int vertfact = (dh<<16)/sh;
00456     int vertcnt;
00457     unsigned char *src_end = src + src_pitch_pix * sh;
00458     if (src_end > src + src_pitch_pix * src_height)
00459         src_end = src + src_pitch_pix * src_height;
00460     unsigned char *dst_end = dst + dst_pitch_pix * dst_height;
00461 
00462     
00463     
00464     vertcnt = 0x8000;
00465     while ((src < src_end)&&(dst < dst_end)) {
00466         
00467         vertcnt+=vertfact;
00468         if (vertcnt & 0xffff0000) {
00469             unsigned char *line_end = src + sw;
00470             unsigned char *old_dst = dst;
00471 
00472             do {
00473                 int horicnt = 0x8000;
00474                 register unsigned int SRC;
00475                 register bool haa = false;
00476                 while (src < line_end) {
00477                     horicnt+=horifact;
00478                     if (horicnt & 0xffff0000) {
00479                         
00480                         if (haa) {
00481                             *(dst-1) = (SRC + *src) >> 1;
00482                             haa = false;
00483                         }
00484 
00485                         
00486                         SRC = *src;
00487 
00488                         
00489                         *dst = SRC;
00490                         dst++;
00491                         horicnt-=0x10000;
00492 
00493                         
00494                         if ((haa=(horicnt & 0xffff0000))) {
00495                             do {
00496                                 *dst = SRC;
00497                                 dst++;
00498                                 horicnt-=0x10000;
00499                             } while (horicnt & 0xffff0000);
00500                         }
00501                     }
00502 
00503                     src++;
00504                 }
00505                 src-=sw;
00506                 vertcnt-=0x10000;
00507                 dst = old_dst + dst_pitch;
00508                 old_dst = dst;
00509             } while (vertcnt & 0xffff0000);
00510         }
00511 
00512         
00513         src+=src_pitch;
00514     }
00515 }
00516 
00517 void stretch_byte_buffer_hv_antialiasing(unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00518                                          unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00519     
00520     int horifact = (dw<<16)/sw;
00521     int vertfact = (dh<<16)/sh;
00522     int vertcnt;
00523     unsigned char *src_end = src + src_pitch_pix * sh;
00524     if (src_end > src + src_pitch_pix * src_height)
00525         src_end = src + src_pitch_pix * src_height;
00526     unsigned char *dst_end = dst + dst_pitch_pix * dst_height;
00527 
00528     
00529     
00530     vertcnt = 0x8000;
00531     register unsigned char vcnt = 0;
00532     while ((src < src_end)&&(dst < dst_end)) {
00533         
00534         vertcnt+=vertfact;
00535         if (vertcnt & 0xffff0000) {
00536             unsigned char *line_end = src + sw;
00537             unsigned char *old_dst = dst;
00538 
00539             bool vaa = (vcnt > 1);
00540             vcnt = 0;
00541             if (!vaa) {
00542                 do {
00543                     int horicnt = 0x8000;
00544                     register unsigned int SRC;
00545                     register bool haa = false;
00546                     while (src < line_end) {
00547                         horicnt+=horifact;
00548                         if (horicnt & 0xffff0000) {
00549                             
00550                             if (haa) {
00551                                 *(dst-1) = (SRC + *src) >> 1;
00552                                 haa = false;
00553                             }
00554 
00555                             
00556                             SRC = *src;
00557 
00558                             
00559                             *dst = SRC;
00560                             dst++;
00561                             horicnt-=0x10000;
00562 
00563                             
00564                             if ((haa=(horicnt & 0xffff0000))) {
00565                                 do {
00566                                     *dst = SRC;
00567                                     dst++;
00568                                     horicnt-=0x10000;
00569                                 } while (horicnt & 0xffff0000);
00570                             }
00571                         }
00572 
00573                         src++;
00574                     }
00575                     src-=sw;
00576                     vertcnt-=0x10000;
00577                     dst = old_dst + dst_pitch;
00578                     old_dst = dst;
00579                     vcnt++;
00580                 } while (vertcnt & 0xffff0000);
00581             }
00582             else {
00583                 do {
00584                     int horicnt = 0x8000;
00585                     register unsigned int SRC;
00586                     if (vaa) {
00587                         
00588                         register bool haa = false;
00589                         while (src < line_end) {
00590                             horicnt+=horifact;
00591                             if (horicnt & 0xffff0000) {
00592                                 
00593                                 if (haa) {
00594                                     *(dst-1) = (SRC + *src) >> 1;
00595                                     haa = false;
00596                                 }
00597 
00598                                 
00599                                 SRC = *src;
00600 
00601                                 
00602                                 *dst = SRC;
00603                                 *(dst-dst_pitch) = (*(dst-dst_pitch) + SRC) >> 1;
00604                                 dst++;
00605                                 horicnt-=0x10000;
00606 
00607                                 
00608                                 if ((haa=(horicnt & 0xffff0000))) {
00609                                     do {
00610                                         *dst = SRC;
00611                                         *(dst-dst_pitch) = (*(dst-dst_pitch) + SRC) >> 1;
00612                                         dst++;
00613                                         horicnt-=0x10000;
00614                                     } while (horicnt & 0xffff0000);
00615                                 }
00616                             }
00617 
00618                             src++;
00619                         }
00620 
00621                         vaa = false;
00622                     }
00623                     else {
00624                         
00625                         register bool haa = false;
00626                         while (src < line_end) {
00627                             horicnt+=horifact;
00628                             if (horicnt & 0xffff0000) {
00629                                 
00630                                 if (haa) {
00631                                     *(dst-1) = (SRC + *src) >> 1;
00632                                     haa = false;
00633                                 }
00634 
00635                                 
00636                                 SRC = *src;
00637 
00638                                 
00639                                 *dst = SRC;
00640                                 dst++;
00641                                 horicnt-=0x10000;
00642 
00643                                 
00644                                 if ((haa=(horicnt & 0xffff0000))) {
00645                                     do {
00646                                         *dst = SRC;
00647                                         dst++;
00648                                         horicnt-=0x10000;
00649                                     } while (horicnt & 0xffff0000);
00650                                 }
00651                             }
00652 
00653                             src++;
00654                         }
00655                     }
00656                     src-=sw;
00657                     vertcnt-=0x10000;
00658                     dst = old_dst + dst_pitch;
00659                     old_dst = dst;
00660                     vcnt++;
00661                 } while (vertcnt & 0xffff0000);
00662             }
00663         }
00664 
00665         
00666         src+=src_pitch;
00667     }
00668 }
00669 
00670 void stretch_byte_buffer(bool h_antialiasing, bool v_antialiasing,
00671                          unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00672                          unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00673     
00674 
00675     if (!h_antialiasing) {
00676         if (!v_antialiasing) {
00677             
00678             stretch_byte_buffer_no_antialiasing(src, src_pitch, src_pitch_pix, src_height, sw, sh,
00679                                                 dst, dst_pitch, dst_pitch_pix, dst_height, dw, dh);
00680         }
00681         else {
00682             
00683             stretch_byte_buffer_v_antialiasing(src, src_pitch, src_pitch_pix, src_height, sw, sh,
00684                                                dst, dst_pitch, dst_pitch_pix, dst_height, dw, dh);
00685         }
00686     }
00687     else {
00688         if (!v_antialiasing) {
00689             
00690             stretch_byte_buffer_h_antialiasing(src, src_pitch, src_pitch_pix, src_height, sw, sh,
00691                                                dst, dst_pitch, dst_pitch_pix, dst_height, dw, dh);
00692         }
00693         else {
00694             
00695             stretch_byte_buffer_hv_antialiasing(src, src_pitch, src_pitch_pix, src_height, sw, sh,
00696                                                 dst, dst_pitch, dst_pitch_pix, dst_height, dw, dh);
00697         }
00698     }
00699 }
00700 
00701 
00702 void compress_2x2_matrix(unsigned char *src, int src_pitch, int src_pitch_pix, int src_height, int sw, int sh,
00703                          unsigned char *dst, int dst_pitch, int dst_pitch_pix, int dst_height, int dw, int dh) {
00704     
00705     unsigned char *src_end = src + src_pitch_pix * sh;
00706     if (src_end > src + src_pitch_pix * src_height)
00707         src_end = src + src_pitch_pix * src_height;
00708     unsigned char *dst_end = dst + dst_pitch_pix * dst_height;
00709 
00710     
00711     sw &= 0xfffffffe;
00712     sh &= 0xfffffffe;
00713     int src_pitch_diff = (src_pitch_pix << 1) - sw;
00714     int dst_pitch_diff = dst_pitch_pix - (sw >> 1);
00715 
00716     
00717     while ((src < src_end)&&(dst < dst_end)) {
00718         
00719         unsigned char *line_end = src + sw;
00720         while (src < line_end) {
00721             int d = (int)*src + (int)src[1] + (int)src[src_pitch_pix] + (int)src[src_pitch_pix+1];
00722             *dst = d >> 2;
00723             src+=2;
00724             dst++;
00725         }
00726 
00727         
00728         src += src_pitch_diff;
00729         dst += dst_pitch_diff;
00730     }
00731 }
00732 
00733 void stretch_uint_buffer(bool h_antialiasing, bool v_antialiasing,
00734                          unsigned int *src, int src_pitch, int src_pitch_pix,
00735                          int src_height, int sx, int sy, int sw, int sh,
00736                          unsigned int *dst, int dst_pitch, int dst_pitch_pix,
00737                          int dst_height, int dx, int dy, int dw, int dh) {
00738 
00739     
00740     src = src + sx + sy * src_pitch_pix;
00741     dst = dst + dx + dy * dst_pitch_pix;
00742 
00743     
00744     unsigned int *src_end = src + src_pitch_pix * sh;
00745     if (src_end > src + src_pitch_pix * src_height)
00746         src_end = src + src_pitch_pix * src_height;
00747     unsigned int *dst_end = dst + dst_pitch_pix * dst_height;
00748 
00749     
00750     int start_vertcnt = 0x8000;
00751     int start_horicnt = 0x8000;
00752     bool vbreak = false;
00753     bool hbreak = false;
00754     int vertfact = (dh<<16)/sh;
00755     int horifact = (dw<<16)/sw;
00756 
00757     if (vertfact <= 0) {
00758         
00759         vertfact = (dst_height<<16)/src_height;
00760 
00761         
00762         for (int i=0, j=0; i<sy; i++) {
00763             start_vertcnt+=vertfact;
00764             if (start_vertcnt & 0xffff0000) {
00765                 do {
00766                     j++;
00767                     if (j > dy) {
00768                         vbreak = true;
00769                         break;
00770                     }
00771                     start_vertcnt-=0x10000;
00772                 } while (start_vertcnt & 0xffff0000);
00773             }
00774             if (vbreak) break;
00775         }
00776     }
00777 
00778     if (horifact <= 0) {
00779         
00780         horifact = (dst_pitch_pix<<16)/src_pitch_pix;
00781 
00782         
00783         for (int i=0, j=0; i<sx; i++) {
00784             start_horicnt+=horifact;
00785             if (start_horicnt & 0xffff0000) {
00786                 do {
00787                     j++;
00788                     if (j > dx) {
00789                         hbreak = true;
00790                         break;
00791                     }
00792                     start_horicnt-=0x10000;
00793                 } while (start_horicnt & 0xffff0000);
00794             }
00795             if (hbreak) break;
00796         }
00797     }
00798 
00799     if ((!vbreak)&&(!hbreak)) {
00800         
00801         int vertcnt = start_vertcnt;
00802         while ((src < src_end)&&(dst < dst_end)) {
00803             
00804             vertcnt+=vertfact;
00805             if (vertcnt & 0xffff0000) {
00806                 unsigned int *line_end = src + sw;
00807                 unsigned int *old_dst = dst;
00808 
00809                 do {
00810                     int horicnt = start_horicnt;
00811                     while (src < line_end) {
00812                         horicnt+=horifact;
00813                         if (horicnt & 0xffff0000) {
00814                             register unsigned int SRC  = *src;
00815 
00816                             do {
00817                                 *dst = SRC;
00818                                 dst++;
00819                                 horicnt-=0x10000;
00820                             } while (horicnt & 0xffff0000);
00821                         }
00822 
00823                         src++;
00824                     }
00825                     src-=sw;
00826                     vertcnt-=0x10000;
00827                     dst = old_dst + dst_pitch_pix;
00828                     old_dst = dst;
00829                 } while (vertcnt & 0xffff0000);
00830             }
00831 
00832             
00833             src+=src_pitch_pix;
00834         }
00835     }
00836     else {
00837         
00838         int vertcnt = start_vertcnt;
00839         while ((src < src_end)&&(dst < dst_end)) {
00840             
00841             if (vbreak) {
00842                 vbreak = false;
00843                 src-= src_pitch_pix;
00844             }
00845             else
00846                 vertcnt+=vertfact;
00847 
00848             if (vertcnt & 0xffff0000) {
00849                 unsigned int *line_end = src + sw;
00850                 unsigned int *old_dst = dst;
00851 
00852                 do {
00853                     int horicnt = start_horicnt;
00854                     bool hb = hbreak;
00855                     while (src < line_end) {
00856                         if (hb) {
00857                             hb = false;
00858                             src--;
00859                         }
00860                         else
00861                             horicnt+=horifact;
00862 
00863                         if (horicnt & 0xffff0000) {
00864                             register unsigned int SRC  = *src;
00865 
00866                             do {
00867                                 *dst = SRC;
00868                                 dst++;
00869                                 horicnt-=0x10000;
00870                             } while (horicnt & 0xffff0000);
00871                         }
00872 
00873                         src++;
00874                     }
00875                     src-=sw;
00876                     vertcnt-=0x10000;
00877                     dst = old_dst + dst_pitch_pix;
00878                     old_dst = dst;
00879                 } while (vertcnt & 0xffff0000);
00880             }
00881 
00882             
00883             src+=src_pitch_pix;
00884         }
00885     }
00886 }
00887 
00888 void stretch_usint_buffer(bool h_antialiasing, bool v_antialiasing,
00889                           unsigned short int *src, int src_pitch, int src_pitch_pix,
00890                           int src_height, int sx, int sy, int sw, int sh,
00891                           unsigned short int *dst, int dst_pitch, int dst_pitch_pix,
00892                           int dst_height, int dx, int dy, int dw, int dh) {
00893 
00894     
00895     src = src + sx + sy * src_pitch_pix;
00896     dst = dst + dx + dy * dst_pitch_pix;
00897 
00898     
00899     unsigned short int *src_end = src + src_pitch_pix * sh;
00900     if (src_end > src + src_pitch_pix * src_height)
00901         src_end = src + src_pitch_pix * src_height;
00902     unsigned short int *dst_end = dst + dst_pitch_pix * dst_height;
00903 
00904     
00905     int start_vertcnt = 0x8000;
00906     int start_horicnt = 0x8000;
00907     bool vbreak = false;
00908     bool hbreak = false;
00909     int vertfact = (dh<<16)/sh;
00910     int horifact = (dw<<16)/sw;
00911 
00912     if (vertfact <= 0) {
00913         
00914         vertfact = (dst_height<<16)/src_height;
00915 
00916         
00917         for (int i=0, j=0; i<sy; i++) {
00918             start_vertcnt+=vertfact;
00919             if (start_vertcnt & 0xffff0000) {
00920                 do {
00921                     j++;
00922                     if (j > dy) {
00923                         vbreak = true;
00924                         break;
00925                     }
00926                     start_vertcnt-=0x10000;
00927                 } while (start_vertcnt & 0xffff0000);
00928             }
00929             if (vbreak) break;
00930         }
00931     }
00932 
00933     if (horifact <= 0) {
00934         
00935         horifact = (dst_pitch_pix<<16)/src_pitch_pix;
00936 
00937         
00938         for (int i=0, j=0; i<sx; i++) {
00939             start_horicnt+=horifact;
00940             if (start_horicnt & 0xffff0000) {
00941                 do {
00942                     j++;
00943                     if (j > dx) {
00944                         hbreak = true;
00945                         break;
00946                     }
00947                     start_horicnt-=0x10000;
00948                 } while (start_horicnt & 0xffff0000);
00949             }
00950             if (hbreak) break;
00951         }
00952     }
00953 
00954     if ((!vbreak)&&(!hbreak)) {
00955         
00956         int vertcnt = start_vertcnt;
00957         while ((src < src_end)&&(dst < dst_end)) {
00958             
00959             vertcnt+=vertfact;
00960             if (vertcnt & 0xffff0000) {
00961                 unsigned short int *line_end = src + sw;
00962                 unsigned short int *old_dst = dst;
00963 
00964                 do {
00965                     int horicnt = start_horicnt;
00966                     while (src < line_end) {
00967                         horicnt+=horifact;
00968                         if (horicnt & 0xffff0000) {
00969                             register unsigned short int SRC  = *src;
00970 
00971                             do {
00972                                 *dst = SRC;
00973                                 dst++;
00974                                 horicnt-=0x10000;
00975                             } while (horicnt & 0xffff0000);
00976                         }
00977 
00978                         src++;
00979                     }
00980                     src-=sw;
00981                     vertcnt-=0x10000;
00982                     dst = old_dst + dst_pitch_pix;
00983                     old_dst = dst;
00984                 } while (vertcnt & 0xffff0000);
00985             }
00986 
00987             
00988             src+=src_pitch_pix;
00989         }
00990     }
00991     else {
00992         
00993         int vertcnt = start_vertcnt;
00994         while ((src < src_end)&&(dst < dst_end)) {
00995             
00996             if (vbreak) {
00997                 vbreak = false;
00998                 src-= src_pitch_pix;
00999             }
01000             else
01001                 vertcnt+=vertfact;
01002 
01003             if (vertcnt & 0xffff0000) {
01004                 unsigned short int *line_end = src + sw;
01005                 unsigned short int *old_dst = dst;
01006 
01007                 do {
01008                     int horicnt = start_horicnt;
01009                     bool hb = hbreak;
01010                     while (src < line_end) {
01011                         if (hb) {
01012                             hb = false;
01013                             src--;
01014                         }
01015                         else
01016                             horicnt+=horifact;
01017 
01018                         if (horicnt & 0xffff0000) {
01019                             register unsigned short int SRC  = *src;
01020 
01021                             do {
01022                                 *dst = SRC;
01023                                 dst++;
01024                                 horicnt-=0x10000;
01025                             } while (horicnt & 0xffff0000);
01026                         }
01027 
01028                         src++;
01029                     }
01030                     src-=sw;
01031                     vertcnt-=0x10000;
01032                     dst = old_dst + dst_pitch_pix;
01033                     old_dst = dst;
01034                 } while (vertcnt & 0xffff0000);
01035             }
01036 
01037             
01038             src+=src_pitch_pix;
01039         }
01040     }
01041 }
01042 
01043 
01044 
01045 void stretch_324byte_buffer(bool h_antialiasing, bool v_antialiasing,
01046                             unsigned char *src, int src_pitch, int src_pitch_pix,
01047                             int src_height, int sx, int sy, int sw, int sh,
01048                             unsigned int *dst, int dst_pitch, int dst_pitch_pix,
01049                             int dst_height, int dx, int dy, int dw, int dh) {
01050 
01051     
01052     src = src + (sx + sy * src_pitch_pix) * 3;
01053     dst = dst + dx + dy * dst_pitch_pix;
01054 
01055     
01056     unsigned char *src_end = src + (src_pitch_pix * sh) * 3;
01057     if (src_end > src + (src_pitch_pix * src_height) * 3)
01058         src_end = src + (src_pitch_pix * src_height) * 3;
01059     unsigned int *dst_end = dst + dst_pitch_pix * dst_height;
01060 
01061     
01062     int start_vertcnt = 0x8000;
01063     int start_horicnt = 0x8000;
01064     bool vbreak = false;
01065     bool hbreak = false;
01066     int vertfact = (dh<<16)/sh;
01067     int horifact = (dw<<16)/sw;
01068     int sww = sw * 3;
01069     int spp = src_pitch_pix * 3;
01070 
01071     if (vertfact <= 0) {
01072         
01073         vertfact = (dst_height<<16)/src_height;
01074 
01075         
01076         for (int i=0, j=0; i<sy; i++) {
01077             start_vertcnt+=vertfact;
01078             if (start_vertcnt & 0xffff0000) {
01079                 do {
01080                     j++;
01081                     if (j > dy) {
01082                         vbreak = true;
01083                         break;
01084                     }
01085                     start_vertcnt-=0x10000;
01086                 } while (start_vertcnt & 0xffff0000);
01087             }
01088             if (vbreak) break;
01089         }
01090     }
01091 
01092     if (horifact <= 0) {
01093         
01094         horifact = (dst_pitch_pix<<16)/src_pitch_pix;
01095 
01096         
01097         for (int i=0, j=0; i<sx; i++) {
01098             start_horicnt+=horifact;
01099             if (start_horicnt & 0xffff0000) {
01100                 do {
01101                     j++;
01102                     if (j > dx) {
01103                         hbreak = true;
01104                         break;
01105                     }
01106                     start_horicnt-=0x10000;
01107                 } while (start_horicnt & 0xffff0000);
01108             }
01109             if (hbreak) break;
01110         }
01111     }
01112 
01113     if ((!vbreak)&&(!hbreak)) {
01114         
01115         int vertcnt = start_vertcnt;
01116         while ((src < src_end)&&(dst < dst_end)) {
01117             
01118             vertcnt+=vertfact;
01119             if (vertcnt & 0xffff0000) {
01120                 unsigned char *line_end = src + sww;
01121                 unsigned int *old_dst = dst;
01122 
01123                 do {
01124                     int horicnt = start_horicnt;
01125                     while (src < line_end) {
01126                         horicnt+=horifact;
01127                         if (horicnt & 0xffff0000) {
01128                             register unsigned int SRC  = 0xff000000 | ((*src)<<16) | ((*(src+1))<<8) | *(src+2);
01129 
01130                             do {
01131                                 *dst = SRC;
01132                                 dst++;
01133                                 horicnt-=0x10000;
01134                             } while (horicnt & 0xffff0000);
01135                         }
01136 
01137                         src+=3;
01138                     }
01139                     src-=sww;
01140                     vertcnt-=0x10000;
01141                     dst = old_dst + dst_pitch_pix;
01142                     old_dst = dst;
01143                 } while (vertcnt & 0xffff0000);
01144             }
01145 
01146             
01147             src+=spp;
01148         }
01149     }
01150     else {
01151         
01152         int vertcnt = start_vertcnt;
01153         while ((src < src_end)&&(dst < dst_end)) {
01154             
01155             if (vbreak) {
01156                 vbreak = false;
01157                 src-= spp;
01158             }
01159             else
01160                 vertcnt+=vertfact;
01161 
01162             if (vertcnt & 0xffff0000) {
01163                 unsigned char *line_end = src + sww;
01164                 unsigned int *old_dst = dst;
01165 
01166                 do {
01167                     int horicnt = start_horicnt;
01168                     bool hb = hbreak;
01169                     while (src < line_end) {
01170                         if (hb) {
01171                             hb = false;
01172                             src-=3;
01173                         }
01174                         else
01175                             horicnt+=horifact;
01176 
01177                         if (horicnt & 0xffff0000) {
01178                             register unsigned int SRC  = 0xff000000 | ((*src)<<16) | ((*(src+1))<<8) | *(src+2);
01179 
01180                             do {
01181                                 *dst = SRC;
01182                                 dst++;
01183                                 horicnt-=0x10000;
01184                             } while (horicnt & 0xffff0000);
01185                         }
01186 
01187                         src+=3;
01188                     }
01189                     src-=sww;
01190                     vertcnt-=0x10000;
01191                     dst = old_dst + dst_pitch_pix;
01192                     old_dst = dst;
01193                 } while (vertcnt & 0xffff0000);
01194             }
01195 
01196             
01197             src+=spp;
01198         }
01199     }
01200 }
01201 
01202 
01203 void mmsfb_blit_uint(MMSFBSurfacePlanes *src_planes, int src_height, int sx, int sy, int sw, int sh,
01204                      MMSFBSurfacePlanes *dst_planes, int dst_height, int dx, int dy) {
01205 
01206     
01207     unsigned int *src = (unsigned int *)src_planes->ptr;
01208     int src_pitch = src_planes->pitch;
01209 
01210     
01211     unsigned int *dst = (unsigned int *)dst_planes->ptr;
01212     int dst_pitch = dst_planes->pitch;
01213 
01214     
01215     int src_pitch_pix = src_pitch >> 2;
01216     int dst_pitch_pix = dst_pitch >> 2;
01217     src+= sx + sy * src_pitch_pix;
01218     dst+= dx + dy * dst_pitch_pix;
01219 
01220     
01221     if (dst_pitch_pix - dx < sw - sx)
01222         sw = dst_pitch_pix - dx - sx;
01223     if (dst_height - dy < sh - sy)
01224         sh = dst_height - dy - sy;
01225     if ((sw <= 0)||(sh <= 0))
01226         return;
01227 
01228     unsigned int *src_end = src + src_pitch_pix * sh;
01229 
01230     
01231     while (src < src_end) {
01232         
01233         memcpy(dst, src, sw << 2);
01234 
01235         
01236         src+= src_pitch_pix;
01237         dst+= dst_pitch_pix;
01238     }
01239 }
01240 
01241 void mmsfb_blit_usint(MMSFBSurfacePlanes *src_planes, int src_height, int sx, int sy, int sw, int sh,
01242                       MMSFBSurfacePlanes *dst_planes, int dst_height, int dx, int dy) {
01243 
01244     
01245     unsigned short int *src = (unsigned short int *)src_planes->ptr;
01246     int src_pitch = src_planes->pitch;
01247 
01248     
01249     unsigned short int *dst = (unsigned short int *)dst_planes->ptr;
01250     int dst_pitch = dst_planes->pitch;
01251 
01252     
01253     int src_pitch_pix = src_pitch >> 1;
01254     int dst_pitch_pix = dst_pitch >> 1;
01255     src+= sx + sy * src_pitch_pix;
01256     dst+= dx + dy * dst_pitch_pix;
01257 
01258     
01259     if (dst_pitch_pix - dx < sw - sx)
01260         sw = dst_pitch_pix - dx - sx;
01261     if (dst_height - dy < sh - sy)
01262         sh = dst_height - dy - sy;
01263     if ((sw <= 0)||(sh <= 0))
01264         return;
01265 
01266     unsigned short int *src_end = src + src_pitch_pix * sh;
01267 
01268     
01269     while (src < src_end) {
01270         
01271         memcpy(dst, src, sw << 1);
01272 
01273         
01274         src+= src_pitch_pix;
01275         dst+= dst_pitch_pix;
01276     }
01277 }
01278