/* | |
Copyright 2011 Google Inc. | |
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. | |
*/ | |
#ifndef GrContext_impl_DEFINED | |
#define GrContext_impl_DEFINED | |
template <typename POS_SRC, typename TEX_SRC, | |
typename COL_SRC, typename IDX_SRC> | |
inline void GrContext::drawCustomVertices(const GrPaint& paint, | |
GrDrawTarget::PrimitiveType primitiveType, | |
const POS_SRC& posSrc, | |
const TEX_SRC* texCoordSrc, | |
const COL_SRC* colorSrc, | |
const IDX_SRC* idxSrc) { | |
GrVertexLayout layout = 0; | |
GrDrawTarget::AutoReleaseGeometry geo; | |
this->prepareToDraw(paint); | |
if (NULL != paint.getTexture()) { | |
if (NULL != texCoordSrc) { | |
layout |= GrDrawTarget::StageTexCoordVertexLayoutBit(0,0); | |
} else { | |
layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(0); | |
} | |
} | |
if (NULL != colorSrc) { | |
layout |= GrDrawTarget::kColor_VertexLayoutBit; | |
} | |
int vertexCount = posSrc.count(); | |
int indexCount = (NULL != idxSrc) ? idxSrc->count() : 0; | |
if (!geo.set(fGpu, layout, vertexCount, indexCount)) { | |
GrPrintf("Failed to get space for vertices!"); | |
return; | |
} | |
int texOffsets[GrDrawTarget::kMaxTexCoords]; | |
int colorOffset; | |
int vsize = GrDrawTarget::VertexSizeAndOffsetsByIdx(layout, | |
texOffsets, | |
&colorOffset); | |
void* curVertex = geo.vertices(); | |
for (int i = 0; i < vertexCount; ++i) { | |
posSrc.writeValue(i, (GrPoint*)curVertex); | |
if (texOffsets[0] > 0) { | |
texCoordSrc->writeValue(i, (GrPoint*)((intptr_t)curVertex + texOffsets[0])); | |
} | |
if (colorOffset > 0) { | |
colorSrc->writeValue(i, (GrColor*)((intptr_t)curVertex + colorOffset)); | |
} | |
curVertex = (void*)((intptr_t)curVertex + vsize); | |
} | |
uint16_t* indices = (uint16_t*) geo.indices(); | |
for (int i = 0; i < indexCount; ++i) { | |
idxSrc->writeValue(i, indices + i); | |
} | |
if (NULL == idxSrc) { | |
fGpu->drawNonIndexed(primitiveType, 0, vertexCount); | |
} else { | |
fGpu->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount); | |
} | |
} | |
class GrNullTexCoordSource { | |
public: | |
void writeValue(int i, GrPoint* dstCoord) const { GrAssert(false); } | |
}; | |
class GrNullColorSource { | |
public: | |
void writeValue(int i, GrColor* dstColor) const { GrAssert(false); } | |
}; | |
class GrNullIndexSource { | |
public: | |
void writeValue(int i, uint16_t* dstIndex) const { GrAssert(false); } | |
int count() const { GrAssert(false); return 0; } | |
}; | |
template <typename POS_SRC> | |
inline void GrContext::drawCustomVertices(const GrPaint& paint, | |
GrDrawTarget::PrimitiveType primitiveType, | |
const POS_SRC& posSrc) { | |
this->drawCustomVertices<POS_SRC, | |
GrNullTexCoordSource, | |
GrNullColorSource, | |
GrNullIndexSource>(paint, primitiveType, posSrc, | |
NULL, NULL, NULL); | |
} | |
template <typename POS_SRC, typename TEX_SRC> | |
inline void GrContext::drawCustomVertices(const GrPaint& paint, | |
GrDrawTarget::PrimitiveType primitiveType, | |
const POS_SRC& posSrc, | |
const TEX_SRC* texCoordSrc) { | |
this->drawCustomVertices<POS_SRC, TEX_SRC, | |
GrNullColorSource, | |
GrNullIndexSource>(paint, primitiveType, posSrc, | |
texCoordSrc, NULL, NULL); | |
} | |
template <typename POS_SRC, typename TEX_SRC, typename COL_SRC> | |
inline void GrContext::drawCustomVertices(const GrPaint& paint, | |
GrDrawTarget::PrimitiveType primitiveType, | |
const POS_SRC& posSrc, | |
const TEX_SRC* texCoordSrc, | |
const COL_SRC* colorSrc) { | |
drawCustomVertices<POS_SRC, TEX_SRC, COL_SRC, | |
GrNullIndexSource>(paint, primitiveType, posSrc, | |
texCoordSrc, colorSrc, NULL); | |
} | |
#endif |