home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / gempp15b / gemrawo.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-23  |  4.9 KB  |  227 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  This file is Copyright 1992,1993 by Warwick W. Allison.
  4. //  This file is part of the gem++ library.
  5. //  You are free to copy and modify these sources, provided you acknowledge
  6. //  the origin by retaining this notice, and adhere to the conditions
  7. //  described in the file COPYING.LIB.
  8. //
  9. /////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include "gemrawo.h"
  12. #include <string.h>
  13.  
  14. // Apparently, this DAMNED USEFUL struct is for __TCC_COMPAT__ only!
  15. typedef struct {
  16.     unsigned short character   :  8;
  17.     signed   short framesize   :  8;
  18.     unsigned short framecol    :  4;
  19.     unsigned short textcol     :  4;
  20.     unsigned short textmode    :  1;
  21.     unsigned short fillpattern :  3;
  22.     unsigned short interiorcol :  4;
  23. } bfobspec;
  24.  
  25. GEMrawobject::GEMrawobject(const GEMrawobject& copy)
  26. {
  27.     memcpy(this,©,sizeof(GEMrawobject));
  28.  
  29.     int copylevel=ExtType()&3;
  30.  
  31.     if (Editable()) copylevel^=2;
  32.  
  33.     unsigned long& spec=Indirect() ? *((unsigned long*)ob_spec) : ob_spec;
  34.  
  35.     if (copylevel) {
  36.         switch (Type()) {
  37.          case G_TEXT: case G_BOXTEXT: case G_FTEXT: case G_FBOXTEXT: {
  38.             TEDINFO* cp=(TEDINFO*)spec;
  39.             TEDINFO* te=new TEDINFO;
  40.             *te=*cp;
  41.  
  42.             if (copylevel&2) {
  43.                 te->te_ptext=strdup(cp->te_ptext);
  44.             }
  45.  
  46.             if (copylevel&1) {
  47.                 te->te_ptmplt=strdup(cp->te_ptmplt);
  48.                 te->te_pvalid=strdup(cp->te_pvalid);
  49.             }
  50.  
  51.             spec=(unsigned long)te;
  52.         } break; case G_IMAGE: {
  53.             BITBLK* cp=(BITBLK*)spec;
  54.             BITBLK* bi=new BITBLK;
  55.             *bi=*cp;
  56.             bi->bi_pdata=new char[cp->bi_wb*cp->bi_hl];
  57.             memcpy(bi->bi_pdata,cp->bi_pdata,cp->bi_wb*cp->bi_hl);
  58.             spec=(unsigned long)bi;
  59.         } break; case G_BUTTON: case G_STRING: case G_TITLE: {
  60.             spec=(unsigned long)strdup((char*)spec);
  61.         } break; case G_ICON: {
  62.             ICONBLK* cp=(ICONBLK*)spec;
  63.             ICONBLK* ib=new ICONBLK;
  64.             *ib=*cp;
  65.  
  66.             if (copylevel&1) {
  67.                 int dlen=cp->ib_wicon*cp->ib_hicon/16;
  68.                 ib->ib_pdata=new short[dlen];
  69.                 ib->ib_pmask=new short[dlen];
  70.                 memcpy(ib->ib_pdata,cp->ib_pdata,dlen*sizeof(short));
  71.                 memcpy(ib->ib_pmask,cp->ib_pmask,dlen*sizeof(short));
  72.             }
  73.  
  74.             if (copylevel&2) {
  75.                 ib->ib_ptext=strdup(cp->ib_ptext);
  76.             }
  77.  
  78.             spec=(unsigned long)ib;
  79.         } break; case G_USERDEF:    // Hmm...
  80.             ;
  81.         }
  82.     }
  83. }
  84.  
  85. char* GEMrawobject::ImageBitmap(bool Mask=FALSE) const
  86. {
  87.     switch (Type()) {
  88.      case G_IMAGE:
  89.         return ((BITBLK*)ObjectSpecific())->bi_pdata;
  90.     break; case G_ICON:
  91.         if (Mask)
  92.             return (char*)((ICONBLK*)ObjectSpecific())->ib_pmask;
  93.         else
  94.             return (char*)((ICONBLK*)ObjectSpecific())->ib_pdata;
  95.     break; default:
  96.         return 0;
  97.     }
  98.     return 0;
  99. }
  100.  
  101. short GEMrawobject::ImageWidth() const
  102. {
  103.     switch (Type()) {
  104.      case G_IMAGE:
  105.         return ((BITBLK*)ObjectSpecific())->bi_wb*8;
  106.     break; case G_ICON:
  107.         return ((ICONBLK*)ObjectSpecific())->ib_wicon;
  108.     break; default:
  109.         return 0;
  110.     }
  111.     return 0;
  112. }
  113.  
  114. short GEMrawobject::ImageHeight() const
  115. {
  116.     switch (Type()) {
  117.      case G_IMAGE:
  118.         return ((BITBLK*)ObjectSpecific())->bi_hl;
  119.     break; case G_ICON:
  120.         return ((ICONBLK*)ObjectSpecific())->ib_hicon;
  121.     break; default:
  122.         return 0;
  123.     }
  124.     return 0;
  125. }
  126.  
  127. void GEMrawobject::SetImageBitmap(char* d, short w, short h, bool Mask=FALSE)
  128. {
  129.     switch (Type()) {
  130.      case G_IMAGE:
  131.         ((BITBLK*)ObjectSpecific())->bi_pdata=d;
  132.         ((BITBLK*)ObjectSpecific())->bi_wb=w/8;
  133.         ((BITBLK*)ObjectSpecific())->bi_hl=h;
  134.     break; case G_ICON:
  135.         if (Mask)
  136.             ((ICONBLK*)ObjectSpecific())->ib_pmask=(short*)d;
  137.         else
  138.             ((ICONBLK*)ObjectSpecific())->ib_pdata=(short*)d;
  139.         ((ICONBLK*)ObjectSpecific())->ib_wicon=w;
  140.         ((ICONBLK*)ObjectSpecific())->ib_hicon=h;
  141.     }
  142. }
  143.  
  144. char* GEMrawobject::Text() const
  145. {
  146.     switch (Type()) {
  147.      case G_ICON:
  148.         return ((ICONBLK*)ObjectSpecific())->ib_ptext;
  149.     break;
  150.         case G_BOXTEXT:
  151.         case G_TEXT:
  152.         case G_FTEXT:
  153.         case G_FBOXTEXT:
  154.             return ((TEDINFO*)ObjectSpecific())->te_ptext;
  155.     break;
  156.         case G_BOXCHAR: // First byte is char.  This usage is dubious.
  157.         case G_STRING:
  158.         case G_BUTTON:
  159.             return (char*)ObjectSpecific();
  160.     break;
  161.         default:
  162.             return "";
  163.     }
  164. }
  165.  
  166. void GEMrawobject::Font(int font)
  167. {
  168.     switch (Type()) {
  169.         case G_BOXTEXT:
  170.         case G_TEXT:
  171.         case G_FTEXT:
  172.         case G_FBOXTEXT:
  173.             ((TEDINFO*)ObjectSpecific())->te_font=font;
  174.     }
  175. }
  176.  
  177. int GEMrawobject::Font() const
  178. {
  179.     switch (Type()) {
  180.      case G_BOXTEXT:
  181.      case G_TEXT:
  182.      case G_FTEXT:
  183.      case G_FBOXTEXT:
  184.         return ((TEDINFO*)ObjectSpecific())->te_font;
  185.     break; default:
  186.         return IBM;
  187.     }
  188. }
  189.  
  190. void GEMrawobject::SetText(char* t)
  191. {
  192.     switch (Type()) {
  193.      case G_ICON:
  194.         ((ICONBLK*)ObjectSpecific())->ib_ptext=t;
  195.     break;
  196.         case G_BOXTEXT:
  197.         case G_TEXT:
  198.         case G_FTEXT:
  199.         case G_FBOXTEXT:
  200.             ((TEDINFO*)ObjectSpecific())->te_ptext=t;
  201.     break;
  202.         case G_STRING:
  203.         case G_BUTTON:
  204.             ObjectSpecific((int)t);
  205.     break;
  206.         case G_BOXCHAR:
  207.             ((bfobspec*)ObjectSpecific())->character=*t;
  208.     }
  209. }
  210.  
  211. int GEMrawobject::FillPattern() const
  212. {
  213.     switch (Type()) {
  214.      case G_BOXCHAR:
  215.      case G_BOX:
  216.      case G_IBOX:
  217.         return ((bfobspec*)ObjectSpecific())->fillpattern;
  218.     break; default:
  219.         return 0;
  220.     }
  221. }
  222.  
  223. GEMobject* GEMrawobject::Cook()
  224. {
  225.     return Indirect() ? (GEMobject*)ObjectSpecific() : 0;
  226. }
  227.