BOOL CARIB8CharDecode::C1( const BYTE* pbSrc, DWORD* pdwReadSize ) { if( pbSrc == NULL || pdwReadSize == NULL ){ return FALSE; } DWORD dwReadSize = 0; DWORD dwReadBuff = 0; BOOL bRet = TRUE; CheckModify(); switch(pbSrc[0]){ case 0x89: //MSZ 半角指定 m_emStrSize = STR_MEDIUM; dwReadSize = 1; break; case 0x8A: //NSZ 全角指定 m_emStrSize = STR_NORMAL; dwReadSize = 1; break; case 0x80: //BKF 文字黒 m_bCharColorIndex = (m_bDefPalette<<4) | 0x00; dwReadSize = 1; break; case 0x81: //RDF 文字赤 m_bCharColorIndex = (m_bDefPalette<<4) | 0x01; dwReadSize = 1; break; case 0x82: //GRF 文字緑 m_bCharColorIndex = (m_bDefPalette<<4) | 0x02; dwReadSize = 1; break; case 0x83: //YLF 文字黄 m_bCharColorIndex = (m_bDefPalette<<4) | 0x03; dwReadSize = 1; break; case 0x84: //BLF 文字青 m_bCharColorIndex = (m_bDefPalette<<4) | 0x04; dwReadSize = 1; break; case 0x85: //MGF 文字マゼンタ m_bCharColorIndex = (m_bDefPalette<<4) | 0x05; dwReadSize = 1; break; case 0x86: //CNF 文字シアン m_bCharColorIndex = (m_bDefPalette<<4) | 0x06; dwReadSize = 1; break; case 0x87: //WHF 文字白 m_bCharColorIndex = (m_bDefPalette<<4) | 0x07; dwReadSize = 1; break; case 0x88: //SSZ 小型サイズ m_emStrSize = STR_SMALL; dwReadSize = 1; break; case 0x8B: //SZX 指定サイズ if( pbSrc[1] == 0x60 ){ m_emStrSize = STR_MICRO; }else if( pbSrc[1] == 0x41 ){ m_emStrSize = STR_HIGH_W; }else if( pbSrc[1] == 0x44 ){ m_emStrSize = STR_WIDTH_W; }else if( pbSrc[1] == 0x45 ){ m_emStrSize = STR_W; }else if( pbSrc[1] == 0x6B ){ m_emStrSize = STR_SPECIAL_1; }else if( pbSrc[1] == 0x64 ){ m_emStrSize = STR_SPECIAL_2; } dwReadSize = 2; break; case 0x90: //COL 色指定 if( pbSrc[1] == 0x20 ){ dwReadSize = 3; m_bDefPalette = pbSrc[2]&0x0F; }else{ switch(pbSrc[1]&0xF0){ case 0x40: m_bCharColorIndex = pbSrc[1]&0x0F; break; case 0x50: m_bBackColorIndex = pbSrc[1]&0x0F; break; case 0x60: //未サポート break; case 0x70: //未サポート break; default: break; } dwReadSize = 2; } break; case 0x91: //FLC フラッシング制御 if( pbSrc[1] == 0x40 ){ m_bFlushMode = 1; }else if( pbSrc[1] == 0x47 ){ m_bFlushMode = 2; }else if( pbSrc[1] == 0x4F ){ m_bFlushMode = 0; } dwReadSize = 2; break; case 0x93: //POL パターン極性 //未サポート dwReadSize = 2; break; case 0x94: //WMM 書き込みモード変更 //未サポート dwReadSize = 2; break; case 0x95: //MACRO マクロ定義 //未サポート { DWORD dwCount = 0; do{ dwCount++; }while( pbSrc[dwCount] != 0x4F ); dwReadSize = dwCount; } break; case 0x97: //HLC 囲み制御 //未サポート dwReadSize = 2; break; case 0x98: //RPC 文字繰り返し //未サポート dwReadSize = 2; break; case 0x99: //SPL アンダーライン モザイクの終了 m_bBold = FALSE; bRet = 2; dwReadSize = 1; break; case 0x9A: //STL アンダーライン モザイクの開始 m_bBold = TRUE; dwReadSize = 1; break; case 0x9D: //TIME 時間制御 CheckModify(); if( pbSrc[1] == 0x20 ){ m_dwWaitTime = pbSrc[2]-0x40; dwReadSize = 3; }else{ DWORD dwCount = 0; do{ dwCount++; }while( pbSrc[dwCount] != 0x43 && pbSrc[dwCount] != 0x40 && pbSrc[dwCount] != 0x41 && pbSrc[dwCount] != 0x42 ); dwReadSize = dwCount; } break; case 0x9B: //CSI コントロールシーケンス if( CSI( pbSrc, &dwReadBuff ) == FALSE ){ return FALSE; } dwReadSize = dwReadBuff; break; default: //未サポートの制御コード dwReadSize = 1; break; } *pdwReadSize = dwReadSize; return bRet; }
BOOL CARIB8CharDecode::C1( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ) { if( dwSrcSize == 0 ){ return FALSE; } DWORD dwReadSize = 0; DWORD dwReadBuff = 0; m_bSpacing = FALSE; if( pbSrc[0] != 0x7F ){ //基本的に文字修飾に変更を伴うので本文をリストに移しておく CheckModify(); } switch(pbSrc[0]){ case 0x7F: //DEL 前景色空白 m_strDecode += L'■'; ActivePositionForward(1); m_bSpacing = TRUE; dwReadSize = 1; break; case 0x89: //MSZ 半角指定 m_emStrSize = CP_STR_MEDIUM; dwReadSize = 1; break; case 0x8A: //NSZ 全角指定 m_emStrSize = CP_STR_NORMAL; dwReadSize = 1; break; case 0x80: //BKF 文字黒 m_bCharColorIndex = (m_bDefPalette<<4) | 0x00; dwReadSize = 1; break; case 0x81: //RDF 文字赤 m_bCharColorIndex = (m_bDefPalette<<4) | 0x01; dwReadSize = 1; break; case 0x82: //GRF 文字緑 m_bCharColorIndex = (m_bDefPalette<<4) | 0x02; dwReadSize = 1; break; case 0x83: //YLF 文字黄 m_bCharColorIndex = (m_bDefPalette<<4) | 0x03; dwReadSize = 1; break; case 0x84: //BLF 文字青 m_bCharColorIndex = (m_bDefPalette<<4) | 0x04; dwReadSize = 1; break; case 0x85: //MGF 文字マゼンタ m_bCharColorIndex = (m_bDefPalette<<4) | 0x05; dwReadSize = 1; break; case 0x86: //CNF 文字シアン m_bCharColorIndex = (m_bDefPalette<<4) | 0x06; dwReadSize = 1; break; case 0x87: //WHF 文字白 m_bCharColorIndex = (m_bDefPalette<<4) | 0x07; dwReadSize = 1; break; case 0x88: //SSZ 小型サイズ m_emStrSize = CP_STR_SMALL; dwReadSize = 1; break; case 0x8B: //SZX 指定サイズ if( dwSrcSize < 2 ) return FALSE; if( pbSrc[1] == 0x60 ){ m_emStrSize = CP_STR_MICRO; }else if( pbSrc[1] == 0x41 ){ m_emStrSize = CP_STR_HIGH_W; }else if( pbSrc[1] == 0x44 ){ m_emStrSize = CP_STR_WIDTH_W; }else if( pbSrc[1] == 0x45 ){ m_emStrSize = CP_STR_W; }else if( pbSrc[1] == 0x6B ){ m_emStrSize = CP_STR_SPECIAL_1; }else if( pbSrc[1] == 0x64 ){ m_emStrSize = CP_STR_SPECIAL_2; } dwReadSize = 2; break; case 0x90: //COL 色指定 if( dwSrcSize < 2 ) return FALSE; if( pbSrc[1] == 0x20 ){ if( dwSrcSize < 3 ) return FALSE; dwReadSize = 3; //規定によりパレットは0から127まで使われる m_bDefPalette = pbSrc[2]&0x07; }else{ switch(pbSrc[1]&0xF0){ case 0x40: m_bCharColorIndex = (m_bDefPalette<<4) | (pbSrc[1]&0x0F); break; case 0x50: m_bBackColorIndex = (m_bDefPalette<<4) | (pbSrc[1]&0x0F); break; case 0x60: //未サポート break; case 0x70: //未サポート break; default: break; } dwReadSize = 2; } break; case 0x91: //FLC フラッシング制御 if( dwSrcSize < 2 ) return FALSE; if( pbSrc[1] == 0x40 ){ m_bFlushMode = 1; }else if( pbSrc[1] == 0x47 ){ m_bFlushMode = 2; }else if( pbSrc[1] == 0x4F ){ m_bFlushMode = 0; } dwReadSize = 2; break; case 0x93: //POL パターン極性 //未サポート if( dwSrcSize < 2 ) return FALSE; dwReadSize = 2; break; case 0x94: //WMM 書き込みモード変更 //未サポート if( dwSrcSize < 2 ) return FALSE; dwReadSize = 2; break; case 0x95: //MACRO マクロ定義 //未サポート(MACRO 0x4Fまで送る) dwReadSize = 2; do{ if( ++dwReadSize > dwSrcSize ){ return FALSE; } }while( pbSrc[dwReadSize-2] != 0x95 || pbSrc[dwReadSize-1] != 0x4F ); break; case 0x97: //HLC 囲み制御 if( dwSrcSize < 2 ) return FALSE; m_bHLC = pbSrc[1]&0x0F; dwReadSize = 2; break; case 0x98: //RPC 文字繰り返し if( dwSrcSize < 2 || m_bRPC ) return FALSE; m_bRPC = TRUE; m_wRPC = pbSrc[1]-0x40 == 0 ? 0xFF : pbSrc[1]-0x40; dwReadSize = 2; break; case 0x99: //SPL アンダーライン モザイクの終了 m_bBold = FALSE; dwReadSize = 1; break; case 0x9A: //STL アンダーライン モザイクの開始 m_bBold = TRUE; dwReadSize = 1; break; case 0x9D: //TIME 時間制御 if( dwSrcSize < 3 ) return FALSE; if( pbSrc[1] == 0x20 ){ m_dwWaitTime += (pbSrc[2]-0x40) * 100; dwReadSize = 3; }else{ //未サポート dwReadSize = 1; do{ if( ++dwReadSize > dwSrcSize ){ return FALSE; } }while( pbSrc[dwReadSize-1] < 0x40 || 0x43 < pbSrc[dwReadSize-1] ); } break; case 0x9B: //CSI コントロールシーケンス if( CSI( pbSrc+1, dwSrcSize-1, &dwReadBuff ) == FALSE ){ return FALSE; } dwReadSize = 1+dwReadBuff; break; default: //未サポートの制御コード dwReadSize = 1; break; } *pdwReadSize = dwReadSize; return TRUE; }