Mercurial > vba-clojure
view src/filters/interp.h @ 520:fe2b9a1fe919
reduced colors in pinkie pie mark to exactly 4.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 23 Jun 2012 17:22:32 -0500 |
parents | f9f4f1b99eed |
children |
line wrap: on
line source
1 /*2 * This file is part of the Advance project.3 *4 * Copyright (C) 2003 Andrea Mazzoleni5 *6 * This program is free software; you can redistribute it and/or modify7 * it under the terms of the GNU General Public License as published by8 * the Free Software Foundation; either version 2 of the License, or9 * (at your option) any later version.10 *11 * This program is distributed in the hope that it will be useful,12 * but WITHOUT ANY WARRANTY; without even the implied warranty of13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 * GNU General Public License for more details.15 *16 * You should have received a copy of the GNU General Public License17 * along with this program; if not, write to the Free Software18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.19 *20 * In addition, as a special exception, Andrea Mazzoleni21 * gives permission to link the code of this program with22 * the MAME library (or with modified versions of MAME that use the23 * same license as MAME), and distribute linked combinations including24 * the two. You must obey the GNU General Public License in all25 * respects for all of the code used other than MAME. If you modify26 * this file, you may extend this exception to your version of the27 * file, but you are not obligated to do so. If you do not wish to28 * do so, delete this exception statement from your version.29 */31 #ifndef __INTERP_H32 #define __INTERP_H34 /***************************************************************************/35 /* Basic types */37 /***************************************************************************/38 /* interpolation */40 extern unsigned interp_mask[2];41 extern unsigned interp_bits_per_pixel;43 #define INTERP_16_MASK_1(v) (v & interp_mask[0])44 #define INTERP_16_MASK_2(v) (v & interp_mask[1])46 static inline u16 interp_16_521(u16 p1, u16 p2, u16 p3)47 {48 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*2 + INTERP_16_MASK_1(p3)*1) / 8)49 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*2 + INTERP_16_MASK_2(p3)*1) / 8);50 }52 static inline u16 interp_16_332(u16 p1, u16 p2, u16 p3)53 {54 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)*2) / 8)55 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)*2) / 8);56 }58 static inline u16 interp_16_611(u16 p1, u16 p2, u16 p3)59 {60 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*6 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 8)61 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*6 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 8);62 }64 static inline u16 interp_16_71(u16 p1, u16 p2)65 {66 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*7 + INTERP_16_MASK_1(p2)) / 8)67 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*7 + INTERP_16_MASK_2(p2)) / 8);68 }70 static inline u16 interp_16_211(u16 p1, u16 p2, u16 p3)71 {72 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*2 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 4)73 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*2 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 4);74 }76 static inline u16 interp_16_772(u16 p1, u16 p2, u16 p3)77 {78 return INTERP_16_MASK_1(((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2))*7 + INTERP_16_MASK_1(p3)*2) / 16)79 | INTERP_16_MASK_2(((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2))*7 + INTERP_16_MASK_2(p3)*2) / 16);80 }82 static inline u16 interp_16_11(u16 p1, u16 p2)83 {84 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2)) / 2)85 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2)) / 2);86 }88 static inline u16 interp_16_31(u16 p1, u16 p2)89 {90 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)) / 4)91 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)) / 4);92 }94 static inline u16 interp_16_1411(u16 p1, u16 p2, u16 p3)95 {96 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*14 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 16)97 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*14 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 16);98 }100 static inline u16 interp_16_431(u16 p1, u16 p2, u16 p3)101 {102 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*4 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)) / 8)103 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*4 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)) / 8);104 }106 static inline u16 interp_16_53(u16 p1, u16 p2)107 {108 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*3) / 8)109 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*3) / 8);110 }112 static inline u16 interp_16_151(u16 p1, u16 p2)113 {114 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*15 + INTERP_16_MASK_1(p2)) / 16)115 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*15 + INTERP_16_MASK_2(p2)) / 16);116 }118 static inline u16 interp_16_97(u16 p1, u16 p2)119 {120 return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*9 + INTERP_16_MASK_1(p2)*7) / 16)121 | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*9 + INTERP_16_MASK_2(p2)*7) / 16);122 }124 #define INTERP_32_MASK_1(v) (v & 0xFF00FF)125 #define INTERP_32_MASK_2(v) (v & 0x00FF00)127 static inline u32 interp_32_521(u32 p1, u32 p2, u32 p3)128 {129 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*2 + INTERP_32_MASK_1(p3)*1) / 8)130 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*2 + INTERP_32_MASK_2(p3)*1) / 8);131 }133 static inline u32 interp_32_332(u32 p1, u32 p2, u32 p3)134 {135 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)*2) / 8)136 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)*2) / 8);137 }139 static inline u32 interp_32_211(u32 p1, u32 p2, u32 p3)140 {141 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*2 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 4)142 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*2 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 4);143 }145 static inline u32 interp_32_611(u32 p1, u32 p2, u32 p3)146 {147 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*6 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 8)148 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*6 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 8);149 }151 static inline u32 interp_32_71(u32 p1, u32 p2)152 {153 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*7 + INTERP_32_MASK_1(p2)) / 8)154 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*7 + INTERP_32_MASK_2(p2)) / 8);155 }157 static inline u32 interp_32_772(u32 p1, u32 p2, u32 p3)158 {159 return INTERP_32_MASK_1(((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2))*7 + INTERP_32_MASK_1(p3)*2) / 16)160 | INTERP_32_MASK_2(((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2))*7 + INTERP_32_MASK_2(p3)*2) / 16);161 }163 static inline u32 interp_32_11(u32 p1, u32 p2)164 {165 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2)) / 2)166 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2)) / 2);167 }169 static inline u32 interp_32_31(u32 p1, u32 p2)170 {171 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)) / 4)172 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)) / 4);173 }175 static inline u32 interp_32_1411(u32 p1, u32 p2, u32 p3)176 {177 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*14 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 16)178 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*14 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 16);179 }181 static inline u32 interp_32_431(u32 p1, u32 p2, u32 p3)182 {183 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*4 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)) / 8)184 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*4 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)) / 8);185 }187 static inline u32 interp_32_53(u32 p1, u32 p2)188 {189 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*3) / 8)190 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*3) / 8);191 }193 static inline u32 interp_32_151(u32 p1, u32 p2)194 {195 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*15 + INTERP_32_MASK_1(p2)) / 16)196 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*15 + INTERP_32_MASK_2(p2)) / 16);197 }199 static inline u32 interp_32_97(u32 p1, u32 p2)200 {201 return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*9 + INTERP_32_MASK_1(p2)*7) / 16)202 | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*9 + INTERP_32_MASK_2(p2)*7) / 16);203 }205 /***************************************************************************/206 /* diff */208 #define INTERP_Y_LIMIT (0x30*4)209 #define INTERP_U_LIMIT (0x07*4)210 #define INTERP_V_LIMIT (0x06*8)212 static int interp_16_diff(u16 p1, u16 p2)213 {214 int r, g, b;215 int y, u, v;217 if (p1 == p2)218 return 0;220 if (interp_bits_per_pixel == 16) {221 b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;222 g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3;223 r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;224 } else {225 b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;226 g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2;227 r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7;228 }230 y = r + g + b;231 u = r - b;232 v = -r + 2*g - b;234 if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT)235 return 1;237 if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT)238 return 1;240 if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT)241 return 1;243 return 0;244 }246 static int interp_32_diff(u32 p1, u32 p2)247 {248 int r, g, b;249 int y, u, v;251 if ((p1 & 0xF8F8F8) == (p2 & 0xF8F8F8))252 return 0;254 b = (int)((p1 & 0xFF) - (p2 & 0xFF));255 g = (int)((p1 & 0xFF00) - (p2 & 0xFF00)) >> 8;256 r = (int)((p1 & 0xFF0000) - (p2 & 0xFF0000)) >> 16;258 y = r + g + b;259 u = r - b;260 v = -r + 2*g - b;262 if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT)263 return 1;265 if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT)266 return 1;268 if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT)269 return 1;271 return 0;272 }275 #define INTERP_LIMIT2 (96000)276 #define ABS(x) ((x) < 0 ? -(x) : (x))277 #define MAX(x,y) ((x) > (y) ? (x) : (y))278 #define MIN(x,y) ((x) < (y) ? (x) : (y))280 static int interp_16_diff2(u16 p1, u16 p2)281 {282 int r, g, b;283 int y, u, v;285 if ((p1 & 0xF79E) == (p2 & 0xF79E))286 return 0;288 if (interp_bits_per_pixel == 16) {289 b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;290 g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3;291 r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;292 } else {293 b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;294 g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2;295 r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7;296 }298 // yb = 30*r + 58*g + 12*b;299 y = 33*r + 36*g + 31*b;300 u = -14*r - 29*g + 44*b;301 v = 62*r - 51*g - 10*b;303 if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2)304 return 1;305 return 0;306 }308 static int interp_32_diff2(u32 p1, u32 p2)309 {310 int r, g, b;311 int y, u, v;313 if ((p1 & 0xF0F0F0) == (p2 & 0xF0F0F0))314 return 0;316 b = (int)((p1 & 0xF8) - (p2 & 0xF8));317 g = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;318 r = (int)((p1 & 0xF80000) - (p2 & 0xF80000)) >> 16;320 // y = 30*r + 58*g + 12*b;321 y = 33*r + 36*g + 31*b;322 u = -14*r - 29*g + 44*b;323 v = 62*r - 51*g - 10*b;325 if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2)326 return 1;328 return 0;329 }331 static void interp_set(unsigned bits_per_pixel)332 {333 interp_bits_per_pixel = bits_per_pixel;335 switch (bits_per_pixel) {336 case 15 :337 interp_mask[0] = 0x7C1F;338 interp_mask[1] = 0x03E0;339 break;340 case 16 :341 interp_mask[0] = 0xF81F;342 interp_mask[1] = 0x07E0;343 break;344 case 32 :345 interp_mask[0] = 0xFF00FF;346 interp_mask[1] = 0x00FF00;347 break;348 }349 }351 #endif