static int is_rgb_color_u8(int threshold_u8, int r, int g, int b) { int rg_diff = fz_absi(r - g); int rb_diff = fz_absi(r - b); int gb_diff = fz_absi(g - b); return rg_diff > threshold_u8 || rb_diff > threshold_u8 || gb_diff > threshold_u8; }
static int bmp_palette_is_gray(fz_context *ctx, struct info *info, int readcolors) { int i; for (i = 0; i < readcolors; i++) { int rgdiff = fz_absi(info->palette[3 * i + 0] - info->palette[3 * i + 1]); int gbdiff = fz_absi(info->palette[3 * i + 1] - info->palette[3 * i + 2]); int rbdiff = fz_absi(info->palette[3 * i + 0] - info->palette[3 * i + 2]); if (rgdiff > 2 || gbdiff > 2 || rbdiff > 2) return 0; } return 1; }
int fz_highlight_selection(fz_context *ctx, fz_text_page *page, fz_bbox rect, fz_bbox *hit_bbox, int hit_max) { fz_bbox linebox, charbox; fz_text_block *block; fz_text_line *line; fz_text_span *span; int i, hit_count; int x0 = rect.x0; int x1 = rect.x1; int y0 = rect.y0; int y1 = rect.y1; hit_count = 0; for (block = page->blocks; block < page->blocks + page->len; block++) { for (line = block->lines; line < block->lines + block->len; line++) { linebox = fz_empty_bbox; for (span = line->spans; span < line->spans + line->len; span++) { for (i = 0; i < span->len; i++) { charbox = fz_bbox_covering_rect(span->text[i].bbox); if (charbox.x1 >= x0 && charbox.x0 <= x1 && charbox.y1 >= y0 && charbox.y0 <= y1) { if (charbox.y0 != linebox.y0 || fz_absi(charbox.x0 - linebox.x1) > 5) { if (!fz_is_empty_bbox(linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; linebox = charbox; } else { linebox = fz_union_bbox(linebox, charbox); } } } } if (!fz_is_empty_bbox(linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; } } return hit_count; }
int fz_search_text_page(fz_context *ctx, fz_text_page *text, char *needle, fz_bbox *hit_bbox, int hit_max) { int pos, len, i, n, hit_count; if (strlen(needle) == 0) return 0; hit_count = 0; len = textlen(text); for (pos = 0; pos < len; pos++) { n = match(text, needle, pos); if (n) { fz_bbox linebox = fz_empty_bbox; for (i = 0; i < n; i++) { fz_bbox charbox = bboxat(text, pos + i); if (!fz_is_empty_bbox(charbox)) { if (charbox.y0 != linebox.y0 || fz_absi(charbox.x0 - linebox.x1) > 5) { if (!fz_is_empty_bbox(linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; linebox = charbox; } else { linebox = fz_union_bbox(linebox, charbox); } } } if (!fz_is_empty_bbox(linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; } } return hit_count; }
static void fz_insert_gel_raw(fz_context *ctx, fz_gel *gel, int x0, int y0, int x1, int y1) { fz_edge *edge; int dx, dy; int winding; int width; int tmp; if (y0 == y1) return; if (y0 > y1) { winding = -1; tmp = x0; x0 = x1; x1 = tmp; tmp = y0; y0 = y1; y1 = tmp; } else winding = 1; if (x0 < gel->bbox.x0) gel->bbox.x0 = x0; if (x0 > gel->bbox.x1) gel->bbox.x1 = x0; if (x1 < gel->bbox.x0) gel->bbox.x0 = x1; if (x1 > gel->bbox.x1) gel->bbox.x1 = x1; if (y0 < gel->bbox.y0) gel->bbox.y0 = y0; if (y1 > gel->bbox.y1) gel->bbox.y1 = y1; if (gel->len + 1 == gel->cap) { int new_cap = gel->cap * 2; gel->edges = fz_resize_array(ctx, gel->edges, new_cap, sizeof(fz_edge)); gel->cap = new_cap; } edge = &gel->edges[gel->len++]; dy = y1 - y0; dx = x1 - x0; width = fz_absi(dx); edge->xdir = dx > 0 ? 1 : -1; edge->ydir = winding; edge->x = x0; edge->y = y0; edge->h = dy; edge->adj_down = dy; /* initial error term going l->r and r->l */ if (dx >= 0) edge->e = 0; else edge->e = -dy + 1; /* y-major edge */ if (dy >= width) { edge->xmove = 0; edge->adj_up = width; } /* x-major edge */ else { edge->xmove = (width / dy) * edge->xdir; edge->adj_up = width % dy; } }