home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 74 / af074a.adf / archives / af74a3.lzx / Typeface / Source / char.c next >
C/C++ Source or Header  |  1995-06-08  |  13KB  |  475 lines

  1. /*********************/
  2. /*             */
  3. /* Character editing */
  4. /*             */
  5. /*********************/
  6.  
  7. #include "Typeface.h"
  8.  
  9. ULONG PixelBorder = TRUE;
  10. extern struct Preferences Prefs;
  11.  
  12. static struct VectorItem LineArrowLeft[] =
  13.   { 10,10,VIF_SCALE,
  14.     SHADOWPEN,0,VIF_DRIPEN,
  15.      2, 5,VIF_MOVE,
  16.      8, 2,VIF_DRAW,
  17.      8, 8,VIF_DRAW,
  18.      2, 5,VIF_DRAW,
  19.      0, 0,VIF_LASTITEM };
  20. static struct VectorItem LineArrowRight[] =
  21.   { 10,10,VIF_SCALE,
  22.     SHADOWPEN,0,VIF_DRIPEN,
  23.      8, 5,VIF_MOVE,
  24.      2, 2,VIF_DRAW,
  25.      2, 8,VIF_DRAW,
  26.      8, 5,VIF_DRAW,
  27.      0, 0,VIF_LASTITEM };
  28. static struct VectorItem SolidArrowLeft[] =
  29.   { 10,10,VIF_SCALE,
  30.     SHADOWPEN,0,VIF_AOLDRIPEN,
  31.      0, 0,VIF_AREASTART,
  32.      2, 5,VIF_MOVE,
  33.      8, 2,VIF_DRAW,
  34.      8, 8,VIF_DRAW,
  35.      2, 5,VIF_DRAW,
  36.      0, 0,VIF_AREAEND,
  37.      0, 0,VIF_LASTITEM };
  38. static struct VectorItem SolidArrowRight[] =
  39.   { 10,10,VIF_SCALE,
  40.     SHADOWPEN,0,VIF_AOLDRIPEN,
  41.      0, 0,VIF_AREASTART,
  42.      8, 5,VIF_MOVE,
  43.      2, 2,VIF_DRAW,
  44.      2, 8,VIF_DRAW,
  45.      8, 5,VIF_DRAW,
  46.      0, 0,VIF_AREAEND,
  47.      0, 0,VIF_LASTITEM };
  48. static struct VectorItem SolidArrowUp[] =
  49.   { 11,11,VIF_SCALE,
  50.     SHADOWPEN,0,VIF_AOLDRIPEN,
  51.      0, 0,VIF_AREASTART,
  52.      5, 2,VIF_MOVE,
  53.      2, 8,VIF_DRAW,
  54.      8, 8,VIF_DRAW,
  55.      5, 2,VIF_DRAW,
  56.      0, 0,VIF_AREAEND,
  57.      0, 0,VIF_LASTITEM };
  58. static struct VectorItem SolidArrowDown[] =
  59.   { 11,11,VIF_SCALE,
  60.     SHADOWPEN,0,VIF_AOLDRIPEN,
  61.      0, 0,VIF_AREASTART,
  62.      5, 8,VIF_MOVE,
  63.      2, 2,VIF_DRAW,
  64.      8, 2,VIF_DRAW,
  65.      5, 8,VIF_DRAW,
  66.      0, 0,VIF_AREAEND,
  67.      0, 0,VIF_LASTITEM };
  68. static struct VectorItem KernImage[] =
  69.   { 11,11,VIF_SCALE,
  70.     SHINEPEN,0,VIF_AOLDRIPEN,
  71.     SHINEPEN,0,VIF_DRIPEN,
  72.      0, 0,VIF_AREASTART,
  73.      2, 2,VIF_MOVE,
  74.      2, 8,VIF_DRAW,
  75.      5, 8,VIF_DRAW,
  76.      2, 2,VIF_DRAW,
  77.      0, 0,VIF_AREAEND,
  78.     SHADOWPEN,0,VIF_AOLDRIPEN,
  79.     SHADOWPEN,0,VIF_DRIPEN,
  80.      0, 0,VIF_AREASTART,
  81.      5, 2,VIF_MOVE,
  82.      8, 2,VIF_DRAW,
  83.      8, 8,VIF_DRAW,
  84.      5, 2,VIF_DRAW,
  85.      0, 0,VIF_AREAEND,
  86.      0, 0,VIF_LASTITEM };
  87.  
  88. struct CharNode *OpenCharWin(ULONG charnum,struct IBox size)
  89. {
  90. extern struct Screen *Screen;
  91. extern struct List *CharWndList;
  92. extern struct MsgPort *WndMsgPort;
  93. extern struct Image *SizeImage, *LeftImage, *RightImage;
  94. extern struct Image *UpImage, *DownImage;
  95. extern Class *EditClass;
  96. extern struct Character CharBuffer[256];
  97.  
  98. struct CharNode *node;
  99. Object *extobj;
  100. ULONG gw,gh,top;
  101. UWORD width,height;
  102. static struct NewMenu menus[] = { PROJECT_MENU,CHARACTER_MENU,End };
  103. static ULONG scroll2edit[] = { GA_ID,EG_Update,TAG_DONE };
  104.  
  105.   if ((node = CreateNode(sizeof(struct CharNode),CharWndList)) == NULL)
  106.     Quit();
  107.   if ((node->chln_Title = AllocVec(256,MEMF_CLEAR)) == NULL) Quit();
  108.   if (charnum > 0)
  109.     if (charnum == 256)
  110.       sprintf(node->chln_Title,"blank");
  111.     else
  112.       sprintf(node->chln_Title,"%c (%lu decimal/$%.2lX hex)",
  113.       (char)charnum,charnum,charnum);
  114.   else
  115.     sprintf(node->chln_Title,"(%lu decimal/$%lX hex)",charnum,charnum);
  116.   if ((node->chln_Hook = AllocVec(sizeof(struct Hook),MEMF_CLEAR)) == NULL)
  117.     Quit();
  118.   node->chln_Hook->h_Entry = CharHook;
  119.   node->chln_Hook->h_Data = node;
  120.   node->chln_Character = CharBuffer+charnum;
  121.   node->chln_Number = charnum;
  122.   width = (Prefs.PixelX*node->chln_Character->chr_Width)+(2*EG_XOFFSET)+8+
  123.     Screen->WBorLeft+UpImage->Width;
  124.   if (width < size.Width) size.Width = width;
  125.   height = (Prefs.PixelY*node->chln_Character->chr_Height)+(2*EG_YOFFSET)+7+
  126.     Screen->WBorTop+Screen->Font->ta_YSize+LeftImage->Height+Prefs.VecHeight;
  127.   if (height < size.Height) size.Height = height;
  128.  
  129.   node->chln_Object = WindowObject,
  130.     WINDOW_Screen,Screen,
  131.     WINDOW_SharedPort,WndMsgPort,
  132.     WINDOW_MenuStrip,menus,
  133.     WINDOW_Title,node->chln_Title,
  134.     WINDOW_Bounds,&size,
  135.     WINDOW_HelpFile,NAME".guide",
  136.     WINDOW_HelpNode,"char",
  137.     WINDOW_IDCMPHook,node->chln_Hook,
  138.     WINDOW_IDCMPHookBits,IDCMP_CHANGEWINDOW,
  139.     WINDOW_SizeRight,TRUE,
  140.     WINDOW_SizeBottom,TRUE,
  141.     WINDOW_MasterGroup,
  142.       VGroupObject,
  143.     HOffset(4),VOffset(2),Spacing(2),
  144.     StartMember,
  145.       HGroupObject,
  146.         Spacing(4),
  147.         StartMember,
  148.           HGroupObject,
  149.         StartMember,
  150.           ButtonObject,
  151.             VIT_VectorArray,LineArrowLeft,
  152.             ButtonFrame,
  153.             GA_ID,ID_WIDTHL,
  154.           EndObject,
  155.           FixWidth(22),FixHeight(Prefs.VecHeight),
  156.         EndMember,
  157.         StartMember,
  158.           ButtonObject,
  159.             VIT_VectorArray,LineArrowRight,
  160.             ButtonFrame,
  161.             GA_ID,ID_WIDTHR,
  162.           EndObject,
  163.           FixWidth(22),FixHeight(Prefs.VecHeight),
  164.         EndMember,
  165.           EndObject,
  166.         EndMember,
  167.         StartMember,
  168.           HGroupObject,
  169.         StartMember,
  170.           ButtonObject,
  171.             VIT_VectorArray,SolidArrowLeft,
  172.             ButtonFrame,
  173.             GA_ID,ID_MOVEL,
  174.           EndObject,
  175.           FixWidth(22),FixHeight(Prefs.VecHeight),
  176.         EndMember,
  177.         StartMember,
  178.           ButtonObject,
  179.             VIT_VectorArray,SolidArrowRight,
  180.             ButtonFrame,
  181.             GA_ID,ID_MOVER,
  182.           EndObject,
  183.           FixWidth(22),FixHeight(Prefs.VecHeight),
  184.         EndMember,
  185.         StartMember,
  186.           ButtonObject,
  187.             VIT_VectorArray,SolidArrowUp,
  188.             ButtonFrame,
  189.             GA_ID,ID_MOVEU,
  190.           EndObject,
  191.           FixWidth(22),FixHeight(Prefs.VecHeight),
  192.         EndMember,
  193.         StartMember,
  194.           ButtonObject,
  195.             VIT_VectorArray,SolidArrowDown,
  196.             ButtonFrame,
  197.             GA_ID,ID_MOVED,
  198.           EndObject,
  199.           FixWidth(22),FixHeight(Prefs.VecHeight),
  200.         EndMember,
  201.           EndObject,
  202.         EndMember,
  203.         StartMember,
  204.           HGroupObject,
  205.         StartMember,
  206.           ButtonObject,
  207.             VIT_VectorArray,KernImage,
  208.             ButtonFrame,
  209.             GA_ID,ID_KERNING,
  210.           EndObject,
  211.           FixWidth(22),FixHeight(Prefs.VecHeight),
  212.         EndMember,
  213.           EndObject,
  214.         EndMember,
  215.       EndObject,
  216.       FixMinSize,
  217.     EndMember,
  218.     StartMember,
  219.       extobj = ExternalObject,
  220.         EXT_MinWidth,(2*Prefs.PixelX)+(2*EG_XOFFSET)-2,
  221.         EXT_MinHeight,(2*Prefs.PixelY)+(2*EG_YOFFSET)-2,
  222.         EXT_Class,EditClass,
  223.         EXT_NoRebuild,TRUE,
  224.         EG_PixelX,Prefs.PixelX,
  225.         EG_PixelY,Prefs.PixelY,
  226.         EG_CharNode,node,
  227.         EG_CharStruct,node->chln_Character,
  228.         EG_PixelBorder,PixelBorder,
  229.         GA_Disabled,FALSE,
  230.         GA_ID,ID_EDIT,
  231.       EndObject,
  232.     EndMember,
  233.       EndObject,
  234.     EndObject;
  235.   if (node->chln_Object == NULL) Quit();
  236.   if ((node->chln_Window = WindowOpen(node->chln_Object)) == NULL) Quit();
  237.  
  238.   gh = MAX(LeftImage->Height,RightImage->Height);
  239.   gh = MAX(SizeImage->Height,gh);
  240.   gw = MAX(UpImage->Width,DownImage->Width);
  241.   gw = MAX(SizeImage->Width,gw);
  242.   top = Screen->WBorTop+Screen->Font->ta_YSize+1;
  243.   GetAttr(EXT_Object,extobj,&(node->chln_EditGadg));
  244.  
  245.   if ((node->chln_HorizGadg = CreatePropGadg(FREEHORIZ,
  246.     GA_Left,3,
  247.     GA_RelBottom,3-gh,
  248.     GA_RelWidth,-5-gw-LeftImage->Width-RightImage->Width,
  249.     GA_Height,gh-4,
  250.     GA_BottomBorder,TRUE,
  251.     GA_ID,GADG_HORIZ,
  252.     ICA_TARGET,node->chln_EditGadg,
  253.     ICA_MAP,scroll2edit,
  254.     PGA_Total,node->chln_Character->chr_Width,
  255.     PGA_Visible,node->chln_Character->chr_Width,TAG_DONE)) == NULL) Quit();
  256.   if ((node->chln_VertGadg = CreatePropGadg(FREEVERT,
  257.     GA_RelRight,5-gw,
  258.     GA_Top,top+1,
  259.     GA_Width,gw-8,
  260.     GA_RelHeight,-top-SizeImage->Height-UpImage->Height-DownImage->Height-2,
  261.     GA_RightBorder,TRUE,
  262.     GA_Previous,node->chln_HorizGadg,
  263.     GA_ID,GADG_VERT,
  264.     ICA_TARGET,node->chln_EditGadg,
  265.     ICA_MAP,scroll2edit,
  266.     PGA_Total,node->chln_Character->chr_Height,
  267.     PGA_Visible,node->chln_Character->chr_Height,TAG_DONE)) == NULL) Quit();
  268.  
  269.   if ((node->chln_LeftGadg = CreateButtonGadg(LeftImage,
  270.     GA_RelRight,1-LeftImage->Width-RightImage->Width-gw,
  271.     GA_RelBottom,1-LeftImage->Height,
  272.     GA_BottomBorder,TRUE,
  273.     GA_Previous,node->chln_VertGadg,
  274.     GA_ID,GADG_LEFT,
  275.     ICA_TARGET,node->chln_EditGadg,
  276.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) Quit();
  277.   if ((node->chln_RightGadg = CreateButtonGadg(RightImage,
  278.     GA_RelRight,1-RightImage->Width-gw,
  279.     GA_RelBottom,1-RightImage->Height,
  280.     GA_BottomBorder,TRUE,
  281.     GA_Previous,node->chln_LeftGadg,
  282.     GA_ID,GADG_RIGHT,
  283.     ICA_TARGET,node->chln_EditGadg,
  284.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) Quit();
  285.   if ((node->chln_UpGadg = CreateButtonGadg(UpImage,
  286.     GA_RelRight,1-UpImage->Width,
  287.     GA_RelBottom,1-UpImage->Height-DownImage->Height-SizeImage->Height,
  288.     GA_RightBorder,TRUE,
  289.     GA_Previous,node->chln_RightGadg,
  290.     GA_ID,GADG_UP,
  291.     ICA_TARGET,node->chln_EditGadg,
  292.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) Quit();
  293.   if ((node->chln_DownGadg = CreateButtonGadg(DownImage,
  294.     GA_RelRight,1-DownImage->Width,
  295.     GA_RelBottom,1-DownImage->Height-SizeImage->Height,
  296.     GA_RightBorder,TRUE,
  297.     GA_Previous,node->chln_UpGadg,
  298.     GA_ID,GADG_DOWN,
  299.     ICA_TARGET,node->chln_EditGadg,
  300.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) Quit();
  301.  
  302.   AddGList(node->chln_Window,node->chln_HorizGadg,-1,-1,NULL);
  303.   SetScrollers(node);
  304.   RefreshGList(node->chln_HorizGadg,node->chln_Window,NULL,-1);
  305. }
  306.  
  307. void CloseCharWin(struct CharNode *node)
  308. {
  309. extern struct Window *WidthWnd, *KernWnd;
  310. extern struct CharNode *WidthNode, *KernNode;
  311.  
  312.   ClrWindowClose(&(node->chln_Object),&(node->chln_Window));
  313.   ClrDisposeObject(&(node->chln_Object));
  314.   if (node->chln_Title)
  315.   {
  316.     FreeVec(node->chln_Title);
  317.     node->chln_Title = NULL;
  318.   }
  319.   ClrDisposeObject(&(node->chln_HorizGadg));
  320.   ClrDisposeObject(&(node->chln_VertGadg));
  321.   ClrDisposeObject(&(node->chln_LeftGadg));
  322.   ClrDisposeObject(&(node->chln_RightGadg));
  323.   ClrDisposeObject(&(node->chln_UpGadg));
  324.   ClrDisposeObject(&(node->chln_DownGadg));
  325.   if (node->chln_Hook)
  326.   {
  327.     FreeVec(node->chln_Hook);
  328.     node->chln_Hook = NULL;
  329.   }
  330.   if ((WidthWnd) && (WidthNode == node)) CloseWidthWnd(FALSE);
  331.   if ((KernWnd) && (KernNode == node)) CloseKernWnd(FALSE);
  332. }
  333.  
  334. Object *CreateSysImage(ULONG which,struct DrawInfo *dri)
  335. {
  336.   return (NewObject(NULL,SYSICLASS,
  337.     SYSIA_DrawInfo,dri,
  338.     SYSIA_Which,which,TAG_DONE));
  339. }
  340.  
  341. Object *CreatePropGadg(ULONG freedom,Tag tag1,...)
  342. {
  343.   return (NewObject(NULL,PROPGCLASS,
  344.     PGA_Freedom,freedom,
  345.     PGA_NewLook,TRUE,
  346.     PGA_Borderless,TRUE,
  347.     TAG_MORE,&tag1));
  348. }
  349.  
  350. Object *CreateButtonGadg(Object *image,Tag tag1,...)
  351. {
  352.   return (NewObject(NULL,BUTTONGCLASS,
  353.     GA_Image,image,
  354.     TAG_MORE,&tag1));
  355. }
  356.  
  357. __geta4 void CharHook(__a0 struct Hook *hook, __a2 Object *o,
  358.   __a1 struct IntuiMessage *msg)
  359. {
  360.   if ((msg->Class == IDCMP_CHANGEWINDOW) && (msg->Code == CWCODE_MOVESIZE))
  361.     ForceResizeChar(hook->h_Data);
  362. }
  363.  
  364. void ForceResizeChar(struct CharNode *node)
  365. {
  366. struct Character *chr;
  367. LONG l,t,w,h;
  368.  
  369.   chr = node->chln_Character;
  370.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  371.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  372.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  373.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  374.   if (chr->chr_Width - l < w) l = chr->chr_Width - w;
  375.   if (l < 0) l = 0;
  376.   if (chr->chr_Height - t < h) t = chr->chr_Height - h;
  377.   if (t < 0) t = 0;
  378.   SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  379.     EG_XOffset,l,EG_YOffset,t,TAG_DONE);
  380.   SetScrollers(node);
  381. }
  382.  
  383. void SetScrollers(struct CharNode *node)
  384. {
  385. ULONG l,t,w,h;
  386.  
  387.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  388.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  389.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  390.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  391.   SetGadgetAttrs(node->chln_HorizGadg,node->chln_Window,NULL,
  392.     PGA_Top,l,PGA_Visible,w,TAG_DONE);
  393.   SetGadgetAttrs(node->chln_VertGadg,node->chln_Window,NULL,
  394.     PGA_Top,t,PGA_Visible,h,TAG_DONE);
  395. }
  396.  
  397. void RedrawEdit(struct CharNode *node)
  398. {
  399.   SetGadgetAttrs(node->chln_HorizGadg,node->chln_Window,NULL,
  400.     PGA_Total,node->chln_Character->chr_Width,TAG_DONE);
  401.   SetGadgetAttrs(node->chln_VertGadg,node->chln_Window,NULL,
  402.     PGA_Total,node->chln_Character->chr_Height,TAG_DONE);
  403.   SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  404.     EG_Update,GADG_NONE,TAG_DONE);
  405.   ForceResizeChar(node);
  406. }
  407.  
  408. void MoveLeft(struct CharNode *node)
  409. {
  410. struct Character *chr;
  411. ULONG i,j;
  412.  
  413.   chr = node->chln_Character;
  414.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  415.   {
  416.     for (j = 0; j < chr->chr_Height; j++)
  417.     {
  418.       for (i = 0; i < chr->chr_Width-1; i++) DATA(i,j) = DATA(i+1,j);
  419.       DATA(chr->chr_Width-1,j) = 0;
  420.     }
  421.     RedrawEdit(node);
  422.   }
  423. }
  424.  
  425. void MoveRight(struct CharNode *node)
  426. {
  427. struct Character *chr;
  428. ULONG i,j;
  429.  
  430.   chr = node->chln_Character;
  431.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  432.   {
  433.     for (j = 0; j < chr->chr_Height; j++)
  434.     {
  435.       for (i = chr->chr_Width-1; i > 0; i--) DATA(i,j) = DATA(i-1,j);
  436.       DATA(0,j) = 0;
  437.     }
  438.     RedrawEdit(node);
  439.   }
  440. }
  441.  
  442. void MoveUp(struct CharNode *node)
  443. {
  444. struct Character *chr;
  445. ULONG i,j;
  446.  
  447.   chr = node->chln_Character;
  448.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  449.   {
  450.     for (i = 0; i < chr->chr_Width; i++)
  451.     {
  452.       for (j = 0; j < chr->chr_Height-1; j++) DATA(i,j) = DATA(i,j+1);
  453.       DATA(i,chr->chr_Height-1) = 0;
  454.     }
  455.     RedrawEdit(node);
  456.   }
  457. }
  458.  
  459. void MoveDown(struct CharNode *node)
  460. {
  461. struct Character *chr;
  462. ULONG i,j;
  463.  
  464.   chr = node->chln_Character;
  465.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  466.   {
  467.     for (i = 0; i < chr->chr_Width; i++)
  468.     {
  469.       for (j = chr->chr_Height-1; j > 0; j--) DATA(i,j) = DATA(i,j-1);
  470.       DATA(i,0) = 0;
  471.     }
  472.     RedrawEdit(node);
  473.   }
  474. }
  475.