⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdith.c

📁 mpeng Lib
💻 C
字号:
/* * Copyright (c) 1992 The Regents of the University of California. * All rights reserved. *  * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */#include <config.h>#include <malloc.h>#include <memory.h>#include "mpeg.h"#include "dither.h"#include "video.h"#include "proto.h"#include "globals.h"		/* for global variable ditherType */#include "my_dmalloc.h"#define NUM_COLORS 256		/* number of entries in colormap */				/* for gray-scale dithering *//* Range values for lum, cr, cb. */int LUM_RANGE = 8;int CR_RANGE = 4;int CB_RANGE = 4;/* Array that remaps color numbers to actual pixel values used by X server. */unsigned char pixel[256];/* Arrays holding quantized value ranged for lum, cr, and cb. */int *lum_values;int *cr_values;int *cb_values;/* *-------------------------------------------------------------- * * InitColor -- * *	Initialized lum, cr, and cb quantized range value arrays. * * Results:  *      None. * * Side effects: *      None. * *-------------------------------------------------------------- */static voidInitColor(void){  int i;  for (i=0; i<LUM_RANGE; i++) {    lum_values[i] = ((i * 256) / (LUM_RANGE)) + (256/(LUM_RANGE*2));  }  for (i=0; i<CR_RANGE; i++) {    cr_values[i] = ((i * 256) / (CR_RANGE)) + (256/(CR_RANGE*2));  }  for (i=0; i<CB_RANGE; i++) {    cb_values[i] = ((i * 256) / (CB_RANGE)) + (256/(CB_RANGE*2));  }}/* *-------------------------------------------------------------- * * ConvertColor -- * *	Given a l, cr, cb tuple, converts it to r,g,b. * * Results: *	r,g,b values returned in pointers passed as parameters. * * Side effects: *      None. * *-------------------------------------------------------------- */static voidConvertColor (unsigned char l,              unsigned char cr,              unsigned char cb,              unsigned char *r,              unsigned char *g,              unsigned char *b){  double fl, fcr, fcb, fr, fg, fb;  fl = (double) l;  fcr =  ((double) cr) - 128.0;  fcb =  ((double) cb) - 128.0;  fr = fl + (1.40200 * fcb);  fg = fl - (0.71414 * fcb) - (0.34414 * fcr);  fb = fl + (1.77200 * fcr);  if (fr < 0.0) fr = 0.0;  else if (fr > 255.0) fr = 255.0;  if (fg < 0.0) fg = 0.0;  else if (fg > 255.0) fg = 255.0;  if (fb < 0.0) fb = 0.0;  else if (fb > 255.0) fb = 255.0;  *r = (unsigned char) fr;  *g = (unsigned char) fg;  *b = (unsigned char) fb;}/* ----------------------------- MNI Header -----------------------------------@NAME       : InitColormap@INPUT      : (none)@OUTPUT     : *NumColors - number of entries in the newly-created colormap              *Map - an array of colourmap entries; each one contains a                      red, green, and blue byte-values (0 .. 255).  		     *Map[i] gives the colour to display a pixel value i.@RETURNS    : (none)@DESCRIPTION: Creates a colour map used for most dithering methods               (everything except full-colour, gray, and monochrome).	      The colour map itself is pretty self-explanatory -- a 	      pixel with value i is to be displayed using the red, green	      and blue values in *Map[i] after InitColormap() is done.@METHOD     : @GLOBALS    : @CALLS      : @CREATED    : 95/3/4, Greg Ward: based on InitColorDisplay(), from gdith.c                                 in the original Berkeley player@MODIFIED   : ---------------------------------------------------------------------------- */#if (ENABLE_DITHER)static voidInitColormap (int *NumColors, ColormapEntry **Map){   int i, lum_num, cr_num, cb_num;   *NumColors =  LUM_RANGE*CB_RANGE*CR_RANGE;   if (ditherType == NO_DITHER) return;   *Map = (ColormapEntry *) malloc (*NumColors * sizeof (ColormapEntry));   for (i = 0; i < *NumColors; i++)    {      lum_num = (i / (CR_RANGE*CB_RANGE))%LUM_RANGE;      cr_num = (i / CB_RANGE)%CR_RANGE;      cb_num = i % CB_RANGE;            ConvertColor(lum_values[lum_num], cr_values[cr_num], cb_values[cb_num],                    (unsigned char*)(&((*Map)[i]).red),                   (unsigned char*)(&((*Map)[i]).green),                   (unsigned char*)(&((*Map)[i]).blue));      pixel[i] = i;   }}#endif/* ----------------------------- MNI Header -----------------------------------@NAME       : InitGrayColormap@INPUT      : (none)@OUTPUT     : *NumColors - number of entries in the newly-created colormap              *Map - an array of colourmap entries@RETURNS    : (none)@DESCRIPTION: Creates a colour map used for gray-scale dithering, i.e.              the red/green/blue values are the same for any given	      pixel value.@METHOD     : @GLOBALS    : @CALLS      : @CREATED    : 95/3/4, Greg Ward: based on InitGrayDisplay(), from gdith.c                                 in the original Berkeley player@MODIFIED   : ---------------------------------------------------------------------------- */#if (ENABLE_DITHER)static voidInitGrayColormap (int *NumColors, ColormapEntry **Map){   int  i;      *NumColors =  NUM_COLORS;   if (ditherType == NO_DITHER) return;   *Map = (ColormapEntry *) malloc (*NumColors * sizeof (ColormapEntry));   for (i = 0; i < *NumColors; i++)    {      (*Map)[i].red = (*Map)[i].green = (*Map)[i].blue = i;      pixel[i] = i;   }}#endif/* ----------------------------- MNI Header -----------------------------------@NAME       : InitDither@INPUT      : Image - pointer to the image descriptor for the current MPEG@OUTPUT     : Image->ColormapSize, Image->Colormap - the colour map for              this movie, as initialized by either InitColormap or	      InitGrayColormap (unless the current dithering scheme	      is full colour, in which case there is no colour map)@RETURNS    : (none)@DESCRIPTION: Does all initialization particular to the type of dithering              being used.  Basically, sets up the internal data structures	      needed by the dithering code, and then sets up a colour map	      needed to display the pixels output by the ditherers.@METHOD     : @GLOBALS    : @CALLS      : InitColor     (for most dithering methods)              InitColormap  (for most dithering methods)	      InitGrayColormap (for gray-scale dithering)              Init(..)Dither  (.. = the current dithering method)@CREATED    : 95/3/3, Greg Ward: taken mostly from main() in the original                                  Berkeley player@MODIFIED   : ---------------------------------------------------------------------------- */voidInitDither (ImageDesc *Image){   switch (ditherType)   {#if (ENABLE_DITHER)      case HYBRID_DITHER:	 InitColor ();	 InitHybridDither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case HYBRID2_DITHER:	 InitColor ();	 InitHybridErrorDither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case FS4_DITHER:	 InitColor ();	 InitFS4Dither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case FS2_DITHER:	 InitColor ();	 InitFS2Dither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case FS2FAST_DITHER:	 InitColor ();	 InitFS2FastDither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case Twox2_DITHER:	 InitColor ();	 Init2x2Dither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 PostInit2x2Dither ();	 break;      case GRAY_DITHER:	 InitGrayColormap (&Image->ColormapSize, &Image->Colormap);	 break;#endif      case FULL_COLOR_DITHER:	 InitColorDither ();	 Image->ColormapSize = -1;	 Image->Colormap = NULL;	 break;#if (ENABLE_DITHER)      case NO_DITHER:	 break;      case ORDERED_DITHER:	 InitColor ();	 InitOrderedDither ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 break;      case MONO_DITHER:      case MONO_THRESHOLD:	 break;      case ORDERED2_DITHER:	 InitColor ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 InitOrdered2Dither ();	 break;      case MBORDERED_DITHER:	 InitColor ();	 InitColormap (&Image->ColormapSize, &Image->Colormap);	 InitMBOrderedDither ();	 break;#endif   }}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -