void fz_draw_html(fz_context *ctx, fz_html *box, float page_top, float page_bot, fz_device *dev, const fz_matrix *inctm) { fz_matrix ctm = *inctm; fz_pre_translate(&ctm, 0, -page_top); draw_block_box(ctx, box, page_top, page_bot, dev, &ctm); }
static void draw_block_box(fz_context *ctx, fz_html *box, float page_top, float page_bot, fz_device *dev, const fz_matrix *ctm) { float x0, y0, x1, y1; float color[4]; // TODO: background fill // TODO: border stroke float *border = box->border; float *padding = box->padding; x0 = box->x - padding[L]; y0 = box->y - padding[T]; x1 = box->x + box->w + padding[R]; y1 = box->y + box->h + padding[B]; if (y0 > page_bot || y1 < page_top) return; if (box->style.background_color.a > 0) { color[0] = box->style.background_color.r / 255.0f; color[1] = box->style.background_color.g / 255.0f; color[2] = box->style.background_color.b / 255.0f; color[3] = box->style.background_color.a / 255.0f; draw_rect(ctx, dev, ctm, color, x0, y0, x1, y1); } if (box->style.border_color.a > 0) { color[0] = box->style.border_color.r / 255.0f; color[1] = box->style.border_color.g / 255.0f; color[2] = box->style.border_color.b / 255.0f; color[3] = box->style.border_color.a / 255.0f; if (border[T] > 0) draw_rect(ctx, dev, ctm, color, x0 - border[L], y0 - border[T], x1 + border[R], y0); if (border[B] > 0) draw_rect(ctx, dev, ctm, color, x0 - border[L], y1, x1 + border[R], y1 + border[B]); if (border[L] > 0) draw_rect(ctx, dev, ctm, color, x0 - border[L], y0 - border[T], x0, y1 + border[B]); if (border[R] > 0) draw_rect(ctx, dev, ctm, color, x1, y0 - border[T], x1 + border[R], y1 + border[B]); } for (box = box->down; box; box = box->next) { switch (box->type) { case BOX_BLOCK: draw_block_box(ctx, box, page_top, page_bot, dev, ctm); break; case BOX_FLOW: draw_flow_box(ctx, box, page_top, page_bot, dev, ctm); break; } } }
static void draw_block_box(fz_context *ctx, fz_html *box, float page_top, float page_bot, fz_device *dev, const fz_matrix *ctm) { float x0, y0, x1, y1; float *border = box->border; float *padding = box->padding; x0 = box->x - padding[L]; y0 = box->y - padding[T]; x1 = box->x + box->w + padding[R]; y1 = box->y + box->h + padding[B]; if (y0 > page_bot || y1 < page_top) return; if (box->style.visibility == V_VISIBLE) { draw_rect(ctx, dev, ctm, box->style.background_color, x0, y0, x1, y1); if (border[T] > 0) draw_rect(ctx, dev, ctm, box->style.border_color[T], x0 - border[L], y0 - border[T], x1 + border[R], y0); if (border[B] > 0) draw_rect(ctx, dev, ctm, box->style.border_color[B], x0 - border[L], y1, x1 + border[R], y1 + border[B]); if (border[L] > 0) draw_rect(ctx, dev, ctm, box->style.border_color[L], x0 - border[L], y0 - border[T], x0, y1 + border[B]); if (border[R] > 0) draw_rect(ctx, dev, ctm, box->style.border_color[R], x1, y0 - border[T], x1 + border[R], y1 + border[B]); if (box->list_item) draw_list_mark(ctx, box, page_top, page_bot, dev, ctm, box->list_item); } for (box = box->down; box; box = box->next) { switch (box->type) { case BOX_BLOCK: draw_block_box(ctx, box, page_top, page_bot, dev, ctm); break; case BOX_FLOW: draw_flow_box(ctx, box, page_top, page_bot, dev, ctm); break; } } }