29 #ifndef PT_GFX_YUV12_H
30 #define PT_GFX_YUV12_H
32 #include <Pt/Gfx/Api.h>
33 #include <Pt/Gfx/ImageFormat.h>
34 #include <Pt/Gfx/Color.h>
54 Pt::ssize_t x, Pt::ssize_t y);
58 Yuv12Pixel(T& view, Pt::ssize_t xpos, Pt::ssize_t ypos);
64 , _subStride(p._subStride)
74 const ViewBase& view()
const
77 Pt::ssize_t xpos()
const
80 Pt::ssize_t ypos()
const
116 void advance(Pt::ssize_t n);
118 void advanceLines(Pt::ssize_t n);
125 const ViewBase& _view;
128 Pt::ssize_t _subStride;
147 Pt::ssize_t xpos, Pt::ssize_t ypos);
150 template <
typename T>
153 template <
typename T>
160 , _subStride(p._subStride)
170 , _subStride(p._subStride)
178 const ViewBase& view()
const
181 Pt::ssize_t xpos()
const
184 Pt::ssize_t ypos()
const
211 void advance(Pt::ssize_t n);
213 void advanceLines(Pt::ssize_t n);
216 {
return _y == p._y; }
219 {
return _y == p._y; }
222 const ViewBase& _view;
225 Pt::ssize_t _subStride;
240 static const Yuv12& get()
249 Pt::ssize_t pixelStride()
const
254 std::size_t imageSize(std::size_t width, std::size_t height,
255 std::size_t padding)
const
257 Pt::ssize_t stride = width + padding;
258 Pt::ssize_t planeSize = stride * height;
260 return planeSize + planeSize / 2;
264 virtual std::unique_ptr<ImageFormat> onClone()
const override
266 return std::unique_ptr<ImageFormat>(
new Yuv12);
269 virtual const std::type_info& onGetType()
const override
271 return typeid(*this);
274 virtual std::size_t onImageSize(Pt::ssize_t width, Pt::ssize_t height,
275 std::size_t padding)
const override;
278 Pt::ssize_t x, Pt::ssize_t y,
279 PixelStorage& store)
const override;
282 template <
typename T>
283 static void advance(T*& y, T*& u, T*& v,
285 Pt::ssize_t uvstride)
297 template <
typename T>
298 static void advanceN(T*& y, T*& u, T*& v,
302 Pt::ssize_t old_u_col = xpos / 2;
303 Pt::ssize_t new_u_col = (xpos + n) / 2;
308 Pt::ssize_t uv_diff = new_u_col - old_u_col;
313 template <
typename T>
314 static void skipPadding(T*& y, T*& u, T*& v,
315 Pt::ssize_t& xpos, Pt::ssize_t& ypos,
316 Pt::ssize_t padding, Pt::ssize_t uvstride)
332 template <
typename T>
333 static void advanceLines(T*& y, T*& u, T*& v,
337 Pt::ssize_t uvstride)
339 Pt::ssize_t old_u_row = ypos / 2;
340 Pt::ssize_t new_u_row = (ypos + n) / 2;
345 Pt::ssize_t uv_diff = (new_u_row - old_u_row) * uvstride;
353 Pt::uint32_t rv = 298 * (y - 16) + 409 * (v - 128) + 128;
354 Pt::uint32_t gv = 298 * (y - 16) - 100 * (u - 128) - 208 * (v - 128) + 128;
355 Pt::uint32_t bv = 298 * (y - 16) + 516 * (u - 128) + 128;
371 Pt::int32_t yy = (( 66 * r + 129 * g + 25 * b + 128) >> 16) + 16;
372 Pt::int32_t uu = ((-38 * r - 74 * g + 112 * b + 128) >> 16) + 128;
373 Pt::int32_t vv = ((112 * r - 94 * g - 18 * b + 128) >> 16) + 128;
375 *y = yy > 255 ? 255 :
static_cast<Pt::uint8_t>(yy);
376 *u = uu > 255 ? 255 :
static_cast<Pt::uint8_t>(uu);
377 *v = vv > 255 ? 255 :
static_cast<Pt::uint8_t>(vv);
380 template <
typename T>
381 static Pt::ssize_t init(T* data, Pt::ssize_t stride,
382 Pt::ssize_t width, Pt::ssize_t height,
383 Pt::ssize_t xpos, Pt::ssize_t ypos,
386 Pt::ssize_t yOffset = stride * ypos + xpos;
389 return initUV(data, stride, width, height, xpos, ypos, u, v);
392 template <
typename T>
393 static Pt::ssize_t initUV(T* data, Pt::ssize_t stride,
394 Pt::ssize_t width, Pt::ssize_t height,
395 Pt::ssize_t xpos, Pt::ssize_t ypos,
398 Pt::ssize_t planeSize = stride * height;
400 Pt::ssize_t uvstride = stride / 2;
401 Pt::ssize_t subPlaneSize = planeSize / 4;
403 Pt::ssize_t subXPos = xpos / 2;
404 Pt::ssize_t subYPos = ypos / 2;
405 Pt::ssize_t subOffset = uvstride * subYPos + subXPos;
407 Pt::ssize_t uOffset = planeSize + subOffset;
410 Pt::ssize_t vOffset = uOffset + subPlaneSize;
416 template <
typename T>
417 static void advance(T*& y, T*& u, T*& v,
418 Pt::ssize_t& xpos, Pt::ssize_t& ypos,
419 Pt::ssize_t width, Pt::ssize_t padding,
420 Pt::ssize_t uvstride)
424 if( ++xpos >= width )
440 else if(xpos % 2 == 0)
447 template <
typename T>
448 static void advanceBy(T*& y, T*& u, T*& v, ssize_t n,
449 ssize_t& xpos, ssize_t& ypos, ssize_t width,
450 ssize_t ystride, ssize_t uvstride)
452 Pt::ssize_t new_abs_pos = (ypos * width) + xpos + n;
453 Pt::ssize_t new_ypos = new_abs_pos / width;
454 Pt::ssize_t new_xpos = new_abs_pos % width;
456 y += (new_ypos - ypos) * ystride + (new_xpos - xpos);
458 Pt::ssize_t old_u_row = ypos / 2;
459 Pt::ssize_t new_u_row = new_ypos / 2;
461 Pt::ssize_t old_u_col = xpos / 2;
462 Pt::ssize_t new_u_col = new_xpos / 2;
464 Pt::ssize_t uv_offset = (new_u_row - old_u_row) * uvstride + (new_u_col - old_u_col);
480 #include <Pt/Gfx/Yuv12.hpp>