rgb444torgb444.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:30k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rgb444torgb444.c,v 1.2.8.1 2004/07/09 02:00:07 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hlxclib/string.h"
  50. #include "nostatic/colorlib.h"
  51. #include "nostatic/rgb.h"
  52. #include "nostatic/rgbcommon.h"
  53. void
  54. RGB444toRGB444_ROW_SHRINK (unsigned char *dest_ptr,
  55.                           int dest_dx, unsigned char *src_ptr, int src_dx)
  56. {
  57.     register unsigned char *d = dest_ptr;
  58.     register unsigned char *s = src_ptr;
  59.     register int count = dest_dx;
  60.     register int limit = src_dx >> 1;
  61.     register int step = dest_dx;
  62.     if (count)
  63.     {
  64.         do 
  65.         {
  66.             register unsigned int da_rgb; 
  67.             register unsigned int sa_rgb;   
  68.             sa_rgb = *(unsigned short *) (s); 
  69.             da_rgb = sa_rgb;
  70.             *(unsigned short *) (d) = da_rgb;
  71.             d += 2;
  72.             do
  73.             {
  74.                 s += 2;
  75.             } while ((limit -= step) >= 0);
  76.             limit += src_dx;
  77.         } while (--count);
  78.     }
  79. }
  80. void
  81. RGB444toRGB444_ROW_COPY (unsigned char *dest_ptr, int dest_dx,
  82.                         unsigned char *src_ptr, int src_dx)
  83. {
  84.     register unsigned char *d = dest_ptr;
  85.     register unsigned char *s = src_ptr;
  86.     register int count = dest_dx;
  87.     while (((unsigned int) d & 3) && ((unsigned int) s & 3) && count)
  88.     {
  89.         register unsigned int da_rgb;
  90.         register unsigned int sa_rgb;
  91.         sa_rgb = *(unsigned short *) (s);
  92.         da_rgb = sa_rgb;
  93.         s += 2;
  94.         *(unsigned short *) (d) = da_rgb;
  95.         d += 2;
  96.         count--;
  97.     }
  98.     while (count >= 4)
  99.     {
  100.         register unsigned int da_rgb;
  101.         register unsigned int sa_rgb;
  102.         sa_rgb = *(unsigned short *) (s);
  103.         da_rgb = sa_rgb;
  104.         *(unsigned short *) (d) = da_rgb;
  105.         sa_rgb = *(unsigned short *) (s + 2);
  106.         da_rgb = sa_rgb;
  107.         *(unsigned short *) (d + 2) = da_rgb;
  108.         sa_rgb = *(unsigned short *) (s + 4);
  109.         da_rgb = sa_rgb;
  110.         *(unsigned short *) (d + 2 * 2) = da_rgb;
  111.         sa_rgb = *(unsigned short *) (s + 6);
  112.         da_rgb = sa_rgb;
  113.         *(unsigned short *) (d + 3 * 2) = da_rgb;
  114.         s += 8;
  115.         d += 4 * 2;
  116.         count -= 4;
  117.     }
  118.     while (count)
  119.     {
  120.         register unsigned int da_rgb;
  121.         register unsigned int sa_rgb;
  122.         sa_rgb = *(unsigned short *) (s);
  123.         da_rgb = sa_rgb;
  124.         s += 2;
  125.         *(unsigned short *) (d) = da_rgb;
  126.         d += 2;
  127.         count--;
  128.     }
  129. }
  130. void
  131. RGB444toRGB444_ROW_STRETCH (unsigned char *dest_ptr, int dest_dx,
  132.                            unsigned char *src_ptr, int src_dx)
  133. {
  134.     register unsigned char *d = dest_ptr;
  135.     register unsigned char *s = src_ptr;
  136.     register int count = dest_dx;
  137.     register int limit = dest_dx >> 1;
  138.     register int step = src_dx;
  139.     if (count)
  140.     {
  141.         goto start;
  142.         do
  143.         {
  144.             register unsigned int da_rgb;
  145.             if ((limit -= step) < 0)
  146.             {
  147.                 limit += dest_dx;
  148.               start:
  149.                 register unsigned int sa_rgb;
  150.                 sa_rgb = *(unsigned short *) (s);
  151.                 da_rgb = sa_rgb;
  152.                 s += 2;
  153.             }
  154.             *(unsigned short *) (d) = da_rgb;
  155.             d += 2;
  156.         }
  157.         while (--count);
  158.     }
  159. }
  160. void
  161. RGB444toRGB444_ROW_STRETCH2X (unsigned char *dest_ptr, int dest_dx,
  162.                              unsigned char *src_ptr, int src_dx)
  163. {
  164.     register unsigned char *d = dest_ptr;
  165.     register unsigned char *s = src_ptr;
  166.     register int count = src_dx;
  167.     if (count)
  168.     {
  169.         register unsigned int da_rgb;
  170.         register unsigned int sa_rgb;
  171.         sa_rgb = *(unsigned short *) (s);
  172.         da_rgb = sa_rgb;
  173.         s += 2;
  174.         count--;
  175.         *(unsigned short *) (d) = da_rgb;
  176.         d += 2;
  177.         while (count >= 2)
  178.         {
  179.             register unsigned int db_rgb;
  180.             register unsigned int sa_rgb;
  181.             sa_rgb = *(unsigned short *) (s);
  182.             db_rgb = sa_rgb;
  183.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  184.             *(unsigned short *) (d) = da_rgb;
  185.             *(unsigned short *) (d + 2) = db_rgb;
  186.             sa_rgb = *(unsigned short *) (s + 2);
  187.             da_rgb = sa_rgb;
  188.             db_rgb =(((db_rgb ^ da_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & da_rgb);
  189.             *(unsigned short *) (d + 2 * 2) = db_rgb;
  190.             *(unsigned short *) (d + 3 * 2) = da_rgb;
  191.             s += 4;
  192.             d += 4 * 2;
  193.             count -= 2;
  194.         }
  195.         if (count)
  196.         {
  197.             register unsigned int db_rgb;
  198.             register unsigned int sa_rgb;
  199.             sa_rgb = *(unsigned short *) (s);
  200.             db_rgb = sa_rgb;
  201.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  202.             *(unsigned short *) (d) = da_rgb;
  203.             *(unsigned short *) (d + 2) = db_rgb;
  204.             *(unsigned short *) (d + 2 * 2) = db_rgb;
  205.         }
  206.         else
  207.         {
  208.             *(unsigned short *) (d) = da_rgb;
  209.         }
  210.     }
  211. }
  212. void
  213. RGB444toRGB444_ROW_STRETCH2XPLUS (unsigned char *dest_ptr, int dest_dx,
  214.                                  unsigned char *src_ptr, int src_dx)
  215. {
  216.     register unsigned char *d = dest_ptr;
  217.     register unsigned char *s = src_ptr;
  218.     register int count = dest_dx;
  219.     register int limit = dest_dx >> 1;
  220.     register int step = src_dx << 1;
  221.     register int remainder = (2 * dest_dx - limit) / step;
  222.     if (count)
  223.     {
  224.         register unsigned int da_rgb;
  225.         register unsigned int db_rgb;
  226.         register unsigned int sa_rgb;
  227.         sa_rgb = *(unsigned short *) (s);
  228.         da_rgb = sa_rgb;
  229.         s += 2;
  230.         if (!(count -= remainder))
  231.             goto end_of_row;
  232.         while (1)
  233.         {
  234.             do
  235.             {
  236.                 *(unsigned short *) (d) = da_rgb;
  237.                 d += 2;
  238.                 if (!(--count))
  239.                     goto end_of_row;
  240.             }
  241.             while ((limit -= step) >= 0);
  242.             limit += dest_dx;
  243.             register unsigned int sa_rgb;
  244.             sa_rgb = *(unsigned short *) (s);
  245.             db_rgb = sa_rgb;
  246.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  247.             do
  248.             {
  249.                 *(unsigned short *) (d) = da_rgb;
  250.                 d += 2;
  251.                 if (!(--count))
  252.                     goto end_of_row;
  253.             }
  254.             while ((limit -= step) >= 0);
  255.             limit += dest_dx;
  256.             do
  257.             {
  258.                 *(unsigned short *) (d) = db_rgb;
  259.                 d += 2;
  260.                 if (!(--count))
  261.                     goto end_of_row_2;
  262.             }
  263.             while ((limit -= step) >= 0);
  264.             limit += dest_dx;
  265.             sa_rgb = *(unsigned short *) (s + 2);
  266.             da_rgb = sa_rgb;
  267.             s += 4;
  268.             db_rgb =(((db_rgb ^ da_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & da_rgb);
  269.             do
  270.             {
  271.                 *(unsigned short *) (d) = db_rgb;
  272.                 d += 2;
  273.                 if (!(--count))
  274.                     goto end_of_row_2;
  275.             } while ((limit -= step) >= 0);
  276.             limit += dest_dx;
  277.         }
  278.       end_of_row_2:
  279.         da_rgb = db_rgb;
  280.       end_of_row:
  281.         while (remainder--)
  282.         {
  283.             *(unsigned short *) (d) = da_rgb;
  284.             d += 2;
  285.         }
  286.     }
  287. }
  288. void
  289. RGB444toRGB444_ROW2X_SHRINK (unsigned char *dest_ptr_1,
  290.                             unsigned char *dest_ptr_12,
  291.                             unsigned char *dest_ptr_2, int dest_dx,
  292.                             unsigned char *src_ptr, int src_dx)
  293. {
  294.     register unsigned char *d1 = dest_ptr_1;
  295.     register unsigned char *d12 = dest_ptr_12;
  296.     register unsigned char *d2 = dest_ptr_2;
  297.     register unsigned char *s = src_ptr;
  298.     register int count = dest_dx;
  299.     register int limit = src_dx >> 1;
  300.     register int step = dest_dx;
  301.     if (count)
  302.     {
  303.         do
  304.         {
  305.             register unsigned int da_rgb;
  306.             register unsigned int sa_rgb;
  307.             sa_rgb = *(unsigned short *) (s);
  308.             da_rgb = sa_rgb;
  309.             *(unsigned short *) (d2) = da_rgb;
  310.             d2 += 2;
  311.             register unsigned int sb_rgb;
  312.             sb_rgb = *(unsigned short *) (d1);
  313.             da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U <<0)))) +(da_rgb & sb_rgb);
  314.             d1 += 2;
  315.             *(unsigned short *) (d12) = da_rgb;
  316.             d12 += 2;
  317.             do
  318.             {
  319.                 s += 2;
  320.             }
  321.             while ((limit -= step) >= 0);
  322.             limit += src_dx;
  323.         }
  324.         while (--count);
  325.     }
  326. }
  327. void
  328. RGB444toRGB444_ROW2X_COPY (unsigned char *dest_ptr_1,
  329.                           unsigned char *dest_ptr_12,
  330.                           unsigned char *dest_ptr_2, int dest_dx,
  331.                           unsigned char *src_ptr, int src_dx)
  332. {
  333.     register unsigned char *d1 = dest_ptr_1;
  334.     register unsigned char *d12 = dest_ptr_12;
  335.     register unsigned char *d2 = dest_ptr_2;
  336.     register unsigned char *s = src_ptr;
  337.     register int count = dest_dx;
  338.     while (((unsigned int) d2 & 3) && ((unsigned int) s & 3) && count)
  339.     {
  340.         register unsigned int da_rgb;
  341.         register unsigned int sa_rgb;
  342.         sa_rgb = *(unsigned short *) (s);
  343.         da_rgb = sa_rgb;
  344.         s += 2;
  345.         *(unsigned short *) (d2) = da_rgb;
  346.         d2 += 2;
  347.         register unsigned int sb_rgb;
  348.         sb_rgb = *(unsigned short *) (d1);
  349.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  350.         d1 += 2;
  351.         *(unsigned short *) (d12) = da_rgb;
  352.         d12 += 2;
  353.         count--;
  354.     }
  355.     while (count >= 4)
  356.     {
  357.         register unsigned int da_rgb;
  358.         register unsigned int sa_rgb;
  359.         register unsigned int sb_rgb;
  360.         sa_rgb = *(unsigned short *) (s);
  361.         da_rgb = sa_rgb;
  362.         *(unsigned short *) (d2) = da_rgb;
  363.         sb_rgb = *(unsigned short *) (d1);
  364.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  365.         *(unsigned short *) (d12) = da_rgb;
  366.         sa_rgb = *(unsigned short *) (s + 2);
  367.         da_rgb = sa_rgb;
  368.         *(unsigned short *) (d2 + 2) = da_rgb;
  369.         sb_rgb = *(unsigned short *) (d1 + 2);
  370.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  371.         *(unsigned short *) (d12 + 2) = da_rgb;
  372.         sa_rgb = *(unsigned short *) (s + 4);
  373.         da_rgb = sa_rgb;
  374.         *(unsigned short *) (d2 + 2 * 2) = da_rgb;
  375.         sb_rgb = *(unsigned short *) (d1 + 2 * 2);
  376.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  377.         *(unsigned short *) (d12 + 2 * 2) = da_rgb;
  378.         sa_rgb = *(unsigned short *) (s + 6);
  379.         da_rgb = sa_rgb;
  380.         *(unsigned short *) (d2 + 3 * 2) = da_rgb;
  381.         sb_rgb = *(unsigned short *) (d1 + 3 * 2);
  382.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  383.         *(unsigned short *) (d12 + 3 * 2) = da_rgb;
  384.         s += 8;
  385.         d1 += 4 * 2;
  386.         d2 += 4 * 2;
  387.         d12 += 4 * 2;
  388.         count -= 4;
  389.     }
  390.     while (count)
  391.     {
  392.         register unsigned int da_rgb;
  393.         register unsigned int sa_rgb;
  394.         sa_rgb = *(unsigned short *) (s);
  395.         da_rgb = sa_rgb;
  396.         s += 2;
  397.         *(unsigned short *) (d2) = da_rgb;
  398.         d2 += 2;
  399.         register unsigned int sb_rgb;
  400.         sb_rgb = *(unsigned short *) (d1);
  401.         da_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  402.         d1 += 2;
  403.         *(unsigned short *) (d12) = da_rgb;
  404.         d12 += 2;
  405.         count--;
  406.     }
  407. }
  408. void
  409. RGB444toRGB444_ROW2X_STRETCH (unsigned char *dest_ptr_1,
  410.                              unsigned char *dest_ptr_12,
  411.                              unsigned char *dest_ptr_2, int dest_dx,
  412.                              unsigned char *src_ptr, int src_dx)
  413. {
  414.     register unsigned char *d1 = dest_ptr_1;
  415.     register unsigned char *d12 = dest_ptr_12;
  416.     register unsigned char *d2 = dest_ptr_2;
  417.     register unsigned char *s = src_ptr;
  418.     register int count = dest_dx;
  419.     register int limit = dest_dx >> 1;
  420.     register int step = src_dx;
  421.     if (count)
  422.     {
  423.         goto start;
  424.         do
  425.         {
  426.             register unsigned int da_rgb;
  427.             register unsigned int dc_rgb;
  428.             if ((limit -= step) < 0)
  429.             {
  430.                 limit += dest_dx;
  431.               start:if (5 == 0)
  432.               {
  433.                   da_rgb = *(unsigned short *) (s);
  434.               }
  435.               else
  436.               {
  437.                   register unsigned int sa_rgb;
  438.                   sa_rgb = *(unsigned short *) (s);
  439.                   da_rgb = sa_rgb;
  440.               }
  441.                 s += 2;
  442.                 register unsigned int sb_rgb;
  443.                 sb_rgb = *(unsigned short *) (d1);
  444.                 dc_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 +4 -1)) -(1U <<0))))+ (da_rgb & sb_rgb);
  445.             }
  446.             d1 += 2;
  447.             *(unsigned short *) (d2) = da_rgb;
  448.             d2 += 2;
  449.             *(unsigned short *) (d12) = dc_rgb;
  450.             d12 += 2;
  451.         }
  452.         while (--count);
  453.     }
  454. }
  455. void
  456. RGB444toRGB444_ROW2X_STRETCH2X (unsigned char *dest_ptr_1,
  457.                                unsigned char *dest_ptr_12,
  458.                                unsigned char *dest_ptr_2, int dest_dx,
  459.                                unsigned char *src_ptr, int src_dx)
  460. {
  461.     register unsigned char *d1 = dest_ptr_1;
  462.     register unsigned char *d12 = dest_ptr_12;
  463.     register unsigned char *d2 = dest_ptr_2;
  464.     register unsigned char *s = src_ptr;
  465.     register int count = src_dx;
  466.     if (count)
  467.     {
  468.         register unsigned int da_rgb;
  469.         register unsigned int dc_rgb;
  470.         register unsigned int sa_rgb;
  471.         sa_rgb = *(unsigned short *) (s);
  472.         da_rgb = sa_rgb;
  473.         s += 2;
  474.         register unsigned int sb_rgb;
  475.         sb_rgb = *(unsigned short *) (d1);
  476.         dc_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 - 1)) -(1U << 0)))) +(da_rgb & sb_rgb);
  477.         d1 += 2 * 2;
  478.         count--;
  479.         *(unsigned short *) (d2) = da_rgb;
  480.         d2 += 2;
  481.         *(unsigned short *) (d12) = dc_rgb;
  482.         d12 += 2;
  483.         while (count >= 2)
  484.         {
  485.             register unsigned int db_rgb;
  486.             register unsigned int dd_rgb;
  487.             register unsigned int sa_rgb;
  488.             sa_rgb = *(unsigned short *) (s);
  489.             db_rgb = sa_rgb;
  490.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  491.             *(unsigned short *) (d2) = da_rgb;
  492.             *(unsigned short *) (d2 + 2) = db_rgb;
  493.             register unsigned int sb_rgb;
  494.             sb_rgb = *(unsigned short *) (d1);
  495.             dd_rgb =(((db_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U <<0)))) +(db_rgb & sb_rgb);
  496.             dc_rgb =(((dc_rgb ^ dd_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (dc_rgb & dd_rgb);
  497.             *(unsigned short *) (d12) = dc_rgb;
  498.             *(unsigned short *) (d12 + 2) = dd_rgb;
  499.             sa_rgb = *(unsigned short *) (s + 2);
  500.             da_rgb = sa_rgb;
  501.             db_rgb =(((db_rgb ^ da_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & da_rgb);
  502.             *(unsigned short *) (d2 + 2 * 2) = db_rgb;
  503.             *(unsigned short *) (d2 + 3 * 2) = da_rgb;
  504.             sb_rgb = *(unsigned short *) (d1 + 2 * 2);
  505.             dc_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U <<0)))) +(da_rgb & sb_rgb);
  506.             dd_rgb =(((dd_rgb ^ dc_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (dd_rgb & dc_rgb);
  507.             *(unsigned short *) (d12 + 2 * 2) = dd_rgb;
  508.             *(unsigned short *) (d12 + 3 * 2) = dc_rgb;
  509.             s += 4;
  510.             d1 += 4 * 2;
  511.             d2 += 4 * 2;
  512.             d12 += 4 * 2;
  513.             count -= 2;
  514.         }
  515.         if (count)
  516.         {
  517.             register unsigned int db_rgb;
  518.             register unsigned int dd_rgb;
  519.             register unsigned int sa_rgb;
  520.             sa_rgb = *(unsigned short *) (s);
  521.             db_rgb = sa_rgb;
  522.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  523.             *(unsigned short *) (d2) = da_rgb;
  524.             *(unsigned short *) (d2 + 2) = db_rgb;
  525.             *(unsigned short *) (d2 + 2 * 2) = db_rgb;
  526.             register unsigned int sb_rgb;
  527.             sb_rgb = *(unsigned short *) (d1);
  528.             dd_rgb =(((db_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U <<0)))) +(db_rgb & sb_rgb);
  529.             dc_rgb =(((dc_rgb ^ dd_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (dc_rgb & dd_rgb);
  530.             *(unsigned short *) (d12) = dc_rgb;
  531.             *(unsigned short *) (d12 + 2) = dd_rgb;
  532.             *(unsigned short *) (d12 + 2 * 2) = dd_rgb;
  533.         }
  534.         else
  535.         {
  536.             *(unsigned short *) (d2) = da_rgb;
  537.             *(unsigned short *) (d12) = dc_rgb;
  538.         }
  539.     }
  540. }
  541. void
  542. RGB444toRGB444_ROW2X_STRETCH2XPLUS (unsigned char *dest_ptr_1,
  543.                                    unsigned char *dest_ptr_12,
  544.                                    unsigned char *dest_ptr_2,
  545.                                    int dest_dx,
  546.                                    unsigned char *src_ptr, int src_dx)
  547. {
  548.     register unsigned char *d1 = dest_ptr_1;
  549.     register unsigned char *d12 = dest_ptr_12;
  550.     register unsigned char *d2 = dest_ptr_2;
  551.     register unsigned char *s = src_ptr;
  552.     register int count = dest_dx;
  553.     register int limit = dest_dx >> 1;
  554.     register int step = src_dx << 1;
  555.     register int remainder = (2 * dest_dx - limit) / step;
  556.     if (count)
  557.     {
  558.         register unsigned int da_rgb;
  559.         register unsigned int db_rgb;
  560.         register unsigned int dc_rgb;
  561.         register unsigned int dd_rgb;
  562.         register unsigned int sa_rgb;
  563.         sa_rgb = *(unsigned short *) (s);
  564.         da_rgb = sa_rgb;
  565.         s += 2;
  566.         if (!(count -= remainder))
  567.             goto end_of_row;
  568.         while (1)
  569.         {
  570.             register unsigned int sb_rgb;
  571.             sb_rgb = *(unsigned short *) (d1);
  572.             dc_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  573.             do
  574.             {
  575.                 d1 += 2;
  576.                 *(unsigned short *) (d2) = da_rgb;
  577.                 d2 += 2;
  578.                 *(unsigned short *) (d12) = dc_rgb;
  579.                 d12 += 2;
  580.                 if (!(--count))
  581.                     goto end_of_row;
  582.             }
  583.             while ((limit -= step) >= 0);
  584.             limit += dest_dx;
  585.             register unsigned int sa_rgb;
  586.             sa_rgb = *(unsigned short *) (s);
  587.             db_rgb = sa_rgb;
  588.             da_rgb =(((da_rgb ^ db_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & db_rgb);
  589.             sb_rgb = *(unsigned short *) (d1);
  590.             dc_rgb =(((da_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (da_rgb & sb_rgb);
  591.             do
  592.             {
  593.                 d1 += 2;
  594.                 *(unsigned short *) (d2) = da_rgb;
  595.                 d2 += 2;
  596.                 *(unsigned short *) (d12) = dc_rgb;
  597.                 d12 += 2;
  598.                 if (!(--count))
  599.                     goto end_of_row;
  600.             }
  601.             while ((limit -= step) >= 0);
  602.             limit += dest_dx;
  603.             sb_rgb = *(unsigned short *) (d1);
  604.             dd_rgb =(((db_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & sb_rgb);
  605.             do
  606.             {
  607.                 d1 += 2;
  608.                 *(unsigned short *) (d2) = db_rgb;
  609.                 d2 += 2;
  610.                 *(unsigned short *) (d12) = dd_rgb;
  611.                 d12 += 2;
  612.                 if (!(--count))
  613.                     goto end_of_row_2;
  614.             }
  615.             while ((limit -= step) >= 0);
  616.             limit += dest_dx;
  617.             sa_rgb = *(unsigned short *) (s + 2);
  618.             da_rgb = sa_rgb;
  619.             s += 4;
  620.             db_rgb =(((db_rgb ^ da_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & da_rgb);
  621.             sb_rgb = *(unsigned short *) (d1);
  622.             dd_rgb =(((db_rgb ^ sb_rgb) >> 1) &(((1U << (8 + 4 - 1)) - (1U << 8)) | ((1U << (4 + 4 - 1)) -(1U << 4)) | ((1U <<(0 + 4 -1)) -(1U << 0))))+ (db_rgb & sb_rgb);
  623.             do
  624.             {
  625.                 d1 += 2;
  626.                 *(unsigned short *) (d2) = db_rgb;
  627.                 d2 += 2;
  628.                 *(unsigned short *) (d12) = dd_rgb;
  629.                 d12 += 2;
  630.                 if (!(--count))
  631.                     goto end_of_row_2;
  632.             }
  633.             while ((limit -= step) >= 0);
  634.             limit += dest_dx;
  635.         }
  636.       end_of_row_2:
  637.         da_rgb = db_rgb;
  638.         dc_rgb = dd_rgb;
  639.       end_of_row:
  640.         while (remainder--)
  641.         {
  642.             *(unsigned short *) (d2) = da_rgb;
  643.             d2 += 2;
  644.             *(unsigned short *) (d12) = dc_rgb;
  645.             d12 += 2;
  646.         }
  647.     }
  648. }
  649. int
  650. RGBtoRGB4 (int dest_format, unsigned char *dest_ptr, int dest_width,
  651.           int dest_height, int dest_pitch, int dest_x, int dest_y,
  652.           int dest_dx, int dest_dy, int src_format, unsigned char *src_ptr,
  653.           int src_width, int src_height, int src_pitch, int src_x, int src_y,
  654.           int src_dx, int src_dy)
  655. {
  656.     
  657.     void (*ImageFuncs[5]) (unsigned char *dest_ptr, int dest_dx, int dest_dy,
  658.                            int dest_pitch, int dest_bpp, unsigned char *src_ptr,
  659.                            int src_dx, int src_dy, int src_pitch, int src_bpp,
  660.                            void (*row_func) (unsigned char *, int,
  661.                                              unsigned char *, int),
  662.                            void (*row2x_func) (unsigned char *, unsigned char *,
  663.                                                unsigned char *, int,
  664.                                                unsigned char *, int)) =
  665.         {
  666.             IMAGE_SHRINK,
  667.             IMAGE_COPY,
  668.             IMAGE_STRETCH,
  669.             IMAGE_STRETCH2X,
  670.             IMAGE_STRETCH2XPLUS
  671.         };
  672.     
  673.     void (*RowFuncs[5]) (unsigned char *dest_ptr, int dest_dx,
  674.                          unsigned char *src_ptr, int src_dx) =
  675.         {
  676.             RGB444toRGB444_ROW_SHRINK,
  677.             RGB444toRGB444_ROW_COPY,
  678.             RGB444toRGB444_ROW_STRETCH,
  679.             RGB444toRGB444_ROW_STRETCH2X,
  680.             RGB444toRGB444_ROW_STRETCH2XPLUS
  681.         };
  682.     void (*Row2xFuncs[5]) (unsigned char *dest_ptr_1, unsigned char *dest_ptr_12,
  683.                            unsigned char *dest_ptr_2, int dest_dx,
  684.                            unsigned char *src_ptr, int src_dx) =
  685.         {
  686.             RGB444toRGB444_ROW2X_SHRINK,
  687.             RGB444toRGB444_ROW2X_COPY,
  688.             RGB444toRGB444_ROW2X_STRETCH,
  689.             RGB444toRGB444_ROW2X_STRETCH2X,
  690.             RGB444toRGB444_ROW2X_STRETCH2XPLUS
  691.         };
  692.     void (*row_proc) (unsigned char *, int, unsigned char *, int);
  693.     void (*row2x_proc) (unsigned char *, unsigned char *, unsigned char *, int,
  694.                         unsigned char *, int);
  695.     void (*image_proc) (unsigned char *, int, int, int, int,
  696.                         unsigned char *, int, int, int, int,
  697.                         void (*)(unsigned char *, int, unsigned char *, int),
  698.                         void (*)(unsigned char *, unsigned char *,
  699.                                  unsigned char *, int, unsigned char *, int));
  700.     register int scale_x, scale_y;
  701.     register int dest_bpp, src_bpp;
  702.     register unsigned char *d, *s;
  703.     if (((unsigned) dest_ptr & 3) || (dest_pitch & 1) ||
  704.         ((unsigned) src_ptr & 3) || (src_pitch & 1) ||
  705.         dest_width <= 0 || dest_height <= 0 ||
  706.         src_width <= 0 || src_height <= 0 ||
  707.         dest_x < 0 || dest_y < 0 || dest_dx <= 0 || dest_dy <= 0 ||
  708.         src_x < 0 || src_y < 0 || src_dx <= 0 || src_dy <= 0 ||
  709.         dest_width < dest_x + dest_dx || dest_height < dest_y + dest_dy ||
  710.         src_width < src_x + src_dx || src_height < src_y + src_dy)
  711.     {
  712.         return -1;
  713.     }
  714.     scale_x = 1;
  715.     if (dest_dx != src_dx)
  716.     {
  717.         if (dest_dx < src_dx)
  718.             scale_x--;
  719.         else
  720.         {
  721.             scale_x++;
  722.             if (dest_dx >= 2 * src_dx)
  723.             {
  724.                 scale_x++;
  725.                 if (dest_dx > 2 * src_dx)
  726.                     scale_x++;
  727.             }
  728.         }
  729.     }
  730.     scale_y = 1;
  731.     if (dest_dy != src_dy)
  732.     {
  733.         if (dest_dy < src_dy)
  734.             scale_y--;
  735.         else
  736.         {
  737.             scale_y++;
  738.             if (dest_dy >= 2 * src_dy)
  739.             {
  740.                 scale_y++;
  741.                 if (dest_dy > 2 * src_dy)
  742.                     scale_y++;
  743.             }
  744.         }
  745.     }
  746.     row_proc   = RowFuncs[scale_x];
  747.     row2x_proc = Row2xFuncs[scale_x];
  748.     image_proc = ImageFuncs[scale_y];
  749.     if (!row_proc || !row2x_proc || !image_proc)
  750.     {
  751.         return -1;
  752.     }
  753.     dest_bpp = 2;
  754.     src_bpp = 4;
  755.     if (dest_pitch < 0)
  756.         dest_ptr -= (dest_height - 1) * dest_pitch;
  757.     if (src_pitch < 0)
  758.         src_ptr -= (src_height - 1) * src_pitch;
  759.     d = dest_ptr + dest_x * dest_bpp + dest_y * dest_pitch;
  760.     s = src_ptr + src_x * src_bpp + src_y * src_pitch;
  761.     (*image_proc) (d, dest_dx, dest_dy, dest_pitch, dest_bpp,
  762.                    s, src_dx, src_dy, src_pitch, src_bpp, row_proc, row2x_proc);
  763.     return 0;
  764. }
  765. int
  766. RGB444toRGB444 (unsigned char *dest_ptr,
  767.                int dest_width, int dest_height, int dest_pitch,
  768.                int dest_x, int dest_y, int dest_dx, int dest_dy,
  769.                unsigned char *src_ptr,
  770.                int src_width, int src_height, int src_pitch,
  771.                int src_x, int src_y, int src_dx, int src_dy,
  772.                color_data_t * not_used)
  773. {
  774.     const int dest_format = 18; /* RGB444 */
  775.     const int src_format = 18; /* RGB444 */
  776.     return RGBtoRGB4 (dest_format, dest_ptr, dest_width, dest_height, dest_pitch,
  777.                      dest_x, dest_y, dest_dx, dest_dy, src_format,
  778.                      src_ptr, src_width, src_height, src_pitch,
  779.                      src_x, src_y, src_dx, src_dy);
  780. }