fz_halftone *fz_default_halftone(fz_context *ctx, int num_comps) { fz_halftone *ht = fz_new_halftone(ctx, num_comps); fz_try(ctx) { int i; for (i = 0; i < num_comps; i++) ht->comp[i] = fz_new_pixmap_with_data(ctx, NULL, 16, 16, 1, 16, mono_ht); } fz_catch(ctx) { fz_drop_halftone(ctx, ht); fz_rethrow(ctx); } return ht; }
fz_bitmap *fz_halftone_pixmap(fz_context *ctx, fz_pixmap *pix, fz_halftone *ht) { fz_bitmap *out; unsigned char *ht_line, *o, *p; int w, h, x, y, n, pstride, ostride; fz_halftone *ht_orig = ht; if (!pix) return NULL; assert(pix->n == 2); /* Mono + Alpha */ n = pix->n-1; /* Remove alpha */ if (ht == NULL) { ht = fz_default_halftone(ctx, n); } ht_line = fz_malloc(ctx, pix->w * n); out = fz_new_bitmap(ctx, pix->w, pix->h, n, pix->xres, pix->yres); o = out->samples; p = pix->samples; h = pix->h; x = pix->x; y = pix->y; w = pix->w; ostride = out->stride; pstride = pix->w * pix->n; while (h--) { make_ht_line(ht_line, ht, x, y++, w); do_threshold_1(ht_line, p, o, w); o += ostride; p += pstride; } if (!ht_orig) fz_drop_halftone(ctx, ht); return out; }