| 218 | #endif |
| 219 | |
| 220 | void |
| 221 | LineStyleInfo::set_pattern (uint32_t pt, unsigned int w) |
| 222 | { |
| 223 | tl::MutexLocker locker (& s_mutex); |
| 224 | m_scaled_pattern.reset (0); |
| 225 | |
| 226 | memset (m_pattern, 0, sizeof (m_pattern)); |
| 227 | |
| 228 | if (w >= 32) { |
| 229 | w = 32; |
| 230 | } |
| 231 | m_width = w; |
| 232 | |
| 233 | // w == 0 means solid pattern |
| 234 | if (w == 0) { |
| 235 | m_pattern[0] = 0xffffffff; |
| 236 | m_pattern_stride = 1; |
| 237 | return; |
| 238 | } |
| 239 | |
| 240 | |
| 241 | // compute pattern stride |
| 242 | m_pattern_stride = 1; |
| 243 | while ((m_pattern_stride * 32) % w != 0) { |
| 244 | ++m_pattern_stride; |
| 245 | } |
| 246 | |
| 247 | uint32_t *pp = m_pattern; |
| 248 | uint32_t dd = pt; |
| 249 | |
| 250 | unsigned int b = 0; |
| 251 | for (unsigned int i = 0; i < m_pattern_stride; ++i) { |
| 252 | uint32_t dout = 0; |
| 253 | for (uint32_t m = 1; m != 0; m <<= 1) { |
| 254 | if ((dd & 1) != 0) { |
| 255 | dout |= m; |
| 256 | } |
| 257 | dd >>= 1; |
| 258 | if (++b == w) { |
| 259 | dd = pt; |
| 260 | b = 0; |
| 261 | } |
| 262 | } |
| 263 | *pp++ = dout; |
| 264 | } |
| 265 | } |
| 266 | |
| 267 | const LineStyleInfo & |
| 268 | LineStyleInfo::scaled (unsigned int n) const |
no test coverage detected