Logo Search packages:      
Sourcecode: blender version File versions

resources.c

/**
 * $Id: resources.c,v 1.32 2004/10/06 18:55:00 ton Exp $
 *
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version. The Blender
 * Foundation also sells licenses for use in proprietary software under
 * the Blender License.  See http://www.blender.org/BL/ for information
 * about this.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL/BL DUAL LICENSE BLOCK *****
 */

#include <math.h>
#include <stdlib.h>
#include <string.h>

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef WIN32
#include "BLI_winstuff.h"
#endif

#include "MEM_guardedalloc.h"

#include "DNA_listBase.h"
#include "DNA_userdef_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"

#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"

#include "BIF_gl.h"
#include "BIF_resources.h"

#include "BLI_blenlib.h"
#include "blendef.h"    // CLAMP
#include "datatoc.h"

/* global for themes */
static bTheme *theme_active=NULL;
static int theme_spacetype= SPACE_VIEW3D;

typedef struct {
      unsigned char *data;
      float uv[4][2];
      GLuint texid;
      int w, h;
} Icon;


static Icon *icon_from_data(unsigned char *rect, GLuint texid, int xofs, int yofs, int w, int h, int rowstride)
{
      Icon *icon= MEM_mallocN(sizeof(*icon), "internicon");
      int y;

      icon->texid= texid;
      icon->uv[0][0]= ((float)xofs)/512.0;
      icon->uv[0][1]= ((float)yofs)/256.0;
      icon->uv[1][0]= icon->uv[0][0] + ((float)w)/512.0;
      icon->uv[1][1]= icon->uv[0][1];
      icon->uv[2][0]= icon->uv[0][0] + ((float)w)/512.0;
      icon->uv[2][1]= icon->uv[0][1] + ((float)w)/256.0;
      icon->uv[3][0]= icon->uv[0][0];
      icon->uv[3][1]= icon->uv[0][1] + ((float)w)/256.0;
      
      icon->w= w;
      icon->h= h;
      
      icon->data= MEM_mallocN(w*h*4, "icon->data");
      for (y=0; y<h; y++)
            memcpy(&icon->data[y*w*4], &rect[y*rowstride], w*4);

      return icon;
}

static float icon_x=0.0, icon_y=0.0;
void BIF_icon_pos(float xs, float ys)
{
      icon_x= xs; icon_y= ys;
}

static GLuint init_icon_texture(ImBuf *bbuf)
{
      GLuint texid;

      glGenTextures(1, &texid);
      glBindTexture(GL_TEXTURE_2D, texid);

      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bbuf->x, bbuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, bbuf->rect);

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

      return texid;
}

/* texture version for drawpixels */
static void icon_draw_tex(Icon *icon)
{
      glBindTexture(GL_TEXTURE_2D, icon->texid);

      /* drawing it */
      glColor3ub(255, 255, 255);
      glEnable(GL_TEXTURE_2D);
      glBegin(GL_QUADS);
      
      glTexCoord2fv(icon->uv[0]);
      glVertex2f(icon_x, icon_y);
      glTexCoord2fv(icon->uv[1]);
      glVertex2f(icon_x+icon->w, icon_y);
      glTexCoord2fv(icon->uv[2]);
      glVertex2f(icon_x+icon->w, icon_y+icon->h);
      glTexCoord2fv(icon->uv[3]);
      glVertex2f(icon_x, icon_y+icon->h);

      glEnd();
      glDisable(GL_TEXTURE_2D);
}


static void icon_draw(Icon *icon)
{
      glDrawPixels(icon->w, icon->h, GL_RGBA, GL_UNSIGNED_BYTE, icon->data);
}


static void icon_draw_blended(Icon *icon, char *blendcol, int shade)
{

      if(shade < 0) {
            float r= (128+shade)/128.0;
            glPixelTransferf(GL_ALPHA_SCALE, r);
      }
      glDrawPixels(icon->w, icon->h, GL_RGBA, GL_UNSIGNED_BYTE, icon->data);
      glPixelTransferf(GL_ALPHA_SCALE, 1.0);

}


static void icon_free(Icon *icon)
{
      MEM_freeN(icon->data);
      MEM_freeN(icon);
}


static Icon **common_icons_arr= NULL;

