home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Freeware / Utilitare / VisualBoyAdvance-1.7.2 / src / 2xSaI.cpp next >
Encoding:
C/C++ Source or Header  |  2004-01-25  |  38.6 KB  |  1,275 lines

  1. #include "System.h"
  2. #include "Port.h"
  3.  
  4. extern "C"
  5. {
  6.  
  7. #ifdef MMX
  8.   void _2xSaILine (u8 *srcPtr, u8 *deltaPtr, u32 srcPitch,
  9.                    u32 width, u8 *dstPtr, u32 dstPitch);
  10.   void _2xSaISuperEagleLine (u8 *srcPtr, u8 *deltaPtr,
  11.                              u32 srcPitch, u32 width,
  12.                              u8 *dstPtr, u32 dstPitch);
  13.   void _2xSaISuper2xSaILine (u8 *srcPtr, u8 *deltaPtr,
  14.                              u32 srcPitch, u32 width,
  15.                              u8 *dstPtr, u32 dstPitch);
  16.     void Init_2xSaIMMX (u32 BitFormat);
  17.   void BilinearMMX (u16 * A, u16 * B, u16 * C, u16 * D,
  18.                     u16 * dx, u16 * dy, u8 *dP);
  19.   void BilinearMMXGrid0 (u16 * A, u16 * B, u16 * C, u16 * D,
  20.                          u16 * dx, u16 * dy, u8 *dP);
  21.   void BilinearMMXGrid1 (u16 * A, u16 * B, u16 * C, u16 * D,
  22.                          u16 * dx, u16 * dy, u8 *dP);
  23.   void EndMMX ();
  24.   
  25.   bool cpu_mmx = 1;
  26. #endif
  27. static u32 colorMask = 0xF7DEF7DE;
  28. static u32 lowPixelMask = 0x08210821;
  29. static u32 qcolorMask = 0xE79CE79C;
  30. static u32 qlowpixelMask = 0x18631863;
  31. static u32 redblueMask = 0xF81F;
  32. static u32 greenMask = 0x7E0;
  33.  
  34. u32 qRGB_COLOR_MASK[2] = { 0xF7DEF7DE, 0xF7DEF7DE };
  35.  
  36. extern void hq2x_init(unsigned);
  37.  
  38. int Init_2xSaI(u32 BitFormat)
  39. {
  40.   if(systemColorDepth == 16) {
  41.     if (BitFormat == 565) {
  42.       colorMask = 0xF7DEF7DE;
  43.       lowPixelMask = 0x08210821;
  44.       qcolorMask = 0xE79CE79C;
  45.       qlowpixelMask = 0x18631863;
  46.       redblueMask = 0xF81F;
  47.       greenMask = 0x7E0;
  48.       qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xF7DEF7DE;
  49.       hq2x_init(16);
  50.     } else if (BitFormat == 555) {
  51.       colorMask = 0x7BDE7BDE;
  52.       lowPixelMask = 0x04210421;
  53.       qcolorMask = 0x739C739C;
  54.       qlowpixelMask = 0x0C630C63;
  55.       redblueMask = 0x7C1F;
  56.       greenMask = 0x3E0;
  57.       qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0x7BDE7BDE;
  58.       hq2x_init(15);
  59.     } else {
  60.       return 0;
  61.     }
  62.   } else if(systemColorDepth == 32) {
  63.     colorMask = 0xfefefe;
  64.     lowPixelMask = 0x010101;
  65.     qcolorMask = 0xfcfcfc;
  66.     qlowpixelMask = 0x030303;
  67.     qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xfefefe;
  68.     hq2x_init(32);
  69.   } else
  70.     return 0;
  71.  
  72. #ifdef MMX
  73.     Init_2xSaIMMX (BitFormat);
  74. #endif
  75.   
  76.   return 1;
  77. }
  78.  
  79. static inline int GetResult1 (u32 A, u32 B, u32 C, u32 D,
  80.                               u32 /* E */)
  81. {
  82.     int x = 0;
  83.     int y = 0;
  84.     int r = 0;
  85.  
  86.     if (A == C)
  87.       x += 1;
  88.     else if (B == C)
  89.       y += 1;
  90.     if (A == D)
  91.       x += 1;
  92.     else if (B == D)
  93.       y += 1;
  94.     if (x <= 1)
  95.       r += 1;
  96.     if (y <= 1)
  97.       r -= 1;
  98.     return r;
  99. }
  100.  
  101. static inline int GetResult2 (u32 A, u32 B, u32 C, u32 D,
  102.                               u32 /* E */)
  103. {
  104.   int x = 0;
  105.   int y = 0;
  106.   int r = 0;
  107.   
  108.   if (A == C)
  109.     x += 1;
  110.   else if (B == C)
  111.     y += 1;
  112.   if (A == D)
  113.     x += 1;
  114.   else if (B == D)
  115.     y += 1;
  116.   if (x <= 1)
  117.     r -= 1;
  118.   if (y <= 1)
  119.     r += 1;
  120.   return r;
  121. }
  122.  
  123. static inline int GetResult (u32 A, u32 B, u32 C, u32 D)
  124. {
  125.   int x = 0;
  126.   int y = 0;
  127.   int r = 0;
  128.   
  129.   if (A == C)
  130.     x += 1;
  131.   else if (B == C)
  132.     y += 1;
  133.   if (A == D)
  134.     x += 1;
  135.   else if (B == D)
  136.     y += 1;
  137.   if (x <= 1)
  138.     r += 1;
  139.   if (y <= 1)
  140.     r -= 1;
  141.   return r;
  142. }
  143.  
  144. static inline u32 INTERPOLATE (u32 A, u32 B)
  145. {
  146.   if (A != B) {
  147.     return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) +
  148.             (A & B & lowPixelMask));
  149.   } else
  150.     return A;
  151. }
  152.  
  153. static inline u32 Q_INTERPOLATE (u32 A, u32 B, u32 C, u32 D)
  154. {
  155.   register u32 x = ((A & qcolorMask) >> 2) +
  156.     ((B & qcolorMask) >> 2) +
  157.     ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2);
  158.   register u32 y = (A & qlowpixelMask) +
  159.     (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask);
  160.   
  161.   y = (y >> 2) & qlowpixelMask;
  162.   return x + y;
  163. }
  164.  
  165. static inline int GetResult1_32 (u32 A, u32 B, u32 C, u32 D,
  166.                                  u32 /* E */)
  167. {
  168.     int x = 0;
  169.     int y = 0;
  170.     int r = 0;
  171.  
  172.     if (A == C)
  173.       x += 1;
  174.     else if (B == C)
  175.       y += 1;
  176.     if (A == D)
  177.       x += 1;
  178.     else if (B == D)
  179.       y += 1;
  180.     if (x <= 1)
  181.       r += 1;
  182.     if (y <= 1)
  183.       r -= 1;
  184.     return r;
  185. }
  186.  
  187. static inline int GetResult2_32 (u32 A, u32 B, u32 C, u32 D,
  188.                                  u32 /* E */)
  189. {
  190.   int x = 0;
  191.   int y = 0;
  192.   int r = 0;
  193.   
  194.   if (A == C)
  195.     x += 1;
  196.   else if (B == C)
  197.     y += 1;
  198.   if (A == D)
  199.     x += 1;
  200.   else if (B == D)
  201.     y += 1;
  202.   if (x <= 1)
  203.     r -= 1;
  204.   if (y <= 1)
  205.     r += 1;
  206.   return r;
  207. }
  208.  
  209. #define BLUE_MASK565 0x001F001F
  210. #define RED_MASK565 0xF800F800
  211. #define GREEN_MASK565 0x07E007E0
  212.  
  213. #define BLUE_MASK555 0x001F001F
  214. #define RED_MASK555 0x7C007C00
  215. #define GREEN_MASK555 0x03E003E0
  216.  
  217. void Super2xSaI (u8 *srcPtr, u32 srcPitch,
  218.                  u8 *deltaPtr, u8 *dstPtr, u32 dstPitch,
  219.                  int width, int height)
  220. {
  221.   u16 *bP;
  222.   u8  *dP;
  223.   u32 inc_bP;
  224.   u32 Nextline = srcPitch >> 1;
  225. #ifdef MMX
  226.   if (cpu_mmx) {
  227.     for (; height; height--) {
  228.       _2xSaISuper2xSaILine (srcPtr, deltaPtr, srcPitch, width,
  229.                             dstPtr, dstPitch);
  230.       srcPtr += srcPitch;
  231.       dstPtr += dstPitch * 2;
  232.       deltaPtr += srcPitch;
  233.     }
  234.   } else
  235. #endif
  236.     {
  237.       inc_bP = 1;
  238.       
  239.       for (; height; height--) {
  240.         bP = (u16 *) srcPtr;
  241.         dP = (u8 *) dstPtr;
  242.         
  243.         for (u32 finish = width; finish; finish -= inc_bP) {
  244.           u32 color4, color5, color6;
  245.           u32 color1, color2, color3;
  246.           u32 colorA0, colorA1, colorA2, colorA3,
  247.             colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
  248.           u32 product1a, product1b, product2a, product2b;
  249.           
  250.           //---------------------------------------    B1 B2
  251.           //                                         4  5  6 S2
  252.           //                                         1  2  3 S1
  253.           //                                           A1 A2
  254.           
  255.           colorB0 = *(bP - Nextline - 1);
  256.           colorB1 = *(bP - Nextline);
  257.           colorB2 = *(bP - Nextline + 1);
  258.           colorB3 = *(bP - Nextline + 2);
  259.           
  260.           color4 = *(bP - 1);
  261.           color5 = *(bP);
  262.           color6 = *(bP + 1);
  263.           colorS2 = *(bP + 2);
  264.           
  265.           color1 = *(bP + Nextline - 1);
  266.           color2 = *(bP + Nextline);
  267.           color3 = *(bP + Nextline + 1);
  268.           colorS1 = *(bP + Nextline + 2);
  269.           
  270.           colorA0 = *(bP + Nextline + Nextline - 1);
  271.           colorA1 = *(bP + Nextline + Nextline);
  272.           colorA2 = *(bP + Nextline + Nextline + 1);
  273.           colorA3 = *(bP + Nextline + Nextline + 2);
  274.           
  275.           //--------------------------------------
  276.           if (color2 == color6 && color5 != color3) {
  277.             product2b = product1b = color2;
  278.           } else if (color5 == color3 && color2 != color6) {
  279.             product2b = product1b = color5;
  280.           } else if (color5 == color3 && color2 == color6) {
  281.             register int r = 0;
  282.             
  283.             r += GetResult (color6, color5, color1, colorA1);
  284.             r += GetResult (color6, color5, color4, colorB1);
  285.             r += GetResult (color6, color5, colorA2, colorS1);
  286.             r += GetResult (color6, color5, colorB2, colorS2);
  287.             
  288.             if (r > 0)
  289.               product2b = product1b = color6;
  290.             else if (r < 0)
  291.               product2b = product1b = color5;
  292.             else {
  293.               product2b = product1b = INTERPOLATE (color5, color6);
  294.             }
  295.           } else {
  296.             if (color6 == color3 && color3 == colorA1
  297.                 && color2 != colorA2 && color3 != colorA0)
  298.               product2b =
  299.                 Q_INTERPOLATE (color3, color3, color3, color2);
  300.             else if (color5 == color2 && color2 == colorA2
  301.                      && colorA1 != color3 && color2 != colorA3)
  302.               product2b =
  303.                 Q_INTERPOLATE (color2, color2, color2, color3);
  304.             else
  305.               product2b = INTERPOLATE (color2, color3);
  306.             
  307.             if (color6 == color3 && color6 == colorB1
  308.                 && color5 != colorB2 && color6 != colorB0)
  309.               product1b =
  310.                 Q_INTERPOLATE (color6, color6, color6, color5);
  311.             else if (color5 == color2 && color5 == colorB2
  312.                      && colorB1 != color6 && color5 != colorB3)
  313.               product1b =
  314.                 Q_INTERPOLATE (color6, color5, color5, color5);
  315.             else
  316.               product1b = INTERPOLATE (color5, color6);
  317.           }
  318.           
  319.           if (color5 == color3 && color2 != color6 && color4 == color5
  320.               && color5 != colorA2)
  321.             product2a = INTERPOLATE (color2, color5);
  322.           else
  323.             if (color5 == color1 && color6 == color5
  324.                 && color4 != color2 && color5 != colorA0)
  325.               product2a = INTERPOLATE (color2, color5);
  326.             else
  327.               product2a = color2;
  328.           
  329.           if (color2 == color6 && color5 != color3 && color1 == color2
  330.               && color2 != colorB2)
  331.             product1a = INTERPOLATE (color2, color5);
  332.           else
  333.             if (color4 == color2 && color3 == color2
  334.                 && color1 != color5 && color2 != colorB0)
  335.               product1a = INTERPOLATE (color2, color5);
  336.             else
  337.               product1a = color5;
  338.           
  339. #ifdef WORDS_BIGENDIAN
  340.           product1a = (product1a << 16) | product1b;
  341.           product2a = (product2a << 16) | product2b;
  342. #else
  343.           product1a = product1a | (product1b << 16);
  344.           product2a = product2a | (product2b << 16);
  345. #endif
  346.           
  347.           *((u32 *) dP) = product1a;
  348.           *((u32 *) (dP + dstPitch)) = product2a;
  349.           
  350.           bP += inc_bP;
  351.           dP += sizeof (u32);
  352.         }                       // end of for ( finish= width etc..)
  353.         
  354.         srcPtr   += srcPitch;
  355.         dstPtr   += dstPitch << 1;
  356.         deltaPtr += srcPitch;
  357.       }                 // endof: for (; height; height--)
  358.     }
  359. }
  360.  
  361. void Super2xSaI32 (u8 *srcPtr, u32 srcPitch,
  362.                    u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch,
  363.                    int width, int height)
  364. {
  365.   u32 *bP;
  366.   u32 *dP;
  367.   u32 inc_bP;
  368.   u32 Nextline = srcPitch >> 2;
  369.   inc_bP = 1;
  370.   
  371.   for (; height; height--) {
  372.     bP = (u32 *) srcPtr;
  373.     dP = (u32 *) dstPtr;
  374.     
  375.     for (u32 finish = width; finish; finish -= inc_bP) {
  376.       u32 color4, color5, color6;
  377.       u32 color1, color2, color3;
  378.       u32 colorA0, colorA1, colorA2, colorA3,
  379.         colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
  380.       u32 product1a, product1b, product2a, product2b;
  381.       
  382.       //---------------------------------------    B1 B2
  383.       //                                         4  5  6 S2
  384.       //                                         1  2  3 S1
  385.       //                                           A1 A2
  386.       
  387.       colorB0 = *(bP - Nextline - 1);
  388.       colorB1 = *(bP - Nextline);
  389.       colorB2 = *(bP - Nextline + 1);
  390.       colorB3 = *(bP - Nextline + 2);
  391.       
  392.       color4 = *(bP - 1);
  393.       color5 = *(bP);
  394.       color6 = *(bP + 1);
  395.       colorS2 = *(bP + 2);
  396.       
  397.       color1 = *(bP + Nextline - 1);
  398.       color2 = *(bP + Nextline);
  399.       color3 = *(bP + Nextline + 1);
  400.       colorS1 = *(bP + Nextline + 2);
  401.       
  402.       colorA0 = *(bP + Nextline + Nextline - 1);
  403.       colorA1 = *(bP + Nextline + Nextline);
  404.       colorA2 = *(bP + Nextline + Nextline + 1);
  405.       colorA3 = *(bP + Nextline + Nextline + 2);
  406.       
  407.       //--------------------------------------
  408.       if (color2 == color6 && color5 != color3) {
  409.         product2b = product1b = color2;
  410.       } else if (color5 == color3 && color2 != color6) {
  411.         product2b = product1b = color5;
  412.       } else if (color5 == color3 && color2 == color6) {
  413.         register int r = 0;
  414.         
  415.         r += GetResult (color6, color5, color1, colorA1);
  416.         r += GetResult (color6, color5, color4, colorB1);
  417.         r += GetResult (color6, color5, colorA2, colorS1);
  418.         r += GetResult (color6, color5, colorB2, colorS2);
  419.         
  420.         if (r > 0)
  421.           product2b = product1b = color6;
  422.         else if (r < 0)
  423.           product2b = product1b = color5;
  424.         else {
  425.           product2b = product1b = INTERPOLATE (color5, color6);
  426.         }
  427.       } else {
  428.         if (color6 == color3 && color3 == colorA1
  429.             && color2 != colorA2 && color3 != colorA0)
  430.           product2b =
  431.             Q_INTERPOLATE (color3, color3, color3, color2);
  432.         else if (color5 == color2 && color2 == colorA2
  433.                  && colorA1 != color3 && color2 != colorA3)
  434.           product2b =
  435.             Q_INTERPOLATE (color2, color2, color2, color3);
  436.         else
  437.           product2b = INTERPOLATE (color2, color3);
  438.         
  439.         if (color6 == color3 && color6 == colorB1
  440.             && color5 != colorB2 && color6 != colorB0)
  441.           product1b =
  442.             Q_INTERPOLATE (color6, color6, color6, color5);
  443.         else if (color5 == color2 && color5 == colorB2
  444.                  && colorB1 != color6 && color5 != colorB3)
  445.           product1b =
  446.             Q_INTERPOLATE (color6, color5, color5, color5);
  447.         else
  448.           product1b = INTERPOLATE (color5, color6);
  449.       }
  450.       
  451.       if (color5 == color3 && color2 != color6 && color4 == color5
  452.           && color5 != colorA2)
  453.         product2a = INTERPOLATE (color2, color5);
  454.       else
  455.         if (color5 == color1 && color6 == color5
  456.             && color4 != color2 && color5 != colorA0)
  457.           product2a = INTERPOLATE (color2, color5);
  458.         else
  459.           product2a = color2;
  460.       
  461.       if (color2 == color6 && color5 != color3 && color1 == color2
  462.           && color2 != colorB2)
  463.         product1a = INTERPOLATE (color2, color5);
  464.       else
  465.         if (color4 == color2 && color3 == color2
  466.             && color1 != color5 && color2 != colorB0)
  467.           product1a = INTERPOLATE (color2, color5);
  468.         else
  469.           product1a = color5;
  470.       *(dP) = product1a;
  471.       *(dP+1) = product1b;
  472.       *(dP + (dstPitch >> 2)) = product2a;
  473.       *(dP + (dstPitch >> 2) + 1) = product2b;
  474.       
  475.       bP += inc_bP;
  476.       dP += 2;
  477.     }                       // end of for ( finish= width etc..)
  478.         
  479.     srcPtr   += srcPitch;
  480.     dstPtr   += dstPitch << 1;
  481.     //        deltaPtr += srcPitch;
  482.   }                 // endof: for (; height; height--)
  483. }
  484.  
  485. void SuperEagle (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, 
  486.                  u8 *dstPtr, u32 dstPitch, int width, int height)
  487. {
  488.   u8  *dP;
  489.   u16 *bP;
  490.   u16 *xP;
  491.   u32 inc_bP;
  492.  
  493. #ifdef MMX
  494.   if (cpu_mmx) {
  495.     for (; height; height--) {
  496.       _2xSaISuperEagleLine (srcPtr, deltaPtr, srcPitch, width,
  497.                             dstPtr, dstPitch);
  498.       srcPtr += srcPitch;
  499.       dstPtr += dstPitch * 2;
  500.       deltaPtr += srcPitch;
  501.     }
  502.   } else
  503. #endif  
  504.   {
  505.     inc_bP = 1;
  506.     
  507.     u32 Nextline = srcPitch >> 1;
  508.     
  509.     for (; height; height--) {
  510.       bP = (u16 *) srcPtr;
  511.       xP = (u16 *) deltaPtr;
  512.       dP = dstPtr;
  513.       for (u32 finish = width; finish; finish -= inc_bP) {
  514.         u32 color4, color5, color6;
  515.         u32 color1, color2, color3;
  516.         u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
  517.         u32 product1a, product1b, product2a, product2b;
  518.         
  519.         colorB1 = *(bP - Nextline);
  520.         colorB2 = *(bP - Nextline + 1);
  521.         
  522.         color4 = *(bP - 1);
  523.         color5 = *(bP);
  524.         color6 = *(bP + 1);
  525.         colorS2 = *(bP + 2);
  526.         
  527.         color1 = *(bP + Nextline - 1);
  528.         color2 = *(bP + Nextline);
  529.         color3 = *(bP + Nextline + 1);
  530.         colorS1 = *(bP + Nextline + 2);
  531.         
  532.         colorA1 = *(bP + Nextline + Nextline);
  533.         colorA2 = *(bP + Nextline + Nextline + 1);
  534.         
  535.         // --------------------------------------
  536.         if (color2 == color6 && color5 != color3) {
  537.           product1b = product2a = color2;
  538.           if ((color1 == color2) || (color6 == colorB2)) {
  539.             product1a = INTERPOLATE (color2, color5);
  540.             product1a = INTERPOLATE (color2, product1a);
  541.             //                       product1a = color2;
  542.           } else {
  543.             product1a = INTERPOLATE (color5, color6);
  544.           }
  545.           
  546.           if ((color6 == colorS2) || (color2 == colorA1)) {
  547.             product2b = INTERPOLATE (color2, color3);
  548.             product2b = INTERPOLATE (color2, product2b);
  549.             //                       product2b = color2;
  550.           } else {
  551.             product2b = INTERPOLATE (color2, color3);
  552.           }
  553.         } else if (color5 == color3 && color2 != color6) {
  554.           product2b = product1a = color5;
  555.           
  556.           if ((colorB1 == color5) || (color3 == colorS1)) {
  557.             product1b = INTERPOLATE (color5, color6);
  558.             product1b = INTERPOLATE (color5, product1b);
  559.             //                       product1b = color5;
  560.           } else {
  561.             product1b = INTERPOLATE (color5, color6);
  562.           }
  563.           
  564.           if ((color3 == colorA2) || (color4 == color5)) {
  565.             product2a = INTERPOLATE (color5, color2);
  566.             product2a = INTERPOLATE (color5, product2a);
  567.             //                       product2a = color5;
  568.           } else {
  569.             product2a = INTERPOLATE (color2, color3);
  570.           }
  571.           
  572.         } else if (color5 == color3 && color2 == color6) {
  573.           register int r = 0;
  574.           
  575.           r += GetResult (color6, color5, color1, colorA1);
  576.           r += GetResult (color6, color5, color4, colorB1);
  577.           r += GetResult (color6, color5, colorA2, colorS1);
  578.           r += GetResult (color6, color5, colorB2, colorS2);
  579.           
  580.           if (r > 0) {
  581.             product1b = product2a = color2;
  582.             product1a = product2b = INTERPOLATE (color5, color6);
  583.           } else if (r < 0) {
  584.             product2b = product1a = color5;
  585.             product1b = product2a = INTERPOLATE (color5, color6);
  586.           } else {
  587.             product2b = product1a = color5;
  588.             product1b = product2a = color2;
  589.           }
  590.         } else {
  591.           product2b = product1a = INTERPOLATE (color2, color6);
  592.           product2b =
  593.             Q_INTERPOLATE (color3, color3, color3, product2b);
  594.           product1a =
  595.             Q_INTERPOLATE (color5, color5, color5, product1a);
  596.           
  597.           product2a = product1b = INTERPOLATE (color5, color3);
  598.           product2a =
  599.             Q_INTERPOLATE (color2, color2, color2, product2a);
  600.           product1b =
  601.             Q_INTERPOLATE (color6, color6, color6, product1b);
  602.           
  603.           //                    product1a = color5;
  604.           //                    product1b = color6;
  605.           //                    product2a = color2;
  606.           //                    product2b = color3;
  607.         }
  608. #ifdef WORDS_BIGENDIAN
  609.         product1a = (product1a << 16) | product1b;
  610.         product2a = (product2a << 16) | product2b;
  611. #else
  612.         product1a = product1a | (product1b << 16);
  613.         product2a = product2a | (product2b << 16);
  614. #endif
  615.         
  616.         *((u32 *) dP) = product1a;
  617.         *((u32 *) (dP + dstPitch)) = product2a;
  618.         *xP = color5;
  619.         
  620.         bP += inc_bP;
  621.         xP += inc_bP;
  622.         dP += sizeof (u32);
  623.       }                 // end of for ( finish= width etc..)
  624.       
  625.       srcPtr += srcPitch;
  626.       dstPtr += dstPitch << 1;
  627.       deltaPtr += srcPitch;
  628.     }                   // endof: for (height; height; height--)
  629.   }
  630. }
  631.  
  632. void SuperEagle32 (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, 
  633.                    u8 *dstPtr, u32 dstPitch, int width, int height)
  634. {
  635.   u32  *dP;
  636.   u32 *bP;
  637.   u32 *xP;
  638.   u32 inc_bP;
  639.  
  640.   inc_bP = 1;
  641.   
  642.   u32 Nextline = srcPitch >> 2;
  643.     
  644.   for (; height; height--) {
  645.     bP = (u32 *) srcPtr;
  646.     xP = (u32 *) deltaPtr;
  647.     dP = (u32 *)dstPtr;
  648.     for (u32 finish = width; finish; finish -= inc_bP) {
  649.       u32 color4, color5, color6;
  650.       u32 color1, color2, color3;
  651.       u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
  652.       u32 product1a, product1b, product2a, product2b;
  653.       
  654.       colorB1 = *(bP - Nextline);
  655.       colorB2 = *(bP - Nextline + 1);
  656.       
  657.       color4 = *(bP - 1);
  658.       color5 = *(bP);
  659.       color6 = *(bP + 1);
  660.       colorS2 = *(bP + 2);
  661.       
  662.       color1 = *(bP + Nextline - 1);
  663.       color2 = *(bP + Nextline);
  664.       color3 = *(bP + Nextline + 1);
  665.       colorS1 = *(bP + Nextline + 2);
  666.       
  667.       colorA1 = *(bP + Nextline + Nextline);
  668.       colorA2 = *(bP + Nextline + Nextline + 1);
  669.       
  670.       // --------------------------------------
  671.       if (color2 == color6 && color5 != color3) {
  672.         product1b = product2a = color2;
  673.         if ((color1 == color2) || (color6 == colorB2)) {
  674.           product1a = INTERPOLATE (color2, color5);
  675.           product1a = INTERPOLATE (color2, product1a);
  676.           //                       product1a = color2;
  677.         } else {
  678.           product1a = INTERPOLATE (color5, color6);
  679.         }
  680.         
  681.         if ((color6 == colorS2) || (color2 == colorA1)) {
  682.           product2b = INTERPOLATE (color2, color3);
  683.           product2b = INTERPOLATE (color2, product2b);
  684.           //                       product2b = color2;
  685.         } else {
  686.           product2b = INTERPOLATE (color2, color3);
  687.         }
  688.       } else if (color5 == color3 && color2 != color6) {
  689.         product2b = product1a = color5;
  690.         
  691.         if ((colorB1 == color5) || (color3 == colorS1)) {
  692.           product1b = INTERPOLATE (color5, color6);
  693.           product1b = INTERPOLATE (color5, product1b);
  694.           //                       product1b = color5;
  695.         } else {
  696.           product1b = INTERPOLATE (color5, color6);
  697.         }
  698.         
  699.         if ((color3 == colorA2) || (color4 == color5)) {
  700.           product2a = INTERPOLATE (color5, color2);
  701.           product2a = INTERPOLATE (color5, product2a);
  702.           //                       product2a = color5;
  703.         } else {
  704.           product2a = INTERPOLATE (color2, color3);
  705.         }
  706.         
  707.       } else if (color5 == color3 && color2 == color6) {
  708.         register int r = 0;
  709.         
  710.         r += GetResult (color6, color5, color1, colorA1);
  711.         r += GetResult (color6, color5, color4, colorB1);
  712.         r += GetResult (color6, color5, colorA2, colorS1);
  713.         r += GetResult (color6, color5, colorB2, colorS2);
  714.         
  715.         if (r > 0) {
  716.           product1b = product2a = color2;
  717.           product1a = product2b = INTERPOLATE (color5, color6);
  718.         } else if (r < 0) {
  719.           product2b = product1a = color5;
  720.           product1b = product2a = INTERPOLATE (color5, color6);
  721.         } else {
  722.           product2b = product1a = color5;
  723.           product1b = product2a = color2;
  724.         }
  725.       } else {
  726.         product2b = product1a = INTERPOLATE (color2, color6);
  727.         product2b =
  728.           Q_INTERPOLATE (color3, color3, color3, product2b);
  729.         product1a =
  730.           Q_INTERPOLATE (color5, color5, color5, product1a);
  731.         
  732.         product2a = product1b = INTERPOLATE (color5, color3);
  733.         product2a =
  734.           Q_INTERPOLATE (color2, color2, color2, product2a);
  735.         product1b =
  736.           Q_INTERPOLATE (color6, color6, color6, product1b);
  737.         
  738.         //                    product1a = color5;
  739.         //                    product1b = color6;
  740.         //                    product2a = color2;
  741.         //                    product2b = color3;
  742.       }
  743.       *(dP) = product1a;
  744.       *(dP+1) = product1b;
  745.       *(dP + (dstPitch >> 2)) = product2a;
  746.       *(dP + (dstPitch >> 2) +1) = product2b;
  747.       *xP = color5;
  748.       
  749.       bP += inc_bP;
  750.       xP += inc_bP;
  751.       dP += 2;
  752.     }                 // end of for ( finish= width etc..)
  753.       
  754.     srcPtr += srcPitch;
  755.     dstPtr += dstPitch << 1;
  756.     deltaPtr += srcPitch;
  757.   }                   // endof: for (height; height; height--)
  758. }
  759.  
  760. void _2xSaI (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
  761.              u8 *dstPtr, u32 dstPitch, int width, int height)
  762. {
  763.   u8  *dP;
  764.   u16 *bP;
  765.   u32 inc_bP;
  766.   
  767. #ifdef MMX
  768.   if (cpu_mmx) {
  769.     for (; height; height -= 1) {
  770.       _2xSaILine (srcPtr, deltaPtr, srcPitch, width, dstPtr, dstPitch);
  771.       srcPtr += srcPitch;
  772.       dstPtr += dstPitch * 2;
  773.       deltaPtr += srcPitch;
  774.     }
  775.   } else
  776. #endif
  777.   {
  778.     inc_bP = 1;
  779.     
  780.     u32 Nextline = srcPitch >> 1;
  781.     
  782.     for (; height; height--) {
  783.       bP = (u16 *) srcPtr;
  784.       dP = dstPtr;
  785.       
  786.       for (u32 finish = width; finish; finish -= inc_bP) {
  787.         
  788.         register u32 colorA, colorB;
  789.         u32 colorC, colorD,
  790.           colorE, colorF, colorG, colorH,
  791.           colorI, colorJ, colorK, colorL,
  792.           
  793.           colorM, colorN, colorO, colorP;
  794.         u32 product, product1, product2;
  795.         
  796.         //---------------------------------------
  797.         // Map of the pixels:                    I|E F|J
  798.         //                                       G|A B|K
  799.         //                                       H|C D|L
  800.         //                                       M|N O|P
  801.         colorI = *(bP - Nextline - 1);
  802.         colorE = *(bP - Nextline);
  803.         colorF = *(bP - Nextline + 1);
  804.         colorJ = *(bP - Nextline + 2);
  805.         
  806.         colorG = *(bP - 1);
  807.         colorA = *(bP);
  808.         colorB = *(bP + 1);
  809.         colorK = *(bP + 2);
  810.         
  811.         colorH = *(bP + Nextline - 1);
  812.         colorC = *(bP + Nextline);
  813.         colorD = *(bP + Nextline + 1);
  814.         colorL = *(bP + Nextline + 2);
  815.         
  816.         colorM = *(bP + Nextline + Nextline - 1);
  817.         colorN = *(bP + Nextline + Nextline);
  818.         colorO = *(bP + Nextline + Nextline + 1);
  819.         colorP = *(bP + Nextline + Nextline + 2);
  820.         
  821.         if ((colorA == colorD) && (colorB != colorC)) {
  822.           if (((colorA == colorE) && (colorB == colorL)) ||
  823.               ((colorA == colorC) && (colorA == colorF)
  824.                && (colorB != colorE) && (colorB == colorJ))) {
  825.             product = colorA;
  826.           } else {
  827.             product = INTERPOLATE (colorA, colorB);
  828.           }
  829.           
  830.           if (((colorA == colorG) && (colorC == colorO)) ||
  831.               ((colorA == colorB) && (colorA == colorH)
  832.                && (colorG != colorC) && (colorC == colorM))) {
  833.             product1 = colorA;
  834.           } else {
  835.             product1 = INTERPOLATE (colorA, colorC);
  836.           }
  837.           product2 = colorA;
  838.         } else if ((colorB == colorC) && (colorA != colorD)) {
  839.           if (((colorB == colorF) && (colorA == colorH)) ||
  840.               ((colorB == colorE) && (colorB == colorD)
  841.                && (colorA != colorF) && (colorA == colorI))) {
  842.             product = colorB;
  843.           } else {
  844.             product = INTERPOLATE (colorA, colorB);
  845.           }
  846.           
  847.           if (((colorC == colorH) && (colorA == colorF)) ||
  848.               ((colorC == colorG) && (colorC == colorD)
  849.                && (colorA != colorH) && (colorA == colorI))) {
  850.             product1 = colorC;
  851.           } else {
  852.             product1 = INTERPOLATE (colorA, colorC);
  853.           }
  854.           product2 = colorB;
  855.         } else if ((colorA == colorD) && (colorB == colorC)) {
  856.           if (colorA == colorB) {
  857.             product = colorA;
  858.             product1 = colorA;
  859.             product2 = colorA;
  860.           } else {
  861.             register int r = 0;
  862.             
  863.             product1 = INTERPOLATE (colorA, colorC);
  864.             product = INTERPOLATE (colorA, colorB);
  865.             
  866.             r +=
  867.               GetResult1 (colorA, colorB, colorG, colorE,
  868.                           colorI);
  869.             r +=
  870.               GetResult2 (colorB, colorA, colorK, colorF,
  871.                           colorJ);
  872.             r +=
  873.               GetResult2 (colorB, colorA, colorH, colorN,
  874.                           colorM);
  875.             r +=
  876.               GetResult1 (colorA, colorB, colorL, colorO,
  877.                           colorP);
  878.             
  879.             if (r > 0)
  880.               product2 = colorA;
  881.             else if (r < 0)
  882.               product2 = colorB;
  883.             else {
  884.               product2 =
  885.                 Q_INTERPOLATE (colorA, colorB, colorC,
  886.                                colorD);
  887.             }
  888.           }
  889.         } else {
  890.           product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);
  891.           
  892.           if ((colorA == colorC) && (colorA == colorF)
  893.               && (colorB != colorE) && (colorB == colorJ)) {
  894.             product = colorA;
  895.           } else if ((colorB == colorE) && (colorB == colorD)
  896.                      && (colorA != colorF) && (colorA == colorI)) {
  897.             product = colorB;
  898.           } else {
  899.             product = INTERPOLATE (colorA, colorB);
  900.           }
  901.           
  902.           if ((colorA == colorB) && (colorA == colorH)
  903.               && (colorG != colorC) && (colorC == colorM)) {
  904.             product1 = colorA;
  905.           } else if ((colorC == colorG) && (colorC == colorD)
  906.                      && (colorA != colorH) && (colorA == colorI)) {
  907.             product1 = colorC;
  908.           } else {
  909.             product1 = INTERPOLATE (colorA, colorC);
  910.           }
  911.         }
  912.         
  913. #ifdef WORDS_BIGENDIAN
  914.         product = (colorA << 16) | product ;
  915.         product1 = (product1 << 16) | product2 ;
  916. #else
  917.         product = colorA | (product << 16);
  918.         product1 = product1 | (product2 << 16);
  919. #endif
  920.         *((s32 *) dP) = product;
  921.         *((u32 *) (dP + dstPitch)) = product1;
  922.         
  923.         bP += inc_bP;
  924.         dP += sizeof (u32);
  925.       }                 // end of for ( finish= width etc..)
  926.       
  927.       srcPtr += srcPitch;
  928.       dstPtr += dstPitch << 1;
  929.       deltaPtr += srcPitch;
  930.     }                   // endof: for (height; height; height--)
  931.   }
  932. }
  933.  
  934. void _2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
  935.                u8 *dstPtr, u32 dstPitch, int width, int height)
  936. {
  937.   u32  *dP;
  938.   u32 *bP;
  939.   u32 inc_bP = 1;
  940.     
  941.   u32 Nextline = srcPitch >> 2;
  942.     
  943.   for (; height; height--) {
  944.     bP = (u32 *) srcPtr;
  945.     dP = (u32 *) dstPtr;
  946.       
  947.     for (u32 finish = width; finish; finish -= inc_bP) {
  948.       register u32 colorA, colorB;
  949.       u32 colorC, colorD,
  950.         colorE, colorF, colorG, colorH,
  951.         colorI, colorJ, colorK, colorL,
  952.         
  953.         colorM, colorN, colorO, colorP;
  954.       u32 product, product1, product2;
  955.       
  956.       //---------------------------------------
  957.       // Map of the pixels:                    I|E F|J
  958.       //                                       G|A B|K
  959.       //                                       H|C D|L
  960.       //                                       M|N O|P
  961.       colorI = *(bP - Nextline - 1);
  962.       colorE = *(bP - Nextline);
  963.       colorF = *(bP - Nextline + 1);
  964.       colorJ = *(bP - Nextline + 2);
  965.         
  966.       colorG = *(bP - 1);
  967.       colorA = *(bP);
  968.       colorB = *(bP + 1);
  969.       colorK = *(bP + 2);
  970.         
  971.       colorH = *(bP + Nextline - 1);
  972.       colorC = *(bP + Nextline);
  973.       colorD = *(bP + Nextline + 1);
  974.       colorL = *(bP + Nextline + 2);
  975.       
  976.       colorM = *(bP + Nextline + Nextline - 1);
  977.       colorN = *(bP + Nextline + Nextline);
  978.       colorO = *(bP + Nextline + Nextline + 1);
  979.       colorP = *(bP + Nextline + Nextline + 2);
  980.       
  981.       if ((colorA == colorD) && (colorB != colorC)) {
  982.         if (((colorA == colorE) && (colorB == colorL)) ||
  983.             ((colorA == colorC) && (colorA == colorF)
  984.              && (colorB != colorE) && (colorB == colorJ))) {
  985.           product = colorA;
  986.         } else {
  987.           product = INTERPOLATE (colorA, colorB);
  988.         }
  989.           
  990.         if (((colorA == colorG) && (colorC == colorO)) ||
  991.             ((colorA == colorB) && (colorA == colorH)
  992.              && (colorG != colorC) && (colorC == colorM))) {
  993.           product1 = colorA;
  994.         } else {
  995.           product1 = INTERPOLATE (colorA, colorC);
  996.         }
  997.         product2 = colorA;
  998.       } else if ((colorB == colorC) && (colorA != colorD)) {
  999.         if (((colorB == colorF) && (colorA == colorH)) ||
  1000.             ((colorB == colorE) && (colorB == colorD)
  1001.              && (colorA != colorF) && (colorA == colorI))) {
  1002.           product = colorB;
  1003.         } else {
  1004.           product = INTERPOLATE (colorA, colorB);
  1005.         }
  1006.         
  1007.         if (((colorC == colorH) && (colorA == colorF)) ||
  1008.             ((colorC == colorG) && (colorC == colorD)
  1009.              && (colorA != colorH) && (colorA == colorI))) {
  1010.           product1 = colorC;
  1011.         } else {
  1012.           product1 = INTERPOLATE (colorA, colorC);
  1013.         }
  1014.         product2 = colorB;
  1015.       } else if ((colorA == colorD) && (colorB == colorC)) {
  1016.         if (colorA == colorB) {
  1017.           product = colorA;
  1018.           product1 = colorA;
  1019.           product2 = colorA;
  1020.         } else {
  1021.           register int r = 0;
  1022.           
  1023.           product1 = INTERPOLATE (colorA, colorC);
  1024.           product = INTERPOLATE (colorA, colorB);
  1025.           
  1026.           r +=
  1027.             GetResult1 (colorA, colorB, colorG, colorE,
  1028.                         colorI);
  1029.           r +=
  1030.             GetResult2 (colorB, colorA, colorK, colorF,
  1031.                         colorJ);
  1032.           r +=
  1033.             GetResult2 (colorB, colorA, colorH, colorN,
  1034.                            colorM);
  1035.           r +=
  1036.             GetResult1 (colorA, colorB, colorL, colorO,
  1037.                            colorP);
  1038.             
  1039.           if (r > 0)
  1040.             product2 = colorA;
  1041.           else if (r < 0)
  1042.             product2 = colorB;
  1043.           else {
  1044.             product2 =
  1045.               Q_INTERPOLATE (colorA, colorB, colorC,
  1046.                                colorD);
  1047.             }
  1048.         }
  1049.       } else {
  1050.         product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);
  1051.         
  1052.         if ((colorA == colorC) && (colorA == colorF)
  1053.             && (colorB != colorE) && (colorB == colorJ)) {
  1054.           product = colorA;
  1055.         } else if ((colorB == colorE) && (colorB == colorD)
  1056.                    && (colorA != colorF) && (colorA == colorI)) {
  1057.           product = colorB;
  1058.         } else {
  1059.           product = INTERPOLATE (colorA, colorB);
  1060.         }
  1061.         
  1062.         if ((colorA == colorB) && (colorA == colorH)
  1063.             && (colorG != colorC) && (colorC == colorM)) {
  1064.           product1 = colorA;
  1065.         } else if ((colorC == colorG) && (colorC == colorD)
  1066.                    && (colorA != colorH) && (colorA == colorI)) {
  1067.           product1 = colorC;
  1068.         } else {
  1069.           product1 = INTERPOLATE (colorA, colorC);
  1070.         }
  1071.       }
  1072.       *(dP) = colorA;
  1073.       *(dP + 1) = product;
  1074.       *(dP + (dstPitch >> 2)) = product1;
  1075.       *(dP + (dstPitch >> 2) + 1) = product2;
  1076.       
  1077.       bP += inc_bP;
  1078.       dP += 2;
  1079.     }                 // end of for ( finish= width etc..)
  1080.     
  1081.     srcPtr += srcPitch;
  1082.     dstPtr += dstPitch << 1;
  1083.     //    deltaPtr += srcPitch;
  1084.   }                   // endof: for (height; height; height--)
  1085. }
  1086.  
  1087. static u32 Bilinear (u32 A, u32 B, u32 x)
  1088. {
  1089.   unsigned long areaA, areaB;
  1090.   unsigned long result;
  1091.   
  1092.   if (A == B)
  1093.     return A;
  1094.   
  1095.   areaB = (x >> 11) & 0x1f;     // reduce 16 bit fraction to 5 bits
  1096.   areaA = 0x20 - areaB;
  1097.   
  1098.   A = (A & redblueMask) | ((A & greenMask) << 16);
  1099.   B = (B & redblueMask) | ((B & greenMask) << 16);
  1100.   
  1101.   result = ((areaA * A) + (areaB * B)) >> 5;
  1102.   
  1103.   return (result & redblueMask) | ((result >> 16) & greenMask);
  1104. }
  1105.  
  1106. static u32 Bilinear4 (u32 A, u32 B, u32 C, u32 D, u32 x,
  1107.                          u32 y)
  1108. {
  1109.   unsigned long areaA, areaB, areaC, areaD;
  1110.   unsigned long result, xy;
  1111.   
  1112.   x = (x >> 11) & 0x1f;
  1113.   y = (y >> 11) & 0x1f;
  1114.   xy = (x * y) >> 5;
  1115.   
  1116.   A = (A & redblueMask) | ((A & greenMask) << 16);
  1117.   B = (B & redblueMask) | ((B & greenMask) << 16);
  1118.   C = (C & redblueMask) | ((C & greenMask) << 16);
  1119.   D = (D & redblueMask) | ((D & greenMask) << 16);
  1120.   
  1121.   areaA = 0x20 + xy - x - y;
  1122.   areaB = x - xy;
  1123.   areaC = y - xy;
  1124.   areaD = xy;
  1125.   
  1126.   result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5;
  1127.   
  1128.   return (result & redblueMask) | ((result >> 16) & greenMask);
  1129. }
  1130.  
  1131. void Scale_2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
  1132.                   u8 *dstPtr, u32 dstPitch, 
  1133.                   u32 dstWidth, u32 dstHeight, int width, int height)
  1134. {
  1135.   u8  *dP;
  1136.   u16 *bP;
  1137.  
  1138.   u32 w;
  1139.   u32 h;
  1140.   u32 dw;
  1141.   u32 dh;
  1142.   u32 hfinish;
  1143.   u32 wfinish;
  1144.   
  1145.   u32 Nextline = srcPitch >> 1;
  1146.   
  1147.   wfinish = (width - 1) << 16;  // convert to fixed point
  1148.   dw = wfinish / (dstWidth - 1);
  1149.   hfinish = (height - 1) << 16; // convert to fixed point
  1150.   dh = hfinish / (dstHeight - 1);
  1151.   
  1152.   for (h = 0; h < hfinish; h += dh) {
  1153.     u32 y1, y2;
  1154.     
  1155.     y1 = h & 0xffff;    // fraction part of fixed point
  1156.     bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch));
  1157.     dP = dstPtr;
  1158.     y2 = 0x10000 - y1;
  1159.     
  1160.     w = 0;
  1161.     
  1162.     for (; w < wfinish;) {
  1163.       u32 A, B, C, D;
  1164.       u32 E, F, G, H;
  1165.       u32 I, J, K, L;
  1166.       u32 x1, x2, a1, f1, f2;
  1167.       u32 position, product1;
  1168.       
  1169.       position = w >> 16;
  1170.       A = bP[position]; // current pixel
  1171.       B = bP[position + 1];     // next pixel
  1172.       C = bP[position + Nextline];
  1173.       D = bP[position + Nextline + 1];
  1174.       E = bP[position - Nextline];
  1175.       F = bP[position - Nextline + 1];
  1176.       G = bP[position - 1];
  1177.       H = bP[position + Nextline - 1];
  1178.       I = bP[position + 2];
  1179.       J = bP[position + Nextline + 2];
  1180.       K = bP[position + Nextline + Nextline];
  1181.       L = bP[position + Nextline + Nextline + 1];
  1182.       
  1183.       x1 = w & 0xffff;  // fraction part of fixed point
  1184.       x2 = 0x10000 - x1;
  1185.       
  1186.       /*0*/ 
  1187.       if (A == B && C == D && A == C)
  1188.         product1 = A;
  1189.       else /*1*/ if (A == D && B != C) {
  1190.         f1 = (x1 >> 1) + (0x10000 >> 2);
  1191.         f2 = (y1 >> 1) + (0x10000 >> 2);
  1192.         if (y1 <= f1 && A == J && A != E)       // close to B
  1193.           {
  1194.             a1 = f1 - y1;
  1195.             product1 = Bilinear (A, B, a1);
  1196.           } else if (y1 >= f1 && A == G && A != L)      // close to C
  1197.             {
  1198.               a1 = y1 - f1;
  1199.               product1 = Bilinear (A, C, a1);
  1200.             }
  1201.         else if (x1 >= f2 && A == E && A != J)  // close to B
  1202.           {
  1203.             a1 = x1 - f2;
  1204.             product1 = Bilinear (A, B, a1);
  1205.           }
  1206.         else if (x1 <= f2 && A == L && A != G)  // close to C
  1207.           {
  1208.             a1 = f2 - x1;
  1209.             product1 = Bilinear (A, C, a1);
  1210.           }
  1211.         else if (y1 >= x1)      // close to C
  1212.           {
  1213.             a1 = y1 - x1;
  1214.             product1 = Bilinear (A, C, a1);
  1215.           }
  1216.         else if (y1 <= x1)      // close to B
  1217.           {
  1218.             a1 = x1 - y1;
  1219.             product1 = Bilinear (A, B, a1);
  1220.           }
  1221.       }
  1222.       else
  1223.         /*2*/ 
  1224.         if (B == C && A != D)
  1225.           {
  1226.             f1 = (x1 >> 1) + (0x10000 >> 2);
  1227.             f2 = (y1 >> 1) + (0x10000 >> 2);
  1228.             if (y2 >= f1 && B == H && B != F)   // close to A
  1229.               {
  1230.                 a1 = y2 - f1;
  1231.                 product1 = Bilinear (B, A, a1);
  1232.               }
  1233.             else if (y2 <= f1 && B == I && B != K)      // close to D
  1234.               {
  1235.                 a1 = f1 - y2;
  1236.                 product1 = Bilinear (B, D, a1);
  1237.               }
  1238.             else if (x2 >= f2 && B == F && B != H)      // close to A
  1239.               {
  1240.                 a1 = x2 - f2;
  1241.                 product1 = Bilinear (B, A, a1);
  1242.               }
  1243.             else if (x2 <= f2 && B == K && B != I)      // close to D
  1244.               {
  1245.                 a1 = f2 - x2;
  1246.                 product1 = Bilinear (B, D, a1);
  1247.               }
  1248.             else if (y2 >= x1)  // close to A
  1249.               {
  1250.                 a1 = y2 - x1;
  1251.                 product1 = Bilinear (B, A, a1);
  1252.               }
  1253.             else if (y2 <= x1)  // close to D
  1254.               {
  1255.                 a1 = x1 - y2;
  1256.                 product1 = Bilinear (B, D, a1);
  1257.               }
  1258.           }
  1259.       /*3*/
  1260.         else
  1261.           {
  1262.             product1 = Bilinear4 (A, B, C, D, x1, y1);
  1263.           }
  1264.       
  1265.       //end First Pixel
  1266.       *(u32 *) dP = product1;
  1267.       dP += 2;
  1268.       w += dw;
  1269.     }
  1270.     dstPtr += dstPitch;
  1271.   }
  1272. }
  1273.  
  1274.