8
8
#include < vector>
9
9
#include < cmath>
10
10
#include < algorithm>
11
+ #include < string>
11
12
12
13
#include " agg_conv_contour.h"
13
14
#include " agg_conv_curve.h"
@@ -1044,40 +1045,11 @@ void quad2cubic(double x0, double y0,
1044
1045
outy[2 ] = y2;
1045
1046
}
1046
1047
1047
- char *__append_to_string (char *p, char **buffer, size_t *buffersize,
1048
- const char *content)
1049
- {
1050
- for (const char *i = content; *i; ++i) {
1051
- if (p < *buffer) {
1052
- /* This is just an internal error */
1053
- return NULL ;
1054
- }
1055
- if ((size_t )(p - *buffer) >= *buffersize) {
1056
- char *newbuffer;
1057
- ptrdiff_t diff = p - *buffer;
1058
- *buffersize *= 2 ;
1059
- newbuffer = (char *)realloc (*buffer, *buffersize);
1060
- if (newbuffer == NULL ) {
1061
- return NULL ;
1062
- }
1063
- *buffer = newbuffer;
1064
- p = *buffer + diff;
1065
- }
1066
-
1067
- *p++ = *i;
1068
- }
1069
-
1070
- return p;
1071
- }
1072
-
1073
1048
1074
- char * __add_number (double val, const char *format , int precision,
1075
- char **buffer, char *p, size_t *buffersize )
1049
+ void __add_number (double val, char format_code , int precision,
1050
+ std::string& buffer )
1076
1051
{
1077
- char *result;
1078
-
1079
- char *str;
1080
- str = PyOS_double_to_string (val, format[0 ], precision, 0 , NULL );
1052
+ char *str = PyOS_double_to_string (val, format_code, precision, 0 , NULL );
1081
1053
1082
1054
// Delete trailing zeros and decimal point
1083
1055
char *q = str;
@@ -1090,7 +1062,7 @@ char *__add_number(double val, const char *format, int precision,
1090
1062
// Rewind through all the zeros
1091
1063
}
1092
1064
1093
- // If the end is a decimal qoint , delete that too
1065
+ // If the end is a decimal point , delete that too
1094
1066
if (q >= str && *q == ' .' ) {
1095
1067
--q;
1096
1068
}
@@ -1099,27 +1071,25 @@ char *__add_number(double val, const char *format, int precision,
1099
1071
++q;
1100
1072
*q = 0 ;
1101
1073
1102
- if ((result = __append_to_string (p, buffer, buffersize, str)) == NULL ) {
1074
+ try {
1075
+ buffer += str;
1076
+ } catch (std::bad_alloc& e) {
1103
1077
PyMem_Free (str);
1104
- return NULL ;
1078
+ throw e ;
1105
1079
}
1106
1080
PyMem_Free (str);
1107
-
1108
- return result;
1109
1081
}
1110
1082
1111
1083
1112
1084
template <class PathIterator >
1113
- int __convert_to_string (PathIterator &path,
1114
- int precision,
1115
- char **codes,
1116
- bool postfix,
1117
- char **buffer,
1118
- size_t *buffersize)
1085
+ bool __convert_to_string (PathIterator &path,
1086
+ int precision,
1087
+ char **codes,
1088
+ bool postfix,
1089
+ std::string& buffer)
1119
1090
{
1120
- const char *format = " f " ;
1091
+ const char format_code = ' f ' ;
1121
1092
1122
- char *p = *buffer;
1123
1093
double x[3 ];
1124
1094
double y[3 ];
1125
1095
double last_x = 0.0 ;
@@ -1131,14 +1101,14 @@ int __convert_to_string(PathIterator &path,
1131
1101
1132
1102
while ((code = path.vertex (&x[0 ], &y[0 ])) != agg::path_cmd_stop) {
1133
1103
if (code == 0x4f ) {
1134
- if ((p = __append_to_string (p, buffer, buffersize, codes[4 ])) == NULL ) return 1 ;
1104
+ buffer += codes[4 ];
1135
1105
} else if (code < 5 ) {
1136
1106
size = sizes[code - 1 ];
1137
1107
1138
1108
for (int i = 1 ; i < size; ++i) {
1139
1109
unsigned subcode = path.vertex (&x[i], &y[i]);
1140
1110
if (subcode != code) {
1141
- return 2 ;
1111
+ return false ;
1142
1112
}
1143
1113
}
1144
1114
@@ -1151,48 +1121,46 @@ int __convert_to_string(PathIterator &path,
1151
1121
}
1152
1122
1153
1123
if (!postfix) {
1154
- if ((p = __append_to_string (p, buffer, buffersize, codes[code - 1 ])) == NULL ) return 1 ;
1155
- if ((p = __append_to_string (p, buffer, buffersize, " " )) == NULL ) return 1 ;
1124
+ buffer += codes[code - 1 ];
1125
+ buffer += ' ' ;
1156
1126
}
1157
1127
1158
1128
for (int i = 0 ; i < size; ++i) {
1159
- if ((p = __add_number (x[i], format , precision, buffer, p, buffersize)) == NULL ) return 1 ;
1160
- if ((p = __append_to_string (p, buffer, buffersize, " " )) == NULL ) return 1 ;
1161
- if ((p = __add_number (y[i], format , precision, buffer, p, buffersize)) == NULL ) return 1 ;
1162
- if ((p = __append_to_string (p, buffer, buffersize, " " )) == NULL ) return 1 ;
1129
+ __add_number (x[i], format_code , precision, buffer) ;
1130
+ buffer += ' ' ;
1131
+ __add_number (y[i], format_code , precision, buffer) ;
1132
+ buffer += ' ' ;
1163
1133
}
1164
1134
1165
1135
if (postfix) {
1166
- if ((p = __append_to_string (p, buffer, buffersize, codes[code - 1 ])) == NULL ) return 1 ;
1136
+ buffer += codes[code - 1 ];
1167
1137
}
1168
1138
1169
1139
last_x = x[size - 1 ];
1170
1140
last_y = y[size - 1 ];
1171
1141
} else {
1172
1142
// Unknown code value
1173
- return 2 ;
1143
+ return false ;
1174
1144
}
1175
1145
1176
- if ((p = __append_to_string (p, buffer, buffersize, " \n " )) == NULL ) return 1 ;
1146
+ buffer += ' \n ' ;
1177
1147
}
1178
1148
1179
- *buffersize = p - *buffer;
1180
-
1181
- return 0 ;
1149
+ return true ;
1182
1150
}
1183
1151
1184
1152
template <class PathIterator >
1185
- int convert_to_string (PathIterator &path,
1186
- agg::trans_affine &trans,
1187
- agg::rect_d &clip_rect,
1188
- bool simplify,
1189
- SketchParams sketch_params,
1190
- int precision,
1191
- char **codes,
1192
- bool postfix,
1193
- char **buffer,
1194
- size_t *buffersize)
1153
+ bool convert_to_string (PathIterator &path,
1154
+ agg::trans_affine &trans,
1155
+ agg::rect_d &clip_rect,
1156
+ bool simplify,
1157
+ SketchParams sketch_params,
1158
+ int precision,
1159
+ char **codes,
1160
+ bool postfix,
1161
+ std::string& buffer)
1195
1162
{
1163
+ size_t buffersize;
1196
1164
typedef agg::conv_transform<py::PathIterator> transformed_path_t ;
1197
1165
typedef PathNanRemover<transformed_path_t > nan_removal_t ;
1198
1166
typedef PathClipper<nan_removal_t > clipped_t ;
@@ -1207,26 +1175,23 @@ int convert_to_string(PathIterator &path,
1207
1175
clipped_t clipped (nan_removed, do_clip && !path.has_curves (), clip_rect);
1208
1176
simplify_t simplified (clipped, simplify, path.simplify_threshold ());
1209
1177
1210
- * buffersize = path.total_vertices () * (precision + 5 ) * 4 ;
1211
- if (* buffersize == 0 ) {
1212
- return 0 ;
1178
+ buffersize = path.total_vertices () * (precision + 5 ) * 4 ;
1179
+ if (buffersize == 0 ) {
1180
+ return true ;
1213
1181
}
1214
1182
1215
1183
if (sketch_params.scale != 0.0 ) {
1216
- * buffersize *= 10 ;
1184
+ buffersize *= 10 ;
1217
1185
}
1218
1186
1219
- *buffer = (char *)malloc (*buffersize);
1220
- if (*buffer == NULL ) {
1221
- return 1 ;
1222
- }
1187
+ buffer.reserve (buffersize);
1223
1188
1224
1189
if (sketch_params.scale == 0.0 ) {
1225
- return __convert_to_string (simplified, precision, codes, postfix, buffer, buffersize );
1190
+ return __convert_to_string (simplified, precision, codes, postfix, buffer);
1226
1191
} else {
1227
1192
curve_t curve (simplified);
1228
1193
sketch_t sketch (curve, sketch_params.scale , sketch_params.length , sketch_params.randomness );
1229
- return __convert_to_string (sketch, precision, codes, postfix, buffer, buffersize );
1194
+ return __convert_to_string (sketch, precision, codes, postfix, buffer);
1230
1195
}
1231
1196
1232
1197
}
0 commit comments