Fixed the SVACE issue in ExceptionFlinger.
[platform/core/uifw/dali-toolkit.git] / dali-scene-loader / public-api / utils.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // INTERNAL
19 #include "dali-scene-loader/public-api/utils.h"
20
21 // EXTERNAL
22 #include "dali/public-api/common/vector-wrapper.h"
23 #include "dali/public-api/animation/constraints.h"
24 #include <iostream>
25 #include <fstream>
26 #include <cstring>
27 #include <stdarg.h>
28
29 namespace Dali
30 {
31 namespace SceneLoader
32 {
33 namespace
34 {
35 thread_local char sExceptionFlingerMessageBuffer[ExceptionFlinger::MESSAGE_BUFFER_SIZE]{};
36 }
37
38 StreamBuffer::StreamBuffer(char* buffer, size_t size) noexcept(true)
39 {
40   setp(buffer, buffer + size);
41 }
42
43 ExceptionFlinger::Impl::~Impl() noexcept(false)
44 {
45   throw DaliException(mLocation, GetMessageBuffer());
46 }
47
48 ExceptionFlinger::ExceptionFlinger(const char* location) noexcept(true)
49 : mImpl{ location },
50   mStreamBuffer(GetMessageBuffer(), MESSAGE_BUFFER_SIZE - 1),
51   mStream(&mStreamBuffer)
52 {}
53
54 ExceptionFlinger::~ExceptionFlinger() noexcept(false)
55 {
56   operator<<('\0');
57 }
58
59 char* ExceptionFlinger::GetMessageBuffer() noexcept(true)
60 {
61   return sExceptionFlingerMessageBuffer;
62 }
63
64 std::string FormatString(const char* format, ...)
65 {
66   va_list vl;
67   va_start(vl, format);
68   va_list vl2;
69   va_copy(vl2, vl);
70
71   size_t sizeRequired = vsnprintf(nullptr, 0, format, vl);
72   va_end(vl);
73
74   ++sizeRequired;
75   std::string result(sizeRequired, '\0');
76   vsnprintf(&result[0], sizeRequired, format, vl2);
77   va_end(vl2);
78
79   return result;
80 }
81
82 std::string LoadTextFile(const char * path, bool* fail)
83 {
84   std::ifstream inFile(path);
85   if (inFile)
86   {
87     std::istreambuf_iterator<char> eos;
88     std::istreambuf_iterator<char> i(inFile.rdbuf());
89     return std::string(i, eos);
90   }
91   else if (fail)
92   {
93     *fail = true;
94   }
95   return std::string();
96 }
97
98 Geometry MakeTexturedQuadGeometry(TexturedQuadOptions::Type options)
99 {
100   Property::Map properties;
101   properties.Insert("aPosition", Property::VECTOR3);
102   properties.Insert("aTexCoord", Property::VECTOR2);
103
104   std::vector<uint8_t> bytes;
105   size_t stride = 0;
106   size_t uvOffset = 0;
107   struct
108   {
109     Vector3 aPosition;
110     Vector2 aTexCoord;
111   } vertices[] = {
112     { Vector3(-0.5f, 0.5f, 0.0f), Vector2(0.0f, .0f) },
113     { Vector3(0.5f, 0.5f, 0.0f), Vector2(1.0f, .0f) },
114     { Vector3(-0.5f, -0.5f, 0.0f), Vector2(0.0f, 1.0f) },
115     { Vector3(0.5f, -0.5f, 0.0f), Vector2(1.0f, 1.0f) }
116   };
117
118   bytes.resize(sizeof(vertices));
119   stride = sizeof(vertices[0]);
120   uvOffset = reinterpret_cast<const uint8_t*>(&vertices[0].aTexCoord) - reinterpret_cast<const uint8_t*>(&vertices[0]);
121
122   std::memcpy(bytes.data(), vertices, sizeof(vertices));
123
124   if (MaskMatch(options, TexturedQuadOptions::FLIP_VERTICAL))
125   {
126     Vector2* uv = reinterpret_cast<Vector2*>(reinterpret_cast<uint8_t*>(bytes.data()) + uvOffset);
127     for (int i = 0; i < 4; ++i)
128     {
129       uv->y = 1.0f - uv->y;
130       uv = reinterpret_cast<Vector2*>(reinterpret_cast<uint8_t*>(uv) + stride);
131     }
132   }
133
134   VertexBuffer vertexBuffer = VertexBuffer::New(properties);
135   vertexBuffer.SetData(bytes.data(), bytes.size() / stride);
136
137   Geometry geometry = Geometry::New();
138   geometry.AddVertexBuffer(vertexBuffer);
139   geometry.SetType(Geometry::TRIANGLE_STRIP);
140   return geometry;
141 }
142
143 void ToUnixFileSeparators(std::string& path)
144 {
145   std::replace(path.begin(), path.end(), '\\', '/');
146 }
147
148 }
149 }