github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/draw/draw_pyrdown.go (about) 1 // Copyright 2014 <chaishushan{AT}gmail.com>. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package draw 6 7 import ( 8 "image" 9 "image/draw" 10 11 image_ext "github.com/chai2010/gopkg/image" 12 ) 13 14 type Filter int 15 16 const ( 17 Filter_Average Filter = iota 18 Filter_Interlace 19 ) 20 21 // DrawPyrDown aligns r.Min in dst with sp in src and then replaces 22 // the rectangle r in dst with downsamples src. 23 func DrawPyrDown( 24 dst draw.Image, r image.Rectangle, src image.Image, sp image.Point, 25 filter Filter, 26 ) { 27 r0 := r.Intersect(dst.Bounds()).Sub(r.Min) 28 r1 := image.Rect(sp.X, sp.Y, sp.X+r.Dx()*2, sp.Y+r.Dy()*2).Intersect(src.Bounds()).Sub(sp) 29 r = r0.Intersect(image.Rect(0, 0, (r1.Max.X+1)/2, (r1.Max.Y+1)/2)).Add(r.Min) 30 31 switch filter { 32 case Filter_Average: 33 switch dst := dst.(type) { 34 case *image.Gray: 35 drawPyrDownGray_Average(dst, r, src, sp) 36 return 37 case *image.Gray16: 38 drawPyrDownGray16_Average(dst, r, src, sp) 39 return 40 case *image_ext.Gray32f: 41 drawPyrDownGray32f_Average(dst, r, src, sp) 42 return 43 case *image_ext.RGB: 44 drawPyrDownRGB_Average(dst, r, src, sp) 45 return 46 case *image_ext.RGB48: 47 drawPyrDownRGB48_Average(dst, r, src, sp) 48 return 49 case *image_ext.RGB96f: 50 drawPyrDownRGB96f_Average(dst, r, src, sp) 51 return 52 case *image.RGBA: 53 drawPyrDownRGBA_Average(dst, r, src, sp) 54 return 55 case *image.RGBA64: 56 drawPyrDownRGBA64_Average(dst, r, src, sp) 57 return 58 case *image_ext.RGBA128f: 59 drawPyrDownRGBA128f_Average(dst, r, src, sp) 60 return 61 default: 62 drawPyrDown_Average(dst, r, src, sp) 63 return 64 } 65 case Filter_Interlace: 66 switch dst := dst.(type) { 67 case *image.Gray: 68 drawPyrDownGray_Interlace(dst, r, src, sp) 69 return 70 case *image.Gray16: 71 drawPyrDownGray16_Interlace(dst, r, src, sp) 72 return 73 case *image_ext.Gray32f: 74 drawPyrDownGray32f_Interlace(dst, r, src, sp) 75 return 76 case *image_ext.RGB: 77 drawPyrDownRGB_Interlace(dst, r, src, sp) 78 return 79 case *image_ext.RGB48: 80 drawPyrDownRGB48_Interlace(dst, r, src, sp) 81 return 82 case *image_ext.RGB96f: 83 drawPyrDownRGB96f_Interlace(dst, r, src, sp) 84 return 85 case *image.RGBA: 86 drawPyrDownRGBA_Interlace(dst, r, src, sp) 87 return 88 case *image.RGBA64: 89 drawPyrDownRGBA64_Interlace(dst, r, src, sp) 90 return 91 case *image_ext.RGBA128f: 92 drawPyrDownRGBA128f_Interlace(dst, r, src, sp) 93 return 94 default: 95 drawPyrDown_Interlace(dst, r, src, sp) 96 return 97 } 98 } 99 panic("image/draw: DrawPyrDown, unreachable") 100 }