// SpriteMap returns a sprite from the passed glob and sprite // parameters. func SpriteMap(ctx *libsass.Context, usv libsass.UnionSassValue) libsass.UnionSassValue { var glob string var spacing libsass.SassNumber err := libsass.Unmarshal(usv, &glob, &spacing) if err != nil { return libsass.Error(err) } imgs := sw.ImageList{ ImageDir: ctx.ImageDir, BuildDir: ctx.BuildDir, GenImgDir: ctx.GenImgDir, } imgs.Padding = int(spacing.Value) if cglob, err := strconv.Unquote(glob); err == nil { glob = cglob } key := glob + strconv.FormatInt(int64(spacing.Value), 10) // TODO: benchmark a single write lock against this // read lock then write lock ctx.Sprites.RLock() if _, ok := ctx.Sprites.M[key]; ok { ctx.Sprites.RUnlock() res, err := libsass.Marshal(key) if err != nil { return libsass.Error(err) } return res } ctx.Sprites.RUnlock() err = imgs.Decode(glob) if err != nil { return libsass.Error(err) } _, err = imgs.Combine() if err != nil { return libsass.Error(err) } _, err = imgs.Export() if err != nil { return libsass.Error(err) } res, err := libsass.Marshal(key) ctx.Sprites.Lock() ctx.Sprites.M[key] = imgs ctx.Sprites.Unlock() if err != nil { return libsass.Error(err) } return res }
// ImageHeight takes a file path (or sprite glob) and returns the // height in pixels of the image being referenced. func ImageHeight(ctx *libsass.Context, usv libsass.UnionSassValue) libsass.UnionSassValue { var ( glob string name string ) err := libsass.Unmarshal(usv, &name) // Check for sprite-file override first if err != nil { var inf interface{} var infs []interface{} // Can't unmarshal to []interface{}, so unmarshal to // interface{} then reflect it into a []interface{} err = libsass.Unmarshal(usv, &inf) k := reflect.ValueOf(&infs).Elem() k.Set(reflect.ValueOf(inf)) if err != nil { return libsass.Error(err) } glob = infs[0].(string) name = infs[1].(string) } imgs := sw.ImageList{ ImageDir: ctx.ImageDir, BuildDir: ctx.BuildDir, GenImgDir: ctx.GenImgDir, } if glob == "" { if hit, ok := ctx.Imgs.M[name]; ok { imgs = hit } else { imgs.Decode(name) imgs.Combine() ctx.Imgs.Lock() ctx.Imgs.M[name] = imgs ctx.Imgs.Unlock() } } else { ctx.Sprites.RLock() imgs = ctx.Sprites.M[glob] ctx.Sprites.RUnlock() } height := imgs.SImageHeight(name) Hheight := libsass.SassNumber{ Value: float64(height), Unit: "px", } res, err := libsass.Marshal(Hheight) if err != nil { fmt.Println(err) } return res }
func testSprite(ctx *libsass.Context) { // Generate test sprite imgs := spritewell.ImageList{ ImageDir: ctx.ImageDir, BuildDir: ctx.BuildDir, GenImgDir: ctx.GenImgDir, } glob := "*.png" err := imgs.Decode(glob) if err != nil { panic(err) } _, err = imgs.Combine() if err != nil { panic(err) } }