static Icon *get_icon(BIFIconID icon)
{
      int iconidx= icon-BIFICONID_FIRST;
      if (iconidx>=0 && iconidx<BIFNICONIDS) {
            return common_icons_arr[iconidx];
      } else {
            return common_icons_arr[ICON_ERROR-BIFICONID_FIRST];
      }
}
static void free_common_icons(void)
{
      int i;

      for (i=0; i<BIFNICONIDS; i++) {
            icon_free(common_icons_arr[i+BIFICONID_FIRST]);
      }
}

void BIF_draw_icon(BIFIconID icon)
{
      icon_draw(get_icon(icon));
}

void BIF_draw_icon_blended(BIFIconID icon, int colorid, int shade)
{
      char *cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      icon_draw_blended(get_icon(icon), cp, shade);
      // icon_draw_tex(get_icon(icon));

}

int BIF_get_icon_width(BIFIconID icon)
{
      return get_icon(icon)->w;
}

int BIF_get_icon_height(BIFIconID icon)
{
      return get_icon(icon)->h;
}

static void def_icon(ImBuf *bbuf, GLuint texid, BIFIconID icon, int xidx, int yidx, int w, int h, int offsx, int offsy)
{
      int iconidx= icon-BIFICONID_FIRST;
      
      if (iconidx>=0 && iconidx<BIFNICONIDS) {
            int rowstride= bbuf->x*4;
            unsigned char *start= ((char*) bbuf->rect) + (yidx*21 + 3 + offsy)*rowstride + (xidx*20 + 3 + offsx)*4;

            common_icons_arr[iconidx]= 
                  icon_from_data(start, texid, (xidx*20 + 3 + offsx), (yidx*21 + 3 + offsy), w, h, rowstride);
            
      } else {
            printf("def_icon: Internal error, bad icon ID: %d\n", icon);
      }
}

/***/

static void clear_transp_rect(unsigned char *transp, unsigned char *rect, int w, int h, int rowstride)
{
      int x,y;
      for (y=0; y<h; y++) {
            unsigned char *row= &rect[y*rowstride];
            for (x=0; x<w; x++) {
                  unsigned char *pxl= &row[x*4];
                  if (*((unsigned int*) pxl)==*((unsigned int*) transp)) {
                        pxl[3]= 0;
                  }
            }
      }
}

void BIF_resources_init(void)
{
      ImBuf *bbuf= IMB_ibImageFromMemory((int *)datatoc_blenderbuttons, datatoc_blenderbuttons_size, IB_rect);
      GLuint texid=0;
      int x, y;

      common_icons_arr= MEM_mallocN(sizeof(*common_icons_arr)*BIFNICONIDS, "common_icons");

      for (y=0; y<10; y++) {
            for (x=0; x<21; x++) {
                  int rowstride= bbuf->x*4;
                  unsigned char *start= ((char*) bbuf->rect) + (y*21 + 3)*rowstride + (x*20 + 3)*4;
                  unsigned char transp[4];
                  /* this sets backdrop of icon to zero alpha */
                  transp[0]= start[0];
                  transp[1]= start[1];
                  transp[2]= start[2];
                  transp[3]= start[3];
                  clear_transp_rect(transp, start, 20, 21, rowstride);
                  
                  /* this sets outside of icon to zero alpha */
                  start= ((char*) bbuf->rect) + (y*21)*rowstride + (x*20)*4;
                  QUATCOPY(transp, start);
                  clear_transp_rect(transp, start, 20, 21, rowstride);
            }
      } 

      // disabled for now (ton)
      // texid= init_icon_texture(bbuf);

            /* hack! */
      for (y=0; y<10; y++) {
            for (x=0; x<21; x++) {
                  if (x==11 && y==6) {
                        def_icon(bbuf, texid, ICON_BEVELBUT_HLT,              x, y, 7, 13, 4, 2);
                  } else if (x==12 && y==6) {
                        def_icon(bbuf, texid, ICON_BEVELBUT_DEHLT,                  x, y, 7, 13, 4, 2);
                  } else {
                        def_icon(bbuf, texid, BIFICONID_FIRST + y*21 + x,     x, y, 15, 16, 0, 0);
                  }
            }
      }

      IMB_freeImBuf(bbuf);    
}

void BIF_resources_free(void)
{
      free_common_icons();

      MEM_freeN(common_icons_arr);
      
}


/* ******************************************************** */
/*    THEMES */
/* ******************************************************** */

