X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fnpatch%2Fnpatch-visual.cpp;h=4325dea15f2f73464f500eada3aac36f0a4e5e8e;hp=b9e046a02e0793547a576806917df0e2dbc5ae9c;hb=3c90f2e19f0526a936f5664dc446addbaa25ade8;hpb=f9b3bd2fc9a97770affb1c5de7cd6a15995d90e6 diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index b9e046a..4325dea 100644 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -43,91 +44,6 @@ namespace Toolkit { namespace Internal { -namespace -{ -/** - * @brief Creates the geometry formed from the vertices and indices - * - * @param[in] vertices The vertices to generate the geometry from - * @param[in] indices The indices to generate the geometry from - * @return The geometry formed from the vertices and indices - */ -Geometry GenerateGeometry(const Vector& vertices, const Vector& indices) -{ - Property::Map vertexFormat; - vertexFormat["aPosition"] = Property::VECTOR2; - VertexBuffer vertexBuffer = VertexBuffer::New(vertexFormat); - if(vertices.Size() > 0) - { - vertexBuffer.SetData(&vertices[0], vertices.Size()); - } - - // Create the geometry object - Geometry geometry = Geometry::New(); - geometry.AddVertexBuffer(vertexBuffer); - if(indices.Size() > 0) - { - geometry.SetIndexBuffer(&indices[0], indices.Size()); - } - - return geometry; -} - -/** - * @brief Adds the indices to form a quad composed off two triangles where the indices are organised in a grid - * - * @param[out] indices The indices to add to - * @param[in] rowIdx The row index to start the quad - * @param[in] nextRowIdx The index to the next row - */ -void AddQuadIndices(Vector& indices, unsigned int rowIdx, unsigned int nextRowIdx) -{ - indices.PushBack(rowIdx); - indices.PushBack(nextRowIdx + 1); - indices.PushBack(rowIdx + 1); - - indices.PushBack(rowIdx); - indices.PushBack(nextRowIdx); - indices.PushBack(nextRowIdx + 1); -} - -void AddVertex(Vector& vertices, unsigned int x, unsigned int y) -{ - vertices.PushBack(Vector2(x, y)); -} - -void RegisterStretchProperties(Renderer& renderer, const char* uniformName, const NPatchUtility::StretchRanges& stretchPixels, uint16_t imageExtent) -{ - uint16_t prevEnd = 0; - uint16_t prevFix = 0; - uint16_t prevStretch = 0; - unsigned int i = 1; - for(NPatchUtility::StretchRanges::ConstIterator it = stretchPixels.Begin(); it != stretchPixels.End(); ++it, ++i) - { - uint16_t start = it->GetX(); - uint16_t end = it->GetY(); - - uint16_t fix = prevFix + start - prevEnd; - uint16_t stretch = prevStretch + end - start; - - std::stringstream uniform; - uniform << uniformName << "[" << i << "]"; - renderer.RegisterProperty(uniform.str(), Vector2(fix, stretch)); - - prevEnd = end; - prevFix = fix; - prevStretch = stretch; - } - - { - prevFix += imageExtent - prevEnd; - std::stringstream uniform; - uniform << uniformName << "[" << i << "]"; - renderer.RegisterProperty(uniform.str(), Vector2(prevFix, prevStretch)); - } -} - -} //unnamed namespace /////////////////NPatchVisual//////////////// @@ -421,12 +337,12 @@ Geometry NPatchVisual::CreateGeometry() Uint16Pair gridSize(2 * data->GetStretchPixelsX().Size() + 1, 2 * data->GetStretchPixelsY().Size() + 1); if(!data->GetRenderingMap()) { - geometry = !mBorderOnly ? CreateGridGeometry(gridSize) : CreateBorderGeometry(gridSize); + geometry = !mBorderOnly ? NPatchHelper::CreateGridGeometry(gridSize) : NPatchHelper::CreateBorderGeometry(gridSize); } else { uint32_t elementCount[2]; - geometry = !mBorderOnly ? RenderingAddOn::Get().CreateGeometryGrid(data->GetRenderingMap(), gridSize, elementCount) : CreateBorderGeometry(gridSize); + geometry = !mBorderOnly ? RenderingAddOn::Get().CreateGeometryGrid(data->GetRenderingMap(), gridSize, elementCount) : NPatchHelper::CreateBorderGeometry(gridSize); if(mImpl->mRenderer) { RenderingAddOn::Get().SubmitRenderTask(mImpl->mRenderer, data->GetRenderingMap()); @@ -530,29 +446,7 @@ void NPatchVisual::ApplyTextureAndUniforms() if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { textureSet = data->GetTextures(); - - if(data->GetStretchPixelsX().Size() == 1 && data->GetStretchPixelsY().Size() == 1) - { - //special case for 9 patch - Uint16Pair stretchX = data->GetStretchPixelsX()[0]; - Uint16Pair stretchY = data->GetStretchPixelsY()[0]; - - uint16_t stretchWidth = (stretchX.GetY() >= stretchX.GetX()) ? stretchX.GetY() - stretchX.GetX() : 0; - uint16_t stretchHeight = (stretchY.GetY() >= stretchY.GetX()) ? stretchY.GetY() - stretchY.GetX() : 0; - - mImpl->mRenderer.RegisterProperty("uFixed[0]", Vector2::ZERO); - mImpl->mRenderer.RegisterProperty("uFixed[1]", Vector2(stretchX.GetX(), stretchY.GetX())); - mImpl->mRenderer.RegisterProperty("uFixed[2]", Vector2(data->GetCroppedWidth() - stretchWidth, data->GetCroppedHeight() - stretchHeight)); - mImpl->mRenderer.RegisterProperty("uStretchTotal", Vector2(stretchWidth, stretchHeight)); - } - else - { - mImpl->mRenderer.RegisterProperty("uNinePatchFactorsX[0]", Vector2::ZERO); - mImpl->mRenderer.RegisterProperty("uNinePatchFactorsY[0]", Vector2::ZERO); - - RegisterStretchProperties(mImpl->mRenderer, "uNinePatchFactorsX", data->GetStretchPixelsX(), data->GetCroppedWidth()); - RegisterStretchProperties(mImpl->mRenderer, "uNinePatchFactorsY", data->GetStretchPixelsY(), data->GetCroppedHeight()); - } + NPatchHelper::ApplyTextureAndUniforms(mImpl->mRenderer, data); } else { @@ -611,148 +505,17 @@ Geometry NPatchVisual::GetNinePatchGeometry(VisualFactoryCache::GeometryType sub { if(DALI_LIKELY(VisualFactoryCache::NINE_PATCH_GEOMETRY == subType)) { - geometry = CreateGridGeometry(Uint16Pair(3, 3)); + geometry = NPatchHelper::CreateGridGeometry(Uint16Pair(3, 3)); } else if(VisualFactoryCache::NINE_PATCH_BORDER_GEOMETRY == subType) { - geometry = CreateBorderGeometry(Uint16Pair(3, 3)); + geometry = NPatchHelper::CreateBorderGeometry(Uint16Pair(3, 3)); } mFactoryCache.SaveGeometry(subType, geometry); } return geometry; } -Geometry NPatchVisual::CreateGridGeometry(Uint16Pair gridSize) -{ - uint16_t gridWidth = gridSize.GetWidth(); - uint16_t gridHeight = gridSize.GetHeight(); - - // Create vertices - Vector vertices; - vertices.Reserve((gridWidth + 1) * (gridHeight + 1)); - - for(int y = 0; y < gridHeight + 1; ++y) - { - for(int x = 0; x < gridWidth + 1; ++x) - { - AddVertex(vertices, x, y); - } - } - - // Create indices - Vector indices; - indices.Reserve(gridWidth * gridHeight * 6); - - unsigned int rowIdx = 0; - unsigned int nextRowIdx = gridWidth + 1; - for(int y = 0; y < gridHeight; ++y, ++nextRowIdx, ++rowIdx) - { - for(int x = 0; x < gridWidth; ++x, ++nextRowIdx, ++rowIdx) - { - AddQuadIndices(indices, rowIdx, nextRowIdx); - } - } - - return GenerateGeometry(vertices, indices); -} - -Geometry NPatchVisual::CreateBorderGeometry(Uint16Pair gridSize) -{ - uint16_t gridWidth = gridSize.GetWidth(); - uint16_t gridHeight = gridSize.GetHeight(); - - // Create vertices - Vector vertices; - vertices.Reserve((gridWidth + 1) * (gridHeight + 1)); - - //top - int y = 0; - for(; y < 2; ++y) - { - for(int x = 0; x < gridWidth + 1; ++x) - { - AddVertex(vertices, x, y); - } - } - - for(; y < gridHeight - 1; ++y) - { - //left - AddVertex(vertices, 0, y); - AddVertex(vertices, 1, y); - - //right - AddVertex(vertices, gridWidth - 1, y); - AddVertex(vertices, gridWidth, y); - } - - //bottom - for(; y < gridHeight + 1; ++y) - { - for(int x = 0; x < gridWidth + 1; ++x) - { - AddVertex(vertices, x, y); - } - } - - // Create indices - Vector indices; - indices.Reserve(gridWidth * gridHeight * 6); - - //top - unsigned int rowIdx = 0; - unsigned int nextRowIdx = gridWidth + 1; - for(int x = 0; x < gridWidth; ++x, ++nextRowIdx, ++rowIdx) - { - AddQuadIndices(indices, rowIdx, nextRowIdx); - } - - if(gridHeight > 2) - { - rowIdx = gridWidth + 1; - nextRowIdx = (gridWidth + 1) * 2; - - unsigned increment = gridWidth - 1; - if(gridHeight > 3) - { - increment = 2; - //second row left - AddQuadIndices(indices, rowIdx, nextRowIdx); - - rowIdx = gridWidth * 2; - nextRowIdx = (gridWidth + 1) * 2 + 2; - //second row right - AddQuadIndices(indices, rowIdx, nextRowIdx); - - //left and right - rowIdx = nextRowIdx - 2; - nextRowIdx = rowIdx + 4; - for(int y = 2; y < 2 * (gridHeight - 3); ++y, rowIdx += 2, nextRowIdx += 2) - { - AddQuadIndices(indices, rowIdx, nextRowIdx); - } - } - - //second row left - AddQuadIndices(indices, rowIdx, nextRowIdx); - - rowIdx += increment; - nextRowIdx += gridWidth - 1; - //second row right - AddQuadIndices(indices, rowIdx, nextRowIdx); - } - - //bottom - rowIdx = nextRowIdx - gridWidth + 1; - nextRowIdx = rowIdx + gridWidth + 1; - for(int x = 0; x < gridWidth; ++x, ++nextRowIdx, ++rowIdx) - { - AddQuadIndices(indices, rowIdx, nextRowIdx); - } - - return GenerateGeometry(vertices, indices); -} - void NPatchVisual::SetResource() { const NPatchData* data;