113
114
return otherFrameCornerMaterial->innerTextureId() - m_textureId[1];
117
void UCFrameCornerMaterial::updateTexture(int index, UCFrame::Shape shape, int radius)
119
DASSERT(index >= 0 && index < 2);
120
DASSERT(radius >= 0);
121
m_textureId[index] = m_textureFactory.shapeTexture(
122
index, static_cast<Texture::Shape>(shape), radius);
118
127
UCFrameCornerNode::UCFrameCornerNode(UCFrame::Shape shape, bool visible)
126
135
, m_visible(visible)
128
137
setFlag(QSGNode::UsePreprocess);
129
memcpy(m_geometry.indexData(), indices(), 26 * sizeof(unsigned short));
138
memcpy(m_geometry.indexData(), indices(), 26 * sizeof(quint16));
130
139
m_geometry.setDrawingMode(GL_TRIANGLE_STRIP);
131
140
m_geometry.setIndexDataPattern(QSGGeometry::StaticPattern);
132
141
m_geometry.setVertexDataPattern(QSGGeometry::AlwaysUploadPattern);
203
212
UCFrameCornerNode::Vertex* v =
204
213
reinterpret_cast<UCFrameCornerNode::Vertex*>(m_geometry.vertexData());
214
const float devicePixelRatio = qGuiApp->devicePixelRatio();
205
215
const float w = static_cast<float>(itemSize.width());
206
216
const float h = static_cast<float>(itemSize.height());
207
217
// FIXME(loicm) Rounded down since renderShape() doesn't support sub-pixel rendering.
208
218
const float maxSize = floorf(qMin(w, h) * 0.5f);
209
219
const float clampedThickness = qMin(thickness, maxSize);
220
const float deviceThickness = clampedThickness * devicePixelRatio;
210
221
const float border = 1.0f;
211
222
const float outerRadius = qMin(radius, maxSize);
223
const float deviceOuterRadius = outerRadius * devicePixelRatio;
212
224
// FIXME(loicm) Rounded down since renderShape() doesn't support sub-pixel rendering.
213
const float innerRadius = floorf(outerRadius * ((maxSize - clampedThickness) / maxSize));
214
225
const float outerRadiusRounded =
215
getStride(static_cast<int>(outerRadius + 2 * border), 1, textureStride);
226
getStride(static_cast<int>(deviceOuterRadius + 2 * border), 1, textureStride);
227
const float innerRadius = floorf(outerRadius * ((maxSize - clampedThickness) / maxSize));
228
const float deviceInnerRadius = innerRadius * devicePixelRatio;
216
229
const float innerRadiusRounded =
217
getStride(static_cast<int>(innerRadius + 2 * border), 1, textureStride);
230
getStride(static_cast<int>(deviceInnerRadius + 2 * border), 1, textureStride);
219
const float outerRadiusOffset = outerRadiusRounded - outerRadius - border;
232
const float outerRadiusOffset = outerRadiusRounded - deviceOuterRadius - border;
220
233
const float outerTextureFactor = 1.0f / outerRadiusRounded;
221
234
const float outerS0 = outerTextureFactor * outerRadiusOffset;
222
const float outerS1 = outerTextureFactor * (outerRadiusOffset + outerRadius);
223
const float outerS2 = outerTextureFactor * (outerRadiusOffset + clampedThickness);
224
const float outerS3 = outerTextureFactor * (outerRadiusOffset + clampedThickness + innerRadius);
235
const float outerS1 = outerTextureFactor * (outerRadiusOffset + deviceOuterRadius);
236
const float outerS2 = outerTextureFactor * (outerRadiusOffset + deviceThickness);
237
const float outerS3 =
238
outerTextureFactor * (outerRadiusOffset + deviceThickness + deviceInnerRadius);
226
const float innerRadiusOffset = innerRadiusRounded - innerRadius - border;
240
const float innerRadiusOffset = innerRadiusRounded - deviceInnerRadius - border;
227
241
const float innerTextureFactor = 1.0f / innerRadiusRounded;
228
242
const float innerS0 = innerTextureFactor * innerRadiusOffset;
229
const float innerS1 = innerTextureFactor * (innerRadiusOffset + innerRadius);
230
const float innerS2 = innerTextureFactor * (innerRadiusOffset - clampedThickness);
231
const float innerS3 = innerTextureFactor * (innerRadiusOffset - clampedThickness + outerRadius);
243
const float innerS1 = innerTextureFactor * (innerRadiusOffset + deviceInnerRadius);
244
const float innerS2 = innerTextureFactor * (innerRadiusOffset - deviceThickness);
245
const float innerS3 =
246
innerTextureFactor * (innerRadiusOffset - deviceThickness + deviceOuterRadius);
233
248
const quint32 packedColor = packColor(color);
383
398
markDirty(QSGNode::DirtyGeometry);
385
400
// Update data for the preprocess() call.
386
if (m_radius[0] != static_cast<quint8>(outerRadius)) {
387
m_newRadius[0] = static_cast<quint8>(outerRadius);
401
if (m_radius[0] != static_cast<quint8>(deviceOuterRadius)) {
402
m_newRadius[0] = static_cast<quint8>(deviceOuterRadius);
389
if (m_radius[1] != static_cast<quint8>(innerRadius)) {
390
m_newRadius[1] = static_cast<quint8>(innerRadius);
404
if (m_radius[1] != static_cast<quint8>(deviceInnerRadius)) {
405
m_newRadius[1] = static_cast<quint8>(deviceInnerRadius);
394
UCFrameNode::UCFrameNode()
409
UCFrameNode::UCFrameNode(bool blending)
395
410
: QSGGeometryNode()
411
, m_opaqueMaterial(blending)
396
412
, m_geometry(attributeSet(), 16, 22, GL_UNSIGNED_SHORT)
398
414
memcpy(m_geometry.indexData(), indices(), 22 * sizeof(quint16));