char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
{
      ThemeSpace *ts= NULL;
      static char error[4]={240, 0, 240, 255};
      static char alert[4]={240, 60, 60, 255};
      static char headerdesel[4]={0,0,0,255};
      static char custom[4]={0,0,0,255};
      
      char *cp= error;
      
      if(btheme) {
      
            // first check for ui buttons theme
            if(colorid < TH_THEMEUI) {
            
                  switch(colorid) {
                  case TH_BUT_OUTLINE:
                        cp= btheme->tui.outline; break;
                  case TH_BUT_NEUTRAL:
                        cp= btheme->tui.neutral; break;
                  case TH_BUT_ACTION:
                        cp= btheme->tui.action; break;
                  case TH_BUT_SETTING:
                        cp= btheme->tui.setting; break;
                  case TH_BUT_SETTING1:
                        cp= btheme->tui.setting1; break;
                  case TH_BUT_SETTING2:
                        cp= btheme->tui.setting2; break;
                  case TH_BUT_NUM:
                        cp= btheme->tui.num; break;
                  case TH_BUT_TEXTFIELD:
                        cp= btheme->tui.textfield; break;
                  case TH_BUT_POPUP:
                        cp= btheme->tui.popup; break;
                  case TH_BUT_TEXT:
                        cp= btheme->tui.text; break;
                  case TH_BUT_TEXT_HI:
                        cp= btheme->tui.text_hi; break;
                  case TH_MENU_BACK:
                        cp= btheme->tui.menu_back; break;
                  case TH_MENU_ITEM:
                        cp= btheme->tui.menu_item; break;
                  case TH_MENU_HILITE:
                        cp= btheme->tui.menu_hilite; break;
                  case TH_MENU_TEXT:
                        cp= btheme->tui.menu_text; break;
                  case TH_MENU_TEXT_HI:
                        cp= btheme->tui.menu_text_hi; break;
                  
                  case TH_BUT_DRAWTYPE:
                        cp= &btheme->tui.but_drawtype; break;
                  
                  case TH_REDALERT:
                        cp= alert; break;
                  case TH_CUSTOM:
                        cp= custom; break;
                  }
            }
            else {
            
                  switch(spacetype) {
                  case SPACE_BUTS:
                        ts= &btheme->tbuts;
                        break;
                  case SPACE_VIEW3D:
                        ts= &btheme->tv3d;
                        break;
                  case SPACE_IPO:
                        ts= &btheme->tipo;
                        break;
                  case SPACE_FILE:
                        ts= &btheme->tfile;
                        break;
                  case SPACE_NLA:
                        ts= &btheme->tnla;
                        break;
                  case SPACE_ACTION:
                        ts= &btheme->tact;
                        break;
                  case SPACE_SEQ:
                        ts= &btheme->tseq;
                        break;
                  case SPACE_IMAGE:
                        ts= &btheme->tima;
                        break;
                  case SPACE_IMASEL:
                        ts= &btheme->timasel;
                        break;
                  case SPACE_TEXT:
                        ts= &btheme->text;
                        break;
                  case SPACE_OOPS:
                        ts= &btheme->toops;
                        break;
                  case SPACE_SOUND:
                        ts= &btheme->tsnd;
                        break;
                  case SPACE_INFO:
                        ts= &btheme->tinfo;
                        break;
                  default:
                        ts= &btheme->tv3d;
                        break;
                  }
                  
                  switch(colorid) {
                  case TH_BACK:
                        cp= ts->back; break;
                  case TH_TEXT:
                        cp= ts->text; break;
                  case TH_TEXT_HI:
                        cp= ts->text_hi; break;
                  case TH_HEADER:
                        cp= ts->header; break;
                  case TH_HEADERDESEL:
                        /* we calculate a dynamic builtin header deselect color, also for pulldowns... */
                        cp= ts->header; 
                        headerdesel[0]= cp[0]>10?cp[0]-10:0;
                        headerdesel[1]= cp[1]>10?cp[1]-10:0;
                        headerdesel[2]= cp[2]>10?cp[2]-10:0;
                        cp= headerdesel;
                        break;
                  case TH_PANEL:
                        cp= ts->panel; break;
                  case TH_SHADE1:
                        cp= ts->shade1; break;
                  case TH_SHADE2:
                        cp= ts->shade2; break;
                  case TH_HILITE:
                        cp= ts->hilite; break;
                        
                  case TH_GRID:
                        cp= ts->grid; break;
                  case TH_WIRE:
                        cp= ts->wire; break;
                  case TH_SELECT:
                        cp= ts->select; break;
                  case TH_ACTIVE:
                        cp= ts->active; break;
                  case TH_TRANSFORM:
                        cp= ts->transform; break;
                  case TH_VERTEX:
                        cp= ts->vertex; break;
                  case TH_VERTEX_SELECT:
                        cp= ts->vertex_select; break;
                  case TH_VERTEX_SIZE:
                        cp= &ts->vertex_size; break;
                  case TH_EDGE:
                        cp= ts->edge; break;
                  case TH_EDGE_SELECT:
                        cp= ts->edge_select; break;
                  case TH_EDGE_SEAM:
                        cp= ts->edge_seam; break;
                  case TH_EDGE_FACESEL:
                        cp= ts->edge_facesel; break;
                  case TH_FACE:
                        cp= ts->face; break;
                  case TH_FACE_SELECT:
                        cp= ts->face_select; break;
                  case TH_FACE_DOT:
                        cp= ts->face_dot; break;
                  case TH_FACEDOT_SIZE:
                        cp= &ts->facedot_size; break;
                  case TH_NORMAL:
                        cp= ts->normal; break;

                  }

            }
      }
      
      return cp;
}

