GMLscripts.com

Discuss and collaborate on GML scripts
Invert

You are not logged in.

#1 2020-04-04 18:57:29

lostdarkwolf
Member
Registered: 2015-11-19
Posts: 31

Draw text with formatting and no # as newline

To me, it seems that sometimes the functionality that turns hash symbols into newlines can be counter-productive. That's why I made this set of scripts. "draw_text_fixhash_coded" is just an extra idea that I was able to implement.

"draw_text_fixhash_coded" requires hex_to_dec. Find it here: https://www.gmlscripts.com/script/hex_to_dec

edit: 4-6-20 bugfix in draw_text_fixhash_coded and added "string_width_fixhash_coded".
edit: 4-7-20 minor and non-cosmetic bugfix in draw_text_fixhash_coded and string_width_fixhash_coded. Also added support for commas and spaces in coding between calls. Also, added some missed variabes to var statements with most, if not all scripts.

Expand///chr_width(string)
//
// returns the width of the charactor.
// the hash symbol is not considered a newline.
//
// string   string to get width from, string
//
/// GMLscripts.com/license

if argument0=9 return string_width(' ')*4
if argument0=35 return string_width('\#');
if argument0>=32 and argument0<=126 return string_width(chr(argument0));
Expand///string_length_line(string,line_number)
//
// returns the charactor length of the specified line in string.
// the hash symbol does not produce a newline.
//
// string        the string to get length from, string
// line_number   the line number starting from one, real (integer >0)
//
/// GMLscripts.com/license

var var_ii, var_text; 

var_text=argument0;
repeat argument1 {
var_ii=string_pos(chr(13),var_text)-1 
if var_ii=-1 var_ii=string_pos(chr(10),var_text)-1 
if var_ii=-1 var_ii=string_length(var_text); // end of string
var_text=string_delete(var_text,1,var_ii+1)
if var_text='' return var_ii;
}
return var_ii;
Expand///string_width_fixhash(string)
//
// returns the width of the string.
// the hash symbol does not produce a newline.
// requires script chr_width.
//
// string   string to get width from, string
//
/// GMLscripts.com/license

var var_string_length, var_letter, var_letter_last, var_ii, var_recorded_max, var_recorded_current;
var_ii=1;
var_recorded_current=0;
var_recorded_max=0;
var_string_length=string_length(argument0);

var_letter=string_char_at(argument0,var_ii)
var_letter_last=var_letter;

while var_ii<var_string_length {
 var_recorded_current+=chr_width(ord(var_letter));
 if var_recorded_current>var_recorded_max var_recorded_max=var_recorded_current;
 var_ii+=1;
 var_letter_last=var_letter;
 var_letter=string_char_at(argument0,var_ii)
 if var_letter=chr(10) or var_letter_last=chr(13) var_recorded_current=0;
}
var_recorded_current+=chr_width(ord(var_letter));
if var_recorded_current>var_recorded_max var_recorded_max=var_recorded_current;
return var_recorded_max;
Expand///string_height_fixhash(string)
//
// returns the height of the string.
// the hash symbol does not produce a newline.
//
// string   string to get width from, string
//
/// GMLscripts.com/license

if argument0='' return 0;
var var_tally_1, var_tally_2, var_tally_3;
var_tally_1=string_count(chr(10)+chr(13),argument0);
var_tally_2=string_count(chr(10),argument0)-var_tally_1;
var_tally_3=string_count(chr(13),argument0)-var_tally_1;

return (var_tally_1+var_tally_2+var_tally_3+1)*string_height('A');
Expand///draw_text_fixhash(x,y,text,halign,valign)
//
// draws the specified string
// the hash symbol does not produce a newline
// this script requires the scripts chr_width, string_width_fixhash, and string_height_fixhash.
//
// x        x position of the string, real
// y        y position of the string, real
// text     string to draw, string
// halign   horizontal alignment, real (0 = left; 1 = center; 2 = right)
// valign   vertical alignment, real (0 = top; 1 = middle; 2 = bottem)
//
/// GMLscripts.com/license

var_justify=argument3;
var_justify_vert=argument4;

