|
|
//
// TOSHIBA CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with TOSHIBA Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 1997 TOSHIBA Corporation. All Rights Reserved.
//
// Workfile: IMAGE.C
//
// Purpose:
//
// Contents:
//
#include "strmini.h"
#include "ksmedia.h"
#include "capmain.h"
#include "capdebug.h"
#include "bert.h"
#include "Image.h"
//
// SetInputImageSize
// Set Input Image Size
// Set P_SKIP_REG, P_ISIZ_REG
//
BOOL SetInputImageSize(PHW_DEVICE_EXTENSION pHwDevExt, PRECT pRect) { ULONG ulSkipLine; ULONG ulSkipPix; ULONG ulSrcHeight; ULONG ulSrcWidth;
if((pHwDevExt->MaxRect.bottom < pRect->bottom) || (pHwDevExt->MaxRect.right < pRect->right)) { // Mod 97-04-09(Wed)
return FALSE; }
ulSkipLine = pRect->left & 0x000003ff; ulSkipPix = pRect->top & 0x000003ff; ulSrcHeight = (pRect->bottom - pRect->top) & 0x000003ff; ulSrcWidth = (pRect->right - pRect->left) & 0x000003ff;
ReadModifyWriteRegUlong(pHwDevExt, BERT_P_SKIP_REG, 0xfc00ffff, ulSkipLine << 16); ReadModifyWriteRegUlong(pHwDevExt, BERT_P_SKIP_REG, 0xfffffc00, ulSkipPix);
ReadModifyWriteRegUlong(pHwDevExt, BERT_P_ISIZ_REG, 0xfc00ffff, ulSrcHeight << 16); ReadModifyWriteRegUlong(pHwDevExt, BERT_P_ISIZ_REG, 0xfffffc00, ulSrcWidth);
return TRUE; }
//
// SetOutputImageSize
// Set Output Image Size
// Set P_OSIZ_REG
//
BOOL SetOutputImageSize(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulWidth, ULONG ulHeight ) { ULONG ulMaxWidth = pHwDevExt->MaxRect.right - pHwDevExt->MaxRect.left; ULONG ulMaxHeight = pHwDevExt->MaxRect.bottom - pHwDevExt->MaxRect.top;
if((ulWidth <= ulMaxWidth) && (ulHeight <= ulMaxHeight)){ // Mod 97-04-09(Wed)
ulWidth &= 0x000003ff; ulHeight &= 0x000003ff; ulHeight <<= 16; ReadModifyWriteRegUlong(pHwDevExt, BERT_P_OSIZ_REG, 0xfffffc00, ulWidth); ReadModifyWriteRegUlong(pHwDevExt, BERT_P_OSIZ_REG, 0xfc00ffff, ulHeight); } else{ return FALSE; } return TRUE; }
//
// SetLumiInfo
// Set Luminance Info
// Set P_LUMI_REG
//
BOOL SetLumiInfo(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulContrast, ULONG ulBrightness ) { if(ulContrast > 0xff){ return FALSE; } if(ulBrightness > 0xff){ return FALSE; }
ulContrast >>= 1; // 1/2
ulContrast <<= 8; ReadModifyWriteRegUlong(pHwDevExt, BERT_P_LUMI_REG, 0xffff80ff, ulContrast); ReadModifyWriteRegUlong(pHwDevExt, BERT_P_LUMI_REG, 0xffffff00, ulBrightness); return TRUE; }
//
// SetColorInfo
// Set Color Info
// Set P_COL_REG
//
BOOL SetColorInfo(PHW_DEVICE_EXTENSION pHwDevExt, // Mod 97-04-12(Sat)
ULONG ulHue, ULONG ulSaturation ) { ULONG ulUFU, ulVFU, ulUFV, ulVFV; ULONG ulUFUVFU, ulUFVVFV; long lSatu;
long sindata[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-128~-120) 0~8
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-119~-110) 9~18
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-109~-100) 19~28
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-99~-90) 29~38
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-89~-80) 39~48
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-79~-70) 49~58
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-69~-60) 59~68
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1/sin(-59~-50) 69~78
-1, -1, -1, -1, -1, -1, -1, -1, -2, -2, // 1/sin(-49~-40) 79~88
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, // 1/sin(-39~-30) 89~98
-2, -2, -2, -2, -2, -2, -3, -3, -3, -3, // 1/sin(-29~-20) 99~108
-3, -3, -3, -4, -4, -4, -4, -5, -5, -6, // 1/sin(-19~-10) 109~118
-6, -7, -8, -10, -11, -14, -19, -29, -57, // 1/sin(-9~-1) 119~127
0, // 1/sin(0) 128
57, 29, 19, 14, 11, 10, 8, 7, 6, 6, // 1/sin(1~10) 129~138
5, 5, 4, 4, 4, 4, 3, 3, 3, 3, // 1/sin(11~20) 139~148
3, 3, 3, 2, 2, 2, 2, 2, 2, 2, // 1/sin(21~30) 149~158
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 1/sin(31~40) 159~168
2, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(41~50) 169~178
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(51~60) 179~188
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(61~70) 189~198
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(71~80) 199~208
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(81~90) 209~218
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(91~100) 219~228
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(101~110) 229~238
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/sin(111~120) 239~248
1, 1, 1, 1, 1, 1, 1 // 1/sin(121~127) 249~255
}; long cosdata[256] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, // 1/cos(-128~-120) 0~8
-2, -2, -2, -2, -2, -2, -3, -3, -3, -3, // 1/cos(-119~-110) 9~18
-3, -3, -3, -4, -4, -4, -4, -5, -5, -6, // 1/cos(-109~-100) 19~28
-6, -7, -8, -10, -11, -14, -19, -29, -57, // 1/cos(-99~-91) 29~37
0, // 1/cos(-90) 38
57, 29, 19, 14, 11, 10, 8, 7, 6, 6, // 1/cos(-89~-80) 39~48
5, 5, 4, 4, 4, 4, 3, 3, 3, 3, // 1/cos(-79~-70) 49~58
3, 3, 3, 2, 2, 2, 2, 2, 2, 2, // 1/cos(-69~-60) 59~68
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 1/cos(-59~-50) 69~78
2, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(-49~-40) 79~88
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(-39~-30) 89~98
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(-29~-20) 99~108
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(-19~-10) 109~118
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(-9~0) 119~128
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(1~10) 129~138
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(11~20) 139~148
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(21~30) 149~158
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1/cos(31~40) 159~168
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, // 1/cos(41~50) 169~178
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 1/cos(51~60) 179~188
2, 2, 2, 2, 2, 2, 3, 3, 3, 3, // 1/cos(61~70) 189~198
3, 3, 3, 4, 4, 4, 4, 5, 5, 6, // 1/cos(71~80) 199~208
6, 7, 8, 10, 11, 14, 19, 29, 57, // 1/cos(81~89) 209~217
0, // 1/cos(90) 218
-57, -29, -19, -14, -11, -10, -8, -7, -6, -6, // 1/cos(91~100) 219~228
-5, -5, -4, -4, -4, -4, -3, -3, -3, -3, // 1/cos(101~110) 229~238
-3, -3, -3, -2, -2, -2, -2, -2, -2, -2, // 1/cos(111~120) 239~248
-2, -2, -2, -2, -2, -2, -2 // 1/cos(121~127) 249~255
};
if(ulHue > 0xff){ return FALSE; } if(ulSaturation > 0xff){ return FALSE; } lSatu = ulSaturation / 2; // Mod 97-05-10(Sat)
switch(ulHue){ case 38: // -90
ulUFU = 128; ulVFU = lSatu + 128; ulUFV = -lSatu + 127; ulVFV = 128; break; case 128: // 0
ulUFU = lSatu + 128; ulVFU = 128; ulUFV = 128; ulVFV = lSatu + 128; break; case 218: // 90
ulUFU = 128; ulVFU = -lSatu + 127; ulUFV = lSatu + 128; ulVFV = 128; break; default: ulUFU = lSatu / cosdata[ulHue] + 128; ulVFU = -lSatu / sindata[ulHue] + 128; ulUFV = lSatu / sindata[ulHue] + 128; ulVFV = lSatu / cosdata[ulHue] + 128; break; }
ulUFU &= 0xff; // Add 97-04-19(Sat)
ulVFU &= 0xff; ulUFV &= 0xff; ulVFV &= 0xff;
ulUFUVFU = ulUFU << 24 | ulVFU << 16; ulUFVVFV = ulUFV << 8 | ulVFV;
ReadModifyWriteRegUlong(pHwDevExt, BERT_P_COL_REG, 0x0000ffff, ulUFUVFU); ReadModifyWriteRegUlong(pHwDevExt, BERT_P_COL_REG, 0xffff0000, ulUFVVFV);
return TRUE; }
//
// SetChgColInfo
// Set ChangeColor Info
// Set P_LUMI_REG
//
BOOL SetChgColInfo(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulChgCol ) { switch(ulChgCol){ case IMAGE_CHGCOL_AVAIL: case IMAGE_CHGCOL_NOTAVAIL: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_LUMI_REG, 0xfffeffff, ulChgCol); break; default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_LUMI_REG, 0xfffeffff, 0UL); break; }
return TRUE; }
//
// SetVerticalFilterInfo
// Set Vertical Filter Info
// Set P_FILT_REG
//
BOOL SetVerticalFilterInfo(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulVFL ) { switch(ulVFL){ case IMAGE_VFL: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffeffff, ulVFL); // Mod 97-04-14(Mon)
break; default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffeffff, 0UL); break; }
return TRUE; }
//
// SetHorizontalFilterInfo
// Set Horizontal Filter Info
// Set P_FILT_REG
//
BOOL SetHorizontalFilterInfo(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulFL1, ULONG ulFL2, ULONG ulFL3, ULONG ulFL4 ) { switch(ulFL1){ case IMAGE_FL_0: case IMAGE_FL_1: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffffff8, ulFL1); break; default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffffff8, 0UL); break; } switch(ulFL2){ case IMAGE_FL_0: case IMAGE_FL_1: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xffffff8f, ulFL2 << 4); break; case IMAGE_FL_2: case IMAGE_FL_3: case IMAGE_FL_4: default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xffffff8f, 0UL); break; } switch(ulFL3){ case IMAGE_FL_0: case IMAGE_FL_1: case IMAGE_FL_2: case IMAGE_FL_4: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffff8ff, ulFL3 << 8); break; case IMAGE_FL_3: default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffff8ff, 0UL); break; } switch(ulFL4){ case IMAGE_FL_0: case IMAGE_FL_2: case IMAGE_FL_4: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xffff8fff, ulFL4 << 12); break; case IMAGE_FL_1: case IMAGE_FL_3: default: ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xffff8fff, 0UL); break; }
return TRUE; }
//
// ImageSetInputImageSize
// Set Input Image Size
// Set P_SKIP_REG, P_ISIZ_REG
//
BOOL ImageSetInputImageSize(PHW_DEVICE_EXTENSION pHwDevExt, PRECT pRect ) { if(!SetInputImageSize(pHwDevExt, pRect)){ return FALSE; } return TRUE; }
//
// ImageSetOutputImageSize
// Set Output Image Size
// Set P_OSIZ_REG
//
BOOL ImageSetOutputImageSize(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulWidth, ULONG ulHeight ) { if(!SetOutputImageSize(pHwDevExt, ulWidth, ulHeight)){ return FALSE; }
if(!ImageGetFilteringAvailable(pHwDevExt)){ ImageFilterOFF(pHwDevExt); } else if(ImageGetFilterInfo(pHwDevExt)){ // Add 97-05-13(Tue)
ImageFilterON(pHwDevExt); }
return TRUE; }
//
// ImageSetChangeColorAvail
// Set/Reset CHGCOL Bit
// Set P_LUMI_REG
//
BOOL ImageSetChangeColorAvail(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulChgCol ) { if(!SetChgColInfo(pHwDevExt, ulChgCol)){ return FALSE; } return TRUE; }
//
// ImageSetHueBrightnessContrastSat
// Set Color Info
// Call SetLumiImfo, SetColorInfo
//
BOOL ImageSetHueBrightnessContrastSat(PHW_DEVICE_EXTENSION pHwDevExt) // Mod 97-04-08(Tue)
{ #ifdef TOSHIBA
if(!SetLumiInfo(pHwDevExt, pHwDevExt->Contrast, pHwDevExt->Brightness)){ return FALSE; } if(!SetColorInfo(pHwDevExt, pHwDevExt->Hue, pHwDevExt->Saturation)){ return FALSE; } #else //TOSHIBA
if(!SetLumiInfo(pHwDevExt, pHwDevExt->ulContrast, pHwDevExt->ulBrightness)){ return FALSE; } if(!SetColorInfo(pHwDevExt, pHwDevExt->ulHue, pHwDevExt->ulSaturation)){ return FALSE; } #endif//TOSHIBA
return TRUE; }
//
// ImageSetFilterInfo
// Set Filter Info
// Set P_FILT_REG
//
BOOL ImageSetFilterInfo(PHW_DEVICE_EXTENSION pHwDevExt, ULONG ulVFL, ULONG ulFL1, ULONG ulFL2, ULONG ulFL3, ULONG ulFL4 ) { if(!SetHorizontalFilterInfo(pHwDevExt, ulFL1, ulFL2, ulFL3, ulFL4)){ return FALSE; } if(!SetVerticalFilterInfo(pHwDevExt, ulVFL)){ return FALSE; } return TRUE; }
//
// ImageFilterON
//
// Set P_FILT_REG
//
BOOL ImageFilterON(PHW_DEVICE_EXTENSION pHwDevExt) { ULONG ulFL1, ulFL2, ulFL3, ulFL4;
if(pHwDevExt->ulWidth <= 80){ // 0 < Width <= 80
ulFL1 = IMAGE_FL_1; ulFL2 = IMAGE_FL_1; ulFL3 = IMAGE_FL_2; ulFL4 = IMAGE_FL_4; } else if((pHwDevExt->ulWidth > 80) && (pHwDevExt->ulWidth <= 160)){ // 80 < Width <= 160
ulFL1 = IMAGE_FL_1; ulFL2 = IMAGE_FL_1; ulFL3 = IMAGE_FL_2; ulFL4 = IMAGE_FL_0; } else{ // 160 < Width
ulFL1 = IMAGE_FL_1; ulFL2 = IMAGE_FL_1; ulFL3 = IMAGE_FL_0; ulFL4 = IMAGE_FL_0; }
if(!SetHorizontalFilterInfo(pHwDevExt, ulFL1, ulFL2, ulFL3, ulFL4)){ return FALSE; } if(!SetVerticalFilterInfo(pHwDevExt, IMAGE_VFL)){ return FALSE; } return TRUE; }
//
// ImageFilterOFF
//
// Set P_FILT_REG
//
BOOL ImageFilterOFF(PHW_DEVICE_EXTENSION pHwDevExt) { ReadModifyWriteRegUlong(pHwDevExt, BERT_P_FILT_REG, 0xfffe0000, 0UL); return TRUE; }
//
// ImageGetFilterInfo
// Get Filter Info
//
BOOL ImageGetFilterInfo(PHW_DEVICE_EXTENSION pHwDevExt) { if(!ReadRegUlong(pHwDevExt, BERT_P_FILT_REG)){ return FALSE; } return TRUE; }
//
// ImageGetFilteringAvailable
//
BOOL ImageGetFilteringAvailable(PHW_DEVICE_EXTENSION pHwDevExt) { ULONG ulISIZ, ulOSIZ; ULONG ulFL, ulFL1, ulFL2, ulFL3, ulFL4;
ulISIZ = ReadRegUlong(pHwDevExt, BERT_P_ISIZ_REG); ulISIZ &= 0x3ff; ulOSIZ = ReadRegUlong(pHwDevExt, BERT_P_OSIZ_REG); ulOSIZ &= 0x3ff; ulFL = ReadRegUlong(pHwDevExt, BERT_P_FILT_REG); ulFL1 = ulFL & 0x7; ulFL2 = (ulFL >> 4) & 0x7; ulFL3 = (ulFL >> 8) & 0x7; ulFL4 = (ulFL >> 12) & 0x7;
if((ulOSIZ > 400) || (ulOSIZ == 640)){ return FALSE; } if((ulISIZ - ulOSIZ) < ((ulFL1 + ulFL2 + ulFL3 + ulFL4) * 2)){ return FALSE; } return TRUE; }
|