@@ -40,19 +40,19 @@ data Bilinear = Bilinear deriving Show
4040
4141-- | Bicubic interpolation method.
4242-- The parameter is usually set from -0.5 to -1.0.
43- data Bicubic = Bicubic Double deriving Show
43+ newtype Bicubic = Bicubic Double deriving Show
4444
4545
4646instance Interpolation Nearest where
4747
48- interpolate Nearest border ! sz getPx ! (i, j) =
48+ interpolate Nearest border ! sz getPx (i, j) =
4949 handleBorderIndex border sz getPx (round i, round j)
5050 {-# INLINE interpolate #-}
5151
5252
5353instance Interpolation Bilinear where
5454
55- interpolate Bilinear border ! sz getPx ! (i, j) = fi0 + jPx* (fi1- fi0) where
55+ interpolate Bilinear border ! sz getPx (i, j) = fi0 + jPx* (fi1- fi0) where
5656 getPx' = handleBorderIndex border sz getPx
5757 {-# INLINE getPx' #-}
5858 ! (i0, j0) = (floor i, floor j)
@@ -70,81 +70,81 @@ instance Interpolation Bilinear where
7070
7171instance Interpolation Bicubic where
7272
73- interpolate (Bicubic a) border ! sz getPx ! (i, j) = ( f00 + f10 + f20 + f30
74- + f01 + f11 + f21 + f31
75- + f02 + f12 + f22 + f32
76- + f03 + f13 + f23 + f33
77- ) * w where
78- getPx' = handleBorderIndex border sz getPx
79- {-# INLINE getPx' #-}
80- distX x = fromIntegral x - i
81- {-# INLINE distX #-}
82- distY y = fromIntegral y - j
83- {-# INLINE distY #-}
84- weight x
85- | x' <= 1 = (a + 2 ) * x' ** 3 - (a + 3 ) * x' ** 2 + 1
86- | x' < 2 = a * x' ** 3 - 5 * a * x' ** 2 + 8 * a * x' - 4 * a
87- | otherwise = 0
88- where x' = abs x
89- {-# INLINE weight #-}
90- ! (i1, j1) = (floor i, floor j)
91- ! (i0, j0) = (i1 - 1 , j1 - 1 )
92- ! (i2, j2) = (i1 + 1 , j1 + 1 )
93- ! (i3, j3) = (i1 + 2 , j1 + 2 )
94-
95- ! weightX0 = weight (distX i0)
96- ! weightY0 = weight (distY i0)
97- ! weightX1 = weight (distX i1)
98- ! weightY1 = weight (distY i1)
99- ! weightX2 = weight (distX i2)
100- ! weightY2 = weight (distY i2)
101- ! weightX3 = weight (distX i3)
102- ! weightY3 = weight (distY i3)
103-
104- ! weightX0Y0 = weightX0 * weightY0
105- ! weightX1Y0 = weightX1 * weightY0
106- ! weightX2Y0 = weightX2 * weightY0
107- ! weightX3Y0 = weightX3 * weightY0
108-
109- ! weightX0Y1 = weightX0 * weightY1
110- ! weightX1Y1 = weightX1 * weightY1
111- ! weightX2Y1 = weightX2 * weightY1
112- ! weightX3Y1 = weightX3 * weightY1
113-
114- ! weightX0Y2 = weightX0 * weightY2
115- ! weightX1Y2 = weightX1 * weightY2
116- ! weightX2Y2 = weightX2 * weightY2
117- ! weightX3Y2 = weightX3 * weightY2
118-
119- ! weightX0Y3 = weightX0 * weightY3
120- ! weightX1Y3 = weightX1 * weightY3
121- ! weightX2Y3 = weightX2 * weightY3
122- ! weightX3Y3 = weightX3 * weightY3
123-
124- ! f00 = getPx' (i0, j0) * promote (fromDouble weightX0Y0)
125- ! f10 = getPx' (i1, j0) * promote (fromDouble weightX1Y0)
126- ! f20 = getPx' (i2, j0) * promote (fromDouble weightX2Y0)
127- ! f30 = getPx' (i3, j0) * promote (fromDouble weightX3Y0)
128-
129- ! f01 = getPx' (i0, j1) * promote (fromDouble weightX0Y1)
130- ! f11 = getPx' (i1, j1) * promote (fromDouble weightX1Y1)
131- ! f21 = getPx' (i2, j1) * promote (fromDouble weightX2Y1)
132- ! f31 = getPx' (i3, j1) * promote (fromDouble weightX3Y1)
133-
134- ! f02 = getPx' (i0, j2) * promote (fromDouble weightX0Y2)
135- ! f12 = getPx' (i1, j2) * promote (fromDouble weightX1Y2)
136- ! f22 = getPx' (i2, j2) * promote (fromDouble weightX2Y2)
137- ! f32 = getPx' (i3, j2) * promote (fromDouble weightX3Y2)
138-
139- ! f03 = getPx' (i0, j3) * promote (fromDouble weightX0Y3)
140- ! f13 = getPx' (i1, j3) * promote (fromDouble weightX1Y3)
141- ! f23 = getPx' (i2, j3) * promote (fromDouble weightX2Y3)
142- ! f33 = getPx' (i3, j3) * promote (fromDouble weightX3Y3)
143-
144- ! w = promote . fromDouble . (1 / ) $
145- weightX0Y0 + weightX1Y0 + weightX2Y0 + weightX3Y0
146- + weightX0Y1 + weightX1Y1 + weightX2Y1 + weightX3Y1
147- + weightX0Y2 + weightX1Y2 + weightX2Y2 + weightX3Y2
148- + weightX0Y3 + weightX1Y3 + weightX2Y3 + weightX3Y3
73+ interpolate (Bicubic a) border ! sz getPx (i, j) =
74+ ( f00 + f10 + f20 + f30
75+ + f01 + f11 + f21 + f31
76+ + f02 + f12 + f22 + f32
77+ + f03 + f13 + f23 + f33 ) * promote (fromDouble (1 / w))
78+ where
79+ getPx' = handleBorderIndex border sz getPx
80+ {-# INLINE getPx' #-}
81+ distX x = fromIntegral x - i
82+ {-# INLINE distX #-}
83+ distY y = fromIntegral y - j
84+ {-# INLINE distY #-}
85+ weight x
86+ | x' <= 1 = ((a + 2 ) * x' - (a + 3 )) * x2' + 1
87+ | x' < 2 = a * ((x2' - 5 * x' + 8 ) * x' - 4 )
88+ | otherwise = 0
89+ where x' = abs x
90+ x2' = x' * x'
91+ {-# INLINE weight #-}
92+ ! (i0, j0) = (i1 - 1 , j1 - 1 )
93+ ! (i1, j1) = (floor i, floor j)
94+ ! (i2, j2) = (i1 + 1 , j1 + 1 )
95+ ! (i3, j3) = (i1 + 2 , j1 + 2 )
96+
97+ ! weightX0 = weight (distX i0)
98+ ! weightX1 = weight (distX i1)
99+ ! weightX2 = weight (distX i2)
100+ ! weightX3 = weight (distX i3)
101+ ! weightY0 = weight (distY j0)
102+ ! weightY1 = weight (distY j1)
103+ ! weightY2 = weight (distY j2)
104+ ! weightY3 = weight (distY j3)
105+
106+ ! weightX0Y0 = weightX0 * weightY0
107+ ! weightX1Y0 = weightX1 * weightY0
108+ ! weightX2Y0 = weightX2 * weightY0
109+ ! weightX3Y0 = weightX3 * weightY0
110+
111+ ! weightX0Y1 = weightX0 * weightY1
112+ ! weightX1Y1 = weightX1 * weightY1
113+ ! weightX2Y1 = weightX2 * weightY1
114+ ! weightX3Y1 = weightX3 * weightY1
115+
116+ ! weightX0Y2 = weightX0 * weightY2
117+ ! weightX1Y2 = weightX1 * weightY2
118+ ! weightX2Y2 = weightX2 * weightY2
119+ ! weightX3Y2 = weightX3 * weightY2
120+
121+ ! weightX0Y3 = weightX0 * weightY3
122+ ! weightX1Y3 = weightX1 * weightY3
123+ ! weightX2Y3 = weightX2 * weightY3
124+ ! weightX3Y3 = weightX3 * weightY3
125+
126+ ! f00 = getPx' (i0, j0) * promote (fromDouble weightX0Y0)
127+ ! f10 = getPx' (i1, j0) * promote (fromDouble weightX1Y0)
128+ ! f20 = getPx' (i2, j0) * promote (fromDouble weightX2Y0)
129+ ! f30 = getPx' (i3, j0) * promote (fromDouble weightX3Y0)
130+
131+ ! f01 = getPx' (i0, j1) * promote (fromDouble weightX0Y1)
132+ ! f11 = getPx' (i1, j1) * promote (fromDouble weightX1Y1)
133+ ! f21 = getPx' (i2, j1) * promote (fromDouble weightX2Y1)
134+ ! f31 = getPx' (i3, j1) * promote (fromDouble weightX3Y1)
135+
136+ ! f02 = getPx' (i0, j2) * promote (fromDouble weightX0Y2)
137+ ! f12 = getPx' (i1, j2) * promote (fromDouble weightX1Y2)
138+ ! f22 = getPx' (i2, j2) * promote (fromDouble weightX2Y2)
139+ ! f32 = getPx' (i3, j2) * promote (fromDouble weightX3Y2)
140+
141+ ! f03 = getPx' (i0, j3) * promote (fromDouble weightX0Y3)
142+ ! f13 = getPx' (i1, j3) * promote (fromDouble weightX1Y3)
143+ ! f23 = getPx' (i2, j3) * promote (fromDouble weightX2Y3)
144+ ! f33 = getPx' (i3, j3) * promote (fromDouble weightX3Y3)
145+
146+ ! w = weightX0Y0 + weightX1Y0 + weightX2Y0 + weightX3Y0
147+ + weightX0Y1 + weightX1Y1 + weightX2Y1 + weightX3Y1
148+ + weightX0Y2 + weightX1Y2 + weightX2Y2 + weightX3Y2
149+ + weightX0Y3 + weightX1Y3 + weightX2Y3 + weightX3Y3
149150 {-# INLINE interpolate #-}
150-
0 commit comments