#define SETCOL(col, r, g, b, a)  col[0]=r; col[1]=g; col[2]= b; col[3]= a;

/* initialize
   Note: when you add new colors, created & saved themes need initialized
   in usiblender.c, search for "versionfile"
*/
void BIF_InitTheme(void)
{
      bTheme *btheme= U.themes.first;
      
      /* we search for the theme with name Default */
      for(btheme= U.themes.first; btheme; btheme= btheme->next) {
            if(strcmp("Default", btheme->name)==0) break;
      }
      
      if(btheme==NULL) {
            btheme= MEM_callocN(sizeof(bTheme), "theme");
            BLI_addtail(&U.themes, btheme);
            strcpy(btheme->name, "Default");
      }
      
      BIF_SetTheme(NULL);     // make sure the global used in this file is set

      /* UI buttons (todo) */
      SETCOL(btheme->tui.outline,   0xA0,0xA0,0xA0, 255);
      SETCOL(btheme->tui.neutral,   0xA0,0xA0,0xA0, 255);
      SETCOL(btheme->tui.action,          0xAD,0xA0,0x93, 255);
      SETCOL(btheme->tui.setting,   0x8A,0x9E,0xA1, 255);
      SETCOL(btheme->tui.setting1,  0xA1,0xA1,0xAE, 255);
      SETCOL(btheme->tui.setting2,  0xA1,0x99,0xA7, 255);
      SETCOL(btheme->tui.num,             0x90,0x90,0x90, 255);
      SETCOL(btheme->tui.textfield, 0x90,0x90,0x90, 255);
      SETCOL(btheme->tui.popup,           0xA0,0xA0,0xA0, 255);
      
      SETCOL(btheme->tui.text,            0,0,0, 255);
      SETCOL(btheme->tui.text_hi,   255, 255, 255, 255);
      
      SETCOL(btheme->tui.menu_back,       0xD2,0xD2,0xD2, 255);
      SETCOL(btheme->tui.menu_item,       0xDA,0xDA,0xDA, 255);
      SETCOL(btheme->tui.menu_hilite, 0x7F,0x7F,0x7F, 255);
      SETCOL(btheme->tui.menu_text,       0, 0, 0, 255);
      SETCOL(btheme->tui.menu_text_hi, 255, 255, 255, 255);
      btheme->tui.but_drawtype= 1;
      
      /* space view3d */
      SETCOL(btheme->tv3d.back,     115, 115, 115, 255);
      SETCOL(btheme->tv3d.text,     0, 0, 0, 255);
      SETCOL(btheme->tv3d.text_hi, 255, 255, 255, 255);
      SETCOL(btheme->tv3d.header, 195, 195, 195, 255);
      SETCOL(btheme->tv3d.panel,    165, 165, 165, 127);
      
      SETCOL(btheme->tv3d.shade1,  160, 160, 160, 100);
      SETCOL(btheme->tv3d.shade2,  0x7f, 0x70, 0x70, 100);

      SETCOL(btheme->tv3d.grid,     92, 92, 92, 255);
      SETCOL(btheme->tv3d.wire,     0x0, 0x0, 0x0, 255);
      SETCOL(btheme->tv3d.select, 0xff, 0x88, 0xff, 255);
      SETCOL(btheme->tv3d.active, 0xff, 0xbb, 0xff, 255);
      SETCOL(btheme->tv3d.transform, 0xff, 0xff, 0xff, 255);
      SETCOL(btheme->tv3d.vertex, 0xff, 0x70, 0xff, 255);
      SETCOL(btheme->tv3d.vertex_select, 0xff, 0xff, 0x70, 255);
      btheme->tv3d.vertex_size= 2;
      SETCOL(btheme->tv3d.edge,     0x0, 0x0, 0x0, 255);
      SETCOL(btheme->tv3d.edge_select, 0xb0, 0xb0, 0x30, 255);
      SETCOL(btheme->tv3d.edge_seam, 230, 150, 50, 255);
      SETCOL(btheme->tv3d.edge_facesel, 75, 75, 75, 255);
      SETCOL(btheme->tv3d.face,     0, 50, 150, 30);
      SETCOL(btheme->tv3d.face_select, 200, 100, 200, 60);
      SETCOL(btheme->tv3d.normal, 0x22, 0xDD, 0xDD, 255);
      SETCOL(btheme->tv3d.face_dot, 255, 138, 48, 255);
      btheme->tv3d.facedot_size= 4;
      
      /* space buttons */
      /* to have something initialized */
      btheme->tbuts= btheme->tv3d;

      SETCOL(btheme->tbuts.back,    180, 180, 180, 255);
      SETCOL(btheme->tbuts.header, 195, 195, 195, 255);
      SETCOL(btheme->tbuts.panel,  255, 255, 255, 40);

      /* space ipo */
      /* to have something initialized */
      btheme->tipo= btheme->tv3d;

      SETCOL(btheme->tipo.grid,     94, 94, 94, 255);
      SETCOL(btheme->tipo.back,     120, 120, 120, 255);
      SETCOL(btheme->tipo.header, 195, 195, 195, 255);
      SETCOL(btheme->tipo.panel,  255, 255, 255, 150);
      SETCOL(btheme->tipo.shade1,  172, 172, 172, 100);
      SETCOL(btheme->tipo.shade2,  0x70, 0x70, 0x70, 100);
      SETCOL(btheme->tipo.vertex, 0xff, 0x70, 0xff, 255);
      SETCOL(btheme->tipo.vertex_select, 0xff, 0xff, 0x70, 255);
      SETCOL(btheme->tipo.hilite, 0x60, 0xc0, 0x40, 255); 

      /* space file */
      /* to have something initialized */
      btheme->tfile= btheme->tv3d;
      SETCOL(btheme->tfile.back,    128, 128, 128, 255);
      SETCOL(btheme->tfile.text,    0, 0, 0, 255);
      SETCOL(btheme->tfile.text_hi, 255, 255, 255, 255);
      SETCOL(btheme->tfile.header, 182, 182, 182, 255);
      SETCOL(btheme->tfile.hilite, 0xA0, 0xA0, 0xD0, 255); // selected files

      
      /* space action */
      btheme->tact= btheme->tv3d;
      SETCOL(btheme->tact.back,     116, 116, 116, 255);
      SETCOL(btheme->tact.text,     0, 0, 0, 255);
      SETCOL(btheme->tact.text_hi, 255, 255, 255, 255);
      SETCOL(btheme->tact.header, 182, 182, 182, 255);
      SETCOL(btheme->tact.grid,  94, 94, 94, 255);
      SETCOL(btheme->tact.face,  166, 166, 166, 255); // RVK
      SETCOL(btheme->tact.shade1,  172, 172, 172, 255);           // sliders
      SETCOL(btheme->tact.shade2,  84, 44, 31, 100);  // bar
      SETCOL(btheme->tact.hilite,  17, 27, 60, 100);  // bar

      /* space nla */
      btheme->tnla= btheme->tv3d;
      SETCOL(btheme->tnla.back,     116, 116, 116, 255);
      SETCOL(btheme->tnla.text,     0, 0, 0, 255);
      SETCOL(btheme->tnla.text_hi, 255, 255, 255, 255);
      SETCOL(btheme->tnla.header, 182, 182, 182, 255);
      SETCOL(btheme->tnla.grid,  94, 94, 94, 255);    
      SETCOL(btheme->tnla.shade1,  172, 172, 172, 255);           // sliders
      SETCOL(btheme->tnla.shade2,  84, 44, 31, 100);  // bar
      SETCOL(btheme->tnla.hilite,  17, 27, 60, 100);  // bar
      
      /* space seq */
      btheme->tseq= btheme->tv3d;
      SETCOL(btheme->tnla.back,     116, 116, 116, 255);

      /* space image */
      btheme->tima= btheme->tv3d;
      SETCOL(btheme->tima.back,     53, 53, 53, 255);
      SETCOL(btheme->tima.vertex, 0xff, 0x70, 0xff, 255);
      SETCOL(btheme->tima.vertex_select, 0xff, 0xff, 0x70, 255);
      btheme->tima.vertex_size= 2;
      SETCOL(btheme->tima.face,   0, 50, 150, 40);
      SETCOL(btheme->tima.face_select, 200, 100, 200, 80);

      /* space imageselect */
      btheme->timasel= btheme->tv3d;
      SETCOL(btheme->timasel.back,  110, 110, 110, 255);
      SETCOL(btheme->timasel.shade1,      0xaa, 0xaa, 0xba, 255);

      /* space text */
      btheme->text= btheme->tv3d;
      SETCOL(btheme->text.back,     153, 153, 153, 255);
      SETCOL(btheme->text.shade1,   143, 143, 143, 255);
      SETCOL(btheme->text.shade2,   0xc6, 0x77, 0x77, 255);
      SETCOL(btheme->text.hilite,   255, 0, 0, 255);

      /* space oops */
      btheme->toops= btheme->tv3d;
      SETCOL(btheme->toops.back,    153, 153, 153, 255);

      /* space info */
      btheme->tinfo= btheme->tv3d;
      SETCOL(btheme->tinfo.back,    153, 153, 153, 255);

      /* space sound */
      btheme->tsnd= btheme->tv3d;
      SETCOL(btheme->tsnd.back,     153, 153, 153, 255);
      SETCOL(btheme->tsnd.shade1,  173, 173, 173, 255);           // sliders
      SETCOL(btheme->tsnd.grid, 140, 140, 140, 255);
      

}

