00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #define KATE_INTERNAL
00011 #include "kate_internal.h"
00012 
00013 #ifdef HAVE_STDLIB_H
00014 #include <stdlib.h>
00015 #endif
00016 #include "kate/kate.h"
00017 
00018 static int kate_event_init(kate_event *ev,const kate_info *ki)
00019 {
00020   if (!ev || !ki) return KATE_E_INVALID_PARAMETER;
00021 
00022   ev->start_time=-1;
00023   ev->duration=-1;
00024   ev->backlink=-1;
00025   ev->id=-1;
00026 
00027   ev->text_encoding=ki->text_encoding;
00028   ev->text_directionality=ki->text_directionality;
00029   ev->text_markup_type=ki->text_markup_type;
00030   ev->language=NULL;
00031   ev->text=NULL;
00032   ev->len=0;
00033 
00034   ev->nmotions=0;
00035   ev->motions=NULL;
00036 
00037   ev->region=NULL;
00038   ev->style=NULL;
00039   ev->secondary_style=NULL;
00040   ev->font_mapping=NULL;
00041   ev->palette=NULL;
00042   ev->bitmap=NULL;
00043 
00044   ev->nbitmaps=0;
00045   ev->bitmaps=NULL;
00046 
00047   
00048   ev->ki=ki;
00049   ev->trackers=0;
00050 
00051   return 0;
00052 }
00053 
00054 kate_event *kate_event_create(const kate_info *ki)
00055 {
00056   kate_event *ev;
00057 
00058   if (!ki) return NULL;
00059 
00060   ev=(kate_event*)kate_malloc(sizeof(kate_event));
00061   if (!ev) return NULL;
00062   if (kate_event_init(ev,ki)<0) {
00063     kate_free(ev);
00064     return NULL;
00065   }
00066 
00067   return ev;
00068 }
00069 
00070 int kate_event_destroy(kate_event *ev)
00071 {
00072   size_t n;
00073 
00074   if (!ev) return KATE_E_INVALID_PARAMETER;
00075   if (!ev->ki) return KATE_E_INIT;
00076   if (ev->trackers) return KATE_E_INIT;
00077 
00078   if (ev->language) kate_free(ev->language);
00079   kate_free(ev->text);
00080   if (ev->motions) {
00081     kate_motion_destroy(ev->ki,ev->motions,NULL,ev->nmotions,0);
00082   }
00083 
00084   if (ev->region && kate_find_region(ev->ki,ev->region)<0) {
00085     kate_free(ev->region);
00086   }
00087   if (ev->style && kate_find_style(ev->ki,ev->style)<0) {
00088     if (ev->style->font) kate_free(ev->style->font);
00089     kate_free(ev->style);
00090   }
00091   if (ev->secondary_style && kate_find_style(ev->ki,ev->secondary_style)<0) {
00092     kate_free(ev->secondary_style);
00093   }
00094   if (ev->font_mapping && kate_find_font_mapping(ev->ki,ev->font_mapping)<0) {
00095     kate_free(ev->font_mapping);
00096   }
00097   if (ev->palette && kate_find_palette(ev->ki,ev->palette)<0) {
00098     kate_free(ev->palette->colors);
00099     kate_free(ev->palette);
00100   }
00101 
00102   if (ev->bitmaps) {
00103     for (n=0;n<ev->nbitmaps;++n) {
00104       if (ev->bitmaps[n] && kate_find_bitmap(ev->ki,ev->bitmaps[n])<0) {
00105         kate_free(ev->bitmaps[n]->pixels);
00106         kate_free(ev->bitmaps[n]);
00107       }
00108     }
00109     kate_free(ev->bitmaps);
00110   }
00111   if (ev->bitmap && kate_find_bitmap(ev->ki,ev->bitmap)<0) {
00112     kate_free(ev->bitmap->pixels);
00113     kate_free(ev->bitmap);
00114   }
00115 
00116   kate_free(ev);
00117 
00118   return 0;
00119 }
00120 
00121 int kate_event_track(kate_event *ev)
00122 {
00123   if (!ev) return KATE_E_INVALID_PARAMETER;
00124 
00125   ++ev->trackers;
00126 
00127   return 0;
00128 }
00129 
00130 int kate_event_release(kate_event *ev)
00131 {
00132   if (!ev) return KATE_E_INVALID_PARAMETER;
00133   if (ev->trackers==0) return KATE_E_INIT;
00134 
00135   if (--ev->trackers==0) kate_event_destroy(ev);
00136 
00137   return 0;
00138 }
00139