initial import
[picodrive.git] / platform / s60 / interpolatevideo.inl
diff --git a/platform/s60/interpolatevideo.inl b/platform/s60/interpolatevideo.inl
new file mode 100644 (file)
index 0000000..a0fa3f5
--- /dev/null
@@ -0,0 +1,213 @@
+static int EmulateScanFull16_176Interpolate(unsigned int scan,unsigned short *data)\r
+{\r
+       unsigned short *ps=NULL,*end=NULL;\r
+       unsigned char *pd=NULL;\r
+       int xpitch=0;\r
+       TInt retValue = 0;\r
+       if(scan<224)\r
+               retValue = 1-(gLineTable[scan+1]-gLineTable[scan]);\r
+       scan = gLineTable[scan];\r
+       \r
+       if ((int)scan< 0) return 0; // Out of range\r
+       if ((int)scan>=176) return 0; // Out of range\r
+       \r
+       pd=Targ.screen+gLineOffsets[scan];//Targ.screen+scan*2+Targ.screen_offset+8;\r
+       \r
+       xpitch=-Targ.scanline_length;\r
+       if((Pico.video.reg[12]&1))\r
+       {\r
+               ps=data; end=ps+320;\r
+               // Reduce 14 pixels into 9\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[1]]+gColorMapTab[ps[2]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[3]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[6]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[7]]+gColorMapTab[ps[8]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[9]]+gColorMapTab[ps[10]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[11]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[12]]+gColorMapTab[ps[13]])>>1);pd+=xpitch;\r
+                       ps+=14;\r
+               }\r
+               while (ps<end);\r
+       }\r
+       else\r
+       {\r
+               ps=data+32; end=ps+256;\r
+               \r
+               // Reduce 5 pixels into 4\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[1]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[2]]+gColorMapTab[ps[3]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[4]];pd+=xpitch;\r
+                       ps+=5;\r
+               }\r
+               while (ps<end);\r
+       }\r
+       return retValue;\r
+}\r
+\r
+static int EmulateScanFullRight16_176Interpolate(unsigned int scan,unsigned short *data)\r
+{\r
+       unsigned short *ps=NULL,*end=NULL;\r
+       unsigned char *pd=NULL;\r
+       int xpitch=0;\r
+       int retValue = 0;\r
+       if(scan<224)\r
+               retValue = 1-(gLineTable[scan+1]-gLineTable[scan]);\r
+       scan = gLineTable[scan];\r
+\r
+       if ((int)scan< 0) return 0; // Out of range\r
+       if ((int)scan>=176) return 0; // Out of range\r
+       \r
+       pd=Targ.screen+gLineOffsets[scan];//Targ.screen+Targ.scanline_length-scan*2-8;\r
+       \r
+       xpitch=+Targ.scanline_length;\r
+       if((Pico.video.reg[12]&1))\r
+       {\r
+               ps=data; end=ps+320;\r
+               // Reduce 14 pixels into 9\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[1]]+gColorMapTab[ps[2]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[3]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[6]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[7]]+gColorMapTab[ps[8]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[9]]+gColorMapTab[ps[10]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[11]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[12]]+gColorMapTab[ps[13]])>>1);pd+=xpitch;\r
+                       ps+=14;\r
+               }\r
+               while (ps<end);\r
+       }\r
+       else\r
+       {\r
+               ps=data+32; end=ps+256;\r
+               // Reduce 5 pixels into 4\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[1]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[2]]+gColorMapTab[ps[3]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[4]];pd+=xpitch;\r
+                       ps+=5;\r
+               }\r
+               while (ps<end);\r
+       }\r
+       \r
+       return retValue;\r
+}\r
+\r
+\r
+\r
+static int EmulateScan16_176Interpolate(unsigned int scan,unsigned short *data)\r
+{\r
+       unsigned short *ps=NULL,*end=NULL;\r
+       unsigned char *pd=NULL;\r
+       int xpitch=0;\r
+       int retValue = 0;\r
+       if(scan<224)\r
+               retValue = 1-(gLineTable[scan+1]-gLineTable[scan]);\r
+       scan = gLineTable[scan];\r
+       \r
+       if ((int)scan< 0) return 0; // Out of range\r
+       if ((int)scan>=176) return 0; // Out of range\r
+       \r
+       pd=Targ.screen+gLineOffsets[scan];//Targ.screen+scan*Targ.scanline_length;\r
+       \r
+       xpitch=2;\r
+       if((Pico.video.reg[12]&1))\r
+       {\r
+               ps=data; end=ps+320;\r
+               // Reduce 9 pixels into 5\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[0]]+gColorMapTab[ps[1]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[2]]+gColorMapTab[ps[3]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[6]]+gColorMapTab[ps[7]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[8]];pd+=xpitch;\r
+                       ps+=9;\r
+               }\r
+               while (ps<end);\r
+       } \r
+       else\r
+       {\r
+               ps=data+32; end=ps+256;\r
+               // Reduce 10 pixels into 7\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[1]]+gColorMapTab[ps[2]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[3]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[6]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[7]]+gColorMapTab[ps[8]])>>1);pd+=xpitch;        \r
+                       *(unsigned short *)pd=gColorMapTab[ps[9]];pd+=xpitch;\r
+                       ps+=10;\r
+               }\r
+               while (ps<end);  \r
+       }\r
+       \r
+       return retValue;\r
+}\r
+\r
+static int EmulateStretchScan16_176Interpolate(unsigned int scan,unsigned short *data)\r
+{\r
+       unsigned short *ps=NULL,*end=NULL;\r
+       unsigned char *pd=NULL;\r
+       int xpitch=0;\r
+       int retValue = 0;\r
+       if(scan<224)\r
+               retValue = 1-(gLineTable[scan+1]-gLineTable[scan]);\r
+       scan = gLineTable[scan];\r
+\r
+       if ((int)scan<0) \r
+               return 0; // Out of range\r
+       if ((int)scan>=208) \r
+               return 0; // Out of range\r
+       \r
+       pd=Targ.screen+gLineOffsets[scan];//Targ.screen+scan*Targ.scanline_length;\r
+       \r
+       xpitch=2;\r
+       if((Pico.video.reg[12]&1))\r
+       {\r
+               ps=data; end=ps+320;\r
+               // Reduce 9 pixels into 5\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[0]]+gColorMapTab[ps[1]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[2]]+gColorMapTab[ps[3]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[6]]+gColorMapTab[ps[7]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[8]];pd+=xpitch;\r
+                       ps+=9;\r
+               }\r
+               while (ps<end);\r
+       }\r
+       else\r
+       {\r
+               ps=data+32; end=ps+256;\r
+               // Reduce 10 pixels into 7\r
+               do\r
+               {\r
+                       *(unsigned short *)pd=gColorMapTab[ps[0]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[1]]+gColorMapTab[ps[2]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[3]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[4]]+gColorMapTab[ps[5]])>>1);pd+=xpitch;\r
+                       *(unsigned short *)pd=gColorMapTab[ps[6]];pd+=xpitch;\r
+                       *(unsigned short *)pd=(unsigned short)((gColorMapTab[ps[7]]+gColorMapTab[ps[8]])>>1);pd+=xpitch;        \r
+                       *(unsigned short *)pd=gColorMapTab[ps[9]];pd+=xpitch;\r
+                       ps+=10;\r
+               }\r
+               while (ps<end);  \r
+       }\r
+       \r
+       return retValue;\r
+}\r