int main(void) { int i, j; int err, maxerr, maxi; int nerr, ntot; nerr = 0; ntot = 0; maxerr = 0; maxi = -1; for(i = 0; i < 256; i++){ for(j = 0; j < 256; j++){ if((err = div255(i*j) - (i*j)/255) != 0){ err = err >= 0 ? err : -err; if(err > maxerr){ maxerr = err; maxi = i*j; } nerr++; printf("error %d/255 = %d, need %d\n", i*j, div255(i*j), (i*j)/255); } ntot++; } } printf("%d errors from %d total, maximum error: %d, %d/255 = %d, should be %d\n", nerr, ntot, maxerr, maxi, div255(maxi), maxi/255); return 0; }
static void assRender(VSFrameRef *dst, VSFrameRef *alpha, const VSAPI *vsapi, ASS_Image *img) { uint8_t *planes[4]; int strides[4], p; for(p = 0; p < 4; p++) { VSFrameRef *fr = p == 3 ? alpha : dst; planes[p] = vsapi->getWritePtr(fr, p % 3); strides[p] = vsapi->getStride(fr, p % 3); memset(planes[p], 0, strides[p] * vsapi->getFrameHeight(fr, p % 3)); } while(img) { uint8_t *dstp[4], *alphap, *sp, color[4]; uint16_t outa; int x, y, k; if(img->w == 0 || img->h == 0) { img = img->next; continue; } color[0] = _r(img->color); color[1] = _g(img->color); color[2] = _b(img->color); color[3] = _a(img->color); dstp[0] = planes[0] + (strides[0] * img->dst_y) + img->dst_x; dstp[1] = planes[1] + (strides[1] * img->dst_y) + img->dst_x; dstp[2] = planes[2] + (strides[2] * img->dst_y) + img->dst_x; dstp[3] = planes[3] + (strides[3] * img->dst_y) + img->dst_x; alphap = dstp[3]; sp = img->bitmap; for(y = 0; y < img->h; y++) { for(x = 0; x < img->w; x++) { k = div255(sp[x] * color[3]); outa = k * 255 + (alphap[x] * (255 - k)); if(outa != 0) { dstp[0][x] = blend(k, color[0], alphap[x], dstp[0][x], outa); dstp[1][x] = blend(k, color[1], alphap[x], dstp[1][x], outa); dstp[2][x] = blend(k, color[2], alphap[x], dstp[2][x], outa); dstp[3][x] = div255(outa); } } dstp[0] += strides[0]; dstp[1] += strides[1]; dstp[2] += strides[2]; dstp[3] += strides[3]; alphap += strides[3]; sp += img->stride; } img = img->next; } }