char *BIF_ThemeColorsPup(int spacetype)
{
      char *cp= MEM_callocN(21*32, "theme pup");
      char str[32];
      
      if(spacetype==0) {
            sprintf(str, "Outline %%x%d|", TH_BUT_OUTLINE); strcat(cp, str);
            sprintf(str, "Neutral %%x%d|", TH_BUT_NEUTRAL); strcat(cp, str);
            sprintf(str, "Action %%x%d|", TH_BUT_ACTION); strcat(cp, str);
            sprintf(str, "Setting %%x%d|", TH_BUT_SETTING); strcat(cp, str);
            sprintf(str, "Special Setting 1%%x%d|", TH_BUT_SETTING1); strcat(cp, str);
            sprintf(str, "Special Setting 2 %%x%d|", TH_BUT_SETTING2); strcat(cp, str);
            sprintf(str, "Number Input %%x%d|", TH_BUT_NUM); strcat(cp, str);
            sprintf(str, "Text Input %%x%d|", TH_BUT_TEXTFIELD); strcat(cp, str);
            sprintf(str, "Popup %%x%d|", TH_BUT_POPUP); strcat(cp, str);
            sprintf(str, "Text %%x%d|", TH_BUT_TEXT); strcat(cp, str);
            sprintf(str, "Text Highlight %%x%d|", TH_BUT_TEXT_HI); strcat(cp, str);
                  strcat(cp,"%l|");
            sprintf(str, "Menu Background %%x%d|", TH_MENU_BACK); strcat(cp, str);
            sprintf(str, "Menu Item %%x%d|", TH_MENU_ITEM); strcat(cp, str);
            sprintf(str, "Menu Item Highlight %%x%d|", TH_MENU_HILITE); strcat(cp, str);
            sprintf(str, "Menu Text %%x%d|", TH_MENU_TEXT); strcat(cp, str);
            sprintf(str, "Menu Text Highlight %%x%d|", TH_MENU_TEXT_HI); strcat(cp, str);
            strcat(cp,"%l|");
            sprintf(str, "Drawtype %%x%d|", TH_BUT_DRAWTYPE); strcat(cp, str);
      }
      else {
            // first defaults for each space
            sprintf(str, "Background %%x%d|", TH_BACK); strcat(cp, str);
            sprintf(str, "Text %%x%d|", TH_TEXT); strcat(cp, str);
            sprintf(str, "Text Highlight %%x%d|", TH_TEXT_HI); strcat(cp, str);
            sprintf(str, "Header %%x%d|", TH_HEADER); strcat(cp, str);
            
            if(spacetype==SPACE_VIEW3D) {
                  sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
                  strcat(cp,"%l|");
                  sprintf(str, "Grid %%x%d|", TH_GRID); strcat(cp, str);
                  sprintf(str, "Wire %%x%d|", TH_WIRE); strcat(cp, str);
                  sprintf(str, "Object Selected %%x%d|", TH_SELECT); strcat(cp, str);
                  sprintf(str, "Object Active %%x%d|", TH_ACTIVE); strcat(cp, str);
                  sprintf(str, "Transform %%x%d|", TH_TRANSFORM); strcat(cp, str);
                  strcat(cp,"%l|");
                  sprintf(str, "Vertex %%x%d|", TH_VERTEX); strcat(cp, str);
                  sprintf(str, "Vertex Selected %%x%d|", TH_VERTEX_SELECT); strcat(cp, str);
                  sprintf(str, "Vertex Size %%x%d|", TH_VERTEX_SIZE); strcat(cp, str);
                  sprintf(str, "Edge Selected %%x%d|", TH_EDGE_SELECT); strcat(cp, str);
                  sprintf(str, "Edge Seam %%x%d|", TH_EDGE_SEAM); strcat(cp, str);
                  sprintf(str, "Edge UV Face Select %%x%d|", TH_EDGE_FACESEL); strcat(cp, str);
                  sprintf(str, "Face (transp) %%x%d|", TH_FACE); strcat(cp, str);
                  sprintf(str, "Face Selected (transp) %%x%d|", TH_FACE_SELECT); strcat(cp, str);
                  sprintf(str, "Face Dot Selected %%x%d|", TH_FACE_DOT); strcat(cp, str);
                  sprintf(str, "Face Dot Size %%x%d|", TH_FACEDOT_SIZE); strcat(cp, str);
                  sprintf(str, "Normal %%x%d", TH_NORMAL); strcat(cp, str);
            }
            else if(spacetype==SPACE_IPO) {
                  sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
                  strcat(cp,"%l|");
                  sprintf(str, "Window Sliders %%x%d|", TH_SHADE1); strcat(cp, str);
                  sprintf(str, "Ipo Channels %%x%d|", TH_SHADE2); strcat(cp, str);
                  sprintf(str, "Vertex %%x%d|", TH_VERTEX); strcat(cp, str);
                  sprintf(str, "Vertex Selected %%x%d|", TH_VERTEX_SELECT); strcat(cp, str);
            }
            else if(spacetype==SPACE_FILE) {
                  sprintf(str, "Selected file %%x%d", TH_HILITE); strcat(cp, str);
            }
            else if(spacetype==SPACE_NLA) {
                  //sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
                  strcat(cp,"%l|");
                  sprintf(str, "View Sliders %%x%d|", TH_SHADE1); strcat(cp, str);
                  sprintf(str, "Bars %%x%d|", TH_SHADE2); strcat(cp, str);
                  sprintf(str, "Bars selected %%x%d|", TH_HILITE); strcat(cp, str);
            }
            else if(spacetype==SPACE_ACTION) {
                  //sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
                  strcat(cp,"%l|");
                  sprintf(str, "RVK Sliders %%x%d|", TH_FACE); strcat(cp, str);
                  sprintf(str, "View Sliders %%x%d|", TH_SHADE1); strcat(cp, str);
                  sprintf(str, "Channels %%x%d|", TH_SHADE2); strcat(cp, str);
                  sprintf(str, "Channels Selected %%x%d|", TH_HILITE); strcat(cp, str);
            }
            else if(spacetype==SPACE_IMAGE) {
                  strcat(cp,"%l|");
                  sprintf(str, "Vertex %%x%d|", TH_VERTEX); strcat(cp, str);
                  sprintf(str, "Vertex Selected %%x%d|", TH_VERTEX_SELECT); strcat(cp, str);
                  sprintf(str, "Vertex Size %%x%d|", TH_VERTEX_SIZE); strcat(cp, str);
                  sprintf(str, "Face %%x%d|", TH_FACE); strcat(cp, str);
                  sprintf(str, "Face Selected %%x%d", TH_FACE_SELECT); strcat(cp, str);
            }
            else if(spacetype==SPACE_SEQ) {
                  sprintf(str, "Window Sliders %%x%d|", TH_SHADE1); strcat(cp, str);
            }
            else if(spacetype==SPACE_SOUND) {
                  sprintf(str, "Window Slider %%x%d|", TH_SHADE1); strcat(cp, str);
            }
            else if(spacetype==SPACE_BUTS) {
                  sprintf(str, "Panel %%x%d|", TH_PANEL); strcat(cp, str);
            }
            else if(spacetype==SPACE_IMASEL) {
                  sprintf(str, "Main Shade %%x%d|", TH_SHADE1); strcat(cp, str);
            }
            else if(spacetype==SPACE_TEXT) {
                  sprintf(str, "Scroll Bar %%x%d|", TH_SHADE1); strcat(cp, str);
                  sprintf(str, "Selected Text %%x%d|", TH_SHADE2); strcat(cp, str);
                  sprintf(str, "Cursor %%x%d|", TH_HILITE); strcat(cp, str);
            }
      }
      return cp;
}

