- d = s8_x(u8_x::min(u8_x(d), u8_x(aaaa))); // overflow guard\r
+ d = s8_x(u8_x::min(u8_x(d), u8_x(aaaa))); // Overflow guard. Some source files have color values which incorrectly exceed pre-multiplied alpha values, e.g. red(255) > alpha(254).\r
\r
auto xaxa = s16_x(aaaa) >> 8; \r
\r
auto t1 = s16_x::multiply_low(s16_x(s) & 0x00FF, xaxa) + 0x80; \r
auto t2 = s16_x::multiply_low(s16_x(s) >> 8 , xaxa) + 0x80;\r
\r
- // C(S, D) = S + D - (((T >> 8) + T) >> 8);\r
auto xyxy = s8_x(((t1 >> 8) + t1) >> 8); \r
auto yxyx = s8_x((t2 >> 8) + t2); \r
auto argb = s8_x::blend(xyxy, yxyx, s8_x(-1, 0, -1, 0));\r
+ auto draw_buffer = create_mixer_buffer(format_desc.width, format_desc.height, 4);\r
\r
- auto ptr = reinterpret_cast<const uint8_t*>(buf->data()); // .get() and ->data() can block calling thread, ->data() can also block OpenGL thread, defer it as long as possible.\r
-spl::shared_ptr<device_buffer> device::create_device_buffer(int width, int height, int stride){return impl_->create_device_buffer(width, height, stride);}\r
-boost::unique_future<spl::shared_ptr<device_buffer>> device::copy_async(spl::shared_ptr<host_buffer>& source, int width, int height, int stride){return impl_->copy_async(source, width, height, stride);}\r
+boost::unique_future<spl::shared_ptr<texture>> device::copy_async(const core::mutable_array& source, int width, int height, int stride){return impl_->copy_async(source, width, height, stride);}\r
int make_alpha_format(int format); // NOTE: Be careful about CASPAR_PIX_FMT_LUMA, change it to PIX_FMT_GRAY8 if you want to use the frame inside some ffmpeg function.\r
index 7b54f2d88690a560fc6061881cae4794b9b78125..cb6e9fd131ab327576299b3a5d8a5903840bcea6 100644 (file)
Binary files a/shell/shell.rc and b/shell/shell.rc differ