blob: 16b6b567bcbb9e324c62c74963dacdd36cf0e9d5 [file] [log] [blame]
Romain Guy4aa90572010-09-26 18:40:37 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "OpenGLRenderer"
18
19#include "DisplayListRenderer.h"
20
21namespace android {
22namespace uirenderer {
23
24///////////////////////////////////////////////////////////////////////////////
25// Base structure
26///////////////////////////////////////////////////////////////////////////////
27
28DisplayListRenderer::DisplayListRenderer():
29 mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
30 mBitmapIndex = mMatrixIndex = mPaintIndex = 1;
31 mPathHeap = NULL;
32}
33
34DisplayListRenderer::~DisplayListRenderer() {
35 reset();
36}
37
38void DisplayListRenderer::reset() {
39 if (mPathHeap) {
40 mPathHeap->unref();
41 mPathHeap = NULL;
42 }
43
44 mBitmaps.reset();
45 mMatrices.reset();
46 mPaints.reset();
47
48 mWriter.reset();
49 mHeap.reset();
50
51 mRCRecorder.reset();
52 mTFRecorder.reset();
53}
54
55///////////////////////////////////////////////////////////////////////////////
56// Operations
57///////////////////////////////////////////////////////////////////////////////
58
59void DisplayListRenderer::acquireContext() {
60 addOp(AcquireContext);
61 OpenGLRenderer::acquireContext();
62}
63
64void DisplayListRenderer::releaseContext() {
65 addOp(ReleaseContext);
66 OpenGLRenderer::releaseContext();
67}
68
69int DisplayListRenderer::save(int flags) {
70 addOp(Save);
71 addInt(flags);
72 return OpenGLRenderer::save(flags);
73}
74
75void DisplayListRenderer::restore() {
76 addOp(Restore);
77 OpenGLRenderer::restore();
78}
79
80void DisplayListRenderer::restoreToCount(int saveCount) {
81 addOp(RestoreToCount);
82 addInt(saveCount);
83 OpenGLRenderer::restoreToCount(saveCount);
84}
85
86int DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
87 const SkPaint* p, int flags) {
88 addOp(SaveLayer);
89 addBounds(left, top, right, bottom);
90 addPaint(p);
91 addInt(flags);
92 return OpenGLRenderer::saveLayer(left, top, right, bottom, p, flags);
93}
94
95void DisplayListRenderer::translate(float dx, float dy) {
96 addOp(Translate);
97 addPoint(dx, dy);
98 OpenGLRenderer::translate(dx, dy);
99}
100
101void DisplayListRenderer::rotate(float degrees) {
102 addOp(Rotate);
103 addFloat(degrees);
104 OpenGLRenderer::rotate(degrees);
105}
106
107void DisplayListRenderer::scale(float sx, float sy) {
108 addOp(Scale);
109 addPoint(sx, sy);
110 OpenGLRenderer::scale(sx, sy);
111}
112
113void DisplayListRenderer::setMatrix(SkMatrix* matrix) {
114 addOp(SetMatrix);
115 addMatrix(matrix);
116 OpenGLRenderer::setMatrix(matrix);
117}
118
119void DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
120 addOp(ConcatMatrix);
121 addMatrix(matrix);
122 OpenGLRenderer::concatMatrix(matrix);
123}
124
125bool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
126 SkRegion::Op op) {
127 addOp(ClipRect);
128 addBounds(left, top, right, bottom);
129 addInt(op);
130 return OpenGLRenderer::clipRect(left, top, right, bottom, op);
131}
132
133void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
134 const SkPaint* paint) {
135 addOp(DrawBitmap);
136 addBitmap(bitmap);
137 addPoint(left, top);
138 addPaint(paint);
139 OpenGLRenderer::drawBitmap(bitmap, left, top, paint);
140}
141
142void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix,
143 const SkPaint* paint) {
144 addOp(DrawBitmapMatrix);
145 addBitmap(bitmap);
146 addMatrix(matrix);
147 addPaint(paint);
148 OpenGLRenderer::drawBitmap(bitmap, matrix, paint);
149}
150
151void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
152 float srcRight, float srcBottom, float dstLeft, float dstTop,
153 float dstRight, float dstBottom, const SkPaint* paint) {
154 addOp(DrawBitmapRect);
155 addBitmap(bitmap);
156 addBounds(srcLeft, srcTop, srcRight, srcBottom);
157 addBounds(dstLeft, dstTop, dstRight, dstBottom);
158 addPaint(paint);
159 OpenGLRenderer::drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom,
160 dstLeft, dstTop, dstRight, dstBottom, paint);
161}
162
163void DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
164 uint32_t width, uint32_t height, float left, float top, float right, float bottom,
165 const SkPaint* paint) {
166 addOp(DrawPatch);
167 addBitmap(bitmap);
168 addInts(xDivs, width);
169 addInts(yDivs, height);
170 addBounds(left, top, right, bottom);
171 addPaint(paint);
172 OpenGLRenderer::drawPatch(bitmap, xDivs, yDivs, width, height,
173 left, top, right, bottom, paint);
174}
175
176void DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
177 addOp(DrawColor);
178 addInt(color);
179 addInt(mode);
180 OpenGLRenderer::drawColor(color, mode);
181}
182
183void DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
184 const SkPaint* paint) {
185 addOp(DrawRect);
186 addBounds(left, top, right, bottom);
187 addPaint(paint);
188 OpenGLRenderer::drawRect(left, top, right, bottom, paint);
189}
190
191void DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
192 addOp(DrawPath);
193 addPath(path);
194 addPaint(paint);
195 OpenGLRenderer::drawPath(path, paint);
196}
197
198void DisplayListRenderer::drawLines(float* points, int count, const SkPaint* paint) {
199 addOp(DrawLines);
200 addFloats(points, count);
201 addPaint(paint);
202 OpenGLRenderer::drawLines(points, count, paint);
203}
204
205void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
206 float x, float y, SkPaint* paint) {
207 addOp(DrawText);
208 addText(text, bytesCount);
209 addInt(count);
210 addPoint(x, y);
211 addPaint(paint);
212 OpenGLRenderer::drawText(text, bytesCount, count, x, y, paint);
213}
214
215void DisplayListRenderer::resetShader() {
216 addOp(ResetShader);
217 OpenGLRenderer::resetShader();
218}
219
220void DisplayListRenderer::setupShader(SkiaShader* shader) {
221 // TODO: Implement
222 OpenGLRenderer::setupShader(shader);
223}
224
225void DisplayListRenderer::resetColorFilter() {
226 addOp(ResetColorFilter);
227 OpenGLRenderer::resetColorFilter();
228}
229
230void DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
231 // TODO: Implement
232 OpenGLRenderer::setupColorFilter(filter);
233}
234
235void DisplayListRenderer::resetShadow() {
236 addOp(ResetShadow);
237 OpenGLRenderer::resetShadow();
238}
239
240void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
241 addOp(SetupShadow);
242 addFloat(radius);
243 addPoint(dx, dy);
244 addInt(color);
245 OpenGLRenderer::setupShadow(radius, dx, dy, color);
246}
247
248///////////////////////////////////////////////////////////////////////////////
249// Recording management
250///////////////////////////////////////////////////////////////////////////////
251
252int DisplayListRenderer::find(SkTDArray<const SkFlatPaint*>& paints, const SkPaint* paint) {
253 if (paint == NULL) {
254 return 0;
255 }
256
257 SkFlatPaint* flat = SkFlatPaint::Flatten(&mHeap, *paint, mPaintIndex,
258 &mRCRecorder, &mTFRecorder);
259 int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(),
260 paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
261 if (index >= 0) {
262 (void) mHeap.unalloc(flat);
263 return paints[index]->index();
264 }
265
266 index = ~index;
267 *paints.insert(index) = flat;
268 return mPaintIndex++;
269}
270
271int DisplayListRenderer::find(SkTDArray<const SkFlatMatrix*>& matrices, const SkMatrix* matrix) {
272 if (matrix == NULL) {
273 return 0;
274 }
275
276 SkFlatMatrix* flat = SkFlatMatrix::Flatten(&mHeap, *matrix, mMatrixIndex);
277 int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(),
278 matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
279 if (index >= 0) {
280 (void) mHeap.unalloc(flat);
281 return matrices[index]->index();
282 }
283 index = ~index;
284 *matrices.insert(index) = flat;
285 return mMatrixIndex++;
286}
287
288int DisplayListRenderer::find(SkTDArray<const SkFlatBitmap*>& bitmaps, const SkBitmap& bitmap) {
289 SkFlatBitmap* flat = SkFlatBitmap::Flatten(&mHeap, bitmap, mBitmapIndex, &mRCRecorder);
290 int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(),
291 bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
292 if (index >= 0) {
293 (void) mHeap.unalloc(flat);
294 return bitmaps[index]->index();
295 }
296 index = ~index;
297 *bitmaps.insert(index) = flat;
298 return mBitmapIndex++;
299}
300
301}; // namespace uirenderer
302}; // namespace android