/****************************************************************************** Close output file (if open), and exit. ******************************************************************************/ static void RGB2GIF(bool OneFileFlag, int NumFiles, char *FileName, int ExpNumOfColors, int Width, int Height) { int ColorMapSize; GifByteType *RedBuffer = NULL, *GreenBuffer = NULL, *BlueBuffer = NULL, *OutputBuffer = NULL; ColorMapObject *OutputColorMap = NULL; ColorMapSize = 1 << ExpNumOfColors; if (NumFiles == 1) { LoadRGB(FileName, OneFileFlag, &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height); } else { LoadRGB(NULL, OneFileFlag, &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height); } if ((OutputColorMap = GifMakeMapObject(ColorMapSize, NULL)) == NULL || (OutputBuffer = (GifByteType *) malloc(Width * Height * sizeof(GifByteType))) == NULL) GIF_EXIT("Failed to allocate memory required, aborted."); if (GifQuantizeBuffer(Width, Height, &ColorMapSize, RedBuffer, GreenBuffer, BlueBuffer, OutputBuffer, OutputColorMap->Colors) == GIF_ERROR) exit(EXIT_FAILURE); free((char *) RedBuffer); free((char *) GreenBuffer); free((char *) BlueBuffer); SaveGif(OutputBuffer, Width, Height, ExpNumOfColors, OutputColorMap); }
/*====================================================================== Function: SetupTransition Input: pointer to start of RGB sequence pointer to (R,G,B) target tuple Output: pointer to next (R,G,B) target tuple Description: Set up transition from current color to target color. If target == NULL the (R,G,B) tuple of the sequence start is loaded. Tested: no ======================================================================*/ rgbt_t* SetupTransition(rgbt_t* seq, rgbt_t* target) { uint8_t t; if (target == NULL) { LoadRGB(pwm, seq); // load sequence start values target = seq; } else { LoadRGB(pwm_target, target); // load transition target interpolatorSetup(pwm, pwm_target); t = GetTransTime(target); trans_time = t; trans_timer = t; // start transition timer } target++; // next tuple t = GetTransTime(target); if (t == 0) { // end of sequence? target = seq; // -> then start from begin of sequence } return(target); }
//========================================== // 関数 : LoadBMPFromFilePointer // 目的 : 受け取ったファイルポインタが示すBMPファイルのロード // 戻り値: TImageInfo * ※読み込みに失敗した場合はNULLを返す // 引数 : FILE * pf ファイルポインタ //========================================== TImageInfo * LoadBMPFromFilePointer(FILE * pf) { TImageInfo * pBmp; // BMP用構造体のポインタ int nWidth; // 横幅情報受け取り用 int nHeight; // 縦幅情報受け取り用 unsigned short wBitCount; // ビット数情報受け取り用 unsigned long dwCompression; // 圧縮情報受け取り用 bool nResult; // 処理結果受け取り用 nResult = LoadHeader(pf); if (nResult == false) return NULL; // ファイルヘッダ部の読み込みに失敗した場合、処理を終了して関数から脱出する // 情報ヘッダ部の読み込みを行い、横幅・縦幅・ビット数・圧縮情報 のデータを受け取る nResult = LoadInfo(pf, &nWidth, &nHeight, &wBitCount, &dwCompression); if (nResult == false) return NULL; // 情報ヘッダ部の読み込みに失敗した場合、処理を終了して関数から脱出する pBmp = (TImageInfo *)malloc(sizeof(TImageInfo)); // TImageInfo型変数を動的確保する pBmp->nWidth = nWidth; // 先ほど取得した横幅情報を代入する pBmp->nHeight = nHeight; // 先ほど取得した縦幅情報を代入する pBmp->pbyPixels = NULL; // ピクセル情報を入れるポインタはNULLで初期化しておく if (wBitCount != 24) // 24bit形式でなかった場合 { pBmp->bEffective = false; // 対応できない形式であるため、フラグを折って関数から脱出する return pBmp; } if (dwCompression != 0) // 圧縮されている場合 { pBmp->bEffective = false; // 対応できない形式であるため、フラグを折って関数から脱出する return pBmp; } pBmp->bEffective = true; // 以上の条件をクリアしたということは対応できる形式であるため、フラグを立てておく pBmp->pbyPixels = LoadRGB(pf, pBmp->nWidth, pBmp->nHeight); // RGB情報を読み込む if (pBmp->pbyPixels == NULL) // RGB情報の読み込みに失敗した場合 { free(pBmp); // TImageInfo用に確保したメモリを解放する return NULL; } return pBmp; }