summaryrefslogtreecommitdiff
path: root/dxr3colormanager.c
diff options
context:
space:
mode:
Diffstat (limited to 'dxr3colormanager.c')
-rw-r--r--dxr3colormanager.c402
1 files changed, 201 insertions, 201 deletions
diff --git a/dxr3colormanager.c b/dxr3colormanager.c
index 0bddb60..eae3244 100644
--- a/dxr3colormanager.c
+++ b/dxr3colormanager.c
@@ -4,7 +4,7 @@
begin : Tue Oct 22 2002
copyright : (C) 2002 by Stefan Schluenss
email : vdr@schluenss.de
- ***************************************************************************/
+***************************************************************************/
/***************************************************************************
* *
@@ -19,9 +19,9 @@
* Each encoded pixel in the SPU could have one of the values 0,1,2,3. *
* These values
- Pixelvalue Maps
- to index
- 0 --> 4 -->
+ Pixelvalue Maps
+ to index
+ 0 --> 4 -->
* The SPU data definition allows highlighting of rectangular areas. They *
@@ -31,20 +31,20 @@
* defintion.
* Look at the picture below:
*
- Row Col=5 Col=16
- n-2 ...............................
- n-1 ...............................
- n .....-------------------------- <- Highligh region starts here
- .....| 6,3,1,2 | 0,2,8,9
- .....| 6,3,1,2 | 0,2,8,9
- .....| 6,3,1,2 | 0,2,8,9
- n+4 .....-------------------------- <- Highligh region ends here
- n+5 ...............................
- n+6 ...............................
-
- In the above example one region (from n to n+4) is defined with two *
- highlight sections - one from column 5 up to 15 and the second from 16 *
- til the end of the line.
+ Row Col=5 Col=16
+ n-2 ...............................
+ n-1 ...............................
+ n .....-------------------------- <- Highligh region starts here
+ .....| 6,3,1,2 | 0,2,8,9
+ .....| 6,3,1,2 | 0,2,8,9
+ .....| 6,3,1,2 | 0,2,8,9
+ n+4 .....-------------------------- <- Highligh region ends here
+ n+5 ...............................
+ n+6 ...............................
+
+ In the above example one region (from n to n+4) is defined with two *
+ highlight sections - one from column 5 up to 15 and the second from 16 *
+ til the end of the line.
**/
@@ -60,90 +60,90 @@
//! constructor
cColorManager::cColorManager()
{
- NrOfRegions = -1;
- for(int i = 0; i < MAX_NO_OF_REGIONS; i++)
- hlr[i] = NULL;
+ NrOfRegions = -1;
+ for(int i = 0; i < MAX_NO_OF_REGIONS; i++)
+ hlr[i] = NULL;
}
// ==================================
cColorManager::~cColorManager()
{
- for (int i = 0; i < NrOfRegions; i++)
+ for (int i = 0; i < NrOfRegions; i++)
+ {
+ if (hlr[i])
{
- if (hlr[i])
- {
- delete(hlr[i]);
- }
+ delete(hlr[i]);
}
+ }
}
// ==================================
// Opens a new highlight region
void cColorManager::OpenRegion(int y)
{
- // Calling method (cColorManager::EncodeColors)
- // already checks MAX_NO_OF_REGIONS
- curRegion = new yRegion();
- curRegion->Y1 = y;
- NrOfRegions++;
- hlr[NrOfRegions] = curRegion;
- NewSection(0); //there's always at least a section
+ // Calling method (cColorManager::EncodeColors)
+ // already checks MAX_NO_OF_REGIONS
+ curRegion = new yRegion();
+ curRegion->Y1 = y;
+ NrOfRegions++;
+ hlr[NrOfRegions] = curRegion;
+ NewSection(0); //there's always at least a section
}
// ==================================
// Closes the spu-highlight region
void cColorManager::CloseRegion(int y)
{
- curRegion->Y2 = y;
+ curRegion->Y2 = y;
}
// ==================================
void cColorManager::EncodeColors(int width, int height, unsigned char* map, unsigned char* dmap)
{
- unsigned char color;
- unsigned char oldcolor=0xFF;
- unsigned char ColorIndex;
- int mapoffset=0;
-
- OpenRegion(0);
- for (int y = 0; y < height; ++y) {
- oldcolor=0xFF;
- FirstSection();
- for(int x = 0; x < width; ++x) {
- if(x>curSection->X2) {
- oldcolor=0xFF;
- NextSection();
- }
- color = map[mapoffset + x];
- if (color==oldcolor) dmap[mapoffset + x]=ColorIndex; else {
- //try to map the color in the current region
- if (AddColor(x,y,color, ColorIndex)) {
- // store as the highlight region index
- dmap[mapoffset + x]=ColorIndex;
- } else {
- CloseRegion(y-1);
- if(NrOfRegions<=MAX_NO_OF_REGIONS-1) {
- //retry with another region
- OpenRegion(y);
- x = -1;
- oldcolor=0xFF;
- } else
- {
- //give up
- cLog::Instance() << "dxr3colormanager: too many regions!\n";
- return;
- }
- }
- }
- }
- mapoffset+=width;
+ unsigned char color;
+ unsigned char oldcolor=0xFF;
+ unsigned char ColorIndex;
+ int mapoffset=0;
+
+ OpenRegion(0);
+ for (int y = 0; y < height; ++y) {
+ oldcolor=0xFF;
+ FirstSection();
+ for(int x = 0; x < width; ++x) {
+ if(x>curSection->X2) {
+ oldcolor=0xFF;
+ NextSection();
+ }
+ color = map[mapoffset + x];
+ if (color==oldcolor) dmap[mapoffset + x]=ColorIndex; else {
+ //try to map the color in the current region
+ if (AddColor(x,y,color, ColorIndex)) {
+ // store as the highlight region index
+ dmap[mapoffset + x]=ColorIndex;
+ } else {
+ CloseRegion(y-1);
+ if(NrOfRegions<=MAX_NO_OF_REGIONS-1) {
+ //retry with another region
+ OpenRegion(y);
+ x = -1;
+ oldcolor=0xFF;
+ } else
+ {
+ //give up
+ cLog::Instance() << "dxr3colormanager: too many regions!\n";
+ return;
+ }
+ }
+ }
}
- //close the last highligt region
- CloseRegion(height);
+ mapoffset+=width;
+ }
+ //close the last highligt region
+ CloseRegion(height);
-//#define colordebug
+ //#define colordebug
#ifdef colordebug
- {
+ {
FILE *fp;
fp = fopen("OSD.dump","w+");
u_char *pippo=dmap;
@@ -154,50 +154,50 @@ void cColorManager::EncodeColors(int width, int height, unsigned char* map, unsi
for (int dumpy=0; dumpy<height; dumpy++)
{
- if(curregion<NrOfRegions) {
- if(hlr[curregion]->Y1==dumpy) {
- fprintf(fp,"%i",hlr[curregion]->N);
- for(int sec=0; sec<hlr[curregion]->N; sec++) fprintf(fp,",%i",hlr[curregion]->Section[sec]->X1);
- for(int dumpx=0; dumpx<width; dumpx++) fprintf(fp,"=");
- fprintf(fp,"\n");
- curregion++;
- }
- }
+ if(curregion<NrOfRegions) {
+ if(hlr[curregion]->Y1==dumpy) {
+ fprintf(fp,"%i",hlr[curregion]->N);
+ for(int sec=0; sec<hlr[curregion]->N; sec++) fprintf(fp,",%i",hlr[curregion]->Section[sec]->X1);
+ for(int dumpx=0; dumpx<width; dumpx++) fprintf(fp,"=");
+ fprintf(fp,"\n");
+ curregion++;
+ }
+ }
- cursection=0;
- for(int dumpx=0; dumpx<width; dumpx++) {
- if(curregion<NrOfRegions) {
- if(cursection<hlr[curregion]->N) {
- if(hlr[curregion]->Section[cursection]->X1==dumpx) {
- fprintf(fp,"|");
- cursection++;
- }
- }
- }
- fprintf(fp,"%01X",*pippo2 & 0xF);
- pippo2++;
- }
- fprintf(fp,"\n");
+ cursection=0;
+ for(int dumpx=0; dumpx<width; dumpx++) {
+ if(curregion<NrOfRegions) {
+ if(cursection<hlr[curregion]->N) {
+ if(hlr[curregion]->Section[cursection]->X1==dumpx) {
+ fprintf(fp,"|");
+ cursection++;
+ }
+ }
+ }
+ fprintf(fp,"%01X",*pippo2 & 0xF);
+ pippo2++;
+ }
+ fprintf(fp,"\n");
- cursection=0;
- for(int dumpx=0; dumpx<width; dumpx++) {
- if(curregion<NrOfRegions) {
- if(cursection<hlr[curregion]->N) {
- if(hlr[curregion]->Section[cursection]->X1==dumpx) {
- fprintf(fp,"|");
- cursection++;
- }
- }
- }
- fprintf(fp,"%01X",*pippo & 0xF);
- pippo++;
- }
- fprintf(fp,"\n");
+ cursection=0;
+ for(int dumpx=0; dumpx<width; dumpx++) {
+ if(curregion<NrOfRegions) {
+ if(cursection<hlr[curregion]->N) {
+ if(hlr[curregion]->Section[cursection]->X1==dumpx) {
+ fprintf(fp,"|");
+ cursection++;
+ }
+ }
+ }
+ fprintf(fp,"%01X",*pippo & 0xF);
+ pippo++;
+ }
+ fprintf(fp,"\n");
}
- fclose(fp);
- printf("**** dumped\n");
- }
+ fclose(fp);
+ printf("**** dumped\n");
+ }
#endif
}
@@ -205,151 +205,151 @@ void cColorManager::EncodeColors(int width, int height, unsigned char* map, unsi
// ==================================
unsigned char cColorManager::AddColor(int x, int y, unsigned char color, unsigned char &ColorIndex) {
- if (!curSection->HasColor(color, ColorIndex))
+ if (!curSection->HasColor(color, ColorIndex))
{
// this color is new for this section
if (curSection->AllColorsUsed())
- {
- // no more free colors
- if (y != curRegion->Y1)
- {
- // terminate region
- return(0);
- }
- NewSection(x);
- }
+ {
+ // no more free colors
+ if (y != curRegion->Y1)
+ {
+ // terminate region
+ return(0);
+ }
+ NewSection(x);
+ }
// and add new color
ColorIndex = curSection->AddColor(color);
}
- return(1);
+ return(1);
}
// ==================================
void cColorManager::FirstSection(void)
{
- curSectionIndex=0;
- curSection=curRegion->Section[0];
+ curSectionIndex=0;
+ curSection=curRegion->Section[0];
}
// ==================================
void cColorManager::NextSection(void)
{
- curSectionIndex++;
- if(curSectionIndex<curRegion->N) curSection=curRegion->Section[curSectionIndex];
- //it shouldn't happen
- else cLog::Instance() <<
- "dxr3colormanager: no more sections in NextSection!\n";
+ curSectionIndex++;
+ if(curSectionIndex<curRegion->N) curSection=curRegion->Section[curSectionIndex];
+ //it shouldn't happen
+ else cLog::Instance() <<
+ "dxr3colormanager: no more sections in NextSection!\n";
}
// ==================================
// convert into SPU - hope is correct description
unsigned char* cColorManager::GetSpuData(int& len)
{
- if (NrOfRegions >= 0)
+ if (NrOfRegions >= 0)
{
- int ptr = 0;
- spudata[ptr++] = 0x07; // CHG_COLCON command
- spudata[ptr++] = 0x00; // total size of parameter area
- spudata[ptr++] = 0x00; // will be filled later
+ int ptr = 0;
+ spudata[ptr++] = 0x07; // CHG_COLCON command
+ spudata[ptr++] = 0x00; // total size of parameter area
+ spudata[ptr++] = 0x00; // will be filled later
- for(int i = 0; i <= NrOfRegions;i++)
+ for(int i = 0; i <= NrOfRegions;i++)
{
- spudata[ptr++] = (hlr[i]->Y1 >> 8) & 0x0f;
- spudata[ptr++] = (hlr[i]->Y1 & 0xff);
- spudata[ptr++] = ( ( (hlr[i]->N) & 0x0f) << 4) | ((hlr[i]->Y2 >> 8) & 0x0f);
- spudata[ptr++] = (hlr[i]->Y2 & 0xff);
-
- for(int c = 0; c < hlr[i]->N; c++)
- {
- spudata[ptr++] = hlr[i]->Section[c]->X1 >> 8;
- spudata[ptr++] = hlr[i]->Section[c]->X1 & 0xff;
- spudata[ptr++] = (hlr[i]->Section[c]->Colors[3] << 4) | (hlr[i]->Section[c]->Colors[2] & 0x0F);
- spudata[ptr++] = (hlr[i]->Section[c]->Colors[1] << 4) | (hlr[i]->Section[c]->Colors[0] & 0x0F);
-
- spudata[ptr++] = (hlr[i]->Section[c]->Opac[3] << 4) | hlr[i]->Section[c]->Opac[2];
- spudata[ptr++] = (hlr[i]->Section[c]->Opac[1] << 4) | hlr[i]->Section[c]->Opac[0];
- }
+ spudata[ptr++] = (hlr[i]->Y1 >> 8) & 0x0f;
+ spudata[ptr++] = (hlr[i]->Y1 & 0xff);
+ spudata[ptr++] = ( ( (hlr[i]->N) & 0x0f) << 4) | ((hlr[i]->Y2 >> 8) & 0x0f);
+ spudata[ptr++] = (hlr[i]->Y2 & 0xff);
+
+ for(int c = 0; c < hlr[i]->N; c++)
+ {
+ spudata[ptr++] = hlr[i]->Section[c]->X1 >> 8;
+ spudata[ptr++] = hlr[i]->Section[c]->X1 & 0xff;
+ spudata[ptr++] = (hlr[i]->Section[c]->Colors[3] << 4) | (hlr[i]->Section[c]->Colors[2] & 0x0F);
+ spudata[ptr++] = (hlr[i]->Section[c]->Colors[1] << 4) | (hlr[i]->Section[c]->Colors[0] & 0x0F);
+
+ spudata[ptr++] = (hlr[i]->Section[c]->Opac[3] << 4) | hlr[i]->Section[c]->Opac[2];
+ spudata[ptr++] = (hlr[i]->Section[c]->Opac[1] << 4) | hlr[i]->Section[c]->Opac[0];
+ }
}
- spudata[ptr++] = 0x0f; // termination of parameter block
- spudata[ptr++] = 0xff;
- spudata[ptr++] = 0xff;
- spudata[ptr++] = 0xff;
- int size = ptr - 1;
- spudata[1] = size >> 8;
- spudata[2] = size & 0xff;
-
- len = ptr;
+ spudata[ptr++] = 0x0f; // termination of parameter block
+ spudata[ptr++] = 0xff;
+ spudata[ptr++] = 0xff;
+ spudata[ptr++] = 0xff;
+ int size = ptr - 1;
+ spudata[1] = size >> 8;
+ spudata[2] = size & 0xff;
+
+ len = ptr;
}
- else
- len = 0;
+ else
+ len = 0;
#if OSD_SPU_CM_DUMP
- FILE *fp;
- fp = fopen("CM.dump","a+");
- fprintf(fp,"len:%03d ",len);
- for (int i = 0; i < len; i++)
- fprintf(fp,"%02X",*(spudata+i));
- fprintf(fp,"\n");
- fclose(fp);
+ FILE *fp;
+ fp = fopen("CM.dump","a+");
+ fprintf(fp,"len:%03d ",len);
+ for (int i = 0; i < len; i++)
+ fprintf(fp,"%02X",*(spudata+i));
+ fprintf(fp,"\n");
+ fclose(fp);
#endif
- return(spudata);
+ return(spudata);
}
// ==================================
void cColorManager::NewSection(int x)
{
- int N = curRegion->N;
- if (N>=MAX_NO_OF_SECTIONS-1) {
- cLog::Instance() << "dxr3colormanager: bummer, too many sections\n";
- return; //reuse last section, not optimal but there's no other way out
- }
- curSection = new xSection(x);
- curRegion->Section[N] = curSection;
- if (N > 0) curRegion->Section[N-1]->X2 = x-1;
- (curRegion->N)++;
- curSectionIndex=N;
+ int N = curRegion->N;
+ if (N>=MAX_NO_OF_SECTIONS-1) {
+ cLog::Instance() << "dxr3colormanager: bummer, too many sections\n";
+ return; //reuse last section, not optimal but there's no other way out
+ }
+ curSection = new xSection(x);
+ curRegion->Section[N] = curSection;
+ if (N > 0) curRegion->Section[N-1]->X2 = x-1;
+ (curRegion->N)++;
+ curSectionIndex=N;
}
// ==================================
xSection::xSection(int x)
{
- X1 = x;
- X2 = 32767;
- NrOfColors = 0;
- for (int i = 0; i < 4; i++)
+ X1 = x;
+ X2 = 32767;
+ NrOfColors = 0;
+ for (int i = 0; i < 4; i++)
{
- Opac[i] = 0xFF;
- Colors[i] = 0;
+ Opac[i] = 0xFF;
+ Colors[i] = 0;
}
}
// ==================================
unsigned char xSection::AddColor(unsigned int color)
{
- unsigned char ColorIndex = 0;
+ unsigned char ColorIndex = 0;
- if (NrOfColors <= 3)
+ if (NrOfColors <= 3)
{
- Colors[NrOfColors] = color;
- Opac[NrOfColors] = color >> 4;
- ColorIndex = NrOfColors;
- NrOfColors++;
+ Colors[NrOfColors] = color;
+ Opac[NrOfColors] = color >> 4;
+ ColorIndex = NrOfColors;
+ NrOfColors++;
}
- return(ColorIndex);
+ return(ColorIndex);
}
// ==================================
bool xSection::HasColor(unsigned int color, unsigned char &ColorIndex)
{
- for(int i = 0; i < NrOfColors; i++)
+ for(int i = 0; i < NrOfColors; i++)
{
- if (Colors[i] == color)
+ if (Colors[i] == color)
{
- ColorIndex = i;
- return (true);
+ ColorIndex = i;
+ return (true);
}
}
- return(false);
+ return(false);
}