VertexBuffer.h revision 05f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5
1/* 2 * Copyright (C) 2012 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#ifndef ANDROID_HWUI_VERTEX_BUFFER_H 18#define ANDROID_HWUI_VERTEX_BUFFER_H 19 20 21namespace android { 22namespace uirenderer { 23 24class VertexBuffer { 25public: 26 enum Mode { 27 kStandard = 0, 28 kOnePolyRingShadow = 1, 29 kTwoPolyRingShadow = 2 30 }; 31 32 VertexBuffer() 33 : mBuffer(0) 34 , mVertexCount(0) 35 , mByteCount(0) 36 , mMode(kStandard) 37 , mCleanupMethod(NULL) 38 {} 39 40 ~VertexBuffer() { 41 if (mCleanupMethod) mCleanupMethod(mBuffer); 42 } 43 44 /** 45 This should be the only method used by the Tessellator. Subsequent calls to 46 alloc will allocate space within the first allocation (useful if you want to 47 eventually allocate multiple regions within a single VertexBuffer, such as 48 with PathTessellator::tessellateLines()) 49 */ 50 template <class TYPE> 51 TYPE* alloc(int vertexCount) { 52 if (mVertexCount) { 53 TYPE* reallocBuffer = (TYPE*)mReallocBuffer; 54 // already have allocated the buffer, re-allocate space within 55 if (mReallocBuffer != mBuffer) { 56 // not first re-allocation, leave space for degenerate triangles to separate strips 57 reallocBuffer += 2; 58 } 59 mReallocBuffer = reallocBuffer + vertexCount; 60 return reallocBuffer; 61 } 62 mVertexCount = vertexCount; 63 mByteCount = mVertexCount * sizeof(TYPE); 64 mReallocBuffer = mBuffer = (void*)new TYPE[vertexCount]; 65 mCleanupMethod = &(cleanup<TYPE>); 66 67 return (TYPE*)mBuffer; 68 } 69 70 template <class TYPE> 71 void copyInto(const VertexBuffer& srcBuffer, float xOffset, float yOffset) { 72 int verticesToCopy = srcBuffer.getVertexCount(); 73 74 TYPE* dst = alloc<TYPE>(verticesToCopy); 75 TYPE* src = (TYPE*)srcBuffer.getBuffer(); 76 77 for (int i = 0; i < verticesToCopy; i++) { 78 TYPE::copyWithOffset(&dst[i], src[i], xOffset, yOffset); 79 } 80 } 81 82 const void* getBuffer() const { return mBuffer; } 83 const Rect& getBounds() const { return mBounds; } 84 unsigned int getVertexCount() const { return mVertexCount; } 85 unsigned int getSize() const { return mByteCount; } 86 Mode getMode() const { return mMode; } 87 88 void setBounds(Rect bounds) { mBounds = bounds; } 89 void setMode(Mode mode) { mMode = mode; } 90 91 template <class TYPE> 92 void createDegenerateSeparators(int allocSize) { 93 TYPE* end = (TYPE*)mBuffer + mVertexCount; 94 for (TYPE* degen = (TYPE*)mBuffer + allocSize; degen < end; degen += 2 + allocSize) { 95 memcpy(degen, degen - 1, sizeof(TYPE)); 96 memcpy(degen + 1, degen + 2, sizeof(TYPE)); 97 } 98 } 99 100private: 101 template <class TYPE> 102 static void cleanup(void* buffer) { 103 delete[] (TYPE*)buffer; 104 } 105 106 Rect mBounds; 107 void* mBuffer; 108 unsigned int mVertexCount; 109 unsigned int mByteCount; 110 Mode mMode; 111 112 void* mReallocBuffer; // used for multi-allocation 113 114 void (*mCleanupMethod)(void*); 115}; 116 117}; // namespace uirenderer 118}; // namespace android 119 120#endif // ANDROID_HWUI_VERTEX_BUFFER_H 121