From cbd40daf3871bcf0a0ddbc77477a7228996f89d8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 2 Oct 2009 13:25:26 -0700 Subject: [PATCH] final Native Client package - av R=r DELTA=894 (887 added, 0 deleted, 7 changed) OCL=35115 CL=35286 --- usr/rsc/nacl/av/Makefile | 13 + usr/rsc/nacl/av/av.go | 308 +++++++++++++++++++++++ usr/rsc/nacl/av/event.go | 471 ++++++++++++++++++++++++++++++++++++ usr/rsc/nacl/av/image.go | 95 ++++++++ usr/rsc/nacl/srpc/server.go | 14 +- 5 files changed, 894 insertions(+), 7 deletions(-) create mode 100644 usr/rsc/nacl/av/Makefile create mode 100644 usr/rsc/nacl/av/av.go create mode 100644 usr/rsc/nacl/av/event.go create mode 100644 usr/rsc/nacl/av/image.go diff --git a/usr/rsc/nacl/av/Makefile b/usr/rsc/nacl/av/Makefile new file mode 100644 index 0000000000..523a9fff19 --- /dev/null +++ b/usr/rsc/nacl/av/Makefile @@ -0,0 +1,13 @@ +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +include $(GOROOT)/src/Make.$(GOARCH) + +TARG=nacl/av +GOFILES=\ + av.go\ + event.go\ + image.go\ + +include $(GOROOT)/src/Make.pkg diff --git a/usr/rsc/nacl/av/av.go b/usr/rsc/nacl/av/av.go new file mode 100644 index 0000000000..8433cda547 --- /dev/null +++ b/usr/rsc/nacl/av/av.go @@ -0,0 +1,308 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Native Client audio/video + +// Package av implements audio and video access for Native Client +// binaries running standalone or embedded in a web browser window. +package av + +import ( + "bytes"; + "draw"; + "log"; + "nacl/srpc"; + "os"; + "syscall"; + "unsafe"; +) + +var srpcEnabled = srpc.Enabled(); + +// native_client/src/trusted/service_runtime/include/sys/audio_video.h + +// Subsystem values for Init. +const ( + SubsystemVideo = 1< 0 { + return 0, os.EOF; + } + n = bytes.Copy(p, b); + *r = b[n:len(b)]; + return; +} + +func (w *Window) readEvents() { + buf := make([]byte, maxEventBytes); + clean := false; + var ( + ea *activeEvent; + ee *exposeEvent; + ke *keyboardEvent; + mme *mouseMotionEvent; + mbe *mouseButtonEvent; + qe *quitEvent; + ) + var m draw.Mouse; + for { + if err := videoPollEvent(buf); err != nil { + if !clean { + clean = w.resizec <- false; + } + time.Sleep(10e6); // 10ms + continue; + } + clean = false; + var e event; + switch buf[0] { + default: + log.Stdout("unsupported event type", buf[0]); + continue; + case eventActive: + ea = new(activeEvent); + e = ea; + case eventExpose: + ee = new(exposeEvent); + e = ee; + case eventKeyDown, eventKeyUp: + ke = new(keyboardEvent); + e = ke; + case eventMouseMotion: + mme = new(mouseMotionEvent); + e = mme; + case eventMouseButtonDown, eventMouseButtonUp: + mbe = new(mouseButtonEvent); + e = mbe; + case eventQuit: + qe = new(quitEvent); + e = qe; + } + r := reader(buf); + if err := binary.Read(&r, binary.LittleEndian, e); err != nil { + log.Stdout("unpacking %T event: %s", e, err); + continue; + } + // log.Stdoutf("%#v\n", e); + switch buf[0] { + case eventExpose: + w.resizec <- true + case eventKeyDown: + w.kbdc <- int(ke.Key); + case eventKeyUp: + w.kbdc <- -int(ke.Key); + case eventMouseMotion: + m.X = int(mme.X); + m.Y = int(mme.Y); + m.Buttons = int(mme.Buttons); + m.Nsec = time.Nanoseconds(); + _ = w.mousec <- m; + case eventMouseButtonDown: + m.X = int(mbe.X); + m.Y = int(mbe.Y); + // TODO(rsc): Remove uint cast once 8g bug is fixed. + m.Buttons |= 1<>24; + a |= a<<8; + a |= a<<16; + r = (x>>16) & 0xFF; + r |= r<<8; + r |= r<<16; + g = (x>>8) & 0xFF; + g |= g<<8; + g |= g<<16; + b = x & 0xFF; + b |= b<<8; + b |= b<<16; + return; +} + +func makeColor(r, g, b, a uint32) Color { + return Color(a>>24<<24 | r>>24<<16 | g>>24<<8 | b>>24); +} + +func toColor(color image.Color) image.Color { + if c, ok := color.(Color); ok { + return c; + } + return makeColor(color.RGBA()); +} + +// ColorModel is the color model corresponding to the Native Client Color. +var ColorModel = image.ColorModelFunc(toColor); + diff --git a/usr/rsc/nacl/srpc/server.go b/usr/rsc/nacl/srpc/server.go index 4fd778d635..c4dc0a6c7d 100644 --- a/usr/rsc/nacl/srpc/server.go +++ b/usr/rsc/nacl/srpc/server.go @@ -19,10 +19,10 @@ import ( // The explicit interface is a way to attach state. // A Handler is a handler for an SRPC method. -// It reads arguments from m.Arg, checks m.Size for array limits, -// writes return values to m.Ret, and returns an Errno status code. +// It reads arguments from arg, checks size for array limits, +// writes return values to ret, and returns an Errno status code. type Handler interface { - Run(m *msg) Errno + Run(arg, ret []interface{}, size []int) Errno } type method struct { @@ -149,7 +149,7 @@ func serveMsg(m *msg, c chan<- *msg) { return; } - m.status = meth.handler.Run(m); + m.status = meth.handler.Run(m.Arg, m.Ret, m.Size); c <- m; } @@ -183,7 +183,7 @@ func Enabled() bool { // and their argument formats. type serviceDiscovery struct{} -func (serviceDiscovery) Run(m *msg) Errno { +func (serviceDiscovery) Run(arg, ret []interface{}, size []int) Errno { var b bytes.Buffer; for _, m := range rpcMethod { b.WriteString(m.name); @@ -191,10 +191,10 @@ func (serviceDiscovery) Run(m *msg) Errno { b.WriteString(m.fmt); b.WriteByte('\n'); } - if b.Len() > m.Size[0] { + if b.Len() > size[0] { return ErrNoMemory; } - m.Ret[0] = b.Bytes(); + ret[0] = b.Bytes(); return OK; } -- 2.48.1