var var_main_string, var_width, var_letter, var_ii, var_draw_x, var_draw_y, var_line_height;
var_main_string=argument2;
var_main_string=string_replace_all(var_main_string,chr(13)+chr(10),chr(10))
var_ii=1;
var_line_height=string_height('A');
var_space_size=string_width(' ');
var_width=string_width_fixhash(var_main_string);
if var_justify=0 { // left
 var_draw_x=0;
}
if var_justify=1 { // center
 var_draw_x=-string_width_fixhash(string_copy(var_main_string,1,string_length_line(var_main_string,1)))/2;
}
if var_justify=2 { // right
 var_draw_x=-string_width_fixhash(string_copy(var_main_string,1,string_length_line(var_main_string,1)));
}
if var_justify_vert=0 { //top
 var_draw_y=0;
}
if var_justify_vert=1 { //middle
 var_draw_y=-(string_height_fixhash(var_main_string))/2;
}
if var_justify_vert=2 { //bottem
 var_draw_y=-(string_height_fixhash(var_main_string));
}
var_spacing=0;
var_line_number=1//current line number
repeat string_length(var_main_string) {
 var_letter=ord(string_char_at(var_main_string,var_ii))
 switch var_letter {
  case 9: // tab
   if var_justify=0 var_draw_x+=var_space_size*4; // left
   if var_justify=1 var_draw_x+=var_space_size*2; // center
   if var_justify=2 var_draw_x+=var_space_size*4; // right
  break;
  case 10: // newline
   var_line_number+=1;
   var_draw_y+=var_line_height;
   if var_justify=0 var_draw_x=0
   if var_justify=1 var_draw_x=-string_width_fixhash(string_copy(var_main_string, var_ii+1,string_length_line(var_main_string,var_line_number)))/2;
   if var_justify=2 var_draw_x=-string_width_fixhash(string_copy(var_main_string,var_ii+1,string_length_line(var_main_string,var_line_number)));
  break;
  case 13: // newline
   var_line_number+=1;
   var_draw_y+=var_line_height;
   if var_justify=0 var_draw_x=0
   if var_justify=1 var_draw_x=-string_width_fixhash(string_copy(var_main_string, var_ii+1,string_length_line(var_main_string,var_line_number)))/2;
   if var_justify=2 var_draw_x=-string_width_fixhash(string_copy(var_main_string,var_ii+1,string_length_line(var_main_string,var_line_number)));
  break;
  case 32: // space
   if var_justify=0 var_draw_x+=var_space_size;
   if var_justify=1 var_draw_x+=var_space_size;
   if var_justify=2 var_draw_x+=var_space_size;
  break;
 }
 // if letter is drawable
 if var_letter>=33 and var_letter<=126 {
  // if letter = "#" 
  if var_letter=35 {
   draw_text(argument0+var_draw_x,argument1+var_draw_y,'\#')
   if var_justify=0 var_draw_x+=string_width('\#')+var_spacing;
   if var_justify=1 var_draw_x+=string_width('\#')+var_spacing;
   if var_justify=2 var_draw_x+=string_width('\#')+var_spacing;
  }
  else {
   draw_text(argument0+var_draw_x,argument1+var_draw_y,chr(var_letter))
   if var_justify=0 var_draw_x+=string_width(chr(var_letter))+var_spacing;
   if var_justify=1 var_draw_x+=string_width(chr(var_letter))+var_spacing;
   if var_justify=2 var_draw_x+=string_width(chr(var_letter))+var_spacing;
  }
 }
 var_ii+=1;
}
Expand//string_width_fixhash_coded(string)
//
// returns the width of the string.
// the hash symbol does not produce a newline.
// requires script chr_width.
//
// string   string to get width from, string
//
/// GMLscripts.com/license

var var_string_length, var_xscale, var_code_out, var_code_in, var_code_mode, var_letter, var_letter_last, var_ii, var_recorded_max, var_recorded_current;
var_ii=1;
var_recorded_current=0;
var_recorded_max=0;
var_string_length=string_length(argument0);

var_letter=string_char_at(argument0,var_ii)
var_letter_last=var_letter;
var_code_mode=false;
var_code_in="/*" /* Coding works like this */
var_code_out="*/"
var_xscale=1;

while var_ii<var_string_length {
 // 2 = length of code in tag
 if string_copy(argument0,var_ii,2)=var_code_in {
  var_code_mode=true
  var_ii+=2
 }
 // 2 = length of code out tag
 if string_copy(argument0,var_ii,2)=var_code_out {
  var_code_mode=false
  var_ii+=2
 }
 if var_code_mode=false {
  if keyboard_check_direct(vk_space) show_message(var_xscale)
  var_letter_last=var_letter;
  var_letter=string_char_at(argument0,var_ii)
  if var_letter=chr(10) or var_letter_last=chr(13) var_recorded_current=0;
  var_recorded_current+=chr_width(ord(var_letter))*var_xscale;
  if var_recorded_current>var_recorded_max var_recorded_max=var_recorded_current;
  var_ii+=1;
 }
 else {
  var var_is_inknown; var_is_inknown=true;
  if string_copy(argument0,var_ii,7)='xscale:' {
   var var_ii2; var_ii2=0;
   while string_digits(string_char_at(argument0,var_ii+7+var_ii2))=string_char_at(argument0,var_ii+7+var_ii2) 
   or string_char_at(argument0,var_ii+7+var_ii2)='.' {
    var_ii2+=1;
   }
   var_xscale=real(string_copy(argument0,var_ii+7,var_ii2))
   var_ii+=7+var_ii2;
   var_is_inknown=false;
  }
  if var_is_inknown=true var_ii+=1;
 }
}
return var_recorded_max;

This script requires hex_to_dec. Find it here: https://www.gmlscripts.com/script/hex_to_dec

Expand///draw_text_fixhash_coded(x,y,text,halign,valign)
//
// draws the specified string
// the hash symbol does not produce a newline
// uses in-string coding to change text appearance mid-string. (see paramiters below)
// Do NOT put spaces in the in-string code.
// this script requires the scripts hex_to_dec, chr_width, string_width_fixhash_coded, and string_height_fixhash.
//
// x        x position of the string, real
// y        y position of the string, real
// text     string to draw, string
// halign   horizontal alignment, real (0 = left; 1 = center; 2 = right)
// valign   vertical alignment, real (0 = top; 1 = middle; 2 = bottem)
//
/// GMLscripts.com/license

// in-string code paramiters: (Dont forget ":")
// color    color of text, real or hex
// alpha    alpha of text, real
// xscale   text horizontal scaling, real
// yscale   text vertical scaling, real
//
// examples:
// "default text /*color:$FF0000, alpha:0.5*/Blue transparent text"
// "default text /*xscale:1.4*/WIDE TEXT"
// "default text /*yscale:1.3*/TALL TEXT"

var_justify=argument3;
var_justify_vert=argument4;

var var_ii2, var_draw_yscale, var_draw_xscale, var_code_mode, var_code_out, var_space_size, var_main_length, var_main_string, var_width, var_letter, var_ii, var_draw_x, var_draw_y, var_line_height;
var_main_string=argument2;
var_main_string=string_replace_all(var_main_string,chr(13)+chr(10),chr(10))
var_main_length=string_length(var_main_string);
var_ii=1;
var_line_height=string_height('A');
var_space_size=string_width(' ');
var_width=string_width_fixhash_coded(var_main_string);
var_code_in="/*" /* Coding works like this */
var_code_out="*/"
var_code_mode=false;
var_draw_xscale=1
var_draw_yscale=1

if var_justify=0 { // left
 var_draw_x=0;
}
if var_justify=1 { // center
 var_draw_x=-string_width_fixhash_coded(string_copy(var_main_string,1,string_length_line(var_main_string,1)))/2;
}
if var_justify=2 { // right
 var_draw_x=-string_width_fixhash_coded(string_copy(var_main_string,1,string_length_line(var_main_string,1)));
}
if var_justify_vert=0 { //top
 var_draw_y=0;
}
if var_justify_vert=1 { //middle
 var_draw_y=-(string_height_fixhash(var_main_string))/2;
}
if var_justify_vert=2 { //bottem
 var_draw_y=-(string_height_fixhash(var_main_string));
 }
var_spacing=0;
var_line_number=1//current line number
while var_ii<=var_main_length {
 // 2 = length of the code_in tag
 if string_copy(argument2,var_ii,2)=var_code_in {
  var_code_mode=true;
  var_ii+=2;
 }
 // 2 = length of the code_out tag
 if string_copy(argument2,var_ii,2)=var_code_out {
  var_code_mode=false;
  var_ii+=2;
 }
 if var_code_mode=false {
  var_letter=ord(string_char_at(var_main_string,var_ii))
  switch var_letter {
   case 9: // tab
    if var_justify=0 var_draw_x+=var_space_size*4; // left
    if var_justify=1 var_draw_x+=var_space_size*2; // center
    if var_justify=2 var_draw_x+=var_space_size*4; // right
   break;
   case 10: // newline
   case 13: // newline
    var_line_number+=1;
    var_draw_y+=var_line_height;
    if var_justify=0 var_draw_x=0
    if var_justify=1 var_draw_x=(-string_width_fixhash_coded(string_copy(var_main_string, var_ii+1,string_length_line(var_main_string,var_line_number)))/2)*var_draw_xscale;
    if var_justify=2 var_draw_x=(-string_width_fixhash_coded(string_copy(var_main_string,var_ii+1,string_length_line(var_main_string,var_line_number))))*var_draw_xscale;
    
   break;
   case 32: // space
    if var_justify=0 var_draw_x+=var_space_size;
    if var_justify=1 var_draw_x+=var_space_size;
    if var_justify=2 var_draw_x+=var_space_size;
   break;
  }
  // if letter is drawable
  if var_letter>=33 and var_letter<=126 {
   // if letter = "#" 
   if var_letter=35 {
    draw_text_transformed(argument0+var_draw_x,argument1+var_draw_y,'\#',var_draw_xscale,var_draw_yscale,0);
    var_draw_x+=string_width('\#')+var_spacing;
   }
   else {
    draw_text_transformed(argument0+var_draw_x,argument1+var_draw_y,chr(var_letter),var_draw_xscale,var_draw_yscale,0)
    var_draw_x+=(string_width(chr(var_letter))*var_draw_xscale)+var_spacing;
   }
  }
  var_ii+=1;
 }
 else {
  if string_copy(argument2,var_ii,6)="color:" {
   if string_char_at(argument2,var_ii+6)='$' {
    draw_set_color(hex_to_dec(string_copy(argument2,var_ii+7,6)))
   }
   else {
    var_ii2=0;
    while string_digits(string_char_at(argument2,var_ii+6+var_ii2))=string_char_at(argument2,var_ii+6+var_ii2) {
     var_ii2+=1;
    }
    draw_set_color(real(string_copy(argument2,var_ii+6,var_ii2)))
   }
   var_ii+=6+var_ii2;
  }
  if string_copy(argument2,var_ii,6)="alpha:" {
   var_ii2=0;
   while string_digits(string_char_at(argument2,var_ii+6+var_ii2))=string_char_at(argument2,var_ii+6+var_ii2) 
   or string_char_at(argument2,var_ii+6+var_ii2)='.' {
    var_ii2+=1;
   }
   draw_set_alpha(real(string_copy(argument2,var_ii+6,var_ii2)))
   var_ii+=6+var_ii2;
  }
  if string_copy(argument2,var_ii,7)="xscale:" {
   var_ii2=0;
   while string_digits(string_char_at(argument2,var_ii+7+var_ii2))=string_char_at(argument2,var_ii+7+var_ii2) 
   or string_char_at(argument2,var_ii+7+var_ii2)='.' {
    var_ii2+=1;
   }
   var_draw_xscale=real(string_copy(argument2,var_ii+7,var_ii2))
   var_ii+=7+var_ii2;
  }
  if string_copy(argument2,var_ii,7)="yscale:" {
   var_ii2=0;
   while string_digits(string_char_at(argument2,var_ii+7+var_ii2))=string_char_at(argument2,var_ii+7+var_ii2) 
   or string_char_at(argument2,var_ii+7+var_ii2)='.' {
    var_ii2+=1;
   }
   var_draw_yscale=real(string_copy(argument2,var_ii+7,var_ii2))
   var_ii+=7+var_ii2;
  }
  if string_char_at(argument2,var_ii)=" " // stuff to ignore
  or string_char_at(argument2,var_ii)="," {
   var_ii+=1;
  }
 }
}

Last edited by lostdarkwolf (2020-04-07 09:42:56)

Offline

Board footer

Powered by FluxBB