2#include "media_query.h"
6litehtml::media_query::media_query()
8 m_media_type = media_type_all;
12litehtml::media_query::media_query(
const media_query& val )
15 m_expressions = val.m_expressions;
16 m_media_type = val.m_media_type;
19litehtml::media_query::ptr litehtml::media_query::create_from_string(
const tstring& str,
const std::shared_ptr<document>& doc)
21 media_query::ptr query = std::make_shared<media_query>();
24 split_string(str, tokens, _t(
" \t\r\n"), _t(
""), _t(
"("));
26 for(string_vector::iterator tok = tokens.begin(); tok != tokens.end(); tok++)
28 if((*tok) == _t(
"not"))
31 }
else if(tok->at(0) == _t(
'('))
34 if(tok->at(tok->length() - 1) == _t(
')'))
36 tok->erase(tok->length() - 1, 1);
38 media_query_expression expr;
39 string_vector expr_tokens;
40 split_string((*tok), expr_tokens, _t(
":"));
41 if(!expr_tokens.empty())
44 expr.feature = (media_feature) value_index(expr_tokens[0], media_feature_strings, media_feature_none);
45 if(expr.feature != media_feature_none)
47 if(expr_tokens.size() == 1)
49 expr.check_as_bool =
true;
53 expr.check_as_bool =
false;
54 if(expr.feature == media_feature_orientation)
56 expr.val = value_index(expr_tokens[1], media_orientation_strings, media_orientation_landscape);
59 tstring::size_type slash_pos = expr_tokens[1].find(_t(
'/'));
60 if( slash_pos != tstring::npos )
62 tstring val1 = expr_tokens[1].substr(0, slash_pos);
63 tstring val2 = expr_tokens[1].substr(slash_pos + 1);
66 expr.val = t_atoi(val1.c_str());
67 expr.val2 = t_atoi(val2.c_str());
71 length.fromString(expr_tokens[1]);
72 if(length.units() == css_units_dpcm)
74 expr.val = (int) (length.val() * 2.54);
75 }
else if(length.units() == css_units_dpi)
77 expr.val = (int) (length.val() * 2.54);
82 doc->cvt_units(length, doc->container()->get_default_font_size());
84 expr.val = (int) length.val();
89 query->m_expressions.push_back(expr);
94 query->m_media_type = (media_type) value_index((*tok), media_type_strings, media_type_all);
102bool litehtml::media_query::check(
const media_features& features )
const
105 if(m_media_type == media_type_all || m_media_type == features.type)
108 for(media_query_expression::vector::const_iterator expr = m_expressions.begin(); expr != m_expressions.end() && res; expr++)
110 if(!expr->check(features))
127litehtml::media_query_list::ptr litehtml::media_query_list::create_from_string(
const tstring& str,
const std::shared_ptr<document>& doc)
129 media_query_list::ptr list = std::make_shared<media_query_list>();
131 string_vector tokens;
132 split_string(str, tokens, _t(
","));
134 for(string_vector::iterator tok = tokens.begin(); tok != tokens.end(); tok++)
139 litehtml::media_query::ptr query = media_query::create_from_string(*tok, doc);
142 list->m_queries.push_back(query);
145 if(list->m_queries.empty())
153bool litehtml::media_query_list::apply_media_features(
const media_features& features )
157 for(media_query::vector::iterator iter = m_queries.begin(); iter != m_queries.end() && !apply; iter++)
159 if((*iter)->check(features))
165 bool ret = (apply != m_is_used);
170bool litehtml::media_query_expression::check(
const media_features& features )
const
174 case media_feature_width:
177 return (features.width != 0);
178 }
else if(features.width == val)
183 case media_feature_min_width:
184 if(features.width >= val)
189 case media_feature_max_width:
190 if(features.width <= val)
195 case media_feature_height:
198 return (features.height != 0);
199 }
else if(features.height == val)
204 case media_feature_min_height:
205 if(features.height >= val)
210 case media_feature_max_height:
211 if(features.height <= val)
217 case media_feature_device_width:
220 return (features.device_width != 0);
221 }
else if(features.device_width == val)
226 case media_feature_min_device_width:
227 if(features.device_width >= val)
232 case media_feature_max_device_width:
233 if(features.device_width <= val)
238 case media_feature_device_height:
241 return (features.device_height != 0);
242 }
else if(features.device_height == val)
247 case media_feature_min_device_height:
248 if(features.device_height >= val)
253 case media_feature_max_device_height:
254 if(features.device_height <= val)
260 case media_feature_orientation:
261 if(features.height >= features.width)
263 if(val == media_orientation_portrait)
269 if(val == media_orientation_landscape)
275 case media_feature_aspect_ratio:
276 if(features.height && val2)
278 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
279 int ratio_feat = round_d( (
double) features.width / (
double) features.height * 100.0 );
280 if(ratio_this == ratio_feat)
286 case media_feature_min_aspect_ratio:
287 if(features.height && val2)
289 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
290 int ratio_feat = round_d( (
double) features.width / (
double) features.height * 100.0 );
291 if(ratio_feat >= ratio_this)
297 case media_feature_max_aspect_ratio:
298 if(features.height && val2)
300 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
301 int ratio_feat = round_d( (
double) features.width / (
double) features.height * 100.0 );
302 if(ratio_feat <= ratio_this)
309 case media_feature_device_aspect_ratio:
310 if(features.device_height && val2)
312 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
313 int ratio_feat = round_d( (
double) features.device_width / (
double) features.device_height * 100.0 );
314 if(ratio_feat == ratio_this)
320 case media_feature_min_device_aspect_ratio:
321 if(features.device_height && val2)
323 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
324 int ratio_feat = round_d( (
double) features.device_width / (
double) features.device_height * 100.0 );
325 if(ratio_feat >= ratio_this)
331 case media_feature_max_device_aspect_ratio:
332 if(features.device_height && val2)
334 int ratio_this = round_d( (
double) val / (
double) val2 * 100 );
335 int ratio_feat = round_d( (
double) features.device_width / (
double) features.device_height * 100.0 );
336 if(ratio_feat <= ratio_this)
343 case media_feature_color:
346 return (features.color != 0);
347 }
else if(features.color == val)
352 case media_feature_min_color:
353 if(features.color >= val)
358 case media_feature_max_color:
359 if(features.color <= val)
365 case media_feature_color_index:
368 return (features.color_index != 0);
369 }
else if(features.color_index == val)
374 case media_feature_min_color_index:
375 if(features.color_index >= val)
380 case media_feature_max_color_index:
381 if(features.color_index <= val)
387 case media_feature_monochrome:
390 return (features.monochrome != 0);
391 }
else if(features.monochrome == val)
396 case media_feature_min_monochrome:
397 if(features.monochrome >= val)
402 case media_feature_max_monochrome:
403 if(features.monochrome <= val)
409 case media_feature_resolution:
410 if(features.resolution == val)
415 case media_feature_min_resolution:
416 if(features.resolution >= val)
421 case media_feature_max_resolution:
422 if(features.resolution <= val)