/[pearpc]/src/system/arch/x86/sysvaccel.cc
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/system/arch/x86/sysvaccel.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 7 months ago) by dpavlin
File size: 4788 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * HT Editor
3     * sysvaccel.cc
4     *
5     * Copyright (C) 2004 Stefan Weyergraf
6     *
7     * This program is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License version 2 as
9     * published by the Free Software Foundation.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21     #include "system/sysvaccel.h"
22    
23     #include "tools/snprintf.h"
24    
25     extern "C" void __attribute__((regparm (3))) x86_mmx_convert_2be555_to_2le555(uint32 pixel, byte *input, byte *output);
26     extern "C" void __attribute__((regparm (3))) x86_mmx_convert_2be555_to_2le565(uint32 pixel, byte *input, byte *output);
27     extern "C" void __attribute__((regparm (3))) x86_mmx_convert_2be555_to_4le888(uint32 pixel, byte *input, byte *output);
28     extern "C" void __attribute__((regparm (3))) x86_sse2_convert_2be555_to_2le555(uint32 pixel, byte *input, byte *output);
29     extern "C" void __attribute__((regparm (3))) x86_sse2_convert_2be555_to_2le565(uint32 pixel, byte *input, byte *output);
30     extern "C" void __attribute__((regparm (3))) x86_sse2_convert_2be555_to_4le888(uint32 pixel, byte *input, byte *output);
31     extern "C" void __attribute__((regparm (3))) x86_convert_4be888_to_4le888(uint32 pixel, byte *input, byte *output);
32    
33     static inline void convertBaseColor(uint &b, uint fromBits, uint toBits)
34     {
35     if (toBits > fromBits) {
36     b <<= toBits - fromBits;
37     } else {
38     b >>= fromBits - toBits;
39     }
40     }
41    
42     static inline void genericConvertDisplay(
43     const DisplayCharacteristics &aSrcChar,
44     const DisplayCharacteristics &aDestChar,
45     const void *aSrcBuf,
46     void *aDestBuf,
47     int firstLine,
48     int lastLine)
49     {
50     byte *src = (byte*)aSrcBuf + aSrcChar.bytesPerPixel * aSrcChar.width * firstLine;
51     byte *dest = (byte*)aDestBuf + aDestChar.bytesPerPixel * aDestChar.width * firstLine;
52     for (int y=firstLine; y <= lastLine; y++) {
53     for (int x=0; x < aSrcChar.width; x++) {
54     uint r, g, b;
55     uint p;
56     switch (aSrcChar.bytesPerPixel) {
57     case 2:
58     p = (src[0] << 8) | src[1];
59     break;
60     case 4:
61     p = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
62     break;
63     default:
64     ht_printf("internal error in %s:%d\n", __FILE__, __LINE__);
65     exit(1);
66     break;
67     }
68     r = (p >> aSrcChar.redShift) & ((1<<aSrcChar.redSize)-1);
69     g = (p >> aSrcChar.greenShift) & ((1<<aSrcChar.greenSize)-1);
70     b = (p >> aSrcChar.blueShift) & ((1<<aSrcChar.blueSize)-1);
71     convertBaseColor(r, aSrcChar.redSize, aDestChar.redSize);
72     convertBaseColor(g, aSrcChar.greenSize, aDestChar.greenSize);
73     convertBaseColor(b, aSrcChar.blueSize, aDestChar.blueSize);
74     p = (r << aDestChar.redShift) | (g << aDestChar.greenShift)
75     | (b << aDestChar.blueShift);
76     switch (aDestChar.bytesPerPixel) {
77     case 2:
78     dest[0] = p; dest[1] = p>>8;
79     break;
80     case 3:
81     dest[0] = p; dest[1] = p>>8; dest[2] = p>>16;
82     break;
83     case 4:
84     *(uint32*)dest = p;
85     break;
86     default:
87     ht_printf("internal error in %s:%d\n", __FILE__, __LINE__);
88     exit(1);
89     }
90     dest += aDestChar.bytesPerPixel;
91     src += aSrcChar.bytesPerPixel;
92     }
93     dest += aDestChar.scanLineLength - aDestChar.width*aDestChar.bytesPerPixel;
94     src += aSrcChar.scanLineLength - aSrcChar.width*aSrcChar.bytesPerPixel;
95     }
96     }
97    
98     void sys_convert_display(
99     const DisplayCharacteristics &aSrcChar,
100     const DisplayCharacteristics &aDestChar,
101     const void *aSrcBuf,
102     void *aDestBuf,
103     int firstLine,
104     int lastLine)
105     {
106     byte *src = (byte*)aSrcBuf + aSrcChar.bytesPerPixel * aSrcChar.width * firstLine;
107     byte *dest = (byte*)aDestBuf + aDestChar.bytesPerPixel * aDestChar.width * firstLine;
108     uint32 pixel = (lastLine-firstLine+1) * aSrcChar.width;
109     if (aSrcChar.bytesPerPixel == 2 && aDestChar.bytesPerPixel == 2) {
110     if (aDestChar.redSize == 5 && aDestChar.greenSize == 6 && aDestChar.blueSize == 5) {
111     x86_mmx_convert_2be555_to_2le565(pixel, src, dest);
112     } else if (aDestChar.redSize == 5 && aDestChar.greenSize == 5 && aDestChar.blueSize == 5) {
113     x86_mmx_convert_2be555_to_2le555(pixel, src, dest);
114     } else {
115     genericConvertDisplay(aSrcChar, aDestChar, aSrcBuf, aDestBuf, firstLine, lastLine);
116     }
117     } else if (aSrcChar.bytesPerPixel == 2 && aDestChar.bytesPerPixel == 4) {
118     x86_mmx_convert_2be555_to_4le888(pixel, src, dest);
119     } else if (aSrcChar.bytesPerPixel == 4 && aDestChar.bytesPerPixel == 4) {
120     x86_convert_4be888_to_4le888(pixel, src, dest);
121     } else {
122     genericConvertDisplay(aSrcChar, aDestChar, aSrcBuf, aDestBuf, firstLine, lastLine);
123     }
124     }

  ViewVC Help
Powered by ViewVC 1.1.26