5782d712ff
Remove unused/unsupported point size (we don't draw non-hairline points using GL points). Change current* getter functions to get* for consistency. Fix bounds when drawing inverse-filled paths. git-svn-id: http://skia.googlecode.com/svn/trunk@718 2bbb7eff-a529-9590-31e7-b0007b416f81
136 lines
5.1 KiB
C++
136 lines
5.1 KiB
C++
/*
|
|
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
|