📄 xo-misc.c
字号:
#endif}void update_item_bbox(struct Item *item){ int i; gdouble *p, h, w; if (item->type == ITEM_STROKE) { item->bbox.left = item->bbox.right = item->path->coords[0]; item->bbox.top = item->bbox.bottom = item->path->coords[1]; for (i=1, p=item->path->coords+2; i<item->path->num_points; i++, p+=2) { if (p[0] < item->bbox.left) item->bbox.left = p[0]; if (p[0] > item->bbox.right) item->bbox.right = p[0]; if (p[1] < item->bbox.top) item->bbox.top = p[1]; if (p[1] > item->bbox.bottom) item->bbox.bottom = p[1]; } } if (item->type == ITEM_TEXT && item->canvas_item!=NULL) { h=0.; w=0.; g_object_get(item->canvas_item, "text_width", &w, "text_height", &h, NULL); item->bbox.right = item->bbox.left + w; item->bbox.bottom = item->bbox.top + h; }}void make_page_clipbox(struct Page *pg){ GnomeCanvasPathDef *pg_clip; pg_clip = gnome_canvas_path_def_new_sized(4); gnome_canvas_path_def_moveto(pg_clip, 0., 0.); gnome_canvas_path_def_lineto(pg_clip, 0., pg->height); gnome_canvas_path_def_lineto(pg_clip, pg->width, pg->height); gnome_canvas_path_def_lineto(pg_clip, pg->width, 0.); gnome_canvas_path_def_closepath(pg_clip); gnome_canvas_item_set(GNOME_CANVAS_ITEM(pg->group), "path", pg_clip, NULL); gnome_canvas_path_def_unref(pg_clip);}void make_canvas_item_one(GnomeCanvasGroup *group, struct Item *item){ GnomeCanvasItem *i; PangoFontDescription *font_desc; if (item->type == ITEM_STROKE) item->canvas_item = gnome_canvas_item_new(group, gnome_canvas_line_get_type(), "points", item->path, "cap-style", GDK_CAP_ROUND, "join-style", GDK_JOIN_ROUND, "fill-color-rgba", item->brush.color_rgba, "width-units", item->brush.thickness, NULL); if (item->type == ITEM_TEXT) { font_desc = pango_font_description_from_string(item->font_name); pango_font_description_set_absolute_size(font_desc, item->font_size*ui.zoom*PANGO_SCALE); item->canvas_item = gnome_canvas_item_new(group, gnome_canvas_text_get_type(), "x", item->bbox.left, "y", item->bbox.top, "anchor", GTK_ANCHOR_NW, "font-desc", font_desc, "fill-color-rgba", item->brush.color_rgba, "text", item->text, NULL); update_item_bbox(item); }}void make_canvas_items(void){ struct Page *pg; struct Layer *l; struct Item *item; GList *pagelist, *layerlist, *itemlist; for (pagelist = journal.pages; pagelist!=NULL; pagelist = pagelist->next) { pg = (struct Page *)pagelist->data; if (pg->group == NULL) { pg->group = (GnomeCanvasGroup *) gnome_canvas_item_new( gnome_canvas_root(canvas), gnome_canvas_clipgroup_get_type(), NULL); make_page_clipbox(pg); } if (pg->bg->canvas_item == NULL) update_canvas_bg(pg); for (layerlist = pg->layers; layerlist!=NULL; layerlist = layerlist->next) { l = (struct Layer *)layerlist->data; if (l->group == NULL) l->group = (GnomeCanvasGroup *) gnome_canvas_item_new( pg->group, gnome_canvas_group_get_type(), NULL); for (itemlist = l->items; itemlist!=NULL; itemlist = itemlist->next) { item = (struct Item *)itemlist->data; if (item->canvas_item == NULL) make_canvas_item_one(l->group, item); } } }}void update_canvas_bg(struct Page *pg){ GnomeCanvasGroup *group; GnomeCanvasPoints *seg; GdkPixbuf *scaled_pix; double *pt; double x, y; int w, h; if (pg->bg->canvas_item != NULL) gtk_object_destroy(GTK_OBJECT(pg->bg->canvas_item)); pg->bg->canvas_item = NULL; if (pg->bg->type == BG_SOLID) { pg->bg->canvas_item = gnome_canvas_item_new(pg->group, gnome_canvas_group_get_type(), NULL); group = GNOME_CANVAS_GROUP(pg->bg->canvas_item); lower_canvas_item_to(pg->group, pg->bg->canvas_item, NULL); gnome_canvas_item_new(group, gnome_canvas_rect_get_type(), "x1", 0., "x2", pg->width, "y1", 0., "y2", pg->height, "fill-color-rgba", pg->bg->color_rgba, NULL); if (pg->bg->ruling == RULING_NONE) return; seg = gnome_canvas_points_new(2); pt = seg->coords; if (pg->bg->ruling == RULING_GRAPH) { pt[1] = 0; pt[3] = pg->height; for (x=RULING_GRAPHSPACING; x<pg->width-1; x+=RULING_GRAPHSPACING) { pt[0] = pt[2] = x; gnome_canvas_item_new(group, gnome_canvas_line_get_type(), "points", seg, "fill-color-rgba", RULING_COLOR, "width-units", RULING_THICKNESS, NULL); } pt[0] = 0; pt[2] = pg->width; for (y=RULING_GRAPHSPACING; y<pg->height-1; y+=RULING_GRAPHSPACING) { pt[1] = pt[3] = y; gnome_canvas_item_new(group, gnome_canvas_line_get_type(), "points", seg, "fill-color-rgba", RULING_COLOR, "width-units", RULING_THICKNESS, NULL); } gnome_canvas_points_free(seg); return; } pt[0] = 0; pt[2] = pg->width; for (y=RULING_TOPMARGIN; y<pg->height-1; y+=RULING_SPACING) { pt[1] = pt[3] = y; gnome_canvas_item_new(group, gnome_canvas_line_get_type(), "points", seg, "fill-color-rgba", RULING_COLOR, "width-units", RULING_THICKNESS, NULL); } if (pg->bg->ruling == RULING_LINED) { pt[0] = pt[2] = RULING_LEFTMARGIN; pt[1] = 0; pt[3] = pg->height; gnome_canvas_item_new(group, gnome_canvas_line_get_type(), "points", seg, "fill-color-rgba", RULING_MARGIN_COLOR, "width-units", RULING_THICKNESS, NULL); } gnome_canvas_points_free(seg); return; } if (pg->bg->type == BG_PIXMAP) { if (ui.antialias_bg) { set_cursor_busy(TRUE); w = (int)floor(pg->width*ui.zoom+0.5); h = (int)floor(pg->height*ui.zoom+0.5); if (w == gdk_pixbuf_get_width(pg->bg->pixbuf) && h == gdk_pixbuf_get_height(pg->bg->pixbuf)) scaled_pix = gdk_pixbuf_ref(pg->bg->pixbuf); else scaled_pix = gdk_pixbuf_scale_simple(pg->bg->pixbuf, w, h, GDK_INTERP_BILINEAR); pg->bg->pixbuf_scale = ui.zoom; set_cursor_busy(FALSE); } else { scaled_pix = gdk_pixbuf_ref(pg->bg->pixbuf); pg->bg->pixbuf_scale = 0; } pg->bg->canvas_item = gnome_canvas_item_new(pg->group, gnome_canvas_pixbuf_get_type(), "pixbuf", scaled_pix, "width", pg->width, "height", pg->height, "width-set", TRUE, "height-set", TRUE, NULL); gdk_pixbuf_unref(scaled_pix); lower_canvas_item_to(pg->group, pg->bg->canvas_item, NULL); } if (pg->bg->type == BG_PDF) { if (pg->bg->pixbuf == NULL) return; pg->bg->canvas_item = gnome_canvas_item_new(pg->group, gnome_canvas_pixbuf_get_type(), "pixbuf", pg->bg->pixbuf, "width", pg->width, "height", pg->height, "width-set", TRUE, "height-set", TRUE, NULL); lower_canvas_item_to(pg->group, pg->bg->canvas_item, NULL); }}gboolean is_visible(struct Page *pg){ GtkAdjustment *v_adj; double ytop, ybot; if (!ui.view_continuous) return (pg == ui.cur_page); v_adj = gtk_layout_get_vadjustment(GTK_LAYOUT(canvas)); ytop = v_adj->value/ui.zoom; ybot = (v_adj->value + v_adj->page_size) / ui.zoom; return (MAX(ytop, pg->voffset) < MIN(ybot, pg->voffset+pg->height));}void rescale_bg_pixmaps(void){ GList *pglist; struct Page *pg; GdkPixbuf *pix; for (pglist = journal.pages; pglist!=NULL; pglist = pglist->next) { pg = (struct Page *)pglist->data; // in progressive mode we scale only visible pages if (ui.progressive_bg && !is_visible(pg)) continue; if (pg->bg->type == BG_PIXMAP && pg->bg->canvas_item!=NULL) { // do the rescaling ourselves if (ui.antialias_bg) { if (pg->bg->pixbuf_scale == ui.zoom) continue; set_cursor_busy(TRUE); pix = gdk_pixbuf_scale_simple(pg->bg->pixbuf, (int)floor(pg->width*ui.zoom+0.5), (int)floor(pg->height*ui.zoom+0.5), GDK_INTERP_BILINEAR); gnome_canvas_item_set(pg->bg->canvas_item, "pixbuf", pix, NULL); gdk_pixbuf_unref(pix); pg->bg->pixbuf_scale = ui.zoom; set_cursor_busy(FALSE); } else { g_object_get(G_OBJECT(pg->bg->canvas_item), "pixbuf", &pix, NULL); if (pix!=pg->bg->pixbuf) gnome_canvas_item_set(pg->bg->canvas_item, "pixbuf", pg->bg->pixbuf, NULL); pg->bg->pixbuf_scale = 0; } } if (pg->bg->type == BG_PDF) { // request an asynchronous update if (pg->bg->pixbuf_scale == ui.zoom) continue; add_bgpdf_request(pg->bg->file_page_seq, ui.zoom, FALSE); pg->bg->pixbuf_scale = ui.zoom; } }}gboolean have_intersect(struct BBox *a, struct BBox *b){ return (MAX(a->top, b->top) <= MIN(a->bottom, b->bottom)) && (MAX(a->left, b->left) <= MIN(a->right, b->right));}/* In libgnomecanvas 2.10.0, the lower/raise functions fail to update correctly the end of the group's item list. We try to work around this. DON'T USE gnome_canvas_item_raise/lower directly !! */void lower_canvas_item_to(GnomeCanvasGroup *g, GnomeCanvasItem *item, GnomeCanvasItem *after){ int i1, i2; i1 = g_list_index(g->item_list, item); if (i1 == -1) return; if (after == NULL) i2 = -1; else i2 = g_list_index(g->item_list, after); if (i1 < i2) gnome_canvas_item_raise(item, i2-i1); if (i1 > i2+1) gnome_canvas_item_lower(item, i1-i2-1); // BUGFIX for libgnomecanvas g->item_list_end = g_list_last(g->item_list);}void rgb_to_gdkcolor(guint rgba, GdkColor *color){ color->pixel = 0; color->red = ((rgba>>24)&0xff)*0x101; color->green = ((rgba>>16)&0xff)*0x101; color->blue = ((rgba>>8)&0xff)*0x101;}// some interface functionsvoid update_thickness_buttons(void){ if (ui.selection!=NULL || ui.toolno[ui.cur_mapping] >= NUM_STROKE_TOOLS) { gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonThicknessOther")), TRUE); } else switch (ui.cur_brush->thickness_no) { case THICKNESS_FINE: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonFine")), TRUE); break; case THICKNESS_MEDIUM: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonMedium")), TRUE); break; case THICKNESS_THICK: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonThick")), TRUE); break; default: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonThicknessOther")), TRUE); }}void update_color_buttons(void){ if (ui.selection!=NULL || (ui.toolno[ui.cur_mapping] != TOOL_PEN && ui.toolno[ui.cur_mapping] != TOOL_HIGHLIGHTER && ui.toolno[ui.cur_mapping] != TOOL_TEXT)) { gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonColorOther")), TRUE); } else switch (ui.cur_brush->color_no) { case COLOR_BLACK: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonBlack")), TRUE); break; case COLOR_BLUE: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonBlue")), TRUE); break; case COLOR_RED: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonRed")), TRUE); break; case COLOR_GREEN: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonGreen")), TRUE); break; case COLOR_GRAY: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonGray")), TRUE); break; case COLOR_LIGHTBLUE: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonLightBlue")), TRUE); break; case COLOR_LIGHTGREEN: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonLightGreen")), TRUE); break; case COLOR_MAGENTA: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonMagenta")), TRUE); break; case COLOR_ORANGE: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonOrange")), TRUE); break; case COLOR_YELLOW: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonYellow")), TRUE); break; case COLOR_WHITE: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonWhite")), TRUE); break; default: gtk_toggle_tool_button_set_active(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -