├── .github └── workflows │ └── go.yml ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── cmd ├── main.go └── main_test.go ├── example ├── 1 │ ├── demo.png │ └── demo_hq2x.png └── 2 │ ├── demo.png │ └── demo_hq2x.png ├── go.mod ├── hq2x.go ├── interp.go └── makefile /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Go 2 | on: 3 | push: 4 | branches: 5 | - master 6 | paths-ignore: 7 | - "README.md" 8 | 9 | jobs: 10 | build: 11 | name: Build 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@master 15 | - uses: actions/setup-go@v1 16 | with: 17 | go-version: 1.17 18 | - run: go build -o build ./cmd/main.go -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | hq2x.exe 2 | hq2x 3 | build -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[go]": { 3 | "editor.formatOnSave": true, 4 | "editor.codeActionsOnSave": { 5 | "source.organizeImports": true 6 | } 7 | }, 8 | "go.autocompleteUnimportedPackages": true 9 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hq2xgo 2 | 3 | ![Go](https://github.com/pokemium/hq2xgo/workflows/Go/badge.svg) [![GoDoc](https://godoc.org/github.com/pokemium/hq2xgo?status.svg)](https://godoc.org/github.com/pokemium/hq2xgo) 4 | 5 | Enlarge image by 2x with hq2x algorithm 6 | 7 | ## Example(Before -> After) 8 | 9 |      10 | 11 |
12 | 13 |      14 | 15 | ## Usage 16 | 17 | ### command line 18 | 19 | ```sh 20 | $ make build # require make and go 21 | $ hq2x input.png output.png 22 | ``` 23 | 24 | ### golang package 25 | 26 | See [godoc](https://godoc.org/github.com/Akatsuki-py/hq2xgo) for details. 27 | 28 | ```sh 29 | $ go get github.com/pokemium/hq2xgo 30 | ``` 31 | 32 | ```go 33 | import ( 34 | hq2x "github.com/pokemium/hq2xgo" 35 | ) 36 | 37 | after, err := hq2x.HQ2x(before) // var before *image.RGBA 38 | ``` 39 | 40 | ## Measure benchmark 41 | 42 | ```sh 43 | $ cd cmd/ 44 | $ go test -bench . 45 | ``` 46 | -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "image" 7 | "os" 8 | "path/filepath" 9 | "image/draw" 10 | 11 | hq2x "github.com/pokemium/hq2xgo" 12 | 13 | _ "image/jpeg" 14 | "image/png" 15 | _ "image/png" 16 | ) 17 | 18 | func main() { 19 | os.Exit(Run()) 20 | } 21 | 22 | // Run - run app 23 | func Run() int { 24 | flag.Parse() 25 | 26 | input := flag.Arg(0) 27 | if input == "" { 28 | help() 29 | return 0 30 | } 31 | 32 | output := flag.Arg(1) 33 | if output == "" { 34 | base, ext := getFileNameWithoutExt(input) 35 | output = base + "_hq2x" + ext 36 | } 37 | 38 | if err := doHQ2x(input, output); err != nil { 39 | fmt.Fprintln(os.Stderr, err) 40 | return 1 41 | } 42 | 43 | return 0 44 | } 45 | 46 | func imageToRGBA(im image.Image) *image.RGBA { 47 | dst := image.NewRGBA(im.Bounds()) 48 | draw.Draw(dst, im.Bounds(), im, im.Bounds().Min, draw.Src) 49 | return dst 50 | } 51 | 52 | func doHQ2x(input, output string) error { 53 | before, err := openImage(input) 54 | if err != nil { 55 | return err 56 | } 57 | 58 | b, ok := before.(*image.RGBA) 59 | if !ok { 60 | b = imageToRGBA(before) 61 | } 62 | 63 | after, err := hq2x.HQ2x(b) 64 | 65 | if err := saveImage(output, after); err != nil { 66 | return err 67 | } 68 | 69 | return nil 70 | } 71 | 72 | func help() { 73 | fmt.Println("hq2x []") 74 | } 75 | 76 | func getFileNameWithoutExt(path string) (filename string, ext string) { 77 | filename = path[:len(path)-len(filepath.Ext(path))] 78 | ext = filepath.Ext(path) 79 | return filename, ext 80 | } 81 | 82 | func openImage(path string) (image.Image, error) { 83 | file, err := os.Open(path) 84 | if err != nil { 85 | fmt.Fprintln(os.Stderr, err) 86 | } 87 | defer file.Close() 88 | 89 | img, _, err := image.Decode(file) 90 | if err != nil { 91 | return img, err 92 | } 93 | 94 | return img, nil 95 | } 96 | 97 | func saveImage(path string, img image.Image) error { 98 | file, err := os.Create(path) 99 | if err != nil { 100 | return err 101 | } 102 | defer file.Close() 103 | if err := png.Encode(file, img); err != nil { 104 | return err 105 | } 106 | return nil 107 | } 108 | -------------------------------------------------------------------------------- /cmd/main_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "image" 6 | "os" 7 | "testing" 8 | 9 | hq2x "github.com/pokemium/hq2xgo" 10 | ) 11 | 12 | func getImage(path string) (image.Image, error) { 13 | file, err := os.Open(path) 14 | if err != nil { 15 | fmt.Fprintln(os.Stderr, err) 16 | } 17 | defer file.Close() 18 | 19 | img, _, err := image.Decode(file) 20 | if err != nil { 21 | return img, err 22 | } 23 | 24 | return img, nil 25 | } 26 | 27 | func BenchmarkRun(b *testing.B) { 28 | before, err := getImage("../example/1/demo.png") 29 | if err != nil { 30 | panic(err) 31 | } 32 | 33 | b.ResetTimer() 34 | for i := 0; i < b.N; i++ { 35 | _, err := hq2x.HQ2x(before.(*image.RGBA)) 36 | if err != nil { 37 | panic(err) 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /example/1/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akatsuki105/hq2xgo/68a51b9a10cac1e4bb6fb1a049aec79f2210dc25/example/1/demo.png -------------------------------------------------------------------------------- /example/1/demo_hq2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akatsuki105/hq2xgo/68a51b9a10cac1e4bb6fb1a049aec79f2210dc25/example/1/demo_hq2x.png -------------------------------------------------------------------------------- /example/2/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akatsuki105/hq2xgo/68a51b9a10cac1e4bb6fb1a049aec79f2210dc25/example/2/demo.png -------------------------------------------------------------------------------- /example/2/demo_hq2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akatsuki105/hq2xgo/68a51b9a10cac1e4bb6fb1a049aec79f2210dc25/example/2/demo_hq2x.png -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/pokemium/hq2xgo 2 | 3 | go 1.17 4 | 5 | -------------------------------------------------------------------------------- /hq2x.go: -------------------------------------------------------------------------------- 1 | package hq2x 2 | 3 | import ( 4 | "fmt" 5 | "image" 6 | "image/color" 7 | "runtime" 8 | "sync" 9 | ) 10 | 11 | const ( 12 | TOP_LEFT = iota 13 | TOP 14 | TOP_RIGHT 15 | LEFT 16 | CENTER 17 | RIGHT 18 | BOTTOM_LEFT 19 | BOTTOM 20 | BOTTOM_RIGHT 21 | ) 22 | 23 | var ( 24 | contextFlag [9]uint8 25 | ) 26 | 27 | // HQ2x - Enlarge image by 2x with hq2x algorithm 28 | func HQ2x(src *image.RGBA) (*image.RGBA, error) { 29 | initContextFlag() 30 | srcX, srcY := src.Bounds().Dx(), src.Bounds().Dy() 31 | 32 | dest := image.NewRGBA(image.Rect(0, 0, srcX*2, srcY*2)) 33 | 34 | columns := make(chan int, srcX) 35 | for x := 0; x < srcX; x++ { 36 | columns <- x 37 | } 38 | 39 | var wg sync.WaitGroup 40 | wg.Add(srcX) 41 | for i := 0; i < runtime.NumCPU(); i++ { 42 | go worker(i, src, dest, columns, &wg) 43 | } 44 | close(columns) 45 | wg.Wait() 46 | 47 | return dest, nil 48 | } 49 | 50 | func worker(id int, src, dest *image.RGBA, columns chan int, wg *sync.WaitGroup) { 51 | for column := range columns { 52 | hq2xColumn(src, dest, column) 53 | wg.Done() 54 | } 55 | } 56 | 57 | // Apply HQ2x for column x 58 | func hq2xColumn(src, dest *image.RGBA, x int) { 59 | srcY := src.Bounds().Dy() 60 | for y := 0; y < srcY; y++ { 61 | tl, tr, bl, br := hq2xPixel(src, x, y) 62 | tl.A, tr.A, bl.A, br.A = 0xff, 0xff, 0xff, 0xff 63 | dest.Set(x*2, y*2, tl) 64 | dest.Set(x*2+1, y*2, tr) 65 | dest.Set(x*2, y*2+1, bl) 66 | dest.Set(x*2+1, y*2+1, br) 67 | } 68 | } 69 | 70 | func getPixel(src *image.RGBA, x, y int) color.RGBA { 71 | width, height := src.Bounds().Dx(), src.Bounds().Dy() 72 | 73 | if x < 0 { 74 | x = 0 75 | } else if x >= width { 76 | x = width - 1 77 | } 78 | 79 | if y < 0 { 80 | y = 0 81 | } else if y >= height { 82 | y = height - 1 83 | } 84 | 85 | return src.RGBAAt(x, y) 86 | } 87 | 88 | func hq2xPixel(src *image.RGBA, x, y int) (tl, tr, bl, br color.RGBA) { 89 | context := [9]color.RGBA{ 90 | getPixel(src, x-1, y-1), getPixel(src, x, y-1), getPixel(src, x+1, y-1), 91 | getPixel(src, x-1, y), getPixel(src, x, y), getPixel(src, x+1, y), 92 | getPixel(src, x-1, y+1), getPixel(src, x, y+1), getPixel(src, x+1, y+1), 93 | } 94 | 95 | yuvContext := [9]color.YCbCr{} 96 | yuvPixel := rgbaToYCbCr(context[CENTER]) 97 | for i := 0; i < 9; i++ { 98 | yuvContext[i] = rgbaToYCbCr(context[i]) 99 | } 100 | 101 | var pattern uint8 102 | for bit := 0; bit < 9; bit++ { 103 | if bit != CENTER && !equalYuv(yuvContext[bit], yuvPixel) { 104 | pattern |= contextFlag[bit] 105 | } 106 | } 107 | 108 | switch pattern { 109 | case 0, 1, 4, 32, 128, 5, 132, 160, 33, 129, 36, 133, 164, 161, 37, 165: 110 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 111 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 112 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 113 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 114 | 115 | case 2, 34, 130, 162: 116 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 117 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 118 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 119 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 120 | 121 | case 16, 17, 48, 49: 122 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 123 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 124 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 125 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 126 | 127 | case 64, 65, 68, 69: 128 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 129 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 130 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 131 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 132 | 133 | case 8, 12, 136, 140: 134 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 135 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 136 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 137 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 138 | 139 | case 3, 35, 131, 163: 140 | tl = interp1(context[CENTER], context[LEFT]) 141 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 142 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 143 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 144 | 145 | case 6, 38, 134, 166: 146 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 147 | tr = interp1(context[CENTER], context[RIGHT]) 148 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 149 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 150 | 151 | case 20, 21, 52, 53: 152 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 153 | tr = interp1(context[CENTER], context[TOP]) 154 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 155 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 156 | 157 | case 144, 145, 176, 177: 158 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 159 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 160 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 161 | br = interp1(context[CENTER], context[BOTTOM]) 162 | 163 | case 192, 193, 196, 197: 164 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 165 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 166 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 167 | br = interp1(context[CENTER], context[RIGHT]) 168 | 169 | case 96, 97, 100, 101: 170 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 171 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 172 | bl = interp1(context[CENTER], context[LEFT]) 173 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 174 | 175 | case 40, 44, 168, 172: 176 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 177 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 178 | bl = interp1(context[CENTER], context[BOTTOM]) 179 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 180 | 181 | case 9, 13, 137, 141: 182 | tl = interp1(context[CENTER], context[TOP]) 183 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 184 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 185 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 186 | 187 | case 18, 50: 188 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 189 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 190 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 191 | } else { 192 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 193 | } 194 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 195 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 196 | 197 | case 80, 81: 198 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 199 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 200 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 201 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 202 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 203 | } else { 204 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 205 | } 206 | 207 | case 72, 76: 208 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 209 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 210 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 211 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 212 | } else { 213 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 214 | } 215 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 216 | 217 | case 10, 138: 218 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 219 | tl = interp1(context[CENTER], context[TOP_LEFT]) 220 | } else { 221 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 222 | } 223 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 224 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 225 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 226 | 227 | case 66: 228 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 229 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 230 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 231 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 232 | 233 | case 24: 234 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 235 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 236 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 237 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 238 | 239 | case 7, 39, 135: 240 | tl = interp1(context[CENTER], context[LEFT]) 241 | tr = interp1(context[CENTER], context[RIGHT]) 242 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 243 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 244 | 245 | case 148, 149, 180: 246 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 247 | tr = interp1(context[CENTER], context[TOP]) 248 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 249 | br = interp1(context[CENTER], context[BOTTOM]) 250 | 251 | case 224, 228, 225: 252 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 253 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 254 | bl = interp1(context[CENTER], context[LEFT]) 255 | br = interp1(context[CENTER], context[RIGHT]) 256 | 257 | case 41, 169, 45: 258 | tl = interp1(context[CENTER], context[TOP]) 259 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 260 | bl = interp1(context[CENTER], context[BOTTOM]) 261 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 262 | 263 | case 22, 54: 264 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 265 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 266 | tr = context[CENTER] 267 | } else { 268 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 269 | } 270 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 271 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 272 | 273 | case 208, 209: 274 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 275 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 276 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 277 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 278 | br = context[CENTER] 279 | } else { 280 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 281 | } 282 | 283 | case 104, 108: 284 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 285 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 286 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 287 | bl = context[CENTER] 288 | } else { 289 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 290 | } 291 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 292 | 293 | case 11, 139: 294 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 295 | tl = context[CENTER] 296 | } else { 297 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 298 | } 299 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 300 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 301 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 302 | 303 | case 19, 51: 304 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 305 | tl = interp1(context[CENTER], context[LEFT]) 306 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 307 | } else { 308 | tl = interp6(context[CENTER], context[TOP], context[LEFT]) 309 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 310 | } 311 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 312 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 313 | 314 | case 146, 178: 315 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 316 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 317 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 318 | br = interp1(context[CENTER], context[BOTTOM]) 319 | } else { 320 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 321 | br = interp6(context[CENTER], context[RIGHT], context[BOTTOM]) 322 | } 323 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 324 | 325 | case 84, 85: 326 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 327 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 328 | tr = interp1(context[CENTER], context[TOP]) 329 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 330 | } else { 331 | tr = interp6(context[CENTER], context[RIGHT], context[TOP]) 332 | br = interp9(context[CENTER], context[RIGHT], context[BOTTOM]) 333 | } 334 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 335 | 336 | case 112, 113: 337 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 338 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 339 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 340 | bl = interp1(context[CENTER], context[LEFT]) 341 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 342 | } else { 343 | bl = interp6(context[CENTER], context[BOTTOM], context[LEFT]) 344 | br = interp9(context[CENTER], context[RIGHT], context[BOTTOM]) 345 | } 346 | 347 | case 200, 204: 348 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 349 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 350 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 351 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 352 | br = interp1(context[CENTER], context[RIGHT]) 353 | } else { 354 | bl = interp9(context[CENTER], context[BOTTOM], context[LEFT]) 355 | br = interp6(context[CENTER], context[BOTTOM], context[RIGHT]) 356 | } 357 | 358 | case 73, 77: 359 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 360 | tl = interp1(context[CENTER], context[TOP]) 361 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 362 | } else { 363 | tl = interp6(context[CENTER], context[LEFT], context[TOP]) 364 | bl = interp9(context[CENTER], context[BOTTOM], context[LEFT]) 365 | } 366 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 367 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 368 | 369 | case 42, 170: 370 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 371 | tl = interp1(context[CENTER], context[TOP_LEFT]) 372 | bl = interp1(context[CENTER], context[BOTTOM]) 373 | } else { 374 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 375 | bl = interp6(context[CENTER], context[LEFT], context[BOTTOM]) 376 | } 377 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 378 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 379 | 380 | case 14, 142: 381 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 382 | tl = interp1(context[CENTER], context[TOP_LEFT]) 383 | tr = interp1(context[CENTER], context[RIGHT]) 384 | } else { 385 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 386 | tr = interp6(context[CENTER], context[TOP], context[RIGHT]) 387 | } 388 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 389 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 390 | 391 | case 67: 392 | tl = interp1(context[CENTER], context[LEFT]) 393 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 394 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 395 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 396 | 397 | case 70: 398 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 399 | tr = interp1(context[CENTER], context[RIGHT]) 400 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 401 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 402 | 403 | case 28: 404 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 405 | tr = interp1(context[CENTER], context[TOP]) 406 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 407 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 408 | 409 | case 152: 410 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 411 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 412 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 413 | br = interp1(context[CENTER], context[BOTTOM]) 414 | 415 | case 194: 416 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 417 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 418 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 419 | br = interp1(context[CENTER], context[RIGHT]) 420 | 421 | case 98: 422 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 423 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 424 | bl = interp1(context[CENTER], context[LEFT]) 425 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 426 | 427 | case 56: 428 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 429 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 430 | bl = interp1(context[CENTER], context[BOTTOM]) 431 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 432 | 433 | case 25: 434 | tl = interp1(context[CENTER], context[TOP]) 435 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 436 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 437 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 438 | 439 | case 26, 31: 440 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 441 | tl = context[CENTER] 442 | } else { 443 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 444 | } 445 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 446 | tr = context[CENTER] 447 | } else { 448 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 449 | } 450 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 451 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 452 | 453 | case 82, 214: 454 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 455 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 456 | tr = context[CENTER] 457 | } else { 458 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 459 | } 460 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 461 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 462 | br = context[CENTER] 463 | } else { 464 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 465 | } 466 | 467 | case 88, 248: 468 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 469 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 470 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 471 | bl = context[CENTER] 472 | } else { 473 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 474 | } 475 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 476 | br = context[CENTER] 477 | } else { 478 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 479 | } 480 | 481 | case 74, 107: 482 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 483 | tl = context[CENTER] 484 | } else { 485 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 486 | } 487 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 488 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 489 | bl = context[CENTER] 490 | } else { 491 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 492 | } 493 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 494 | 495 | case 27: 496 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 497 | tl = context[CENTER] 498 | } else { 499 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 500 | } 501 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 502 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 503 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 504 | 505 | case 86: 506 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 507 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 508 | tr = context[CENTER] 509 | } else { 510 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 511 | } 512 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 513 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 514 | 515 | case 216: 516 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 517 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 518 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 519 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 520 | br = context[CENTER] 521 | } else { 522 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 523 | } 524 | 525 | case 106: 526 | tl = interp1(context[CENTER], context[TOP_LEFT]) 527 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 528 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 529 | bl = context[CENTER] 530 | } else { 531 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 532 | } 533 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 534 | 535 | case 30: 536 | tl = interp1(context[CENTER], context[TOP_LEFT]) 537 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 538 | tr = context[CENTER] 539 | } else { 540 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 541 | } 542 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 543 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 544 | 545 | case 210: 546 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 547 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 548 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 549 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 550 | br = context[CENTER] 551 | } else { 552 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 553 | } 554 | 555 | case 120: 556 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 557 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 558 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 559 | bl = context[CENTER] 560 | } else { 561 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 562 | } 563 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 564 | 565 | case 75: 566 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 567 | tl = context[CENTER] 568 | } else { 569 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 570 | } 571 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 572 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 573 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 574 | 575 | case 29: 576 | tl = interp1(context[CENTER], context[TOP]) 577 | tr = interp1(context[CENTER], context[TOP]) 578 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 579 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 580 | 581 | case 198: 582 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 583 | tr = interp1(context[CENTER], context[RIGHT]) 584 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 585 | br = interp1(context[CENTER], context[RIGHT]) 586 | 587 | case 184: 588 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 589 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 590 | bl = interp1(context[CENTER], context[BOTTOM]) 591 | br = interp1(context[CENTER], context[BOTTOM]) 592 | 593 | case 99: 594 | tl = interp1(context[CENTER], context[LEFT]) 595 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 596 | bl = interp1(context[CENTER], context[LEFT]) 597 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 598 | 599 | case 57: 600 | tl = interp1(context[CENTER], context[TOP]) 601 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 602 | bl = interp1(context[CENTER], context[BOTTOM]) 603 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 604 | 605 | case 71: 606 | tl = interp1(context[CENTER], context[LEFT]) 607 | tr = interp1(context[CENTER], context[RIGHT]) 608 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 609 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 610 | 611 | case 156: 612 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 613 | tr = interp1(context[CENTER], context[TOP]) 614 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 615 | br = interp1(context[CENTER], context[BOTTOM]) 616 | 617 | case 226: 618 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 619 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 620 | bl = interp1(context[CENTER], context[LEFT]) 621 | br = interp1(context[CENTER], context[RIGHT]) 622 | 623 | case 60: 624 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 625 | tr = interp1(context[CENTER], context[TOP]) 626 | bl = interp1(context[CENTER], context[BOTTOM]) 627 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 628 | 629 | case 195: 630 | tl = interp1(context[CENTER], context[LEFT]) 631 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 632 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 633 | br = interp1(context[CENTER], context[RIGHT]) 634 | 635 | case 102: 636 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 637 | tr = interp1(context[CENTER], context[RIGHT]) 638 | bl = interp1(context[CENTER], context[LEFT]) 639 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 640 | 641 | case 153: 642 | tl = interp1(context[CENTER], context[TOP]) 643 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 644 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 645 | br = interp1(context[CENTER], context[BOTTOM]) 646 | 647 | case 58: 648 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 649 | tl = interp1(context[CENTER], context[TOP_LEFT]) 650 | } else { 651 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 652 | } 653 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 654 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 655 | } else { 656 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 657 | } 658 | bl = interp1(context[CENTER], context[BOTTOM]) 659 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 660 | 661 | case 83: 662 | tl = interp1(context[CENTER], context[LEFT]) 663 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 664 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 665 | } else { 666 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 667 | } 668 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 669 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 670 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 671 | } else { 672 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 673 | } 674 | 675 | case 92: 676 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 677 | tr = interp1(context[CENTER], context[TOP]) 678 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 679 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 680 | } else { 681 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 682 | } 683 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 684 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 685 | } else { 686 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 687 | } 688 | 689 | case 202: 690 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 691 | tl = interp1(context[CENTER], context[TOP_LEFT]) 692 | } else { 693 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 694 | } 695 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 696 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 697 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 698 | } else { 699 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 700 | } 701 | br = interp1(context[CENTER], context[RIGHT]) 702 | 703 | case 78: 704 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 705 | tl = interp1(context[CENTER], context[TOP_LEFT]) 706 | } else { 707 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 708 | } 709 | tr = interp1(context[CENTER], context[RIGHT]) 710 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 711 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 712 | } else { 713 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 714 | } 715 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 716 | 717 | case 154: 718 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 719 | tl = interp1(context[CENTER], context[TOP_LEFT]) 720 | } else { 721 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 722 | } 723 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 724 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 725 | } else { 726 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 727 | } 728 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 729 | br = interp1(context[CENTER], context[BOTTOM]) 730 | 731 | case 114: 732 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 733 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 734 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 735 | } else { 736 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 737 | } 738 | bl = interp1(context[CENTER], context[LEFT]) 739 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 740 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 741 | } else { 742 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 743 | } 744 | 745 | case 89: 746 | tl = interp1(context[CENTER], context[TOP]) 747 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 748 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 749 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 750 | } else { 751 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 752 | } 753 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 754 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 755 | } else { 756 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 757 | } 758 | 759 | case 90: 760 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 761 | tl = interp1(context[CENTER], context[TOP_LEFT]) 762 | } else { 763 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 764 | } 765 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 766 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 767 | } else { 768 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 769 | } 770 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 771 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 772 | } else { 773 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 774 | } 775 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 776 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 777 | } else { 778 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 779 | } 780 | 781 | case 55, 23: 782 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 783 | tl = interp1(context[CENTER], context[LEFT]) 784 | tr = context[CENTER] 785 | } else { 786 | tl = interp6(context[CENTER], context[TOP], context[LEFT]) 787 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 788 | } 789 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 790 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 791 | 792 | case 182, 150: 793 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 794 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 795 | tr = context[CENTER] 796 | br = interp1(context[CENTER], context[BOTTOM]) 797 | } else { 798 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 799 | br = interp6(context[CENTER], context[RIGHT], context[BOTTOM]) 800 | } 801 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 802 | 803 | case 213, 212: 804 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 805 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 806 | tr = interp1(context[CENTER], context[TOP]) 807 | br = context[CENTER] 808 | } else { 809 | tr = interp6(context[CENTER], context[RIGHT], context[TOP]) 810 | br = interp9(context[CENTER], context[RIGHT], context[BOTTOM]) 811 | } 812 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 813 | 814 | case 241, 240: 815 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 816 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 817 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 818 | bl = interp1(context[CENTER], context[LEFT]) 819 | br = context[CENTER] 820 | } else { 821 | bl = interp6(context[CENTER], context[BOTTOM], context[LEFT]) 822 | br = interp9(context[CENTER], context[RIGHT], context[BOTTOM]) 823 | } 824 | 825 | case 236, 232: 826 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 827 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 828 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 829 | bl = context[CENTER] 830 | br = interp1(context[CENTER], context[RIGHT]) 831 | } else { 832 | bl = interp9(context[CENTER], context[BOTTOM], context[LEFT]) 833 | br = interp6(context[CENTER], context[BOTTOM], context[RIGHT]) 834 | } 835 | 836 | case 109, 105: 837 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 838 | tl = interp1(context[CENTER], context[TOP]) 839 | bl = context[CENTER] 840 | } else { 841 | tl = interp6(context[CENTER], context[LEFT], context[TOP]) 842 | bl = interp9(context[CENTER], context[BOTTOM], context[LEFT]) 843 | } 844 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 845 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 846 | 847 | case 171, 43: 848 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 849 | tl = context[CENTER] 850 | bl = interp1(context[CENTER], context[BOTTOM]) 851 | } else { 852 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 853 | bl = interp6(context[CENTER], context[LEFT], context[BOTTOM]) 854 | } 855 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 856 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 857 | 858 | case 143, 15: 859 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 860 | tl = context[CENTER] 861 | tr = interp1(context[CENTER], context[RIGHT]) 862 | } else { 863 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 864 | tr = interp6(context[CENTER], context[TOP], context[RIGHT]) 865 | } 866 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 867 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 868 | 869 | case 124: 870 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 871 | tr = interp1(context[CENTER], context[TOP]) 872 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 873 | bl = context[CENTER] 874 | } else { 875 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 876 | } 877 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 878 | 879 | case 203: 880 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 881 | tl = context[CENTER] 882 | } else { 883 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 884 | } 885 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 886 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 887 | br = interp1(context[CENTER], context[RIGHT]) 888 | 889 | case 62: 890 | tl = interp1(context[CENTER], context[TOP_LEFT]) 891 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 892 | tr = context[CENTER] 893 | } else { 894 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 895 | } 896 | bl = interp1(context[CENTER], context[BOTTOM]) 897 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 898 | 899 | case 211: 900 | tl = interp1(context[CENTER], context[LEFT]) 901 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 902 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 903 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 904 | br = context[CENTER] 905 | } else { 906 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 907 | } 908 | 909 | case 118: 910 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 911 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 912 | tr = context[CENTER] 913 | } else { 914 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 915 | } 916 | bl = interp1(context[CENTER], context[LEFT]) 917 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 918 | 919 | case 217: 920 | tl = interp1(context[CENTER], context[TOP]) 921 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 922 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 923 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 924 | br = context[CENTER] 925 | } else { 926 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 927 | } 928 | 929 | case 110: 930 | tl = interp1(context[CENTER], context[TOP_LEFT]) 931 | tr = interp1(context[CENTER], context[RIGHT]) 932 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 933 | bl = context[CENTER] 934 | } else { 935 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 936 | } 937 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 938 | 939 | case 155: 940 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 941 | tl = context[CENTER] 942 | } else { 943 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 944 | } 945 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 946 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 947 | br = interp1(context[CENTER], context[BOTTOM]) 948 | 949 | case 188: 950 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 951 | tr = interp1(context[CENTER], context[TOP]) 952 | bl = interp1(context[CENTER], context[BOTTOM]) 953 | br = interp1(context[CENTER], context[BOTTOM]) 954 | 955 | case 185: 956 | tl = interp1(context[CENTER], context[TOP]) 957 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 958 | bl = interp1(context[CENTER], context[BOTTOM]) 959 | br = interp1(context[CENTER], context[BOTTOM]) 960 | 961 | case 61: 962 | tl = interp1(context[CENTER], context[TOP]) 963 | tr = interp1(context[CENTER], context[TOP]) 964 | bl = interp1(context[CENTER], context[BOTTOM]) 965 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 966 | 967 | case 157: 968 | tl = interp1(context[CENTER], context[TOP]) 969 | tr = interp1(context[CENTER], context[TOP]) 970 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 971 | br = interp1(context[CENTER], context[BOTTOM]) 972 | 973 | case 103: 974 | tl = interp1(context[CENTER], context[LEFT]) 975 | tr = interp1(context[CENTER], context[RIGHT]) 976 | bl = interp1(context[CENTER], context[LEFT]) 977 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 978 | 979 | case 227: 980 | tl = interp1(context[CENTER], context[LEFT]) 981 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 982 | bl = interp1(context[CENTER], context[LEFT]) 983 | br = interp1(context[CENTER], context[RIGHT]) 984 | 985 | case 230: 986 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 987 | tr = interp1(context[CENTER], context[RIGHT]) 988 | bl = interp1(context[CENTER], context[LEFT]) 989 | br = interp1(context[CENTER], context[RIGHT]) 990 | 991 | case 199: 992 | tl = interp1(context[CENTER], context[LEFT]) 993 | tr = interp1(context[CENTER], context[RIGHT]) 994 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 995 | br = interp1(context[CENTER], context[RIGHT]) 996 | 997 | case 220: 998 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 999 | tr = interp1(context[CENTER], context[TOP]) 1000 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1001 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1002 | } else { 1003 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1004 | } 1005 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1006 | br = context[CENTER] 1007 | } else { 1008 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1009 | } 1010 | 1011 | case 158: 1012 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1013 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1014 | } else { 1015 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1016 | } 1017 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1018 | tr = context[CENTER] 1019 | } else { 1020 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1021 | } 1022 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 1023 | br = interp1(context[CENTER], context[BOTTOM]) 1024 | 1025 | case 234: 1026 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1027 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1028 | } else { 1029 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1030 | } 1031 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 1032 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1033 | bl = context[CENTER] 1034 | } else { 1035 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1036 | } 1037 | br = interp1(context[CENTER], context[RIGHT]) 1038 | 1039 | case 242: 1040 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 1041 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1042 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1043 | } else { 1044 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1045 | } 1046 | bl = interp1(context[CENTER], context[LEFT]) 1047 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1048 | br = context[CENTER] 1049 | } else { 1050 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1051 | } 1052 | 1053 | case 59: 1054 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1055 | tl = context[CENTER] 1056 | } else { 1057 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1058 | } 1059 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1060 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1061 | } else { 1062 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1063 | } 1064 | bl = interp1(context[CENTER], context[BOTTOM]) 1065 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 1066 | 1067 | case 121: 1068 | tl = interp1(context[CENTER], context[TOP]) 1069 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 1070 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1071 | bl = context[CENTER] 1072 | } else { 1073 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1074 | } 1075 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1076 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1077 | } else { 1078 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1079 | } 1080 | 1081 | case 87: 1082 | tl = interp1(context[CENTER], context[LEFT]) 1083 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1084 | tr = context[CENTER] 1085 | } else { 1086 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1087 | } 1088 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 1089 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1090 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1091 | } else { 1092 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1093 | } 1094 | 1095 | case 79: 1096 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1097 | tl = context[CENTER] 1098 | } else { 1099 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1100 | } 1101 | tr = interp1(context[CENTER], context[RIGHT]) 1102 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1103 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1104 | } else { 1105 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1106 | } 1107 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 1108 | 1109 | case 122: 1110 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1111 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1112 | } else { 1113 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1114 | } 1115 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1116 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1117 | } else { 1118 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1119 | } 1120 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1121 | bl = context[CENTER] 1122 | } else { 1123 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1124 | } 1125 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1126 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1127 | } else { 1128 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1129 | } 1130 | 1131 | case 94: 1132 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1133 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1134 | } else { 1135 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1136 | } 1137 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1138 | tr = context[CENTER] 1139 | } else { 1140 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1141 | } 1142 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1143 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1144 | } else { 1145 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1146 | } 1147 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1148 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1149 | } else { 1150 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1151 | } 1152 | 1153 | case 218: 1154 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1155 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1156 | } else { 1157 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1158 | } 1159 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1160 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1161 | } else { 1162 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1163 | } 1164 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1165 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1166 | } else { 1167 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1168 | } 1169 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1170 | br = context[CENTER] 1171 | } else { 1172 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1173 | } 1174 | 1175 | case 91: 1176 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1177 | tl = context[CENTER] 1178 | } else { 1179 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1180 | } 1181 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1182 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1183 | } else { 1184 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1185 | } 1186 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1187 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1188 | } else { 1189 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1190 | } 1191 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1192 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1193 | } else { 1194 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1195 | } 1196 | 1197 | case 229: 1198 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1199 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1200 | bl = interp1(context[CENTER], context[LEFT]) 1201 | br = interp1(context[CENTER], context[RIGHT]) 1202 | 1203 | case 167: 1204 | tl = interp1(context[CENTER], context[LEFT]) 1205 | tr = interp1(context[CENTER], context[RIGHT]) 1206 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1207 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1208 | 1209 | case 173: 1210 | tl = interp1(context[CENTER], context[TOP]) 1211 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1212 | bl = interp1(context[CENTER], context[BOTTOM]) 1213 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1214 | 1215 | case 181: 1216 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1217 | tr = interp1(context[CENTER], context[TOP]) 1218 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1219 | br = interp1(context[CENTER], context[BOTTOM]) 1220 | 1221 | case 186: 1222 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1223 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1224 | } else { 1225 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1226 | } 1227 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1228 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1229 | } else { 1230 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1231 | } 1232 | bl = interp1(context[CENTER], context[BOTTOM]) 1233 | br = interp1(context[CENTER], context[BOTTOM]) 1234 | 1235 | case 115: 1236 | tl = interp1(context[CENTER], context[LEFT]) 1237 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1238 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1239 | } else { 1240 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1241 | } 1242 | bl = interp1(context[CENTER], context[LEFT]) 1243 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1244 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1245 | } else { 1246 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1247 | } 1248 | 1249 | case 93: 1250 | tl = interp1(context[CENTER], context[TOP]) 1251 | tr = interp1(context[CENTER], context[TOP]) 1252 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1253 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1254 | } else { 1255 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1256 | } 1257 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1258 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1259 | } else { 1260 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1261 | } 1262 | 1263 | case 206: 1264 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1265 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1266 | } else { 1267 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1268 | } 1269 | tr = interp1(context[CENTER], context[RIGHT]) 1270 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1271 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1272 | } else { 1273 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1274 | } 1275 | br = interp1(context[CENTER], context[RIGHT]) 1276 | 1277 | case 205, 201: 1278 | tl = interp1(context[CENTER], context[TOP]) 1279 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1280 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1281 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1282 | } else { 1283 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1284 | } 1285 | br = interp1(context[CENTER], context[RIGHT]) 1286 | 1287 | case 174, 46: 1288 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1289 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1290 | } else { 1291 | tl = interp7(context[CENTER], context[LEFT], context[TOP]) 1292 | } 1293 | tr = interp1(context[CENTER], context[RIGHT]) 1294 | bl = interp1(context[CENTER], context[BOTTOM]) 1295 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1296 | 1297 | case 179, 147: 1298 | tl = interp1(context[CENTER], context[LEFT]) 1299 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1300 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1301 | } else { 1302 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1303 | } 1304 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1305 | br = interp1(context[CENTER], context[BOTTOM]) 1306 | 1307 | case 117, 116: 1308 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1309 | tr = interp1(context[CENTER], context[TOP]) 1310 | bl = interp1(context[CENTER], context[LEFT]) 1311 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1312 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1313 | } else { 1314 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1315 | } 1316 | 1317 | case 189: 1318 | tl = interp1(context[CENTER], context[TOP]) 1319 | tr = interp1(context[CENTER], context[TOP]) 1320 | bl = interp1(context[CENTER], context[BOTTOM]) 1321 | br = interp1(context[CENTER], context[BOTTOM]) 1322 | 1323 | case 231: 1324 | tl = interp1(context[CENTER], context[LEFT]) 1325 | tr = interp1(context[CENTER], context[RIGHT]) 1326 | bl = interp1(context[CENTER], context[LEFT]) 1327 | br = interp1(context[CENTER], context[RIGHT]) 1328 | 1329 | case 126: 1330 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1331 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1332 | tr = context[CENTER] 1333 | } else { 1334 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1335 | } 1336 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1337 | bl = context[CENTER] 1338 | } else { 1339 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1340 | } 1341 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1342 | 1343 | case 219: 1344 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1345 | tl = context[CENTER] 1346 | } else { 1347 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1348 | } 1349 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1350 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1351 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1352 | br = context[CENTER] 1353 | } else { 1354 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1355 | } 1356 | 1357 | case 125: 1358 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1359 | tl = context[CENTER] 1360 | } else { 1361 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1362 | } 1363 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1364 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1365 | } else { 1366 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1367 | } 1368 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1369 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1370 | } else { 1371 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1372 | } 1373 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1374 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1375 | } else { 1376 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1377 | } 1378 | 1379 | case 221: 1380 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1381 | tl = context[CENTER] 1382 | } else { 1383 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1384 | } 1385 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1386 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1387 | } else { 1388 | tr = interp7(context[CENTER], context[TOP], context[RIGHT]) 1389 | } 1390 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1391 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1392 | } else { 1393 | bl = interp7(context[CENTER], context[BOTTOM], context[LEFT]) 1394 | } 1395 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1396 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1397 | } else { 1398 | br = interp7(context[CENTER], context[RIGHT], context[BOTTOM]) 1399 | } 1400 | 1401 | case 207: 1402 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1403 | tl = context[CENTER] 1404 | tr = interp1(context[CENTER], context[RIGHT]) 1405 | } else { 1406 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 1407 | tr = interp6(context[CENTER], context[TOP], context[RIGHT]) 1408 | } 1409 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1410 | br = interp1(context[CENTER], context[RIGHT]) 1411 | 1412 | case 238: 1413 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1414 | tr = interp1(context[CENTER], context[RIGHT]) 1415 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1416 | bl = context[CENTER] 1417 | br = interp1(context[CENTER], context[RIGHT]) 1418 | } else { 1419 | bl = interp9(context[CENTER], context[BOTTOM], context[LEFT]) 1420 | br = interp6(context[CENTER], context[BOTTOM], context[RIGHT]) 1421 | } 1422 | 1423 | case 190: 1424 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1425 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1426 | tr = context[CENTER] 1427 | br = interp1(context[CENTER], context[BOTTOM]) 1428 | } else { 1429 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 1430 | br = interp6(context[CENTER], context[RIGHT], context[BOTTOM]) 1431 | } 1432 | bl = interp1(context[CENTER], context[BOTTOM]) 1433 | 1434 | case 187: 1435 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1436 | tl = context[CENTER] 1437 | bl = interp1(context[CENTER], context[BOTTOM]) 1438 | } else { 1439 | tl = interp9(context[CENTER], context[LEFT], context[TOP]) 1440 | bl = interp6(context[CENTER], context[LEFT], context[BOTTOM]) 1441 | } 1442 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1443 | br = interp1(context[CENTER], context[BOTTOM]) 1444 | 1445 | case 243: 1446 | tl = interp1(context[CENTER], context[LEFT]) 1447 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1448 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1449 | bl = interp1(context[CENTER], context[LEFT]) 1450 | br = context[CENTER] 1451 | } else { 1452 | bl = interp6(context[CENTER], context[BOTTOM], context[LEFT]) 1453 | br = interp9(context[CENTER], context[RIGHT], context[BOTTOM]) 1454 | } 1455 | 1456 | case 119: 1457 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1458 | tl = interp1(context[CENTER], context[LEFT]) 1459 | tr = context[CENTER] 1460 | } else { 1461 | tl = interp6(context[CENTER], context[TOP], context[LEFT]) 1462 | tr = interp9(context[CENTER], context[TOP], context[RIGHT]) 1463 | } 1464 | bl = interp1(context[CENTER], context[LEFT]) 1465 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1466 | 1467 | case 237, 233: 1468 | tl = interp1(context[CENTER], context[TOP]) 1469 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1470 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1471 | bl = context[CENTER] 1472 | } else { 1473 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1474 | } 1475 | br = interp1(context[CENTER], context[RIGHT]) 1476 | 1477 | case 175, 47: 1478 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1479 | tl = context[CENTER] 1480 | } else { 1481 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1482 | } 1483 | tr = interp1(context[CENTER], context[RIGHT]) 1484 | bl = interp1(context[CENTER], context[BOTTOM]) 1485 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1486 | 1487 | case 183, 151: 1488 | tl = interp1(context[CENTER], context[LEFT]) 1489 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1490 | tr = context[CENTER] 1491 | } else { 1492 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1493 | } 1494 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1495 | br = interp1(context[CENTER], context[BOTTOM]) 1496 | 1497 | case 245, 244: 1498 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1499 | tr = interp1(context[CENTER], context[TOP]) 1500 | bl = interp1(context[CENTER], context[LEFT]) 1501 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1502 | br = context[CENTER] 1503 | } else { 1504 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1505 | } 1506 | 1507 | case 250: 1508 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1509 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1510 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1511 | bl = context[CENTER] 1512 | } else { 1513 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1514 | } 1515 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1516 | br = context[CENTER] 1517 | } else { 1518 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1519 | } 1520 | 1521 | case 123: 1522 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1523 | tl = context[CENTER] 1524 | } else { 1525 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1526 | } 1527 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1528 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1529 | bl = context[CENTER] 1530 | } else { 1531 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1532 | } 1533 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1534 | 1535 | case 95: 1536 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1537 | tl = context[CENTER] 1538 | } else { 1539 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1540 | } 1541 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1542 | tr = context[CENTER] 1543 | } else { 1544 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1545 | } 1546 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1547 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1548 | 1549 | case 222: 1550 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1551 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1552 | tr = context[CENTER] 1553 | } else { 1554 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1555 | } 1556 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1557 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1558 | br = context[CENTER] 1559 | } else { 1560 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1561 | } 1562 | 1563 | case 252: 1564 | tl = interp2(context[CENTER], context[TOP_LEFT], context[TOP]) 1565 | tr = interp1(context[CENTER], context[TOP]) 1566 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1567 | bl = context[CENTER] 1568 | } else { 1569 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1570 | } 1571 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1572 | br = context[CENTER] 1573 | } else { 1574 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1575 | } 1576 | 1577 | case 249: 1578 | tl = interp1(context[CENTER], context[TOP]) 1579 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[TOP]) 1580 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1581 | bl = context[CENTER] 1582 | } else { 1583 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1584 | } 1585 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1586 | br = context[CENTER] 1587 | } else { 1588 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1589 | } 1590 | 1591 | case 235: 1592 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1593 | tl = context[CENTER] 1594 | } else { 1595 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1596 | } 1597 | tr = interp2(context[CENTER], context[TOP_RIGHT], context[RIGHT]) 1598 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1599 | bl = context[CENTER] 1600 | } else { 1601 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1602 | } 1603 | br = interp1(context[CENTER], context[RIGHT]) 1604 | 1605 | case 111: 1606 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1607 | tl = context[CENTER] 1608 | } else { 1609 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1610 | } 1611 | tr = interp1(context[CENTER], context[RIGHT]) 1612 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1613 | bl = context[CENTER] 1614 | } else { 1615 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1616 | } 1617 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[RIGHT]) 1618 | 1619 | case 63: 1620 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1621 | tl = context[CENTER] 1622 | } else { 1623 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1624 | } 1625 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1626 | tr = context[CENTER] 1627 | } else { 1628 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1629 | } 1630 | bl = interp1(context[CENTER], context[BOTTOM]) 1631 | br = interp2(context[CENTER], context[BOTTOM_RIGHT], context[BOTTOM]) 1632 | 1633 | case 159: 1634 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1635 | tl = context[CENTER] 1636 | } else { 1637 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1638 | } 1639 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1640 | tr = context[CENTER] 1641 | } else { 1642 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1643 | } 1644 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[BOTTOM]) 1645 | br = interp1(context[CENTER], context[BOTTOM]) 1646 | 1647 | case 215: 1648 | tl = interp1(context[CENTER], context[LEFT]) 1649 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1650 | tr = context[CENTER] 1651 | } else { 1652 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1653 | } 1654 | bl = interp2(context[CENTER], context[BOTTOM_LEFT], context[LEFT]) 1655 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1656 | br = context[CENTER] 1657 | } else { 1658 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1659 | } 1660 | 1661 | case 246: 1662 | tl = interp2(context[CENTER], context[TOP_LEFT], context[LEFT]) 1663 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1664 | tr = context[CENTER] 1665 | } else { 1666 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1667 | } 1668 | bl = interp1(context[CENTER], context[LEFT]) 1669 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1670 | br = context[CENTER] 1671 | } else { 1672 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1673 | } 1674 | 1675 | case 254: 1676 | tl = interp1(context[CENTER], context[TOP_LEFT]) 1677 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1678 | tr = context[CENTER] 1679 | } else { 1680 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1681 | } 1682 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1683 | bl = context[CENTER] 1684 | } else { 1685 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1686 | } 1687 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1688 | br = context[CENTER] 1689 | } else { 1690 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1691 | } 1692 | 1693 | case 253: 1694 | tl = interp1(context[CENTER], context[TOP]) 1695 | tr = interp1(context[CENTER], context[TOP]) 1696 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1697 | bl = context[CENTER] 1698 | } else { 1699 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1700 | } 1701 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1702 | br = context[CENTER] 1703 | } else { 1704 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1705 | } 1706 | 1707 | case 251: 1708 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1709 | tl = context[CENTER] 1710 | } else { 1711 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1712 | } 1713 | tr = interp1(context[CENTER], context[TOP_RIGHT]) 1714 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1715 | bl = context[CENTER] 1716 | } else { 1717 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1718 | } 1719 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1720 | br = context[CENTER] 1721 | } else { 1722 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1723 | } 1724 | 1725 | case 239: 1726 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1727 | tl = context[CENTER] 1728 | } else { 1729 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1730 | } 1731 | tr = interp1(context[CENTER], context[RIGHT]) 1732 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1733 | bl = context[CENTER] 1734 | } else { 1735 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1736 | } 1737 | br = interp1(context[CENTER], context[RIGHT]) 1738 | 1739 | case 127: 1740 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1741 | tl = context[CENTER] 1742 | } else { 1743 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1744 | } 1745 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1746 | tr = context[CENTER] 1747 | } else { 1748 | tr = interp2(context[CENTER], context[TOP], context[RIGHT]) 1749 | } 1750 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1751 | bl = context[CENTER] 1752 | } else { 1753 | bl = interp2(context[CENTER], context[BOTTOM], context[LEFT]) 1754 | } 1755 | br = interp1(context[CENTER], context[BOTTOM_RIGHT]) 1756 | 1757 | case 191: 1758 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1759 | tl = context[CENTER] 1760 | } else { 1761 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1762 | } 1763 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1764 | tr = context[CENTER] 1765 | } else { 1766 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1767 | } 1768 | bl = interp1(context[CENTER], context[BOTTOM]) 1769 | br = interp1(context[CENTER], context[BOTTOM]) 1770 | 1771 | case 223: 1772 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1773 | tl = context[CENTER] 1774 | } else { 1775 | tl = interp2(context[CENTER], context[LEFT], context[TOP]) 1776 | } 1777 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1778 | tr = context[CENTER] 1779 | } else { 1780 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1781 | } 1782 | bl = interp1(context[CENTER], context[BOTTOM_LEFT]) 1783 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1784 | br = context[CENTER] 1785 | } else { 1786 | br = interp2(context[CENTER], context[RIGHT], context[BOTTOM]) 1787 | } 1788 | 1789 | case 247: 1790 | tl = interp1(context[CENTER], context[LEFT]) 1791 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1792 | tr = context[CENTER] 1793 | } else { 1794 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1795 | } 1796 | bl = interp1(context[CENTER], context[LEFT]) 1797 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1798 | br = context[CENTER] 1799 | } else { 1800 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1801 | } 1802 | 1803 | case 255: 1804 | if !equalYuv(yuvContext[LEFT], yuvContext[TOP]) { 1805 | tl = context[CENTER] 1806 | } else { 1807 | tl = interp10(context[CENTER], context[LEFT], context[TOP]) 1808 | } 1809 | if !equalYuv(yuvContext[TOP], yuvContext[RIGHT]) { 1810 | tr = context[CENTER] 1811 | } else { 1812 | tr = interp10(context[CENTER], context[TOP], context[RIGHT]) 1813 | } 1814 | if !equalYuv(yuvContext[BOTTOM], yuvContext[LEFT]) { 1815 | bl = context[CENTER] 1816 | } else { 1817 | bl = interp10(context[CENTER], context[BOTTOM], context[LEFT]) 1818 | } 1819 | if !equalYuv(yuvContext[RIGHT], yuvContext[BOTTOM]) { 1820 | br = context[CENTER] 1821 | } else { 1822 | br = interp10(context[CENTER], context[RIGHT], context[BOTTOM]) 1823 | } 1824 | 1825 | default: 1826 | panic(fmt.Errorf("invalid pattern: %d", pattern)) 1827 | } 1828 | 1829 | return tl, tr, bl, br 1830 | } 1831 | 1832 | func equalYuv(a color.YCbCr, b color.YCbCr) bool { 1833 | const ( 1834 | yThreshhold = 48 * 48 1835 | uThreshhold = 7 * 7 1836 | vThreshhold = 6 * 6 1837 | ) 1838 | 1839 | aY, aU, aV := a.Y, a.Cb, a.Cr 1840 | bY, bU, bV := b.Y, b.Cb, b.Cr 1841 | 1842 | if (int(aY)-int(bY))*(int(aY)-int(bY)) > yThreshhold { 1843 | return false 1844 | } 1845 | if (int(aU)-int(bU))*(int(aU)-int(bU)) > uThreshhold { 1846 | return false 1847 | } 1848 | if (int(aV)-int(bV))*(int(aV)-int(bV)) > vThreshhold { 1849 | return false 1850 | } 1851 | 1852 | return true 1853 | } 1854 | 1855 | func initContextFlag() { 1856 | curFlag := uint8(1) 1857 | 1858 | for i := 0; i < 9; i++ { 1859 | if i == CENTER { 1860 | continue 1861 | } 1862 | 1863 | contextFlag[i] = curFlag 1864 | curFlag = curFlag << 1 1865 | } 1866 | } 1867 | 1868 | func rgbaToYCbCr(c color.RGBA) color.YCbCr { 1869 | r, g, b := c.R, c.G, c.B 1870 | y, u, v := color.RGBToYCbCr(r, g, b) 1871 | return color.YCbCr{ 1872 | Y: y, 1873 | Cb: u, 1874 | Cr: v, 1875 | } 1876 | } 1877 | -------------------------------------------------------------------------------- /interp.go: -------------------------------------------------------------------------------- 1 | package hq2x 2 | 3 | import "image/color" 4 | 5 | func _interp1(a, b uint8) uint8 { 6 | return uint8((uint(a)*3 + uint(b)) / 4) 7 | } 8 | 9 | func interp1(a, b color.RGBA) color.RGBA { 10 | R := _interp1(a.R, b.R) 11 | G := _interp1(a.G, b.G) 12 | B := _interp1(a.B, b.B) 13 | return color.RGBA{ 14 | R: R, 15 | G: G, 16 | B: B, 17 | } 18 | } 19 | 20 | func _interp2(a, b, c uint8) uint8 { 21 | return uint8((uint(a)*2 + uint(b) + uint(c)) / 4) 22 | } 23 | 24 | func interp2(a, b, c color.RGBA) color.RGBA { 25 | R := _interp2(a.R, b.R, c.R) 26 | G := _interp2(a.G, b.G, c.G) 27 | B := _interp2(a.B, b.B, c.B) 28 | return color.RGBA{ 29 | R: R, 30 | G: G, 31 | B: B, 32 | } 33 | } 34 | 35 | func _interp5(a, b uint8) uint8 { 36 | return uint8((uint(a) + uint(b)) / 2) 37 | } 38 | 39 | func interp5(a, b color.RGBA) color.RGBA { 40 | R := _interp5(a.R, b.R) 41 | G := _interp5(a.G, b.G) 42 | B := _interp5(a.B, b.B) 43 | return color.RGBA{ 44 | R: R, 45 | G: G, 46 | B: B, 47 | } 48 | } 49 | 50 | func _interp6(a, b, c uint8) uint8 { 51 | return uint8((uint(a)*5 + uint(b)*2 + uint(c)) / 8) 52 | } 53 | 54 | func interp6(a, b, c color.RGBA) color.RGBA { 55 | R := _interp6(a.R, b.R, c.R) 56 | G := _interp6(a.G, b.G, c.G) 57 | B := _interp6(a.B, b.B, c.B) 58 | return color.RGBA{ 59 | R: R, 60 | G: G, 61 | B: B, 62 | } 63 | } 64 | 65 | func _interp7(a, b, c uint8) uint8 { 66 | return uint8((uint(a)*6 + uint(b) + uint(c)) / 8) 67 | } 68 | 69 | func interp7(a, b, c color.RGBA) color.RGBA { 70 | R := _interp7(a.R, b.R, c.R) 71 | G := _interp7(a.G, b.G, c.G) 72 | B := _interp7(a.B, b.B, c.B) 73 | return color.RGBA{ 74 | R: R, 75 | G: G, 76 | B: B, 77 | } 78 | } 79 | 80 | func _interp9(a, b, c uint8) uint8 { 81 | return uint8((uint(a)*2 + uint(b)*3 + uint(c)*3) / 8) 82 | } 83 | 84 | func interp9(a, b, c color.RGBA) color.RGBA { 85 | R := _interp9(a.R, b.R, c.R) 86 | G := _interp9(a.G, b.G, c.G) 87 | B := _interp9(a.B, b.B, c.B) 88 | return color.RGBA{ 89 | R: R, 90 | G: G, 91 | B: B, 92 | } 93 | } 94 | 95 | func _interp10(a, b, c uint8) uint8 { 96 | return uint8((uint(a)*14 + uint(b) + uint(c)) / 16) 97 | } 98 | 99 | func interp10(a, b, c color.RGBA) color.RGBA { 100 | R := _interp10(a.R, b.R, c.R) 101 | G := _interp10(a.G, b.G, c.G) 102 | B := _interp10(a.B, b.B, c.B) 103 | return color.RGBA{ 104 | R: R, 105 | G: G, 106 | B: B, 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | 2 | ifdef COMSPEC 3 | EXE_EXT := .exe 4 | else 5 | EXE_EXT := 6 | endif 7 | 8 | .PHONY: build 9 | build: 10 | go build -o hq2x$(EXE_EXT) ./cmd/main.go 11 | --------------------------------------------------------------------------------