color.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: color.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "common.h"
  24. typedef struct colorsetting
  25. {
  26. node Node;
  27. bool_t Dither;
  28. int Brightness;
  29. int Contrast;
  30. int Saturation;
  31. int RGBAdjust[3];
  32. int Caps;
  33. } colorsetting;
  34. static const datatable Params[] = 
  35. {
  36. { COLOR_BRIGHTNESS, TYPE_INT, DF_SETUP|DF_MINMAX, -128,127 },
  37. { COLOR_CONTRAST, TYPE_INT, DF_SETUP|DF_MINMAX, -128,127 },
  38. { COLOR_SATURATION, TYPE_INT, DF_SETUP|DF_MINMAX, -128,127 },
  39. { COLOR_R_ADJUST, TYPE_INT, DF_SETUP|DF_MINMAX, -64,63 },
  40. { COLOR_G_ADJUST, TYPE_INT, DF_SETUP|DF_MINMAX, -64,63 },
  41. { COLOR_B_ADJUST, TYPE_INT, DF_SETUP|DF_MINMAX, -64,63 },
  42. { COLOR_DITHER, TYPE_BOOL, DF_SETUP|DF_HIDDEN },
  43. { COLOR_RESET, TYPE_RESET,DF_SETUP|DF_NOSAVE|DF_GAP },
  44. { COLOR_CAPS, TYPE_INT, DF_HIDDEN },
  45. DATATABLE_END(COLOR_ID)
  46. };
  47. static int Enum(colorsetting* p, int* No, datadef* Param)
  48. {
  49. return NodeEnumTable(No,Param,Params);
  50. }
  51. static int Get(colorsetting* p, int No, void* Data, int Size)
  52. {
  53. int Result = ERR_INVALID_PARAM;
  54. switch (No)
  55. {
  56. case COLOR_RESET: Result = ERR_NONE; break;
  57. case COLOR_BRIGHTNESS: GETVALUE(p->Brightness,int); if (!(p->Caps & VC_BRIGHTNESS)) Result = ERR_NOT_SUPPORTED; break;
  58. case COLOR_CONTRAST: GETVALUE(p->Contrast,int); if (!(p->Caps & VC_CONTRAST)) Result = ERR_NOT_SUPPORTED; break;
  59. case COLOR_SATURATION: GETVALUE(p->Saturation,int); if (!(p->Caps & VC_SATURATION)) Result = ERR_NOT_SUPPORTED; break;
  60. case COLOR_R_ADJUST: GETVALUE(p->RGBAdjust[0],int); if (!(p->Caps & VC_RGBADJUST)) Result = ERR_NOT_SUPPORTED; break;
  61. case COLOR_G_ADJUST: GETVALUE(p->RGBAdjust[1],int); if (!(p->Caps & VC_RGBADJUST)) Result = ERR_NOT_SUPPORTED; break;
  62. case COLOR_B_ADJUST: GETVALUE(p->RGBAdjust[2],int); if (!(p->Caps & VC_RGBADJUST)) Result = ERR_NOT_SUPPORTED; break;
  63. case COLOR_DITHER: GETVALUE(p->Dither,bool_t); if (!(p->Caps & VC_DITHER)) Result = ERR_NOT_SUPPORTED; break;
  64. }
  65. return Result;
  66. }
  67. static NOINLINE int UpdateVideo()
  68. {
  69. context* p = Context();
  70. if (!p->Player)
  71. return ERR_NONE;
  72. return p->Player->Set(p->Player,PLAYER_UPDATEVIDEO,NULL,0);
  73. }
  74. static int Set(colorsetting* p, int No, const void* Data, int Size)
  75. {
  76. int Result = ERR_INVALID_PARAM;
  77. switch (No)
  78. {
  79. case COLOR_BRIGHTNESS: SETVALUECMP(p->Brightness,int,UpdateVideo(),EqInt); break;
  80. case COLOR_CONTRAST: SETVALUECMP(p->Contrast,int,UpdateVideo(),EqInt); break;
  81. case COLOR_SATURATION: SETVALUECMP(p->Saturation,int,UpdateVideo(),EqInt); break;
  82. case COLOR_R_ADJUST: SETVALUECMP(p->RGBAdjust[0],int,UpdateVideo(),EqInt); break;
  83. case COLOR_G_ADJUST: SETVALUECMP(p->RGBAdjust[1],int,UpdateVideo(),EqInt); break;
  84. case COLOR_B_ADJUST: SETVALUECMP(p->RGBAdjust[2],int,UpdateVideo(),EqInt); break;
  85. case COLOR_DITHER: SETVALUECMP(p->Dither,bool_t,UpdateVideo(),EqBool); break;
  86. case COLOR_CAPS: SETVALUE(p->Caps,int,ERR_NONE); break;
  87. }
  88. return Result;
  89. }
  90. static int Create(colorsetting* p)
  91. {
  92. video Desktop;
  93. QueryDesktop(&Desktop);
  94. p->Node.Enum = (nodeenum)Enum;
  95. p->Node.Set = (nodeset)Set;
  96. p->Node.Get = (nodeget)Get;
  97. #if !defined(SH3) && !defined(MIPS)
  98. #if defined(TARGET_PALMOS)
  99. p->Dither = Desktop.Width*Desktop.Height <= 160*160;
  100. #else
  101. p->Dither = Desktop.Width*Desktop.Height < 480*320;
  102. #endif
  103. #else
  104. p->Dither = 1; // gray still needs dither flag
  105. #endif
  106. #if !defined(TARGET_WIN32)
  107. // default for handheld LCD panels
  108. p->Brightness = 14;
  109. p->Saturation = 14;
  110. #endif
  111. #if defined(TARGET_PALMOS)
  112. // with SonyHHE using brightness and saturate is 10% slower
  113. if (NodeEnumClass(NULL,FOURCC('G','E','2','D')))
  114. {
  115. p->Brightness = 0;
  116. p->Saturation = 0;
  117. }
  118. #endif
  119. p->RGBAdjust[0] = p->RGBAdjust[1] = p->RGBAdjust[2] = 0;
  120. return ERR_NONE;
  121. }
  122. static const nodedef Color =
  123. {
  124. sizeof(colorsetting)|CF_GLOBAL|CF_SETTINGS,
  125. COLOR_ID,
  126. NODE_CLASS,
  127. PRI_MAXIMUM+575,
  128. (nodecreate)Create,
  129. };
  130. void Color_Init()
  131. {
  132. NodeRegisterClass(&Color);
  133. }
  134. void Color_Done()
  135. {
  136. NodeUnRegisterClass(COLOR_ID);
  137. }