1b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/*
2b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
4b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * you may not use this file except in compliance with the License.
6b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * You may obtain a copy of the License at
7b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
8b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
10b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Unless required by applicable law or agreed to in writing, software
11b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * See the License for the specific language governing permissions and
14b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * limitations under the License.
15b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
16b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
17b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypackage android.view;
18b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
19b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyimport android.graphics.Bitmap;
20b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyimport android.graphics.Canvas;
216c319ca1275c8db892c39b48fc54864c949f9171Romain Guyimport android.graphics.Paint;
227d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyimport android.graphics.Rect;
23b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
24b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
25daf98e941e140e8739458126640183b9f296a2abChet Haase * Hardware accelerated canvas.
26daf98e941e140e8739458126640183b9f296a2abChet Haase *
27daf98e941e140e8739458126640183b9f296a2abChet Haase * @hide
28b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
29daf98e941e140e8739458126640183b9f296a2abChet Haasepublic abstract class HardwareCanvas extends Canvas {
30b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    @Override
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public boolean isHardwareAccelerated() {
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return true;
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
34b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
35b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    @Override
36b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public void setBitmap(Bitmap bitmap) {
37b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        throw new UnsupportedOperationException();
38b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
39b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
40b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    /**
41b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     * Invoked before any drawing operation is performed in this canvas.
427d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy     *
437d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy     * @param dirty The dirty rectangle to update, can be null.
4444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase     * @return {@link DisplayList#STATUS_DREW} if anything was drawn (such as a call to clear
4544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase     * the canvas).
46b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     */
4744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    public abstract int onPreDraw(Rect dirty);
48b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
49b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    /**
50b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     * Invoked after all drawing operation have been performed.
51b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     */
52b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public abstract void onPostDraw();
531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase
54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    /**
55b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     * Draws the specified display list onto this canvas.
561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase     *
57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     * @param displayList The display list to replay.
58cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy     * @param dirty The dirty region to redraw in the next pass, matters only
59cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy     *        if this method returns true, can be null.
6033f6beb10f98e8ba96250e284876d607055d278dRomain Guy     * @param flags Optional flags about drawing, see {@link DisplayList} for
6133f6beb10f98e8ba96250e284876d607055d278dRomain Guy     *              the possible flags.
626554943a1dd6854c0f4976900956e556767b49e1Romain Guy     *
6344b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase     * @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW}, or
6444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase     *         {@link DisplayList#STATUS_INVOKE}, or'd with {@link DisplayList#STATUS_DREW}
6544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase     *         if anything was drawn.
66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy     */
671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    public abstract int drawDisplayList(DisplayList displayList, Rect dirty, int flags);
686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    /**
70ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * Outputs the specified display list to the log. This method exists for use by
71ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * tools to output display lists for selected nodes to the log.
72ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     *
73ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * @param displayList The display list to be logged.
74ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     */
75ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    abstract void outputDisplayList(DisplayList displayList);
76ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
77ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    /**
786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy     * Draws the specified layer onto this canvas.
796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy     *
806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy     * @param layer The layer to composite on this canvas
81ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * @param x The left coordinate of the layer
82ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * @param y The top coordinate of the layer
836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy     * @param paint The paint used to draw the layer
846c319ca1275c8db892c39b48fc54864c949f9171Romain Guy     */
85daf98e941e140e8739458126640183b9f296a2abChet Haase    abstract void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint);
86daf98e941e140e8739458126640183b9f296a2abChet Haase
87daf98e941e140e8739458126640183b9f296a2abChet Haase    /**
88daf98e941e140e8739458126640183b9f296a2abChet Haase     * Calls the function specified with the drawGLFunction function pointer. This is
89daf98e941e140e8739458126640183b9f296a2abChet Haase     * functionality used by webkit for calling into their renderer from our display lists.
90daf98e941e140e8739458126640183b9f296a2abChet Haase     * This function may return true if an invalidation is needed after the call.
91daf98e941e140e8739458126640183b9f296a2abChet Haase     *
92daf98e941e140e8739458126640183b9f296a2abChet Haase     * @param drawGLFunction A native function pointer
936554943a1dd6854c0f4976900956e556767b49e1Romain Guy     *
946554943a1dd6854c0f4976900956e556767b49e1Romain Guy     * @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW} or
956554943a1dd6854c0f4976900956e556767b49e1Romain Guy     *         {@link DisplayList#STATUS_INVOKE}
96daf98e941e140e8739458126640183b9f296a2abChet Haase     */
976554943a1dd6854c0f4976900956e556767b49e1Romain Guy    public int callDrawGLFunction(int drawGLFunction) {
98daf98e941e140e8739458126640183b9f296a2abChet Haase        // Noop - this is done in the display list recorder subclass
996554943a1dd6854c0f4976900956e556767b49e1Romain Guy        return DisplayList.STATUS_DONE;
100daf98e941e140e8739458126640183b9f296a2abChet Haase    }
1018f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
1028f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    /**
1038f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     * Invoke all the functors who requested to be invoked during the previous frame.
1048f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     *
1058f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     * @param dirty The region to redraw when the functors return {@link DisplayList#STATUS_DRAW}
1068f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     *
1078f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     * @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW} or
1088f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     *         {@link DisplayList#STATUS_INVOKE}
1098f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy     */
1108f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    public int invokeFunctors(Rect dirty) {
1118f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        return DisplayList.STATUS_DONE;
1128f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    }
113ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
114ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    /**
115ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * Detaches the specified functor from the current functor execution queue.
116ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     *
117ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @param functor The native functor to remove from the execution queue.
118ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     *
119ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #invokeFunctors(android.graphics.Rect)
120ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #callDrawGLFunction(int)
121ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #detachFunctor(int)
122ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     */
123ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    abstract void detachFunctor(int functor);
124ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
125ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    /**
126ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * Attaches the specified functor to the current functor execution queue.
127ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     *
128ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @param functor The native functor to add to the execution queue.
129ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     *
130ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #invokeFunctors(android.graphics.Rect)
131ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #callDrawGLFunction(int)
132ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     * @see #detachFunctor(int)
133ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy     */
134ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    abstract void attachFunctor(int functor);
13511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
13611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    /**
13711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * Indicates that the specified layer must be updated as soon as possible.
13811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     *
13911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * @param layer The layer to update
14011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     *
14111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * @see #clearLayerUpdates()
14211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     */
14311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    abstract void pushLayerUpdate(HardwareLayer layer);
14411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
14511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    /**
14611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * Removes all enqueued layer updates.
14711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     *
14811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * @see #pushLayerUpdate(HardwareLayer)
14911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     */
15011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    abstract void clearLayerUpdates();
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
152