void BIF_SetTheme(ScrArea *sa)
{
      if(sa==NULL) {    // called for safety, when delete themes
            theme_active= U.themes.first;
            theme_spacetype= SPACE_VIEW3D;
      }
      else {
            // later on, a local theme can be found too
            theme_active= U.themes.first;
            theme_spacetype= sa->spacetype;
      
      }
}

// for space windows only
void BIF_ThemeColor(int colorid)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      glColor3ub(cp[0], cp[1], cp[2]);

}

// plus alpha
void BIF_ThemeColor4(int colorid)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      glColor4ub(cp[0], cp[1], cp[2], cp[3]);

}

// set the color with offset for shades
void BIF_ThemeColorShade(int colorid, int offset)
{
      int r, g, b;
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      r= offset + (int) cp[0];
      CLAMP(r, 0, 255);
      g= offset + (int) cp[1];
      CLAMP(g, 0, 255);
      b= offset + (int) cp[2];
      CLAMP(b, 0, 255);
      //glColor3ub(r, g, b);
      glColor4ub(r, g, b, cp[3]);
}
void BIF_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
{
      int r, g, b, a;
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      r= coloffset + (int) cp[0];
      CLAMP(r, 0, 255);
      g= coloffset + (int) cp[1];
      CLAMP(g, 0, 255);
      b= coloffset + (int) cp[2];
      CLAMP(b, 0, 255);
      a= alphaoffset + (int) cp[3];
      CLAMP(a, 0, 255);
      glColor4ub(r, g, b, a);
}

