OSDN Git Service

[WIP][Agar] Build fit to CSP.
[csp-qt/common_source_project-fm7.git] / source / src / agar / common / scaler / generic / scaler_x3.c
1 /*
2  * Zoom x3
3  * (C) 2014 K.Ohta
4  * 
5  * History:
6  *  2013-04-02 Move from scaler_x2.c
7  */
8 #include <agar/core.h>
9 #include <agar/gui.h>
10 #include "simd_types.h"
11 #include "sdl_cpuid.h"
12 #include "cache_wrapper.h"
13
14 extern BOOL bFullScan;
15
16 static void Scaler_DrawLine(v4hi *dst, Uint32 *src, int ww, int repeat, int pitch)
17 {
18    int xx;
19    int yy;
20    int yrep2;
21    int yrep3;
22    int blank;
23    v4hi *b2p;
24    v4hi r1, r2;
25    v4hi *d0;
26    v4hi *b;
27    int pitch2;
28 #if AG_BIG_ENDIAN != 1
29    const v4ui bb = {0xff000000, 0xff000000, 0xff000000, 0xff000000};
30 #else
31    const v4ui bb = {0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff};
32 #endif
33      
34    if(repeat <= 0) return;
35    b = (v4hi *)src;
36    b2p = dst;
37    pitch2 = pitch / sizeof(v4hi);
38    if((bFullScan) || (repeat < 2)) {
39       v4hi r3, r4, r5, r6, r7, r8;
40       for(xx = 0; xx < ww; xx += 8) {
41          b2p = dst;
42          r1 = *b++;
43          r2 = *b++;
44          // 76543210 -> 7776666555444333222111000
45          r3.uv  = (v4ui){r1.i[0], r1.i[0], r1.i[0], r1.i[1]};  
46          r4.uv  = (v4ui){r1.i[1], r1.i[1], r1.i[2], r1.i[2]};  
47          r5.uv  = (v4ui){r1.i[2], r1.i[3], r1.i[3], r1.i[3]};  
48
49          r6.uv  = (v4ui){r2.i[0], r2.i[0], r2.i[0], r2.i[1]};  
50          r7.uv  = (v4ui){r2.i[1], r2.i[1], r2.i[2], r2.i[2]};  
51          r8.uv  = (v4ui){r2.i[2], r2.i[3], r2.i[3], r2.i[3]};  
52          for(yy = 0; yy < repeat; yy++) {
53             b2p[0] = r3;
54             b2p[1] = r4;
55             b2p[2] = r5;
56             b2p[3] = r6;
57             b2p[4] = r7;
58             b2p[5] = r8;
59             b2p = b2p + pitch2;
60          }
61          dst += 6;
62 //       b += 2;
63       }
64    } else {
65       v4hi r3, r4, r5, r6, r7, r8;
66       for(xx = 0; xx < ww; xx += 8) {
67          b2p = dst;
68          r1 = *b++;
69          r2 = *b++;
70          // 76543210 -> 777766666555544444333322222111100000
71          r3.uv  = (v4ui){r1.i[0], r1.i[0], r1.i[0], r1.i[1]};  
72          r4.uv  = (v4ui){r1.i[1], r1.i[1], r1.i[2], r1.i[2]};  
73          r5.uv  = (v4ui){r1.i[2], r1.i[3], r1.i[3], r1.i[3]};  
74
75          r6.uv  = (v4ui){r2.i[0], r2.i[0], r2.i[0], r2.i[1]};  
76          r7.uv  = (v4ui){r2.i[1], r2.i[1], r2.i[2], r2.i[2]};  
77          r8.uv  = (v4ui){r2.i[2], r2.i[3], r2.i[3], r2.i[3]};  
78          for(yy = 0; yy < repeat - 1; yy++) {
79             b2p[0] = r3;
80             b2p[1] = r4;
81             b2p[2] = r5;
82             b2p[3] = r6;
83             b2p[4] = r7;
84             b2p[5] = r8;
85             b2p = b2p + pitch2;
86          }
87          b2p[0].uv = 
88          b2p[1].uv = 
89          b2p[2].uv = 
90          b2p[3].uv = 
91          b2p[4].uv = 
92          b2p[5].uv = bb;
93          dst += 6;
94 //       b += 2;
95       }
96    }
97    
98 }
99
100
101
102 void pVram2RGB_x3_Line(Uint32 *src, Uint8 *dst, int xbegin, int xend, int y, int yrep)
103 {
104    register v4hi *b;
105    AG_Surface *Surface = GetDrawSurface();
106    Uint32 *d1;
107    Uint32 *d2;
108    Uint32 *p;
109    int w;
110    int h;
111    int yy;
112    int xx;
113    int hh;
114    int ww;
115    int i;
116    int x = xbegin;
117    int yrep2;
118    unsigned  pitch;
119    Uint32 black;
120    if(Surface == NULL) return;
121    w = Surface->w;
122    h = Surface->h;
123
124
125    ww = xend - xbegin;
126 //   if(ww > (w / 2)) ww = w / 2;
127    ww = (ww / 8) * 8;
128    if(ww <= 0) return;
129
130
131 #if AG_BIG_ENDIAN != 1
132    black = 0xff000000;
133 #else
134    black = 0x000000ff;
135 #endif
136 //   yrep = yrep * 16.0f;
137
138    yrep2 = yrep;
139
140    d1 = (Uint32 *)((Uint8 *)dst + x * 3 * Surface->format->BytesPerPixel);
141    d2 = &src[x + y * 640];
142    Scaler_DrawLine((v4hi *)d1, (Uint32 *)d2, ww, yrep2, Surface->pitch);
143 //   AG_SurfaceUnlock(Surface);
144    return;
145 }
146
147