/* * * Create the masks object * */ SkMasks* SkMasks::CreateMasks(InputMasks masks, uint32_t bitsPerPixel) { // Trim the input masks according to bitsPerPixel if (bitsPerPixel < 32) { masks.red &= (1 << bitsPerPixel) - 1; masks.green &= (1 << bitsPerPixel) - 1; masks.blue &= (1 << bitsPerPixel) - 1; masks.alpha &= (1 << bitsPerPixel) - 1; } // Check that masks do not overlap if (((masks.red & masks.green) | (masks.red & masks.blue) | (masks.red & masks.alpha) | (masks.green & masks.blue) | (masks.green & masks.alpha) | (masks.blue & masks.alpha)) != 0) { return nullptr; } // Collect information about the masks const MaskInfo red = process_mask(masks.red, bitsPerPixel); const MaskInfo green = process_mask(masks.green, bitsPerPixel); const MaskInfo blue = process_mask(masks.blue, bitsPerPixel); const MaskInfo alpha = process_mask(masks.alpha, bitsPerPixel); return new SkMasks(red, green, blue, alpha); }
void Def:: process_ctype () { issue_diag (I_STAGE, false, 0, "processing %s section\n", lc_name); ctype_def_found_ = true; // used in processing the copy/include directive int nesting_level = 0; while ((next = scanner_.next_token()).token != Scanner::tok_ctype) { switch(next.token) { case Scanner::tok_copy: { // when we see the copy directive in the ctype definition we // are going to either create the shared database and create a // symbolic link to it, or we are going to create a symbolic link // to the already existing shared ctype database. next = scanner_.next_token(); if (next.token != Scanner::tok_string) issue_diag (E_SYNTAX, true, &next, "expected string following \"copy\" directive\n"); #if !defined (_WIN32) && !defined (__CYGWIN__) ctype_symlink_ = true; // first lets make sure that the ctype database for this // locale hasn't already been generated ctype_filename_ = output_name_; // strip off the last directory ctype_filename_ = ctype_filename_.substr (0, ctype_filename_.rfind (_RWSTD_PATH_SEP, ctype_filename_.length() - 1) + 1); ctype_filename_ += strip_quotes(next.name); ctype_filename_ += ".ctype."; ctype_filename_ += charmap_.get_charmap_name(); std::ifstream f (ctype_filename_.c_str(), std::ios::binary); if (f) { // the database exists so simply create a sym link to it ctype_written_ = true; f.close(); continue; } #endif // !_WIN32 && !__CYGWIN__ // bump up the nesting level nesting_level++; issue_diag (I_STAGE, false, 0, "processing copy directive\n"); // open the file scanner_.open (get_pathname (strip_quotes (next.name), next.file)); // get comment char and escape char; // these informations are stored by the scanner while ((next = scanner_.next_token ()).token != Scanner::tok_ctype ){ // the LC_IDENTIFICATION section may also have a // LC_CTYPE token that will mess up the parsing if (next.token == Scanner::tok_ident) { while ((next = scanner_.next_token()).token != Scanner::tok_end ); next = scanner_.next_token(); } } break; } case Scanner::tok_nl: break; case Scanner::tok_upper: process_mask (std::ctype_base::upper, "upper"); break; case Scanner::tok_lower: process_mask (std::ctype_base::lower, "lower"); break; case Scanner::tok_alpha: process_mask (std::ctype_base::alpha, "alpha"); break; case Scanner::tok_digit: process_mask (std::ctype_base::digit, "digit"); break; case Scanner::tok_space: process_mask (std::ctype_base::space, "space"); break; case Scanner::tok_cntrl: process_mask (std::ctype_base::cntrl, "cntrl"); break; case Scanner::tok_punct: process_mask (std::ctype_base::punct, "punct"); break; case Scanner::tok_graph: process_mask (std::ctype_base::graph, "graph"); break; case Scanner::tok_print: process_mask (std::ctype_base::print, "print"); break; case Scanner::tok_xdigit: process_mask (std::ctype_base::xdigit, "xdigit"); break; case Scanner::tok_toupper: process_upper_lower (Scanner::tok_toupper); break; case Scanner::tok_tolower: process_upper_lower (Scanner::tok_tolower); break; case Scanner::tok_blank: scanner_.ignore_line(); break; case Scanner::tok_xlit_start: process_xlit (); break; case Scanner::tok_end: next = scanner_.next_token(); if (next.token == Scanner::tok_ctype) { // end of ctype block if (nesting_level == 0) return; nesting_level--; scanner_.close (); } else issue_diag (E_SYNTAX, true, &next, "wrong section name in END directive\n"); break; default: // ignore locale specific character classes because the c++ // library does not make use of them scanner_.ignore_line(); break; } } }