15541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown/* 25541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Copyright (C) 2011 The Android Open Source Project 35541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 45541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 55541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * you may not use this file except in compliance with the License. 65541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * You may obtain a copy of the License at 75541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 85541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 95541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 105541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Unless required by applicable law or agreed to in writing, software 115541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 125541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * See the License for the specific language governing permissions and 145541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * limitations under the License. 155541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown */ 165541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 175541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#ifndef _UI_SPRITES_H 185541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#define _UI_SPRITES_H 195541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 205541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include <utils/RefBase.h> 215541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include <utils/Looper.h> 225541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 238335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/SurfaceComposerClient.h> 245541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 255541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include <SkBitmap.h> 265541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 275541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownnamespace android { 285541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 295541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown/* 305541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Transformation matrix for a sprite. 315541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown */ 325541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownstruct SpriteTransformationMatrix { 335541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline SpriteTransformationMatrix() : dsdx(1.0f), dtdx(0.0f), dsdy(0.0f), dtdy(1.0f) { } 342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline SpriteTransformationMatrix(float dsdx, float dtdx, float dsdy, float dtdy) : 352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown dsdx(dsdx), dtdx(dtdx), dsdy(dsdy), dtdy(dtdy) { } 365541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 375541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float dsdx; 385541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float dtdx; 395541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float dsdy; 405541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float dtdy; 415541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 425541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline bool operator== (const SpriteTransformationMatrix& other) { 435541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown return dsdx == other.dsdx 445541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown && dtdx == other.dtdx 455541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown && dsdy == other.dsdy 465541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown && dtdy == other.dtdy; 475541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 485541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline bool operator!= (const SpriteTransformationMatrix& other) { 505541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown return !(*this == other); 515541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 525541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown}; 535541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 545541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown/* 552352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * Icon that a sprite displays, including its hotspot. 562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown */ 572352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstruct SpriteIcon { 582352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline SpriteIcon() : hotSpotX(0), hotSpotY(0) { } 592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline SpriteIcon(const SkBitmap& bitmap, float hotSpotX, float hotSpotY) : 602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown bitmap(bitmap), hotSpotX(hotSpotX), hotSpotY(hotSpotY) { } 612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SkBitmap bitmap; 632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown float hotSpotX; 642352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown float hotSpotY; 652352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 662352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline SpriteIcon copy() const { 672352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SkBitmap bitmapCopy; 684a9c3891d4f890109e02bc83fecf9bcdf56a9395Mike Reed bitmap.copyTo(&bitmapCopy, kN32_SkColorType); 692352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown return SpriteIcon(bitmapCopy, hotSpotX, hotSpotY); 702352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline void reset() { 732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown bitmap.reset(); 742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown hotSpotX = 0; 752352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown hotSpotY = 0; 762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 772352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline bool isValid() const { 792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown return !bitmap.isNull() && !bitmap.empty(); 802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 812352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown}; 822352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 832352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown/* 845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * A sprite is a simple graphical object that is displayed on-screen above other layers. 855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * The basic sprite class is an interface. 865541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * The implementation is provided by the sprite controller. 875541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown */ 885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownclass Sprite : public RefBase { 895541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownprotected: 905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown Sprite() { } 915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual ~Sprite() { } 925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 935541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownpublic: 942352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown enum { 952352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown // The base layer for pointer sprites. 962352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown BASE_LAYER_POINTER = 0, // reserve space for 1 pointer 972352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 982352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown // The base layer for spot sprites. 992352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown BASE_LAYER_SPOT = 1, // reserve space for MAX_POINTER_ID spots 1002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown }; 1012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 1025541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets the bitmap that is drawn by the sprite. 1035541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * The sprite retains a copy of the bitmap for subsequent rendering. */ 1042352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void setIcon(const SpriteIcon& icon) = 0; 1052352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 1062352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown inline void clearIcon() { 1072352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown setIcon(SpriteIcon()); 1082352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } 1095541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1105541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets whether the sprite is visible. */ 1115541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setVisible(bool visible) = 0; 1125541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1135541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets the sprite position on screen, relative to the sprite's hot spot. */ 1145541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setPosition(float x, float y) = 0; 1155541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1165541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets the layer of the sprite, relative to the system sprite overlay layer. 1175541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Layer 0 is the overlay layer, > 0 appear above this layer. */ 1185541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setLayer(int32_t layer) = 0; 1195541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1205541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets the sprite alpha blend ratio between 0.0 and 1.0. */ 1215541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setAlpha(float alpha) = 0; 1225541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1235541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Sets the sprite transformation matrix. */ 1245541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setTransformationMatrix(const SpriteTransformationMatrix& matrix) = 0; 1255541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown}; 1265541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1275541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown/* 1285541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Displays sprites on the screen. 1295541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 1305541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * This interface is used by PointerController and SpotController to draw pointers or 1315541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * spot representations of fingers. It is not intended for general purpose use 1325541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * by other components. 1335541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 1345541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * All sprite position updates and rendering is performed asynchronously. 1355541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * 1365541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Clients are responsible for animating sprites by periodically updating their properties. 1375541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown */ 1385541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownclass SpriteController : public MessageHandler { 1395541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownprotected: 1405541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual ~SpriteController(); 1415541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1425541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownpublic: 1435541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown SpriteController(const sp<Looper>& looper, int32_t overlayLayer); 1445541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1455541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Creates a new sprite, initially invisible. */ 1465541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<Sprite> createSprite(); 1475541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown /* Opens or closes a transaction to perform a batch of sprite updates as part of 1492352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * a single operation such as setPosition and setAlpha. It is not necessary to 1502352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * open a transaction when updating a single property. 1512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * Calls to openTransaction() nest and must be matched by an equal number 1522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * of calls to closeTransaction(). */ 1532352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void openTransaction(); 1542352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown void closeTransaction(); 1552352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown 1565541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brownprivate: 1575541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown enum { 1585541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown MSG_UPDATE_SPRITES, 1595541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown MSG_DISPOSE_SURFACES, 1605541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown }; 1615541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1625541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown enum { 1635541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_BITMAP = 1 << 0, 1645541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_ALPHA = 1 << 1, 1655541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_POSITION = 1 << 2, 1665541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_TRANSFORMATION_MATRIX = 1 << 3, 1675541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_LAYER = 1 << 4, 1685541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_VISIBILITY = 1 << 5, 1695541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown DIRTY_HOTSPOT = 1 << 6, 1705541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown }; 1715541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1725541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Describes the state of a sprite. 1735541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * This structure is designed so that it can be copied during updates so that 1745541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * surfaces can be resized and redrawn without blocking the client by holding a lock 1755541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * on the sprites for a long time. 1765541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Note that the SkBitmap holds a reference to a shared (and immutable) pixel ref. */ 1775541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown struct SpriteState { 1785541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline SpriteState() : 1792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown dirty(0), visible(false), 1805541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown positionX(0), positionY(0), layer(0), alpha(1.0f), 1815541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown surfaceWidth(0), surfaceHeight(0), surfaceDrawn(false), surfaceVisible(false) { 1825541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 1835541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown uint32_t dirty; 1855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1862352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteIcon icon; 1875541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown bool visible; 1885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float positionX; 1895541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float positionY; 1905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown int32_t layer; 1915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown float alpha; 1925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown SpriteTransformationMatrix transformationMatrix; 1935541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 1945541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SurfaceControl> surfaceControl; 1955541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown int32_t surfaceWidth; 1965541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown int32_t surfaceHeight; 1975541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown bool surfaceDrawn; 1985541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown bool surfaceVisible; 1995541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2005541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline bool wantSurfaceVisible() const { 2012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown return visible && alpha > 0.0f && icon.isValid(); 2025541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 2035541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown }; 2045541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2055541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Client interface for a sprite. 2065541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * Requests acquire a lock on the controller, update local state and request the 2075541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * controller to invalidate the sprite. 2085541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * The real heavy lifting of creating, resizing and redrawing surfaces happens 2095541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * asynchronously with no locks held except in short critical section to copy 2105541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown * the sprite state before the work and update the sprite surface control afterwards. 2115541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown */ 2125541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown class SpriteImpl : public Sprite { 2135541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown protected: 2145541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual ~SpriteImpl(); 2155541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2165541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown public: 2175541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown SpriteImpl(const sp<SpriteController> controller); 2185541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown virtual void setIcon(const SpriteIcon& icon); 2205541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setVisible(bool visible); 2215541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setPosition(float x, float y); 2225541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setLayer(int32_t layer); 2235541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setAlpha(float alpha); 2245541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown virtual void setTransformationMatrix(const SpriteTransformationMatrix& matrix); 2255541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2265541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline const SpriteState& getStateLocked() const { 2272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown return mLocked.state; 2285541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 2295541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2305541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline void resetDirtyLocked() { 2312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.dirty = 0; 2325541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 2335541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2345541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline void setSurfaceLocked(const sp<SurfaceControl>& surfaceControl, 2355541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown int32_t width, int32_t height, bool drawn, bool visible) { 2362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.surfaceControl = surfaceControl; 2372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.surfaceWidth = width; 2382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.surfaceHeight = height; 2392352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.surfaceDrawn = drawn; 2402352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown mLocked.state.surfaceVisible = visible; 2415541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 2425541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2435541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown private: 2445541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteController> mController; 2455541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown struct Locked { 2472352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown SpriteState state; 2482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } mLocked; // guarded by mController->mLock 2495541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2505541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void invalidateLocked(uint32_t dirty); 2515541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown }; 2525541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2535541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown /* Stores temporary information collected during the sprite update cycle. */ 2545541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown struct SpriteUpdate { 2555541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline SpriteUpdate() : surfaceChanged(false) { } 2565541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown inline SpriteUpdate(const sp<SpriteImpl> sprite, const SpriteState& state) : 2575541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sprite(sprite), state(state), surfaceChanged(false) { 2585541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown } 2595541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2605541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SpriteImpl> sprite; 2615541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown SpriteState state; 2625541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown bool surfaceChanged; 2635541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown }; 2645541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2655541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown mutable Mutex mLock; 2665541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2675541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<Looper> mLooper; 2685541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown const int32_t mOverlayLayer; 2695541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<WeakMessageHandler> mHandler; 2705541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2715541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SurfaceComposerClient> mSurfaceComposerClient; 2725541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown struct Locked { 2742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown Vector<sp<SpriteImpl> > invalidatedSprites; 2752352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown Vector<sp<SurfaceControl> > disposedSurfaces; 2762352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown uint32_t transactionNestingCount; 2772352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown bool deferredSpriteUpdate; 2782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown } mLocked; // guarded by mLock 2795541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2805541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void invalidateSpriteLocked(const sp<SpriteImpl>& sprite); 2815541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void disposeSurfaceLocked(const sp<SurfaceControl>& surfaceControl); 2825541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2835541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void handleMessage(const Message& message); 2845541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void doUpdateSprites(); 2855541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void doDisposeSurfaces(); 2865541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2875541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown void ensureSurfaceComposerClient(); 2885541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown sp<SurfaceControl> obtainSurface(int32_t width, int32_t height); 2895541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown}; 2905541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2915541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown} // namespace android 2925541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown 2935541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#endif // _UI_SPRITES_H 294