// blend between to theme colors, and set it
void BIF_ThemeColorBlend(int colorid1, int colorid2, float fac)
{
      int r, g, b;
      char *cp1, *cp2;
      
      cp1= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
      cp2= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);

      if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
      r= floor((1.0-fac)*cp1[0] + fac*cp2[0]);
      g= floor((1.0-fac)*cp1[1] + fac*cp2[1]);
      b= floor((1.0-fac)*cp1[2] + fac*cp2[2]);
      
      glColor3ub(r, g, b);
}

// blend between to theme colors, shade it, and set it
void BIF_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
{
      int r, g, b;
      char *cp1, *cp2;
      
      cp1= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
      cp2= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);

      if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
      r= offset+floor((1.0-fac)*cp1[0] + fac*cp2[0]);
      g= offset+floor((1.0-fac)*cp1[1] + fac*cp2[1]);
      b= offset+floor((1.0-fac)*cp1[2] + fac*cp2[2]);
      
      r= r<0?0:(r>255?255:r);
      g= g<0?0:(g>255?255:g);
      b= b<0?0:(b>255?255:b);
      
      glColor3ub(r, g, b);
}


// get individual values, not scaled
float BIF_GetThemeValuef(int colorid)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      return ((float)cp[0]);

}

// get individual values, not scaled
int BIF_GetThemeValue(int colorid)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      return ((int) cp[0]);

}


// get the color, range 0.0-1.0
void BIF_GetThemeColor3fv(int colorid, float *col)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      col[0]= ((float)cp[0])/255.0;
      col[1]= ((float)cp[1])/255.0;
      col[2]= ((float)cp[2])/255.0;
}

// get the color, in char pointer
void BIF_GetThemeColor3ubv(int colorid, char *col)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      col[0]= cp[0];
      col[1]= cp[1];
      col[2]= cp[2];
}

// get the color, in char pointer
void BIF_GetThemeColor4ubv(int colorid, char *col)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
      col[0]= cp[0];
      col[1]= cp[1];
      col[2]= cp[2];
      col[3]= cp[3];
}

void BIF_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
{
      char *cp;
      
      cp= BIF_ThemeGetColorPtr(theme_active, spacetype, colorid);
      col[0]= cp[0];
      col[1]= cp[1];
      col[2]= cp[2];
      col[3]= cp[3];
}

Generated by  Doxygen 1.6.0   Back to index