diff options
author | Chih-Chung Chang <chihchung@google.com> | 2010-01-21 17:31:06 -0800 |
---|---|---|
committer | Chih-Chung Chang <chihchung@google.com> | 2010-01-21 20:20:08 -0800 |
commit | 52e7200b6e020bba978c36e3a928493a3f2c8a92 (patch) | |
tree | 9c752d7d277ba2dfb9789763369a7373888557a2 /libs/surfaceflinger | |
parent | d28d5be75b41fe48f486f9b83ae8685496983f5a (diff) | |
download | frameworks_native-52e7200b6e020bba978c36e3a928493a3f2c8a92.zip frameworks_native-52e7200b6e020bba978c36e3a928493a3f2c8a92.tar.gz frameworks_native-52e7200b6e020bba978c36e3a928493a3f2c8a92.tar.bz2 |
Add an orientation parameter for overlay, so we can do camera preview in portrait mode.
Diffstat (limited to 'libs/surfaceflinger')
-rw-r--r-- | libs/surfaceflinger/LayerBase.cpp | 2 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBase.h | 2 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 19 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.h | 8 | ||||
-rw-r--r-- | libs/surfaceflinger/Transform.cpp | 11 | ||||
-rw-r--r-- | libs/surfaceflinger/Transform.h | 1 |
6 files changed, 31 insertions, 12 deletions
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp index 8003d22..17db6f4 100644 --- a/libs/surfaceflinger/LayerBase.cpp +++ b/libs/surfaceflinger/LayerBase.cpp @@ -809,7 +809,7 @@ void LayerBaseClient::Surface::unregisterBuffers() } sp<OverlayRef> LayerBaseClient::Surface::createOverlay( - uint32_t w, uint32_t h, int32_t format) + uint32_t w, uint32_t h, int32_t format, int32_t orientation) { return NULL; }; diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h index ed07b3f..f73ea0c 100644 --- a/libs/surfaceflinger/LayerBase.h +++ b/libs/surfaceflinger/LayerBase.h @@ -351,7 +351,7 @@ public: virtual void postBuffer(ssize_t offset); virtual void unregisterBuffers(); virtual sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, - int32_t format); + int32_t format, int32_t orientation); protected: friend class LayerBaseClient; diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index ac9b6b0..2735aa2 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -182,14 +182,15 @@ status_t LayerBuffer::registerBuffers(const ISurface::BufferHeap& buffers) /** * This creates an "overlay" source for this surface */ -sp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f) +sp<OverlayRef> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t f, + int32_t orientation) { sp<OverlayRef> result; Mutex::Autolock _l(mLock); if (mSource != 0) return result; - sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f); + sp<OverlaySource> source = new OverlaySource(*this, &result, w, h, f, orientation); if (result != 0) { mSource = source; } @@ -248,11 +249,11 @@ void LayerBuffer::SurfaceLayerBuffer::unregisterBuffers() } sp<OverlayRef> LayerBuffer::SurfaceLayerBuffer::createOverlay( - uint32_t w, uint32_t h, int32_t format) { + uint32_t w, uint32_t h, int32_t format, int32_t orientation) { sp<OverlayRef> result; sp<LayerBuffer> owner(getOwner()); if (owner != 0) - result = owner->createOverlay(w, h, format); + result = owner->createOverlay(w, h, format, orientation); return result; } @@ -600,9 +601,9 @@ void LayerBuffer::BufferSource::clearTempBufferImage() const LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, sp<OverlayRef>* overlayRef, - uint32_t w, uint32_t h, int32_t format) + uint32_t w, uint32_t h, int32_t format, int32_t orientation) : Source(layer), mVisibilityChanged(false), - mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) + mOverlay(0), mOverlayHandle(0), mOverlayDevice(0), mOrientation(orientation) { overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); if (overlay_dev == NULL) { @@ -684,8 +685,12 @@ void LayerBuffer::OverlaySource::onVisibilityResolved( if (mOverlay) { overlay_control_device_t* overlay_dev = mOverlayDevice; overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); + // we need to combine the layer orientation and the + // user-requested orientation. + Transform finalTransform = Transform(mOrientation) * + Transform(mLayer.getOrientation()); overlay_dev->setParameter(overlay_dev, mOverlay, - OVERLAY_TRANSFORM, mLayer.getOrientation()); + OVERLAY_TRANSFORM, finalTransform.getOrientation()); overlay_dev->commit(overlay_dev, mOverlay); } } diff --git a/libs/surfaceflinger/LayerBuffer.h b/libs/surfaceflinger/LayerBuffer.h index 1b31435..e03f92c 100644 --- a/libs/surfaceflinger/LayerBuffer.h +++ b/libs/surfaceflinger/LayerBuffer.h @@ -74,7 +74,8 @@ public: status_t registerBuffers(const ISurface::BufferHeap& buffers); void postBuffer(ssize_t offset); void unregisterBuffers(); - sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format); + sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format, + int32_t orientation); sp<Source> getSource() const; sp<Source> clearSource(); @@ -150,7 +151,7 @@ private: public: OverlaySource(LayerBuffer& layer, sp<OverlayRef>* overlayRef, - uint32_t w, uint32_t h, int32_t format); + uint32_t w, uint32_t h, int32_t format, int32_t orientation); virtual ~OverlaySource(); virtual void onDraw(const Region& clip) const; virtual void onTransaction(uint32_t flags); @@ -183,6 +184,7 @@ private: int32_t mFormat; int32_t mWidthStride; int32_t mHeightStride; + int32_t mOrientation; mutable Mutex mOverlaySourceLock; bool mInitialized; }; @@ -200,7 +202,7 @@ private: virtual void unregisterBuffers(); virtual sp<OverlayRef> createOverlay( - uint32_t w, uint32_t h, int32_t format); + uint32_t w, uint32_t h, int32_t format, int32_t orientation); private: sp<LayerBuffer> getOwner() const { return static_cast<LayerBuffer*>(Surface::getOwner().get()); diff --git a/libs/surfaceflinger/Transform.cpp b/libs/surfaceflinger/Transform.cpp index 1501536..ab6f7ba 100644 --- a/libs/surfaceflinger/Transform.cpp +++ b/libs/surfaceflinger/Transform.cpp @@ -42,6 +42,17 @@ Transform::Transform(const Transform& other) { } +Transform::Transform(int32_t flags) { + mTransform.reset(); + int sx = (flags & FLIP_H) ? -1 : 1; + int sy = (flags & FLIP_V) ? -1 : 1; + if (flags & ROT_90) { + this->set(0, -sy, sx, 0); + } else { + this->set(sx, 0, 0, sy); + } +} + Transform::~Transform() { } diff --git a/libs/surfaceflinger/Transform.h b/libs/surfaceflinger/Transform.h index 78f5c19..ddab404 100644 --- a/libs/surfaceflinger/Transform.h +++ b/libs/surfaceflinger/Transform.h @@ -38,6 +38,7 @@ class Transform public: Transform(); Transform(const Transform& other); + Transform(int32_t flags); ~Transform(); enum orientation_flags { |