2010-09-26 18:40:37 -07:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2010-10-27 18:57:51 -07:00
|
|
|
#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
|
|
|
|
#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
|
2010-09-26 18:40:37 -07:00
|
|
|
|
|
|
|
#include <SkChunkAlloc.h>
|
|
|
|
#include <SkFlattenable.h>
|
|
|
|
#include <SkMatrix.h>
|
|
|
|
#include <SkPaint.h>
|
|
|
|
#include <SkPath.h>
|
|
|
|
#include <SkRefCnt.h>
|
|
|
|
#include <SkTDArray.h>
|
|
|
|
#include <SkTSearch.h>
|
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
#include <cutils/compiler.h>
|
|
|
|
|
2012-01-30 17:41:55 -08:00
|
|
|
#include <utils/String8.h>
|
|
|
|
|
2011-03-24 10:51:31 -07:00
|
|
|
#include "DisplayListLogBuffer.h"
|
2010-09-26 18:40:37 -07:00
|
|
|
#include "OpenGLRenderer.h"
|
2011-01-24 16:33:45 -08:00
|
|
|
#include "utils/Functor.h"
|
2010-09-26 18:40:37 -07:00
|
|
|
|
|
|
|
namespace android {
|
|
|
|
namespace uirenderer {
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Defines
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-07-27 16:28:21 -07:00
|
|
|
#define MIN_WRITER_SIZE 4096
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-01-13 17:21:49 -08:00
|
|
|
// Debug
|
|
|
|
#if DEBUG_DISPLAY_LIST
|
2011-12-20 16:23:08 +00:00
|
|
|
#define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
|
2011-01-13 17:21:49 -08:00
|
|
|
#else
|
|
|
|
#define DISPLAY_LIST_LOGD(...)
|
|
|
|
#endif
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2010-09-28 19:09:36 -07:00
|
|
|
// Display list
|
2010-09-26 18:40:37 -07:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
class DisplayListRenderer;
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
/**
|
2010-09-28 19:09:36 -07:00
|
|
|
* Replays recorded drawing commands.
|
2010-09-26 18:40:37 -07:00
|
|
|
*/
|
2010-09-28 19:09:36 -07:00
|
|
|
class DisplayList {
|
2010-09-26 18:40:37 -07:00
|
|
|
public:
|
2010-09-28 19:09:36 -07:00
|
|
|
DisplayList(const DisplayListRenderer& recorder);
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API ~DisplayList();
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-01-13 17:21:49 -08:00
|
|
|
// IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
|
|
|
|
// when modifying this file
|
2010-09-26 18:40:37 -07:00
|
|
|
enum Op {
|
2011-08-25 14:01:48 -07:00
|
|
|
// Non-drawing operations
|
2011-01-26 13:43:01 -08:00
|
|
|
Save = 0,
|
2010-09-26 18:40:37 -07:00
|
|
|
Restore,
|
|
|
|
RestoreToCount,
|
|
|
|
SaveLayer,
|
2010-10-27 18:57:51 -07:00
|
|
|
SaveLayerAlpha,
|
2010-09-26 18:40:37 -07:00
|
|
|
Translate,
|
|
|
|
Rotate,
|
|
|
|
Scale,
|
2011-01-18 11:19:19 -08:00
|
|
|
Skew,
|
2010-09-26 18:40:37 -07:00
|
|
|
SetMatrix,
|
|
|
|
ConcatMatrix,
|
|
|
|
ClipRect,
|
2011-08-25 14:01:48 -07:00
|
|
|
// Drawing operations
|
2010-11-08 12:08:41 -08:00
|
|
|
DrawDisplayList,
|
2011-01-11 14:29:25 -08:00
|
|
|
DrawLayer,
|
2010-09-26 18:40:37 -07:00
|
|
|
DrawBitmap,
|
|
|
|
DrawBitmapMatrix,
|
|
|
|
DrawBitmapRect,
|
2011-01-20 19:09:30 -08:00
|
|
|
DrawBitmapMesh,
|
2010-09-26 18:40:37 -07:00
|
|
|
DrawPatch,
|
|
|
|
DrawColor,
|
|
|
|
DrawRect,
|
2011-01-19 21:54:02 -08:00
|
|
|
DrawRoundRect,
|
|
|
|
DrawCircle,
|
2011-01-23 14:18:41 -08:00
|
|
|
DrawOval,
|
2011-01-23 16:15:02 -08:00
|
|
|
DrawArc,
|
2010-09-26 18:40:37 -07:00
|
|
|
DrawPath,
|
|
|
|
DrawLines,
|
2011-03-21 13:11:28 -07:00
|
|
|
DrawPoints,
|
2010-09-26 18:40:37 -07:00
|
|
|
DrawText,
|
2012-01-17 17:39:26 -08:00
|
|
|
DrawPosText,
|
2010-09-26 18:40:37 -07:00
|
|
|
ResetShader,
|
|
|
|
SetupShader,
|
|
|
|
ResetColorFilter,
|
|
|
|
SetupColorFilter,
|
|
|
|
ResetShadow,
|
2011-01-13 17:21:49 -08:00
|
|
|
SetupShadow,
|
2012-01-23 17:09:05 -08:00
|
|
|
ResetPaintFilter,
|
|
|
|
SetupPaintFilter,
|
2011-01-10 14:10:36 -08:00
|
|
|
DrawGLFunction,
|
2010-09-26 18:40:37 -07:00
|
|
|
};
|
|
|
|
|
2011-01-13 17:21:49 -08:00
|
|
|
static const char* OP_NAMES[];
|
|
|
|
|
2011-02-03 16:32:46 -08:00
|
|
|
void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
|
2011-01-05 18:01:22 -08:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API size_t getSize();
|
2011-07-27 18:51:50 -07:00
|
|
|
|
2011-03-07 18:06:46 -08:00
|
|
|
bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
|
2010-09-28 19:09:36 -07:00
|
|
|
|
2011-04-22 16:18:45 -07:00
|
|
|
void output(OpenGLRenderer& renderer, uint32_t level = 0);
|
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API static void outputLogBuffer(int fd);
|
2011-03-24 10:51:31 -07:00
|
|
|
|
2011-08-25 14:01:48 -07:00
|
|
|
void setRenderable(bool renderable) {
|
|
|
|
mIsRenderable = renderable;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isRenderable() const {
|
|
|
|
return mIsRenderable;
|
|
|
|
}
|
|
|
|
|
2012-01-30 17:41:55 -08:00
|
|
|
void setName(const char* name) {
|
|
|
|
if (name) {
|
|
|
|
mName.setTo(name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
private:
|
|
|
|
void init();
|
|
|
|
|
2011-02-03 16:32:46 -08:00
|
|
|
void clearResources();
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
class TextContainer {
|
|
|
|
public:
|
|
|
|
size_t length() const {
|
|
|
|
return mByteLength;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* text() const {
|
|
|
|
return (const char*) mText;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t mByteLength;
|
|
|
|
const char* mText;
|
|
|
|
};
|
|
|
|
|
|
|
|
SkBitmap* getBitmap() {
|
2010-10-08 08:37:55 -07:00
|
|
|
return (SkBitmap*) getInt();
|
|
|
|
}
|
|
|
|
|
|
|
|
SkiaShader* getShader() {
|
|
|
|
return (SkiaShader*) getInt();
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2010-10-22 16:17:12 -07:00
|
|
|
SkiaColorFilter* getColorFilter() {
|
|
|
|
return (SkiaColorFilter*) getInt();
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
inline int getIndex() {
|
|
|
|
return mReader.readInt();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int getInt() {
|
|
|
|
return mReader.readInt();
|
|
|
|
}
|
|
|
|
|
2011-03-14 18:05:08 -07:00
|
|
|
inline uint32_t getUInt() {
|
|
|
|
return mReader.readU32();
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
SkMatrix* getMatrix() {
|
2010-10-08 08:37:55 -07:00
|
|
|
return (SkMatrix*) getInt();
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
SkPath* getPath() {
|
2011-02-03 15:06:05 -08:00
|
|
|
return (SkPath*) getInt();
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2012-01-23 17:09:05 -08:00
|
|
|
SkPaint* getPaint(OpenGLRenderer& renderer) {
|
|
|
|
return renderer.filterPaint((SkPaint*) getInt());
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2010-11-08 12:08:41 -08:00
|
|
|
DisplayList* getDisplayList() {
|
|
|
|
return (DisplayList*) getInt();
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
inline float getFloat() {
|
|
|
|
return mReader.readScalar();
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t* getInts(uint32_t& count) {
|
|
|
|
count = getInt();
|
|
|
|
return (int32_t*) mReader.skip(count * sizeof(int32_t));
|
|
|
|
}
|
|
|
|
|
2010-10-12 15:59:26 -07:00
|
|
|
uint32_t* getUInts(int8_t& count) {
|
|
|
|
count = getInt();
|
|
|
|
return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
float* getFloats(int& count) {
|
|
|
|
count = getInt();
|
|
|
|
return (float*) mReader.skip(count * sizeof(float));
|
|
|
|
}
|
|
|
|
|
|
|
|
void getText(TextContainer* text) {
|
|
|
|
size_t length = text->mByteLength = getInt();
|
|
|
|
text->mText = (const char*) mReader.skip(length);
|
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
Vector<SkBitmap*> mBitmapResources;
|
2010-10-22 16:17:12 -07:00
|
|
|
Vector<SkiaColorFilter*> mFilterResources;
|
2010-09-28 19:09:36 -07:00
|
|
|
|
2010-10-25 15:47:32 -07:00
|
|
|
Vector<SkPaint*> mPaints;
|
2011-02-03 15:06:05 -08:00
|
|
|
Vector<SkPath*> mPaths;
|
2010-10-25 15:47:32 -07:00
|
|
|
Vector<SkMatrix*> mMatrices;
|
2011-01-14 15:31:00 -08:00
|
|
|
Vector<SkiaShader*> mShaders;
|
2010-10-25 15:47:32 -07:00
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
mutable SkFlattenableReadBuffer mReader;
|
2011-07-27 18:51:50 -07:00
|
|
|
|
|
|
|
size_t mSize;
|
2011-08-25 14:01:48 -07:00
|
|
|
|
|
|
|
bool mIsRenderable;
|
2012-01-30 17:41:55 -08:00
|
|
|
|
|
|
|
String8 mName;
|
2010-09-28 19:09:36 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Renderer
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Records drawing commands in a display list for latter playback.
|
|
|
|
*/
|
|
|
|
class DisplayListRenderer: public OpenGLRenderer {
|
|
|
|
public:
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API DisplayListRenderer();
|
|
|
|
virtual ~DisplayListRenderer();
|
2010-09-28 19:09:36 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
|
2011-01-05 18:01:22 -08:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void setViewport(int width, int height);
|
|
|
|
virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
|
|
|
|
virtual void finish();
|
2010-09-28 19:09:36 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual bool callDrawGLFunction(Functor *functor, Rect& dirty);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void interrupt();
|
|
|
|
virtual void resume();
|
2011-01-10 14:10:36 -08:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual int save(int flags);
|
|
|
|
virtual void restore();
|
|
|
|
virtual void restoreToCount(int saveCount);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual int saveLayer(float left, float top, float right, float bottom,
|
2010-10-08 08:37:55 -07:00
|
|
|
SkPaint* p, int flags);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual int saveLayerAlpha(float left, float top, float right, float bottom,
|
2010-10-27 18:57:51 -07:00
|
|
|
int alpha, int flags);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void translate(float dx, float dy);
|
|
|
|
virtual void rotate(float degrees);
|
|
|
|
virtual void scale(float sx, float sy);
|
|
|
|
virtual void skew(float sx, float sy);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void setMatrix(SkMatrix* matrix);
|
|
|
|
virtual void concatMatrix(SkMatrix* matrix);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
|
2011-03-14 18:05:08 -07:00
|
|
|
Rect& dirty, uint32_t level = 0);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
|
|
|
|
virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
|
|
|
|
virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
|
|
|
|
virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
|
2010-09-26 18:40:37 -07:00
|
|
|
float srcRight, float srcBottom, float dstLeft, float dstTop,
|
2010-10-08 08:37:55 -07:00
|
|
|
float dstRight, float dstBottom, SkPaint* paint);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
|
2011-01-20 19:09:30 -08:00
|
|
|
float* vertices, int* colors, SkPaint* paint);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
|
2010-10-12 15:59:26 -07:00
|
|
|
const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
|
2010-10-08 08:37:55 -07:00
|
|
|
float left, float top, float right, float bottom, SkPaint* paint);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawColor(int color, SkXfermode::Mode mode);
|
|
|
|
virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
|
|
|
|
virtual void drawRoundRect(float left, float top, float right, float bottom,
|
2011-01-19 21:54:02 -08:00
|
|
|
float rx, float ry, SkPaint* paint);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
|
|
|
|
virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
|
|
|
|
virtual void drawArc(float left, float top, float right, float bottom,
|
2011-01-23 16:15:02 -08:00
|
|
|
float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void drawPath(SkPath* path, SkPaint* paint);
|
|
|
|
virtual void drawLines(float* points, int count, SkPaint* paint);
|
|
|
|
virtual void drawPoints(float* points, int count, SkPaint* paint);
|
|
|
|
virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
|
2011-12-05 11:53:26 -08:00
|
|
|
SkPaint* paint, float length = 1.0f);
|
2012-01-17 17:39:26 -08:00
|
|
|
virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
|
|
|
|
SkPaint* paint);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void resetShader();
|
|
|
|
virtual void setupShader(SkiaShader* shader);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void resetColorFilter();
|
|
|
|
virtual void setupColorFilter(SkiaColorFilter* filter);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
virtual void resetShadow();
|
|
|
|
virtual void setupShadow(float radius, float dx, float dy, int color);
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2012-01-23 17:09:05 -08:00
|
|
|
virtual void resetPaintFilter();
|
|
|
|
virtual void setupPaintFilter(int clearBits, int setBits);
|
|
|
|
|
2011-10-12 13:48:51 -07:00
|
|
|
ANDROID_API void reset();
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
const SkWriter32& writeStream() const {
|
|
|
|
return mWriter;
|
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
const Vector<SkBitmap*>& getBitmapResources() const {
|
|
|
|
return mBitmapResources;
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2011-06-22 16:14:36 -07:00
|
|
|
const Vector<SkiaColorFilter*>& getFilterResources() const {
|
|
|
|
return mFilterResources;
|
|
|
|
}
|
|
|
|
|
2011-01-14 15:31:00 -08:00
|
|
|
const Vector<SkiaShader*>& getShaders() const {
|
|
|
|
return mShaders;
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2010-10-25 15:47:32 -07:00
|
|
|
const Vector<SkPaint*>& getPaints() const {
|
|
|
|
return mPaints;
|
2010-10-08 08:37:55 -07:00
|
|
|
}
|
|
|
|
|
2011-02-03 15:06:05 -08:00
|
|
|
const Vector<SkPath*>& getPaths() const {
|
|
|
|
return mPaths;
|
|
|
|
}
|
|
|
|
|
2010-10-25 15:47:32 -07:00
|
|
|
const Vector<SkMatrix*>& getMatrices() const {
|
|
|
|
return mMatrices;
|
2010-09-28 19:09:36 -07:00
|
|
|
}
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
private:
|
2011-01-23 12:01:41 -08:00
|
|
|
void insertRestoreToCount() {
|
|
|
|
if (mRestoreSaveCount >= 0) {
|
|
|
|
mWriter.writeInt(DisplayList::RestoreToCount);
|
|
|
|
addInt(mRestoreSaveCount);
|
|
|
|
mRestoreSaveCount = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
inline void addOp(DisplayList::Op drawOp) {
|
2011-01-23 12:01:41 -08:00
|
|
|
insertRestoreToCount();
|
2010-09-26 18:40:37 -07:00
|
|
|
mWriter.writeInt(drawOp);
|
2011-08-25 14:01:48 -07:00
|
|
|
mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
inline void addInt(int value) {
|
|
|
|
mWriter.writeInt(value);
|
|
|
|
}
|
|
|
|
|
2011-03-14 18:05:08 -07:00
|
|
|
inline void addSize(uint32_t w, uint32_t h) {
|
|
|
|
mWriter.writeInt(w);
|
|
|
|
mWriter.writeInt(h);
|
|
|
|
}
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
void addInts(const int32_t* values, uint32_t count) {
|
2010-09-28 19:09:36 -07:00
|
|
|
mWriter.writeInt(count);
|
2010-09-26 18:40:37 -07:00
|
|
|
for (uint32_t i = 0; i < count; i++) {
|
2010-10-12 15:59:26 -07:00
|
|
|
mWriter.writeInt(values[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void addUInts(const uint32_t* values, int8_t count) {
|
|
|
|
mWriter.writeInt(count);
|
|
|
|
for (int8_t i = 0; i < count; i++) {
|
2010-09-26 18:40:37 -07:00
|
|
|
mWriter.writeInt(values[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void addFloat(float value) {
|
|
|
|
mWriter.writeScalar(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
void addFloats(const float* values, int count) {
|
2010-09-28 19:09:36 -07:00
|
|
|
mWriter.writeInt(count);
|
2010-09-26 18:40:37 -07:00
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
mWriter.writeScalar(values[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void addPoint(float x, float y) {
|
|
|
|
mWriter.writeScalar(x);
|
|
|
|
mWriter.writeScalar(y);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void addBounds(float left, float top, float right, float bottom) {
|
|
|
|
mWriter.writeScalar(left);
|
|
|
|
mWriter.writeScalar(top);
|
|
|
|
mWriter.writeScalar(right);
|
|
|
|
mWriter.writeScalar(bottom);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void addText(const void* text, size_t byteLength) {
|
|
|
|
mWriter.writeInt(byteLength);
|
|
|
|
mWriter.writePad(text, byteLength);
|
|
|
|
}
|
|
|
|
|
2011-02-03 15:06:05 -08:00
|
|
|
inline void addPath(SkPath* path) {
|
|
|
|
if (!path) {
|
|
|
|
addInt((int) NULL);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkPath* pathCopy = mPathMap.valueFor(path);
|
|
|
|
if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
|
2011-03-18 16:24:19 -07:00
|
|
|
pathCopy = new SkPath(*path);
|
2011-02-03 15:06:05 -08:00
|
|
|
mPathMap.add(path, pathCopy);
|
2011-03-18 16:24:19 -07:00
|
|
|
mPaths.add(pathCopy);
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
2011-02-03 15:06:05 -08:00
|
|
|
|
|
|
|
addInt((int) pathCopy);
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
inline void addPaint(SkPaint* paint) {
|
2011-01-14 15:31:00 -08:00
|
|
|
if (!paint) {
|
2010-11-08 12:08:41 -08:00
|
|
|
addInt((int) NULL);
|
2010-10-25 15:47:32 -07:00
|
|
|
return;
|
|
|
|
}
|
2010-11-08 12:08:41 -08:00
|
|
|
|
2012-01-19 18:33:25 -08:00
|
|
|
SkPaint* paintCopy = mPaintMap.valueFor(paint);
|
2010-10-25 15:47:32 -07:00
|
|
|
if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
|
|
|
|
paintCopy = new SkPaint(*paint);
|
|
|
|
mPaintMap.add(paint, paintCopy);
|
|
|
|
mPaints.add(paintCopy);
|
|
|
|
}
|
2010-11-08 12:08:41 -08:00
|
|
|
|
|
|
|
addInt((int) paintCopy);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void addDisplayList(DisplayList* displayList) {
|
|
|
|
// TODO: To be safe, the display list should be ref-counted in the
|
|
|
|
// resources cache, but we rely on the caller (UI toolkit) to
|
|
|
|
// do the right thing for now
|
|
|
|
addInt((int) displayList);
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
inline void addMatrix(SkMatrix* matrix) {
|
2010-10-25 15:47:32 -07:00
|
|
|
// Copying the matrix is cheap and prevents against the user changing the original
|
|
|
|
// matrix before the operation that uses it
|
2011-06-22 15:13:09 -07:00
|
|
|
SkMatrix* copy = new SkMatrix(*matrix);
|
|
|
|
addInt((int) copy);
|
|
|
|
mMatrices.add(copy);
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
inline void addBitmap(SkBitmap* bitmap) {
|
2010-10-25 15:47:32 -07:00
|
|
|
// Note that this assumes the bitmap is immutable. There are cases this won't handle
|
|
|
|
// correctly, such as creating the bitmap from scratch, drawing with it, changing its
|
|
|
|
// contents, and drawing again. The only fix would be to always copy it the first time,
|
|
|
|
// which doesn't seem worth the extra cycles for this unlikely case.
|
2010-11-08 12:08:41 -08:00
|
|
|
addInt((int) bitmap);
|
2010-10-08 08:37:55 -07:00
|
|
|
mBitmapResources.add(bitmap);
|
2011-06-22 16:14:36 -07:00
|
|
|
Caches::getInstance().resourceCache.incrementRefcount(bitmap);
|
2010-10-08 08:37:55 -07:00
|
|
|
}
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
inline void addShader(SkiaShader* shader) {
|
2011-01-14 15:31:00 -08:00
|
|
|
if (!shader) {
|
|
|
|
addInt((int) NULL);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
|
|
|
|
// TODO: We also need to handle generation ID changes in compose shaders
|
2011-01-14 15:37:54 -08:00
|
|
|
if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
|
2011-01-14 15:31:00 -08:00
|
|
|
shaderCopy = shader->copy();
|
|
|
|
mShaderMap.add(shader, shaderCopy);
|
2011-01-14 15:37:54 -08:00
|
|
|
mShaders.add(shaderCopy);
|
2011-01-14 18:51:01 -08:00
|
|
|
Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
|
2011-01-14 15:31:00 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
addInt((int) shaderCopy);
|
2010-09-26 18:40:37 -07:00
|
|
|
}
|
|
|
|
|
2010-10-22 16:17:12 -07:00
|
|
|
inline void addColorFilter(SkiaColorFilter* colorFilter) {
|
2010-11-08 12:08:41 -08:00
|
|
|
addInt((int) colorFilter);
|
2010-10-22 16:17:12 -07:00
|
|
|
mFilterResources.add(colorFilter);
|
2011-06-22 16:14:36 -07:00
|
|
|
Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
|
2010-10-22 16:17:12 -07:00
|
|
|
}
|
|
|
|
|
2010-10-08 08:37:55 -07:00
|
|
|
Vector<SkBitmap*> mBitmapResources;
|
2010-10-22 16:17:12 -07:00
|
|
|
Vector<SkiaColorFilter*> mFilterResources;
|
2010-09-26 18:40:37 -07:00
|
|
|
|
2010-10-25 15:47:32 -07:00
|
|
|
Vector<SkPaint*> mPaints;
|
2010-11-08 12:08:41 -08:00
|
|
|
DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
|
2011-01-14 15:31:00 -08:00
|
|
|
|
2011-02-03 15:06:05 -08:00
|
|
|
Vector<SkPath*> mPaths;
|
|
|
|
DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
|
|
|
|
|
2011-01-14 15:31:00 -08:00
|
|
|
Vector<SkiaShader*> mShaders;
|
|
|
|
DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
|
|
|
|
|
2010-10-25 15:47:32 -07:00
|
|
|
Vector<SkMatrix*> mMatrices;
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
SkWriter32 mWriter;
|
|
|
|
|
2011-01-23 12:01:41 -08:00
|
|
|
int mRestoreSaveCount;
|
2011-08-25 14:01:48 -07:00
|
|
|
bool mHasDrawOps;
|
2011-01-23 12:01:41 -08:00
|
|
|
|
2010-09-28 19:09:36 -07:00
|
|
|
friend class DisplayList;
|
|
|
|
|
2010-09-26 18:40:37 -07:00
|
|
|
}; // class DisplayListRenderer
|
|
|
|
|
|
|
|
}; // namespace uirenderer
|
|
|
|
}; // namespace android
|
|
|
|
|
2010-10-27 18:57:51 -07:00
|
|
|
#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
|