home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Programming / Triton / Source / src / frame_prim.c < prev    next >
C/C++ Source or Header  |  1998-05-23  |  12KB  |  375 lines

  1. /*
  2.  *  OpenTriton -- A free release of the triton.library source code
  3.  *  Copyright (C) 1993-1998  Stefan Zeiger
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  frame_prim.c - Frame Primitives
  20.  *
  21.  */
  22.  
  23.  
  24. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. //////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
  26. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28. #define INTUI_V36_NAMES_ONLY
  29. #define TR_NOSUPPORT
  30. #define TR_THIS_IS_TRITON
  31. #define TR_EXTERNAL_ONLY
  32.  
  33. #include "include/libraries/triton.h"
  34. #include "include/clib/triton_protos.h"
  35. #include "prefs/Triton.h"
  36. #include "/internal.h"
  37.  
  38. #include "parts/define_classes.h"
  39.  
  40.  
  41. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. ///////////////////////////////////////////////////////////////////////////////////////// Frame Primitives //
  43. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44.  
  45. BOOL __regargs TR_ThickBorders(struct TR_Project *project)
  46. {
  47.   return ((struct TR_AppPrefs *)(project->trp_App->tra_Prefs))->frames_width;
  48. }
  49.  
  50.  
  51. /****** triton.library/TR_FrameBorderHeight ******
  52. *
  53. *   NAME    
  54. *    TR_FrameBorderHeight -- Returns frame border height. (V6)
  55. *
  56. *   SYNOPSIS
  57. *    Height = TR_FrameBorderHeight(Project, Type)
  58. *                                  A0       D0
  59. *
  60. *    ULONG TR_FrameBorderHeight(struct TR_Project *, UWORD);
  61. *
  62. *   FUNCTION
  63. *    Returns the thickness of the top/bottom borders of the
  64. *    specified frame type (TRFT_#?) in a specific project
  65. *    taking into account the user's preferences settings.
  66. *
  67. *   RESULT
  68. *    Height - The height of the borders in pixels
  69. *
  70. *   SEE ALSO
  71. *    TR_FrameBorderWidth(), TR_DrawFrame()
  72. *
  73. ******/
  74.  
  75. ULONG __saveds __asm TR_FrameBorderHeight(register __a0 struct TR_Project *project, register __d0 UWORD type)
  76. {
  77.   if(type>=TRFT_ABSTRACT_BUTTON)
  78.     {
  79.       type=((struct TR_AppPrefs *)(project->trp_App->tra_Prefs))->frames_type[type-TRFT_ABSTRACT_BUTTON];
  80.       if(type>3) type+=29;
  81.     }
  82.  
  83.   if(type>=TRFT_XENBUTTON1) return 2; else return (ULONG)type; /* Neat shortcut ;) */
  84. }
  85.  
  86.  
  87. /****** triton.library/TR_FrameBorderWidth ******
  88. *
  89. *   NAME    
  90. *    TR_FrameBorderWidth -- Returns frame border width. (V6)
  91. *
  92. *   SYNOPSIS
  93. *    Width = TR_FrameBorderWidth(Project, Type)
  94. *                                A0       D0
  95. *
  96. *    ULONG TR_FrameBorderWidth(struct TR_Project *, UWORD);
  97. *
  98. *   FUNCTION
  99. *    Returns the thickness of the left/right borders of the
  100. *    specified frame type (TRFT_#?) in a specific project
  101. *    taking into account the user's preferences settings.
  102. *
  103. *   RESULT
  104. *    Width - The width of the borders in pixels
  105. *
  106. *   SEE ALSO
  107. *    TR_FrameBorderHeight(), TR_DrawFrame()
  108. *
  109. ******/
  110.  
  111. ULONG __saveds __asm TR_FrameBorderWidth(register __a0 struct TR_Project *project, register __d0 UWORD type)
  112. {
  113.   ULONG width=TR_FrameBorderHeight(project,type);
  114.   if(TR_ThickBorders(project)) width=width<<1;
  115.   return width;
  116. }
  117.  
  118.  
  119. /****** triton.library/TR_DrawFrame ******
  120. *
  121. *   NAME    
  122. *    TR_DrawFrame -- Draws a frame/BevelBox. (V6)
  123. *
  124. *   SYNOPSIS
  125. *    TR_DrawFrame(Project, RastPort, Left, Top, Width,
  126. *                 A0       A1        D1    D2   D3
  127. *                 Height, Type, Inverted)
  128. *                 D4      D0    D5
  129. *
  130. *    VOID TR_DrawFrame(struct TR_Project *,
  131. *                      struct RastPort *, UWORD, UWORD,
  132. *                      UWORD, UWORD, UWORD, BOOL);
  133. *
  134. *   FUNCTION
  135. *    Draws a frame into the specified RastPort (or into
  136. *    the project's default RastPort if the supplied RastPort
  137. *    is NULL. Set Inverted to TRUE for a recessed (basic) or
  138. *    inverted (abstract) frame.
  139. *
  140. *   SEE ALSO
  141. *    TR_FrameBorderWidth(), TR_FrameBorderHeight()
  142. *
  143. ******/
  144.  
  145. VOID __asm TR_InternalDrawFrame(register __a0 struct TR_Project *project,
  146.                 register __a1 struct RastPort *rp, register __d1 UWORD left,
  147.                 register __d2 UWORD top, register __d3 UWORD width,
  148.                 register __d4 UWORD height, register __d0 UWORD type,
  149.                 register __d5 BOOL inverted)
  150. {
  151.   UWORD shinecolor,shadowcolor,backgroundcolor,realshinecolor,realshadowcolor,hshinecolor,hshadowcolor;
  152.   BOOL raised=TRUE;
  153.   struct TagItem dbbtags[]=
  154.   {
  155.     GT_VisualInfo,0,
  156.     0,TRUE,
  157.     GTBB_FrameType,BBFT_BUTTON,
  158.     TAG_END
  159.   };
  160.  
  161.   if(!rp) rp=project->trp_Window->RPort;
  162.  
  163.   if(type>=TRFT_ABSTRACT_BUTTON)
  164.     {
  165.       raised=((struct TR_AppPrefs *)(project->trp_App->tra_Prefs))->frames_raised[type-TRFT_ABSTRACT_BUTTON];
  166.       type=((struct TR_AppPrefs *)(project->trp_App->tra_Prefs))->frames_type[type-TRFT_ABSTRACT_BUTTON];
  167.       if(type>3) type+=29;
  168.     }
  169.   if(inverted) raised=raised?FALSE:TRUE;
  170.  
  171.   backgroundcolor = TR_GetPen(project,TRPT_SYSTEMPEN,BACKGROUNDPEN);
  172.   realshinecolor  = TR_GetPen(project,TRPT_SYSTEMPEN,SHINEPEN);
  173.   realshadowcolor = TR_GetPen(project,TRPT_SYSTEMPEN,SHADOWPEN);
  174.   hshinecolor     = TR_GetPen(project,TRPT_TRITONPEN,TRTP_HALFSHINE);
  175.   hshadowcolor    = TR_GetPen(project,TRPT_TRITONPEN,TRTP_HALFSHADOW);
  176.  
  177.   if(raised)
  178.   {
  179.     shinecolor=realshinecolor;
  180.     shadowcolor=realshadowcolor;
  181.   }
  182.   else
  183.   {
  184.     shinecolor=realshadowcolor;
  185.     shadowcolor=realshinecolor;
  186.   }
  187.  
  188.   SetAfPt(rp,NULL,-1);
  189.   SetDrMd(rp,JAM1);
  190.  
  191.   if(TR_ThickBorders(project))
  192.   {
  193.     if((type==TRFT_XENBUTTON1)||(type==TRFT_XENBUTTON2))
  194.     {
  195.       if(raised) SetAPen(rp,inverted?hshadowcolor:realshinecolor); else SetAPen(rp,hshadowcolor);
  196.       Move(rp,left+width-4,top+1);
  197.       Draw(rp,left+2,top+1);
  198.       Draw(rp,left+2,top+height-2);
  199.       Move(rp,left+3,top+1);
  200.       Draw(rp,left+3,top+height-2);
  201.       if(raised) SetAPen(rp,inverted?realshinecolor:hshadowcolor); else SetAPen(rp,realshinecolor);
  202.       Draw(rp,left+width-4,top+height-2);
  203.       Draw(rp,left+width-4,top+2);
  204.       Move(rp,left+width-3,top+height-2);
  205.       Draw(rp,left+width-3,top+1);
  206.       SetAPen(rp,realshadowcolor);
  207.       if(type==TRFT_XENBUTTON1)
  208.       {
  209.         Move(rp,left+width-1,top);
  210.         Draw(rp,left+width-1,top+height-1);
  211.         Move(rp,left+width-2,top);
  212.         Draw(rp,left+width-2,top+height-1);
  213.         Draw(rp,left+1,top+height-1);
  214.         Draw(rp,left+1,top);
  215.         Move(rp,left,top+height-1);
  216.         Draw(rp,left,top);
  217.         Draw(rp,left+width-1,top);
  218.       }
  219.       else
  220.       {
  221.         Move(rp,left+1,top);
  222.         Draw(rp,left+width-2,top);
  223.         Move(rp,left+1,top+height-1);
  224.         Draw(rp,left+width-2,top+height-1);
  225.         Move(rp,left,top+1);
  226.         Draw(rp,left,top+height-2);
  227.         Move(rp,left+1,top+1);
  228.         Draw(rp,left+1,top+height-2);
  229.         Move(rp,left+width-1,top+1);
  230.         Draw(rp,left+width-1,top+height-2);
  231.         Move(rp,left+width-2,top+1);
  232.         Draw(rp,left+width-2,top+height-2);
  233.       }
  234.     }
  235.     else
  236.     {
  237.       if(type==TRFT_NEXTBUTTON)
  238.       {
  239.         SetAPen(rp,raised?hshinecolor:hshadowcolor);
  240.         Move(rp,left+width-4,top+1);
  241.         Draw(rp,left+2,top+1);
  242.         Draw(rp,left+2,top+height-2);
  243.         Move(rp,left+3,top+1);
  244.         Draw(rp,left+3,top+height-2);
  245.         SetAPen(rp,raised?hshadowcolor:hshinecolor);
  246.         Draw(rp,left+width-4,top+height-2);
  247.         Draw(rp,left+width-4,top+2);
  248.         Move(rp,left+width-3,top+height-2);
  249.         Draw(rp,left+width-3,top+1);
  250.         type=TRFT_BUTTON;
  251.       }
  252.       dbbtags[0].ti_Data=(ULONG)project->trp_VisualInfo;
  253.       dbbtags[1].ti_Tag=raised?TAG_IGNORE:GTBB_Recessed;
  254.       #ifdef TR_OS39
  255.         dbbtags[2].ti_Data=type;
  256.         DrawBevelBoxA(rp,left,top,width,height,dbbtags);
  257.       #else
  258.         if(TR_Global.trg_OSVersion>=39)
  259.         {
  260.       dbbtags[2].ti_Data=type;
  261.           DrawBevelBoxA(rp,left,top,width,height,dbbtags);
  262.         }
  263.         else
  264.         {
  265.           DrawBevelBoxA(rp,left,top,width,height,dbbtags);
  266.           if(type==TRFT_ICONDROPBOX) DrawBevelBoxA(rp,left+4,top+2,width-8,height-4,dbbtags);
  267.           else if(type==TRFT_RIDGE) DrawBevelBoxA(rp,left+2,top+1,width-4,height-2,dbbtags);
  268.         }
  269.       #endif
  270.  
  271.       if(type==TRFT_ICONDROPBOX)
  272.       {
  273.         SetAPen(rp,backgroundcolor);
  274.         Move(rp,left+width-4,top+1);
  275.         Draw(rp,left+width-4,top+height-2);
  276.         Draw(rp,left+3,top+height-2);
  277.         Draw(rp,left+3,top+1);
  278.         Draw(rp,left+width-4,top+1);
  279.         Move(rp,left+width-3,top+1);
  280.         Draw(rp,left+width-3,top+height-2);
  281.         Move(rp,left+2,top+1);
  282.         Draw(rp,left+2,top+height-2);
  283.       }
  284.     }
  285.   }
  286.   else
  287.   {
  288.     if((type==TRFT_XENBUTTON1)||(type==TRFT_XENBUTTON2))
  289.     {
  290.       if(raised) SetAPen(rp,inverted?realshinecolor:hshadowcolor); else SetAPen(rp,realshinecolor);
  291.       Move(rp,left+width-2,top+1);
  292.       Draw(rp,left+width-2,top+height-2);
  293.       Draw(rp,left+1,top+height-2);
  294.       if(raised) SetAPen(rp,inverted?hshadowcolor:realshinecolor); else SetAPen(rp,hshadowcolor);
  295.       Draw(rp,left+1,top+1);
  296.       Draw(rp,left+width-2,top+1);
  297.       SetAPen(rp,realshadowcolor);
  298.       if(type==TRFT_XENBUTTON1)
  299.       {
  300.         Move(rp,left+width-1,top);
  301.         Draw(rp,left+width-1,top+height-1);
  302.         Draw(rp,left,top+height-1);
  303.         Draw(rp,left,top);
  304.         Draw(rp,left+width-1,top);
  305.       }
  306.       else
  307.       {
  308.         Move(rp,left+1,top);
  309.         Draw(rp,left+width-2,top);
  310.         Move(rp,left+1,top+height-1);
  311.         Draw(rp,left+width-2,top+height-1);
  312.         Move(rp,left,top+1);
  313.         Draw(rp,left,top+height-2);
  314.         Move(rp,left+width-1,top+1);
  315.         Draw(rp,left+width-1,top+height-2);
  316.       }
  317.     }
  318.     else
  319.     {
  320.       SetAPen(rp,shadowcolor);
  321.       Move(rp,left+width-1,top);
  322.       Draw(rp,left+width-1,top+height-1);
  323.       Draw(rp,left,top+height-1);
  324.       SetAPen(rp,shinecolor);
  325.       Draw(rp,left,top);
  326.       Draw(rp,left+width-1,top);
  327.   
  328.       if(type==TRFT_ICONDROPBOX)
  329.       {
  330.         Move(rp,left+width-3,top+2);
  331.         Draw(rp,left+width-3,top+height-3);
  332.         Draw(rp,left+2,top+height-3);
  333.         SetAPen(rp,shadowcolor);
  334.         Draw(rp,left+2,top+2);
  335.         Draw(rp,left+width-3,top+2);
  336.   
  337.         SetAPen(rp,backgroundcolor);
  338.         Move(rp,left+width-2,top+1);
  339.         Draw(rp,left+width-2,top+height-2);
  340.         Draw(rp,left+1,top+height-2);
  341.         Draw(rp,left+1,top+1);
  342.         Draw(rp,left+width-2,top+1);
  343.       }
  344.       else if(type==TRFT_RIDGE)
  345.       {
  346.         Move(rp,left+width-2,top+1);
  347.         Draw(rp,left+width-2,top+height-2);
  348.         Draw(rp,left+1,top+height-2);
  349.         SetAPen(rp,shadowcolor);
  350.         Draw(rp,left+1,top+1);
  351.         Draw(rp,left+width-2,top+1);
  352.       }
  353.       else if(type==TRFT_NEXTBUTTON)
  354.       {
  355.         SetAPen(rp,raised?hshadowcolor:hshinecolor);
  356.         Move(rp,left+width-2,top+1);
  357.         Draw(rp,left+width-2,top+height-2);
  358.         Draw(rp,left+1,top+height-2);
  359.         SetAPen(rp,raised?hshinecolor:hshadowcolor);
  360.         Draw(rp,left+1,top+1);
  361.         Draw(rp,left+width-2,top+1);
  362.       }
  363.     }
  364.   }
  365. }
  366.  
  367. VOID __saveds __asm TR_DrawFrame(register __a0 struct TR_Project *project,
  368.                  register __a1 struct RastPort *rp, register __d1 UWORD left,
  369.                  register __d2 UWORD top, register __d3 UWORD width,
  370.                  register __d4 UWORD height, register __d0 UWORD type,
  371.                  register __d5 BOOL inverted)
  372. {
  373.   TR_InternalDrawFrame(project,rp,left,top,width,height,type,inverted);
  374. }
  375.