1 | inline uint16 avg(const uint16 col1,const uint16 col2)
|
---|
2 | {
|
---|
3 | //res = col1/2 + col2/2
|
---|
4 | uint16 r1,r2;
|
---|
5 | uint16 g1,g2,b1,b2;
|
---|
6 | r1 = (col1 & 0xF800)>>11;
|
---|
7 | r2 = (col2 & 0xF800)>>11;
|
---|
8 |
|
---|
9 | g1 = (col1 & 0x07E0)>>5;
|
---|
10 | g2 = (col2 & 0x07E0)>>5;
|
---|
11 |
|
---|
12 | b1 = (col1 & 0x1F);
|
---|
13 | b2 = (col2 & 0x1F);
|
---|
14 | return (((r1+r2)>>1)<<11) + (((g1+g2)>>1)<<5)+ ( (b1+b2)>>1) ;
|
---|
15 | }
|
---|
16 |
|
---|
17 | inline uint16 GetScale2xVal(const uint16 col,const uint16 near1,const uint16 near2,const uint16 far1,const uint16 far2)
|
---|
18 | {
|
---|
19 | if ( (near1==near2) && (near1!=far1) && (near1 != far2))
|
---|
20 | return near1; //this is the original scale2x code (http://scale2x.sourceforge.net)
|
---|
21 | else if ((near1==near2) && (near1==far1) && (near1==far2) && (near1 !=col))
|
---|
22 | return avg(col,near1); // remove dither patterns
|
---|
23 | else if ((col != near1) && (col !=near2) && (col!= far1) && (col!=far2))
|
---|
24 | return avg(col,avg(near1,near2)); //if col is different from all neighbours ==> blur it
|
---|
25 | else return col;
|
---|
26 | }
|
---|
27 | void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
|
---|
28 | int width, int height) {
|
---|
29 | unsigned int nextlineSrc = srcPitch / sizeof(uint16);
|
---|
30 | const uint16 *p = (const uint16 *)srcPtr;
|
---|
31 |
|
---|
32 | unsigned int nextlineDst = dstPitch / sizeof(uint16);
|
---|
33 | uint16 *q = (uint16 *)dstPtr;
|
---|
34 |
|
---|
35 | uint16 A, B, C;
|
---|
36 | uint16 D, E, F;
|
---|
37 | uint16 G, H, I;
|
---|
38 |
|
---|
39 | while (height--) {
|
---|
40 | B = *(p - 1 - nextlineSrc);
|
---|
41 | E = *(p - 1);
|
---|
42 | H = *(p - 1 + nextlineSrc);
|
---|
43 | C = *(p - nextlineSrc);
|
---|
44 | F = *(p);
|
---|
45 | I = *(p + nextlineSrc);
|
---|
46 | for (int i = 0; i < width; ++i) {
|
---|
47 | p++;
|
---|
48 | A = B; B = C; C = *(p - nextlineSrc);
|
---|
49 | D = E; E = F; F = *(p);
|
---|
50 | G = H; H = I; I = *(p + nextlineSrc);
|
---|
51 |
|
---|
52 | *(q) = GetScale2xVal(E,D,B,F,H);
|
---|
53 | *(q + 1) = GetScale2xVal(E,B,F,D,H);
|
---|
54 | *(q + nextlineDst) = GetScale2xVal(E,D,H,B,F);
|
---|
55 | *(q + nextlineDst + 1) = GetScale2xVal(E,H,F,D,B);
|
---|
56 | q += 2;
|
---|
57 | }
|
---|
58 | p += nextlineSrc - width;
|
---|
59 | q += (nextlineDst - width) << 1;
|
---|
60 | }
|
---|
61 | }
|
---|