// <KEY_SEQUENCE> KeySeq *SettingLoader::load_KEY_SEQUENCE( const tstringi &i_name, bool i_isInParen, Modifier::Type i_mode) { KeySeq keySeq(i_name); while (!isEOL()) { Modifier::Type mode; Modifier modifier = load_MODIFIER(i_mode, m_defaultKeySeqModifier, &mode); keySeq.setMode(mode); Token *t = lookToken(); if (t->isCloseParen() && i_isInParen) break; else if (t->isOpenParen()) { getToken(); // open paren KeySeq *ks = load_KEY_SEQUENCE(_T(""), true, i_mode); getToken(); // close paren keySeq.add(ActionKeySeq(ks)); } else if (*t == _T("$")) { // <KEYSEQ_NAME> getToken(); t = getToken(); KeySeq *ks = m_setting->m_keySeqs.searchByName(t->getString()); if (ks == NULL) throw ErrorMessage() << _T("`$") << *t << _T("': unknown keyseq name."); if (!ks->isCorrectMode(i_mode)) throw ErrorMessage() << _T("`$") << *t << _T("': Some of R-, IL-, IC-, NL-, CL-, SL-, KL-, MAX-, MIN-, MMAX-, MMIN-, T-, TS-, M0...M9- and L0...L9- are used in the keyseq. They are prohibited in this context."); keySeq.setMode(ks->getMode()); keySeq.add(ActionKeySeq(ks)); } else if (*t == _T("&")) { // <FUNCTION_NAME> getToken(); t = getToken(); // search function ActionFunction af(createFunctionData(t->getString()), modifier); if (af.m_functionData == NULL) throw ErrorMessage() << _T("`&") << *t << _T("': unknown function name."); af.m_functionData->load(this); keySeq.add(af); } else { // <KEYSEQ_MODIFIED_KEY_NAME> ModifiedKey mkey; mkey.m_modifier = modifier; mkey.m_key = load_KEY_NAME(); keySeq.add(ActionKey(mkey)); } } return m_setting->m_keySeqs.add(keySeq); }
/* load m_setting If called by "include", 'filename' describes filename. Otherwise the 'filename' is empty. */ bool SettingLoader::load(Setting *i_setting, const tstringi &i_filename) { m_setting = i_setting; m_isThereAnyError = false; tstringi path; if (!getFilename(i_filename, &path)) { if (i_filename.empty()) { Acquire a(m_soLog); getFilename(i_filename, &path, 0); // show filenames return false; } else throw ErrorMessage() << _T("`") << i_filename << _T("': no such file or other error."); } // create global keymap's default keySeq ActionFunction af(createFunctionData(_T("OtherWindowClass"))); KeySeq *globalDefault = m_setting->m_keySeqs.add(KeySeq(_T("")).add(af)); // add default keymap m_currentKeymap = m_setting->m_keymaps.add( Keymap(Keymap::Type_windowOr, _T("Global"), _T(""), _T(""), globalDefault, NULL)); /* // add keyboard layout name if (filename.empty()) { char keyboardLayoutName[KL_NAMELENGTH]; if (GetKeyboardLayoutName(keyboardLayoutName)) { tstringi kl = tstringi(_T("KeyboardLayout/")) + keyboardLayoutName; m_setting->symbols.insert(kl); Acquire a(m_soLog); *m_log << _T("KeyboardLayout: ") << kl << std::endl; } } */ // load load(path); // finalize if (i_filename.empty()) m_setting->m_keymaps.adjustModifier(m_setting->m_keyboard); return !m_isThereAnyError; }
static int getYV12FragmentFunction(CompScreen *s, CompTexture *texture, int param) { VideoFunction *function; CompFunctionData *data; int target; VIDEO_SCREEN(s); if (texture->target == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; for (function = vs->yv12Functions; function; function = function->next) if (function->param == param && function->target == target) return function->handle; data = createFunctionData(); if (data) { static char *temp[] = { "uv", "tmp", "position" }; int i, handle = 0; char str[1024]; Bool ok = TRUE; for (i = 0; i < sizeof (temp) / sizeof (temp[0]); i++) ok &= addTempHeaderOpToFunctionData(data, temp[i]); snprintf(str, 1024, "MOV position, fragment.texcoord[0];" "MAX position, position, program.env[%d];" "MIN position, position, program.env[%d].zwww;", param, param); ok &= addDataOpToFunctionData(data, str); if (target == COMP_FETCH_TARGET_RECT) { snprintf(str, 1024, "TEX output, position, texture[0], RECT;" "MOV output, output.a;"); ok &= addDataOpToFunctionData(data, str); if (s->glxPixmapFBConfigs[8].yInverted) { snprintf(str, 1024, "MAD position, position, 0.5, program.env[%d].xy;", param + 1); } else { snprintf(str, 1024, "ADD position, position, program.env[%d].xy;" "MUL position, position, 0.5;", param + 1); } ok &= addDataOpToFunctionData(data, str); snprintf(str, 1024, "TEX tmp, position, texture[0], RECT;" "MOV uv, tmp.a;" "MAD output, output, 1.164, -0.073;" "ADD position.x, position.x, program.env[%d].z;" "TEX tmp, position, texture[0], RECT;" "MOV uv.y, tmp.a;", param + 1); } else { snprintf(str, 1024, "TEX output, position, texture[0], 2D;" "MOV output, output.a;"); ok &= addDataOpToFunctionData(data, str); if (s->glxPixmapFBConfigs[8].yInverted) { snprintf(str, 1024, "MAD position, position, 0.5, { 0.0, %f };", 2.0f / 3.0f); } else { snprintf(str, 1024, "SUB position, position, { 0.0, %f };" "MUL position, position, 0.5;", 1.0f / 3.0f); } ok &= addDataOpToFunctionData(data, str); snprintf(str, 1024, "TEX tmp, position, texture[0], 2D;" "MOV uv, tmp.a;" "MAD output, output, 1.164, -0.073;" "ADD position.x, position.x, 0.5;" "TEX tmp, position, texture[0], 2D;" "MOV uv.y, tmp.a;"); } ok &= addDataOpToFunctionData(data, str); snprintf(str, 1024, "SUB uv, uv, { 0.5, 0.5 };" "MAD output.xyz, { 1.596, -0.813, 0.0 }, uv.xxxw, output;" "MAD output.xyz, { 0.0, -0.391, 2.018 }, uv.yyyw, output;" "MOV output.a, 1.0;"); ok &= addDataOpToFunctionData(data, str); if (!ok) { destroyFunctionData(data); return 0; } function = malloc(sizeof (VideoFunction)); if (function) { handle = createFragmentFunction(s, "video", data); function->handle = handle; function->target = target; function->param = param; function->next = vs->yv12Functions; vs->yv12Functions = function; } destroyFunctionData(data); return handle; } return 0; }
static int getBumpMapFragmentFunction(CompScreen * s, CompTexture * texture, int unit, int param) { WaterFunction *function; CompFunctionData *data; int target; WATER_SCREEN(s); if (texture->target == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; for (function = ws->bumpMapFunctions; function; function = function->next) { if (function->param == param && function->unit == unit && function->target == target) return function->handle; } data = createFunctionData(); if (data) { static char *temp[] = { "normal", "temp", "total", "bump", "offset" }; int i, handle = 0; char str[1024]; for (i = 0; i < sizeof(temp) / sizeof(temp[0]); i++) { if (!addTempHeaderOpToFunctionData(data, temp[i])) { destroyFunctionData(data); return 0; } } snprintf(str, 1024, /* get normal from normal map */ "TEX normal, fragment.texcoord[%d], texture[%d], %s;" /* save height */ "MOV offset, normal;" /* remove scale and bias from normal */ "MAD normal, normal, 2.0, -1.0;" /* normalize the normal map */ "DP3 temp, normal, normal;" "RSQ temp, temp.x;" "MUL normal, normal, temp;" /* scale down normal by height and constant and use as offset in texture */ "MUL offset, normal, offset.w;" "MUL offset, offset, program.env[%d];", unit, unit, (ws->target == GL_TEXTURE_2D) ? "2D" : "RECT", param); if (!addDataOpToFunctionData(data, str)) { destroyFunctionData(data); return 0; } if (!addFetchOpToFunctionData (data, "output", "offset.yxzz", target)) { destroyFunctionData(data); return 0; } snprintf(str, 1024, /* normal dot lightdir, this should eventually be changed to a real light vector */ "DP3 bump, normal, { 0.707, 0.707, 0.0, 0.0 };" "MUL bump, bump, state.light[0].diffuse;"); if (!addDataOpToFunctionData(data, str)) { destroyFunctionData(data); return 0; } if (!addColorOpToFunctionData(data, "output", "output")) { destroyFunctionData(data); return 0; } snprintf(str, 1024, /* diffuse per-vertex lighting, opacity and brightness and add lightsource bump color */ "ADD output, output, bump;"); if (!addDataOpToFunctionData(data, str)) { destroyFunctionData(data); return 0; } function = malloc(sizeof(WaterFunction)); if (function) { handle = createFragmentFunction(s, "water", data); function->handle = handle; function->target = target; function->param = param; function->unit = unit; function->next = ws->bumpMapFunctions; ws->bumpMapFunctions = function; } destroyFunctionData(data); return handle; } return 0; }
int getSaturateFragmentFunction (CompScreen *s, CompTexture *texture, int param) { int target; if (param >= 64) return 0; if (texture->target == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; if (!s->saturateFunction[target][param]) { static const char *saturateData = "MUL temp, output, { 1.0, 1.0, 1.0, 0.0 };" "DP3 temp, temp, program.env[%d];" "LRP output.xyz, program.env[%d].w, output, temp;"; CompFunctionData *data; data = createFunctionData (); if (data) { char str[1024]; if (!addTempHeaderOpToFunctionData (data, "temp")) { destroyFunctionData (data); return 0; } if (!addFetchOpToFunctionData (data, "output", NULL, target)) { destroyFunctionData (data); return 0; } if (!addColorOpToFunctionData (data, "output", "output")) { destroyFunctionData (data); return 0; } snprintf (str, 1024, saturateData, param, param); if (!addDataOpToFunctionData (data, str)) { destroyFunctionData (data); return 0; } s->saturateFunction[target][param] = createFragmentFunction (s, "__core_saturate", data); destroyFunctionData (data); } } return s->saturateFunction[target][param]; }
// <KEYMAP_DEFINITION> void SettingLoader::load_KEYMAP_DEFINITION(const Token *i_which) { Keymap::Type type = Keymap::Type_keymap; Token *name = getToken(); // <KEYMAP_NAME> tstringi windowClassName; tstringi windowTitleName; KeySeq *keySeq = NULL; Keymap *parentKeymap = NULL; bool isKeymap2 = false; bool doesLoadDefaultKeySeq = false; if (!isEOL()) { Token *t = lookToken(); if (*i_which == _T("window")) { // <WINDOW> if (t->isOpenParen()) // "(" <WINDOW_CLASS_NAME> "&&" <WINDOW_TITLE_NAME> ")" // "(" <WINDOW_CLASS_NAME> "||" <WINDOW_TITLE_NAME> ")" { getToken(); windowClassName = getToken()->getRegexp(); t = getToken(); if (*t == _T("&&")) type = Keymap::Type_windowAnd; else if (*t == _T("||")) type = Keymap::Type_windowOr; else throw ErrorMessage() << _T("`") << *t << _T("': unknown operator."); windowTitleName = getToken()->getRegexp(); if (!getToken()->isCloseParen()) throw ErrorMessage() << _T("there must be `)'."); } else if (t->isRegexp()) { // <WINDOW_CLASS_NAME> getToken(); type = Keymap::Type_windowAnd; windowClassName = t->getRegexp(); } } else if (*i_which == _T("keymap")) ; else if (*i_which == _T("keymap2")) isKeymap2 = true; else ASSERT(false); if (!isEOL()) doesLoadDefaultKeySeq = true; } m_currentKeymap = m_setting->m_keymaps.add( Keymap(type, name->getString(), windowClassName, windowTitleName, NULL, NULL)); if (doesLoadDefaultKeySeq) { Token *t = lookToken(); // <KEYMAP_PARENT> if (*t == _T(":")) { getToken(); t = getToken(); parentKeymap = m_setting->m_keymaps.searchByName(t->getString()); if (!parentKeymap) throw ErrorMessage() << _T("`") << *t << _T("': unknown keymap name."); } if (!isEOL()) { t = getToken(); if (!(*t == _T("=>") || *t == _T("="))) throw ErrorMessage() << _T("`") << *t << _T("': syntax error."); keySeq = SettingLoader::load_KEY_SEQUENCE(); } } if (keySeq == NULL) { FunctionData *fd; if (type == Keymap::Type_keymap && !isKeymap2) fd = createFunctionData(_T("KeymapParent")); else if (type == Keymap::Type_keymap && !isKeymap2) fd = createFunctionData(_T("Undefined")); else // (type == Keymap::Type_windowAnd || type == Keymap::Type_windowOr) fd = createFunctionData(_T("KeymapParent")); ASSERT( fd ); keySeq = m_setting->m_keySeqs.add( KeySeq(name->getString()).add(ActionFunction(fd))); } m_currentKeymap->setIfNotYet(keySeq, parentKeymap); }
static int getNegFragmentFunction (CompScreen *s, CompTexture *texture, Bool alpha) { CompFunctionData *data; int target; NEG_SCREEN (s); if (texture->target == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; if (alpha) { if (ns->negAlphaFunction) return ns->negAlphaFunction; } else { if (ns->negFunction) return ns->negFunction; } data = createFunctionData (); if (data) { Bool ok = TRUE; int handle = 0; if (alpha) ok &= addTempHeaderOpToFunctionData (data, "neg" ); ok &= addFetchOpToFunctionData (data, "output", NULL, target); if (alpha) { ok &= addDataOpToFunctionData (data, "RCP neg.a, output.a;"); ok &= addDataOpToFunctionData (data, "MAD output.rgb, -neg.a, output, 1.0;"); } else ok &= addDataOpToFunctionData (data, "SUB output.rgb, 1.0, output;"); if (alpha) ok &= addDataOpToFunctionData (data, "MUL output.rgb, output.a, output;"); ok &= addColorOpToFunctionData (data, "output", "output"); if (!ok) { destroyFunctionData (data); return 0; } handle = createFragmentFunction (s, "neg", data); if (alpha) ns->negAlphaFunction = handle; else ns->negFunction = handle; destroyFunctionData (data); return handle; } return 0; }