/* An implementation of the Scale3X edge-extrapolation algorithm. * * Code from GIMP plugin, based on code from Adam D. Moss ([email protected]) * licensed by the MIT license. */ static int extrapolate9(float *E0, float *E1, float *E2, float *E3, float *E4, float *E5, float *E6, float *E7, float *E8, const float *A, const float *B, const float *C, const float *D, const float *E, const float *F, const float *G, const float *H, const float *I) { #define PEQ(X, Y) (fabsf(*X - *Y) < 1e-3f) #define PCPY(DST, SRC) do { *DST = *SRC; } while (0) if ((!PEQ(B, H)) && (!PEQ(D, F))) { if (PEQ(D, B)) PCPY(E0, D); else PCPY(E0, E); if ((PEQ(D, B) && !PEQ(E, C)) || (PEQ(B, F) && !PEQ(E, A))) PCPY(E1, B); else PCPY(E1, E); if (PEQ(B, F)) PCPY(E2, F); else PCPY(E2, E); if ((PEQ(D, B) && !PEQ(E, G)) || (PEQ(D, H) && !PEQ(E, A))) PCPY(E3, D); else PCPY(E3, E); PCPY(E4, E); if ((PEQ(B, F) && !PEQ(E, I)) || (PEQ(H, F) && !PEQ(E, C))) PCPY(E5, F); else PCPY(E5, E); if (PEQ(D, H)) PCPY(E6, D); else PCPY(E6, E); if ((PEQ(D, H) && !PEQ(E, I)) || (PEQ(H, F) && !PEQ(E, G))) PCPY(E7, H); else PCPY(E7, E); if (PEQ(H, F)) PCPY(E8, F); else PCPY(E8, E); return 1; } else { return 0; } #undef PEQ #undef PCPY }
static int extrapolate9 (const int components, gfloat *E0, gfloat *E1, gfloat *E2, gfloat *E3, gfloat *E4, gfloat *E5, gfloat *E6, gfloat *E7, gfloat *E8, gfloat *A, gfloat *B, gfloat *C, gfloat *D, gfloat *E, gfloat *F, gfloat *G, gfloat *H, gfloat *I) { #define PEQ(X,Y) (0 == memcmp ((X), (Y), components * sizeof(gfloat))) #define PCPY(DST,SRC) memcpy ((DST), (SRC), components * sizeof(gfloat)) /* an implementation of the Scale3X edge-extrapolation algorithm */ if ( (!PEQ(B,H)) && (!PEQ(D,F)) ) { if (PEQ(D,B)) PCPY(E0,D); else PCPY(E0,E); if ((PEQ(D,B) && !PEQ(E,C)) || (PEQ(B,F) && !PEQ(E,A))) PCPY(E1,B); else PCPY(E1,E); if (PEQ(B,F)) PCPY(E2,F); else PCPY(E2,E); if ((PEQ(D,B) && !PEQ(E,G)) || (PEQ(D,H) && !PEQ(E,A))) PCPY(E3,D); else PCPY(E3,E); PCPY(E4,E); if ((PEQ(B,F) && !PEQ(E,I)) || (PEQ(H,F) && !PEQ(E,C))) PCPY(E5,F); else PCPY(E5,E); if (PEQ(D,H)) PCPY(E6,D); else PCPY(E6,E); if ((PEQ(D,H) && !PEQ(E,I)) || (PEQ(H,F) && !PEQ(E,G))) PCPY(E7,H); else PCPY(E7,E); if (PEQ(H,F)) PCPY(E8,F); else PCPY(E8,E); return 1; } else { return 0; } #undef PEQ #undef PCPY }