tb_dimension.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // ================================================================================
  2. // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
  3. // == See tb_core.h for more information. ==
  4. // ================================================================================
  5. #include "tb_dimension.h"
  6. #include "tb_types.h"
  7. #include "tb_system.h"
  8. #include "tb_tempbuffer.h"
  9. #include "tb_value.h"
  10. #include <stdlib.h>
  11. #include <ctype.h>
  12. namespace tb {
  13. // == TBDimensionConverter ==================================================================================
  14. void TBDimensionConverter::SetDPI(int src_dpi, int dst_dpi)
  15. {
  16. m_src_dpi = src_dpi;
  17. m_dst_dpi = dst_dpi;
  18. m_dst_dpi_str.Clear();
  19. if (NeedConversion())
  20. m_dst_dpi_str.SetFormatted("@%d", m_dst_dpi);
  21. }
  22. void TBDimensionConverter::GetDstDPIFilename(const char *filename, TBTempBuffer *tempbuf) const
  23. {
  24. int dot_pos = 0;
  25. for (dot_pos = strlen(filename) - 1; dot_pos > 0; dot_pos--)
  26. if (filename[dot_pos] == '.')
  27. break;
  28. tempbuf->ResetAppendPos();
  29. tempbuf->Append(filename, dot_pos);
  30. tempbuf->AppendString(GetDstDPIStr());
  31. tempbuf->AppendString(filename + dot_pos);
  32. }
  33. int TBDimensionConverter::DpToPx(int dp) const
  34. {
  35. if (dp <= TB_INVALID_DIMENSION || dp == 0 || !NeedConversion())
  36. return dp;
  37. if (dp > 0)
  38. {
  39. dp = dp * m_dst_dpi / m_src_dpi;
  40. return MAX(dp, 1);
  41. }
  42. else
  43. {
  44. dp = dp * m_dst_dpi / m_src_dpi;
  45. return MIN(dp, -1);
  46. }
  47. }
  48. int TBDimensionConverter::MmToPx(int mm) const
  49. {
  50. if (mm <= TB_INVALID_DIMENSION || mm == 0)
  51. return mm;
  52. return (int) (mm * TBSystem::GetDPI() / 25.4f + 0.5f);
  53. }
  54. int TBDimensionConverter::GetPxFromString(const char *str, int def_value) const
  55. {
  56. if (!str || !is_start_of_number(str))
  57. return def_value;
  58. int len = strlen(str);
  59. int val = atoi(str);
  60. // "dp" and unspecified unit is dp.
  61. if ((len > 0 && isdigit(str[len - 1])) ||
  62. (len > 2 && strcmp(str + len - 2, "dp") == 0))
  63. return DpToPx(val);
  64. else if (len > 2 && strcmp(str + len - 2, "mm") == 0)
  65. return MmToPx(val);
  66. else
  67. return val;
  68. }
  69. int TBDimensionConverter::GetPxFromValue(TBValue *value, int def_value) const
  70. {
  71. if (!value)
  72. return def_value;
  73. if (value->GetType() == TBValue::TYPE_INT)
  74. return DpToPx(value->GetInt());
  75. else if (value->GetType() == TBValue::TYPE_FLOAT)
  76. // FIX: We might want float versions of all dimension functions.
  77. return DpToPx((int)value->GetFloat());
  78. return GetPxFromString(value->GetString(), def_value);
  79. }
  80. }; // namespace tb