2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "libavutil/avutil.h"
22 #include "libavutil/colorspace.h"
23 #include "libavutil/mem.h"
24 #include "libavutil/pixdesc.h"
25 #include "drawutils.h"
27 enum { RED
= 0, GREEN
, BLUE
, ALPHA
};
29 int ff_fill_line_with_color(uint8_t *line
[4], int pixel_step
[4], int w
, uint8_t dst_color
[4],
30 enum AVPixelFormat pix_fmt
, uint8_t rgba_color
[4],
31 int *is_packed_rgba
, uint8_t rgba_map_ptr
[4])
33 uint8_t rgba_map
[4] = {0};
35 const AVPixFmtDescriptor
*pix_desc
= av_pix_fmt_desc_get(pix_fmt
);
36 int hsub
= pix_desc
->log2_chroma_w
;
40 case AV_PIX_FMT_ARGB
: rgba_map
[ALPHA
] = 0; rgba_map
[RED
] = 1; rgba_map
[GREEN
] = 2; rgba_map
[BLUE
] = 3; break;
41 case AV_PIX_FMT_ABGR
: rgba_map
[ALPHA
] = 0; rgba_map
[BLUE
] = 1; rgba_map
[GREEN
] = 2; rgba_map
[RED
] = 3; break;
43 case AV_PIX_FMT_RGB24
: rgba_map
[RED
] = 0; rgba_map
[GREEN
] = 1; rgba_map
[BLUE
] = 2; rgba_map
[ALPHA
] = 3; break;
45 case AV_PIX_FMT_BGR24
: rgba_map
[BLUE
] = 0; rgba_map
[GREEN
] = 1; rgba_map
[RED
] = 2; rgba_map
[ALPHA
] = 3; break;
50 if (*is_packed_rgba
) {
51 pixel_step
[0] = (av_get_bits_per_pixel(pix_desc
))>>3;
52 for (i
= 0; i
< 4; i
++)
53 dst_color
[rgba_map
[i
]] = rgba_color
[i
];
55 line
[0] = av_malloc(w
* pixel_step
[0]);
56 for (i
= 0; i
< w
; i
++)
57 memcpy(line
[0] + i
* pixel_step
[0], dst_color
, pixel_step
[0]);
59 memcpy(rgba_map_ptr
, rgba_map
, sizeof(rgba_map
[0]) * 4);
63 dst_color
[0] = RGB_TO_Y_CCIR(rgba_color
[0], rgba_color
[1], rgba_color
[2]);
64 dst_color
[1] = RGB_TO_U_CCIR(rgba_color
[0], rgba_color
[1], rgba_color
[2], 0);
65 dst_color
[2] = RGB_TO_V_CCIR(rgba_color
[0], rgba_color
[1], rgba_color
[2], 0);
66 dst_color
[3] = rgba_color
[3];
68 for (plane
= 0; plane
< 4; plane
++) {
70 int hsub1
= (plane
== 1 || plane
== 2) ? hsub
: 0;
72 pixel_step
[plane
] = 1;
73 line_size
= (w
>> hsub1
) * pixel_step
[plane
];
74 line
[plane
] = av_malloc(line_size
);
75 memset(line
[plane
], dst_color
[plane
], line_size
);
82 void ff_draw_rectangle(uint8_t *dst
[4], int dst_linesize
[4],
83 uint8_t *src
[4], int pixelstep
[4],
84 int hsub
, int vsub
, int x
, int y
, int w
, int h
)
89 for (plane
= 0; plane
< 4 && dst
[plane
]; plane
++) {
90 int hsub1
= plane
== 1 || plane
== 2 ? hsub
: 0;
91 int vsub1
= plane
== 1 || plane
== 2 ? vsub
: 0;
93 p
= dst
[plane
] + (y
>> vsub1
) * dst_linesize
[plane
];
94 for (i
= 0; i
< (h
>> vsub1
); i
++) {
95 memcpy(p
+ (x
>> hsub1
) * pixelstep
[plane
],
96 src
[plane
], (w
>> hsub1
) * pixelstep
[plane
]);
97 p
+= dst_linesize
[plane
];
102 void ff_copy_rectangle(uint8_t *dst
[4], int dst_linesize
[4],
103 uint8_t *src
[4], int src_linesize
[4], int pixelstep
[4],
104 int hsub
, int vsub
, int x
, int y
, int y2
, int w
, int h
)
109 for (plane
= 0; plane
< 4 && dst
[plane
]; plane
++) {
110 int hsub1
= plane
== 1 || plane
== 2 ? hsub
: 0;
111 int vsub1
= plane
== 1 || plane
== 2 ? vsub
: 0;
113 p
= dst
[plane
] + (y
>> vsub1
) * dst_linesize
[plane
];
114 for (i
= 0; i
< (h
>> vsub1
); i
++) {
115 memcpy(p
+ (x
>> hsub1
) * pixelstep
[plane
],
116 src
[plane
] + src_linesize
[plane
]*(i
+(y2
>>vsub1
)), (w
>> hsub1
) * pixelstep
[plane
]);
117 p
+= dst_linesize
[plane
];