⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xo-misc.c

📁 高手写的手写代码!欢迎大家下载,共同交流,如果有问题,请联系我!谢谢!
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -