BLI_math_rotation: properly name the quaternion power function.
[blender.git] / source / blender / blenlib / intern / timecode.c
index 4ae9249ec0d89dd4d47c5e8f26c1cab74db065ed..ab7766d2cd69c3d15bd8d481bea3dbdc227065b3 100644 (file)
@@ -4,7 +4,7 @@
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. 
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,7 @@
  * The Original Code is Copyright (C) 2008 Blender Foundation.
  * All rights reserved.
  *
  * The Original Code is Copyright (C) 2008 Blender Foundation.
  * All rights reserved.
  *
- * 
+ *
  * Contributor(s): Joshua Leung
  *
  * ***** END GPL LICENSE BLOCK *****
  * Contributor(s): Joshua Leung
  *
  * ***** END GPL LICENSE BLOCK *****
 /**
  * Generate timecode/frame number string and store in \a str
  *
 /**
  * Generate timecode/frame number string and store in \a str
  *
- * \param str  destination string
- * \param maxncpy  maximum number of characters to copy ``sizeof(str)``
- * \param power  special setting for #View2D grid drawing,
+ * \param str: destination string
+ * \param maxncpy: maximum number of characters to copy ``sizeof(str)``
+ * \param power: special setting for #View2D grid drawing,
  *        used to specify how detailed we need to be
  *        used to specify how detailed we need to be
- * \param time_seconds  time total time in seconds
- * \param fps  frames per second, typically from the #FPS macro
- * \param timecode_style  enum from eTimecodeStyles
+ * \param time_seconds: time total time in seconds
+ * \param fps: frames per second, typically from the #FPS macro
+ * \param timecode_style: enum from eTimecodeStyles
  * \return length of \a str
  */
 
  * \return length of \a str
  */
 
@@ -72,20 +72,20 @@ size_t BLI_timecode_string_from_time(
                time = -time;
        }
 
                time = -time;
        }
 
-       if (time >= 3600) {
+       if (time >= 3600.0f) {
                /* hours */
                /* XXX should we only display a single digit for hours since clips are
                 *     VERY UNLIKELY to be more than 1-2 hours max? However, that would
                 *     go against conventions...
                 */
                hours = (int)time / 3600;
                /* hours */
                /* XXX should we only display a single digit for hours since clips are
                 *     VERY UNLIKELY to be more than 1-2 hours max? However, that would
                 *     go against conventions...
                 */
                hours = (int)time / 3600;
-               time = (float)fmod(time, 3600);
+               time = fmodf(time, 3600);
        }
 
        }
 
-       if (time >= 60) {
+       if (time >= 60.0f) {
                /* minutes */
                minutes = (int)time / 60;
                /* minutes */
                minutes = (int)time / 60;
-               time = (float)fmod(time, 60);
+               time = fmodf(time, 60);
        }
 
        if (power <= 0) {
        }
 
        if (power <= 0) {
@@ -94,11 +94,11 @@ size_t BLI_timecode_string_from_time(
                 * to cope with 'half' frames, etc., which should be fine in most cases
                 */
                seconds = (int)time;
                 * to cope with 'half' frames, etc., which should be fine in most cases
                 */
                seconds = (int)time;
-               frames = iroundf((float)(((double)time - (double)seconds) * fps));
+               frames = round_fl_to_int((float)(((double)time - (double)seconds) * fps));
        }
        else {
                /* seconds (with pixel offset rounding) */
        }
        else {
                /* seconds (with pixel offset rounding) */
-               seconds = iroundf(time);
+               seconds = round_fl_to_int(time);
        }
 
        switch (timecode_style) {
        }
 
        switch (timecode_style) {
@@ -163,6 +163,18 @@ size_t BLI_timecode_string_from_time(
                        }
                        break;
                }
                        }
                        break;
                }
+               case USER_TIMECODE_SUBRIP:
+               {
+                       /* SubRip, like SMPTE milliseconds but seconds and milliseconds are separated by a comma, not a dot... */
+
+                       /* precision of decimal part */
+                       const int ms_dp = (power <= 0) ? (1 - power) : 1;
+                       const int ms = round_fl_to_int((time - (float)seconds) * 1000.0f);
+
+                       rlen = BLI_snprintf_rlen(
+                                  str, maxncpy, "%s%02d:%02d:%02d,%0*d", neg, hours, minutes, seconds, ms_dp, ms);
+                       break;
+               }
                case USER_TIMECODE_SECONDS_ONLY:
                {
                        /* only show the original seconds display */
                case USER_TIMECODE_SECONDS_ONLY:
                {
                        /* only show the original seconds display */
@@ -171,7 +183,7 @@ size_t BLI_timecode_string_from_time(
                                rlen = BLI_snprintf_rlen(str, maxncpy, "%.*f", 1 - power, time_seconds);
                        }
                        else {
                                rlen = BLI_snprintf_rlen(str, maxncpy, "%.*f", 1 - power, time_seconds);
                        }
                        else {
-                               rlen = BLI_snprintf_rlen(str, maxncpy, "%d", iroundf(time_seconds));
+                               rlen = BLI_snprintf_rlen(str, maxncpy, "%d", round_fl_to_int(time_seconds));
                        }
                        break;
                }
                        }
                        break;
                }
@@ -219,11 +231,11 @@ size_t BLI_timecode_string_from_time_simple(
 /**
  * Generate time string and store in \a str
  *
 /**
  * Generate time string and store in \a str
  *
- * \param str  destination string
- * \param maxncpy  maximum number of characters to copy ``sizeof(str)``
- * \param power  special setting for #View2D grid drawing,
+ * \param str: destination string
+ * \param maxncpy: maximum number of characters to copy ``sizeof(str)``
+ * \param power: special setting for #View2D grid drawing,
  *        used to specify how detailed we need to be
  *        used to specify how detailed we need to be
- * \param time_seconds  time total time in seconds
+ * \param time_seconds: time total time in seconds
  * \return length of \a str
  *
  * \note in some cases this is used to print non-seconds values.
  * \return length of \a str
  *
  * \note in some cases this is used to print non-seconds values.
@@ -238,7 +250,7 @@ size_t BLI_timecode_string_from_time_seconds(
                rlen = BLI_snprintf_rlen(str, maxncpy, "%.*f", 1 - power, time_seconds);
        }
        else {
                rlen = BLI_snprintf_rlen(str, maxncpy, "%.*f", 1 - power, time_seconds);
        }
        else {
-               rlen = BLI_snprintf_rlen(str, maxncpy, "%d", iroundf(time_seconds));
+               rlen = BLI_snprintf_rlen(str, maxncpy, "%d", round_fl_to_int(time_seconds));
        }
 
        return rlen;
        }
 
        return rlen;