Various additions:
- Added sub-bitmaps. - Color implements color.Color interface. - Added methods to retrieve font dimensions and its rendered text. - Added DrawPolyline method.
This commit is contained in:
parent
a761b21775
commit
8bdf7d0b76
@ -16,6 +16,7 @@ type Bitmap struct {
|
|||||||
bitmap *C.ALLEGRO_BITMAP
|
bitmap *C.ALLEGRO_BITMAP
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
|
subs []*Bitmap
|
||||||
}
|
}
|
||||||
|
|
||||||
type DrawOptions struct {
|
type DrawOptions struct {
|
||||||
@ -66,7 +67,7 @@ func newBitmap(width, height int, mut func(m FlagMutation), flags []NewBitmapFla
|
|||||||
if nil == b {
|
if nil == b {
|
||||||
return nil, errors.New("error creating bitmap")
|
return nil, errors.New("error creating bitmap")
|
||||||
}
|
}
|
||||||
return &Bitmap{b, width, height}, nil
|
return &Bitmap{b, width, height, nil}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBitmap creates a new bitmap of given width and height and optional flags
|
// NewBitmap creates a new bitmap of given width and height and optional flags
|
||||||
@ -133,7 +134,7 @@ func NewBitmapFromImage(im image.Image, video bool) (*Bitmap, error) {
|
|||||||
})
|
})
|
||||||
C.al_convert_bitmap(b)
|
C.al_convert_bitmap(b)
|
||||||
}
|
}
|
||||||
return &Bitmap{b, width, height}, nil
|
return &Bitmap{b, width, height, nil}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadBitmap tries to load the image at the specified path as a bitmap
|
// LoadBitmap tries to load the image at the specified path as a bitmap
|
||||||
@ -146,7 +147,7 @@ func LoadBitmap(path string) (*Bitmap, error) {
|
|||||||
}
|
}
|
||||||
width := int(C.al_get_bitmap_width(b))
|
width := int(C.al_get_bitmap_width(b))
|
||||||
height := int(C.al_get_bitmap_height(b))
|
height := int(C.al_get_bitmap_height(b))
|
||||||
return &Bitmap{b, width, height}, nil
|
return &Bitmap{b, width, height, nil}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw draws the bitmap at the given location
|
// Draw draws the bitmap at the given location
|
||||||
@ -206,6 +207,22 @@ func (b *Bitmap) DrawOptions(left, top float32, options DrawOptions) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sub creates a sub-bitmap of the original bitmap
|
||||||
|
func (b *Bitmap) Sub(x, y, w, h int) *Bitmap {
|
||||||
|
var sub = C.al_create_sub_bitmap(b.bitmap, C.int(x), C.int(y), C.int(w), C.int(h))
|
||||||
|
if nil == sub {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var bmp = &Bitmap{sub, w, h, nil}
|
||||||
|
b.subs = append(b.subs, bmp)
|
||||||
|
return bmp
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subs returns the slice of sub-bitmaps
|
||||||
|
func (b *Bitmap) Subs() []*Bitmap {
|
||||||
|
return b.subs
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Bitmap) Width() int {
|
func (b *Bitmap) Width() int {
|
||||||
return b.width
|
return b.width
|
||||||
}
|
}
|
||||||
@ -220,5 +237,13 @@ func (b *Bitmap) SetAsTarget() {
|
|||||||
|
|
||||||
// Destroy destroys the bitmap
|
// Destroy destroys the bitmap
|
||||||
func (b *Bitmap) Destroy() {
|
func (b *Bitmap) Destroy() {
|
||||||
C.al_destroy_bitmap(b.bitmap)
|
var bmp = b.bitmap
|
||||||
|
if nil == bmp {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.bitmap = nil
|
||||||
|
for _, sub := range b.subs {
|
||||||
|
sub.Destroy()
|
||||||
|
}
|
||||||
|
C.al_destroy_bitmap(bmp)
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,30 @@ package allegro5
|
|||||||
|
|
||||||
// #include <allegro5/allegro.h>
|
// #include <allegro5/allegro.h>
|
||||||
import "C"
|
import "C"
|
||||||
|
import "image/color"
|
||||||
|
|
||||||
|
var _ color.Color = &Color{}
|
||||||
|
|
||||||
type Color struct {
|
type Color struct {
|
||||||
color C.ALLEGRO_COLOR
|
color C.ALLEGRO_COLOR
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewColor(r, g, b byte) Color {
|
func NewColor(r, g, b byte) Color {
|
||||||
return Color{C.al_map_rgb(C.uchar(r), C.uchar(g), C.uchar(b))}
|
return Color{C.al_map_rgb(C.uchar(r), C.uchar(g), C.uchar(b))}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewColorAlpha(r, g, b, a byte) Color {
|
func NewColorAlpha(r, g, b, a byte) Color {
|
||||||
return Color{C.al_map_rgba(C.uchar(r), C.uchar(g), C.uchar(b), C.uchar(a))}
|
return Color{C.al_map_rgba(C.uchar(r), C.uchar(g), C.uchar(b), C.uchar(a))}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RGBA implements the color.Color interface.
|
||||||
|
func (c Color) RGBA() (r, g, b, a uint32) {
|
||||||
|
var cr, cg, cb, ca C.uchar
|
||||||
|
C.al_unmap_rgba(c.color, &cr, &cg, &cb, &ca)
|
||||||
|
a = uint32(ca)
|
||||||
|
r = uint32(cr) * a
|
||||||
|
g = uint32(cg) * a
|
||||||
|
b = uint32(cb) * a
|
||||||
|
a *= a
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -12,6 +12,9 @@ import (
|
|||||||
|
|
||||||
type Font struct {
|
type Font struct {
|
||||||
font *C.ALLEGRO_FONT
|
font *C.ALLEGRO_FONT
|
||||||
|
hght float32
|
||||||
|
asc float32
|
||||||
|
desc float32
|
||||||
}
|
}
|
||||||
|
|
||||||
type HorizontalAlignment int
|
type HorizontalAlignment int
|
||||||
@ -30,7 +33,7 @@ func LoadTTFFont(path string, size int) (*Font, error) {
|
|||||||
if nil == f {
|
if nil == f {
|
||||||
return nil, fmt.Errorf("unable to load ttf font '%s'", path)
|
return nil, fmt.Errorf("unable to load ttf font '%s'", path)
|
||||||
}
|
}
|
||||||
return &Font{f}, nil
|
return &Font{f, 0, 0, 0}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Font) drawFlags(a HorizontalAlignment) C.int {
|
func (f *Font) drawFlags(a HorizontalAlignment) C.int {
|
||||||
@ -53,6 +56,45 @@ func (f *Font) Draw(left, top float32, color Color, align HorizontalAlignment, t
|
|||||||
C.al_draw_text(f.font, color.color, C.float(left), C.float(top), flags, t)
|
C.al_draw_text(f.font, color.color, C.float(left), C.float(top), flags, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ascent returns the ascent of the font
|
||||||
|
func (f *Font) Ascent() float32 {
|
||||||
|
if 0 == f.asc {
|
||||||
|
f.asc = float32(C.al_get_font_ascent(f.font))
|
||||||
|
}
|
||||||
|
return f.asc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Descent returns the descent of the font.
|
||||||
|
func (f *Font) Descent() float32 {
|
||||||
|
if 0 == f.desc {
|
||||||
|
f.desc = float32(C.al_get_font_descent(f.font))
|
||||||
|
}
|
||||||
|
return f.desc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Height returns the height of the font
|
||||||
|
func (f *Font) Height() float32 {
|
||||||
|
if 0 == f.hght {
|
||||||
|
f.hght = f.Ascent() + f.Descent()
|
||||||
|
}
|
||||||
|
return f.hght
|
||||||
|
}
|
||||||
|
|
||||||
|
// TextDimensions returns the bounding box of the rendered text.
|
||||||
|
func (f *Font) TextDimensions(text string) (x, y, w, h float32) {
|
||||||
|
t := C.CString(text)
|
||||||
|
defer C.free(unsafe.Pointer(t))
|
||||||
|
|
||||||
|
var bbx, bby, bbw, bbh C.int
|
||||||
|
C.al_get_text_dimensions(f.font, t, &bbx, &bby, &bbw, &bbh)
|
||||||
|
x = float32(bbx)
|
||||||
|
y = float32(bby)
|
||||||
|
w = float32(bbw)
|
||||||
|
h = float32(bbh)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// TextWidth returns the width of the rendered text.
|
||||||
func (f *Font) TextWidth(text string) float32 {
|
func (f *Font) TextWidth(text string) float32 {
|
||||||
t := C.CString(text)
|
t := C.CString(text)
|
||||||
defer C.free(unsafe.Pointer(t))
|
defer C.free(unsafe.Pointer(t))
|
||||||
|
@ -3,6 +3,7 @@ package allegro5
|
|||||||
// #include <allegro5/allegro.h>
|
// #include <allegro5/allegro.h>
|
||||||
// #include <allegro5/allegro_primitives.h>
|
// #include <allegro5/allegro_primitives.h>
|
||||||
import "C"
|
import "C"
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
func DrawFilledRectangle(x1, y1, x2, y2 float32, c Color) {
|
func DrawFilledRectangle(x1, y1, x2, y2 float32, c Color) {
|
||||||
C.al_draw_filled_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color)
|
C.al_draw_filled_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color)
|
||||||
@ -16,6 +17,10 @@ func DrawLine(x1, y1, x2, y2 float32, c Color, thickness float32) {
|
|||||||
C.al_draw_line(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color, C.float(thickness))
|
C.al_draw_line(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color, C.float(thickness))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DrawPolyline(vertices []float32, c Color, thickness float32) {
|
||||||
|
C.al_draw_polyline((*C.float)(unsafe.Pointer(&vertices[0])), 8, C.int(len(vertices)>>1), C.ALLEGRO_LINE_JOIN_ROUND, C.ALLEGRO_LINE_CAP_ROUND, c.color, C.float(thickness), 1)
|
||||||
|
}
|
||||||
|
|
||||||
func DrawRectangle(x1, y1, x2, y2 float32, c Color, thickness float32) {
|
func DrawRectangle(x1, y1, x2, y2 float32, c Color, thickness float32) {
|
||||||
C.al_draw_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color, C.float(thickness))
|
C.al_draw_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color, C.float(thickness))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user