void plSpanTemplate::setVertices(const std::vector<Vertex>& verts) { delete[] fData; if (verts.empty()) { fData = NULL; return; } fStride = CalcStride(fFormat); fNumVerts = verts.size(); fData = new unsigned char[fNumVerts * fStride]; unsigned char* dataPtr = fData; for (size_t i=0; i<fNumVerts; i++) { if (fFormat & kPosMask) { *(float*)dataPtr = verts[i].fPosition.X; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fPosition.Y; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fPosition.Z; dataPtr += sizeof(float); } if (fFormat & kWeightMask) { for (size_t j=0; j<(size_t)((fFormat & kWeightMask) / 0x100); j++) { *(float*)dataPtr = verts[i].fWeights[j]; dataPtr += sizeof(float); } } if (fFormat & kWgtIdxMask) { *(int*)dataPtr = verts[i].fWeightIdx; dataPtr += sizeof(int); } if (fFormat & kNormMask) { *(float*)dataPtr = verts[i].fNormal.X; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fNormal.Y; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fNormal.Z; dataPtr += sizeof(float); } if (fFormat & kColorMask) { *(unsigned int*)dataPtr = verts[i].fColor1; dataPtr += sizeof(unsigned int); } if (fFormat & kColor2Mask) { *(unsigned int*)dataPtr = verts[i].fColor2; dataPtr += sizeof(unsigned int); } if (fFormat & kUVWMask) { for (size_t j=0; j<(size_t)((fFormat & kUVWMask) / 0x10); j++) { *(float*)dataPtr = verts[i].fUVWs[j].X; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fUVWs[j].Y; dataPtr += sizeof(float); *(float*)dataPtr = verts[i].fUVWs[j].Z; dataPtr += sizeof(float); } } } }
static int GuessAlignment(int width, int pixelSize, int stride) { int alignment = 8; // Max GLES allows. while (CalcStride(width, pixelSize, alignment) != stride) { alignment /= 2; if (!alignment) { MOZ_ASSERT(alignment); return 1; } } return alignment; }
void plSpanTemplate::setFormat(unsigned short fmt) { fFormat = fmt; fStride = CalcStride(fFormat); }