doc_link.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "fitz-internal.h"
  2. void
  3. fz_free_link_dest(fz_context *ctx, fz_link_dest *dest)
  4. {
  5. switch(dest->kind)
  6. {
  7. case FZ_LINK_NONE:
  8. case FZ_LINK_GOTO:
  9. break;
  10. case FZ_LINK_URI:
  11. fz_free(ctx, dest->ld.uri.uri);
  12. break;
  13. case FZ_LINK_LAUNCH:
  14. fz_free(ctx, dest->ld.launch.file_spec);
  15. break;
  16. case FZ_LINK_NAMED:
  17. fz_free(ctx, dest->ld.named.named);
  18. break;
  19. case FZ_LINK_GOTOR:
  20. fz_free(ctx, dest->ld.gotor.file_spec);
  21. break;
  22. }
  23. }
  24. fz_link *
  25. fz_new_link(fz_context *ctx, const fz_rect *bbox, fz_link_dest dest)
  26. {
  27. fz_link *link;
  28. fz_try(ctx)
  29. {
  30. link = fz_malloc_struct(ctx, fz_link);
  31. link->refs = 1;
  32. }
  33. fz_catch(ctx)
  34. {
  35. fz_free_link_dest(ctx, &dest);
  36. fz_rethrow(ctx);
  37. }
  38. link->dest = dest;
  39. link->rect = *bbox;
  40. link->next = NULL;
  41. return link;
  42. }
  43. fz_link *
  44. fz_keep_link(fz_context *ctx, fz_link *link)
  45. {
  46. if (link)
  47. link->refs++;
  48. return link;
  49. }
  50. void
  51. fz_drop_link(fz_context *ctx, fz_link *link)
  52. {
  53. while (link && --link->refs == 0)
  54. {
  55. fz_link *next = link->next;
  56. fz_free_link_dest(ctx, &link->dest);
  57. fz_free(ctx, link);
  58. link = next;
  59. }
  60. }