OSDN Git Service

r224をNetBeans用に設定変更.
[coroid/inqubus.git] / vhook / framehook.c
1 /*\83t\83\8c\81[\83\80\83t\83b\83N\82Ì\91\8a\8eè\82ð\82·\82é\82½\82ß\90ê\97p*/\r
2 \r
3 #include <stdlib.h>\r
4 #include <stdio.h>\r
5 #include <string.h>\r
6 #include <SDL/SDL.h>\r
7 #include "common/framehook_ext.h"\r
8 #include "framehook.h"\r
9 #include "main.h"\r
10 #include "mydef.h"\r
11 #include "nicodef.h"\r
12 #include "util.h"\r
13 \r
14 typedef struct ContextInfo{\r
15         FILE* log;\r
16         DATA data;\r
17 } ContextInfo;\r
18 \r
19 /*\r
20  * \95K\97v\82È\8aÖ\90\94\82Ð\82Æ\82Â\82ß\81B\8dÅ\8f\89\82É\8cÄ\82Î\82ê\82é\82æ\81I\r
21  * \r
22  */\r
23 int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]);\r
24 \r
25 __declspec(dllexport) int ExtConfigure(void **ctxp,const toolbox *tbox, int argc, char *argv[]){\r
26         int i;\r
27         //\83\8d\83O\r
28         FILE* log = fopen("[log]vhext.txt", "w");\r
29         if(log == NULL){\r
30                 puts("[framehook/init]failed to open logfile.\n");\r
31                 fflush(log);\r
32                 return -1;\r
33         }else{\r
34                 fputs("[framehook/init]initializing..\n",log);\r
35                 fflush(log);\r
36         }\r
37         //\95K\97v\82È\90Ý\92è\82ª\82 \82é\82©\82Ì\8am\94F\r
38         fprintf(log,"[framehook/init]called with argc = %d\n",argc);\r
39         fflush(log);\r
40         for(i=0;i<argc;i++){\r
41                 fprintf(log,"[framehook/init]arg[%2d] = %s\n",i,argv[i]);\r
42                 fflush(log);\r
43         }\r
44         //\83Z\83b\83e\83B\83\93\83O\8eæ\93¾\81B\r
45         SETTING setting;\r
46         if(init_setting(log,tbox,&setting,argc,argv)){\r
47                 fputs("[framehook/init]initialized settings.\n",log);\r
48                 fflush(log);\r
49         }else{\r
50                 fputs("[framehook/init]failed to initialize settings.\n",log);\r
51                 fflush(log);\r
52                 return -2;\r
53         }\r
54         //\83\89\83C\83u\83\89\83\8a\82È\82Ç\82Ì\8f\89\8aú\89»\r
55         if(init(log)){\r
56                 fputs("[framehook/init]initialized libs.\n",log);\r
57                 fflush(log);\r
58         }else{\r
59                 fputs("[framehook/init]failed to initialize libs.\n",log);\r
60                 fflush(log);\r
61                 return -3;\r
62         }\r
63         /*\83R\83\93\83e\83L\83X\83g\82Ì\90Ý\92è*/\r
64         *ctxp = malloc(sizeof(ContextInfo));\r
65         if(*ctxp == NULL){\r
66                 fputs("[framehook/init]initialized to malloc for context.\n",log);\r
67                 fflush(log);\r
68         }\r
69         ContextInfo* ci = (ContextInfo*)*ctxp;\r
70         ci->log = log;\r
71         fflush(log);\r
72         if(initData(&ci->data,log,&setting)){\r
73                 fputs("[framehook/init]initialized context.\n",log);\r
74                 fputs("[framehook/init]initialized.\n",log);\r
75                 fflush(log);\r
76                 return 0;\r
77         }else{\r
78                 fputs("[framehook/init]failed to initialize context.\n",log);\r
79                 fflush(log);\r
80                 return -4;\r
81         }\r
82 }\r
83 /*\r
84  * \93à\95\94\82Å\82Ì\82Ý\8cÄ\82Î\82ê\82é\81B\r
85  */\r
86 \r
87  /*\r
88         argv[0]:\83v\83\8d\83O\83\89\83\80\r
89         argv[1]:vhook\r
90         argv[2]:\83t\83H\83\93\83g\r
91         argv[3]:\83t\83H\83\93\83g\83C\83\93\83f\83b\83N\83X\r
92         argv[4]:\88ê\89æ\96Ê\r
93         argv[5]:\89e\82Ì\8eí\97Þ\r
94         \88È\8d~\83I\83v\83V\83\87\83\93\r
95         --enable-show-video\81F\95`\89æ\92\86\82É\93®\89æ\82ð\8c©\82¹\82é\81B\r
96         --enable-fontsize-fix\81F\83t\83H\83\93\83g\83T\83C\83Y\82ð\8e©\93®\82Å\92²\90®\82·\82é\81B\r
97 */\r
98  \r
99 int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]){\r
100         /*video\82Ì\92·\82³*/\r
101         setting->video_length = (tbox->video_length * VPOS_FACTOR);\r
102         /*\88È\8d~\83I\83v\83V\83\87\83\93*/\r
103         \r
104         //\83R\83\81\83\93\83g\82ð\8c©\82¹\82é\82©\94Û\82©\81H\r
105         setting->enable_user_comment = FALSE;\r
106         setting->enable_owner_comment = FALSE;\r
107         setting->data_user_path = NULL;\r
108         setting->data_owner_path = NULL;\r
109         //\88ê\94Ê\93I\82È\90Ý\92è\r
110         setting->font_path = NULL;\r
111         setting->font_index = 0;\r
112         setting->user_slot_max = 30;\r
113         setting->owner_slot_max = 30;\r
114         setting->shadow_kind = 1;//\83f\83t\83H\83\8b\83g\82Í\83j\83R\83j\83R\93®\89æ\95\97\r
115         setting->show_video = FALSE;\r
116         setting->fontsize_fix=FALSE;\r
117         setting->opaque_comment=FALSE;\r
118         int i;\r
119         char* arg;\r
120         for(i=0;i<argc;i++){\r
121                 arg = argv[i];\r
122                 if(!setting->data_user_path && strncmp(FRAMEHOOK_OPT_DATA_USER,arg,FRAMEHOOK_OPT_DATA_USER_LEN) == 0){\r
123                         char* data_user = arg+FRAMEHOOK_OPT_DATA_USER_LEN;\r
124                         setting->data_user_path = data_user;\r
125                         setting->enable_user_comment = TRUE;\r
126                         fprintf(log,"[framehook/init]User Comment data path:%s\n",setting->data_user_path);\r
127                         fflush(log);\r
128                 }else if(!setting->data_owner_path && strncmp(FRAMEHOOK_OPT_DATA_OWNER,arg,FRAMEHOOK_OPT_DATA_OWNER_LEN) == 0){\r
129                         char* data_owner = arg+FRAMEHOOK_OPT_DATA_OWNER_LEN;\r
130                         setting->data_owner_path = data_owner;\r
131                         setting->enable_owner_comment = TRUE;\r
132                         fprintf(log,"[framehook/init]Owner Comment data path:%s\n",setting->data_owner_path);\r
133                         fflush(log);\r
134                 }else if(!setting->font_path && strncmp(FRAMEHOOK_OPT_FONT,arg,FRAMEHOOK_OPT_FONT_LEN) == 0){\r
135                         char* font = arg+FRAMEHOOK_OPT_FONT_LEN;\r
136                         setting->font_path = font;\r
137                         fprintf(log,"[framehook/init]Font path:%s\n",setting->font_path);\r
138                         fflush(log);\r
139                 }else if(strncmp(FRAMEHOOK_OPT_FONTINDEX,arg,FRAMEHOOK_OPT_FONTINDEX_LEN) == 0){\r
140                         setting->font_index = MAX(0,atoi(arg+FRAMEHOOK_OPT_FONTINDEX_LEN));\r
141                         fprintf(log,"[framehook/init]font index:%d\n",setting->font_index);\r
142                         fflush(log);\r
143                 }else if(strncmp(FRAMEHOOK_OPT_SHADOW,arg,FRAMEHOOK_OPT_SHADOW_LEN) == 0){\r
144                         setting->shadow_kind = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHADOW_LEN));\r
145                         fprintf(log,"[framehook/init]shadow kind:%d\n",setting->shadow_kind);\r
146                         fflush(log);\r
147                 }else if(strncmp(FRAMEHOOK_OPT_SHOW_USER,arg,FRAMEHOOK_OPT_SHOW_USER_LEN) == 0){\r
148                         setting->user_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_USER_LEN));\r
149                         fprintf(log,"[framehook/init]User Comments on screen:%d\n",setting->user_slot_max);\r
150                         fflush(log);\r
151                 }else if(strncmp(FRAMEHOOK_OPT_SHOW_OWNER,arg,FRAMEHOOK_OPT_SHOW_OWNER_LEN) == 0){\r
152                         setting->owner_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_OWNER_LEN));\r
153                         fprintf(log,"[framehook/init]Owner Comments on screen:%d\n",setting->owner_slot_max);\r
154                         fflush(log);\r
155                 }else if(!setting->show_video && strcmp(arg,"--enable-show-video") == 0){\r
156                         fputs("[framehook/init]show video while converting.\n",log);\r
157                         fflush(log);\r
158                         setting->show_video=TRUE;\r
159                 }else if(!setting->fontsize_fix && strcmp(arg,"--enable-fix-font-size") == 0){\r
160                         fputs("[framehook/init]fix font size automatically.\n",log);\r
161                         fflush(log);\r
162                         setting->fontsize_fix=TRUE;\r
163                 }else if(!setting->opaque_comment && strcmp(arg,"--enable-opaque-comment") == 0){\r
164                         fputs("[framehook/init]enable opaque comment.\n",log);\r
165                         fflush(log);\r
166                         setting->opaque_comment=TRUE;\r
167                 }\r
168         }\r
169         //\88ø\90\94\82ð\90³\82µ\82­\93ü\97Í\82µ\82½\82©\94Û\82©\82Ì\83`\83F\83b\83N\r
170         //\82±\82±\82Å\83`\83F\83b\83N\82µ\82Ä\82¢\82é\82Ì\88È\8aO\82Í\81A\83f\83t\83H\83\8b\83g\90Ý\92è\82Å\93¦\82°\82é\81B\r
171         if(!setting->font_path){\r
172                 fputs("[framehook/init]please set FONT PATH.\n",log);\r
173                 fflush(log);\r
174                 return FALSE;\r
175         }\r
176         return TRUE;\r
177 }\r
178 \r
179 /*\r
180  * \95K\97v\82È\8aÖ\90\94\93ñ\82Â\82ß\81B\83t\83\8c\81[\83\80\82²\82Æ\82É\8cÄ\82Î\82ê\82é\82æ\81I\r
181  * \r
182  */\r
183 __declspec(dllexport) void ExtProcess(void *ctx,const toolbox *tbox,vhext_frame *pict){\r
184     ContextInfo *ci = (ContextInfo *) ctx;\r
185     FILE* log = ci->log;\r
186 \r
187         /* Note:\r
188          * Saccubus 1.22\88È\8d~\82Ì\8ag\92£vhook\83t\83B\83\8b\83^\82Å\82Í\81ARGB24\83t\83H\81[\83}\83b\83g\82Å\82Ì\82Ý\r
189          * \89æ\91\9c\82ª\92ñ\8b\9f\82³\82ê\82Ü\82·\81B\r
190          */\r
191 \r
192         //SDL\82Ì\83T\81[\83t\83F\83C\83X\82É\95Ï\8a·\r
193     SDL_Surface* surf = SDL_CreateRGBSurfaceFrom(pict->data,\r
194                                                                                         pict->w,pict->h,24,pict->linesize,\r
195                                                                                                 #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
196                                                                                                     0xff000000,\r
197                                                                                                     0x00ff0000,\r
198                                                                                                     0x0000ff00,\r
199                                                                                                 #else\r
200                                                                                                     0x000000ff,\r
201                                                                                                     0x0000ff00,\r
202                                                                                                     0x00ff0000,\r
203                                                                                                 #endif\r
204                                                                                                     0x00000000\r
205                                                                                                 );\r
206         //\83t\83B\83\8b\83^\r
207         int now_vpos = (pict->pts * VPOS_FACTOR);\r
208         if(!main_process(&ci->data,surf,now_vpos)){\r
209                 fputs("[framehook/process]failed to process.\n",log);\r
210                 fflush(log);\r
211                 exit(1);\r
212         }\r
213         //\83T\81[\83t\83F\83C\83X\8aJ\95ú\r
214         SDL_FreeSurface(surf);\r
215         fflush(log);\r
216 }\r
217 \r
218 /*\r
219  * \95K\97v\82È\8aÖ\90\94\8dÅ\8cã\81B\8fI\82í\82Á\82½\82ç\8cÄ\82Î\82ê\82é\82æ\81I\r
220  * \r
221  */\r
222 \r
223 __declspec(dllexport) void ExtRelease(void *ctx,const toolbox *tbox){\r
224     ContextInfo *ci;\r
225     ci = (ContextInfo *) ctx;\r
226     FILE* log = ci->log;\r
227     fputs("[framehook/close]closing...\n",log);\r
228     if (ctx) {\r
229         closeData(&ci->data);\r
230             fputs("[framehook/close]closed.\n",log);\r
231         fclose(log);\r
232             //\83R\83\93\83e\83L\83X\83g\91S\91Ì\r
233         free(ctx);\r
234     }\r
235     //\83\89\83C\83u\83\89\83\8a\82Ì\8fI\97¹\r
236     close();\r
237 }\r
238 \r