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  }