LCOV - code coverage report
Current view: top level - fontforgeexe - effectsui.c (source / functions) Hit Total Coverage
Test: FontForge coverage report 2017-08-04 01:21:11+02:00 (commit d35f7e4107a9e1db65cce47c468fcc914cecb8fd) Lines: 0 369 0.0 %
Date: 2017-08-04 Functions: 0 12 0.0 %

          Line data    Source code
       1             : /* Copyright (C) 2003-2012 by George Williams */
       2             : /*
       3             :  * Redistribution and use in source and binary forms, with or without
       4             :  * modification, are permitted provided that the following conditions are met:
       5             : 
       6             :  * Redistributions of source code must retain the above copyright notice, this
       7             :  * list of conditions and the following disclaimer.
       8             : 
       9             :  * Redistributions in binary form must reproduce the above copyright notice,
      10             :  * this list of conditions and the following disclaimer in the documentation
      11             :  * and/or other materials provided with the distribution.
      12             : 
      13             :  * The name of the author may not be used to endorse or promote products
      14             :  * derived from this software without specific prior written permission.
      15             : 
      16             :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
      17             :  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
      18             :  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
      19             :  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      20             :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
      21             :  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
      22             :  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
      23             :  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
      24             :  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
      25             :  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      26             :  */
      27             : #include "cvundoes.h"
      28             : #include "effects.h"
      29             : #include "fontforgeui.h"
      30             : #include "splinestroke.h"
      31             : #include "splineutil2.h"
      32             : #include <ustring.h>
      33             : #include <gkeysym.h>
      34             : #include <utype.h>
      35             : #include <math.h>
      36             : #include "edgelist.h"
      37             : 
      38           0 : static void CVOutline(CharView *cv, real width) {
      39             :     StrokeInfo si;
      40             :     SplineSet *temp, *spl;
      41             :     int changed;
      42             : 
      43           0 :     memset(&si,0,sizeof(si));
      44           0 :     si.removeexternal = true;
      45           0 :     si.radius = width;
      46             :     /* si.removeoverlapifneeded = true;*/
      47             : 
      48           0 :     CVPreserveState((CharViewBase *) cv);
      49           0 :     temp = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
      50           0 :     for ( spl=cv->b.layerheads[cv->b.drawmode]->splines; spl->next!=NULL; spl=spl->next );
      51           0 :     spl->next = temp;
      52           0 :     SplineSetsCorrect(cv->b.layerheads[cv->b.drawmode]->splines,&changed);
      53           0 :     CVCharChangedUpdate(&cv->b);
      54           0 : }
      55             : 
      56           0 : static void MVOutline(MetricsView *mv, real width) {
      57             :     StrokeInfo si;
      58             :     SplineSet *temp, *spl;
      59             :     int i, changed;
      60             : 
      61           0 :     memset(&si,0,sizeof(si));
      62           0 :     si.removeexternal = true;
      63           0 :     si.radius = width;
      64             :     /* si.removeoverlapifneeded = true; */
      65             : 
      66           0 :     for ( i=mv->glyphcnt-1; i>=0; --i )
      67           0 :         if ( mv->perchar[i].selected )
      68           0 :     break;
      69           0 :     if ( i!=-1 ) {
      70           0 :         SplineChar *sc = mv->glyphs[i].sc;
      71           0 :         SCPreserveLayer(sc,mv->layer,false);
      72           0 :         temp = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
      73           0 :         for ( spl=sc->layers[mv->layer].splines; spl->next!=NULL; spl=spl->next );
      74           0 :         spl->next = temp;
      75           0 :         SplineSetsCorrect(sc->layers[mv->layer].splines,&changed);
      76           0 :         SCCharChangedUpdate(sc,mv->layer);
      77             :     }
      78           0 : }
      79             : 
      80           0 : static void CVInline(CharView *cv, real width, real inset) {
      81             :     StrokeInfo si;
      82             :     SplineSet *temp, *spl, *temp2;
      83             :     int changed;
      84             : 
      85           0 :     memset(&si,0,sizeof(si));
      86           0 :     si.removeexternal = true;
      87             :     /* si.removeoverlapifneeded = true;*/
      88             : 
      89           0 :     CVPreserveState((CharViewBase *) cv);
      90           0 :     si.radius = width;
      91           0 :     temp = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
      92           0 :     si.radius = width+inset;
      93           0 :     temp2 = SplineSetStroke(cv->b.layerheads[cv->b.drawmode]->splines,&si,cv->b.layerheads[cv->b.drawmode]->order2);
      94           0 :     for ( spl=cv->b.layerheads[cv->b.drawmode]->splines; spl->next!=NULL; spl=spl->next );
      95           0 :     spl->next = temp;
      96           0 :     for ( ; spl->next!=NULL; spl=spl->next );
      97           0 :     spl->next = temp2;
      98           0 :     SplineSetsCorrect(cv->b.layerheads[cv->b.drawmode]->splines,&changed);
      99           0 :     CVCharChangedUpdate(&cv->b);
     100           0 : }
     101             : 
     102           0 : static void MVInline(MetricsView *mv, real width, real inset) {
     103             :     StrokeInfo si;
     104             :     SplineSet *temp, *spl, *temp2;
     105             :     int i, changed;
     106             : 
     107           0 :     memset(&si,0,sizeof(si));
     108           0 :     si.removeexternal = true;
     109             :     /* si.removeoverlapifneeded = true;*/
     110             : 
     111           0 :     for ( i=mv->glyphcnt-1; i>=0; --i )
     112           0 :         if ( mv->perchar[i].selected )
     113           0 :     break;
     114           0 :     if ( i!=-1 ) {
     115           0 :         SplineChar *sc = mv->glyphs[i].sc;
     116           0 :         SCPreserveLayer(sc,mv->layer,false);
     117           0 :         si.radius = width;
     118           0 :         temp = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
     119           0 :         si.radius = width+inset;
     120           0 :         temp2 = SplineSetStroke(sc->layers[mv->layer].splines,&si,sc->layers[mv->layer].order2);
     121           0 :         for ( spl=sc->layers[mv->layer].splines; spl->next!=NULL; spl=spl->next );
     122           0 :         spl->next = temp;
     123           0 :         for ( ; spl->next!=NULL; spl=spl->next );
     124           0 :         spl->next = temp2;
     125           0 :         SplineSetsCorrect(sc->layers[mv->layer].splines,&changed);
     126           0 :         SCCharChangedUpdate(sc,mv->layer);
     127             :     }
     128           0 : }
     129             : 
     130             : static double def_outline_width = 10, def_gap_width = 20;
     131             : 
     132             : #define CID_Width       1000
     133             : #define CID_Gap         1001
     134             : 
     135             : typedef struct outlinedata {
     136             :     unsigned int done: 1;
     137             :     FontView *fv;
     138             :     CharView *cv;
     139             :     MetricsView *mv;
     140             :     int isinline;
     141             :     int wireframe;
     142             :     GWindow gw;
     143             : } OutlineData;
     144             : 
     145           0 : static int OD_OK(GGadget *g, GEvent *e) {
     146           0 :     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
     147           0 :         OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
     148             :         real width, gap;
     149           0 :         int err = 0;
     150             : 
     151           0 :         width = GetReal8(od->gw,CID_Width,_("Outline Width"),&err);
     152           0 :         if ( od->isinline )
     153           0 :             gap = GetReal8(od->gw,CID_Gap,_("_Gap:"),&err);
     154           0 :         if ( err )
     155           0 : return(true);
     156           0 :         def_outline_width = width;
     157           0 :         if ( od->isinline ) {
     158           0 :             def_gap_width = gap;
     159           0 :             if ( od->fv!=NULL )
     160           0 :                 FVInline((FontViewBase *) od->fv,width,gap);
     161           0 :             else if ( od->cv!=NULL )
     162           0 :                 CVInline(od->cv,width,gap);
     163           0 :             else if ( od->mv!=NULL )
     164           0 :                 MVInline(od->mv,width,gap);
     165             :         } else {
     166           0 :             if ( od->fv!=NULL )
     167           0 :                 FVOutline((FontViewBase *) od->fv,width);
     168           0 :             else if ( od->cv!=NULL )
     169           0 :                 CVOutline(od->cv,width);
     170           0 :             else if ( od->mv!=NULL )
     171           0 :                 MVOutline(od->mv,width);
     172             :         }
     173           0 :         od->done = true;
     174             :     }
     175           0 : return( true );
     176             : }
     177             : 
     178           0 : static int OD_Cancel(GGadget *g, GEvent *e) {
     179           0 :     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
     180           0 :         OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
     181           0 :         od->done = true;
     182             :     }
     183           0 : return( true );
     184             : }
     185             : 
     186           0 : static int od_e_h(GWindow gw, GEvent *event) {
     187           0 :     if ( event->type==et_close ) {
     188           0 :         OutlineData *od = GDrawGetUserData(gw);
     189           0 :         od->done = true;
     190           0 :     } else if ( event->type == et_char ) {
     191           0 : return( false );
     192           0 :     } else if ( event->type == et_map ) {
     193             :         /* Above palettes */
     194           0 :         GDrawRaise(gw);
     195             :     }
     196           0 : return( true );
     197             : }
     198             : 
     199           0 : void OutlineDlg(FontView *fv, CharView *cv,MetricsView *mv,int isinline) {
     200             :     GRect pos;
     201             :     GWindow gw;
     202             :     GWindowAttrs wattrs;
     203             :     GGadgetCreateData gcd[9], *harray[6], *butarray[7], *varray[7], boxes[4];
     204             :     GTextInfo label[9];
     205             :     OutlineData od;
     206             :     char buffer[20], buffer2[20];
     207             :     int i,k;
     208             : 
     209           0 :     od.done = false;
     210           0 :     od.fv = fv;
     211           0 :     od.cv = cv;
     212           0 :     od.mv = mv;
     213           0 :     od.isinline = isinline;
     214             : 
     215           0 :         memset(&wattrs,0,sizeof(wattrs));
     216           0 :         wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
     217           0 :         wattrs.event_masks = ~(1<<et_charup);
     218           0 :         wattrs.restrict_input_to_me = 1;
     219           0 :         wattrs.undercursor = 1;
     220           0 :         wattrs.cursor = ct_pointer;
     221           0 :         wattrs.utf8_window_title = isinline?_("Inline"):_("Outline");
     222           0 :         wattrs.is_dlg = true;
     223           0 :         pos.x = pos.y = 0;
     224           0 :         pos.width = GGadgetScale(GDrawPointsToPixels(NULL,170));
     225           0 :         pos.height = GDrawPointsToPixels(NULL,75);
     226           0 :         od.gw = gw = GDrawCreateTopWindow(NULL,&pos,od_e_h,&od,&wattrs);
     227             : 
     228           0 :         memset(&label,0,sizeof(label));
     229           0 :         memset(&gcd,0,sizeof(gcd));
     230           0 :         memset(&boxes,0,sizeof(boxes));
     231             : 
     232           0 :         i = k = 0;
     233           0 :         label[i].text = (unichar_t *) _("Outline Width:");
     234           0 :         label[i].text_is_1byte = true;
     235           0 :         label[i].text_in_resource = true;
     236           0 :         gcd[i].gd.label = &label[i];
     237           0 :         gcd[i].gd.pos.x = 7; gcd[i].gd.pos.y = 7+3; 
     238           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     239           0 :         gcd[i++].creator = GLabelCreate;
     240           0 :         harray[k++] = &gcd[i-1];
     241             : 
     242           0 :         sprintf( buffer, "%g", def_outline_width );
     243           0 :         label[i].text = (unichar_t *) buffer;
     244           0 :         label[i].text_is_1byte = true;
     245           0 :         gcd[i].gd.label = &label[i];
     246           0 :         gcd[i].gd.pos.x = 40; gcd[i].gd.pos.y = 7; gcd[i].gd.pos.width = 40;
     247           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     248           0 :         gcd[i].gd.cid = CID_Width;
     249           0 :         gcd[i++].creator = GTextFieldCreate;
     250           0 :         harray[k++] = &gcd[i-1];
     251           0 :         harray[k++] = GCD_Glue;
     252             : 
     253           0 :         if ( isinline ) {
     254           0 :             label[i].text = (unichar_t *) _("_Gap:");
     255           0 :             label[i].text_is_1byte = true;
     256           0 :             label[i].text_in_resource = true;
     257           0 :             gcd[i].gd.label = &label[i];
     258           0 :             gcd[i].gd.pos.x = 90; gcd[i].gd.pos.y = 7+3; 
     259           0 :             gcd[i].gd.flags = gg_enabled|gg_visible;
     260           0 :             gcd[i++].creator = GLabelCreate;
     261           0 :             harray[k++] = &gcd[i-1];
     262             : 
     263           0 :             sprintf( buffer2, "%g", def_gap_width );
     264           0 :             label[i].text = (unichar_t *) buffer2;
     265           0 :             label[i].text_is_1byte = true;
     266           0 :             gcd[i].gd.label = &label[i];
     267           0 :             gcd[i].gd.pos.x = 120; gcd[i].gd.pos.y = 7;  gcd[i].gd.pos.width = 40;
     268           0 :             gcd[i].gd.flags = gg_enabled|gg_visible;
     269           0 :             gcd[i].gd.cid = CID_Gap;
     270           0 :             gcd[i++].creator = GTextFieldCreate;
     271           0 :             harray[k++] = &gcd[i-1];
     272             :         }
     273           0 :         harray[k] = NULL;
     274             : 
     275           0 :         k = 0;
     276           0 :         gcd[i].gd.pos.x = 20-3; gcd[i].gd.pos.y = 7+32;
     277           0 :         gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
     278           0 :         gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default;
     279           0 :         label[i].text = (unichar_t *) _("_OK");
     280           0 :         label[i].text_is_1byte = true;
     281           0 :         label[i].text_in_resource = true;
     282           0 :         gcd[i].gd.label = &label[i];
     283           0 :         gcd[i].gd.handle_controlevent = OD_OK;
     284           0 :         gcd[i++].creator = GButtonCreate;
     285           0 :         butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
     286             : 
     287           0 :         gcd[i].gd.pos.x = -20; gcd[i].gd.pos.y = 7+32+3;
     288           0 :         gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
     289           0 :         gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
     290           0 :         label[i].text = (unichar_t *) _("_Cancel");
     291           0 :         label[i].text_is_1byte = true;
     292           0 :         label[i].text_in_resource = true;
     293           0 :         gcd[i].gd.label = &label[i];
     294           0 :         gcd[i].gd.handle_controlevent = OD_Cancel;
     295           0 :         gcd[i++].creator = GButtonCreate;
     296           0 :         butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
     297           0 :         butarray[k] = 0;
     298             : 
     299           0 :         boxes[2].gd.flags = gg_enabled|gg_visible;
     300           0 :         boxes[2].gd.u.boxelements = harray;
     301           0 :         boxes[2].creator = GHBoxCreate;
     302             : 
     303           0 :         boxes[3].gd.flags = gg_enabled|gg_visible;
     304           0 :         boxes[3].gd.u.boxelements = butarray;
     305           0 :         boxes[3].creator = GHBoxCreate;
     306             : 
     307           0 :         varray[0] = &boxes[2]; varray[1] = NULL;
     308           0 :         varray[2] = GCD_Glue; varray[3] = NULL;
     309           0 :         varray[4] = &boxes[3]; varray[5] = NULL;
     310           0 :         varray[6] = NULL;
     311             : 
     312           0 :         boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
     313           0 :         boxes[0].gd.flags = gg_enabled|gg_visible;
     314           0 :         boxes[0].gd.u.boxelements = varray;
     315           0 :         boxes[0].creator = GHVGroupCreate;
     316             : 
     317           0 :         gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2;
     318           0 :         gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4;
     319           0 :         gcd[i].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels;
     320           0 :         gcd[i].creator = GGroupCreate;
     321             : 
     322           0 :         GGadgetsCreate(gw,boxes);
     323           0 :         GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
     324           0 :         GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue);
     325           0 :         GHVBoxSetExpandableCol(boxes[3].ret,gb_expandgluesame);
     326           0 :         GHVBoxFitWindow(boxes[0].ret);
     327             : 
     328           0 :     GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Width));
     329           0 :     GTextFieldSelect(GWidgetGetControl(gw,CID_Width),0,-1);
     330             : 
     331           0 :     GWidgetHidePalettes();
     332           0 :     GDrawSetVisible(gw,true);
     333           0 :     while ( !od.done )
     334           0 :         GDrawProcessOneEvent(NULL);
     335           0 :     GDrawSetVisible(gw,false);
     336           0 : }
     337             : 
     338           0 : static void CVShadow(CharView *cv,real angle, real outline_width,
     339             :         real shadow_length,int wireframe) {
     340           0 :     CVPreserveState((CharViewBase *) cv);
     341           0 :     cv->b.layerheads[cv->b.drawmode]->splines = SSShadow(cv->b.layerheads[cv->b.drawmode]->splines,angle,outline_width,shadow_length,cv->b.sc,wireframe);
     342           0 :     CVCharChangedUpdate(&cv->b);
     343           0 : }
     344             : 
     345           0 : static void MVShadow(MetricsView *mv,real angle, real outline_width,
     346             :         real shadow_length,int wireframe) {
     347             :     int i;
     348             : 
     349           0 :     for ( i=mv->glyphcnt-1; i>=0; --i )
     350           0 :         if ( mv->perchar[i].selected )
     351           0 :     break;
     352           0 :     if ( i!=-1 ) {
     353           0 :         SplineChar *sc = mv->glyphs[i].sc;
     354           0 :         SCPreserveLayer(sc,mv->layer,false);
     355           0 :         sc->layers[mv->layer].splines = SSShadow(sc->layers[mv->layer].splines,angle,outline_width,shadow_length,sc,wireframe);
     356           0 :         SCCharChangedUpdate(sc,mv->layer);
     357             :     }
     358           0 : }
     359             : 
     360             : static double def_shadow_len=100, def_sun_angle= -45;
     361             : 
     362             : #define CID_ShadowLen           1001
     363             : #define CID_LightAngle          1002
     364             : 
     365           0 : static int SD_OK(GGadget *g, GEvent *e) {
     366           0 :     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
     367           0 :         OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g));
     368             :         real width, angle, len;
     369           0 :         int err = 0;
     370             : 
     371           0 :         width = GetReal8(od->gw,CID_Width,_("Outline Width"),&err);
     372           0 :         len = GetReal8(od->gw,CID_ShadowLen,_("Shadow Length:"),&err);
     373           0 :         angle = GetReal8(od->gw,CID_LightAngle,_("Light Angle:"),&err);
     374           0 :         if ( err )
     375           0 : return(true);
     376           0 :         def_outline_width = width;
     377           0 :         def_shadow_len = len;
     378           0 :         def_sun_angle = angle;
     379           0 :         angle *= -3.1415926535897932/180;
     380           0 :         angle -= 3.1415926535897932/2;
     381           0 :         if ( od->fv!=NULL )
     382           0 :             FVShadow((FontViewBase *) od->fv,angle,width,len,od->wireframe);
     383           0 :         else if ( od->cv!=NULL )
     384           0 :             CVShadow(od->cv,angle,width,len,od->wireframe);
     385           0 :         else if ( od->mv!=NULL )
     386           0 :             MVShadow(od->mv,angle,width,len,od->wireframe);
     387           0 :         od->done = true;
     388             :     }
     389           0 : return( true );
     390             : }
     391             : 
     392           0 : void ShadowDlg(FontView *fv, CharView *cv,MetricsView *mv,int wireframe) {
     393             :     GRect pos;
     394             :     GWindow gw;
     395             :     GWindowAttrs wattrs;
     396             :     GGadgetCreateData gcd[10], *butarray[7], *hvarray[16], boxes[3];
     397             :     GTextInfo label[10];
     398             :     OutlineData od;
     399             :     char buffer[20], buffer2[20], buffer3[20];
     400             :     int i, k;
     401             : 
     402           0 :     od.done = false;
     403           0 :     od.fv = fv;
     404           0 :     od.cv = cv;
     405           0 :     od.mv = mv;
     406           0 :     od.wireframe = wireframe;
     407             : 
     408           0 :         memset(&wattrs,0,sizeof(wattrs));
     409           0 :         wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
     410           0 :         wattrs.event_masks = ~(1<<et_charup);
     411           0 :         wattrs.restrict_input_to_me = 1;
     412           0 :         wattrs.undercursor = 1;
     413           0 :         wattrs.cursor = ct_pointer;
     414           0 :         wattrs.utf8_window_title = _("Shadow");
     415           0 :         wattrs.is_dlg = true;
     416           0 :         pos.x = pos.y = 0;
     417           0 :         pos.width = GGadgetScale(GDrawPointsToPixels(NULL,160));
     418           0 :         pos.height = GDrawPointsToPixels(NULL,125);
     419           0 :         od.gw = gw = GDrawCreateTopWindow(NULL,&pos,od_e_h,&od,&wattrs);
     420             : 
     421           0 :         memset(&label,0,sizeof(label));
     422           0 :         memset(&gcd,0,sizeof(gcd));
     423           0 :         memset(&boxes,0,sizeof(boxes));
     424             : 
     425           0 :         i = k = 0;
     426           0 :         label[i].text = (unichar_t *) _("Outline Width:");
     427           0 :         label[i].text_is_1byte = true;
     428           0 :         gcd[i].gd.label = &label[i];
     429           0 :         gcd[i].gd.pos.x = 7; gcd[i].gd.pos.y = 7+3; 
     430           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     431           0 :         gcd[i++].creator = GLabelCreate;
     432           0 :         hvarray[k++] = &gcd[i-1];
     433             : 
     434           0 :         sprintf( buffer, "%g", def_outline_width );
     435           0 :         label[i].text = (unichar_t *) buffer;
     436           0 :         label[i].text_is_1byte = true;
     437           0 :         gcd[i].gd.label = &label[i];
     438           0 :         gcd[i].gd.pos.x = 90; gcd[i].gd.pos.y = 7; gcd[i].gd.pos.width = 50;
     439           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     440           0 :         gcd[i].gd.cid = CID_Width;
     441           0 :         gcd[i++].creator = GTextFieldCreate;
     442           0 :         hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
     443             : 
     444           0 :         label[i].text = (unichar_t *) _("Shadow Length:");
     445           0 :         label[i].text_is_1byte = true;
     446           0 :         gcd[i].gd.label = &label[i];
     447           0 :         gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+26;
     448           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     449           0 :         gcd[i++].creator = GLabelCreate;
     450           0 :         hvarray[k++] = &gcd[i-1];
     451             : 
     452           0 :         sprintf( buffer2, "%g", def_shadow_len );
     453           0 :         label[i].text = (unichar_t *) buffer2;
     454           0 :         label[i].text_is_1byte = true;
     455           0 :         gcd[i].gd.label = &label[i];
     456           0 :         gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-3;  gcd[i].gd.pos.width = gcd[i-2].gd.pos.width;
     457           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     458           0 :         gcd[i].gd.cid = CID_ShadowLen;
     459           0 :         gcd[i++].creator = GTextFieldCreate;
     460           0 :         hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
     461             : 
     462           0 :         label[i].text = (unichar_t *) _("Light Angle:");
     463           0 :         label[i].text_is_1byte = true;
     464           0 :         gcd[i].gd.label = &label[i];
     465           0 :         gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+26;
     466           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     467           0 :         gcd[i++].creator = GLabelCreate;
     468           0 :         hvarray[k++] = &gcd[i-1];
     469             : 
     470           0 :         sprintf( buffer3, "%g", def_sun_angle );
     471           0 :         label[i].text = (unichar_t *) buffer3;
     472           0 :         label[i].text_is_1byte = true;
     473           0 :         gcd[i].gd.label = &label[i];
     474           0 :         gcd[i].gd.pos.x = gcd[i-2].gd.pos.x; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-3;  gcd[i].gd.pos.width = gcd[i-2].gd.pos.width;
     475           0 :         gcd[i].gd.flags = gg_enabled|gg_visible;
     476           0 :         gcd[i].gd.cid = CID_LightAngle;
     477           0 :         gcd[i++].creator = GTextFieldCreate;
     478           0 :         hvarray[k++] = &gcd[i-1]; hvarray[k++] = NULL;
     479           0 :         hvarray[k++] = &boxes[2]; hvarray[k++] = GCD_ColSpan; hvarray[k++] = NULL;
     480           0 :         hvarray[k++] = GCD_Glue; hvarray[k++] = GCD_Glue; hvarray[k++] = NULL;
     481           0 :         hvarray[k] = NULL;
     482             : 
     483           0 :         k = 0;
     484           0 :         gcd[i].gd.pos.x = 20-3; gcd[i].gd.pos.y = gcd[i-2].gd.pos.y+30;
     485           0 :         gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
     486           0 :         gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default;
     487           0 :         label[i].text = (unichar_t *) _("_OK");
     488           0 :         label[i].text_is_1byte = true;
     489           0 :         label[i].text_in_resource = true;
     490           0 :         gcd[i].gd.label = &label[i];
     491           0 :         gcd[i].gd.handle_controlevent = SD_OK;
     492           0 :         gcd[i++].creator = GButtonCreate;
     493           0 :         butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
     494             : 
     495           0 :         gcd[i].gd.pos.x = -20; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3;
     496           0 :         gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0;
     497           0 :         gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
     498           0 :         label[i].text = (unichar_t *) _("_Cancel");
     499           0 :         label[i].text_is_1byte = true;
     500           0 :         label[i].text_in_resource = true;
     501           0 :         gcd[i].gd.label = &label[i];
     502           0 :         gcd[i].gd.handle_controlevent = OD_Cancel;
     503           0 :         gcd[i++].creator = GButtonCreate;
     504           0 :         butarray[k++] = GCD_Glue; butarray[k++] = &gcd[i-1]; butarray[k++] = GCD_Glue;
     505           0 :         butarray[k] = NULL;
     506             : 
     507           0 :         boxes[2].gd.flags = gg_enabled|gg_visible;
     508           0 :         boxes[2].gd.u.boxelements = butarray;
     509           0 :         boxes[2].creator = GHBoxCreate;
     510             : 
     511           0 :         boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
     512           0 :         boxes[0].gd.flags = gg_enabled|gg_visible;
     513           0 :         boxes[0].gd.u.boxelements = hvarray;
     514           0 :         boxes[0].creator = GHVGroupCreate;
     515             : 
     516           0 :         gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2;
     517           0 :         gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4;
     518           0 :         gcd[i].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels;
     519           0 :         gcd[i].creator = GGroupCreate;
     520             : 
     521           0 :         GGadgetsCreate(gw,boxes);
     522             : 
     523           0 :     GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
     524           0 :     GHVBoxSetExpandableCol(boxes[2].ret,gb_expandgluesame);
     525           0 :     GHVBoxFitWindow(boxes[0].ret);
     526             : 
     527           0 :     GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_ShadowLen));
     528           0 :     GTextFieldSelect(GWidgetGetControl(gw,CID_ShadowLen),0,-1);
     529             : 
     530           0 :     GWidgetHidePalettes();
     531           0 :     GDrawSetVisible(gw,true);
     532           0 :     while ( !od.done )
     533           0 :         GDrawProcessOneEvent(NULL);
     534           0 :     GDrawSetVisible(gw,false);
     535           0 : }

Generated by: LCOV version 1.10