-#include <SDL/SDL_endian.h>\r
-#include <stdio.h>\r
-\r
-#include <stdlib.h>\r
-#include "chat.h"\r
-#include "../mydef.h"\r
-#include "../nicodef.h"\r
-\r
-int initChat(FILE* log,CHAT* chat,const char* file_path,CHAT_SLOT* slot,int video_length){\r
- int i;\r
- int max_no = INTEGER_MIN;\r
- int min_no = INTEGER_MAX;\r
- int max_item;\r
- chat->slot = slot;\r
- FILE* com_f = fopen(file_path,"rb");\r
- if(com_f == NULL){\r
- fputs("[chat/init]failed to open comment file.\n",log);\r
- return FALSE;\r
- }\r
- /*\97v\91f\90\94\82Ì\8eæ\93¾*/\r
- if(fread(&max_item,sizeof(max_item),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read the number of comments.\n",log);\r
- return FALSE;\r
- }\r
- max_item = SDL_SwapLE32(max_item);\r
- fprintf(log,"[chat/init]%d comments.\n",max_item);\r
- chat->max_item = max_item;\r
- //\83A\83C\83e\83\80\94z\97ñ\82Ì\8am\95Û\r
- chat->item = malloc(sizeof(CHAT_ITEM) * max_item);\r
- if(chat->item == NULL){\r
- fputs("[chat/init]failed to malloc for comment.\n",log);\r
- return FALSE;\r
- }\r
- /*\8cÂ\95Ê\97v\91f\82Ì\8f\89\8aú\89»*/\r
- CHAT_ITEM* item;\r
- int no;\r
- int vpos;\r
- int location;\r
- int size;\r
- int color;\r
- int str_length;\r
- Uint16* str;\r
- for(i=0;i<max_item;i++){\r
- item = &chat->item[i];\r
- item->chat = chat;\r
- item->showed = FALSE;\r
- //\83R\83\81\83\93\83g\94Ô\8d\86\r
- if(fread(&no,sizeof(no),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment number.\n",log);\r
- return FALSE;\r
- }\r
- no = SDL_SwapLE32(no);\r
- max_no = MAX(max_no,no);\r
- min_no = MIN(min_no,no);\r
- //vpos\r
- if(fread(&vpos,sizeof(vpos),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment vpos.\n",log);\r
- return FALSE;\r
- }\r
- vpos = SDL_SwapLE32(vpos);\r
- //\95¶\8e\9a\82Ì\8fê\8f\8a\r
- if(fread(&location,sizeof(location),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment location.\n",log);\r
- return FALSE;\r
- }\r
- location = SDL_SwapLE32(location);\r
- //\83T\83C\83Y\r
- if(fread(&size,sizeof(size),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment size.\n",log);\r
- return FALSE;\r
- }\r
- size = SDL_SwapLE32(size);\r
- //\90F\r
- if(fread(&color,sizeof(color),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment color.\n",log);\r
- return FALSE;\r
- }\r
- color = SDL_SwapLE32(color);\r
- //\95¶\8e\9a\90\94\r
- if(fread(&str_length,sizeof(str_length),1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment length.\n",log);\r
- return FALSE;\r
- }\r
- str_length = SDL_SwapLE32(str_length);\r
- //\95¶\8e\9a\97ñ\r
- str = malloc(str_length);\r
- if(str == NULL){\r
- fputs("[chat/init]failed to malloc for comment text.\n",log);\r
- return FALSE;\r
- }\r
- if(fread(str,str_length,1,com_f) <= 0){\r
- fputs("[chat/init]failed to read comment text.\n",log);\r
- return FALSE;\r
- }\r
- //\95Ï\90\94\83Z\83b\83g\r
- item->no = no;\r
- item->vpos = vpos;\r
- item->location = location;\r
- item->size = size;\r
- item->color = color;\r
- item->str = str;\r
- /*\93à\95\94\8f\88\97\9d\82æ\82è*/\r
- if(location != CMD_LOC_DEF){\r
- item->vstart = vpos;\r
- item->vend = vpos + TEXT_SHOW_SEC - TEXT_AHEAD_SEC;\r
- }else{\r
- item->vstart = vpos - TEXT_AHEAD_SEC;\r
- item->vend = item->vstart + TEXT_SHOW_SEC;\r
- }\r
- int fix = item->vend - video_length;\r
- if(fix > 0){\r
- item->vend -= fix;\r
- item->vpos -= fix;\r
- item->vstart -= fix;\r
- fprintf(log,"[chat/fix]comment %d time adjusted.\n",i);\r
- }\r
- /*\93à\95\94\8f\88\97\9d\82æ\82è\81@\82¨\82í\82è*/\r
- }\r
- fclose(com_f);\r
- chat->max_no = max_no;\r
- chat->min_no = min_no;\r
- return TRUE;\r
-}\r
-\r
-void closeChat(CHAT* chat){\r
- int i;\r
- int max_item = chat->max_item;\r
- for(i=0;i<max_item;i++){\r
- free((void*)chat->item[i].str);\r
- }\r
- free(chat->item);\r
-}\r
-\r
-/*\r
- * \83C\83e\83\8c\81[\83^\82ð\83\8a\83Z\83b\83g\82·\82é\81B\r
- */\r
-void resetChatIterator(CHAT* chat){\r
- chat->iterator_index = 0;\r
-}\r
-/*\r
- * \83C\83e\83\8c\81[\83^\82ð\93¾\82é\r
- */\r
-CHAT_ITEM* getChatShowed(CHAT* chat,int now_vpos){\r
- int *i = &chat->iterator_index;\r
- int max_item = chat->max_item;\r
- CHAT_ITEM* item;\r
- for(;*i<max_item;(*i)++){\r
- item = &chat->item[*i];\r
- if(now_vpos >= item->vstart && now_vpos <= item->vend && !item->showed){\r
- return item;\r
- }\r
- }\r
- return NULL;\r
-}\r
+#include <SDL/SDL_endian.h>
+#include <stdio.h>
+
+#include <stdlib.h>
+#include "chat.h"
+#include "../mydef.h"
+#include "../nicodef.h"
+
+int initChat(FILE* log,CHAT* chat,const char* file_path,CHAT_SLOT* slot,int video_length){
+ int i;
+ int max_no = INTEGER_MIN;
+ int min_no = INTEGER_MAX;
+ int max_item;
+ chat->slot = slot;
+ FILE* com_f = fopen(file_path,"rb");
+ if(com_f == NULL){
+ fputs("[chat/init]failed to open comment file.\n",log);
+ return FALSE;
+ }
+ /*要素数の取得*/
+ if(fread(&max_item,sizeof(max_item),1,com_f) <= 0){
+ fputs("[chat/init]failed to read the number of comments.\n",log);
+ return FALSE;
+ }
+ max_item = SDL_SwapLE32(max_item);
+ fprintf(log,"[chat/init]%d comments.\n",max_item);
+ chat->max_item = max_item;
+ //アイテム配列の確保
+ chat->item = malloc(sizeof(CHAT_ITEM) * max_item);
+ if(chat->item == NULL){
+ fputs("[chat/init]failed to malloc for comment.\n",log);
+ return FALSE;
+ }
+ /*個別要素の初期化*/
+ CHAT_ITEM* item;
+ int no;
+ int vpos;
+ int location;
+ int size;
+ int color;
+ int str_length;
+ Uint16* str;
+ for(i=0;i<max_item;i++){
+ item = &chat->item[i];
+ item->chat = chat;
+ item->showed = FALSE;
+ //コメント番号
+ if(fread(&no,sizeof(no),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment number.\n",log);
+ return FALSE;
+ }
+ no = SDL_SwapLE32(no);
+ max_no = MAX(max_no,no);
+ min_no = MIN(min_no,no);
+ //vpos
+ if(fread(&vpos,sizeof(vpos),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment vpos.\n",log);
+ return FALSE;
+ }
+ vpos = SDL_SwapLE32(vpos);
+ //文字の場所
+ if(fread(&location,sizeof(location),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment location.\n",log);
+ return FALSE;
+ }
+ location = SDL_SwapLE32(location);
+ //サイズ
+ if(fread(&size,sizeof(size),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment size.\n",log);
+ return FALSE;
+ }
+ size = SDL_SwapLE32(size);
+ //色
+ if(fread(&color,sizeof(color),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment color.\n",log);
+ return FALSE;
+ }
+ color = SDL_SwapLE32(color);
+ //文字数
+ if(fread(&str_length,sizeof(str_length),1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment length.\n",log);
+ return FALSE;
+ }
+ str_length = SDL_SwapLE32(str_length);
+ //文字列
+ str = malloc(str_length);
+ if(str == NULL){
+ fputs("[chat/init]failed to malloc for comment text.\n",log);
+ return FALSE;
+ }
+ if(fread(str,str_length,1,com_f) <= 0){
+ fputs("[chat/init]failed to read comment text.\n",log);
+ return FALSE;
+ }
+ //変数セット
+ item->no = no;
+ item->vpos = vpos;
+ item->location = location;
+ item->size = size;
+ item->color = color;
+ item->str = str;
+ /*内部処理より*/
+ if(location != CMD_LOC_DEF){
+ item->vstart = vpos;
+ item->vend = vpos + TEXT_SHOW_SEC - TEXT_AHEAD_SEC;
+ }else{
+ item->vstart = vpos - TEXT_AHEAD_SEC;
+ item->vend = item->vstart + TEXT_SHOW_SEC;
+ }
+ int fix = item->vend - video_length;
+ if(fix > 0){
+ item->vend -= fix;
+ item->vpos -= fix;
+ item->vstart -= fix;
+ fprintf(log,"[chat/fix]comment %d time adjusted.\n",i);
+ }
+ /*内部処理より おわり*/
+ }
+ fclose(com_f);
+ chat->max_no = max_no;
+ chat->min_no = min_no;
+ return TRUE;
+}
+
+void closeChat(CHAT* chat){
+ int i;
+ int max_item = chat->max_item;
+ for(i=0;i<max_item;i++){
+ free((void*)chat->item[i].str);
+ }
+ free(chat->item);
+}
+
+/*
+ * イテレータをリセットする。
+ */
+void resetChatIterator(CHAT* chat){
+ chat->iterator_index = 0;
+}
+/*
+ * イテレータを得る
+ */
+CHAT_ITEM* getChatShowed(CHAT* chat,int now_vpos){
+ int *i = &chat->iterator_index;
+ int max_item = chat->max_item;
+ CHAT_ITEM* item;
+ for(;*i<max_item;(*i)++){
+ item = &chat->item[*i];
+ if(now_vpos >= item->vstart && now_vpos <= item->vend && !item->showed){
+ return item;
+ }
+ }
+ return NULL;
+}
-#ifndef CHAT_H_\r
-#define CHAT_H_\r
-\r
-#include <SDL/SDL.h>\r
-#include "../struct_define.h"\r
-\r
-struct CHAT_ITEM{\r
- //\8fê\8f\8a\82Ì\93Á\92è\r
- int no;\r
- int vpos;\r
- int location;\r
- //\95¶\8e\9a\82Ì\8fC\8fü\r
- int size;\r
- int color;\r
- Uint16* str;\r
- //\93à\95\94\8f\88\97\9d\82Å\8eg\82¤\r
- int vstart;\r
- int vend;\r
- int showed;\r
- //\83\8a\83t\83@\83\8c\83\93\83X\r
- CHAT* chat;\r
-};\r
-\r
-struct CHAT{\r
- int max_no;\r
- int min_no;\r
- //\83A\83C\83e\83\80\r
- int max_item;\r
- int iterator_index;\r
- CHAT_ITEM* item;\r
- //\83\8a\83t\83@\83\8c\83\93\83X\r
- CHAT_SLOT* slot;\r
-};\r
-\r
-#include "chat_slot.h"\r
-struct CHAT_SET{\r
- CHAT chat;\r
- CHAT_SLOT slot;\r
-};\r
-\r
-//\8f\89\8aú\89»\r
-int initChat(FILE* log,CHAT* chat,const char* file_path,CHAT_SLOT* slot,int video_length);\r
-void closeChat();\r
-//\83C\83e\83\8c\81[\83^\r
-void resetChatIterator(CHAT* chat);\r
-CHAT_ITEM* getChatShowed(CHAT* chat,int now_vpos);\r
-\r
-#endif /*CHAT_H_*/\r
+#ifndef CHAT_H_
+#define CHAT_H_
+
+#include <SDL/SDL.h>
+#include "../struct_define.h"
+
+struct CHAT_ITEM{
+ //場所の特定
+ int no;
+ int vpos;
+ int location;
+ //文字の修飾
+ int size;
+ int color;
+ Uint16* str;
+ //内部処理で使う
+ int vstart;
+ int vend;
+ int showed;
+ //リファレンス
+ CHAT* chat;
+};
+
+struct CHAT{
+ int max_no;
+ int min_no;
+ //アイテム
+ int max_item;
+ int iterator_index;
+ CHAT_ITEM* item;
+ //リファレンス
+ CHAT_SLOT* slot;
+};
+
+#include "chat_slot.h"
+struct CHAT_SET{
+ CHAT chat;
+ CHAT_SLOT slot;
+};
+
+//初期化
+int initChat(FILE* log,CHAT* chat,const char* file_path,CHAT_SLOT* slot,int video_length);
+void closeChat();
+//イテレータ
+void resetChatIterator(CHAT* chat);
+CHAT_ITEM* getChatShowed(CHAT* chat,int now_vpos);
+
+#endif /*CHAT_H_*/
-#include "chat.h"\r
-#include "chat_slot.h"\r
-#include "process_chat.h"\r
-#include "../mydef.h"\r
-#include "../comment/com_surface.h"\r
-#include "../nicodef.h"\r
-#include "../util.h"\r
-#include <SDL/SDL.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-\r
-int initChatSlot(FILE* log,CHAT_SLOT* slot,int max_slot,CHAT* chat){\r
- slot->max_item=max_slot;\r
- slot->chat = chat;\r
- slot->item = malloc(sizeof(CHAT_SLOT_ITEM) * max_slot);\r
- if(slot->item == NULL){\r
- fputs("failed to malloc for comment slot.\n",log);\r
- return FALSE;\r
- }\r
- int i;\r
- CHAT_SLOT_ITEM* item;\r
- for(i=0;i<max_slot;i++){\r
- item = &slot->item[i];\r
- item->used = FALSE;\r
- item->slot = slot;\r
- item->surf=NULL;\r
- }\r
- return TRUE;\r
-}\r
-void closeChatSlot(CHAT_SLOT* slot){\r
- int i;\r
- CHAT_SLOT_ITEM* item;\r
- for(i=0;i<slot->max_item;i++){\r
- item = &slot->item[i];\r
- SDL_FreeSurface(item->surf);\r
- }\r
- //\83A\83C\83e\83\80\82ð\8fÁ\8b\8e\81B\r
- free(slot->item);\r
-}\r
-\r
-void deleteChatSlot(CHAT_SLOT* slot,CHAT_SLOT_ITEM* item){\r
- item->chat_item=NULL;\r
- SDL_FreeSurface(item->surf);\r
- item->surf = NULL;\r
- item->used = FALSE;\r
-}\r
-\r
-void deleteChatSlotFromIndex(CHAT_SLOT* slot,int index){\r
- CHAT_SLOT_ITEM* item = &slot->item[index];\r
- deleteChatSlot(slot,item);\r
-}\r
-\r
-/*\r
- * \83X\83\8d\83b\83g\82É\92Ç\89Á\82·\82é\81B\r
- */\r
-void addChatSlot(COMMDATA* data,CHAT_SLOT* slot,CHAT_ITEM* item,int video_width,int video_height){\r
- //\82à\82¤\8c©\82¹\82ç\82ê\82½\81B\r
- item->showed = TRUE;\r
- if(slot->max_item <= 0){\r
- return;\r
- }\r
- SDL_Surface* surf = makeCommentSurface(data,item,video_width,video_height);\r
- /*\8aJ\82«\83X\83\8d\83b\83g\83\8b\8c\9f\8dõ*/\r
- int i;\r
- int cnt = -1;\r
- int slot_max = slot->max_item;\r
- for(i=0;i<slot_max;i++){\r
- if(!slot->item[i].used){\r
- cnt = i;\r
- break;\r
- }\r
- if(cnt < 0 || slot->item[cnt].chat_item->vend > slot->item[i].chat_item->vend){\r
- cnt = i;\r
- }\r
- }\r
- CHAT_SLOT_ITEM* slot_item = &slot->item[cnt];\r
- /*\8bó\82«\82ª\96³\82¯\82ê\82Î\8b\90§\93I\82É\8dì\82é\81B*/\r
- if(slot_item->used){\r
- deleteChatSlotFromIndex(slot,cnt);\r
- }\r
- //\82±\82Ì\8e\9e\93_\82Å\92Ç\89Á\r
- slot_item->chat_item = item;\r
- slot_item->surf = surf;\r
- /*\83\8d\83P\81[\83V\83\87\83\93\82Å\95ª\8aò*/\r
- int y;\r
- if(item->location == CMD_LOC_BOTTOM){\r
- y = video_height - surf->h;\r
- }else{\r
- y = 0;\r
- }\r
- int running;\r
- do{\r
- running = FALSE;\r
- for(i=0;i<slot_max;i++){\r
- CHAT_SLOT_ITEM* other_slot = &slot->item[i];\r
- if(!other_slot->used){\r
- continue;\r
- }\r
- const CHAT_ITEM* other_item = other_slot->chat_item;\r
- int other_y = other_slot->y;\r
- /*\96³\8e\8b\82·\82é\8fð\8c\8f*/\r
- if(other_y + other_slot->surf->h <= y){\r
- continue;\r
- }\r
- if(y + surf->h <= other_y){\r
- continue;\r
- }\r
- if(other_item->location != item->location){\r
- continue;\r
- }\r
- int start = MAX(other_item->vstart,item->vstart);\r
- int end = MIN(other_item->vend,item->vend);\r
- int obj_x_t1 = getX(start,slot_item,video_width);\r
- int obj_x_t2 = getX(end,slot_item,video_width);\r
- int o_x_t1 = getX(start,other_slot,video_width);\r
- int o_x_t2 = getX(end,other_slot,video_width);\r
- //\93\96\82½\82è\94»\92è\r
- if ((obj_x_t1 <= o_x_t1 + other_slot->surf->w && o_x_t1 <= obj_x_t1 + surf->w)\r
- || (obj_x_t2 <= o_x_t2 + other_slot->surf->w && o_x_t2 <= obj_x_t2 + surf->w)){\r
- if(item->location == CMD_LOC_BOTTOM){\r
- y = other_y - surf->h - 1;\r
- }else{\r
- y = other_y + other_slot->surf->h + 1;\r
- }\r
- running = TRUE;\r
- break;\r
- }\r
- }\r
- }while(running);\r
- /*\82»\82à\82»\82à\89æ\96Ê\93à\82É\96³\82¯\82ê\82Î\96³\88Ó\96¡\81B*/\r
- if(y < 0 || y+surf->h > video_height){//\94Í\88Í\82ð\92´\82¦\82Ä\82é\82Ì\82Å\81A\83\89\83\93\83_\83\80\82É\94z\92u\81B\r
- y = ((rnd() & 0xffff) * (video_height - surf->h)) / 0xffff;\r
- }\r
- //\92Ç\89Á\r
- slot_item->used = TRUE;\r
- slot_item->y = y;\r
-}\r
-/*\r
- * \83C\83e\83\8c\81[\83^\82ð\83\8a\83Z\83b\83g\82·\82é\81B\r
- */\r
-void resetChatSlotIterator(CHAT_SLOT* slot){\r
- slot->iterator_index = 0;\r
-}\r
-/*\r
- * \83C\83e\83\8c\81[\83^\82ð\93¾\82é\r
- */\r
-CHAT_SLOT_ITEM* getChatSlotErased(CHAT_SLOT* slot,int now_vpos){\r
- int *i = &slot->iterator_index;\r
- int max_item = slot->max_item;\r
- CHAT_ITEM* item;\r
- CHAT_SLOT_ITEM* slot_item;\r
- for(;*i<max_item;(*i)++){\r
- slot_item = &slot->item[*i];\r
- if(!slot_item->used){\r
- continue;\r
- }\r
- item = slot_item->chat_item;\r
- if(item==NULL)continue;\r
- if(now_vpos < item->vstart || now_vpos > item->vend){\r
- return slot_item;\r
- }\r
- }\r
- return NULL;\r
-}\r
+#include "chat.h"
+#include "chat_slot.h"
+#include "process_chat.h"
+#include "../mydef.h"
+#include "../comment/com_surface.h"
+#include "../nicodef.h"
+#include "../util.h"
+#include <SDL/SDL.h>
+#include <stdio.h>
+#include <string.h>
+
+int initChatSlot(FILE* log,CHAT_SLOT* slot,int max_slot,CHAT* chat){
+ slot->max_item=max_slot;
+ slot->chat = chat;
+ slot->item = malloc(sizeof(CHAT_SLOT_ITEM) * max_slot);
+ if(slot->item == NULL){
+ fputs("failed to malloc for comment slot.\n",log);
+ return FALSE;
+ }
+ int i;
+ CHAT_SLOT_ITEM* item;
+ for(i=0;i<max_slot;i++){
+ item = &slot->item[i];
+ item->used = FALSE;
+ item->slot = slot;
+ item->surf=NULL;
+ }
+ return TRUE;
+}
+void closeChatSlot(CHAT_SLOT* slot){
+ int i;
+ CHAT_SLOT_ITEM* item;
+ for(i=0;i<slot->max_item;i++){
+ item = &slot->item[i];
+ SDL_FreeSurface(item->surf);
+ }
+ //アイテムを消去。
+ free(slot->item);
+}
+
+void deleteChatSlot(CHAT_SLOT* slot,CHAT_SLOT_ITEM* item){
+ item->chat_item=NULL;
+ SDL_FreeSurface(item->surf);
+ item->surf = NULL;
+ item->used = FALSE;
+}
+
+void deleteChatSlotFromIndex(CHAT_SLOT* slot,int index){
+ CHAT_SLOT_ITEM* item = &slot->item[index];
+ deleteChatSlot(slot,item);
+}
+
+/*
+ * スロットに追加する。
+ */
+void addChatSlot(COMMDATA* data,CHAT_SLOT* slot,CHAT_ITEM* item,int video_width,int video_height){
+ //もう見せられた。
+ item->showed = TRUE;
+ if(slot->max_item <= 0){
+ return;
+ }
+ SDL_Surface* surf = makeCommentSurface(data,item,video_width,video_height);
+ /*開きスロットル検索*/
+ int i;
+ int cnt = -1;
+ int slot_max = slot->max_item;
+ for(i=0;i<slot_max;i++){
+ if(!slot->item[i].used){
+ cnt = i;
+ break;
+ }
+ if(cnt < 0 || slot->item[cnt].chat_item->vend > slot->item[i].chat_item->vend){
+ cnt = i;
+ }
+ }
+ CHAT_SLOT_ITEM* slot_item = &slot->item[cnt];
+ /*空きが無ければ強制的に作る。*/
+ if(slot_item->used){
+ deleteChatSlotFromIndex(slot,cnt);
+ }
+ //この時点で追加
+ slot_item->chat_item = item;
+ slot_item->surf = surf;
+ /*ロケーションで分岐*/
+ int y;
+ if(item->location == CMD_LOC_BOTTOM){
+ y = video_height - surf->h;
+ }else{
+ y = 0;
+ }
+ int running;
+ do{
+ running = FALSE;
+ for(i=0;i<slot_max;i++){
+ CHAT_SLOT_ITEM* other_slot = &slot->item[i];
+ if(!other_slot->used){
+ continue;
+ }
+ const CHAT_ITEM* other_item = other_slot->chat_item;
+ int other_y = other_slot->y;
+ /*無視する条件*/
+ if(other_y + other_slot->surf->h <= y){
+ continue;
+ }
+ if(y + surf->h <= other_y){
+ continue;
+ }
+ if(other_item->location != item->location){
+ continue;
+ }
+ int start = MAX(other_item->vstart,item->vstart);
+ int end = MIN(other_item->vend,item->vend);
+ int obj_x_t1 = getX(start,slot_item,video_width);
+ int obj_x_t2 = getX(end,slot_item,video_width);
+ int o_x_t1 = getX(start,other_slot,video_width);
+ int o_x_t2 = getX(end,other_slot,video_width);
+ //当たり判定
+ if ((obj_x_t1 <= o_x_t1 + other_slot->surf->w && o_x_t1 <= obj_x_t1 + surf->w)
+ || (obj_x_t2 <= o_x_t2 + other_slot->surf->w && o_x_t2 <= obj_x_t2 + surf->w)){
+ if(item->location == CMD_LOC_BOTTOM){
+ y = other_y - surf->h - 1;
+ }else{
+ y = other_y + other_slot->surf->h + 1;
+ }
+ running = TRUE;
+ break;
+ }
+ }
+ }while(running);
+ /*そもそも画面内に無ければ無意味。*/
+ if(y < 0 || y+surf->h > video_height){//範囲を超えてるので、ランダムに配置。
+ y = ((rnd() & 0xffff) * (video_height - surf->h)) / 0xffff;
+ }
+ //追加
+ slot_item->used = TRUE;
+ slot_item->y = y;
+}
+/*
+ * イテレータをリセットする。
+ */
+void resetChatSlotIterator(CHAT_SLOT* slot){
+ slot->iterator_index = 0;
+}
+/*
+ * イテレータを得る
+ */
+CHAT_SLOT_ITEM* getChatSlotErased(CHAT_SLOT* slot,int now_vpos){
+ int *i = &slot->iterator_index;
+ int max_item = slot->max_item;
+ CHAT_ITEM* item;
+ CHAT_SLOT_ITEM* slot_item;
+ for(;*i<max_item;(*i)++){
+ slot_item = &slot->item[*i];
+ if(!slot_item->used){
+ continue;
+ }
+ item = slot_item->chat_item;
+ if(item==NULL)continue;
+ if(now_vpos < item->vstart || now_vpos > item->vend){
+ return slot_item;
+ }
+ }
+ return NULL;
+}
-#ifndef CHAT_SLOT_H_\r
-#define CHAT_SLOT_H_\r
-\r
-#include "../struct_define.h"\r
-#include "chat.h"\r
-#include <SDL/SDL.h>\r
-\r
-struct CHAT_SLOT_ITEM{\r
- int used;\r
- CHAT_ITEM* chat_item;\r
- SDL_Surface* surf;\r
- int y;\r
- //\83\8a\83t\83@\83\8c\83\93\83X\r
- CHAT_SLOT* slot;\r
-};\r
-\r
-struct CHAT_SLOT{\r
- int max_item;\r
- int iterator_index;\r
- CHAT_SLOT_ITEM* item;\r
- //\83\8a\83t\83@\83\8c\83\93\83X\r
- CHAT* chat;\r
-};\r
-#include "../main.h"\r
-//\8f\89\8aú\89»\r
-int initChatSlot(FILE* log,CHAT_SLOT* slot,int max_slot,CHAT* chat);\r
-void closeChatSlot(CHAT_SLOT* slot);\r
-//\92Ç\89Á\81A\8dí\8f\9c\r
-void addChatSlot(COMMDATA* data,CHAT_SLOT* slot,CHAT_ITEM* item,int video_width,int video_height);\r
-void deleteChatSlot(CHAT_SLOT* slot,CHAT_SLOT_ITEM* item);\r
-void deleteChatSlotFromIndex(CHAT_SLOT* slot,int index);\r
-\r
-//\83C\83e\83\8c\81[\83^\r
-void resetChatSlotIterator(CHAT_SLOT* slot);\r
-CHAT_SLOT_ITEM* getChatSlotErased(CHAT_SLOT* slot,int now_vpos);\r
-#endif /*CHAT_SLOT_H_*/\r
+#ifndef CHAT_SLOT_H_
+#define CHAT_SLOT_H_
+
+#include "../struct_define.h"
+#include "chat.h"
+#include <SDL/SDL.h>
+
+struct CHAT_SLOT_ITEM{
+ int used;
+ CHAT_ITEM* chat_item;
+ SDL_Surface* surf;
+ int y;
+ //リファレンス
+ CHAT_SLOT* slot;
+};
+
+struct CHAT_SLOT{
+ int max_item;
+ int iterator_index;
+ CHAT_SLOT_ITEM* item;
+ //リファレンス
+ CHAT* chat;
+};
+#include "../main.h"
+//初期化
+int initChatSlot(FILE* log,CHAT_SLOT* slot,int max_slot,CHAT* chat);
+void closeChatSlot(CHAT_SLOT* slot);
+//追加、削除
+void addChatSlot(COMMDATA* data,CHAT_SLOT* slot,CHAT_ITEM* item,int video_width,int video_height);
+void deleteChatSlot(CHAT_SLOT* slot,CHAT_SLOT_ITEM* item);
+void deleteChatSlotFromIndex(CHAT_SLOT* slot,int index);
+
+//イテレータ
+void resetChatSlotIterator(CHAT_SLOT* slot);
+CHAT_SLOT_ITEM* getChatSlotErased(CHAT_SLOT* slot,int now_vpos);
+#endif /*CHAT_SLOT_H_*/
-#include <SDL/SDL.h>\r
-#include "chat.h"\r
-#include "chat_slot.h"\r
-#include "process_chat.h"\r
-#include "../main.h"\r
-#include "../mydef.h"\r
-\r
-//\82±\82Ì\83\\81[\83X\93à\82Å\82µ\82©\8eg\82í\82È\82¢\83\81\83\\83b\83h\r
-void drawComment(SDL_Surface* surf,CHAT_SLOT* slot,int now_vpos);\r
-\r
-/**\r
- * \83R\83\81\83\93\83g\82ð\95`\89æ\82·\82é\81B\r
- */\r
-int chat_process(COMMDATA* data,SDL_Surface* surf,const int now_vpos){\r
- CHAT* chat = &data->chat;\r
- CHAT_SLOT* slot = &data->slot;\r
- FILE* log = data->common->log;\r
- /*\8c©\82¹\82È\82¢\82à\82Ì\82ð\8dí\8f\9c*/\r
- CHAT_SLOT_ITEM* slot_item;\r
- CHAT_ITEM* chat_item;\r
- resetChatSlotIterator(slot);\r
- while((slot_item = getChatSlotErased(slot,now_vpos)) != NULL){\r
- chat_item = slot_item->chat_item;\r
- fprintf(log,"[process-chat/process]<vpos:%6d>com%4d<color:%2d loc:%2d size:%2d %6d-%6d(%6d)> erased. \n",now_vpos,chat_item->no,chat_item->color,chat_item->location,chat_item->size,chat_item->vstart,chat_item->vend,chat_item->vpos);\r
- fflush(log);\r
- deleteChatSlot(slot,slot_item);\r
- }\r
- /*\8c©\82¹\82é\82à\82Ì\82ð\83Z\83b\83g*/\r
- resetChatIterator(chat);\r
- while((chat_item = getChatShowed(chat,now_vpos)) != NULL){\r
- fprintf(log,"[process-chat/process]<vpos:%6d>com%4d<color:%2d loc:%2d size:%2d %6d-%6d(%6d)> added. \n",now_vpos,chat_item->no,chat_item->color,chat_item->location,chat_item->size,chat_item->vstart,chat_item->vend,chat_item->vpos);\r
- fflush(log);\r
- addChatSlot(data,slot,chat_item,surf->w,surf->h);\r
- }\r
- drawComment(surf,slot,now_vpos);\r
- return TRUE;\r
-}\r
-\r
-/*\r
- * \83\8c\83C\83\84\8f\87\82É\82»\82Á\82Ä\95`\89æ\82·\82é\r
- */\r
-\r
-void drawComment(SDL_Surface* surf,CHAT_SLOT* slot,int now_vpos){\r
- int i;\r
- SDL_Rect rect;\r
- int max_item = slot->max_item;\r
- CHAT_SLOT_ITEM* item;\r
- for(i=0;i<max_item;i++){\r
- item = &slot->item[i];\r
- if(item->used){\r
- rect.x = getX(now_vpos,item,surf->w);\r
- rect.y = item->y;\r
- SDL_BlitSurface(item->surf,NULL,surf,&rect);\r
- }\r
- }\r
-}\r
-\r
-/*\r
- * \88Ê\92u\82ð\8b\81\82ß\82é\r
- */\r
-int getX(int now_vpos,const CHAT_SLOT_ITEM* item,int video_width){\r
- int text_width = item->surf->w;\r
- int width = video_width;\r
- if(item->chat_item->location != CMD_LOC_DEF){\r
- return (width - text_width) >>1;\r
- }else{\r
- int tmp = now_vpos - item->chat_item->vpos + TEXT_AHEAD_SEC;\r
- return width - ((tmp * (width + text_width)) / TEXT_SHOW_SEC);\r
- }\r
- return -1;\r
-}\r
+#include <SDL/SDL.h>
+#include "chat.h"
+#include "chat_slot.h"
+#include "process_chat.h"
+#include "../main.h"
+#include "../mydef.h"
+
+//このソース内でしか使わないメソッド
+void drawComment(SDL_Surface* surf,CHAT_SLOT* slot,int now_vpos);
+
+/**
+ * コメントを描画する。
+ */
+int chat_process(COMMDATA* data,SDL_Surface* surf,const int now_vpos){
+ CHAT* chat = &data->chat;
+ CHAT_SLOT* slot = &data->slot;
+ FILE* log = data->common->log;
+ /*見せないものを削除*/
+ CHAT_SLOT_ITEM* slot_item;
+ CHAT_ITEM* chat_item;
+ resetChatSlotIterator(slot);
+ while((slot_item = getChatSlotErased(slot,now_vpos)) != NULL){
+ chat_item = slot_item->chat_item;
+ fprintf(log,"[process-chat/process]<vpos:%6d>com%4d<color:%2d loc:%2d size:%2d %6d-%6d(%6d)> erased. \n",now_vpos,chat_item->no,chat_item->color,chat_item->location,chat_item->size,chat_item->vstart,chat_item->vend,chat_item->vpos);
+ fflush(log);
+ deleteChatSlot(slot,slot_item);
+ }
+ /*見せるものをセット*/
+ resetChatIterator(chat);
+ while((chat_item = getChatShowed(chat,now_vpos)) != NULL){
+ fprintf(log,"[process-chat/process]<vpos:%6d>com%4d<color:%2d loc:%2d size:%2d %6d-%6d(%6d)> added. \n",now_vpos,chat_item->no,chat_item->color,chat_item->location,chat_item->size,chat_item->vstart,chat_item->vend,chat_item->vpos);
+ fflush(log);
+ addChatSlot(data,slot,chat_item,surf->w,surf->h);
+ }
+ drawComment(surf,slot,now_vpos);
+ return TRUE;
+}
+
+/*
+ * レイヤ順にそって描画する
+ */
+
+void drawComment(SDL_Surface* surf,CHAT_SLOT* slot,int now_vpos){
+ int i;
+ SDL_Rect rect;
+ int max_item = slot->max_item;
+ CHAT_SLOT_ITEM* item;
+ for(i=0;i<max_item;i++){
+ item = &slot->item[i];
+ if(item->used){
+ rect.x = getX(now_vpos,item,surf->w);
+ rect.y = item->y;
+ SDL_BlitSurface(item->surf,NULL,surf,&rect);
+ }
+ }
+}
+
+/*
+ * 位置を求める
+ */
+int getX(int now_vpos,const CHAT_SLOT_ITEM* item,int video_width){
+ int text_width = item->surf->w;
+ int width = video_width;
+ if(item->chat_item->location != CMD_LOC_DEF){
+ return (width - text_width) >>1;
+ }else{
+ int tmp = now_vpos - item->chat_item->vpos + TEXT_AHEAD_SEC;
+ return width - ((tmp * (width + text_width)) / TEXT_SHOW_SEC);
+ }
+ return -1;
+}
-#ifndef PROCESS_CHAT_H_\r
-#define PROCESS_CHAT_H_\r
-#include <SDL/SDL.h>\r
-#include "chat.h"\r
-#include "chat_slot.h"\r
-#include "../main.h"\r
-int chat_process(COMMDATA* data,SDL_Surface* surf,const int now_vpos);\r
-int getX(int now_vpos,const CHAT_SLOT_ITEM* item,int video_width);\r
-\r
-#endif /*PROCESS_CHAT_H_*/\r
+#ifndef PROCESS_CHAT_H_
+#define PROCESS_CHAT_H_
+#include <SDL/SDL.h>
+#include "chat.h"
+#include "chat_slot.h"
+#include "../main.h"
+int chat_process(COMMDATA* data,SDL_Surface* surf,const int now_vpos);
+int getX(int now_vpos,const CHAT_SLOT_ITEM* item,int video_width);
+
+#endif /*PROCESS_CHAT_H_*/
-#include <SDL/SDL.h>\r
-#include <SDL/SDL_ttf.h>\r
-#include <SDL/SDL_rotozoom.h>\r
-#include "com_surface.h"\r
-#include "surf_util.h"\r
-#include "../chat/chat.h"\r
-#include "../chat/chat_slot.h"\r
-#include "../nicodef.h"\r
-#include "../mydef.h"\r
-#include "../main.h"\r
-#include "shadow.h"\r
-\r
-\r
-SDL_Surface* drawText(COMMDATA* data,int size,int color,Uint16* str);\r
-\r
-SDL_Surface* makeCommentSurface(COMMDATA* data,const CHAT_ITEM* item,int video_width,int video_height){\r
- Uint16* index = item->str;\r
- Uint16* last = item->str;\r
- SDL_Surface* ret = NULL;\r
- int color = item->color;\r
- int size = item->size;\r
-\r
- /*\r
- * \89e\82Í\92u\82¢\82Ä\82¨\82¢\82Ä\81A\82Æ\82è\82 \82¦\82¸\95¶\8e\9a\82Ì\95`\89æ\r
- */\r
- while(*index != '\0'){\r
- if(*index == '\n'){\r
- *index = '\0';//\82±\82±\82Å\88ê\92U\90Ø\82é\r
- if(ret == null){//\8c\8b\8bÇ\89ü\8ds\82Í\96³\82¢\r
- ret = drawText(data,size,color,last);\r
- }else{/*\89ü\8ds\82 \82è*/\r
- ret = connectSurface(ret,drawText(data,size,color,last));\r
- }\r
- *index = '\n';//\82±\82±\82Å\88ê\92U\90Ø\82é\r
- last = index+1;\r
- }\r
- index++;\r
- }\r
- if(ret == null){//\8c\8b\8bÇ\89ü\8ds\82Í\96³\82¢\r
- ret = drawText(data,size,color,item->str);\r
- }else{/*\89ü\8ds\82 \82è*/\r
- ret = connectSurface(ret,drawText(data,size,color,last));\r
- }\r
- \r
- if(ret->w == 0 || ret->h == 0){\r
- fprintf(data->common->log,"[comsurface/make]comment %04d has no char.\n",item->no);\r
- fflush(data->common->log);\r
- return ret;\r
- }\r
- \r
- /*\r
- * \89e\8f\88\97\9d\r
- */\r
- int shadow = data->common->shadow_kind;\r
- if(shadow >= SHADOW_MAX){\r
- shadow = SHADOW_DEFAULT;\r
- }\r
- ret = (*ShadowFunc[shadow])(ret,item->color == CMD_COLOR_BLACK,data->common->fontsize_fix);\r
-\r
- /*\r
- * \83A\83\8b\83t\83@\92l\82Ì\90Ý\92è\r
- */\r
- if(!data->opaque_comment){\r
- float alpha_t = (((float)(item->no)/(item->chat->max_no)) * 0.4) + 0.6;\r
- fprintf(data->common->log,"[comsurface/make]comment %04d set alpha:%5.2f%%.\n",item->no,alpha_t*100);\r
- setAlpha(ret,alpha_t);\r
- }\r
-\r
- /*\r
- * \83X\83P\81[\83\8b\90Ý\92è\r
- */\r
-\r
- double zoomx = 1.0f;\r
- //double zoomy = 1.0f;\r
- //\8fk\8f¬\r
- \r
- if(data->common->fontsize_fix){\r
- zoomx = (0.5f * (double)video_width) / (double)NICO_WIDTH;\r
- //zoomy = (0.5f * (double)video_height) / (double)NICO_HEIGHT;\r
- }\r
-\r
- /*\83X\83P\81[\83\8b\82Ì\92²\90®*/\r
- //if(((double)ret->h * zoomy) > ((double)video_height/3.0f)){\r
- if(((double)ret->h * zoomx) > ((double)video_height/3.0f)){\r
- zoomx *= 0.5f;\r
- //zoomy *= 0.5f;\r
- }\r
- if(item->location != CMD_LOC_DEF && (ret->w * zoomx) > (double)video_width){\r
- double scale = ((double)video_width) / (ret->w * zoomx);\r
- zoomx *= scale;\r
- //zoomy *= scale;\r
- }\r
- //\89æ\96Ê\83T\83C\83Y\82É\8d\87\82í\82¹\82Ä\95Ï\8dX\r
- //if(zoomx != 1.0f || zoomy != 1.0f){\r
- if(zoomx != 1.0f){\r
- //fprintf(data->log,"[comsurface/make]comment %04d resized.(%5.2f%%,%5.2f%%)\n",item->no,zoomx*100,zoomy*100);\r
- fprintf(data->common->log,"[comsurface/make]comment %04d resized.(%5.2f%%)\n",item->no,zoomx*100);\r
- fflush(data->common->log);\r
- SDL_Surface* tmp = ret;\r
- ret = zoomSurface(tmp,zoomx,zoomx,SMOOTHING_ON);\r
- SDL_FreeSurface(tmp);\r
- }\r
-\r
- return ret;\r
-}\r
-/**\r
- * \95¶\8e\9a\82ð\95`\89æ\r
- */\r
-\r
-SDL_Surface* drawText(COMMDATA* data,int size,int color,Uint16* str){\r
- if(str[0] == '\0'){\r
- return SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- 0,COMMENT_FONT_SIZE[size],32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- }\r
- /*\r
- SDL_Surface* fmt = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- 0,\r
- 0,\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
-\r
- SDL_Surface* tmp = TTF_RenderUNICODE_Blended(data->font[size],str,COMMENT_COLOR[color]);\r
- SDL_SetAlpha(tmp,SDL_SRCALPHA | SDL_RLEACCEL,0xff);\r
- SDL_Surface* surf = SDL_ConvertSurface(tmp,fmt->format,SDL_SRCALPHA | SDL_HWSURFACE);\r
- SDL_FreeSurface(tmp);\r
- SDL_FreeSurface(fmt);\r
- */\r
- SDL_Surface* surf = TTF_RenderUNICODE_Blended(data->common->font[size],str,COMMENT_COLOR[color]);\r
- return surf;\r
-}\r
+#include <SDL/SDL.h>
+#include <SDL/SDL_ttf.h>
+#include <SDL/SDL_rotozoom.h>
+#include "com_surface.h"
+#include "surf_util.h"
+#include "../chat/chat.h"
+#include "../chat/chat_slot.h"
+#include "../nicodef.h"
+#include "../mydef.h"
+#include "../main.h"
+#include "shadow.h"
+
+
+SDL_Surface* drawText(COMMDATA* data,int size,int color,Uint16* str);
+
+SDL_Surface* makeCommentSurface(COMMDATA* data,const CHAT_ITEM* item,int video_width,int video_height){
+ Uint16* index = item->str;
+ Uint16* last = item->str;
+ SDL_Surface* ret = NULL;
+ int color = item->color;
+ int size = item->size;
+
+ /*
+ * 影は置いておいて、とりあえず文字の描画
+ */
+ while(*index != '\0'){
+ if(*index == '\n'){
+ *index = '\0';//ここで一旦切る
+ if(ret == null){//結局改行は無い
+ ret = drawText(data,size,color,last);
+ }else{/*改行あり*/
+ ret = connectSurface(ret,drawText(data,size,color,last));
+ }
+ *index = '\n';//ここで一旦切る
+ last = index+1;
+ }
+ index++;
+ }
+ if(ret == null){//結局改行は無い
+ ret = drawText(data,size,color,item->str);
+ }else{/*改行あり*/
+ ret = connectSurface(ret,drawText(data,size,color,last));
+ }
+
+ if(ret->w == 0 || ret->h == 0){
+ fprintf(data->common->log,"[comsurface/make]comment %04d has no char.\n",item->no);
+ fflush(data->common->log);
+ return ret;
+ }
+
+ /*
+ * 影処理
+ */
+ int shadow = data->common->shadow_kind;
+ if(shadow >= SHADOW_MAX){
+ shadow = SHADOW_DEFAULT;
+ }
+ ret = (*ShadowFunc[shadow])(ret,item->color == CMD_COLOR_BLACK,data->common->fontsize_fix);
+
+ /*
+ * アルファ値の設定
+ */
+ if(!data->opaque_comment){
+ float alpha_t = (((float)(item->no)/(item->chat->max_no)) * 0.4) + 0.6;
+ fprintf(data->common->log,"[comsurface/make]comment %04d set alpha:%5.2f%%.\n",item->no,alpha_t*100);
+ setAlpha(ret,alpha_t);
+ }
+
+ /*
+ * スケール設定
+ */
+
+ double zoomx = 1.0f;
+ //double zoomy = 1.0f;
+ //縮小
+
+ if(data->common->fontsize_fix){
+ zoomx = (0.5f * (double)video_width) / (double)NICO_WIDTH;
+ //zoomy = (0.5f * (double)video_height) / (double)NICO_HEIGHT;
+ }
+
+ /*スケールの調整*/
+ //if(((double)ret->h * zoomy) > ((double)video_height/3.0f)){
+ if(((double)ret->h * zoomx) > ((double)video_height/3.0f)){
+ zoomx *= 0.5f;
+ //zoomy *= 0.5f;
+ }
+ if(item->location != CMD_LOC_DEF && (ret->w * zoomx) > (double)video_width){
+ double scale = ((double)video_width) / (ret->w * zoomx);
+ zoomx *= scale;
+ //zoomy *= scale;
+ }
+ //画面サイズに合わせて変更
+ //if(zoomx != 1.0f || zoomy != 1.0f){
+ if(zoomx != 1.0f){
+ //fprintf(data->log,"[comsurface/make]comment %04d resized.(%5.2f%%,%5.2f%%)\n",item->no,zoomx*100,zoomy*100);
+ fprintf(data->common->log,"[comsurface/make]comment %04d resized.(%5.2f%%)\n",item->no,zoomx*100);
+ fflush(data->common->log);
+ SDL_Surface* tmp = ret;
+ ret = zoomSurface(tmp,zoomx,zoomx,SMOOTHING_ON);
+ SDL_FreeSurface(tmp);
+ }
+
+ return ret;
+}
+/**
+ * 文字を描画
+ */
+
+SDL_Surface* drawText(COMMDATA* data,int size,int color,Uint16* str){
+ if(str[0] == '\0'){
+ return SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ 0,COMMENT_FONT_SIZE[size],32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ }
+ /*
+ SDL_Surface* fmt = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ 0,
+ 0,
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+
+ SDL_Surface* tmp = TTF_RenderUNICODE_Blended(data->font[size],str,COMMENT_COLOR[color]);
+ SDL_SetAlpha(tmp,SDL_SRCALPHA | SDL_RLEACCEL,0xff);
+ SDL_Surface* surf = SDL_ConvertSurface(tmp,fmt->format,SDL_SRCALPHA | SDL_HWSURFACE);
+ SDL_FreeSurface(tmp);
+ SDL_FreeSurface(fmt);
+ */
+ SDL_Surface* surf = TTF_RenderUNICODE_Blended(data->common->font[size],str,COMMENT_COLOR[color]);
+ return surf;
+}
-#ifndef COM_SURFACE_H_\r
-#define COM_SURFACE_H_\r
-#include <SDL/SDL.h>\r
-#include "../chat/chat.h"\r
-#include "../chat/chat_slot.h"\r
-#include "../main.h"\r
-\r
-SDL_Surface* makeCommentSurface(COMMDATA* data,const CHAT_ITEM* item,int video_width,int video_height);\r
-\r
-\r
-#endif /*COM_SURFACE_H_*/\r
+#ifndef COM_SURFACE_H_
+#define COM_SURFACE_H_
+#include <SDL/SDL.h>
+#include "../chat/chat.h"
+#include "../chat/chat_slot.h"
+#include "../main.h"
+
+SDL_Surface* makeCommentSurface(COMMDATA* data,const CHAT_ITEM* item,int video_width,int video_height);
+
+
+#endif /*COM_SURFACE_H_*/
-#include <SDL/SDL.h>\r
-#include "surf_util.h"\r
-#include "shadow.h"\r
-\r
-/*\89e\82È\82µ*/\r
-SDL_Surface* noShadow(SDL_Surface* surf,int is_black,int is_fix_size){\r
- return surf;\r
-}\r
-/*\89E\89º*/\r
-#define SHADOW_SIZE 3\r
-\r
-SDL_Surface* likeNicoNico(SDL_Surface* surf,int is_black,int is_fix_size){\r
- /*\83X\83\89\83C\83h\95\9d\82Ì\8am\92è*/\r
- int slide = SHADOW_SIZE;\r
- if(is_fix_size){\r
- slide <<= 1;\r
- }\r
- int w = surf->w;\r
- int h = surf->h;\r
- SDL_Surface* shadow = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- w+(slide<<1),\r
- h+(slide<<1),\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_Surface* shadow2 = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- w+(slide<<1),\r
- h+(slide<<1),\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_Rect rect = {slide,slide};\r
- SDL_SetAlpha(surf,0,0xff);\r
- SDL_BlitSurface(surf,NULL,shadow,&rect);\r
- SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);\r
- if(is_black){//\8d\95\82Å\82 \82ê\82Î\81A\8eü\82è\82ð\82µ\82ë\82Å\88Í\82Þ\r
- setRGB(shadow,0xffffffff);\r
- }else{\r
- setRGB(shadow,0);\r
- }\r
- SDL_SetAlpha(shadow,0,0xff);\r
- SDL_BlitSurface(shadow,NULL,shadow2,NULL);\r
- SDL_SetAlpha(shadow,SDL_SRCALPHA,0xff);\r
- int x,y,z;\r
- int nw = shadow->w;\r
- int nh = shadow->h;\r
- int *pix;\r
- int *pix2;\r
- int pitch = shadow->pitch;\r
- int bps = shadow->format->BytesPerPixel;\r
- Uint32 Amask = shadow->format->Amask;\r
- Uint32 Mask = (shadow->format->Rmask | shadow->format->Gmask | shadow->format->Bmask);\r
- Uint32 Ashift = shadow->format->Ashift;\r
- Uint32 Aloss = shadow->format->Aloss;\r
- SDL_LockSurface(shadow);\r
- SDL_LockSurface(shadow2);\r
- //\82±\82±\82Í\8bô\90\94\82É\82·\82é\82±\82Æ\81B\r
- int zmax = 10;\r
- if(is_fix_size){\r
- zmax = 16;\r
- }\r
- SDL_Surface* tmp;\r
- for(z=0;z<zmax;z++){\r
- char *pixels = (char*)shadow->pixels;\r
- char *pixels2 = (char*)shadow2->pixels;\r
- for(y=0;y<nh;y++){\r
- pix = (int*)(&pixels[pitch * y]);\r
- pix2 = (int*)(&pixels2[pitch * y]);\r
- for(x=0;x<nw;x++){\r
- int right = (x==nw-1) ? 0 : *(int*)((((char*)pix)+bps));\r
- int left = (x==0) ? 0 : *(int*)((((char*)pix)-bps));\r
- int up = (y==0) ? 0 : *(int*)((((char*)pix)-pitch));\r
- int down = (y==nh-1) ? 0 : *(int*)((((char*)pix)+pitch));\r
- int my = *pix2;\r
- int new_alpha = (((((my & Amask) >> Ashift) << Aloss) +(((right & Amask) >> Ashift) << Aloss)+(((left & Amask) >> Ashift) << Aloss)+(((up & Amask) >> Ashift) << Aloss)+(((down & Amask) >> Ashift) << Aloss)) / 5) & 0xff;\r
- new_alpha = (new_alpha * 18) >> 4;\r
- if(new_alpha > 0xff){\r
- new_alpha = 0xff;\r
- }\r
- *pix2 &= Mask;\r
- *pix2 |= ((new_alpha >> Aloss) << Ashift) & Amask;\r
- pix = (int*)(((char*)pix)+bps);\r
- pix2 = (int*)(((char*)pix2)+bps);\r
- }\r
- }\r
- tmp = shadow2;\r
- shadow2 = shadow;\r
- shadow = tmp;\r
- }\r
- SDL_UnlockSurface(shadow);\r
- SDL_UnlockSurface(shadow2);\r
- shadowBlitSurface(surf,NULL,shadow,&rect);\r
- SDL_FreeSurface(surf);\r
- SDL_FreeSurface(shadow2);\r
- return shadow;\r
-}\r
-\r
-/*\89E\89º*/\r
-#define SHADOW_SLIDE 2\r
-SDL_Surface* likeNovel(SDL_Surface* surf,int is_black,int is_fix_size){\r
- /*\83X\83\89\83C\83h\95\9d\82Ì\8am\92è*/\r
- int slide = SHADOW_SLIDE;\r
- if(is_fix_size){\r
- slide <<= 1;\r
- }\r
- /*\8d\95\82Ì\97p\88Ó*/\r
- SDL_Surface* black = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- surf->w+slide,\r
- surf->h+slide,\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_Rect rect = {slide,slide};\r
- SDL_SetAlpha(surf,0,0xff);//\88ê\89ñalpha\8d\87\90¬\82ð\90Ø\82é\r
- SDL_BlitSurface(surf,NULL,black,&rect);\r
- SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);\r
- if(is_black){//\8d\95\82Å\82 \82ê\82Î\81A\8eü\82è\82ð\82µ\82ë\82Å\88Í\82Þ\r
- setRGB(black,0xffffffff);\r
- }else{\r
- setRGB(black,0);\r
- }\r
- setAlpha(black,0.6f);\r
- shadowBlitSurface(surf,NULL,black,NULL);\r
- SDL_FreeSurface(surf);\r
- return black;\r
-}\r
-\r
-//\8eU\82ç\82·\82Ì\82Å\82Í\82È\82\81A\88Í\82Á\82Ä\82µ\82Ü\82¤\81B\r
-SDL_Surface* likeOld(SDL_Surface* surf,int is_black,int is_fix_size){\r
- /*\83X\83\89\83C\83h\95\9d\82Ì\8am\92è*/\r
- int slide = SHADOW_SIZE;\r
- if(is_fix_size){\r
- slide <<= 1;\r
- }\r
- int w = surf->w;\r
- int h = surf->h;\r
- SDL_Surface* shadow = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- w+(slide<<1),\r
- h+(slide<<1),\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_Surface* shadow2 = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,\r
- w+(slide<<1),\r
- h+(slide<<1),\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_Rect rect = {slide,slide};\r
- SDL_SetAlpha(surf,0,0xff);\r
- SDL_BlitSurface(surf,NULL,shadow,&rect);\r
- SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);\r
- if(is_black){//\8d\95\82Å\82 \82ê\82Î\81A\8eü\82è\82ð\82µ\82ë\82Å\88Í\82Þ\r
- setRGB(shadow,0xffffffff);\r
- }else{\r
- setRGB(shadow,0);\r
- }\r
- SDL_SetAlpha(shadow,0,0xff);\r
- SDL_BlitSurface(shadow,NULL,shadow2,NULL);\r
- SDL_SetAlpha(shadow,SDL_SRCALPHA,0xff);\r
- int x,y,z;\r
- int nw = shadow->w;\r
- int nh = shadow->h;\r
- int *pix;\r
- int *pix2;\r
- int pitch = shadow->pitch;\r
- int bps = shadow->format->BytesPerPixel;\r
- Uint32 Amask = shadow->format->Amask;\r
- Uint32 Mask = (shadow->format->Rmask | shadow->format->Gmask | shadow->format->Bmask);\r
- Uint32 Ashift = shadow->format->Ashift;\r
- Uint32 Aloss = shadow->format->Aloss;\r
- SDL_Surface* tmp;\r
- SDL_LockSurface(shadow);\r
- SDL_LockSurface(shadow2);\r
- int zmax = 1;\r
- if(is_fix_size){\r
- zmax = 2;\r
- }\r
- for(z=0;z<zmax;z++){\r
- char *pixels = (char*)shadow->pixels;\r
- char *pixels2 = (char*)shadow2->pixels;\r
- for(y=0;y<nh;y++){\r
- pix = (int*)(&pixels[pitch * y]);\r
- pix2 = (int*)(&pixels2[pitch * y]);\r
- for(x=0;x<nw;x++){\r
- int right = (x==nw-1) ? 0 : *(int*)((((char*)pix)+bps));\r
- int left = (x==0) ? 0 : *(int*)((((char*)pix)-bps));\r
- int up = (y==0) ? 0 : *(int*)((((char*)pix)-pitch));\r
- int down = (y==nh-1) ? 0 : *(int*)((((char*)pix)+pitch));\r
- int my = *pix2;\r
- //\8eü\82è\82ª\8bó\94\92\82Å\82È\82¢\r
- if(((right | left | up | down | my) & Amask) != 0){\r
- *pix2 &= Mask;\r
- *pix2 |= (((0xff/(z+1)) >> Aloss) << Ashift) & Amask;\r
- }\r
- pix = (int*)(((char*)pix)+bps);\r
- pix2 = (int*)(((char*)pix2)+bps);\r
- }\r
- }\r
- tmp = shadow2;\r
- shadow2 = shadow;\r
- shadow = tmp;\r
- }\r
- SDL_UnlockSurface(shadow);\r
- SDL_UnlockSurface(shadow2);\r
- shadowBlitSurface(surf,NULL,shadow,&rect);\r
- SDL_FreeSurface(surf);\r
- SDL_FreeSurface(shadow2);\r
- return shadow;\r
-}\r
-\r
-\r
-//\92è\8b`\r
-SDL_Surface* (*ShadowFunc[SHADOW_MAX])(SDL_Surface* surf,int is_black,int is_fix_size) = {\r
- noShadow,\r
- likeNicoNico,\r
- likeNovel,\r
- likeOld\r
-};\r
+#include <SDL/SDL.h>
+#include "surf_util.h"
+#include "shadow.h"
+
+/*影なし*/
+SDL_Surface* noShadow(SDL_Surface* surf,int is_black,int is_fix_size){
+ return surf;
+}
+/*右下*/
+#define SHADOW_SIZE 3
+
+SDL_Surface* likeNicoNico(SDL_Surface* surf,int is_black,int is_fix_size){
+ /*スライド幅の確定*/
+ int slide = SHADOW_SIZE;
+ if(is_fix_size){
+ slide <<= 1;
+ }
+ int w = surf->w;
+ int h = surf->h;
+ SDL_Surface* shadow = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ w+(slide<<1),
+ h+(slide<<1),
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_Surface* shadow2 = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ w+(slide<<1),
+ h+(slide<<1),
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_Rect rect = {slide,slide};
+ SDL_SetAlpha(surf,0,0xff);
+ SDL_BlitSurface(surf,NULL,shadow,&rect);
+ SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);
+ if(is_black){//黒であれば、周りをしろで囲む
+ setRGB(shadow,0xffffffff);
+ }else{
+ setRGB(shadow,0);
+ }
+ SDL_SetAlpha(shadow,0,0xff);
+ SDL_BlitSurface(shadow,NULL,shadow2,NULL);
+ SDL_SetAlpha(shadow,SDL_SRCALPHA,0xff);
+ int x,y,z;
+ int nw = shadow->w;
+ int nh = shadow->h;
+ int *pix;
+ int *pix2;
+ int pitch = shadow->pitch;
+ int bps = shadow->format->BytesPerPixel;
+ Uint32 Amask = shadow->format->Amask;
+ Uint32 Mask = (shadow->format->Rmask | shadow->format->Gmask | shadow->format->Bmask);
+ Uint32 Ashift = shadow->format->Ashift;
+ Uint32 Aloss = shadow->format->Aloss;
+ SDL_LockSurface(shadow);
+ SDL_LockSurface(shadow2);
+ //ここは偶数にすること。
+ int zmax = 10;
+ if(is_fix_size){
+ zmax = 16;
+ }
+ SDL_Surface* tmp;
+ for(z=0;z<zmax;z++){
+ char *pixels = (char*)shadow->pixels;
+ char *pixels2 = (char*)shadow2->pixels;
+ for(y=0;y<nh;y++){
+ pix = (int*)(&pixels[pitch * y]);
+ pix2 = (int*)(&pixels2[pitch * y]);
+ for(x=0;x<nw;x++){
+ int right = (x==nw-1) ? 0 : *(int*)((((char*)pix)+bps));
+ int left = (x==0) ? 0 : *(int*)((((char*)pix)-bps));
+ int up = (y==0) ? 0 : *(int*)((((char*)pix)-pitch));
+ int down = (y==nh-1) ? 0 : *(int*)((((char*)pix)+pitch));
+ int my = *pix2;
+ int new_alpha = (((((my & Amask) >> Ashift) << Aloss) +(((right & Amask) >> Ashift) << Aloss)+(((left & Amask) >> Ashift) << Aloss)+(((up & Amask) >> Ashift) << Aloss)+(((down & Amask) >> Ashift) << Aloss)) / 5) & 0xff;
+ new_alpha = (new_alpha * 18) >> 4;
+ if(new_alpha > 0xff){
+ new_alpha = 0xff;
+ }
+ *pix2 &= Mask;
+ *pix2 |= ((new_alpha >> Aloss) << Ashift) & Amask;
+ pix = (int*)(((char*)pix)+bps);
+ pix2 = (int*)(((char*)pix2)+bps);
+ }
+ }
+ tmp = shadow2;
+ shadow2 = shadow;
+ shadow = tmp;
+ }
+ SDL_UnlockSurface(shadow);
+ SDL_UnlockSurface(shadow2);
+ shadowBlitSurface(surf,NULL,shadow,&rect);
+ SDL_FreeSurface(surf);
+ SDL_FreeSurface(shadow2);
+ return shadow;
+}
+
+/*右下*/
+#define SHADOW_SLIDE 2
+SDL_Surface* likeNovel(SDL_Surface* surf,int is_black,int is_fix_size){
+ /*スライド幅の確定*/
+ int slide = SHADOW_SLIDE;
+ if(is_fix_size){
+ slide <<= 1;
+ }
+ /*黒の用意*/
+ SDL_Surface* black = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ surf->w+slide,
+ surf->h+slide,
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_Rect rect = {slide,slide};
+ SDL_SetAlpha(surf,0,0xff);//一回alpha合成を切る
+ SDL_BlitSurface(surf,NULL,black,&rect);
+ SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);
+ if(is_black){//黒であれば、周りをしろで囲む
+ setRGB(black,0xffffffff);
+ }else{
+ setRGB(black,0);
+ }
+ setAlpha(black,0.6f);
+ shadowBlitSurface(surf,NULL,black,NULL);
+ SDL_FreeSurface(surf);
+ return black;
+}
+
+//散らすのではなく、囲ってしまう。
+SDL_Surface* likeOld(SDL_Surface* surf,int is_black,int is_fix_size){
+ /*スライド幅の確定*/
+ int slide = SHADOW_SIZE;
+ if(is_fix_size){
+ slide <<= 1;
+ }
+ int w = surf->w;
+ int h = surf->h;
+ SDL_Surface* shadow = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ w+(slide<<1),
+ h+(slide<<1),
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_Surface* shadow2 = SDL_CreateRGBSurface( SDL_SRCALPHA | SDL_HWSURFACE | SDL_HWACCEL,
+ w+(slide<<1),
+ h+(slide<<1),
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_Rect rect = {slide,slide};
+ SDL_SetAlpha(surf,0,0xff);
+ SDL_BlitSurface(surf,NULL,shadow,&rect);
+ SDL_SetAlpha(surf,SDL_SRCALPHA,0xff);
+ if(is_black){//黒であれば、周りをしろで囲む
+ setRGB(shadow,0xffffffff);
+ }else{
+ setRGB(shadow,0);
+ }
+ SDL_SetAlpha(shadow,0,0xff);
+ SDL_BlitSurface(shadow,NULL,shadow2,NULL);
+ SDL_SetAlpha(shadow,SDL_SRCALPHA,0xff);
+ int x,y,z;
+ int nw = shadow->w;
+ int nh = shadow->h;
+ int *pix;
+ int *pix2;
+ int pitch = shadow->pitch;
+ int bps = shadow->format->BytesPerPixel;
+ Uint32 Amask = shadow->format->Amask;
+ Uint32 Mask = (shadow->format->Rmask | shadow->format->Gmask | shadow->format->Bmask);
+ Uint32 Ashift = shadow->format->Ashift;
+ Uint32 Aloss = shadow->format->Aloss;
+ SDL_Surface* tmp;
+ SDL_LockSurface(shadow);
+ SDL_LockSurface(shadow2);
+ int zmax = 1;
+ if(is_fix_size){
+ zmax = 2;
+ }
+ for(z=0;z<zmax;z++){
+ char *pixels = (char*)shadow->pixels;
+ char *pixels2 = (char*)shadow2->pixels;
+ for(y=0;y<nh;y++){
+ pix = (int*)(&pixels[pitch * y]);
+ pix2 = (int*)(&pixels2[pitch * y]);
+ for(x=0;x<nw;x++){
+ int right = (x==nw-1) ? 0 : *(int*)((((char*)pix)+bps));
+ int left = (x==0) ? 0 : *(int*)((((char*)pix)-bps));
+ int up = (y==0) ? 0 : *(int*)((((char*)pix)-pitch));
+ int down = (y==nh-1) ? 0 : *(int*)((((char*)pix)+pitch));
+ int my = *pix2;
+ //周りが空白でない
+ if(((right | left | up | down | my) & Amask) != 0){
+ *pix2 &= Mask;
+ *pix2 |= (((0xff/(z+1)) >> Aloss) << Ashift) & Amask;
+ }
+ pix = (int*)(((char*)pix)+bps);
+ pix2 = (int*)(((char*)pix2)+bps);
+ }
+ }
+ tmp = shadow2;
+ shadow2 = shadow;
+ shadow = tmp;
+ }
+ SDL_UnlockSurface(shadow);
+ SDL_UnlockSurface(shadow2);
+ shadowBlitSurface(surf,NULL,shadow,&rect);
+ SDL_FreeSurface(surf);
+ SDL_FreeSurface(shadow2);
+ return shadow;
+}
+
+
+//定義
+SDL_Surface* (*ShadowFunc[SHADOW_MAX])(SDL_Surface* surf,int is_black,int is_fix_size) = {
+ noShadow,
+ likeNicoNico,
+ likeNovel,
+ likeOld
+};
-#ifndef SHADOW_H_\r
-#define SHADOW_H_\r
-\r
-#define SHADOW_MAX 4\r
-#define SHADOW_DEFAULT 1\r
-SDL_Surface* (*ShadowFunc[SHADOW_MAX])(SDL_Surface* surf,int is_black,int is_fix_size);\r
-\r
-#endif /*SHADOW_H_*/\r
+#ifndef SHADOW_H_
+#define SHADOW_H_
+
+#define SHADOW_MAX 4
+#define SHADOW_DEFAULT 1
+SDL_Surface* (*ShadowFunc[SHADOW_MAX])(SDL_Surface* surf,int is_black,int is_fix_size);
+
+#endif /*SHADOW_H_*/
-#include <SDL/SDL.h>\r
-#include "surf_util.h"\r
-#include "../mydef.h"\r
-\r
-SDL_Surface* connectSurface(SDL_Surface* top,SDL_Surface* bottom){\r
- SDL_Surface* ret = SDL_CreateRGBSurface( SDL_SRCALPHA,\r
- MAX(top->w,bottom->w),\r
- top->h+bottom->h,\r
- 32,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- 0x000000ff\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- 0xff000000\r
- #endif\r
- );\r
- SDL_SetAlpha(top,SDL_SRCALPHA | SDL_RLEACCEL,0xff);\r
- SDL_SetAlpha(bottom,SDL_SRCALPHA | SDL_RLEACCEL,0xff);\r
-\r
- SDL_BlitSurface(top,NULL,ret,NULL);\r
-\r
- SDL_Rect rect2 = {0,top->h};\r
- SDL_BlitSurface(bottom,NULL,ret,&rect2);\r
- SDL_FreeSurface(top);\r
- SDL_FreeSurface(bottom);\r
- return ret;\r
-}\r
-\r
-void setAlpha(SDL_Surface* surf,double alpha_t){\r
- int x,y;\r
- int h = surf->h;\r
- int w = surf->w;\r
- Uint32 mask,shift,bytesp,pitch,loss;\r
- Uint8 alpha;\r
- Uint8* pixels;\r
- Uint32* pix;\r
- SDL_PixelFormat* format = surf->format;\r
- /*\95Ï\90\94\82Ì\90Ý\92è*/\r
- mask = format->Amask;\r
- shift = format->Ashift;\r
- loss = format->Aloss;\r
- bytesp = format->BytesPerPixel;\r
- pitch = surf->pitch;\r
- pixels = surf->pixels;\r
- SDL_LockSurface(surf);//\83T\81[\83t\83F\83C\83X\82ð\83\8d\83b\83N\r
- for(y=0;y<h;y++){\r
- for(x=0;x<w;x++){\r
- pix = (Uint32*)(&pixels[y*pitch + x*bytesp]);\r
- alpha = (Uint8)((((*pix) & mask) >> shift) << loss);\r
- alpha *= alpha_t;\r
- (*pix) &= ~((0xff >> loss) << shift);\r
- (*pix) |= (alpha >> loss) << shift;\r
- }\r
- }\r
- SDL_UnlockSurface(surf);//\83A\83\93\83\8d\83b\83N\r
-}\r
-\r
-/**\r
- * src\82Ì\95s\93§\96¾\93x\82ð\8fã\8f\91\82«\82µ\82Ä\82µ\82Ü\82¤\81B\r
- * src\82Ì\95û\82ª\95s\93§\96¾\82È\82ç\81A\82»\82ê\82ð\8fã\8f\91\82«\81B\r
- */\r
-\r
-void overrideAlpha(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect){\r
- SDL_LockSurface(src);//\83T\81[\83t\83F\83C\83X\82ð\83\8d\83b\83N\r
- SDL_LockSurface(dst);//\83T\81[\83t\83F\83C\83X\82ð\83\8d\83b\83N\r
- //\94Í\88Í\82Ì\8am\92è\r
- int sw = src->w;\r
- int sh = src->h;\r
- int sx = 0;\r
- int sy = 0;\r
- if(srcrect != NULL){\r
- sx = srcrect->x;\r
- sy = srcrect->y;\r
- if(sx >= sw || sy > sh){\r
- return;\r
- }\r
- sw = MIN(sw-sx,srcrect->w);\r
- sh = MIN(sh-sy,srcrect->h);\r
- }\r
- int dw = dst->w;\r
- int dh = dst->h;\r
- int dx = 0;\r
- int dy = 0;\r
- if(dstrect != NULL){\r
- dx = dstrect->x;\r
- dy = dstrect->y;\r
- if(dx >= dw || dy > dh){\r
- return;\r
- }\r
- dw = MIN(dw-dx,dstrect->w);\r
- dh = MIN(dh-dy,dstrect->h);\r
- }\r
- //\8f¬\82³\82¢\82Ù\82¤\82É\82 \82í\82¹\82é\r
- if(dw > sw){\r
- dw = sw;\r
- }else{\r
- sw = dw;\r
- }\r
- if(dh > sh){\r
- dh = sh;\r
- }else{\r
- sh = dh;\r
- }\r
- //\82â\82Á\82Æ\82±\82³\95`\89æ\81B\81B\r
- int sbytesp = src->format->BytesPerPixel;\r
- int dbytesp = dst->format->BytesPerPixel;\r
- int spitch = src->pitch;\r
- int dpitch = dst->pitch;\r
- int sAmask = src->format->Amask;\r
- int dAmask = dst->format->Amask;\r
- int sAshift = src->format->Ashift;\r
- int dAshift = dst->format->Ashift;\r
- int sAloss = src->format->Aloss;\r
- int dAloss = dst->format->Aloss;\r
- Uint8* spix = (Uint8*)src->pixels;\r
- Uint8* dpix = (Uint8*)dst->pixels;\r
- Uint32* spt;\r
- Uint32* dpt;\r
- Uint32 salpha;\r
- Uint32 dalpha;\r
- int x,y;\r
- for(y=0;y<sh;y++){\r
- for(x=0;x<sw;x++){\r
- spt = (Uint32*)(&spix[(sy+y)*spitch+(sx+x)*sbytesp]);\r
- dpt = (Uint32*)(&dpix[(dy+y)*dpitch+(dx+x)*dbytesp]);\r
- salpha = ((*spt & sAmask)>>sAshift)<<sAloss;\r
- dalpha = ((*dpt & dAmask)>>dAshift)<<dAloss;\r
- if(salpha > dalpha){\r
- *dpt &= ~dAmask;\r
- *dpt |= (salpha>>dAloss)<<dAshift;\r
- }\r
- }\r
- }\r
- SDL_UnlockSurface(dst);//\83A\83\93\83\8d\83b\83N\r
- SDL_UnlockSurface(src);//\83A\83\93\83\8d\83b\83N\r
-}\r
-\r
-void inline shadowBlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect){\r
- SDL_BlitSurface(src,srcrect,dst,dstrect);\r
- overrideAlpha(src,srcrect,dst,dstrect);\r
-}\r
-\r
-void setRGB(SDL_Surface* surf,Uint32 color){\r
- int x,y;\r
- int h = surf->h;\r
- int w = surf->w;\r
- int bytesp = surf->format->BytesPerPixel;\r
- int pitch = surf->pitch;\r
- Uint32 Amask = surf->format->Amask;\r
- color &= surf->format->Rmask | surf->format->Gmask | surf->format->Bmask;\r
- Uint8* pix = (Uint8*)surf->pixels;\r
- Uint32* pt;\r
- SDL_LockSurface(surf);//\83T\81[\83t\83F\83C\83X\82ð\83\8d\83b\83N\r
- for(y=0;y<h;y++){\r
- for(x=0;x<w;x++){\r
- pt = (Uint32*)(&pix[y*pitch + x*bytesp]);\r
- *pt &= Amask;\r
- *pt |= color;\r
- }\r
- }\r
- SDL_UnlockSurface(surf);//\83T\81[\83t\83F\83C\83X\82ð\83A\83\93\83\8d\83b\83N\r
-}\r
-\r
-void getRGBA(SDL_Surface* surf,int x,int y,char* r,char* g,char* b,char* a){\r
- int pix_index = y * surf->pitch + x * surf->format->BytesPerPixel;\r
- char* pix = (char*)surf->pixels;\r
- SDL_GetRGBA(*(Uint32*)(&pix[pix_index]),surf->format,(Uint8*)r,(Uint8*)g,(Uint8*)b,(Uint8*)a);\r
-}\r
-\r
+#include <SDL/SDL.h>
+#include "surf_util.h"
+#include "../mydef.h"
+
+SDL_Surface* connectSurface(SDL_Surface* top,SDL_Surface* bottom){
+ SDL_Surface* ret = SDL_CreateRGBSurface( SDL_SRCALPHA,
+ MAX(top->w,bottom->w),
+ top->h+bottom->h,
+ 32,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+ #endif
+ );
+ SDL_SetAlpha(top,SDL_SRCALPHA | SDL_RLEACCEL,0xff);
+ SDL_SetAlpha(bottom,SDL_SRCALPHA | SDL_RLEACCEL,0xff);
+
+ SDL_BlitSurface(top,NULL,ret,NULL);
+
+ SDL_Rect rect2 = {0,top->h};
+ SDL_BlitSurface(bottom,NULL,ret,&rect2);
+ SDL_FreeSurface(top);
+ SDL_FreeSurface(bottom);
+ return ret;
+}
+
+void setAlpha(SDL_Surface* surf,double alpha_t){
+ int x,y;
+ int h = surf->h;
+ int w = surf->w;
+ Uint32 mask,shift,bytesp,pitch,loss;
+ Uint8 alpha;
+ Uint8* pixels;
+ Uint32* pix;
+ SDL_PixelFormat* format = surf->format;
+ /*変数の設定*/
+ mask = format->Amask;
+ shift = format->Ashift;
+ loss = format->Aloss;
+ bytesp = format->BytesPerPixel;
+ pitch = surf->pitch;
+ pixels = surf->pixels;
+ SDL_LockSurface(surf);//サーフェイスをロック
+ for(y=0;y<h;y++){
+ for(x=0;x<w;x++){
+ pix = (Uint32*)(&pixels[y*pitch + x*bytesp]);
+ alpha = (Uint8)((((*pix) & mask) >> shift) << loss);
+ alpha *= alpha_t;
+ (*pix) &= ~((0xff >> loss) << shift);
+ (*pix) |= (alpha >> loss) << shift;
+ }
+ }
+ SDL_UnlockSurface(surf);//アンロック
+}
+
+/**
+ * srcの不透明度を上書きしてしまう。
+ * srcの方が不透明なら、それを上書き。
+ */
+
+void overrideAlpha(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect){
+ SDL_LockSurface(src);//サーフェイスをロック
+ SDL_LockSurface(dst);//サーフェイスをロック
+ //範囲の確定
+ int sw = src->w;
+ int sh = src->h;
+ int sx = 0;
+ int sy = 0;
+ if(srcrect != NULL){
+ sx = srcrect->x;
+ sy = srcrect->y;
+ if(sx >= sw || sy > sh){
+ return;
+ }
+ sw = MIN(sw-sx,srcrect->w);
+ sh = MIN(sh-sy,srcrect->h);
+ }
+ int dw = dst->w;
+ int dh = dst->h;
+ int dx = 0;
+ int dy = 0;
+ if(dstrect != NULL){
+ dx = dstrect->x;
+ dy = dstrect->y;
+ if(dx >= dw || dy > dh){
+ return;
+ }
+ dw = MIN(dw-dx,dstrect->w);
+ dh = MIN(dh-dy,dstrect->h);
+ }
+ //小さいほうにあわせる
+ if(dw > sw){
+ dw = sw;
+ }else{
+ sw = dw;
+ }
+ if(dh > sh){
+ dh = sh;
+ }else{
+ sh = dh;
+ }
+ //やっとこさ描画。。
+ int sbytesp = src->format->BytesPerPixel;
+ int dbytesp = dst->format->BytesPerPixel;
+ int spitch = src->pitch;
+ int dpitch = dst->pitch;
+ int sAmask = src->format->Amask;
+ int dAmask = dst->format->Amask;
+ int sAshift = src->format->Ashift;
+ int dAshift = dst->format->Ashift;
+ int sAloss = src->format->Aloss;
+ int dAloss = dst->format->Aloss;
+ Uint8* spix = (Uint8*)src->pixels;
+ Uint8* dpix = (Uint8*)dst->pixels;
+ Uint32* spt;
+ Uint32* dpt;
+ Uint32 salpha;
+ Uint32 dalpha;
+ int x,y;
+ for(y=0;y<sh;y++){
+ for(x=0;x<sw;x++){
+ spt = (Uint32*)(&spix[(sy+y)*spitch+(sx+x)*sbytesp]);
+ dpt = (Uint32*)(&dpix[(dy+y)*dpitch+(dx+x)*dbytesp]);
+ salpha = ((*spt & sAmask)>>sAshift)<<sAloss;
+ dalpha = ((*dpt & dAmask)>>dAshift)<<dAloss;
+ if(salpha > dalpha){
+ *dpt &= ~dAmask;
+ *dpt |= (salpha>>dAloss)<<dAshift;
+ }
+ }
+ }
+ SDL_UnlockSurface(dst);//アンロック
+ SDL_UnlockSurface(src);//アンロック
+}
+
+void inline shadowBlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect){
+ SDL_BlitSurface(src,srcrect,dst,dstrect);
+ overrideAlpha(src,srcrect,dst,dstrect);
+}
+
+void setRGB(SDL_Surface* surf,Uint32 color){
+ int x,y;
+ int h = surf->h;
+ int w = surf->w;
+ int bytesp = surf->format->BytesPerPixel;
+ int pitch = surf->pitch;
+ Uint32 Amask = surf->format->Amask;
+ color &= surf->format->Rmask | surf->format->Gmask | surf->format->Bmask;
+ Uint8* pix = (Uint8*)surf->pixels;
+ Uint32* pt;
+ SDL_LockSurface(surf);//サーフェイスをロック
+ for(y=0;y<h;y++){
+ for(x=0;x<w;x++){
+ pt = (Uint32*)(&pix[y*pitch + x*bytesp]);
+ *pt &= Amask;
+ *pt |= color;
+ }
+ }
+ SDL_UnlockSurface(surf);//サーフェイスをアンロック
+}
+
+void getRGBA(SDL_Surface* surf,int x,int y,char* r,char* g,char* b,char* a){
+ int pix_index = y * surf->pitch + x * surf->format->BytesPerPixel;
+ char* pix = (char*)surf->pixels;
+ SDL_GetRGBA(*(Uint32*)(&pix[pix_index]),surf->format,(Uint8*)r,(Uint8*)g,(Uint8*)b,(Uint8*)a);
+}
+
-#ifndef SURF_UTIL_H_\r
-#define SURF_UTIL_H_\r
-#include <SDL/SDL.h>\r
-SDL_Surface* connectSurface(SDL_Surface* top,SDL_Surface* bottom);\r
-void setAlpha(SDL_Surface* surf,double alpha_t);\r
-void overrideAlpha(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);\r
-void inline shadowBlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);\r
-void setRGB(SDL_Surface* surf,Uint32 color);\r
-#endif /*SURF_UTIL_H_*/\r
+#ifndef SURF_UTIL_H_
+#define SURF_UTIL_H_
+#include <SDL/SDL.h>
+SDL_Surface* connectSurface(SDL_Surface* top,SDL_Surface* bottom);
+void setAlpha(SDL_Surface* surf,double alpha_t);
+void overrideAlpha(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
+void inline shadowBlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
+void setRGB(SDL_Surface* surf,Uint32 color);
+#endif /*SURF_UTIL_H_*/
-/*\r
- * \8ag\92£Vhook\83t\83B\83\8b\83^\r
- * copyright (c) 2008 \83Õ\81i\83v\83T\83C\81j\r
- *\r
- * \82³\82«\82ã\82Î\82·\97p\82É\8ag\92£\82³\82ê\82½Vhook\83\89\83C\83u\83\89\83\8a\82ð\r
- * \83r\83\8b\83h\82·\82é\82½\82ß\82Ì\83w\83b\83_\82Å\82·\81B\r
- *\r
- * \82±\82Ì\83t\83@\83C\83\8b\82Í\81u\82³\82«\82ã\82Î\82·\81v\82Ì\88ê\95\94\82Å\82 \82è\81A\r
- * \82±\82Ì\83\\81[\83X\83R\81[\83h\82ÍGPL\83\89\83C\83Z\83\93\83X\82Å\94z\95z\82³\82ê\82Ü\82·\82Å\82·\81B\r
- */\r
-#ifndef SACCUBUS_VF_VHEXT_H\r
-#define SACCUBUS_VF_VHEXT_H\r
-/*\r
- * \83c\81[\83\8b\83{\83b\83N\83X\82Ì\83o\81[\83W\83\87\83\93\r
- * DLL\82Ì\92\86\82Å\8am\94F\82µ\82Æ\82¢\82½\95û\82ª\82¢\82¢\81B\r
- */\r
-#define TOOLBOX_VERSION 2\r
-\r
-/*\r
- * \8cÄ\82Î\82ê\82é\82Æ\82«\82É\88ê\8f\8f\82É\82Â\82¢\82Ä\82\82étoolbox.\r
- * \82±\82±\82©\82ç\93®\89æ\82Ì\8fî\95ñ\82È\82ñ\82©\82à\8eæ\93¾\82Å\82«\82é\81B\r
- */\r
-typedef struct toolbox{\r
- //\83o\81[\83W\83\87\83\93\r
- int version;\r
- double video_length;\r
-} toolbox;\r
-\r
-typedef struct vhext_frame{\r
- void *data;\r
- int linesize;\r
- int w;\r
- int h;\r
- double pts;\r
-} vhext_frame;\r
-\r
-\r
-/*\r
- * \8ag\92£vhook\83\89\83C\83u\83\89\83\8a\97p\8aÖ\90\94\8cQ\92è\8b`\r
- */\r
-\r
-//configure\97p\r
-typedef int (FrameHookExtConfigure)(void **ctxp,const toolbox *tbox, int argc, char *argv[]);\r
-typedef FrameHookExtConfigure *FrameHookExtConfigureFn;\r
-extern FrameHookExtConfigure ExtConfigure;\r
-\r
-//\83t\83\8c\81[\83\80\97p\r
-typedef void (FrameHookExtProcess)(void *ctx,const toolbox *tbox,vhext_frame *pict);\r
-typedef FrameHookExtProcess *FrameHookExtProcessFn;\r
-extern FrameHookExtProcess ExtProcess;\r
-\r
-//\8fI\97¹\8e\9e\82É\8cÄ\82Ô\r
-typedef void (FrameHookExtRelease)(void *ctx,const toolbox *tbox);\r
-typedef FrameHookExtRelease *FrameHookExtReleaseFn;\r
-extern FrameHookExtRelease ExtRelease;\r
-\r
-#endif /* SACCUBUS_VF_VHEXT_H */\r
+/*
+ * 拡張Vhookフィルタ
+ * copyright (c) 2008 ψ(プサイ)
+ *
+ * さきゅばす用に拡張されたVhookライブラリを
+ * ビルドするためのヘッダです。
+ *
+ * このファイルは「さきゅばす」の一部であり、
+ * このソースコードはGPLライセンスで配布されますです。
+ */
+#ifndef SACCUBUS_VF_VHEXT_H
+#define SACCUBUS_VF_VHEXT_H
+/*
+ * ツールボックスのバージョン
+ * DLLの中で確認しといた方がいい。
+ */
+#define TOOLBOX_VERSION 2
+
+/*
+ * 呼ばれるときに一緒についてくるtoolbox.
+ * ここから動画の情報なんかも取得できる。
+ */
+typedef struct toolbox{
+ //バージョン
+ int version;
+ double video_length;
+} toolbox;
+
+typedef struct vhext_frame{
+ void *data;
+ int linesize;
+ int w;
+ int h;
+ double pts;
+} vhext_frame;
+
+
+/*
+ * 拡張vhookライブラリ用関数群定義
+ */
+
+//configure用
+typedef int (FrameHookExtConfigure)(void **ctxp,const toolbox *tbox, int argc, char *argv[]);
+typedef FrameHookExtConfigure *FrameHookExtConfigureFn;
+extern FrameHookExtConfigure ExtConfigure;
+
+//フレーム用
+typedef void (FrameHookExtProcess)(void *ctx,const toolbox *tbox,vhext_frame *pict);
+typedef FrameHookExtProcess *FrameHookExtProcessFn;
+extern FrameHookExtProcess ExtProcess;
+
+//終了時に呼ぶ
+typedef void (FrameHookExtRelease)(void *ctx,const toolbox *tbox);
+typedef FrameHookExtRelease *FrameHookExtReleaseFn;
+extern FrameHookExtRelease ExtRelease;
+
+#endif /* SACCUBUS_VF_VHEXT_H */
-/*\83t\83\8c\81[\83\80\83t\83b\83N\82Ì\91\8a\8eè\82ð\82·\82é\82½\82ß\90ê\97p*/\r
-\r
-#include <stdlib.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <SDL/SDL.h>\r
-#include "common/framehook_ext.h"\r
-#include "framehook.h"\r
-#include "main.h"\r
-#include "mydef.h"\r
-#include "nicodef.h"\r
-#include "util.h"\r
-\r
-#ifdef _WIN32\r
- #define DLLEXPORT __declspec(dllexport)\r
-#else\r
- #define DLLEXPORT\r
-#endif\r
-\r
-typedef struct ContextInfo{\r
- FILE* log;\r
- DATA data;\r
-} ContextInfo;\r
-\r
-/*\r
- * \95K\97v\82È\8aÖ\90\94\82Ð\82Æ\82Â\82ß\81B\8dÅ\8f\89\82É\8cÄ\82Î\82ê\82é\82æ\81I\r
- * \r
- */\r
-int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]);\r
-\r
-DLLEXPORT int ExtConfigure(void **ctxp,const toolbox *tbox, int argc, char *argv[]){\r
- int i;\r
- //\83\8d\83O\r
- FILE* log = fopen("[log]vhext.txt", "w");\r
- if(log == NULL){\r
- puts("[framehook/init]failed to open logfile.\n");\r
- fflush(log);\r
- return -1;\r
- }else{\r
- fputs("[framehook/init]initializing..\n",log);\r
- fflush(log);\r
- }\r
- //\95K\97v\82È\90Ý\92è\82ª\82 \82é\82©\82Ì\8am\94F\r
- fprintf(log,"[framehook/init]called with argc = %d\n",argc);\r
- fflush(log);\r
- for(i=0;i<argc;i++){\r
- fprintf(log,"[framehook/init]arg[%2d] = %s\n",i,argv[i]);\r
- fflush(log);\r
- }\r
- //\83Z\83b\83e\83B\83\93\83O\8eæ\93¾\81B\r
- SETTING setting;\r
- if(init_setting(log,tbox,&setting,argc,argv)){\r
- fputs("[framehook/init]initialized settings.\n",log);\r
- fflush(log);\r
- }else{\r
- fputs("[framehook/init]failed to initialize settings.\n",log);\r
- fflush(log);\r
- return -2;\r
- }\r
- //\83\89\83C\83u\83\89\83\8a\82È\82Ç\82Ì\8f\89\8aú\89»\r
- if(init(log)){\r
- fputs("[framehook/init]initialized libs.\n",log);\r
- fflush(log);\r
- }else{\r
- fputs("[framehook/init]failed to initialize libs.\n",log);\r
- fflush(log);\r
- return -3;\r
- }\r
- /*\83R\83\93\83e\83L\83X\83g\82Ì\90Ý\92è*/\r
- *ctxp = malloc(sizeof(ContextInfo));\r
- if(*ctxp == NULL){\r
- fputs("[framehook/init]initialized to malloc for context.\n",log);\r
- fflush(log);\r
- }\r
- ContextInfo* ci = (ContextInfo*)*ctxp;\r
- ci->log = log;\r
- fflush(log);\r
- if(initData(&ci->data,log,&setting)){\r
- fputs("[framehook/init]initialized context.\n",log);\r
- fputs("[framehook/init]initialized.\n",log);\r
- fflush(log);\r
- return 0;\r
- }else{\r
- fputs("[framehook/init]failed to initialize context.\n",log);\r
- fflush(log);\r
- return -4;\r
- }\r
-}\r
-/*\r
- * \93à\95\94\82Å\82Ì\82Ý\8cÄ\82Î\82ê\82é\81B\r
- */\r
-\r
- /*\r
- argv[0]:\83v\83\8d\83O\83\89\83\80\r
- argv[1]:vhook\r
- argv[2]:\83t\83H\83\93\83g\r
- argv[3]:\83t\83H\83\93\83g\83C\83\93\83f\83b\83N\83X\r
- argv[4]:\88ê\89æ\96Ê\r
- argv[5]:\89e\82Ì\8eí\97Þ\r
- \88È\8d~\83I\83v\83V\83\87\83\93\r
- --enable-show-video\81F\95`\89æ\92\86\82É\93®\89æ\82ð\8c©\82¹\82é\81B\r
- --enable-fontsize-fix\81F\83t\83H\83\93\83g\83T\83C\83Y\82ð\8e©\93®\82Å\92²\90®\82·\82é\81B\r
-*/\r
- \r
-int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]){\r
- /*video\82Ì\92·\82³*/\r
- setting->video_length = (tbox->video_length * VPOS_FACTOR);\r
- /*\88È\8d~\83I\83v\83V\83\87\83\93*/\r
- \r
- //\83R\83\81\83\93\83g\82ð\8c©\82¹\82é\82©\94Û\82©\81H\r
- setting->enable_user_comment = FALSE;\r
- setting->enable_owner_comment = FALSE;\r
- setting->data_user_path = NULL;\r
- setting->data_owner_path = NULL;\r
- //\88ê\94Ê\93I\82È\90Ý\92è\r
- setting->font_path = NULL;\r
- setting->font_index = 0;\r
- setting->user_slot_max = 30;\r
- setting->owner_slot_max = 30;\r
- setting->shadow_kind = 1;//\83f\83t\83H\83\8b\83g\82Í\83j\83R\83j\83R\93®\89æ\95\97\r
- setting->show_video = FALSE;\r
- setting->fontsize_fix=FALSE;\r
- setting->opaque_comment=FALSE;\r
- int i;\r
- char* arg;\r
- for(i=0;i<argc;i++){\r
- arg = argv[i];\r
- if(!setting->data_user_path && strncmp(FRAMEHOOK_OPT_DATA_USER,arg,FRAMEHOOK_OPT_DATA_USER_LEN) == 0){\r
- char* data_user = arg+FRAMEHOOK_OPT_DATA_USER_LEN;\r
- setting->data_user_path = data_user;\r
- setting->enable_user_comment = TRUE;\r
- fprintf(log,"[framehook/init]User Comment data path:%s\n",setting->data_user_path);\r
- fflush(log);\r
- }else if(!setting->data_owner_path && strncmp(FRAMEHOOK_OPT_DATA_OWNER,arg,FRAMEHOOK_OPT_DATA_OWNER_LEN) == 0){\r
- char* data_owner = arg+FRAMEHOOK_OPT_DATA_OWNER_LEN;\r
- setting->data_owner_path = data_owner;\r
- setting->enable_owner_comment = TRUE;\r
- fprintf(log,"[framehook/init]Owner Comment data path:%s\n",setting->data_owner_path);\r
- fflush(log);\r
- }else if(!setting->font_path && strncmp(FRAMEHOOK_OPT_FONT,arg,FRAMEHOOK_OPT_FONT_LEN) == 0){\r
- char* font = arg+FRAMEHOOK_OPT_FONT_LEN;\r
- setting->font_path = font;\r
- fprintf(log,"[framehook/init]Font path:%s\n",setting->font_path);\r
- fflush(log);\r
- }else if(strncmp(FRAMEHOOK_OPT_FONTINDEX,arg,FRAMEHOOK_OPT_FONTINDEX_LEN) == 0){\r
- setting->font_index = MAX(0,atoi(arg+FRAMEHOOK_OPT_FONTINDEX_LEN));\r
- fprintf(log,"[framehook/init]font index:%d\n",setting->font_index);\r
- fflush(log);\r
- }else if(strncmp(FRAMEHOOK_OPT_SHADOW,arg,FRAMEHOOK_OPT_SHADOW_LEN) == 0){\r
- setting->shadow_kind = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHADOW_LEN));\r
- fprintf(log,"[framehook/init]shadow kind:%d\n",setting->shadow_kind);\r
- fflush(log);\r
- }else if(strncmp(FRAMEHOOK_OPT_SHOW_USER,arg,FRAMEHOOK_OPT_SHOW_USER_LEN) == 0){\r
- setting->user_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_USER_LEN));\r
- fprintf(log,"[framehook/init]User Comments on screen:%d\n",setting->user_slot_max);\r
- fflush(log);\r
- }else if(strncmp(FRAMEHOOK_OPT_SHOW_OWNER,arg,FRAMEHOOK_OPT_SHOW_OWNER_LEN) == 0){\r
- setting->owner_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_OWNER_LEN));\r
- fprintf(log,"[framehook/init]Owner Comments on screen:%d\n",setting->owner_slot_max);\r
- fflush(log);\r
- }else if(!setting->show_video && strcmp(arg,"--enable-show-video") == 0){\r
- fputs("[framehook/init]show video while converting.\n",log);\r
- fflush(log);\r
- setting->show_video=TRUE;\r
- }else if(!setting->fontsize_fix && strcmp(arg,"--enable-fix-font-size") == 0){\r
- fputs("[framehook/init]fix font size automatically.\n",log);\r
- fflush(log);\r
- setting->fontsize_fix=TRUE;\r
- }else if(!setting->opaque_comment && strcmp(arg,"--enable-opaque-comment") == 0){\r
- fputs("[framehook/init]enable opaque comment.\n",log);\r
- fflush(log);\r
- setting->opaque_comment=TRUE;\r
- }\r
- }\r
- //\88ø\90\94\82ð\90³\82µ\82\93ü\97Í\82µ\82½\82©\94Û\82©\82Ì\83`\83F\83b\83N\r
- //\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
- if(!setting->font_path){\r
- fputs("[framehook/init]please set FONT PATH.\n",log);\r
- fflush(log);\r
- return FALSE;\r
- }\r
- return TRUE;\r
-}\r
-\r
-/*\r
- * \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
- * \r
- */\r
-DLLEXPORT void ExtProcess(void *ctx,const toolbox *tbox,vhext_frame *pict){\r
- ContextInfo *ci = (ContextInfo *) ctx;\r
- FILE* log = ci->log;\r
-\r
- /* Note:\r
- * 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
- * \89æ\91\9c\82ª\92ñ\8b\9f\82³\82ê\82Ü\82·\81B\r
- */\r
-\r
- //SDL\82Ì\83T\81[\83t\83F\83C\83X\82É\95Ï\8a·\r
- SDL_Surface* surf = SDL_CreateRGBSurfaceFrom(pict->data,\r
- pict->w,pict->h,24,pict->linesize,\r
- #if SDL_BYTEORDER == SDL_BIG_ENDIAN\r
- 0xff000000,\r
- 0x00ff0000,\r
- 0x0000ff00,\r
- #else\r
- 0x000000ff,\r
- 0x0000ff00,\r
- 0x00ff0000,\r
- #endif\r
- 0x00000000\r
- );\r
- //\83t\83B\83\8b\83^\r
- int now_vpos = (pict->pts * VPOS_FACTOR);\r
- if(!main_process(&ci->data,surf,now_vpos)){\r
- fputs("[framehook/process]failed to process.\n",log);\r
- fflush(log);\r
- exit(1);\r
- }\r
- //\83T\81[\83t\83F\83C\83X\8aJ\95ú\r
- SDL_FreeSurface(surf);\r
- fflush(log);\r
-}\r
-\r
-/*\r
- * \95K\97v\82È\8aÖ\90\94\8dÅ\8cã\81B\8fI\82í\82Á\82½\82ç\8cÄ\82Î\82ê\82é\82æ\81I\r
- * \r
- */\r
-\r
-DLLEXPORT void ExtRelease(void *ctx,const toolbox *tbox){\r
- ContextInfo *ci;\r
- ci = (ContextInfo *) ctx;\r
- FILE* log = ci->log;\r
- fputs("[framehook/close]closing...\n",log);\r
- if (ctx) {\r
- closeData(&ci->data);\r
- fputs("[framehook/close]closed.\n",log);\r
- fclose(log);\r
- //\83R\83\93\83e\83L\83X\83g\91S\91Ì\r
- free(ctx);\r
- }\r
- //\83\89\83C\83u\83\89\83\8a\82Ì\8fI\97¹\r
- close();\r
-}\r
-\r
+/*フレームフックの相手をするため専用*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <SDL/SDL.h>
+#include "common/framehook_ext.h"
+#include "framehook.h"
+#include "main.h"
+#include "mydef.h"
+#include "nicodef.h"
+#include "util.h"
+
+#ifdef _WIN32
+ #define DLLEXPORT __declspec(dllexport)
+#else
+ #define DLLEXPORT
+#endif
+
+typedef struct ContextInfo{
+ FILE* log;
+ DATA data;
+} ContextInfo;
+
+/*
+ * 必要な関数ひとつめ。最初に呼ばれるよ!
+ *
+ */
+int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]);
+
+DLLEXPORT int ExtConfigure(void **ctxp,const toolbox *tbox, int argc, char *argv[]){
+ int i;
+ //ログ
+ FILE* log = fopen("[log]vhext.txt", "w");
+ if(log == NULL){
+ puts("[framehook/init]failed to open logfile.\n");
+ fflush(log);
+ return -1;
+ }else{
+ fputs("[framehook/init]initializing..\n",log);
+ fflush(log);
+ }
+ //必要な設定があるかの確認
+ fprintf(log,"[framehook/init]called with argc = %d\n",argc);
+ fflush(log);
+ for(i=0;i<argc;i++){
+ fprintf(log,"[framehook/init]arg[%2d] = %s\n",i,argv[i]);
+ fflush(log);
+ }
+ //セッティング取得。
+ SETTING setting;
+ if(init_setting(log,tbox,&setting,argc,argv)){
+ fputs("[framehook/init]initialized settings.\n",log);
+ fflush(log);
+ }else{
+ fputs("[framehook/init]failed to initialize settings.\n",log);
+ fflush(log);
+ return -2;
+ }
+ //ライブラリなどの初期化
+ if(init(log)){
+ fputs("[framehook/init]initialized libs.\n",log);
+ fflush(log);
+ }else{
+ fputs("[framehook/init]failed to initialize libs.\n",log);
+ fflush(log);
+ return -3;
+ }
+ /*コンテキストの設定*/
+ *ctxp = malloc(sizeof(ContextInfo));
+ if(*ctxp == NULL){
+ fputs("[framehook/init]initialized to malloc for context.\n",log);
+ fflush(log);
+ }
+ ContextInfo* ci = (ContextInfo*)*ctxp;
+ ci->log = log;
+ fflush(log);
+ if(initData(&ci->data,log,&setting)){
+ fputs("[framehook/init]initialized context.\n",log);
+ fputs("[framehook/init]initialized.\n",log);
+ fflush(log);
+ return 0;
+ }else{
+ fputs("[framehook/init]failed to initialize context.\n",log);
+ fflush(log);
+ return -4;
+ }
+}
+/*
+ * 内部でのみ呼ばれる。
+ */
+
+ /*
+ argv[0]:プログラム
+ argv[1]:vhook
+ argv[2]:フォント
+ argv[3]:フォントインデックス
+ argv[4]:一画面
+ argv[5]:影の種類
+ 以降オプション
+ --enable-show-video:描画中に動画を見せる。
+ --enable-fontsize-fix:フォントサイズを自動で調整する。
+*/
+
+int init_setting(FILE*log,const toolbox *tbox,SETTING* setting,int argc, char *argv[]){
+ /*videoの長さ*/
+ setting->video_length = (tbox->video_length * VPOS_FACTOR);
+ /*以降オプション*/
+
+ //コメントを見せるか否か?
+ setting->enable_user_comment = FALSE;
+ setting->enable_owner_comment = FALSE;
+ setting->data_user_path = NULL;
+ setting->data_owner_path = NULL;
+ //一般的な設定
+ setting->font_path = NULL;
+ setting->font_index = 0;
+ setting->user_slot_max = 30;
+ setting->owner_slot_max = 30;
+ setting->shadow_kind = 1;//デフォルトはニコニコ動画風
+ setting->show_video = FALSE;
+ setting->fontsize_fix=FALSE;
+ setting->opaque_comment=FALSE;
+ int i;
+ char* arg;
+ for(i=0;i<argc;i++){
+ arg = argv[i];
+ if(!setting->data_user_path && strncmp(FRAMEHOOK_OPT_DATA_USER,arg,FRAMEHOOK_OPT_DATA_USER_LEN) == 0){
+ char* data_user = arg+FRAMEHOOK_OPT_DATA_USER_LEN;
+ setting->data_user_path = data_user;
+ setting->enable_user_comment = TRUE;
+ fprintf(log,"[framehook/init]User Comment data path:%s\n",setting->data_user_path);
+ fflush(log);
+ }else if(!setting->data_owner_path && strncmp(FRAMEHOOK_OPT_DATA_OWNER,arg,FRAMEHOOK_OPT_DATA_OWNER_LEN) == 0){
+ char* data_owner = arg+FRAMEHOOK_OPT_DATA_OWNER_LEN;
+ setting->data_owner_path = data_owner;
+ setting->enable_owner_comment = TRUE;
+ fprintf(log,"[framehook/init]Owner Comment data path:%s\n",setting->data_owner_path);
+ fflush(log);
+ }else if(!setting->font_path && strncmp(FRAMEHOOK_OPT_FONT,arg,FRAMEHOOK_OPT_FONT_LEN) == 0){
+ char* font = arg+FRAMEHOOK_OPT_FONT_LEN;
+ setting->font_path = font;
+ fprintf(log,"[framehook/init]Font path:%s\n",setting->font_path);
+ fflush(log);
+ }else if(strncmp(FRAMEHOOK_OPT_FONTINDEX,arg,FRAMEHOOK_OPT_FONTINDEX_LEN) == 0){
+ setting->font_index = MAX(0,atoi(arg+FRAMEHOOK_OPT_FONTINDEX_LEN));
+ fprintf(log,"[framehook/init]font index:%d\n",setting->font_index);
+ fflush(log);
+ }else if(strncmp(FRAMEHOOK_OPT_SHADOW,arg,FRAMEHOOK_OPT_SHADOW_LEN) == 0){
+ setting->shadow_kind = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHADOW_LEN));
+ fprintf(log,"[framehook/init]shadow kind:%d\n",setting->shadow_kind);
+ fflush(log);
+ }else if(strncmp(FRAMEHOOK_OPT_SHOW_USER,arg,FRAMEHOOK_OPT_SHOW_USER_LEN) == 0){
+ setting->user_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_USER_LEN));
+ fprintf(log,"[framehook/init]User Comments on screen:%d\n",setting->user_slot_max);
+ fflush(log);
+ }else if(strncmp(FRAMEHOOK_OPT_SHOW_OWNER,arg,FRAMEHOOK_OPT_SHOW_OWNER_LEN) == 0){
+ setting->owner_slot_max = MAX(0,atoi(arg+FRAMEHOOK_OPT_SHOW_OWNER_LEN));
+ fprintf(log,"[framehook/init]Owner Comments on screen:%d\n",setting->owner_slot_max);
+ fflush(log);
+ }else if(!setting->show_video && strcmp(arg,"--enable-show-video") == 0){
+ fputs("[framehook/init]show video while converting.\n",log);
+ fflush(log);
+ setting->show_video=TRUE;
+ }else if(!setting->fontsize_fix && strcmp(arg,"--enable-fix-font-size") == 0){
+ fputs("[framehook/init]fix font size automatically.\n",log);
+ fflush(log);
+ setting->fontsize_fix=TRUE;
+ }else if(!setting->opaque_comment && strcmp(arg,"--enable-opaque-comment") == 0){
+ fputs("[framehook/init]enable opaque comment.\n",log);
+ fflush(log);
+ setting->opaque_comment=TRUE;
+ }
+ }
+ //引数を正しく入力したか否かのチェック
+ //ここでチェックしているの以外は、デフォルト設定で逃げる。
+ if(!setting->font_path){
+ fputs("[framehook/init]please set FONT PATH.\n",log);
+ fflush(log);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/*
+ * 必要な関数二つめ。フレームごとに呼ばれるよ!
+ *
+ */
+DLLEXPORT void ExtProcess(void *ctx,const toolbox *tbox,vhext_frame *pict){
+ ContextInfo *ci = (ContextInfo *) ctx;
+ FILE* log = ci->log;
+
+ /* Note:
+ * Saccubus 1.22以降の拡張vhookフィルタでは、RGB24フォーマットでのみ
+ * 画像が提供されます。
+ */
+
+ //SDLのサーフェイスに変換
+ SDL_Surface* surf = SDL_CreateRGBSurfaceFrom(pict->data,
+ pict->w,pict->h,24,pict->linesize,
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ #else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ #endif
+ 0x00000000
+ );
+ //フィルタ
+ int now_vpos = (pict->pts * VPOS_FACTOR);
+ if(!main_process(&ci->data,surf,now_vpos)){
+ fputs("[framehook/process]failed to process.\n",log);
+ fflush(log);
+ exit(1);
+ }
+ //サーフェイス開放
+ SDL_FreeSurface(surf);
+ fflush(log);
+}
+
+/*
+ * 必要な関数最後。終わったら呼ばれるよ!
+ *
+ */
+
+DLLEXPORT void ExtRelease(void *ctx,const toolbox *tbox){
+ ContextInfo *ci;
+ ci = (ContextInfo *) ctx;
+ FILE* log = ci->log;
+ fputs("[framehook/close]closing...\n",log);
+ if (ctx) {
+ closeData(&ci->data);
+ fputs("[framehook/close]closed.\n",log);
+ fclose(log);
+ //コンテキスト全体
+ free(ctx);
+ }
+ //ライブラリの終了
+ close();
+}
+
-#ifndef FRAMEHOOK_H_\r
-#define FRAMEHOOK_H_\r
-\r
-/*Framehook\82É\93n\82³\82ê\82é\83I\83v\83V\83\87\83\93\97p\82Ì\92è\8b`*/\r
-\r
-#define FRAMEHOOK_OPT_DATA_USER "--data-user:"\r
-#define FRAMEHOOK_OPT_DATA_USER_LEN strlen(FRAMEHOOK_OPT_DATA_USER)\r
-\r
-#define FRAMEHOOK_OPT_DATA_OWNER "--data-owner:"\r
-#define FRAMEHOOK_OPT_DATA_OWNER_LEN strlen(FRAMEHOOK_OPT_DATA_OWNER)\r
-\r
-#define FRAMEHOOK_OPT_FONT "--font:"\r
-#define FRAMEHOOK_OPT_FONT_LEN strlen(FRAMEHOOK_OPT_FONT)\r
-\r
-#define FRAMEHOOK_OPT_FONTINDEX "--font-index:"\r
-#define FRAMEHOOK_OPT_FONTINDEX_LEN strlen(FRAMEHOOK_OPT_FONTINDEX)\r
-\r
-#define FRAMEHOOK_OPT_FONTSIZE "--enable-fix-font-size"\r
-#define FRAMEHOOK_OPT_FONTSIZE_LEN strlen(FRAMEHOOK_OPT_FONTSIZE)\r
-\r
-#define FRAMEHOOK_OPT_SHADOW "--shadow:"\r
-#define FRAMEHOOK_OPT_SHADOW_LEN strlen(FRAMEHOOK_OPT_SHADOW)\r
-\r
-#define FRAMEHOOK_OPT_SHOW_USER "--show-user:"\r
-#define FRAMEHOOK_OPT_SHOW_USER_LEN strlen(FRAMEHOOK_OPT_SHOW_USER)\r
-\r
-#define FRAMEHOOK_OPT_SHOW_OWNER "--show-owner:"\r
-#define FRAMEHOOK_OPT_SHOW_OWNER_LEN strlen(FRAMEHOOK_OPT_SHOW_OWNER)\r
-\r
-#define FRAMEHOOK_OPT_SHOW_VIDEO "--enable-show-video"\r
-#define FRAMEHOOK_OPT_SHOW_VIDEO_LEN strlen(FRAMEHOOK_OPT_SHOW_VIDEO)\r
-\r
-#define FRAMEHOOK_OPT_OPAQUE_COMMENT "--enable-opaque-comment"\r
-#define FRAMEHOOK_OPT_OPAQUE_COMMENT_LEN strlen(FRAMEHOOK_OPT_OPAQUE_COMMENT)\r
-\r
-#endif /*FRAMEHOOK_H_*/\r
+#ifndef FRAMEHOOK_H_
+#define FRAMEHOOK_H_
+
+/*Framehookに渡されるオプション用の定義*/
+
+#define FRAMEHOOK_OPT_DATA_USER "--data-user:"
+#define FRAMEHOOK_OPT_DATA_USER_LEN strlen(FRAMEHOOK_OPT_DATA_USER)
+
+#define FRAMEHOOK_OPT_DATA_OWNER "--data-owner:"
+#define FRAMEHOOK_OPT_DATA_OWNER_LEN strlen(FRAMEHOOK_OPT_DATA_OWNER)
+
+#define FRAMEHOOK_OPT_FONT "--font:"
+#define FRAMEHOOK_OPT_FONT_LEN strlen(FRAMEHOOK_OPT_FONT)
+
+#define FRAMEHOOK_OPT_FONTINDEX "--font-index:"
+#define FRAMEHOOK_OPT_FONTINDEX_LEN strlen(FRAMEHOOK_OPT_FONTINDEX)
+
+#define FRAMEHOOK_OPT_FONTSIZE "--enable-fix-font-size"
+#define FRAMEHOOK_OPT_FONTSIZE_LEN strlen(FRAMEHOOK_OPT_FONTSIZE)
+
+#define FRAMEHOOK_OPT_SHADOW "--shadow:"
+#define FRAMEHOOK_OPT_SHADOW_LEN strlen(FRAMEHOOK_OPT_SHADOW)
+
+#define FRAMEHOOK_OPT_SHOW_USER "--show-user:"
+#define FRAMEHOOK_OPT_SHOW_USER_LEN strlen(FRAMEHOOK_OPT_SHOW_USER)
+
+#define FRAMEHOOK_OPT_SHOW_OWNER "--show-owner:"
+#define FRAMEHOOK_OPT_SHOW_OWNER_LEN strlen(FRAMEHOOK_OPT_SHOW_OWNER)
+
+#define FRAMEHOOK_OPT_SHOW_VIDEO "--enable-show-video"
+#define FRAMEHOOK_OPT_SHOW_VIDEO_LEN strlen(FRAMEHOOK_OPT_SHOW_VIDEO)
+
+#define FRAMEHOOK_OPT_OPAQUE_COMMENT "--enable-opaque-comment"
+#define FRAMEHOOK_OPT_OPAQUE_COMMENT_LEN strlen(FRAMEHOOK_OPT_OPAQUE_COMMENT)
+
+#endif /*FRAMEHOOK_H_*/
-#ifndef HEADER_H_\r
-#define HEADER_H_\r
-\r
-\r
-\r
-#endif /*HEADER_H_*/\r
+#ifndef HEADER_H_
+#define HEADER_H_
+
+
+
+#endif /*HEADER_H_*/
-\r
-#include <SDL/SDL.h>\r
-#include <SDL/SDL_ttf.h>\r
-#include <stdio.h>\r
-#include "main.h"\r
-#include "mydef.h"\r
-#include "nicodef.h"\r
-#include "process.h"\r
-/**\r
- * \83\89\83C\83u\83\89\83\8a\8f\89\8aú\89»\r
- */\r
-int init(FILE* log){\r
- fputs("[main/init]initializing libs...\n",log);\r
- //SDL\r
- if(SDL_Init(SDL_INIT_VIDEO)>=0){\r
- fputs("[main/init]initialized SDL.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize SDL.\n",log);\r
- return FALSE;\r
- }\r
- //SDL_ttf\r
- if(TTF_Init() >= 0){\r
- fputs("[main/init]initialized SDL_ttf.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize SDL_ttf.\n",log);\r
- return FALSE;\r
- }\r
- fputs("[main/init]initialized libs.\n",log);\r
- return TRUE;\r
-}\r
-/*\r
- * \83f\81[\83^\82Ì\8f\89\8aú\89»\r
- */\r
-int initData(DATA* data,FILE* log,const SETTING* setting){\r
- int i;\r
- data->user_comment.common = data;\r
- data->owner_comment.common = data;\r
- data->user_comment.enable = setting->enable_user_comment;\r
- data->owner_comment.enable = setting->enable_owner_comment;\r
- data->user_comment.opaque_comment = setting->opaque_comment;\r
- data->owner_comment.opaque_comment = 1; // \83I\81[\83i\83R\83\81\83\93\83g\82Í\8fí\82É\95s\93§\96¾\r
- data->log = log;\r
- data->fontsize_fix = setting->fontsize_fix;\r
- data->show_video = setting->show_video;\r
- data->shadow_kind = setting->shadow_kind;\r
- data->process_first_called=FALSE;\r
- data->video_length = setting->video_length;\r
- fputs("[main/init]initializing context...\n",log);\r
- //\83t\83H\83\93\83g\r
- TTF_Font** font = data->font;\r
- const char* font_path = setting->font_path;\r
- const int font_index = setting->font_index;\r
- for(i=0;i<CMD_FONT_MAX;i++){\r
- int fontsize = COMMENT_FONT_SIZE[i];\r
- if(setting->fontsize_fix){\r
- fontsize <<= 1;\r
- }\r
- font[i] = TTF_OpenFontIndex(font_path,fontsize,font_index);\r
- if(font[i] == NULL){\r
- fprintf(log,"[main/init]failed to load font:%s index:[%d].\n",font_path,font_index);\r
- //0\82Å\82à\8e\8e\82µ\82Ä\82Ý\82é\81B\r
- fputs("[main/init]retrying to open font at index:0...",log);\r
- font[i] = TTF_OpenFontIndex(font_path,fontsize,0);\r
- if(font[i] == NULL){\r
- fputs("failed.\n",log);\r
- return FALSE;\r
- }else{\r
- fputs("success.\n",log);\r
- }\r
- }\r
- TTF_SetFontStyle(font[i],TTF_STYLE_BOLD);\r
- }\r
- fputs("[main/init]initialized font.\n",log);\r
- /*\r
- * \83\86\81[\83U\83R\83\81\83\93\83g\r
- */\r
- if(data->user_comment.enable){\r
- fputs("[main/init]User Comment is enabled.\n",log);\r
- //\83R\83\81\83\93\83g\83f\81[\83^\r
- if(initChat(log,&data->user_comment.chat,setting->data_user_path,&data->user_comment.slot,data->video_length)){\r
- fputs("[main/init]initialized comment.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize comment.",log);\r
- return FALSE;\r
- }\r
- //\83R\83\81\83\93\83g\83X\83\8d\83b\83g\r
- if(initChatSlot(log,&data->user_comment.slot,setting->user_slot_max,&data->user_comment.chat)){\r
- fputs("[main/init]initialized comment slot.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize comment slot.",log);\r
- return FALSE;\r
- }\r
- }\r
- /*\r
- * \83I\81[\83i\83R\83\81\83\93\83g\r
- */\r
- if(data->owner_comment.enable){\r
- fputs("[main/init]Owner Comment is enabled.\n",log);\r
- //\83R\83\81\83\93\83g\83f\81[\83^\r
- if(initChat(log,&data->owner_comment.chat,setting->data_owner_path,&data->owner_comment.slot,data->video_length)){\r
- fputs("[main/init]initialized comment.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize comment.",log);\r
- return FALSE;\r
- }\r
- //\83R\83\81\83\93\83g\83X\83\8d\83b\83g\r
- // TODO \82Æ\82è\82 \82¦\82¸\8dÅ\91å\90\94\82Í1024\82É\82µ\82Ä\82¨\82\82ª...\r
- if(initChatSlot(log,&data->owner_comment.slot,1024,&data->owner_comment.chat)){\r
- fputs("[main/init]initialized comment slot.\n",log);\r
- }else{\r
- fputs("[main/init]failed to initialize comment slot.",log);\r
- return FALSE;\r
- }\r
- }\r
- \r
- //\8fI\82í\82è\81B\r
- fputs("[main/init]initialized context.\n",log);\r
- return TRUE;\r
-}\r
-/*\r
- * \89f\91\9c\82Ì\95Ï\8a·\r
- */\r
-int main_process(DATA* data,SDL_Surface* surf,const int now_vpos){\r
- FILE* log = data->log;\r
- if(!data->process_first_called){\r
- fprintf(log,"[main/process]screen size is %dx%d.\n",surf->w,surf->h);\r
- fflush(log);\r
- }\r
- /*\83t\83B\83\8b\83^\82ð\82©\82¯\82é*/\r
- if(process(data,surf,now_vpos)){\r
- }\r
- fflush(log);\r
- /*\95Ï\8a·\82µ\82½\89æ\91\9c\82ð\8c©\82¹\82é\81B*/\r
- if(data->show_video){\r
- if(!data->process_first_called){\r
- data->screen = SDL_SetVideoMode(surf->w, surf->h, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);\r
- if(data->screen == NULL){\r
- fputs("[main/process]failed to initialize screen.\n",log);\r
- fflush(log);\r
- return FALSE;\r
- }\r
- }\r
- SDL_BlitSurface(surf,NULL,data->screen,NULL);\r
- SDL_Flip(data->screen);\r
- SDL_Event event;\r
- while(SDL_PollEvent(&event)){}\r
- }\r
- //\88ê\89ñ\96Ú\88È\8d~\82ÍTRUE\82É\82È\82é\81B\r
- data->process_first_called=TRUE;\r
- fflush(log);\r
- return TRUE;\r
-}\r
-/*\r
- * \83f\81[\83^\82Ì\83N\83\8d\81[\83Y\r
- */\r
-int closeData(DATA* data){\r
- int i;\r
- //\83\86\81[\83U\83R\83\81\83\93\83g\82ª\97L\8cø\82È\82ç\8aJ\95ú\r
- if(data->user_comment.enable){\r
- closeChat(&data->user_comment.chat);\r
- closeChatSlot(&data->user_comment.slot);\r
- }\r
- //\83I\81[\83i\83R\83\81\83\93\83g\82ª\97L\8cø\82È\82ç\8aJ\95ú\r
- if(data->owner_comment.enable){\r
- closeChat(&data->owner_comment.chat);\r
- closeChatSlot(&data->owner_comment.slot);\r
- }\r
- //\83t\83H\83\93\83g\8aJ\95ú\r
- for(i=0;i<CMD_FONT_MAX;i++){\r
- TTF_CloseFont(data->font[i]);\r
- }\r
- return TRUE;\r
-}\r
-\r
-/*\r
- * \83\89\83C\83u\83\89\83\8a\83V\83\83\83b\83g\83_\83E\83\93\r
- */\r
-int close(){\r
- //SDL\82ð\83V\83\83\83b\83g\83_\83E\83\93\r
- SDL_Quit();\r
- //\93¯\82¶\82TTF\82ð\83V\83\83\83b\83g\83_\83E\83\93\r
- TTF_Quit();\r
- return TRUE;\r
-}\r
+
+#include <SDL/SDL.h>
+#include <SDL/SDL_ttf.h>
+#include <stdio.h>
+#include "main.h"
+#include "mydef.h"
+#include "nicodef.h"
+#include "process.h"
+/**
+ * ライブラリ初期化
+ */
+int init(FILE* log){
+ fputs("[main/init]initializing libs...\n",log);
+ //SDL
+ if(SDL_Init(SDL_INIT_VIDEO)>=0){
+ fputs("[main/init]initialized SDL.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize SDL.\n",log);
+ return FALSE;
+ }
+ //SDL_ttf
+ if(TTF_Init() >= 0){
+ fputs("[main/init]initialized SDL_ttf.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize SDL_ttf.\n",log);
+ return FALSE;
+ }
+ fputs("[main/init]initialized libs.\n",log);
+ return TRUE;
+}
+/*
+ * データの初期化
+ */
+int initData(DATA* data,FILE* log,const SETTING* setting){
+ int i;
+ data->user_comment.common = data;
+ data->owner_comment.common = data;
+ data->user_comment.enable = setting->enable_user_comment;
+ data->owner_comment.enable = setting->enable_owner_comment;
+ data->user_comment.opaque_comment = setting->opaque_comment;
+ data->owner_comment.opaque_comment = 1; // オーナコメントは常に不透明
+ data->log = log;
+ data->fontsize_fix = setting->fontsize_fix;
+ data->show_video = setting->show_video;
+ data->shadow_kind = setting->shadow_kind;
+ data->process_first_called=FALSE;
+ data->video_length = setting->video_length;
+ fputs("[main/init]initializing context...\n",log);
+ //フォント
+ TTF_Font** font = data->font;
+ const char* font_path = setting->font_path;
+ const int font_index = setting->font_index;
+ for(i=0;i<CMD_FONT_MAX;i++){
+ int fontsize = COMMENT_FONT_SIZE[i];
+ if(setting->fontsize_fix){
+ fontsize <<= 1;
+ }
+ font[i] = TTF_OpenFontIndex(font_path,fontsize,font_index);
+ if(font[i] == NULL){
+ fprintf(log,"[main/init]failed to load font:%s index:[%d].\n",font_path,font_index);
+ //0でも試してみる。
+ fputs("[main/init]retrying to open font at index:0...",log);
+ font[i] = TTF_OpenFontIndex(font_path,fontsize,0);
+ if(font[i] == NULL){
+ fputs("failed.\n",log);
+ return FALSE;
+ }else{
+ fputs("success.\n",log);
+ }
+ }
+ TTF_SetFontStyle(font[i],TTF_STYLE_BOLD);
+ }
+ fputs("[main/init]initialized font.\n",log);
+ /*
+ * ユーザコメント
+ */
+ if(data->user_comment.enable){
+ fputs("[main/init]User Comment is enabled.\n",log);
+ //コメントデータ
+ if(initChat(log,&data->user_comment.chat,setting->data_user_path,&data->user_comment.slot,data->video_length)){
+ fputs("[main/init]initialized comment.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize comment.",log);
+ return FALSE;
+ }
+ //コメントスロット
+ if(initChatSlot(log,&data->user_comment.slot,setting->user_slot_max,&data->user_comment.chat)){
+ fputs("[main/init]initialized comment slot.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize comment slot.",log);
+ return FALSE;
+ }
+ }
+ /*
+ * オーナコメント
+ */
+ if(data->owner_comment.enable){
+ fputs("[main/init]Owner Comment is enabled.\n",log);
+ //コメントデータ
+ if(initChat(log,&data->owner_comment.chat,setting->data_owner_path,&data->owner_comment.slot,data->video_length)){
+ fputs("[main/init]initialized comment.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize comment.",log);
+ return FALSE;
+ }
+ //コメントスロット
+ // TODO とりあえず最大数は1024にしておくが...
+ if(initChatSlot(log,&data->owner_comment.slot,1024,&data->owner_comment.chat)){
+ fputs("[main/init]initialized comment slot.\n",log);
+ }else{
+ fputs("[main/init]failed to initialize comment slot.",log);
+ return FALSE;
+ }
+ }
+
+ //終わり。
+ fputs("[main/init]initialized context.\n",log);
+ return TRUE;
+}
+/*
+ * 映像の変換
+ */
+int main_process(DATA* data,SDL_Surface* surf,const int now_vpos){
+ FILE* log = data->log;
+ if(!data->process_first_called){
+ fprintf(log,"[main/process]screen size is %dx%d.\n",surf->w,surf->h);
+ fflush(log);
+ }
+ /*フィルタをかける*/
+ if(process(data,surf,now_vpos)){
+ }
+ fflush(log);
+ /*変換した画像を見せる。*/
+ if(data->show_video){
+ if(!data->process_first_called){
+ data->screen = SDL_SetVideoMode(surf->w, surf->h, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
+ if(data->screen == NULL){
+ fputs("[main/process]failed to initialize screen.\n",log);
+ fflush(log);
+ return FALSE;
+ }
+ }
+ SDL_BlitSurface(surf,NULL,data->screen,NULL);
+ SDL_Flip(data->screen);
+ SDL_Event event;
+ while(SDL_PollEvent(&event)){}
+ }
+ //一回目以降はTRUEになる。
+ data->process_first_called=TRUE;
+ fflush(log);
+ return TRUE;
+}
+/*
+ * データのクローズ
+ */
+int closeData(DATA* data){
+ int i;
+ //ユーザコメントが有効なら開放
+ if(data->user_comment.enable){
+ closeChat(&data->user_comment.chat);
+ closeChatSlot(&data->user_comment.slot);
+ }
+ //オーナコメントが有効なら開放
+ if(data->owner_comment.enable){
+ closeChat(&data->owner_comment.chat);
+ closeChatSlot(&data->owner_comment.slot);
+ }
+ //フォント開放
+ for(i=0;i<CMD_FONT_MAX;i++){
+ TTF_CloseFont(data->font[i]);
+ }
+ return TRUE;
+}
+
+/*
+ * ライブラリシャットダウン
+ */
+int close(){
+ //SDLをシャットダウン
+ SDL_Quit();
+ //同じくTTFをシャットダウン
+ TTF_Quit();
+ return TRUE;
+}
-#ifndef MAIN_H_\r
-#define MAIN_H_\r
-#include <SDL/SDL.h>\r
-#include <SDL/SDL_ttf.h>\r
-#include "nicodef.h"\r
-#include "struct_define.h"\r
-#include "chat/chat.h"\r
-#include "chat/chat_slot.h"\r
-\r
-struct COMMDATA {\r
- int enable;\r
- CHAT chat;\r
- CHAT_SLOT slot;\r
- int opaque_comment;\r
- DATA* common;\r
-};\r
-\r
-struct DATA{\r
- FILE* log;\r
- TTF_Font* font[CMD_FONT_MAX];\r
- SDL_Surface* screen;\r
-// /*\82»\82ê\82¼\82ê\82Ì\83R\83\81\83\93\83g\82É\89\9e\82¶\82½\83f\81[\83^*/\r
-// //\83\86\81[\83U\83R\83\81\83\93\83g\r
-// int enable_user_comment;\r
-// CHAT chat;\r
-// CHAT_SLOT slot;\r
-// //\93\8a\8de\8eÒ\83R\83\81\83\93\83g\r
-// int enable_owner_comment;\r
- COMMDATA user_comment;\r
- COMMDATA owner_comment;\r
- \r
- //\88ê\94Ê\93I\82È\83f\81[\83^\r
- int shadow_kind;\r
- int show_video;\r
- int fontsize_fix;\r
- int process_first_called;\r
- int video_length;\r
-};\r
-\r
-typedef struct SETTING{\r
- const char* data_user_path;\r
- const char* data_owner_path;\r
- const char* font_path;\r
- int video_length;\r
- int font_index;\r
- int user_slot_max;\r
- int owner_slot_max;\r
- int shadow_kind;\r
- /*TRUE OR FALSE*/\r
- int enable_user_comment;\r
- int enable_owner_comment;\r
- int show_video;\r
- int fontsize_fix;\r
- int opaque_comment;\r
-}SETTING;\r
-\r
-int init(FILE* log);\r
-int initData(DATA* data,FILE* log,const SETTING* setting);\r
-int main_process(DATA* data,SDL_Surface* surf,const int now_vpos);\r
-int closeData(DATA* data);\r
-int close();\r
-\r
-#endif /*MAIN_H_*/\r
+#ifndef MAIN_H_
+#define MAIN_H_
+#include <SDL/SDL.h>
+#include <SDL/SDL_ttf.h>
+#include "nicodef.h"
+#include "struct_define.h"
+#include "chat/chat.h"
+#include "chat/chat_slot.h"
+
+struct COMMDATA {
+ int enable;
+ CHAT chat;
+ CHAT_SLOT slot;
+ int opaque_comment;
+ DATA* common;
+};
+
+struct DATA{
+ FILE* log;
+ TTF_Font* font[CMD_FONT_MAX];
+ SDL_Surface* screen;
+// /*それぞれのコメントに応じたデータ*/
+// //ユーザコメント
+// int enable_user_comment;
+// CHAT chat;
+// CHAT_SLOT slot;
+// //投稿者コメント
+// int enable_owner_comment;
+ COMMDATA user_comment;
+ COMMDATA owner_comment;
+
+ //一般的なデータ
+ int shadow_kind;
+ int show_video;
+ int fontsize_fix;
+ int process_first_called;
+ int video_length;
+};
+
+typedef struct SETTING{
+ const char* data_user_path;
+ const char* data_owner_path;
+ const char* font_path;
+ int video_length;
+ int font_index;
+ int user_slot_max;
+ int owner_slot_max;
+ int shadow_kind;
+ /*TRUE OR FALSE*/
+ int enable_user_comment;
+ int enable_owner_comment;
+ int show_video;
+ int fontsize_fix;
+ int opaque_comment;
+}SETTING;
+
+int init(FILE* log);
+int initData(DATA* data,FILE* log,const SETTING* setting);
+int main_process(DATA* data,SDL_Surface* surf,const int now_vpos);
+int closeData(DATA* data);
+int close();
+
+#endif /*MAIN_H_*/
-#ifndef MYDEF_H_\r
-#define MYDEF_H_\r
-\r
-/*\92Ç\89ÁDefine*/\r
-\r
-#define MAX(a,b) (((a)>(b))?(a):(b))\r
-#define MIN(a,b) (((a)<(b))?(a):(b))\r
-\r
-#define INTEGER_MAX INT32_MAX\r
-#define INTEGER_MIN INT32_MIN\r
-\r
-#define false (1!=1)\r
-#define FALSE false\r
-\r
-#define true (1==1)\r
-#define TRUE true\r
-\r
-#define null NULL\r
-\r
-#endif /*MYDEF_H_*/\r
+#ifndef MYDEF_H_
+#define MYDEF_H_
+
+/*追加Define*/
+
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#define MIN(a,b) (((a)<(b))?(a):(b))
+
+#define INTEGER_MAX INT32_MAX
+#define INTEGER_MIN INT32_MIN
+
+#define false (1!=1)
+#define FALSE false
+
+#define true (1==1)
+#define TRUE true
+
+#define null NULL
+
+#endif /*MYDEF_H_*/
<c-extensions>c</c-extensions>
<cpp-extensions/>
<header-extensions>h</header-extensions>
- <sourceEncoding>windows-31j</sourceEncoding>
+ <sourceEncoding>UTF-8</sourceEncoding>
<make-dep-projects/>
</data>
</configuration>
-#ifndef NICODEF_H_\r
-#define NICODEF_H_\r
-#include <SDL/SDL_ttf.h>\r
-\r
-//\92è\8b`\r
-#define NICO_WIDTH 512\r
-#define NICO_HEIGHT 384\r
-\r
-\r
-#define VPOS_FACTOR 100 //\91½\95ª\8cW\90\94\82Ì\88Ó\96¡\82Å\82Í\81E\81E\81E\82â\82Í\82è1/100\82Å\8bL\98^\82µ\82Ä\82é\82Á\82Û\82¢\r
-#define TEXT_AHEAD_SEC (1 * VPOS_FACTOR)\r
-#define TEXT_SHOW_SEC (4 * VPOS_FACTOR)\r
-#define TEXT_HEIGHT 22\r
-\r
-#define CMD_LOC_DEF (0)\r
-#define CMD_LOC_TOP (1)\r
-#define CMD_LOC_BOTTOM (2)\r
-\r
-#define CMD_FONT_MAX 3\r
-#define CMD_FONT_DEF 0\r
-#define CMD_FONT_BIG 1\r
-#define CMD_FONT_SMALL 2\r
-\r
-static const int COMMENT_FONT_SIZE[CMD_FONT_MAX] = {\r
- 24,//DEF\r
- 39,//BIG\r
- 15,//SMALL\r
-};\r
-\r
-#define CMD_COLOR_MAX 17\r
-#define CMD_COLOR_DEF 0\r
-#define CMD_COLOR_RED 1\r
-#define CMD_COLOR_ORANGE 2\r
-#define CMD_COLOR_YELLOW 3\r
-#define CMD_COLOR_PINK 4\r
-#define CMD_COLOR_BLUE 5\r
-#define CMD_COLOR_PURPLE 6\r
-#define CMD_COLOR_CYAN 7\r
-#define CMD_COLOR_GREEN 8\r
-#define CMD_COLOR_NICOWHITE 9\r
-#define CMD_COLOR_MARINEBLUE 10\r
-#define CMD_COLOR_MADYELLOW 11\r
-#define CMD_COLOR_PASSIONORANGE 12\r
-#define CMD_COLOR_NOBLEVIOLET 13\r
-#define CMD_COLOR_ELEMENTALGREEN 14\r
-#define CMD_COLOR_TRUERED 15\r
-#define CMD_COLOR_BLACK 16\r
-\r
-static const SDL_Color COMMENT_COLOR[CMD_COLOR_MAX] = {\r
- {0xff,0xff,0xff,0x00},//DEF\r
- {0xff,0x00,0x00,0x00},//RED\r
- {0xff,0xC0,0x00,0x00},//ORANGE\r
- {0xff,0xff,0x00,0x00},//YELLOW\r
- {0xff,0x80,0x80,0x00},//PINK\r
- {0x00,0x00,0xff,0x00},//BLUE\r
- {0xc0,0x00,0xff,0x00},//PURPLE\r
- {0x00,0xff,0xff,0x00},//CYAN\r
- {0x00,0xff,0x00,0x00},//GREEN\r
- /*\83v\83\8c\83~\83A\90ê\97p*/\r
- {0xCC,0xCC,0x99,0x00},//NICOWHITE\r
- {0x33,0xff,0xFC,0x00},//MARINEBLUE\r
- {0x99,0x99,0x00,0x00},//MADYELLOW\r
- {0xFF,0x66,0x00,0x00},//PASSIONORANGE\r
- {0x66,0x33,0xCC,0x00},//NOBLEVIOLET\r
- {0x00,0xCC,0x66,0x00},//ELEMENTALGREEN\r
- {0xCC,0x00,0x33,0x00},//TRUERED\r
- {0x00,0x00,0x00,0x00},//BLACK\r
-\r
-};\r
-\r
-#endif /*NICODEF_H_*/\r
+#ifndef NICODEF_H_
+#define NICODEF_H_
+#include <SDL/SDL_ttf.h>
+
+//定義
+#define NICO_WIDTH 512
+#define NICO_HEIGHT 384
+
+
+#define VPOS_FACTOR 100 //多分係数の意味では・・・やはり1/100で記録してるっぽい
+#define TEXT_AHEAD_SEC (1 * VPOS_FACTOR)
+#define TEXT_SHOW_SEC (4 * VPOS_FACTOR)
+#define TEXT_HEIGHT 22
+
+#define CMD_LOC_DEF (0)
+#define CMD_LOC_TOP (1)
+#define CMD_LOC_BOTTOM (2)
+
+#define CMD_FONT_MAX 3
+#define CMD_FONT_DEF 0
+#define CMD_FONT_BIG 1
+#define CMD_FONT_SMALL 2
+
+static const int COMMENT_FONT_SIZE[CMD_FONT_MAX] = {
+ 24,//DEF
+ 39,//BIG
+ 15,//SMALL
+};
+
+#define CMD_COLOR_MAX 17
+#define CMD_COLOR_DEF 0
+#define CMD_COLOR_RED 1
+#define CMD_COLOR_ORANGE 2
+#define CMD_COLOR_YELLOW 3
+#define CMD_COLOR_PINK 4
+#define CMD_COLOR_BLUE 5
+#define CMD_COLOR_PURPLE 6
+#define CMD_COLOR_CYAN 7
+#define CMD_COLOR_GREEN 8
+#define CMD_COLOR_NICOWHITE 9
+#define CMD_COLOR_MARINEBLUE 10
+#define CMD_COLOR_MADYELLOW 11
+#define CMD_COLOR_PASSIONORANGE 12
+#define CMD_COLOR_NOBLEVIOLET 13
+#define CMD_COLOR_ELEMENTALGREEN 14
+#define CMD_COLOR_TRUERED 15
+#define CMD_COLOR_BLACK 16
+
+static const SDL_Color COMMENT_COLOR[CMD_COLOR_MAX] = {
+ {0xff,0xff,0xff,0x00},//DEF
+ {0xff,0x00,0x00,0x00},//RED
+ {0xff,0xC0,0x00,0x00},//ORANGE
+ {0xff,0xff,0x00,0x00},//YELLOW
+ {0xff,0x80,0x80,0x00},//PINK
+ {0x00,0x00,0xff,0x00},//BLUE
+ {0xc0,0x00,0xff,0x00},//PURPLE
+ {0x00,0xff,0xff,0x00},//CYAN
+ {0x00,0xff,0x00,0x00},//GREEN
+ /*プレミア専用*/
+ {0xCC,0xCC,0x99,0x00},//NICOWHITE
+ {0x33,0xff,0xFC,0x00},//MARINEBLUE
+ {0x99,0x99,0x00,0x00},//MADYELLOW
+ {0xFF,0x66,0x00,0x00},//PASSIONORANGE
+ {0x66,0x33,0xCC,0x00},//NOBLEVIOLET
+ {0x00,0xCC,0x66,0x00},//ELEMENTALGREEN
+ {0xCC,0x00,0x33,0x00},//TRUERED
+ {0x00,0x00,0x00,0x00},//BLACK
+
+};
+
+#endif /*NICODEF_H_*/
-#include "mydef.h"\r
-#include "process.h"\r
-#include "chat/process_chat.h"\r
-#include "chat/chat.h"\r
-#include "chat/chat_slot.h"\r
-\r
-//\83v\83\8d\83Z\83X\r
-int process(DATA* data,SDL_Surface* surf,const int now_vpos){\r
- //\83\86\81[\83U\83R\83\81\83\93\83g\r
- if(data->user_comment.enable){\r
- if(!chat_process(&data->user_comment,surf,now_vpos)){\r
- fputs("[process/process]failed to process comment.\n",data->log);\r
- return FALSE;\r
- }\r
- }\r
- //\83I\81[\83i\83R\83\81\83\93\83g\r
- if(data->owner_comment.enable){\r
- if(!chat_process(&data->owner_comment,surf,now_vpos)){\r
- fputs("[process/process]failed to process comment.\n",data->log);\r
- return FALSE;\r
- }\r
- }\r
- return TRUE;\r
-}\r
-\r
+#include "mydef.h"
+#include "process.h"
+#include "chat/process_chat.h"
+#include "chat/chat.h"
+#include "chat/chat_slot.h"
+
+//プロセス
+int process(DATA* data,SDL_Surface* surf,const int now_vpos){
+ //ユーザコメント
+ if(data->user_comment.enable){
+ if(!chat_process(&data->user_comment,surf,now_vpos)){
+ fputs("[process/process]failed to process comment.\n",data->log);
+ return FALSE;
+ }
+ }
+ //オーナコメント
+ if(data->owner_comment.enable){
+ if(!chat_process(&data->owner_comment,surf,now_vpos)){
+ fputs("[process/process]failed to process comment.\n",data->log);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
-#ifndef PROCESS_H_\r
-#define PROCESS_H_\r
-#include <SDL/SDL.h>\r
-#include "main.h"\r
-int process(DATA* data,SDL_Surface* surf,const int now_vpos);\r
-\r
-#endif /*PROCESS_H_*/\r
+#ifndef PROCESS_H_
+#define PROCESS_H_
+#include <SDL/SDL.h>
+#include "main.h"
+int process(DATA* data,SDL_Surface* surf,const int now_vpos);
+
+#endif /*PROCESS_H_*/
-#ifndef STRUCT_DEFINE_H_\r
-#define STRUCT_DEFINE_H_\r
-\r
-typedef struct DATA DATA;\r
-typedef struct COMMDATA COMMDATA;\r
-typedef struct CHAT CHAT;\r
-typedef struct CHAT_ITEM CHAT_ITEM;\r
-typedef struct CHAT_SLOT CHAT_SLOT;\r
-typedef struct CHAT_SLOT_ITEM CHAT_SLOT_ITEM;\r
-typedef struct CHAT_SET CHAT_SET;\r
-\r
-#endif /*STRUCT_DEFINE_H_*/\r
+#ifndef STRUCT_DEFINE_H_
+#define STRUCT_DEFINE_H_
+
+typedef struct DATA DATA;
+typedef struct COMMDATA COMMDATA;
+typedef struct CHAT CHAT;
+typedef struct CHAT_ITEM CHAT_ITEM;
+typedef struct CHAT_SLOT CHAT_SLOT;
+typedef struct CHAT_SLOT_ITEM CHAT_SLOT_ITEM;
+typedef struct CHAT_SET CHAT_SET;
+
+#endif /*STRUCT_DEFINE_H_*/
-#include "mydef.h"\r
-#include "util.h"\r
-\r
-#include <stdlib.h>\r
-/*\97\90\90\94*/\r
-int rnd(){\r
- static int Seed = 23573;\r
- int result;\r
- Seed *= 214013;\r
- Seed += 2531011; // ->\8e\9f\82É\8cÄ\82Ñ\8fo\82³\82ê\82½\82Æ\82«\82Ìseed\82É\8eg\82¤\r
- result = Seed;\r
- result = result >> 0x10;\r
- return result;\r
-}\r
+#include "mydef.h"
+#include "util.h"
+
+#include <stdlib.h>
+/*乱数*/
+int rnd(){
+ static int Seed = 23573;
+ int result;
+ Seed *= 214013;
+ Seed += 2531011; // ->次に呼び出されたときのseedに使う
+ result = Seed;
+ result = result >> 0x10;
+ return result;
+}
-#ifndef UTIL_H_\r
-#define UTIL_H_\r
-\r
-int rnd();\r
-\r
-#endif /*UTIL_H_*/\r
+#ifndef UTIL_H_
+#define UTIL_H_
+
+int rnd();
+
+#endif /*UTIL_H_*/