- switch (ptype) {
- case 0:
- while (run-- > 0) {
- if (by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- case 1:
- while (run-- > 0) {
- if (bx == 0) {
- if (by < 1)
- return AVERROR_INVALIDDATA;
- z = backstep;
- } else {
- z = 0;
- }
-
- if (by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- clr = dst[by * linesize + bx - 1 - z];
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- case 2:
- while (run-- > 0) {
- if (by < 1 || by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- clr = dst[(by - 1) * linesize + bx];
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- case 3:
- while (run-- > 0) {
- if (by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- clr = prev[by * plinesize + bx];
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- case 4:
- while (run-- > 0) {
- uint8_t *odst = (uint8_t *)dst;
-
- if (by < 1 || by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- if (bx == 0) {
- if (by < 2)
- return AVERROR_INVALIDDATA;
- z = backstep;
- } else {
- z = 0;
- }
-
- r = odst[((by - 1) * linesize + bx) * 4] +
- odst[(by * linesize + bx - 1 - z) * 4] -
- odst[((by - 1) * linesize + bx - 1 - z) * 4];
- g = odst[((by - 1) * linesize + bx) * 4 + 1] +
- odst[(by * linesize + bx - 1 - z) * 4 + 1] -
- odst[((by - 1) * linesize + bx - 1 - z) * 4 + 1];
- b = odst[((by - 1) * linesize + bx) * 4 + 2] +
- odst[(by * linesize + bx - 1 - z) * 4 + 2] -
- odst[((by - 1) * linesize + bx - 1 - z) * 4 + 2];
- clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- case 5:
- while (run-- > 0) {
- if (by < 1 || by >= avctx->height)
- return AVERROR_INVALIDDATA;
-
- if (bx == 0) {
- if (by < 2)
- return AVERROR_INVALIDDATA;
- z = backstep;
- } else {
- z = 0;
- }
-
- clr = dst[(by - 1) * linesize + bx - 1 - z];
- dst[by * linesize + bx] = clr;
- bx++;
- if (bx >= x * 16 + sx2 || bx >= avctx->width) {
- bx = x * 16 + sx1;
- by++;
- }
- }
- break;
- }
-
- if (avctx->bits_per_coded_sample == 16) {
- cx1 = (clr & 0x3F00) >> 2;
- cx = (clr & 0x3FFFFF) >> 16;
- } else {
- cx1 = (clr & 0xFC00) >> 4;
- cx = (clr & 0xFFFFFF) >> 18;
- }
+ ret = decode_run_p(avctx, ptype, run, x, y, clr,
+ dst, prev, linesize, plinesize, &bx, &by,
+ backstep, sx1, sx2, &cx, &cx1);
+ if (ret < 0)
+ return ret;