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