pybik-1.1/0000775000175000017500000000000012157424343012646 5ustar barccbarcc00000000000000pybik-1.1/tools/0000775000175000017500000000000012157424343014006 5ustar barccbarcc00000000000000pybik-1.1/tools/modeldata.py0000775000175000017500000001153012150716364016315 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os sys.path.insert(0, '.') import pickle as pickle from multiprocessing import Pool, cpu_count from pybiklib import model model.use_modeldata = False dedup_data = [] cnt_dups = [] cnt_values = [] def dedup_reset(): dedup_data[:] = [[] for unused_i in range(6)] cnt_dups[:] = [0] * 6 cnt_values[:] = [0] * 6 def pool_dedup(level, value): if isinstance(value, dict): iterator = list(value.items()) elif isinstance(value, list): iterator = enumerate(value) elif isinstance(value, tuple): iterator = [] else: return value cnt_values[level] += 1 try: didx = dedup_data[level].index((type(value), value)) except ValueError: dedup_data[level].append((type(value), value)) for k, v in iterator: v = pool_dedup(level+1, v) value[k] = v else: dtype, dvalue = dedup_data[level][didx] assert value == dvalue and type(value) == type(dvalue) == dtype, (value, dvalue) cnt_dups[level] += 1 value = dvalue return value def pool_functions(parallel): pool = None try: if parallel > 1: pool = Pool(processes=parallel) except OSError as e: print('process pool not available ({}):'.format(e)) print(' maybe /dev/shm is not mounted,') print(' deactivating multiprocessing') sys.stdout.flush() # when Pool(…) fails this line is if pool is not None: return pool.imap_unordered else: return map def enum_modelfiles(dirname, testfunc): ignored = [] modelfiles = [] for Model in model.models: for i in range(1, 11): for j in range(1, 11): for k in range(1, 11): sizes = Model.norm_sizes((i, j, k)) filename = Model.get_datafilename(sizes) filename = os.path.join(dirname, filename) if filename in modelfiles or filename in ignored: continue if testfunc(filename): modelfiles.append(filename) else: ignored.append(filename) if modelfiles: for filename in sorted(ignored): print('skipping', filename) return sorted(modelfiles, reverse=True) def pool_enum_modelfile(filename): sizes_list = [] for Model in model.models: for i in range(1, 11): for j in range(1, 11): for k in range(1, 11): sizes = Model.norm_sizes((i, j, k)) if os.path.basename(filename) != Model.get_datafilename(sizes): continue if (Model, sizes) in sizes_list: continue sizes_list.append((Model, sizes)) return sizes_list def pool_create_modelfiledata(sizes_list): savedata = {} for Model, sizes in sizes_list: modelobj = Model(sizes, None) savedata[(Model.type, sizes)] = modelobj.get_savedata() return savedata def pool_create_modelfile(args): filename, fast = args sizes_list = pool_enum_modelfile(filename) savedata = pool_create_modelfiledata(sizes_list) if not fast: dedup_reset() savedata = pool_dedup(0, savedata) with open(filename, 'wb') as datafile: pickle.dump(savedata, datafile, -1) vals = ['%6s' % v for v in cnt_values] dups = ['%6s' % d for d in cnt_dups] return 'generated {} with {} models\n vals: {}\n dups: {}'.format( filename, len(sizes_list), ' '.join(vals), ' '.join(dups)) def create_modeldata(dirname, testfunc=None, parallel=1, fast=False): if testfunc is None: testfunc = lambda arg: True imap_model = pool_functions(parallel) modelfiles = enum_modelfiles(dirname, testfunc) for lines in imap_model(pool_create_modelfile, [(m, fast) for m in modelfiles]): print(lines) sys.stdout.flush() if __name__ == '__main__': create_modeldata('data/models', parallel=cpu_count()) #create_modeldata('data/models', parallel=1) pybik-1.1/tools/uni2img.py0000775000175000017500000000441512137177715015747 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import unicodedata symbols = [ #('ATOM SYMBOL', 'DejaVu-Sans-Oblique', 300, '+0+3'), ('ATOM SYMBOL', 'FreeSerif-Mittel', 256, '+0-6'), #('BEAMED EIGHTH NOTES', 'DejaVu-Sans-Oblique', 256, '+0-6'), ('BEAMED EIGHTH NOTES', 'FreeSerif-Mittel', 256, '+0+16'), ('BLACK SMILING FACE', 'DejaVu-Sans-Oblique', 256, '-1+5'), ('PEACE SYMBOL', 'DejaVu-Sans-Oblique', 300, '-2+5'), ('SHAMROCK', 'DejaVu-Sans-Oblique', 300, '-1+5'), ('SKULL AND CROSSBONES','DejaVu-Sans-Oblique', 300, '-1+5'), #('SKULL AND CROSSBONES','FreeSerif-Mittel', 300, '+0+0'), #('SNOWFLAKE', 'DejaVu-Sans-Oblique', 300, '-1+5'), ('SNOWFLAKE', 'FreeSerif-Mittel', 320, '+0+14'), ('WHITE SMILING FACE', 'DejaVu-Sans-Oblique', 256, '-1+5'), #('WHITE SUN WITH RAYS', 'DejaVu-Sans-Oblique', 300, '+0+4'), ('WHITE SUN WITH RAYS', 'FreeMono-Standard', 390, '+0+0'), ('YIN YANG', 'DejaVu-Sans-Oblique', 300, '-2+5'), #'FOUR LEAF CLOVER', #'ANTICLOCKWISE GAPPED CIRCLE ARROW', #'CLOCKWISE GAPPED CIRCLE ARROW', ] path = 'data/ui/images' def main(): for name, font, size, pos in symbols: c = unicodedata.lookup(name) os.system('convert -size 256x256 null: -alpha transparent -font {} -pointsize {} -gravity center' ' -annotate 0x0{} {} "{}/{}.png"' .format(font, size, pos, c, path, name) .encode('utf-8')) if __name__ == '__main__': main() pybik-1.1/tools/conv_plugin_for_translation.py0000775000175000017500000000536112150714000022160 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os, re def convert(source_filename, target_filename): with open(source_filename, 'rt', encoding='utf-8') as source: lines = source.readlines() re_field = re.compile(r'^(.*): (.+)$') with open(target_filename, 'wt', encoding='utf-8') as target: translation_comment = None dstlineno = 0 for srclineno, line in enumerate(lines): match = re_field.match(line) field, value = match.groups() if match else (None, None) if field == 'Path': sep = value[0] formatstr = '_({!r})' if sep != '@' else '{!r}' values = [] for v in value.split(sep): if v: if translation_comment and translation_key in re.split('\W+', v): values.append(translation_comment) v = formatstr.format(v) values.append(v) value = '\n'.join(values) dstlineno += len(values) translation_comment = None elif line.strip().startswith('#'): translation_comment = line.strip() translation_key = translation_comment.strip('#').strip().split() if translation_key: translation_key = translation_key[0] else: translation_comment = None value = None else: translation_comment = None value = None if value is None: if dstlineno <= srclineno: value = '' dstlineno += 1 else: continue target.write(value) target.write('\n') def main(): if len(sys.argv) != 2: print('usage: {} scriptfile'.format(os.path.basename(sys.argv[0]))) return 1 filename = sys.argv[1] convert(filename, filename+'.py') if __name__ == '__main__': sys.exit(main()) pybik-1.1/tools/format-translators.py0000775000175000017500000000420112157320104020210 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os from ast import literal_eval import polib # to force an import error, po_isempty ignore it if polibk is not installed from po_isempty import po_isempty def pprint_tranlators(translation_authors): print('[') for template, langname, langcode, persons in translation_authors: filename = 'po/%s.po' % langcode if not os.path.exists(filename): print('not found:', filename, file=sys.stderr) continue if po_isempty(filename, verbose=False): print('empty:', filename, file=sys.stderr) continue print(' ({!r}, {!r}, ['.format(langname, langcode)) for person in persons: print(' {!r},'.format(person)) print(' ]),') print(']') def main(): data = sys.stdin.read() if not data.strip(): print('\nError: empty input, require output from "bc-lp-project-translators --py LPPROJECT"', file=sys.stderr) return try: tranlators = literal_eval(data) except (SyntaxError, ValueError): print('\nError: invalid syntax in input, require output from "bc-lp-project-translators --py LPPROJECT"') return try: pprint_tranlators(tranlators) except (ValueError, TypeError): print('\nError: malformed input, require output from "bc-lp-project-translators --py LPPROJECT"') raise if __name__ == '__main__': main() pybik-1.1/tools/po_isempty.py0000664000175000017500000000212212157317335016547 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . def po_isempty(pofilename, verbose=True): try: import polib except ImportError: if verbose: print('polib not found, assuming the file %s contains translations' % pofilename) return False for entry in polib.pofile(pofilename): if entry.translated() and entry.msgid != entry.msgstr: return False return True pybik-1.1/tools/translation_from_ui.py0000775000175000017500000001056412150712377020447 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os import itertools from collections import OrderedDict from xml.etree import ElementTree def get_string(prop): string = prop.find('string') if string is None or string.attrib.get('notr') == 'true': return None return string.text def parse_file(filename): tree = ElementTree.parse(filename) root = tree.getroot() window = root.find('widget') widgets = OrderedDict() child_items = [] for prop in window.findall('property'): text = get_string(prop) if text is not None: child_items.append(('window', prop.attrib['name'], text)) for tag in window: for widget in itertools.chain(tag.iter('widget'), tag.iter('action')): if widget.tag == 'widget': widget_class = widget.attrib['class'] else: widget_class = 'QAction' widget_name = widget.attrib['name'] for prop in itertools.chain(widget.findall('property'), widget.findall('attribute')): itemtype = prop.tag prop_name = prop.attrib['name'] text = get_string(prop) if text is None: continue if itemtype == 'property': child_items.append((itemtype, widget_name, prop_name, text)) if itemtype == 'attribute': parent = window.find(".//*[@name='%s']/.." % widget_name) if parent and parent.attrib.get('class') == 'QTabWidget': parent_name = parent.attrib['name'] widgets.setdefault(parent_name, 'QTabWidget') child_items.append(('QTabWidget', parent_name, widget_name, text)) else: child_items.append((itemtype, widget_class, widget_name, prop_name, text)) widgets.setdefault(widget_name, widget_class) return window.attrib['class'], widgets, child_items def write_file(window_class, widgets, child_items, file): print( '''# -*- coding: utf-8 -*- # generated with: {} from PyQt4.QtGui import {} def retranslate(window):'''.format(' '.join(sys.argv), ', '.join(sorted(set(widgets.values())))), file=file) for widget_name, widget_class in widgets.items(): print(' {1} = window.findChild({0}, {1!r})'.format(widget_class, widget_name), file=file) print(file=file) for itemtype, *itemargs in child_items: if itemtype == 'window': prop_name, text = itemargs prop_name = ''.join(('set', prop_name[0].upper(), prop_name[1:])) print(' window.{}(_({!r}))'.format(prop_name, text), file=file) elif itemtype == 'property': print(' {0}.setProperty({1!r}, _({2!r}))'.format(*itemargs), file=file) elif itemtype == 'QTabWidget': print(' {0}.setTabText({0}.indexOf({1}), _({2!r}))'.format(*itemargs), file=file) else: print(' #unknown:', itemtype, *itemargs) def usage(exitcode): print('usage:') print(' ', os.path.basename(__file__), '-h|--help') print(' ', os.path.basename(__file__), 'uifilename') print(' ', os.path.basename(__file__), 'uifilename', 'pyfilename') sys.exit(exitcode) def main(): args = sys.argv[1:] if not args: usage(1) if args[0] in ['-h', '--help']: usage(0) windowinfo = parse_file(args[0]) args = args[1:] if args: with open(args[0], 'wt', encoding='utf-8') as file: write_file(*windowinfo, file=file) else: write_file(*windowinfo, file=sys.stdout) if __name__ == '__main__': main() pybik-1.1/tools/create-gl-pxd.py0000775000175000017500000001236512151266606017026 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys from os.path import dirname, basename, join, isfile, isdir import re def convert_symbols(sources): yield '\nfrom libc.stddef cimport ptrdiff_t' yield 'from libc.stdint cimport int32_t, intptr_t, int8_t, uint8_t' for abspath, relpath, source in sources: yield '\n\n# from {}:\n'.format(abspath) yield "cdef extern from '{}':".format(relpath) for match in re.finditer(r'^\#define[ \t]+(\w+).*?$', source, re.MULTILINE | re.DOTALL): if match.group(1).startswith('GL_'): yield match.expand(r' enum: \1') for abspath, relpath, source in sources: yield '\n\n# from {}:\n'.format(abspath) for match in re.finditer(r'^(typedef[\s\w]*);.*?$', source, re.MULTILINE | re.DOTALL): mg1 = match.group(1) mg1 = mg1.replace('khronos_float_t', 'float') mg1 = mg1.replace('khronos_', '') if not mg1.endswith(('_t', '64')) and not (mg1[-2:].isalpha() and mg1[-2:].isupper()): yield 'c'+mg1 yield '\n\ncdef extern from *:' def const_types(types): for type in types.split(): yield ' ctypedef {0}* const_{0}_ptr "const {0}*"'.format(type) yield from const_types('GLubyte GLboolean GLvoid GLchar GLfloat GLint GLshort ' 'GLbyte GLuint GLushort GLclampf GLsizei GLenum void') for abspath, relpath, source in sources: yield '\n\n# from {} with:\n'.format(abspath) yield "cdef extern from '{}':".format(relpath) for match in re.finditer( r'^(?:GLAPI|GL_APICALL)([\s\w*]*?)(?:GLAPIENTRY|APIENTRY|GL_APIENTRY)([^(]*)\(([^)]*)\);(.*?)$', source, re.MULTILINE | re.DOTALL): mg2s2 = match.group(2).strip()[-2:] if mg2s2.isalpha() and mg2s2.isupper(): continue for mgf in (match.group(1).find, match.group(3).find): if not mgf('64') == mgf('GLsync') == mgf('GLDEBUGPROC') == -1: break else: if match.group(3).strip() == 'void': template = r' cdef\1\2()\4' else: template = r' cdef\1\2(\3)\4' yield match.expand(template).replace('const ', '').replace('const*', '*') \ .replace(' in,', ' in_,').replace('/*', '#/*') def read_url(url, headerfilename): import urllib.request text = urllib.request.urlopen(url).read().decode('utf-8') return [(url, headerfilename, text)] def read_headers(path, headerfiles): sources = [] for headerfilename in headerfiles: absheaderfilename = join(path, headerfilename) if isdir(path) else path with open(absheaderfilename, 'rt', encoding='utf-8') as headerfile: sources.append((absheaderfilename, headerfilename, headerfile.read())) return sources def create_pxd(sources, pxdfilename): with open(pxdfilename, 'wt', encoding='utf-8') as pxdfile: print('# {}'.format(pxdfilename), file=pxdfile) print('# generated with {}'.format(sys.argv[0]), file=pxdfile) for token in convert_symbols(sources): print(token, file=pxdfile) def usage(status): print('usage:\n' '{0} [-h|--help]\n' '{0} gl|gles2|gles3\n' '{0} filename\n' '{0} url\n' .format(basename(sys.argv[0]))) sys.exit(status) def main(): args = sys.argv[1:] if not args or args[0] in ['-h', '--help']: usage(0) if len(args) != 1: print('wrong number of arguments') usage(1) includedir = '/usr/include' if args[0] == 'gl': sources = read_headers(includedir, ['GL/gl.h', 'GL/glext.h']) create_pxd(sources, 'pybiklib/gl.pxd') elif args[0] == 'gles2': sources = read_headers(includedir, ['GLES2/gl2.h', 'GLES2/gl2ext.h']) create_pxd(sources, 'pybiklib/gl.pxd') elif args[0] == 'gles3': sources = read_headers(includedir, ['GLES3/gl3.h']) create_pxd(sources, 'pybiklib/gl.pxd') elif isfile(args[0]): sources = read_headers(args[0], ['GL/gl.h']) create_pxd(sources, 'pybiklib/gl.pxd') elif args[0].startswith('http://') or args[0].startswith('https://'): sources = read_url(args[0], 'GL/gl.h') create_pxd(sources, 'pybiklib/gl.pxd') else: print('wrong argument:', args[0]) usage(1) if __name__ == '__main__': main() pybik-1.1/tools/__init__.py0000664000175000017500000000000012130757601016102 0ustar barccbarcc00000000000000pybik-1.1/tools/create_docs.py0000775000175000017500000001102512150714157016633 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os sys.path.insert(0, '.') import re from pybiklib import config from pybiklib.config import wrap try: _ except NameError: import builtins builtins.__dict__['_'] = lambda s: s def underline(title, underline_char='='): return '{}\n{}'.format(title, underline_char*len(title)) def clean_links(text): footnotes = [] def add_footnote(match): if match.group(2) != '|': return match.group(0) elif match.group(1) != '': footnote = match.group(1) if footnote in footnotes: footnotes.append(footnotes.index(footnote)+1) else: footnotes.append(footnote) return '' else: footnote = footnotes[-1] if type(footnote) is int: del footnotes[-1] return ' [{}]'.format(footnote) else: return ' [{}]'.format(len(footnotes)) text = re.sub(r'<(.*?)(\|?)>', add_footnote, text) return text, ['[{}] <{}>'.format(i+1, footnote) for i, footnote in enumerate(footnotes)] def read_utf8(filename): with open(filename, 'rt', encoding='utf-8') as f: return f.read() def write_utf8(filename, text): with open(filename, 'wt', encoding='utf-8') as f: f.write(text) def create_README(filename=None, skip_install=False): if not filename: filename = 'README' news_template = [ ('{appname}', '{description}\n\n' 'Author: {AUTHOR} <{CONTACT_EMAIL}>\n' 'License: {LICENSE_NAME}\n' 'Project page: <{WEBSITE}>'), ('Installation', wrap( 'If Pybik is available for your distribution, ' 'you should install Pybik with a package manager. ' 'Otherwise see the file INSTALL for installation instructions.')), ('Feedback', '{feedback}'), ('Translation', '{translation}'), ('License', '{license}'), ] readme = { 'appname': 'About {} {}'.format(config.APPNAME, config.VERSION), 'description': wrap(config.LONG_DESCRIPTION), 'AUTHOR': config.AUTHOR, 'CONTACT_EMAIL':config.CONTACT_EMAIL, 'LICENSE_NAME': config.LICENSE_NAME, 'WEBSITE': config.WEBSITE, 'feedback': wrap(clean_links(config.get_filebug_text())), 'translation': wrap(clean_links(config.TRANSLATION_TEXT)), 'license': wrap(config.LICENSE_INFO) + '\n\n' + wrap(config.LICENSE_NOT_FOUND), } text = '' for title, body in news_template: if skip_install and title == 'Installation': continue title = underline(title.format(**readme)) body = body.format(**readme) text += '\n{}\n\n{}\n\n'.format(title, body) write_utf8(filename, text) def main(): skip_install = False args = sys.argv[1:] if not args: print('usage: {} [--skip-install] README[=filename]'.format(os.path.basename(sys.argv[0]))) sys.exit(1) for arg in args: if arg == '--skip-install': skip_install = True elif not arg.startswith('--'): fileinfo = arg.split('=', 1) if len(fileinfo) == 1: fileinfo.append(None) if fileinfo[0] == 'README': create_README(fileinfo[1], skip_install=skip_install) else: print('Unknown Argument:', arg) sys.exit(1) else: print('Unknown Option:', arg) sys.exit(1) if __name__ == '__main__': try: _ except NameError: __builtins__._ = lambda text: text main() pybik-1.1/tools/singmaster-to-pybik.py0000775000175000017500000000355212137177715020306 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . def convert(salg): moves = { "": "", "F": "f", "B": "b", "R": "r", "L": "l", "U": "u", "D": "d", "F'": "f-", "B'": "b-", "R'": "r-", "L'": "l-", "U'": "u-", "D'": "d-", "F2": "ff", "B2": "bb", "R2": "rr", "L2": "ll", "U2": "uu", "D2": "dd", "F'2": "ff", "B'2": "bb", "R'2": "rr", "L'2": "ll", "U'2": "uu", "D'2": "dd", "M": "r2-", "E": "u2-", "S": "f2", "M'": "r2", "E'": "u2", "S'": "f2-", "M2": "r2r2", "E2": "u2u2", "S2": "f2f2", "M2'": "r2r2", "E2'": "u2u2", "S2'": "f2f2", "x": "R", "y": "U", "z": "F", "x'": "R-", "y'": "U-", "z'": "F-", "x2": "RR", "y2": "UU", "z2": "FF", "x2'": "RR", "y2'": "UU", "z2'": "FF", } palg = '' for m in salg.split(' '): palg += moves[m.strip('()')] return palg def main(): while True: try: line = input('> ') except EOFError: return print(':', convert(line)) if __name__ == '__main__': main() pybik-1.1/tools/py2pyx.py0000755000175000017500000000771012150714215015632 0ustar barccbarcc00000000000000#!/usr/bin/python3 #-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os, re class Py2pyxParseError (Exception): pass def main(argv): if not (1 < len(argv) <= 4): print('usage:', os.path.basename(__file__), 'python-file [pyx-filename [pxd-filename]]', file=sys.stderr) return 1 arg_src = argv[1] arg_dst = argv[2] if len(argv) > 2 else None arg_pxd = argv[3] if len(argv) > 3 else None if not os.path.exists(arg_src): print('error:', arg_src, 'does not exist', file=sys.stderr) return 1 create_pyx(arg_src, arg_dst, arg_pxd) return 0 def create_pyx(src_path, dst_path, pxd_path): errors = 0 openr = lambda path: open(path, 'rt', encoding='utf-8') openw = lambda path: open(path, 'wt', encoding='utf-8') if path else sys.stdout edit_lines = None copy = lambda lineno, match: (match.string, None, None) add = lambda lineno, match: (match.expand(r'\1\4 \2\n'), None, None) def remove(unused_lineno, match): count = match.group(4) count = 1 if count == '' else int(count) return match.expand(r'\1#px \2\4\n'), None, [count, r'\1#px \2\4\n', None] replace = lambda lineno, match: (match.expand(r'\1\4 \2\n'), None, [1, r'\1#px \2\4\n', None]) comment = lambda lineno, match: (match.expand(r'\1\2\4\n'), None, None) def repl_pxd(lineno, match): return (match.expand(r'\1\4 \2\n'), match.expand(r'\1\4').rstrip(':') + ' #line {}\n'.format(lineno), [1, r'\1#px \2\4\n', None]) def move_pxd(unused_lineno, match): count = match.group(4) count = 1 if count == '' else int(count) return match.expand(r'\1#px \2\4\n'), None, [count, r'\1#px \2\4\n', r'\1\4\n'] fdict = {None:copy, '+':add, '-':remove, '/':replace, ' ':comment, #'d ':pxd, 'd+':add_pxd, 'd/':repl_pxd, 'd=':move_pxd} with openr(src_path) as srcf, openw(dst_path) as dstf, openw(pxd_path) as pxdf: pxdf.write('#file: {}\n\n'.format(src_path)) for lineno, line in enumerate(srcf): try: match = re.match(r'^( *)(#px(d.|.)|)(.*?)\n$', line) if edit_lines is not None and edit_lines[0] > 0: cnt_edit_lines, edit_re_pyxline, edit_re_pxdline = edit_lines pyxline = edit_re_pyxline and match.expand(edit_re_pyxline) pxdline = edit_re_pxdline and (match.expand(edit_re_pxdline).rstrip() + ' #line {}\n'.format(lineno)) edit_lines[0] -= 1 continue pyxline, pxdline, edit_lines = fdict[match.group(3)](lineno, match) except Exception as e: print('%s:%d:'%(src_path, lineno), e, file=sys.stderr) print(' Invalid line:', line, file=sys.stderr, end='') pyxline = line pxdline = None errors += 1 finally: dstf.write(pyxline) if pxdline is not None: pxdf.write(pxdline) if errors: raise Py2pyxParseError('create_pyx failed with %s errors' % errors) if __name__ == '__main__': sys.exit(main(sys.argv)) pybik-1.1/pybiklib/0000775000175000017500000000000012157424343014453 5ustar barccbarcc00000000000000pybik-1.1/pybiklib/drawingarea.py0000644000175000017500000007252012157341452017314 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: glarea.c # Original copyright and license: 2003, 2004 John Darrington, GPL3+ import os from collections import namedtuple import math from time import sleep from contextlib import contextmanager # pylint: disable=W0614,W0401 from .debug import * from PyQt4.QtOpenGL import * from PyQt4.QtCore import * from PyQt4.QtCore import pyqtSignal as Signal from PyQt4.QtGui import * # pylint: enable=W0614,W0401 # no need for OpenGL module for just two constants GL_RGBA, GL_SRGB_ALPHA, GL_TEXTURE_2D = 6408, 35906, 3553 if DEBUG: try: from OpenGL import GL except Exception: pass else: assert GL.GL_RGBA == GL_RGBA assert GL.GL_SRGB_ALPHA == GL_SRGB_ALPHA assert GL.GL_TEXTURE_2D == GL_TEXTURE_2D from . import config from .textures import textures from .settings import settings from . import model class Design: def __init__(self): self.bevel_color = (15, 15, 15) self.label_colors = [(0, 0, 0) for i in range(6)] self.imagemodes = [0] * 6 self.texnames = [-1] * 6 class ShaderInterface: shader_prefix = b''' #version 120 #line 0 ''' def init_shaders(self, shadername): if shadername is None: self.load_shader() else: self.set_shader(shadername) if DEBUG_DRAW: debug('Creating "hud" shaders:') vertex_source = self._read_shader('hud.vert') fragment_source = self._read_shader('pick.frag') self.glarea.gl_create_hud_program(vertex_source, fragment_source) debug('Creating "pick" shaders:') vertex_source = self._read_shader('pick.vert') fragment_source = self._read_shader('pick.frag') self.glarea.gl_create_pick_program(vertex_source, fragment_source) @staticmethod def _read_shader(filename): filename = os.path.join(config.appdata_dir, 'shaders', filename) with open(filename, 'rb') as sfile: source = sfile.read() return ShaderInterface.shader_prefix + source def set_shader(self, shadername): self.shadername = shadername debug('Creating "%s" shaders:' % shadername) vertex_source = self._read_shader(shadername + '.vert') fragment_source = self._read_shader(shadername + '.frag') self.glarea.gl_create_render_program(vertex_source, fragment_source) def load_shader(self): shadername = 'lighting' if settings.draw.lighting else 'simple' self.set_shader(shadername) class CubeAreaBase (QGLWidget, ShaderInterface): animation_ending = Signal(bool) request_rotation = Signal((int, int, bool)) request_swap_blocks = Signal((int, int, int, bool)) request_rotate_block = Signal((int, bool)) drop_color = Signal((int, str, str)) drop_file = Signal((int, str, str)) debug_text = Signal(str) def __init__(self, opts): glformat = QGLFormat() if settings.draw.samples > 0: glformat.setSampleBuffers(True) glformat.setSamples(2**settings.draw.samples) QGLWidget.__init__(self, glformat) if QGLFormat.openGLVersionFlags() & QGLFormat.OpenGL_Version_2_1: self.texture_format = GL_SRGB_ALPHA else: #FIXME: With OpenGL version < 2.1 images are not gamma correct self.texture_format = GL_RGBA self.shadername = opts.shader self.design = Design() self.model = model.empty_model self.last_mouse_x = -1 self.last_mouse_y = -1 self.button_down_background = False self.mouse_xy = -1, -1 # Structure to hold copy of the last selection taken or None self.pickdata = None self.editing_model = False settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) if DEBUG_FPS: self.monotonic_time = QElapsedTimer() self.monotonic_time.start() self.render_count = 0 self.fps = 0. self.speed = settings.draw.speed # Initialize the render engine self.gldraw, self.glarea = self.import_gl_engine() self.glarea.init_module() self.gldraw.init_module() self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(*settings.draw.default_rotation) self.glarea.set_antialiasing(self.format().sampleBuffers()) self.init_design() self.setAcceptDrops(True) self.setFocusPolicy(Qt.StrongFocus) self.setMinimumSize(200, 200) self.cursors = None self.load_cursors() self.update_selection_pending = False self.timer_update_selection = QTimer(self) self.timer_update_selection.setSingleShot(True) self.timer_update_selection.timeout.connect(self.on_idle_update_selection) self.set_cursor() self.setMouseTracking(True) def import_gl_engine(self): if not DEBUG_PUREPYTHON: from . import _gldraw as gldraw from . import _glarea as glarea else: try: import OpenGL.GL except ImportError as e: print('The pure Python mode needs PyOpenGL (for Python 3):', e) raise SystemExit(1) from . import gldraw from . import glarea return gldraw, glarea def start(self): pass def stop(self): self.glarea.gl_exit() self.delete_textures() # this line prevents a segmentation fault with PySide if game->quit selected self.setMouseTracking(False) settings.keystore.changed.disconnect(self.on_settings_changed) self.timer_update_selection.timeout.disconnect(self.on_idle_update_selection) def load_cursors(self): cursors = [] # Load 3 cursors from file (n - ne) for i, (x, y) in enumerate([(8, 0), (15, 0), (15, 0)]): filename = os.path.join(config.UI_DIR, 'mouse_{}.png'.format(i)) image = QImage(filename) cursors.append((image, x, y)) # 1 cursor (nnw) image, x, y = cursors[1] cursors.insert(0, (image.mirrored(True, False), 15-x, y)) # 12 cursors (ene - nw) transform = QTransform() transform.rotate(90) for i in range(4, 16): image, x, y = cursors[-4] cursors.append((image.transformed(transform), 15-y, x)) cursors.append(cursors[0]) self.cursors = [QCursor(QPixmap.fromImage(image), x, y) for image, x, y in cursors[1:]] # cursor for center faces filename = os.path.join(config.UI_DIR, 'mouse_ccw.png') cursor = QCursor(QPixmap(filename), 7, 7) self.cursors.append(cursor) # background cursor cursor = QCursor() cursor.setShape(Qt.CrossCursor) self.cursors.append(cursor) def init_design(self): rgba = QColor() for i in range(6): rgba.setNamedColor(settings.theme.face[i].color) self.design.label_colors[i] = rgba.red(), rgba.green(), rgba.blue() self.design.imagemodes[i] = settings.theme.face[i].mode self.set_background_color(settings.theme.bgcolor) stock_texnames = [0] def set_face_texture(self, faceidx, imagefile): if imagefile.startswith('/'): pixbuf = textures.create_pixbuf_from_file(imagefile) else: pixbuf = textures.get_stock_pixbuf(imagefile) texname = self.bindTexture(pixbuf, GL_TEXTURE_2D, self.texture_format, QGLContext.LinearFilteringBindOption | QGLContext.MipmapBindOption) if not imagefile.startswith('/') and texname not in self.stock_texnames: self.stock_texnames.append(texname) if self.design.texnames[faceidx] not in self.stock_texnames: self.deleteTexture(self.design.texnames[faceidx]) self.design.texnames[faceidx] = texname def delete_textures(self): for texname in self.design.texnames: if texname not in self.stock_texnames: self.deleteTexture(texname) del self.design.texnames[:] for texname in self.stock_texnames: if texname: self.deleteTexture(texname) self.stock_texnames[:] = [0] def set_model(self, model_, blocks=None): self.model = model_ glmodeldata = self.get_glmodeldata(settings.draw.selection) with self.lock_glcontext(): self.glarea.set_frustrum(self.model.bounding_sphere_radius, settings.draw.zoom) self.gldraw.gl_set_data(*glmodeldata) if blocks is not None: self.gldraw.set_transformations(blocks) self.update_selection() self.update() def get_glmodeldata(self, selection_mode): ( glvertices, glnormals, glcolors, gltexpos, labelinfos, idx_vbevel, cnts_block, idx_pick, cnt_pick, idx_debug, ) = self.model.gl_vertex_data(selection_mode, self.design) ptrnormals = len(glvertices) ptrcolors = ptrnormals + len(glnormals) ptrtexpos = ptrcolors + len(glcolors) return (len(self.model.blocks), glvertices + glnormals + glcolors + gltexpos, (ptrnormals, ptrcolors, ptrtexpos), (labelinfos, idx_vbevel, cnts_block, idx_pick, cnt_pick, idx_debug), self.design.texnames) def set_glmodel(self, selection_mode): glmodeldata = self.get_glmodeldata(selection_mode) with self.lock_glcontext(): self.gldraw.gl_set_data(*glmodeldata) def set_transformations(self, cubestate): with self.lock(): self.gldraw.set_transformations(cubestate.blocks) def do_initializeGL(self): if DEBUG_MSG: glcontext = self.context() glformat = glcontext.format() glrformat = glcontext.requestedFormat() def printglattr(name, *attrs): print(' {}: '.format(name), end='') def get_value(glformat, attr): if isinstance(attr, str): return getattr(glformat, attr)() else: return attr(glformat) values = [get_value(glformat, a) for a in attrs] rvalues = [get_value(glrformat, a) for a in attrs] if values == rvalues: print(*values) else: print(*values, end=' (') print(*rvalues, end=')\n') print('OpenGL format:') printglattr('accum', 'accum', 'accumBufferSize') printglattr('alpha', 'alpha', 'alphaBufferSize') printglattr('rgb', 'redBufferSize', 'greenBufferSize', 'blueBufferSize') printglattr('depth', 'depth', 'depthBufferSize') printglattr('directRendering', 'directRendering') printglattr('doubleBuffer', 'doubleBuffer') printglattr('hasOverlay', 'hasOverlay') printglattr('version', lambda glformat: '{}.{} 0x{:x}'.format( glformat.majorVersion(), glformat.minorVersion(), int(glformat.openGLVersionFlags()))) printglattr('plane', 'plane') printglattr('profile', 'profile') printglattr('rgba', 'rgba') printglattr('samples', 'sampleBuffers', 'samples') printglattr('stencil', 'stencil', 'stencilBufferSize') printglattr('stereo', 'stereo') printglattr('swapInterval', 'swapInterval') self.init_shaders(self.shadername) for i in range(6): self.set_face_texture(i, settings.theme.face[i].image) self.glarea.gl_init() def do_paintGL(self): self.glarea.gl_render() if DEBUG: if DEBUG_DRAW: if self.pickdata and not self.pickdata.center: self.glarea.gl_render_select_debug() if DEBUG_FPS: self.render_count += 1 if self.monotonic_time.elapsed() > 1000: elapsed = self.monotonic_time.restart() self.fps = 1000. / elapsed * self.render_count self.render_count = 0 self.debug_text.emit("FPS %.1f" % self.fps) def do_resizeGL(self, width, height): self.glarea.gl_resize(width, height) MODIFIER_MASK = int(Qt.ShiftModifier | Qt.ControlModifier) def keyPressEvent(self, event): modifiers = int(event.modifiers()) & self.MODIFIER_MASK if modifiers: return QGLWidget.keyPressEvent(self, event) elif event.key() == Qt.Key_Right: self.rotation_x += 2 elif event.key() == Qt.Key_Left: self.rotation_x -= 2 elif event.key() == Qt.Key_Up: self.rotation_y -= 2 elif event.key() == Qt.Key_Down: self.rotation_y += 2 else: return QGLWidget.keyPressEvent(self, event) self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(self.rotation_x, self.rotation_y) self.update() self.update_selection() PickData = namedtuple('PickData', 'maxis mslice mdir block symbol face center angle') def pick_polygons(self, x, y): '''Identify the block at screen co-ordinates x,y.''' height = self.height() with self.lock_glcontext(): index = self.glarea.gl_pick_polygons(x, height-y) if not index: self.pickdata = None return maxis, mslice, mdir, face, center, block, symbol, face_center, edge_center = self.model.pick_data[index] if center: angle = None else: angle = self.glarea.get_cursor_angle(face_center, edge_center) self.pickdata = self.PickData(maxis, mslice, mdir, block, symbol, face, center, angle) if DEBUG_DRAW: text = ("block {}, face {} ({}), center {}\n" "axis {}, slice {}, dir {}\n" "angle {}\n" "mouse {}, {}").format( block.index, symbol, face, center, maxis, mslice, mdir, angle, *self.mouse_xy) self.debug_text.emit(text) def update_selection(self): '''This func determines which block the mouse is pointing at''' if self.animation_active: if self.pickdata is not None: self.pickdata = None self.set_cursor() return if self.update_selection_pending: return self.update_selection_pending = True self.timer_update_selection.start() def on_idle_update_selection(self): if self.animation_active: if self.pickdata is not None: self.pickdata = None self.set_cursor() else: self.pick_polygons(*self.mouse_xy) self.set_cursor() if DEBUG_DRAW: self.update() self.update_selection_pending = False def mouseMoveEvent(self, event): self.mouse_xy = event.x(), event.y() if not self.button_down_background: self.update_selection() return # perform rotation offset_x = event.x() - self.last_mouse_x offset_y = event.y() - self.last_mouse_y self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy( self.rotation_x + offset_x, self.rotation_y + offset_y) self.rotation_x -= offset_x self.rotation_y -= offset_y self.update() def mousePressEvent(self, event): if self.pickdata is not None: if self.animation_active: return # make a move if self.editing_model: if event.modifiers() & Qt.ControlModifier: if event.button() == Qt.LeftButton: self.request_rotate_block.emit(self.pickdata.block.index, False) elif event.button() == Qt.RightButton: self.request_rotate_block.emit(self.pickdata.block.index, True) else: if event.button() == Qt.LeftButton: self.request_swap_blocks.emit(self.pickdata.block.index, self.pickdata.maxis, self.pickdata.mslice, self.pickdata.mdir) else: mslice = -1 if event.modifiers() & Qt.ControlModifier else self.pickdata.mslice if event.button() == Qt.LeftButton: self.request_rotation.emit(self.pickdata.maxis, mslice, self.pickdata.mdir) elif event.button() == Qt.RightButton and settings.draw.selection_nick == 'simple': self.request_rotation.emit(self.pickdata.maxis, mslice, not self.pickdata.mdir) elif event.button() == Qt.LeftButton: # start rotation self.button_down_background = True self.last_mouse_x = event.x() self.last_mouse_y = event.y() self.update() def mouseReleaseEvent(self, event): if event.button() != Qt.LeftButton: return if self.button_down_background: # end rotation self.rotation_x += event.x() - self.last_mouse_x self.rotation_y += event.y() - self.last_mouse_y self.button_down_background = False self.update_selection() def wheelEvent(self, event): if event.orientation() == Qt.Vertical: zoom = settings.draw.zoom * math.pow(1.1, -event.delta() / 120) zoom_min, zoom_max = settings.draw.zoom_range if zoom < zoom_min: zoom = zoom_min if zoom > zoom_max: zoom = zoom_max settings.draw.zoom = zoom def dragEnterEvent(self, event): debug('drag enter:', event.mimeData().formats()) if (event.mimeData().hasFormat("text/uri-list") or event.mimeData().hasFormat("application/x-color")): event.acceptProposedAction() def dropEvent(self, event): # when a drag is in progress the pickdata is not updated, so do it now self.pick_polygons(event.pos().x(), event.pos().y()) mime_data = event.mimeData() if mime_data.hasFormat("application/x-color"): color = mime_data.colorData() if color is None: debug("Received invalid color data") return if self.pickdata is not None: self.drop_color.emit(self.pickdata.block.index, self.pickdata.symbol, color.name()) else: self.drop_color.emit(-1, '', color.name()) elif mime_data.hasFormat("text/uri-list"): if self.pickdata is None: debug('Background image is not supported.') return uris = mime_data.urls() for uri in uris: if not uri.isLocalFile(): debug('filename "%s" not found or not a local file.' % uri.toString()) continue filename = uri.toLocalFile() if not filename or not os.path.exists(filename): debug('filename "%s" not found.' % filename) continue self.drop_file.emit(self.pickdata.block.index, self.pickdata.symbol, filename) break # For now, just use the first one. # Ignore all others def set_cursor(self): if self.pickdata is None or self.button_down_background: index = -1 elif self.pickdata.angle is None: index = -2 else: index = int((self.pickdata.angle+180) / 22.5 + 0.5) % 16 self.setCursor(self.cursors[index]) def set_std_cursor(self): QTimer.singleShot(0, lambda: self.unsetCursor()) def set_editing_mode(self, enable): self.editing_model = enable self.set_glmodel(0 if enable else settings.draw.selection) self.update_selection() def set_background_color(self, color): rgba = QColor() rgba.setNamedColor(color) self.glarea.set_background_color(rgba.redF(), rgba.greenF(), rgba.blueF()) def reset_rotation(self): '''Reset cube rotation''' self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(*settings.draw.default_rotation) self.update() def reload_shader(self): with self.lock_glcontext(): self.set_shader(self.shadername) self.update() def on_settings_changed(self, key): if key == 'draw.speed': self.speed = settings.draw.speed elif key == 'draw.lighting': with self.lock_glcontext(): self.load_shader() elif key == 'draw.samples': if self.format().samples(): samples = 2**settings.draw.samples if samples == 1: self.glarea.set_antialiasing(False) elif samples == self.format().samples(): self.glarea.set_antialiasing(True) elif key == 'draw.selection': self.set_glmodel(settings.draw.selection) self.update_selection() elif key.startswith('theme.face.'): i = int(key.split('.')[2]) if key == 'theme.face.{}.color'.format(i): color = QColor() color.setNamedColor(settings.theme.face[i].color) self.design.label_colors[i] = (color.red(), color.green(), color.blue()) self.set_glmodel(settings.draw.selection) elif key == 'theme.face.{}.image'.format(i): with self.lock_glcontext(): self.set_face_texture(i, settings.theme.face[i].image) self.set_glmodel(settings.draw.selection) elif key == 'theme.face.{}.mode'.format(i): self.design.imagemodes[i] = settings.theme.face[i].mode self.set_glmodel(settings.draw.selection) elif key == 'theme.bgcolor': self.set_background_color(settings.theme.bgcolor) elif key == 'draw.zoom': self.glarea.set_frustrum(self.model.bounding_sphere_radius, settings.draw.zoom) else: debug('Unknown settings key changed:', key) self.update() class AnimationBaseInterface: def __init__(self): self.stop_requested = False self.animation_active = False def animate_rotation(self, move_data, blocks, stop_after): self.stop_requested = stop_after axis = (self.model.axesI if move_data.dir else self.model.axes)[move_data.axis] angle = self.model.symmetry[move_data.axis] self.gldraw.set_animation_start(blocks, angle, *axis) self.animation_active = True def animation_end(self): self.animation_active = False def _on_animate(self): increment = self.speed * 1e-02 * 20 increment = min(increment, 45) unfinished = self.gldraw.set_animation_next(increment) if unfinished: return True # we have finished the animation sequence now return False def animate_abort(self, update=True): if update: self.animation_ending.emit(self.stop_requested) self.update() self.update_selection() else: self.animation_end() self.stop_requested = False class AnimationInterface (AnimationBaseInterface): def __init__(self): AnimationBaseInterface.__init__(self) self.timer_animate = QTimer() # the animate timer self.timer_animate.timeout.connect(self._on_animate) def animate_rotation(self, move_data, blocks, stop_after): AnimationBaseInterface.animate_rotation(self, move_data, blocks, stop_after) self.timer_animate.start(0 if DEBUG_VFPS else 20) self.update_selection() def _on_animate(self): if AnimationBaseInterface._on_animate(self): self.update() return # we have finished the animation sequence now self.animation_ending.emit(self.stop_requested) self.update() self.update_selection() self.stop_requested = False def animation_end(self): AnimationBaseInterface.animation_end(self) self.timer_animate.stop() class CubeArea (CubeAreaBase, AnimationInterface): def __init__(self, opts): CubeAreaBase.__init__(self, opts) AnimationInterface.__init__(self) def stop(self): CubeAreaBase.stop(self) self.timer_animate.timeout.disconnect(self._on_animate) initializeGL = CubeAreaBase.do_initializeGL resizeGL = CubeAreaBase.do_resizeGL paintGL = CubeAreaBase.do_paintGL @contextmanager def lock(self): yield lock_glcontext = lock class AnimationThreadedInterface (AnimationBaseInterface): def animate_rotation(self, move_data, blocks, stop_after): with self.lock(): AnimationBaseInterface.animate_rotation(self, move_data, blocks, stop_after) self.render_condition.wakeAll() self.update_selection() def _on_animate(self): if AnimationBaseInterface._on_animate(self): return # we have finished the animation sequence now self.animation_active = False self.animation_ending.emit(self.stop_requested) self.update_selection() self.stop_requested = False class CubeAreaThreaded (CubeAreaBase, AnimationThreadedInterface): def __init__(self, opts): CubeAreaBase.__init__(self, opts) AnimationThreadedInterface.__init__(self) self.render_thread = RenderThread(self.thread_loop) self.request_render = True self.request_resize = False self.render_mutex = QMutex() self.render_condition = QWaitCondition() # Buffer swap is handled in the rendering thread self.setAutoBufferSwap(False) def start(self): self.render_thread.start() self.render_condition.wakeAll() def stop(self): '''Performs a save shutdown of the render thread''' self.request_render = False self.render_condition.wakeAll() self.render_thread.wait() CubeAreaBase.stop(self) @contextmanager def lock(self): self.render_mutex.lock() yield self.render_mutex.unlock() @contextmanager def lock_glcontext(self): self.render_mutex.lock() self.makeCurrent() yield self.doneCurrent() self.render_mutex.unlock() @contextmanager def release_glcontext(self): self.doneCurrent() self.render_mutex.unlock() yield self.render_mutex.lock() self.makeCurrent() def paintEvent(self, event): self.render_condition.wakeAll() def resizeEvent(self, event): self.requested_size = event.size() self.request_resize = True self.render_condition.wakeAll() def thread_loop(self): with self.lock_glcontext(): self._thread_loop() def _thread_loop(self): self.do_initializeGL() while self.request_render: if self.request_resize: self.do_resizeGL(self.requested_size.width(), self.requested_size.height()) self.request_resize = False self.do_paintGL() self.swapBuffers() if self.animation_active: with self.release_glcontext(): if not DEBUG_VFPS: sleep(.02) self._on_animate() else: self.doneCurrent() self.render_condition.wait(self.render_mutex) self.makeCurrent() class RenderThread (QThread): def __init__(self, func): QThread.__init__(self) self.func = func def run(self): self.func() pybik-1.1/pybiklib/main.py0000644000175000017500000002472312157302737015761 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: main.c # Original copyright and license: 1998, 2003--2004 John Darrington, GPL3+ import sys, os from collections import namedtuple from . import debug, config N_ = lambda s: s def format_opts(opts): opts = ((o + o.strip('--')[0].upper() if o.endswith('=') else o) for o in opts) return ' ' + ', '.join(opts) def format_help(text, indent=0): try: width = int(os.environ['COLUMNS']) - 2 except (KeyError, ValueError): width = 78 width -= indent def split(text): lines = text.split('\n') for line in lines: res = None words = line.split(' ') for word in words: if res is None: res = word elif len(res + word) + 1 <= width: res = ' '.join((res, word)) else: yield res res = word yield res return '\n'.ljust(indent+1).join(split(text)) def print_usage(unused_value, unused_opts): print('Usage:', sys.argv[0], '[options]') for args, unused_func, text in arg_info: if args is None: print() print(format_help(text)) else: opts = format_opts(args) if len(opts) > 18: text = '\n' + text else: opts = opts.ljust(20) text = format_help(text, 20) print(opts + text) sys.exit(0) def print_version(*unused_args): print(config.APPNAME, config.VERSION) print() print(config.COPYRIGHT.replace('©', '(C)')) #XXX: help2man cannot handle unicode print() print(config.wrap(config.LICENSE_INFO)) print() print(config.wrap(config.LICENSE_NOT_FOUND)) sys.exit(0) def print_tests(*args): for filename in config.get_testdatafiles(): print(filename) sys.exit(0) def select_all_tests(value, opts): opts.setdefault('test', []).extend(config.get_testdatafiles()) debug_level_names = [__a[6:].lower() for __a in debug.__all__ if __a.startswith('DEBUG_')] test_arg_names = ['write-y', 'write-yes', 'write-n', 'write-no', 'write-e', 'write-error', 'log-file', 'log-widgets'] arg_info = [ (None, None, config.LONG_DESCRIPTION.replace('ő', 'o')), #XXX: help2man cannot handle unicode (None, None, 'Pybik can be fully controlled and configured via the graphical user interface.' ' The options listed here are intended primarily for testing and debugging.'), (None, None, 'Options:'), (['-h', '--help'], print_usage, 'Show help message and exit'), (['--version'], print_version, 'Show version number and exit'), (['--config-file='], lambda value, opts: opts.update(config_file=value), 'Specify the configuration file to use instead of the default location'), (['--defaultconfig'], lambda value, opts: opts.update(defaultconfig=True), 'Print default settings to stdout and exit'), (['--shader='], lambda value, opts: opts.update(shader=value), 'Use a different shader'), (['--list-tests'], print_tests, 'List tests'), (['--test'], select_all_tests, 'Run all tests'), (['--test='], lambda value, opts: opts.setdefault('test', []).append(value), 'Run test T, can be used multiple times'), (['--test-args='], lambda value, opts: opts['test_args'].extend(a for a in value.split(',') if a), 'Comma-separated list of test arguments:\n{}' .format(' '.join(test_arg_names))), (['--debug='], lambda value, opts: opts.setdefault('debug_flags', []).extend( f for f in value.split(',') if f), 'D is a comma-separated list of debug flags:\n{0}' .format(' '.join(debug_level_names))), (None, None, 'Qt-Options, for a full list refer to the Qt-Reference,' ' but not all options make sense for this application:'), (['-style S'], None, 'sets the application GUI style. Possible values are' ' motif, windows, and platinum.'), (['-widgetcount'], None, 'prints debug message at the end about number of widgets left' ' undestroyed and maximum number of widgets existed at the same time'), (['-reverse'], None, "sets the application's layout direction to left-to-right"), (['-graphicssystem G'], None, 'sets the backend to be used for on-screen widgets and pixmaps.' ' Available options are raster and opengl.'), ] def parse_args(args): arg_functs = {o: f for opts, f, h in arg_info for o in opts or [] if f is not None} opts = { 'config_file': config.USER_SETTINGS_FILE, 'defaultconfig': False, 'shader': None, 'pure_python': False, 'test': [], 'test_args': [], 'ui_args': [], } for arg in args: try: index = arg.index('=') except ValueError: value = None else: arg, value = arg[:index+1], arg[index+1:] try: func = arg_functs[arg] except KeyError: opts['ui_args'].append(arg) else: func(value, opts) for a in opts['test_args']: if a not in test_arg_names: print('unknown test argument:', a) sys.exit(1) for d in opts.get('debug_flags', []): if d not in debug_level_names: print('unknown debug option:', d) sys.exit(1) opts.setdefault('debug_flags', None) class Opts: pass for k, v in opts.items(): setattr(Opts, k, v) return Opts def create_app(root_dir, args): import gettext from PyQt4.QtCore import QLocale, QTranslator, Qt from PyQt4.QtGui import QApplication, QPalette, QColor # initialize QApplication QApplication.setAttribute(Qt.AA_X11InitThreads) app = QApplication(args) args = app.arguments()[1:] if args: print('Unknown arguments:', ' '.join(args)) sys.exit(1) app.setOrganizationName(config.PACKAGE) app.setApplicationName(config.APPNAME) app.setApplicationVersion(config.VERSION) # Workaround for whatsThis-Text (white text on light background) palette = app.palette() colorfg = palette.color(QPalette.Active, QPalette.ToolTipText) colorbg = palette.color(QPalette.Active, QPalette.ToolTipBase) valuefg = colorfg.value() valuebg = (valuefg + 255) // 2 if valuefg < 128 else valuefg // 2 colorbg = QColor.fromHsv(colorbg.hue(), colorbg.saturation(), valuebg) palette.setColor(QPalette.Active, QPalette.ToolTipBase, colorbg) app.setPalette(palette) # initialize translation language = QLocale.system().name() # standard Qt translation, used for e.g. standard buttons and shortcut names translator = QTranslator() translator.load('qt_' + language, config.QT_LOCALE_DIR) app.installTranslator(translator) # the rest of the app use gettext for translation if root_dir == sys.prefix: # normal installation LOCALEDIR = None else: # different root, e.g. /usr/local, source directory LOCALEDIR = config.LOCALE_DIR t = gettext.translation(config.PACKAGE, LOCALEDIR, languages=[language], fallback=True) t.install(names=['ngettext']) return app, translator def create_window(opts): # initialize settings from .settings import settings try: settings.load(opts.config_file) except EnvironmentError as e: error_message = N_('An error occurred while reading the settings:\n' '{error_message}').format(error_message=e) debug.debug(error_message) settings.load('') from PyQt4.QtCore import QTimer QTimer.singleShot(0, lambda: window.error_dialog(_(error_message))) # create main window # The application module must be imported after a QApplication object is created from .application import MainWindow return MainWindow(opts) def run(root_dir=None): opts = parse_args(sys.argv) if opts.debug_flags is not None: print(config.PACKAGE, config.VERSION) debug.set_flags(opts.debug_flags) print('debug flags:', *opts.debug_flags) debug.debug('Qt args:', opts.ui_args) try: import sip sip.setapi('QString', 2) sip.setapi('QVariant', 2) import PyQt4.QtCore import PyQt4.QtGui import PyQt4.QtOpenGL except ImportError as e: print('This program needs PyQt4:', e) sys.exit(1) if opts.defaultconfig: # settings needs Qt from .settings import settings settings.load('') settings.keystore.dump(sys.stdout, all=True) sys.exit(0) app, translator = create_app(root_dir, opts.ui_args) # keep the translator object for the lifetime of the app object, so that the translation works if opts.test: from pybiktest.testrunner import TestRunner for test in TestRunner.wrap(config.TESTDATA_DIR, opts.test, opts.test_args): opts.config_file = test.settings_file window = create_window(opts) test.run(window) app.exec() else: window = create_window(opts) app.exec() pybik-1.1/pybiklib/glarea.py0000644000175000017500000005271412155425033016262 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # cython: profile=False # distutils: language = c++ # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: glarea-common.c # Original copyright and license: 2003 John Darrington, GPL3+ # although this file is compiled with Python3 syntax, Cython needs at least division from __future__ from __future__ import print_function, division # This line makes cython happy global __name__, __package__ # pylint: disable=W0604 #px/__compiled = True __compiled = False #px/from libc.math cimport cos, sin, tan, atan2, M_PI from math import cos, sin, tan, atan2, pi as M_PI # pylint: disable=W0614,W0401 #px/from gl cimport * from OpenGL.GL import * #px- from OpenGL.GL.ARB.vertex_shader import glGetActiveAttribARB as glGetActiveAttrib #px/from glm cimport * from .glm import * #px/from _gldraw cimport * from .gldraw import * # pylint: enable=W0614,W0401 from .debug import debug, DEBUG_DRAW, DEBUG_PICK, DEBUG_MSG, DEBUG_NOVSHADER, DEBUG_NOFSHADER, DEBUG_NOSHADER #px/DEF SOURCEGLVERSION = 'GL' SOURCEGLVERSION = 'GL' debug('Importing module:', __name__) debug(' from package:', __package__) debug(' compiled:', __compiled) debug(' GL/GLES:', SOURCEGLVERSION) #px/cdef struct Terrain: class terrain: pass # pylint: disable=W0232, C0321, R0903 #px+float red #px+float green #px+float blue #px+int width #px+int height #px+cdef Terrain terrain #px/cdef struct Frustrum: class frustrum: pass # pylint: disable=W0232, R0903 #px+float fovy_angle # field of view angle #px+float fovy_radius #px+float fovy_radius_zoom #px+double bounding_sphere_radius #px+bint multisample #px+mat4 modelview_matrix #px+mat4 projection_matrix #px+mat4 picking_matrix #px+cdef Frustrum frustrum #px/cdef struct Program: class program: pass #px+GLuint prog_render #px+GLuint projection_location #px+GLuint modelview_location #px+GLuint prog_hud # only used if DEBUG_DRAW #px+GLuint prog_pick #px+GLuint picking_location #px+GLuint projection_pick_location #px+GLuint modelview_pick_location #px+cdef Program program #px/cdef struct SelectionDebugPoints: class selection_debug_points: pass #px+float modelview1[3], modelview2[3] #px+int viewport1[2], viewport2[2] #px+cdef SelectionDebugPoints selection_debug_points ### module state def init_module(): terrain.red = 0.0 terrain.green = 0.0 terrain.blue = 0.0 terrain.width = 1 terrain.height = 1 frustrum.fovy_angle = 33.0 # field of view angle frustrum.fovy_radius = 1 / tan(frustrum.fovy_angle * M_PI / 360.0) frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. frustrum.bounding_sphere_radius = 1. frustrum.multisample = 0 # fill modelview_matrix frustrum.modelview_matrix = mat4(1.) _update_modelview_matrix_translation() # fill projection_matrix, see doc of glFrustum frustrum.projection_matrix = mat4(1.) frustrum.projection_matrix[2][3] = -1. frustrum.projection_matrix[3][3] = 0. _update_projection_matrix() # fill picking_matrix frustrum.picking_matrix = mat4(1.) program.prog_render = 0 program.prog_hud = 0 program.prog_pick = 0 #px/cdef void _update_modelview_matrix_translation(): def _update_modelview_matrix_translation(): frustrum.modelview_matrix[3][2] = -frustrum.bounding_sphere_radius * (frustrum.fovy_radius_zoom + 1.) #px/cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): def _set_modelview_matrix_rotation(radiansx, radiansy): #px+cdef vec4 *M #px+cdef float sx, sy, cx, cy #px+cdef float m00, m11, m12, m20 #px/M = &frustrum.modelview_matrix[0] M = frustrum.modelview_matrix sx = sin(radiansx/2) sy = sin(radiansy/2) cx = cos(radiansx/2) cy = cos(radiansy/2) m00 = 2*cx*cx - 1. m11 = 2*cy*cy - 1. m12 = 2*sy*cy m20 = 2*sx*cx # pylint: disable=C0321 M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 # py lint: enable=C0321 #px/cdef void _update_projection_matrix(): def _update_projection_matrix(): if terrain.width < terrain.height: aspectx = 1. aspecty = terrain.height / terrain.width else: aspectx = terrain.width / terrain.height aspecty = 1. # see doc of glFrustum frustrum.projection_matrix[0][0] = frustrum.fovy_radius / aspectx frustrum.projection_matrix[1][1] = frustrum.fovy_radius / aspecty frustrum.projection_matrix[2][2] = -(frustrum.fovy_radius_zoom + 1.) frustrum.projection_matrix[3][2] = -(frustrum.fovy_radius_zoom + 2. ) * frustrum.bounding_sphere_radius * frustrum.fovy_radius_zoom #px/cdef void _set_picking_matrix(int x, int y): def _set_picking_matrix(x, y): # Set picking matrix, restrict drawing to one pixel of the viewport # same as: glLoadIdentity() # gluPickMatrix(x, y, 1, 1, viewport) # same as: glLoadIdentity() # glTranslatef(terrain.width - 2*x, terrain.height - 2*y, 0.) # glScalef(terrain.width, terrain.height, 1.0) frustrum.picking_matrix[3][0] = terrain.width - 2*x frustrum.picking_matrix[3][1] = terrain.height - 2*y frustrum.picking_matrix[0][0] = terrain.width frustrum.picking_matrix[1][1] = terrain.height #px/cdef void _set_picking_matrix_identity(): def _set_picking_matrix_identity(): frustrum.picking_matrix[3][0] = 0. frustrum.picking_matrix[3][1] = 0. frustrum.picking_matrix[0][0] = 1. frustrum.picking_matrix[1][1] = 1. def set_frustrum(bounding_sphere_radius, zoom): frustrum.bounding_sphere_radius = bounding_sphere_radius frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom _update_modelview_matrix_translation() _update_projection_matrix() def set_background_color(red, green, blue): terrain.red = red terrain.green = green terrain.blue = blue def set_antialiasing(multisample): frustrum.multisample = multisample def set_rotation_xy(x, y): x %= 360 # pylint: disable=C0321 if y < -90: y = -90 elif y > 90: y = 90 _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) return x, y ### GL state #px/cdef void _gl_print_string(msg, GLenum name): def _gl_print_string(msg, name): #px/print(msg, glGetString(name)) print(msg, glGetString(name)) #px/cdef void _gl_print_float(msg, GLenum name): def _gl_print_float(msg, name): #px+cdef GLfloat i #px/glGetFloatv(name, &i) i = glGetFloatv(name) print(msg, i) #px/cdef void _gl_print_integer(msg, GLenum name): def _gl_print_integer(msg, name): #px+cdef GLint i #px/glGetIntegerv(name, &i) i = glGetIntegerv(name) print(msg, i) #px/cdef void _gl_print_bool(msg, GLenum name): def _gl_print_bool(msg, name): #px+cdef GLboolean i #px/glGetBooleanv(name, &i) i = glGetBooleanv(name) print(msg, i) def gl_init(): if DEBUG_MSG: print('GL Strings:') _gl_print_string(' GL Vendor:', GL_VENDOR) _gl_print_string(' GL Renderer:', GL_RENDERER) _gl_print_string(' GL Version:', GL_VERSION) _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) #px/IF SOURCEGLVERSION == 'GL': if True: print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) glClearColor(0., 0., 0., 1.) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up glCullFace(GL_BACK) glFrontFace(GL_CCW) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_init_buffers() def gl_exit(): gl_delete_buffers() #px+cdef GLuint prog for prog in [program.prog_render, program.prog_hud, program.prog_pick]: if prog > 0: glDeleteProgram(prog) program.prog_render = 0 program.prog_hud = 0 program.prog_pick = 0 def gl_resize(width, height): terrain.width = width terrain.height = height glViewport(0, 0, terrain.width, terrain.height) _update_projection_matrix() ### render functions #px/cdef void _gl_set_matrix(GLint location, mat4 &matrix): def _gl_set_matrix(location, matrix): #px/glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) glUniformMatrix4fv(location, 1, GL_FALSE, matrix) def gl_render(): if DEBUG_PICK: _set_picking_matrix_identity() _gl_render_pick() else: glUseProgram(program.prog_render) #px/IF SOURCEGLVERSION == 'GL': if True: if frustrum.multisample: glEnable(GL_MULTISAMPLE) else: glDisable(GL_MULTISAMPLE) glClearColor(terrain.red, terrain.green, terrain.blue, 1.) _gl_set_matrix(program.projection_location, frustrum.projection_matrix) _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_draw_cube() if DEBUG_DRAW: gl_draw_cube_debug() def gl_render_select_debug(): #px+cdef GLfloat selectdata[12] selectdata[0] = selection_debug_points.modelview1[0] selectdata[1] = selection_debug_points.modelview1[1] selectdata[2] = selection_debug_points.modelview1[2] selectdata[3] = selection_debug_points.modelview2[0] selectdata[4] = selection_debug_points.modelview2[1] selectdata[5] = selection_debug_points.modelview2[2] selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 selectdata[8] = 0 selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 selectdata[11] = 0 #px/gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) gl_draw_select_debug(selectdata, sizeof(selectdata), program.prog_hud) ### picking functions #px/cdef void _gl_render_pick(): def _gl_render_pick(): glUseProgram(program.prog_pick) #px/IF SOURCEGLVERSION == 'GL': if True: glDisable(GL_MULTISAMPLE) glClearColor(0., 0., 0., 1.) _gl_set_matrix(program.picking_location, frustrum.picking_matrix) _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_pick_cube() #px/cpdef gl_pick_polygons(int x, int y): def gl_pick_polygons(x, y): #px+cdef unsigned char pixel[3] if not (0 <= x < terrain.width and 0 <= y < terrain.height): return 0 _set_picking_matrix(x, y) _gl_render_pick() #px/glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 return index #px/cdef void _modelview_to_viewport(vvect, int *mvect): def _modelview_to_viewport(vvect, mvect): #px+cdef vec4 *M #px+cdef vec4 *P #px+cdef float u0, u1, u2, v0, v1, v3 #px/M = &frustrum.modelview_matrix[0] M = frustrum.modelview_matrix #px/P = &frustrum.projection_matrix[0] P = frustrum.projection_matrix # u = M^T * vvect u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] #u3 = 1. # v = P * u v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) def get_cursor_angle(point1, point2): '''The result is the angle (on the screen) at which the mouse cursor needs to be drawn.''' #px+cdef float angle #px+cdef int i, x, y for i in range(3): selection_debug_points.modelview1[i] = point1[i] selection_debug_points.modelview2[i] = point2[i] _modelview_to_viewport(point1, selection_debug_points.viewport1) _modelview_to_viewport(point2, selection_debug_points.viewport2) x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] angle = atan2(x, y) * 180.0 / M_PI return angle ### shader functions #px/cdef void _gl_print_shader_log(GLuint shader): def _gl_print_shader_log(shader): #px+cdef GLint log_len #px+cdef GLsizei length #px+cdef char log[1024] #px/glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) if log_len > 0: print('==== Error compiling shader:') #px/glGetShaderInfoLog(shader, 1023, &length, log) log = glGetShaderInfoLog(shader, 1023) print(log.decode('utf-8').rstrip()) print('====') else: print('==== Error compiling shader (no log)') #px/cdef void _gl_print_program_log(GLuint program): def _gl_print_program_log(program): #px+cdef GLint log_len #px+cdef GLsizei length #px+cdef char log[1024] #px/glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) if log_len > 0: print('==== Error linking shader program:') #px/glGetProgramInfoLog(program, 1023, &length, log) log = glGetProgramInfoLog(program, 1023) print(log.decode('utf-8').rstrip()) print('====') else: print('==== Error linking shader program (no log)') #px/cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): def _gl_create_compiled_shader(shadertype, source): #px+cdef GLuint shader #px+cdef const_GLchar_ptr pchar #px+cdef GLint compile_status shader = glCreateShader(shadertype) if shader == 0: print('Failed to create shader') return 0 #px+pchar = source #px/glShaderSource(shader, 1, &pchar, NULL) glShaderSource(shader, source) glCompileShader(shader) #px/glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) if not compile_status: _gl_print_shader_log(shader) return 0 return shader #px/cdef void _gl_print_program_info(GLuint program): def _gl_print_program_info(program): #px+cdef GLint param #px+cdef int i #px+cdef GLsizei alength #px+cdef GLint asize, location #px+cdef GLenum atype #px+cdef char aname[1024] print('shader program info', program) glValidateProgram(program) program_info = {} for msg, pname in [('delete status', GL_DELETE_STATUS), ('link status', GL_LINK_STATUS), ('validate status', GL_VALIDATE_STATUS), ('info log length', GL_INFO_LOG_LENGTH), ('attached shaders', GL_ATTACHED_SHADERS), ('active attributes', GL_ACTIVE_ATTRIBUTES), ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), ('active uniforms', GL_ACTIVE_UNIFORMS), ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: #px/glGetProgramiv(program, pname, ¶m) param = glGetProgramiv(program, pname) program_info[pname] = param print(' ', msg, param) print('active attributes:') for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): #px/glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) aname, asize, atype = glGetActiveAttrib(program, i); alength = '?' location = glGetAttribLocation(program, aname) print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) print('active uniforms:') for i in range(program_info[GL_ACTIVE_UNIFORMS]): #px/glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) aname, asize, atype = glGetActiveUniform(program, i); alength = '?' location = glGetUniformLocation(program, aname) print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) #px/cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, list attributes): def _gl_create_program(vertex_source, fragment_source, attributes): #px+cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+cdef GLuint program #px+cdef GLint link_status if DEBUG_NOSHADER: return 0 program = glCreateProgram() if not DEBUG_NOVSHADER: debug(' creating vertex shader') vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) glAttachShader(program, vertex_shader) if not DEBUG_NOFSHADER: debug(' creating fragment shader') fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) glAttachShader(program, fragment_shader) for index, name in attributes: glBindAttribLocation(program, index, name) glLinkProgram(program) #px/glGetProgramiv(program, GL_LINK_STATUS, &link_status) link_status = glGetProgramiv(program, GL_LINK_STATUS) if not link_status: _gl_print_program_log(program) return 0 if DEBUG_MSG: _gl_print_program_info(program) glDetachShader(program, vertex_shader) glDetachShader(program, fragment_shader) glDeleteShader(vertex_shader) glDeleteShader(fragment_shader) return program #px/def gl_create_render_program(bytes vertex_source, bytes fragment_source): def gl_create_render_program(vertex_source, fragment_source): #px+cdef GLint location if program.prog_render > 0: glDeleteProgram(program.prog_render) attributes = [ (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), (NORMAL_ATTRIB_LOCATION, b'normal_attr'), (COLOR_ATTRIB_LOCATION, b'color_attr'), (TEXCOORD_ATTRIB_LOCATION, b'texcoord_attr'), ] program.prog_render = _gl_create_program(vertex_source, fragment_source, attributes) if program.prog_render > 0: glUseProgram(program.prog_render) location = glGetUniformLocation(program.prog_render, b'tex') glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') program.projection_location = glGetUniformLocation(program.prog_render, b'projection') location = glGetUniformLocation(program.prog_render, b'object') gl_init_object_location(location) #px/def gl_create_hud_program(bytes vertex_source, bytes fragment_source): def gl_create_hud_program(vertex_source, fragment_source): #px+cdef GLint location if program.prog_hud > 0: glDeleteProgram(program.prog_hud) attributes = [ (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), (COLOR_ATTRIB_LOCATION, b'color_attr'), ] program.prog_hud = _gl_create_program(vertex_source, fragment_source, attributes) if program.prog_hud > 0: glUseProgram(program.prog_hud) #px/def gl_create_pick_program(bytes vertex_source, bytes fragment_source): def gl_create_pick_program(vertex_source, fragment_source): if program.prog_pick > 0: glDeleteProgram(program.prog_pick) attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), (COLOR_ATTRIB_LOCATION, b'color_attr')] program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) if program.prog_pick > 0: glUseProgram(program.prog_pick) program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') pybik-1.1/pybiklib/glm.pxd0000664000175000017500000000247012142236613015745 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . cdef extern from 'glm/glm.hpp' namespace "glm": cdef cppclass vec3: float x, y, z vec3() vec3(float, float, float) cdef cppclass vec4: float x, y, z, w vec4() vec4(float, float, float, float) float& operator[](int) vec4 operator+(vec4) vec4 operator*(vec4) cdef cppclass mat4: mat4() mat4(float) vec4& operator[](int) mat4 operator*(mat4) vec4 operator*(vec4) cdef extern from 'glm/gtx/transform.hpp' namespace "glm": cdef mat4 rotate(float, vec3) pybik-1.1/pybiklib/gl.pxd0000644000175000017500000077123712151464163015607 0ustar barccbarcc00000000000000# pybiklib/gl.pxd # generated with ./tools/create-gl-pxd.py from libc.stddef cimport ptrdiff_t from libc.stdint cimport int32_t, intptr_t, int8_t, uint8_t # from /usr/include/GL/gl.h: cdef extern from 'GL/gl.h': enum: GL_VERSION_1_1 enum: GL_VERSION_1_2 enum: GL_VERSION_1_3 enum: GL_ARB_imaging enum: GL_FALSE enum: GL_TRUE enum: GL_BYTE enum: GL_UNSIGNED_BYTE enum: GL_SHORT enum: GL_UNSIGNED_SHORT enum: GL_INT enum: GL_UNSIGNED_INT enum: GL_FLOAT enum: GL_2_BYTES enum: GL_3_BYTES enum: GL_4_BYTES enum: GL_DOUBLE enum: GL_POINTS enum: GL_LINES enum: GL_LINE_LOOP enum: GL_LINE_STRIP enum: GL_TRIANGLES enum: GL_TRIANGLE_STRIP enum: GL_TRIANGLE_FAN enum: GL_QUADS enum: GL_QUAD_STRIP enum: GL_POLYGON enum: GL_VERTEX_ARRAY enum: GL_NORMAL_ARRAY enum: GL_COLOR_ARRAY enum: GL_INDEX_ARRAY enum: GL_TEXTURE_COORD_ARRAY enum: GL_EDGE_FLAG_ARRAY enum: GL_VERTEX_ARRAY_SIZE enum: GL_VERTEX_ARRAY_TYPE enum: GL_VERTEX_ARRAY_STRIDE enum: GL_NORMAL_ARRAY_TYPE enum: GL_NORMAL_ARRAY_STRIDE enum: GL_COLOR_ARRAY_SIZE enum: GL_COLOR_ARRAY_TYPE enum: GL_COLOR_ARRAY_STRIDE enum: GL_INDEX_ARRAY_TYPE enum: GL_INDEX_ARRAY_STRIDE enum: GL_TEXTURE_COORD_ARRAY_SIZE enum: GL_TEXTURE_COORD_ARRAY_TYPE enum: GL_TEXTURE_COORD_ARRAY_STRIDE enum: GL_EDGE_FLAG_ARRAY_STRIDE enum: GL_VERTEX_ARRAY_POINTER enum: GL_NORMAL_ARRAY_POINTER enum: GL_COLOR_ARRAY_POINTER enum: GL_INDEX_ARRAY_POINTER enum: GL_TEXTURE_COORD_ARRAY_POINTER enum: GL_EDGE_FLAG_ARRAY_POINTER enum: GL_V2F enum: GL_V3F enum: GL_C4UB_V2F enum: GL_C4UB_V3F enum: GL_C3F_V3F enum: GL_N3F_V3F enum: GL_C4F_N3F_V3F enum: GL_T2F_V3F enum: GL_T4F_V4F enum: GL_T2F_C4UB_V3F enum: GL_T2F_C3F_V3F enum: GL_T2F_N3F_V3F enum: GL_T2F_C4F_N3F_V3F enum: GL_T4F_C4F_N3F_V4F enum: GL_MATRIX_MODE enum: GL_MODELVIEW enum: GL_PROJECTION enum: GL_TEXTURE enum: GL_POINT_SMOOTH enum: GL_POINT_SIZE enum: GL_POINT_SIZE_GRANULARITY enum: GL_POINT_SIZE_RANGE enum: GL_LINE_SMOOTH enum: GL_LINE_STIPPLE enum: GL_LINE_STIPPLE_PATTERN enum: GL_LINE_STIPPLE_REPEAT enum: GL_LINE_WIDTH enum: GL_LINE_WIDTH_GRANULARITY enum: GL_LINE_WIDTH_RANGE enum: GL_POINT enum: GL_LINE enum: GL_FILL enum: GL_CW enum: GL_CCW enum: GL_FRONT enum: GL_BACK enum: GL_POLYGON_MODE enum: GL_POLYGON_SMOOTH enum: GL_POLYGON_STIPPLE enum: GL_EDGE_FLAG enum: GL_CULL_FACE enum: GL_CULL_FACE_MODE enum: GL_FRONT_FACE enum: GL_POLYGON_OFFSET_FACTOR enum: GL_POLYGON_OFFSET_UNITS enum: GL_POLYGON_OFFSET_POINT enum: GL_POLYGON_OFFSET_LINE enum: GL_POLYGON_OFFSET_FILL enum: GL_COMPILE enum: GL_COMPILE_AND_EXECUTE enum: GL_LIST_BASE enum: GL_LIST_INDEX enum: GL_LIST_MODE enum: GL_NEVER enum: GL_LESS enum: GL_EQUAL enum: GL_LEQUAL enum: GL_GREATER enum: GL_NOTEQUAL enum: GL_GEQUAL enum: GL_ALWAYS enum: GL_DEPTH_TEST enum: GL_DEPTH_BITS enum: GL_DEPTH_CLEAR_VALUE enum: GL_DEPTH_FUNC enum: GL_DEPTH_RANGE enum: GL_DEPTH_WRITEMASK enum: GL_DEPTH_COMPONENT enum: GL_LIGHTING enum: GL_LIGHT0 enum: GL_LIGHT1 enum: GL_LIGHT2 enum: GL_LIGHT3 enum: GL_LIGHT4 enum: GL_LIGHT5 enum: GL_LIGHT6 enum: GL_LIGHT7 enum: GL_SPOT_EXPONENT enum: GL_SPOT_CUTOFF enum: GL_CONSTANT_ATTENUATION enum: GL_LINEAR_ATTENUATION enum: GL_QUADRATIC_ATTENUATION enum: GL_AMBIENT enum: GL_DIFFUSE enum: GL_SPECULAR enum: GL_SHININESS enum: GL_EMISSION enum: GL_POSITION enum: GL_SPOT_DIRECTION enum: GL_AMBIENT_AND_DIFFUSE enum: GL_COLOR_INDEXES enum: GL_LIGHT_MODEL_TWO_SIDE enum: GL_LIGHT_MODEL_LOCAL_VIEWER enum: GL_LIGHT_MODEL_AMBIENT enum: GL_FRONT_AND_BACK enum: GL_SHADE_MODEL enum: GL_FLAT enum: GL_SMOOTH enum: GL_COLOR_MATERIAL enum: GL_COLOR_MATERIAL_FACE enum: GL_COLOR_MATERIAL_PARAMETER enum: GL_NORMALIZE enum: GL_CLIP_PLANE0 enum: GL_CLIP_PLANE1 enum: GL_CLIP_PLANE2 enum: GL_CLIP_PLANE3 enum: GL_CLIP_PLANE4 enum: GL_CLIP_PLANE5 enum: GL_ACCUM_RED_BITS enum: GL_ACCUM_GREEN_BITS enum: GL_ACCUM_BLUE_BITS enum: GL_ACCUM_ALPHA_BITS enum: GL_ACCUM_CLEAR_VALUE enum: GL_ACCUM enum: GL_ADD enum: GL_LOAD enum: GL_MULT enum: GL_RETURN enum: GL_ALPHA_TEST enum: GL_ALPHA_TEST_REF enum: GL_ALPHA_TEST_FUNC enum: GL_BLEND enum: GL_BLEND_SRC enum: GL_BLEND_DST enum: GL_ZERO enum: GL_ONE enum: GL_SRC_COLOR enum: GL_ONE_MINUS_SRC_COLOR enum: GL_SRC_ALPHA enum: GL_ONE_MINUS_SRC_ALPHA enum: GL_DST_ALPHA enum: GL_ONE_MINUS_DST_ALPHA enum: GL_DST_COLOR enum: GL_ONE_MINUS_DST_COLOR enum: GL_SRC_ALPHA_SATURATE enum: GL_FEEDBACK enum: GL_RENDER enum: GL_SELECT enum: GL_2D enum: GL_3D enum: GL_3D_COLOR enum: GL_3D_COLOR_TEXTURE enum: GL_4D_COLOR_TEXTURE enum: GL_POINT_TOKEN enum: GL_LINE_TOKEN enum: GL_LINE_RESET_TOKEN enum: GL_POLYGON_TOKEN enum: GL_BITMAP_TOKEN enum: GL_DRAW_PIXEL_TOKEN enum: GL_COPY_PIXEL_TOKEN enum: GL_PASS_THROUGH_TOKEN enum: GL_FEEDBACK_BUFFER_POINTER enum: GL_FEEDBACK_BUFFER_SIZE enum: GL_FEEDBACK_BUFFER_TYPE enum: GL_SELECTION_BUFFER_POINTER enum: GL_SELECTION_BUFFER_SIZE enum: GL_FOG enum: GL_FOG_MODE enum: GL_FOG_DENSITY enum: GL_FOG_COLOR enum: GL_FOG_INDEX enum: GL_FOG_START enum: GL_FOG_END enum: GL_LINEAR enum: GL_EXP enum: GL_EXP2 enum: GL_LOGIC_OP enum: GL_INDEX_LOGIC_OP enum: GL_COLOR_LOGIC_OP enum: GL_LOGIC_OP_MODE enum: GL_CLEAR enum: GL_SET enum: GL_COPY enum: GL_COPY_INVERTED enum: GL_NOOP enum: GL_INVERT enum: GL_AND enum: GL_NAND enum: GL_OR enum: GL_NOR enum: GL_XOR enum: GL_EQUIV enum: GL_AND_REVERSE enum: GL_AND_INVERTED enum: GL_OR_REVERSE enum: GL_OR_INVERTED enum: GL_STENCIL_BITS enum: GL_STENCIL_TEST enum: GL_STENCIL_CLEAR_VALUE enum: GL_STENCIL_FUNC enum: GL_STENCIL_VALUE_MASK enum: GL_STENCIL_FAIL enum: GL_STENCIL_PASS_DEPTH_FAIL enum: GL_STENCIL_PASS_DEPTH_PASS enum: GL_STENCIL_REF enum: GL_STENCIL_WRITEMASK enum: GL_STENCIL_INDEX enum: GL_KEEP enum: GL_REPLACE enum: GL_INCR enum: GL_DECR enum: GL_NONE enum: GL_LEFT enum: GL_RIGHT enum: GL_FRONT_LEFT enum: GL_FRONT_RIGHT enum: GL_BACK_LEFT enum: GL_BACK_RIGHT enum: GL_AUX0 enum: GL_AUX1 enum: GL_AUX2 enum: GL_AUX3 enum: GL_COLOR_INDEX enum: GL_RED enum: GL_GREEN enum: GL_BLUE enum: GL_ALPHA enum: GL_LUMINANCE enum: GL_LUMINANCE_ALPHA enum: GL_ALPHA_BITS enum: GL_RED_BITS enum: GL_GREEN_BITS enum: GL_BLUE_BITS enum: GL_INDEX_BITS enum: GL_SUBPIXEL_BITS enum: GL_AUX_BUFFERS enum: GL_READ_BUFFER enum: GL_DRAW_BUFFER enum: GL_DOUBLEBUFFER enum: GL_STEREO enum: GL_BITMAP enum: GL_COLOR enum: GL_DEPTH enum: GL_STENCIL enum: GL_DITHER enum: GL_RGB enum: GL_RGBA enum: GL_MAX_LIST_NESTING enum: GL_MAX_EVAL_ORDER enum: GL_MAX_LIGHTS enum: GL_MAX_CLIP_PLANES enum: GL_MAX_TEXTURE_SIZE enum: GL_MAX_PIXEL_MAP_TABLE enum: GL_MAX_ATTRIB_STACK_DEPTH enum: GL_MAX_MODELVIEW_STACK_DEPTH enum: GL_MAX_NAME_STACK_DEPTH enum: GL_MAX_PROJECTION_STACK_DEPTH enum: GL_MAX_TEXTURE_STACK_DEPTH enum: GL_MAX_VIEWPORT_DIMS enum: GL_MAX_CLIENT_ATTRIB_STACK_DEPTH enum: GL_ATTRIB_STACK_DEPTH enum: GL_CLIENT_ATTRIB_STACK_DEPTH enum: GL_COLOR_CLEAR_VALUE enum: GL_COLOR_WRITEMASK enum: GL_CURRENT_INDEX enum: GL_CURRENT_COLOR enum: GL_CURRENT_NORMAL enum: GL_CURRENT_RASTER_COLOR enum: GL_CURRENT_RASTER_DISTANCE enum: GL_CURRENT_RASTER_INDEX enum: GL_CURRENT_RASTER_POSITION enum: GL_CURRENT_RASTER_TEXTURE_COORDS enum: GL_CURRENT_RASTER_POSITION_VALID enum: GL_CURRENT_TEXTURE_COORDS enum: GL_INDEX_CLEAR_VALUE enum: GL_INDEX_MODE enum: GL_INDEX_WRITEMASK enum: GL_MODELVIEW_MATRIX enum: GL_MODELVIEW_STACK_DEPTH enum: GL_NAME_STACK_DEPTH enum: GL_PROJECTION_MATRIX enum: GL_PROJECTION_STACK_DEPTH enum: GL_RENDER_MODE enum: GL_RGBA_MODE enum: GL_TEXTURE_MATRIX enum: GL_TEXTURE_STACK_DEPTH enum: GL_VIEWPORT enum: GL_AUTO_NORMAL enum: GL_MAP1_COLOR_4 enum: GL_MAP1_INDEX enum: GL_MAP1_NORMAL enum: GL_MAP1_TEXTURE_COORD_1 enum: GL_MAP1_TEXTURE_COORD_2 enum: GL_MAP1_TEXTURE_COORD_3 enum: GL_MAP1_TEXTURE_COORD_4 enum: GL_MAP1_VERTEX_3 enum: GL_MAP1_VERTEX_4 enum: GL_MAP2_COLOR_4 enum: GL_MAP2_INDEX enum: GL_MAP2_NORMAL enum: GL_MAP2_TEXTURE_COORD_1 enum: GL_MAP2_TEXTURE_COORD_2 enum: GL_MAP2_TEXTURE_COORD_3 enum: GL_MAP2_TEXTURE_COORD_4 enum: GL_MAP2_VERTEX_3 enum: GL_MAP2_VERTEX_4 enum: GL_MAP1_GRID_DOMAIN enum: GL_MAP1_GRID_SEGMENTS enum: GL_MAP2_GRID_DOMAIN enum: GL_MAP2_GRID_SEGMENTS enum: GL_COEFF enum: GL_ORDER enum: GL_DOMAIN enum: GL_PERSPECTIVE_CORRECTION_HINT enum: GL_POINT_SMOOTH_HINT enum: GL_LINE_SMOOTH_HINT enum: GL_POLYGON_SMOOTH_HINT enum: GL_FOG_HINT enum: GL_DONT_CARE enum: GL_FASTEST enum: GL_NICEST enum: GL_SCISSOR_BOX enum: GL_SCISSOR_TEST enum: GL_MAP_COLOR enum: GL_MAP_STENCIL enum: GL_INDEX_SHIFT enum: GL_INDEX_OFFSET enum: GL_RED_SCALE enum: GL_RED_BIAS enum: GL_GREEN_SCALE enum: GL_GREEN_BIAS enum: GL_BLUE_SCALE enum: GL_BLUE_BIAS enum: GL_ALPHA_SCALE enum: GL_ALPHA_BIAS enum: GL_DEPTH_SCALE enum: GL_DEPTH_BIAS enum: GL_PIXEL_MAP_S_TO_S_SIZE enum: GL_PIXEL_MAP_I_TO_I_SIZE enum: GL_PIXEL_MAP_I_TO_R_SIZE enum: GL_PIXEL_MAP_I_TO_G_SIZE enum: GL_PIXEL_MAP_I_TO_B_SIZE enum: GL_PIXEL_MAP_I_TO_A_SIZE enum: GL_PIXEL_MAP_R_TO_R_SIZE enum: GL_PIXEL_MAP_G_TO_G_SIZE enum: GL_PIXEL_MAP_B_TO_B_SIZE enum: GL_PIXEL_MAP_A_TO_A_SIZE enum: GL_PIXEL_MAP_S_TO_S enum: GL_PIXEL_MAP_I_TO_I enum: GL_PIXEL_MAP_I_TO_R enum: GL_PIXEL_MAP_I_TO_G enum: GL_PIXEL_MAP_I_TO_B enum: GL_PIXEL_MAP_I_TO_A enum: GL_PIXEL_MAP_R_TO_R enum: GL_PIXEL_MAP_G_TO_G enum: GL_PIXEL_MAP_B_TO_B enum: GL_PIXEL_MAP_A_TO_A enum: GL_PACK_ALIGNMENT enum: GL_PACK_LSB_FIRST enum: GL_PACK_ROW_LENGTH enum: GL_PACK_SKIP_PIXELS enum: GL_PACK_SKIP_ROWS enum: GL_PACK_SWAP_BYTES enum: GL_UNPACK_ALIGNMENT enum: GL_UNPACK_LSB_FIRST enum: GL_UNPACK_ROW_LENGTH enum: GL_UNPACK_SKIP_PIXELS enum: GL_UNPACK_SKIP_ROWS enum: GL_UNPACK_SWAP_BYTES enum: GL_ZOOM_X enum: GL_ZOOM_Y enum: GL_TEXTURE_ENV enum: GL_TEXTURE_ENV_MODE enum: GL_TEXTURE_1D enum: GL_TEXTURE_2D enum: GL_TEXTURE_WRAP_S enum: GL_TEXTURE_WRAP_T enum: GL_TEXTURE_MAG_FILTER enum: GL_TEXTURE_MIN_FILTER enum: GL_TEXTURE_ENV_COLOR enum: GL_TEXTURE_GEN_S enum: GL_TEXTURE_GEN_T enum: GL_TEXTURE_GEN_R enum: GL_TEXTURE_GEN_Q enum: GL_TEXTURE_GEN_MODE enum: GL_TEXTURE_BORDER_COLOR enum: GL_TEXTURE_WIDTH enum: GL_TEXTURE_HEIGHT enum: GL_TEXTURE_BORDER enum: GL_TEXTURE_COMPONENTS enum: GL_TEXTURE_RED_SIZE enum: GL_TEXTURE_GREEN_SIZE enum: GL_TEXTURE_BLUE_SIZE enum: GL_TEXTURE_ALPHA_SIZE enum: GL_TEXTURE_LUMINANCE_SIZE enum: GL_TEXTURE_INTENSITY_SIZE enum: GL_NEAREST_MIPMAP_NEAREST enum: GL_NEAREST_MIPMAP_LINEAR enum: GL_LINEAR_MIPMAP_NEAREST enum: GL_LINEAR_MIPMAP_LINEAR enum: GL_OBJECT_LINEAR enum: GL_OBJECT_PLANE enum: GL_EYE_LINEAR enum: GL_EYE_PLANE enum: GL_SPHERE_MAP enum: GL_DECAL enum: GL_MODULATE enum: GL_NEAREST enum: GL_REPEAT enum: GL_CLAMP enum: GL_S enum: GL_T enum: GL_R enum: GL_Q enum: GL_VENDOR enum: GL_RENDERER enum: GL_VERSION enum: GL_EXTENSIONS enum: GL_NO_ERROR enum: GL_INVALID_ENUM enum: GL_INVALID_VALUE enum: GL_INVALID_OPERATION enum: GL_STACK_OVERFLOW enum: GL_STACK_UNDERFLOW enum: GL_OUT_OF_MEMORY enum: GL_CURRENT_BIT enum: GL_POINT_BIT enum: GL_LINE_BIT enum: GL_POLYGON_BIT enum: GL_POLYGON_STIPPLE_BIT enum: GL_PIXEL_MODE_BIT enum: GL_LIGHTING_BIT enum: GL_FOG_BIT enum: GL_DEPTH_BUFFER_BIT enum: GL_ACCUM_BUFFER_BIT enum: GL_STENCIL_BUFFER_BIT enum: GL_VIEWPORT_BIT enum: GL_TRANSFORM_BIT enum: GL_ENABLE_BIT enum: GL_COLOR_BUFFER_BIT enum: GL_HINT_BIT enum: GL_EVAL_BIT enum: GL_LIST_BIT enum: GL_TEXTURE_BIT enum: GL_SCISSOR_BIT enum: GL_ALL_ATTRIB_BITS enum: GL_PROXY_TEXTURE_1D enum: GL_PROXY_TEXTURE_2D enum: GL_TEXTURE_PRIORITY enum: GL_TEXTURE_RESIDENT enum: GL_TEXTURE_BINDING_1D enum: GL_TEXTURE_BINDING_2D enum: GL_TEXTURE_INTERNAL_FORMAT enum: GL_ALPHA4 enum: GL_ALPHA8 enum: GL_ALPHA12 enum: GL_ALPHA16 enum: GL_LUMINANCE4 enum: GL_LUMINANCE8 enum: GL_LUMINANCE12 enum: GL_LUMINANCE16 enum: GL_LUMINANCE4_ALPHA4 enum: GL_LUMINANCE6_ALPHA2 enum: GL_LUMINANCE8_ALPHA8 enum: GL_LUMINANCE12_ALPHA4 enum: GL_LUMINANCE12_ALPHA12 enum: GL_LUMINANCE16_ALPHA16 enum: GL_INTENSITY enum: GL_INTENSITY4 enum: GL_INTENSITY8 enum: GL_INTENSITY12 enum: GL_INTENSITY16 enum: GL_R3_G3_B2 enum: GL_RGB4 enum: GL_RGB5 enum: GL_RGB8 enum: GL_RGB10 enum: GL_RGB12 enum: GL_RGB16 enum: GL_RGBA2 enum: GL_RGBA4 enum: GL_RGB5_A1 enum: GL_RGBA8 enum: GL_RGB10_A2 enum: GL_RGBA12 enum: GL_RGBA16 enum: GL_CLIENT_PIXEL_STORE_BIT enum: GL_CLIENT_VERTEX_ARRAY_BIT enum: GL_ALL_CLIENT_ATTRIB_BITS enum: GL_CLIENT_ALL_ATTRIB_BITS enum: GL_RESCALE_NORMAL enum: GL_CLAMP_TO_EDGE enum: GL_MAX_ELEMENTS_VERTICES enum: GL_MAX_ELEMENTS_INDICES enum: GL_BGR enum: GL_BGRA enum: GL_UNSIGNED_BYTE_3_3_2 enum: GL_UNSIGNED_BYTE_2_3_3_REV enum: GL_UNSIGNED_SHORT_5_6_5 enum: GL_UNSIGNED_SHORT_5_6_5_REV enum: GL_UNSIGNED_SHORT_4_4_4_4 enum: GL_UNSIGNED_SHORT_4_4_4_4_REV enum: GL_UNSIGNED_SHORT_5_5_5_1 enum: GL_UNSIGNED_SHORT_1_5_5_5_REV enum: GL_UNSIGNED_INT_8_8_8_8 enum: GL_UNSIGNED_INT_8_8_8_8_REV enum: GL_UNSIGNED_INT_10_10_10_2 enum: GL_UNSIGNED_INT_2_10_10_10_REV enum: GL_LIGHT_MODEL_COLOR_CONTROL enum: GL_SINGLE_COLOR enum: GL_SEPARATE_SPECULAR_COLOR enum: GL_TEXTURE_MIN_LOD enum: GL_TEXTURE_MAX_LOD enum: GL_TEXTURE_BASE_LEVEL enum: GL_TEXTURE_MAX_LEVEL enum: GL_SMOOTH_POINT_SIZE_RANGE enum: GL_SMOOTH_POINT_SIZE_GRANULARITY enum: GL_SMOOTH_LINE_WIDTH_RANGE enum: GL_SMOOTH_LINE_WIDTH_GRANULARITY enum: GL_ALIASED_POINT_SIZE_RANGE enum: GL_ALIASED_LINE_WIDTH_RANGE enum: GL_PACK_SKIP_IMAGES enum: GL_PACK_IMAGE_HEIGHT enum: GL_UNPACK_SKIP_IMAGES enum: GL_UNPACK_IMAGE_HEIGHT enum: GL_TEXTURE_3D enum: GL_PROXY_TEXTURE_3D enum: GL_TEXTURE_DEPTH enum: GL_TEXTURE_WRAP_R enum: GL_MAX_3D_TEXTURE_SIZE enum: GL_TEXTURE_BINDING_3D enum: GL_CONSTANT_COLOR enum: GL_ONE_MINUS_CONSTANT_COLOR enum: GL_CONSTANT_ALPHA enum: GL_ONE_MINUS_CONSTANT_ALPHA enum: GL_COLOR_TABLE enum: GL_POST_CONVOLUTION_COLOR_TABLE enum: GL_POST_COLOR_MATRIX_COLOR_TABLE enum: GL_PROXY_COLOR_TABLE enum: GL_PROXY_POST_CONVOLUTION_COLOR_TABLE enum: GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE enum: GL_COLOR_TABLE_SCALE enum: GL_COLOR_TABLE_BIAS enum: GL_COLOR_TABLE_FORMAT enum: GL_COLOR_TABLE_WIDTH enum: GL_COLOR_TABLE_RED_SIZE enum: GL_COLOR_TABLE_GREEN_SIZE enum: GL_COLOR_TABLE_BLUE_SIZE enum: GL_COLOR_TABLE_ALPHA_SIZE enum: GL_COLOR_TABLE_LUMINANCE_SIZE enum: GL_COLOR_TABLE_INTENSITY_SIZE enum: GL_CONVOLUTION_1D enum: GL_CONVOLUTION_2D enum: GL_SEPARABLE_2D enum: GL_CONVOLUTION_BORDER_MODE enum: GL_CONVOLUTION_FILTER_SCALE enum: GL_CONVOLUTION_FILTER_BIAS enum: GL_REDUCE enum: GL_CONVOLUTION_FORMAT enum: GL_CONVOLUTION_WIDTH enum: GL_CONVOLUTION_HEIGHT enum: GL_MAX_CONVOLUTION_WIDTH enum: GL_MAX_CONVOLUTION_HEIGHT enum: GL_POST_CONVOLUTION_RED_SCALE enum: GL_POST_CONVOLUTION_GREEN_SCALE enum: GL_POST_CONVOLUTION_BLUE_SCALE enum: GL_POST_CONVOLUTION_ALPHA_SCALE enum: GL_POST_CONVOLUTION_RED_BIAS enum: GL_POST_CONVOLUTION_GREEN_BIAS enum: GL_POST_CONVOLUTION_BLUE_BIAS enum: GL_POST_CONVOLUTION_ALPHA_BIAS enum: GL_CONSTANT_BORDER enum: GL_REPLICATE_BORDER enum: GL_CONVOLUTION_BORDER_COLOR enum: GL_COLOR_MATRIX enum: GL_COLOR_MATRIX_STACK_DEPTH enum: GL_MAX_COLOR_MATRIX_STACK_DEPTH enum: GL_POST_COLOR_MATRIX_RED_SCALE enum: GL_POST_COLOR_MATRIX_GREEN_SCALE enum: GL_POST_COLOR_MATRIX_BLUE_SCALE enum: GL_POST_COLOR_MATRIX_ALPHA_SCALE enum: GL_POST_COLOR_MATRIX_RED_BIAS enum: GL_POST_COLOR_MATRIX_GREEN_BIAS enum: GL_POST_COLOR_MATRIX_BLUE_BIAS enum: GL_POST_COLOR_MATRIX_ALPHA_BIAS enum: GL_HISTOGRAM enum: GL_PROXY_HISTOGRAM enum: GL_HISTOGRAM_WIDTH enum: GL_HISTOGRAM_FORMAT enum: GL_HISTOGRAM_RED_SIZE enum: GL_HISTOGRAM_GREEN_SIZE enum: GL_HISTOGRAM_BLUE_SIZE enum: GL_HISTOGRAM_ALPHA_SIZE enum: GL_HISTOGRAM_LUMINANCE_SIZE enum: GL_HISTOGRAM_SINK enum: GL_MINMAX enum: GL_MINMAX_FORMAT enum: GL_MINMAX_SINK enum: GL_TABLE_TOO_LARGE enum: GL_BLEND_EQUATION enum: GL_MIN enum: GL_MAX enum: GL_FUNC_ADD enum: GL_FUNC_SUBTRACT enum: GL_FUNC_REVERSE_SUBTRACT enum: GL_BLEND_COLOR enum: GL_TEXTURE0 enum: GL_TEXTURE1 enum: GL_TEXTURE2 enum: GL_TEXTURE3 enum: GL_TEXTURE4 enum: GL_TEXTURE5 enum: GL_TEXTURE6 enum: GL_TEXTURE7 enum: GL_TEXTURE8 enum: GL_TEXTURE9 enum: GL_TEXTURE10 enum: GL_TEXTURE11 enum: GL_TEXTURE12 enum: GL_TEXTURE13 enum: GL_TEXTURE14 enum: GL_TEXTURE15 enum: GL_TEXTURE16 enum: GL_TEXTURE17 enum: GL_TEXTURE18 enum: GL_TEXTURE19 enum: GL_TEXTURE20 enum: GL_TEXTURE21 enum: GL_TEXTURE22 enum: GL_TEXTURE23 enum: GL_TEXTURE24 enum: GL_TEXTURE25 enum: GL_TEXTURE26 enum: GL_TEXTURE27 enum: GL_TEXTURE28 enum: GL_TEXTURE29 enum: GL_TEXTURE30 enum: GL_TEXTURE31 enum: GL_ACTIVE_TEXTURE enum: GL_CLIENT_ACTIVE_TEXTURE enum: GL_MAX_TEXTURE_UNITS enum: GL_NORMAL_MAP enum: GL_REFLECTION_MAP enum: GL_TEXTURE_CUBE_MAP enum: GL_TEXTURE_BINDING_CUBE_MAP enum: GL_TEXTURE_CUBE_MAP_POSITIVE_X enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_X enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Y enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Z enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z enum: GL_PROXY_TEXTURE_CUBE_MAP enum: GL_MAX_CUBE_MAP_TEXTURE_SIZE enum: GL_COMPRESSED_ALPHA enum: GL_COMPRESSED_LUMINANCE enum: GL_COMPRESSED_LUMINANCE_ALPHA enum: GL_COMPRESSED_INTENSITY enum: GL_COMPRESSED_RGB enum: GL_COMPRESSED_RGBA enum: GL_TEXTURE_COMPRESSION_HINT enum: GL_TEXTURE_COMPRESSED_IMAGE_SIZE enum: GL_TEXTURE_COMPRESSED enum: GL_NUM_COMPRESSED_TEXTURE_FORMATS enum: GL_COMPRESSED_TEXTURE_FORMATS enum: GL_MULTISAMPLE enum: GL_SAMPLE_ALPHA_TO_COVERAGE enum: GL_SAMPLE_ALPHA_TO_ONE enum: GL_SAMPLE_COVERAGE enum: GL_SAMPLE_BUFFERS enum: GL_SAMPLES enum: GL_SAMPLE_COVERAGE_VALUE enum: GL_SAMPLE_COVERAGE_INVERT enum: GL_MULTISAMPLE_BIT enum: GL_TRANSPOSE_MODELVIEW_MATRIX enum: GL_TRANSPOSE_PROJECTION_MATRIX enum: GL_TRANSPOSE_TEXTURE_MATRIX enum: GL_TRANSPOSE_COLOR_MATRIX enum: GL_COMBINE enum: GL_COMBINE_RGB enum: GL_COMBINE_ALPHA enum: GL_SOURCE0_RGB enum: GL_SOURCE1_RGB enum: GL_SOURCE2_RGB enum: GL_SOURCE0_ALPHA enum: GL_SOURCE1_ALPHA enum: GL_SOURCE2_ALPHA enum: GL_OPERAND0_RGB enum: GL_OPERAND1_RGB enum: GL_OPERAND2_RGB enum: GL_OPERAND0_ALPHA enum: GL_OPERAND1_ALPHA enum: GL_OPERAND2_ALPHA enum: GL_RGB_SCALE enum: GL_ADD_SIGNED enum: GL_INTERPOLATE enum: GL_SUBTRACT enum: GL_CONSTANT enum: GL_PRIMARY_COLOR enum: GL_PREVIOUS enum: GL_DOT3_RGB enum: GL_DOT3_RGBA enum: GL_CLAMP_TO_BORDER enum: GL_ARB_multitexture enum: GL_TEXTURE0_ARB enum: GL_TEXTURE1_ARB enum: GL_TEXTURE2_ARB enum: GL_TEXTURE3_ARB enum: GL_TEXTURE4_ARB enum: GL_TEXTURE5_ARB enum: GL_TEXTURE6_ARB enum: GL_TEXTURE7_ARB enum: GL_TEXTURE8_ARB enum: GL_TEXTURE9_ARB enum: GL_TEXTURE10_ARB enum: GL_TEXTURE11_ARB enum: GL_TEXTURE12_ARB enum: GL_TEXTURE13_ARB enum: GL_TEXTURE14_ARB enum: GL_TEXTURE15_ARB enum: GL_TEXTURE16_ARB enum: GL_TEXTURE17_ARB enum: GL_TEXTURE18_ARB enum: GL_TEXTURE19_ARB enum: GL_TEXTURE20_ARB enum: GL_TEXTURE21_ARB enum: GL_TEXTURE22_ARB enum: GL_TEXTURE23_ARB enum: GL_TEXTURE24_ARB enum: GL_TEXTURE25_ARB enum: GL_TEXTURE26_ARB enum: GL_TEXTURE27_ARB enum: GL_TEXTURE28_ARB enum: GL_TEXTURE29_ARB enum: GL_TEXTURE30_ARB enum: GL_TEXTURE31_ARB enum: GL_ACTIVE_TEXTURE_ARB enum: GL_CLIENT_ACTIVE_TEXTURE_ARB enum: GL_MAX_TEXTURE_UNITS_ARB enum: GL_MESA_shader_debug enum: GL_DEBUG_OBJECT_MESA enum: GL_DEBUG_PRINT_MESA enum: GL_DEBUG_ASSERT_MESA enum: GL_MESA_packed_depth_stencil enum: GL_DEPTH_STENCIL_MESA enum: GL_UNSIGNED_INT_24_8_MESA enum: GL_UNSIGNED_INT_8_24_REV_MESA enum: GL_UNSIGNED_SHORT_15_1_MESA enum: GL_UNSIGNED_SHORT_1_15_REV_MESA enum: GL_MESA_program_debug enum: GL_FRAGMENT_PROGRAM_POSITION_MESA enum: GL_FRAGMENT_PROGRAM_CALLBACK_MESA enum: GL_FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA enum: GL_FRAGMENT_PROGRAM_CALLBACK_DATA_MESA enum: GL_VERTEX_PROGRAM_POSITION_MESA enum: GL_VERTEX_PROGRAM_CALLBACK_MESA enum: GL_VERTEX_PROGRAM_CALLBACK_FUNC_MESA enum: GL_VERTEX_PROGRAM_CALLBACK_DATA_MESA enum: GL_MESA_texture_array enum: GL_TEXTURE_1D_ARRAY_EXT enum: GL_PROXY_TEXTURE_1D_ARRAY_EXT enum: GL_TEXTURE_2D_ARRAY_EXT enum: GL_PROXY_TEXTURE_2D_ARRAY_EXT enum: GL_TEXTURE_BINDING_1D_ARRAY_EXT enum: GL_TEXTURE_BINDING_2D_ARRAY_EXT enum: GL_MAX_ARRAY_TEXTURE_LAYERS_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT enum: GL_ATI_blend_equation_separate enum: GL_ALPHA_BLEND_EQUATION_ATI enum: GL_OES_EGL_image # from /usr/include/GL/glext.h: cdef extern from 'GL/glext.h': enum: GL_GLEXT_VERSION enum: GL_UNSIGNED_BYTE_3_3_2 enum: GL_UNSIGNED_SHORT_4_4_4_4 enum: GL_UNSIGNED_SHORT_5_5_5_1 enum: GL_UNSIGNED_INT_8_8_8_8 enum: GL_UNSIGNED_INT_10_10_10_2 enum: GL_TEXTURE_BINDING_3D enum: GL_PACK_SKIP_IMAGES enum: GL_PACK_IMAGE_HEIGHT enum: GL_UNPACK_SKIP_IMAGES enum: GL_UNPACK_IMAGE_HEIGHT enum: GL_TEXTURE_3D enum: GL_PROXY_TEXTURE_3D enum: GL_TEXTURE_DEPTH enum: GL_TEXTURE_WRAP_R enum: GL_MAX_3D_TEXTURE_SIZE enum: GL_UNSIGNED_BYTE_2_3_3_REV enum: GL_UNSIGNED_SHORT_5_6_5 enum: GL_UNSIGNED_SHORT_5_6_5_REV enum: GL_UNSIGNED_SHORT_4_4_4_4_REV enum: GL_UNSIGNED_SHORT_1_5_5_5_REV enum: GL_UNSIGNED_INT_8_8_8_8_REV enum: GL_UNSIGNED_INT_2_10_10_10_REV enum: GL_BGR enum: GL_BGRA enum: GL_MAX_ELEMENTS_VERTICES enum: GL_MAX_ELEMENTS_INDICES enum: GL_CLAMP_TO_EDGE enum: GL_TEXTURE_MIN_LOD enum: GL_TEXTURE_MAX_LOD enum: GL_TEXTURE_BASE_LEVEL enum: GL_TEXTURE_MAX_LEVEL enum: GL_SMOOTH_POINT_SIZE_RANGE enum: GL_SMOOTH_POINT_SIZE_GRANULARITY enum: GL_SMOOTH_LINE_WIDTH_RANGE enum: GL_SMOOTH_LINE_WIDTH_GRANULARITY enum: GL_ALIASED_LINE_WIDTH_RANGE enum: GL_RESCALE_NORMAL enum: GL_LIGHT_MODEL_COLOR_CONTROL enum: GL_SINGLE_COLOR enum: GL_SEPARATE_SPECULAR_COLOR enum: GL_ALIASED_POINT_SIZE_RANGE enum: GL_CONSTANT_COLOR enum: GL_ONE_MINUS_CONSTANT_COLOR enum: GL_CONSTANT_ALPHA enum: GL_ONE_MINUS_CONSTANT_ALPHA enum: GL_BLEND_COLOR enum: GL_FUNC_ADD enum: GL_MIN enum: GL_MAX enum: GL_BLEND_EQUATION enum: GL_FUNC_SUBTRACT enum: GL_FUNC_REVERSE_SUBTRACT enum: GL_CONVOLUTION_1D enum: GL_CONVOLUTION_2D enum: GL_SEPARABLE_2D enum: GL_CONVOLUTION_BORDER_MODE enum: GL_CONVOLUTION_FILTER_SCALE enum: GL_CONVOLUTION_FILTER_BIAS enum: GL_REDUCE enum: GL_CONVOLUTION_FORMAT enum: GL_CONVOLUTION_WIDTH enum: GL_CONVOLUTION_HEIGHT enum: GL_MAX_CONVOLUTION_WIDTH enum: GL_MAX_CONVOLUTION_HEIGHT enum: GL_POST_CONVOLUTION_RED_SCALE enum: GL_POST_CONVOLUTION_GREEN_SCALE enum: GL_POST_CONVOLUTION_BLUE_SCALE enum: GL_POST_CONVOLUTION_ALPHA_SCALE enum: GL_POST_CONVOLUTION_RED_BIAS enum: GL_POST_CONVOLUTION_GREEN_BIAS enum: GL_POST_CONVOLUTION_BLUE_BIAS enum: GL_POST_CONVOLUTION_ALPHA_BIAS enum: GL_HISTOGRAM enum: GL_PROXY_HISTOGRAM enum: GL_HISTOGRAM_WIDTH enum: GL_HISTOGRAM_FORMAT enum: GL_HISTOGRAM_RED_SIZE enum: GL_HISTOGRAM_GREEN_SIZE enum: GL_HISTOGRAM_BLUE_SIZE enum: GL_HISTOGRAM_ALPHA_SIZE enum: GL_HISTOGRAM_LUMINANCE_SIZE enum: GL_HISTOGRAM_SINK enum: GL_MINMAX enum: GL_MINMAX_FORMAT enum: GL_MINMAX_SINK enum: GL_TABLE_TOO_LARGE enum: GL_COLOR_MATRIX enum: GL_COLOR_MATRIX_STACK_DEPTH enum: GL_MAX_COLOR_MATRIX_STACK_DEPTH enum: GL_POST_COLOR_MATRIX_RED_SCALE enum: GL_POST_COLOR_MATRIX_GREEN_SCALE enum: GL_POST_COLOR_MATRIX_BLUE_SCALE enum: GL_POST_COLOR_MATRIX_ALPHA_SCALE enum: GL_POST_COLOR_MATRIX_RED_BIAS enum: GL_POST_COLOR_MATRIX_GREEN_BIAS enum: GL_POST_COLOR_MATRIX_BLUE_BIAS enum: GL_POST_COLOR_MATRIX_ALPHA_BIAS enum: GL_COLOR_TABLE enum: GL_POST_CONVOLUTION_COLOR_TABLE enum: GL_POST_COLOR_MATRIX_COLOR_TABLE enum: GL_PROXY_COLOR_TABLE enum: GL_PROXY_POST_CONVOLUTION_COLOR_TABLE enum: GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE enum: GL_COLOR_TABLE_SCALE enum: GL_COLOR_TABLE_BIAS enum: GL_COLOR_TABLE_FORMAT enum: GL_COLOR_TABLE_WIDTH enum: GL_COLOR_TABLE_RED_SIZE enum: GL_COLOR_TABLE_GREEN_SIZE enum: GL_COLOR_TABLE_BLUE_SIZE enum: GL_COLOR_TABLE_ALPHA_SIZE enum: GL_COLOR_TABLE_LUMINANCE_SIZE enum: GL_COLOR_TABLE_INTENSITY_SIZE enum: GL_CONSTANT_BORDER enum: GL_REPLICATE_BORDER enum: GL_CONVOLUTION_BORDER_COLOR enum: GL_TEXTURE0 enum: GL_TEXTURE1 enum: GL_TEXTURE2 enum: GL_TEXTURE3 enum: GL_TEXTURE4 enum: GL_TEXTURE5 enum: GL_TEXTURE6 enum: GL_TEXTURE7 enum: GL_TEXTURE8 enum: GL_TEXTURE9 enum: GL_TEXTURE10 enum: GL_TEXTURE11 enum: GL_TEXTURE12 enum: GL_TEXTURE13 enum: GL_TEXTURE14 enum: GL_TEXTURE15 enum: GL_TEXTURE16 enum: GL_TEXTURE17 enum: GL_TEXTURE18 enum: GL_TEXTURE19 enum: GL_TEXTURE20 enum: GL_TEXTURE21 enum: GL_TEXTURE22 enum: GL_TEXTURE23 enum: GL_TEXTURE24 enum: GL_TEXTURE25 enum: GL_TEXTURE26 enum: GL_TEXTURE27 enum: GL_TEXTURE28 enum: GL_TEXTURE29 enum: GL_TEXTURE30 enum: GL_TEXTURE31 enum: GL_ACTIVE_TEXTURE enum: GL_MULTISAMPLE enum: GL_SAMPLE_ALPHA_TO_COVERAGE enum: GL_SAMPLE_ALPHA_TO_ONE enum: GL_SAMPLE_COVERAGE enum: GL_SAMPLE_BUFFERS enum: GL_SAMPLES enum: GL_SAMPLE_COVERAGE_VALUE enum: GL_SAMPLE_COVERAGE_INVERT enum: GL_TEXTURE_CUBE_MAP enum: GL_TEXTURE_BINDING_CUBE_MAP enum: GL_TEXTURE_CUBE_MAP_POSITIVE_X enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_X enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Y enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Z enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z enum: GL_PROXY_TEXTURE_CUBE_MAP enum: GL_MAX_CUBE_MAP_TEXTURE_SIZE enum: GL_COMPRESSED_RGB enum: GL_COMPRESSED_RGBA enum: GL_TEXTURE_COMPRESSION_HINT enum: GL_TEXTURE_COMPRESSED_IMAGE_SIZE enum: GL_TEXTURE_COMPRESSED enum: GL_NUM_COMPRESSED_TEXTURE_FORMATS enum: GL_COMPRESSED_TEXTURE_FORMATS enum: GL_CLAMP_TO_BORDER enum: GL_CLIENT_ACTIVE_TEXTURE enum: GL_MAX_TEXTURE_UNITS enum: GL_TRANSPOSE_MODELVIEW_MATRIX enum: GL_TRANSPOSE_PROJECTION_MATRIX enum: GL_TRANSPOSE_TEXTURE_MATRIX enum: GL_TRANSPOSE_COLOR_MATRIX enum: GL_MULTISAMPLE_BIT enum: GL_NORMAL_MAP enum: GL_REFLECTION_MAP enum: GL_COMPRESSED_ALPHA enum: GL_COMPRESSED_LUMINANCE enum: GL_COMPRESSED_LUMINANCE_ALPHA enum: GL_COMPRESSED_INTENSITY enum: GL_COMBINE enum: GL_COMBINE_RGB enum: GL_COMBINE_ALPHA enum: GL_SOURCE0_RGB enum: GL_SOURCE1_RGB enum: GL_SOURCE2_RGB enum: GL_SOURCE0_ALPHA enum: GL_SOURCE1_ALPHA enum: GL_SOURCE2_ALPHA enum: GL_OPERAND0_RGB enum: GL_OPERAND1_RGB enum: GL_OPERAND2_RGB enum: GL_OPERAND0_ALPHA enum: GL_OPERAND1_ALPHA enum: GL_OPERAND2_ALPHA enum: GL_RGB_SCALE enum: GL_ADD_SIGNED enum: GL_INTERPOLATE enum: GL_SUBTRACT enum: GL_CONSTANT enum: GL_PRIMARY_COLOR enum: GL_PREVIOUS enum: GL_DOT3_RGB enum: GL_DOT3_RGBA enum: GL_BLEND_DST_RGB enum: GL_BLEND_SRC_RGB enum: GL_BLEND_DST_ALPHA enum: GL_BLEND_SRC_ALPHA enum: GL_POINT_FADE_THRESHOLD_SIZE enum: GL_DEPTH_COMPONENT16 enum: GL_DEPTH_COMPONENT24 enum: GL_DEPTH_COMPONENT32 enum: GL_MIRRORED_REPEAT enum: GL_MAX_TEXTURE_LOD_BIAS enum: GL_TEXTURE_LOD_BIAS enum: GL_INCR_WRAP enum: GL_DECR_WRAP enum: GL_TEXTURE_DEPTH_SIZE enum: GL_TEXTURE_COMPARE_MODE enum: GL_TEXTURE_COMPARE_FUNC enum: GL_POINT_SIZE_MIN enum: GL_POINT_SIZE_MAX enum: GL_POINT_DISTANCE_ATTENUATION enum: GL_GENERATE_MIPMAP enum: GL_GENERATE_MIPMAP_HINT enum: GL_FOG_COORDINATE_SOURCE enum: GL_FOG_COORDINATE enum: GL_FRAGMENT_DEPTH enum: GL_CURRENT_FOG_COORDINATE enum: GL_FOG_COORDINATE_ARRAY_TYPE enum: GL_FOG_COORDINATE_ARRAY_STRIDE enum: GL_FOG_COORDINATE_ARRAY_POINTER enum: GL_FOG_COORDINATE_ARRAY enum: GL_COLOR_SUM enum: GL_CURRENT_SECONDARY_COLOR enum: GL_SECONDARY_COLOR_ARRAY_SIZE enum: GL_SECONDARY_COLOR_ARRAY_TYPE enum: GL_SECONDARY_COLOR_ARRAY_STRIDE enum: GL_SECONDARY_COLOR_ARRAY_POINTER enum: GL_SECONDARY_COLOR_ARRAY enum: GL_TEXTURE_FILTER_CONTROL enum: GL_DEPTH_TEXTURE_MODE enum: GL_COMPARE_R_TO_TEXTURE enum: GL_BUFFER_SIZE enum: GL_BUFFER_USAGE enum: GL_QUERY_COUNTER_BITS enum: GL_CURRENT_QUERY enum: GL_QUERY_RESULT enum: GL_QUERY_RESULT_AVAILABLE enum: GL_ARRAY_BUFFER enum: GL_ELEMENT_ARRAY_BUFFER enum: GL_ARRAY_BUFFER_BINDING enum: GL_ELEMENT_ARRAY_BUFFER_BINDING enum: GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING enum: GL_READ_ONLY enum: GL_WRITE_ONLY enum: GL_READ_WRITE enum: GL_BUFFER_ACCESS enum: GL_BUFFER_MAPPED enum: GL_BUFFER_MAP_POINTER enum: GL_STREAM_DRAW enum: GL_STREAM_READ enum: GL_STREAM_COPY enum: GL_STATIC_DRAW enum: GL_STATIC_READ enum: GL_STATIC_COPY enum: GL_DYNAMIC_DRAW enum: GL_DYNAMIC_READ enum: GL_DYNAMIC_COPY enum: GL_SAMPLES_PASSED enum: GL_SRC1_ALPHA enum: GL_VERTEX_ARRAY_BUFFER_BINDING enum: GL_NORMAL_ARRAY_BUFFER_BINDING enum: GL_COLOR_ARRAY_BUFFER_BINDING enum: GL_INDEX_ARRAY_BUFFER_BINDING enum: GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING enum: GL_EDGE_FLAG_ARRAY_BUFFER_BINDING enum: GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING enum: GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING enum: GL_WEIGHT_ARRAY_BUFFER_BINDING enum: GL_FOG_COORD_SRC enum: GL_FOG_COORD enum: GL_CURRENT_FOG_COORD enum: GL_FOG_COORD_ARRAY_TYPE enum: GL_FOG_COORD_ARRAY_STRIDE enum: GL_FOG_COORD_ARRAY_POINTER enum: GL_FOG_COORD_ARRAY enum: GL_FOG_COORD_ARRAY_BUFFER_BINDING enum: GL_SRC0_RGB enum: GL_SRC1_RGB enum: GL_SRC2_RGB enum: GL_SRC0_ALPHA enum: GL_SRC2_ALPHA enum: GL_BLEND_EQUATION_RGB enum: GL_VERTEX_ATTRIB_ARRAY_ENABLED enum: GL_VERTEX_ATTRIB_ARRAY_SIZE enum: GL_VERTEX_ATTRIB_ARRAY_STRIDE enum: GL_VERTEX_ATTRIB_ARRAY_TYPE enum: GL_CURRENT_VERTEX_ATTRIB enum: GL_VERTEX_PROGRAM_POINT_SIZE enum: GL_VERTEX_ATTRIB_ARRAY_POINTER enum: GL_STENCIL_BACK_FUNC enum: GL_STENCIL_BACK_FAIL enum: GL_STENCIL_BACK_PASS_DEPTH_FAIL enum: GL_STENCIL_BACK_PASS_DEPTH_PASS enum: GL_MAX_DRAW_BUFFERS enum: GL_DRAW_BUFFER0 enum: GL_DRAW_BUFFER1 enum: GL_DRAW_BUFFER2 enum: GL_DRAW_BUFFER3 enum: GL_DRAW_BUFFER4 enum: GL_DRAW_BUFFER5 enum: GL_DRAW_BUFFER6 enum: GL_DRAW_BUFFER7 enum: GL_DRAW_BUFFER8 enum: GL_DRAW_BUFFER9 enum: GL_DRAW_BUFFER10 enum: GL_DRAW_BUFFER11 enum: GL_DRAW_BUFFER12 enum: GL_DRAW_BUFFER13 enum: GL_DRAW_BUFFER14 enum: GL_DRAW_BUFFER15 enum: GL_BLEND_EQUATION_ALPHA enum: GL_MAX_VERTEX_ATTRIBS enum: GL_VERTEX_ATTRIB_ARRAY_NORMALIZED enum: GL_MAX_TEXTURE_IMAGE_UNITS enum: GL_FRAGMENT_SHADER enum: GL_VERTEX_SHADER enum: GL_MAX_FRAGMENT_UNIFORM_COMPONENTS enum: GL_MAX_VERTEX_UNIFORM_COMPONENTS enum: GL_MAX_VARYING_FLOATS enum: GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS enum: GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS enum: GL_SHADER_TYPE enum: GL_FLOAT_VEC2 enum: GL_FLOAT_VEC3 enum: GL_FLOAT_VEC4 enum: GL_INT_VEC2 enum: GL_INT_VEC3 enum: GL_INT_VEC4 enum: GL_BOOL enum: GL_BOOL_VEC2 enum: GL_BOOL_VEC3 enum: GL_BOOL_VEC4 enum: GL_FLOAT_MAT2 enum: GL_FLOAT_MAT3 enum: GL_FLOAT_MAT4 enum: GL_SAMPLER_1D enum: GL_SAMPLER_2D enum: GL_SAMPLER_3D enum: GL_SAMPLER_CUBE enum: GL_SAMPLER_1D_SHADOW enum: GL_SAMPLER_2D_SHADOW enum: GL_DELETE_STATUS enum: GL_COMPILE_STATUS enum: GL_LINK_STATUS enum: GL_VALIDATE_STATUS enum: GL_INFO_LOG_LENGTH enum: GL_ATTACHED_SHADERS enum: GL_ACTIVE_UNIFORMS enum: GL_ACTIVE_UNIFORM_MAX_LENGTH enum: GL_SHADER_SOURCE_LENGTH enum: GL_ACTIVE_ATTRIBUTES enum: GL_ACTIVE_ATTRIBUTE_MAX_LENGTH enum: GL_FRAGMENT_SHADER_DERIVATIVE_HINT enum: GL_SHADING_LANGUAGE_VERSION enum: GL_CURRENT_PROGRAM enum: GL_POINT_SPRITE_COORD_ORIGIN enum: GL_LOWER_LEFT enum: GL_UPPER_LEFT enum: GL_STENCIL_BACK_REF enum: GL_STENCIL_BACK_VALUE_MASK enum: GL_STENCIL_BACK_WRITEMASK enum: GL_VERTEX_PROGRAM_TWO_SIDE enum: GL_POINT_SPRITE enum: GL_COORD_REPLACE enum: GL_MAX_TEXTURE_COORDS enum: GL_PIXEL_PACK_BUFFER enum: GL_PIXEL_UNPACK_BUFFER enum: GL_PIXEL_PACK_BUFFER_BINDING enum: GL_PIXEL_UNPACK_BUFFER_BINDING enum: GL_FLOAT_MAT2x3 enum: GL_FLOAT_MAT2x4 enum: GL_FLOAT_MAT3x2 enum: GL_FLOAT_MAT3x4 enum: GL_FLOAT_MAT4x2 enum: GL_FLOAT_MAT4x3 enum: GL_SRGB enum: GL_SRGB8 enum: GL_SRGB_ALPHA enum: GL_SRGB8_ALPHA8 enum: GL_COMPRESSED_SRGB enum: GL_COMPRESSED_SRGB_ALPHA enum: GL_CURRENT_RASTER_SECONDARY_COLOR enum: GL_SLUMINANCE_ALPHA enum: GL_SLUMINANCE8_ALPHA8 enum: GL_SLUMINANCE enum: GL_SLUMINANCE8 enum: GL_COMPRESSED_SLUMINANCE enum: GL_COMPRESSED_SLUMINANCE_ALPHA enum: GL_COMPARE_REF_TO_TEXTURE enum: GL_CLIP_DISTANCE0 enum: GL_CLIP_DISTANCE1 enum: GL_CLIP_DISTANCE2 enum: GL_CLIP_DISTANCE3 enum: GL_CLIP_DISTANCE4 enum: GL_CLIP_DISTANCE5 enum: GL_CLIP_DISTANCE6 enum: GL_CLIP_DISTANCE7 enum: GL_MAX_CLIP_DISTANCES enum: GL_MAJOR_VERSION enum: GL_MINOR_VERSION enum: GL_NUM_EXTENSIONS enum: GL_CONTEXT_FLAGS enum: GL_COMPRESSED_RED enum: GL_COMPRESSED_RG enum: GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT enum: GL_RGBA32F enum: GL_RGB32F enum: GL_RGBA16F enum: GL_RGB16F enum: GL_VERTEX_ATTRIB_ARRAY_INTEGER enum: GL_MAX_ARRAY_TEXTURE_LAYERS enum: GL_MIN_PROGRAM_TEXEL_OFFSET enum: GL_MAX_PROGRAM_TEXEL_OFFSET enum: GL_CLAMP_READ_COLOR enum: GL_FIXED_ONLY enum: GL_MAX_VARYING_COMPONENTS enum: GL_TEXTURE_1D_ARRAY enum: GL_PROXY_TEXTURE_1D_ARRAY enum: GL_TEXTURE_2D_ARRAY enum: GL_PROXY_TEXTURE_2D_ARRAY enum: GL_TEXTURE_BINDING_1D_ARRAY enum: GL_TEXTURE_BINDING_2D_ARRAY enum: GL_R11F_G11F_B10F enum: GL_UNSIGNED_INT_10F_11F_11F_REV enum: GL_RGB9_E5 enum: GL_UNSIGNED_INT_5_9_9_9_REV enum: GL_TEXTURE_SHARED_SIZE enum: GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH enum: GL_TRANSFORM_FEEDBACK_BUFFER_MODE enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS enum: GL_TRANSFORM_FEEDBACK_VARYINGS enum: GL_TRANSFORM_FEEDBACK_BUFFER_START enum: GL_TRANSFORM_FEEDBACK_BUFFER_SIZE enum: GL_PRIMITIVES_GENERATED enum: GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN enum: GL_RASTERIZER_DISCARD enum: GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS enum: GL_INTERLEAVED_ATTRIBS enum: GL_SEPARATE_ATTRIBS enum: GL_TRANSFORM_FEEDBACK_BUFFER enum: GL_TRANSFORM_FEEDBACK_BUFFER_BINDING enum: GL_RGBA32UI enum: GL_RGB32UI enum: GL_RGBA16UI enum: GL_RGB16UI enum: GL_RGBA8UI enum: GL_RGB8UI enum: GL_RGBA32I enum: GL_RGB32I enum: GL_RGBA16I enum: GL_RGB16I enum: GL_RGBA8I enum: GL_RGB8I enum: GL_RED_INTEGER enum: GL_GREEN_INTEGER enum: GL_BLUE_INTEGER enum: GL_RGB_INTEGER enum: GL_RGBA_INTEGER enum: GL_BGR_INTEGER enum: GL_BGRA_INTEGER enum: GL_SAMPLER_1D_ARRAY enum: GL_SAMPLER_2D_ARRAY enum: GL_SAMPLER_1D_ARRAY_SHADOW enum: GL_SAMPLER_2D_ARRAY_SHADOW enum: GL_SAMPLER_CUBE_SHADOW enum: GL_UNSIGNED_INT_VEC2 enum: GL_UNSIGNED_INT_VEC3 enum: GL_UNSIGNED_INT_VEC4 enum: GL_INT_SAMPLER_1D enum: GL_INT_SAMPLER_2D enum: GL_INT_SAMPLER_3D enum: GL_INT_SAMPLER_CUBE enum: GL_INT_SAMPLER_1D_ARRAY enum: GL_INT_SAMPLER_2D_ARRAY enum: GL_UNSIGNED_INT_SAMPLER_1D enum: GL_UNSIGNED_INT_SAMPLER_2D enum: GL_UNSIGNED_INT_SAMPLER_3D enum: GL_UNSIGNED_INT_SAMPLER_CUBE enum: GL_UNSIGNED_INT_SAMPLER_1D_ARRAY enum: GL_UNSIGNED_INT_SAMPLER_2D_ARRAY enum: GL_QUERY_WAIT enum: GL_QUERY_NO_WAIT enum: GL_QUERY_BY_REGION_WAIT enum: GL_QUERY_BY_REGION_NO_WAIT enum: GL_BUFFER_ACCESS_FLAGS enum: GL_BUFFER_MAP_LENGTH enum: GL_BUFFER_MAP_OFFSET enum: GL_CLAMP_VERTEX_COLOR enum: GL_CLAMP_FRAGMENT_COLOR enum: GL_ALPHA_INTEGER enum: GL_SAMPLER_2D_RECT enum: GL_SAMPLER_2D_RECT_SHADOW enum: GL_SAMPLER_BUFFER enum: GL_INT_SAMPLER_2D_RECT enum: GL_INT_SAMPLER_BUFFER enum: GL_UNSIGNED_INT_SAMPLER_2D_RECT enum: GL_UNSIGNED_INT_SAMPLER_BUFFER enum: GL_TEXTURE_BUFFER enum: GL_MAX_TEXTURE_BUFFER_SIZE enum: GL_TEXTURE_BINDING_BUFFER enum: GL_TEXTURE_BUFFER_DATA_STORE_BINDING enum: GL_TEXTURE_RECTANGLE enum: GL_TEXTURE_BINDING_RECTANGLE enum: GL_PROXY_TEXTURE_RECTANGLE enum: GL_MAX_RECTANGLE_TEXTURE_SIZE enum: GL_RED_SNORM enum: GL_RG_SNORM enum: GL_RGB_SNORM enum: GL_RGBA_SNORM enum: GL_R8_SNORM enum: GL_RG8_SNORM enum: GL_RGB8_SNORM enum: GL_RGBA8_SNORM enum: GL_R16_SNORM enum: GL_RG16_SNORM enum: GL_RGB16_SNORM enum: GL_RGBA16_SNORM enum: GL_SIGNED_NORMALIZED enum: GL_PRIMITIVE_RESTART enum: GL_PRIMITIVE_RESTART_INDEX enum: GL_CONTEXT_CORE_PROFILE_BIT enum: GL_CONTEXT_COMPATIBILITY_PROFILE_BIT enum: GL_LINES_ADJACENCY enum: GL_LINE_STRIP_ADJACENCY enum: GL_TRIANGLES_ADJACENCY enum: GL_TRIANGLE_STRIP_ADJACENCY enum: GL_PROGRAM_POINT_SIZE enum: GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS enum: GL_FRAMEBUFFER_ATTACHMENT_LAYERED enum: GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS enum: GL_GEOMETRY_SHADER enum: GL_GEOMETRY_VERTICES_OUT enum: GL_GEOMETRY_INPUT_TYPE enum: GL_GEOMETRY_OUTPUT_TYPE enum: GL_MAX_GEOMETRY_UNIFORM_COMPONENTS enum: GL_MAX_GEOMETRY_OUTPUT_VERTICES enum: GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS enum: GL_MAX_VERTEX_OUTPUT_COMPONENTS enum: GL_MAX_GEOMETRY_INPUT_COMPONENTS enum: GL_MAX_GEOMETRY_OUTPUT_COMPONENTS enum: GL_MAX_FRAGMENT_INPUT_COMPONENTS enum: GL_CONTEXT_PROFILE_MASK enum: GL_VERTEX_ATTRIB_ARRAY_DIVISOR enum: GL_SAMPLE_SHADING enum: GL_MIN_SAMPLE_SHADING_VALUE enum: GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET enum: GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET enum: GL_TEXTURE_CUBE_MAP_ARRAY enum: GL_TEXTURE_BINDING_CUBE_MAP_ARRAY enum: GL_PROXY_TEXTURE_CUBE_MAP_ARRAY enum: GL_SAMPLER_CUBE_MAP_ARRAY enum: GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW enum: GL_INT_SAMPLER_CUBE_MAP_ARRAY enum: GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY enum: GL_NUM_SHADING_LANGUAGE_VERSIONS enum: GL_VERTEX_ATTRIB_ARRAY_LONG enum: GL_TEXTURE0_ARB enum: GL_TEXTURE1_ARB enum: GL_TEXTURE2_ARB enum: GL_TEXTURE3_ARB enum: GL_TEXTURE4_ARB enum: GL_TEXTURE5_ARB enum: GL_TEXTURE6_ARB enum: GL_TEXTURE7_ARB enum: GL_TEXTURE8_ARB enum: GL_TEXTURE9_ARB enum: GL_TEXTURE10_ARB enum: GL_TEXTURE11_ARB enum: GL_TEXTURE12_ARB enum: GL_TEXTURE13_ARB enum: GL_TEXTURE14_ARB enum: GL_TEXTURE15_ARB enum: GL_TEXTURE16_ARB enum: GL_TEXTURE17_ARB enum: GL_TEXTURE18_ARB enum: GL_TEXTURE19_ARB enum: GL_TEXTURE20_ARB enum: GL_TEXTURE21_ARB enum: GL_TEXTURE22_ARB enum: GL_TEXTURE23_ARB enum: GL_TEXTURE24_ARB enum: GL_TEXTURE25_ARB enum: GL_TEXTURE26_ARB enum: GL_TEXTURE27_ARB enum: GL_TEXTURE28_ARB enum: GL_TEXTURE29_ARB enum: GL_TEXTURE30_ARB enum: GL_TEXTURE31_ARB enum: GL_ACTIVE_TEXTURE_ARB enum: GL_CLIENT_ACTIVE_TEXTURE_ARB enum: GL_MAX_TEXTURE_UNITS_ARB enum: GL_TRANSPOSE_MODELVIEW_MATRIX_ARB enum: GL_TRANSPOSE_PROJECTION_MATRIX_ARB enum: GL_TRANSPOSE_TEXTURE_MATRIX_ARB enum: GL_TRANSPOSE_COLOR_MATRIX_ARB enum: GL_MULTISAMPLE_ARB enum: GL_SAMPLE_ALPHA_TO_COVERAGE_ARB enum: GL_SAMPLE_ALPHA_TO_ONE_ARB enum: GL_SAMPLE_COVERAGE_ARB enum: GL_SAMPLE_BUFFERS_ARB enum: GL_SAMPLES_ARB enum: GL_SAMPLE_COVERAGE_VALUE_ARB enum: GL_SAMPLE_COVERAGE_INVERT_ARB enum: GL_MULTISAMPLE_BIT_ARB enum: GL_NORMAL_MAP_ARB enum: GL_REFLECTION_MAP_ARB enum: GL_TEXTURE_CUBE_MAP_ARB enum: GL_TEXTURE_BINDING_CUBE_MAP_ARB enum: GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB enum: GL_PROXY_TEXTURE_CUBE_MAP_ARB enum: GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB enum: GL_COMPRESSED_ALPHA_ARB enum: GL_COMPRESSED_LUMINANCE_ARB enum: GL_COMPRESSED_LUMINANCE_ALPHA_ARB enum: GL_COMPRESSED_INTENSITY_ARB enum: GL_COMPRESSED_RGB_ARB enum: GL_COMPRESSED_RGBA_ARB enum: GL_TEXTURE_COMPRESSION_HINT_ARB enum: GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB enum: GL_TEXTURE_COMPRESSED_ARB enum: GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB enum: GL_COMPRESSED_TEXTURE_FORMATS_ARB enum: GL_CLAMP_TO_BORDER_ARB enum: GL_POINT_SIZE_MIN_ARB enum: GL_POINT_SIZE_MAX_ARB enum: GL_POINT_FADE_THRESHOLD_SIZE_ARB enum: GL_POINT_DISTANCE_ATTENUATION_ARB enum: GL_MAX_VERTEX_UNITS_ARB enum: GL_ACTIVE_VERTEX_UNITS_ARB enum: GL_WEIGHT_SUM_UNITY_ARB enum: GL_VERTEX_BLEND_ARB enum: GL_CURRENT_WEIGHT_ARB enum: GL_WEIGHT_ARRAY_TYPE_ARB enum: GL_WEIGHT_ARRAY_STRIDE_ARB enum: GL_WEIGHT_ARRAY_SIZE_ARB enum: GL_WEIGHT_ARRAY_POINTER_ARB enum: GL_WEIGHT_ARRAY_ARB enum: GL_MODELVIEW0_ARB enum: GL_MODELVIEW1_ARB enum: GL_MODELVIEW2_ARB enum: GL_MODELVIEW3_ARB enum: GL_MODELVIEW4_ARB enum: GL_MODELVIEW5_ARB enum: GL_MODELVIEW6_ARB enum: GL_MODELVIEW7_ARB enum: GL_MODELVIEW8_ARB enum: GL_MODELVIEW9_ARB enum: GL_MODELVIEW10_ARB enum: GL_MODELVIEW11_ARB enum: GL_MODELVIEW12_ARB enum: GL_MODELVIEW13_ARB enum: GL_MODELVIEW14_ARB enum: GL_MODELVIEW15_ARB enum: GL_MODELVIEW16_ARB enum: GL_MODELVIEW17_ARB enum: GL_MODELVIEW18_ARB enum: GL_MODELVIEW19_ARB enum: GL_MODELVIEW20_ARB enum: GL_MODELVIEW21_ARB enum: GL_MODELVIEW22_ARB enum: GL_MODELVIEW23_ARB enum: GL_MODELVIEW24_ARB enum: GL_MODELVIEW25_ARB enum: GL_MODELVIEW26_ARB enum: GL_MODELVIEW27_ARB enum: GL_MODELVIEW28_ARB enum: GL_MODELVIEW29_ARB enum: GL_MODELVIEW30_ARB enum: GL_MODELVIEW31_ARB enum: GL_MATRIX_PALETTE_ARB enum: GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB enum: GL_MAX_PALETTE_MATRICES_ARB enum: GL_CURRENT_PALETTE_MATRIX_ARB enum: GL_MATRIX_INDEX_ARRAY_ARB enum: GL_CURRENT_MATRIX_INDEX_ARB enum: GL_MATRIX_INDEX_ARRAY_SIZE_ARB enum: GL_MATRIX_INDEX_ARRAY_TYPE_ARB enum: GL_MATRIX_INDEX_ARRAY_STRIDE_ARB enum: GL_MATRIX_INDEX_ARRAY_POINTER_ARB enum: GL_COMBINE_ARB enum: GL_COMBINE_RGB_ARB enum: GL_COMBINE_ALPHA_ARB enum: GL_SOURCE0_RGB_ARB enum: GL_SOURCE1_RGB_ARB enum: GL_SOURCE2_RGB_ARB enum: GL_SOURCE0_ALPHA_ARB enum: GL_SOURCE1_ALPHA_ARB enum: GL_SOURCE2_ALPHA_ARB enum: GL_OPERAND0_RGB_ARB enum: GL_OPERAND1_RGB_ARB enum: GL_OPERAND2_RGB_ARB enum: GL_OPERAND0_ALPHA_ARB enum: GL_OPERAND1_ALPHA_ARB enum: GL_OPERAND2_ALPHA_ARB enum: GL_RGB_SCALE_ARB enum: GL_ADD_SIGNED_ARB enum: GL_INTERPOLATE_ARB enum: GL_SUBTRACT_ARB enum: GL_CONSTANT_ARB enum: GL_PRIMARY_COLOR_ARB enum: GL_PREVIOUS_ARB enum: GL_DOT3_RGB_ARB enum: GL_DOT3_RGBA_ARB enum: GL_MIRRORED_REPEAT_ARB enum: GL_DEPTH_COMPONENT16_ARB enum: GL_DEPTH_COMPONENT24_ARB enum: GL_DEPTH_COMPONENT32_ARB enum: GL_TEXTURE_DEPTH_SIZE_ARB enum: GL_DEPTH_TEXTURE_MODE_ARB enum: GL_TEXTURE_COMPARE_MODE_ARB enum: GL_TEXTURE_COMPARE_FUNC_ARB enum: GL_COMPARE_R_TO_TEXTURE_ARB enum: GL_TEXTURE_COMPARE_FAIL_VALUE_ARB enum: GL_COLOR_SUM_ARB enum: GL_VERTEX_PROGRAM_ARB enum: GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB enum: GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB enum: GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB enum: GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB enum: GL_CURRENT_VERTEX_ATTRIB_ARB enum: GL_PROGRAM_LENGTH_ARB enum: GL_PROGRAM_STRING_ARB enum: GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB enum: GL_MAX_PROGRAM_MATRICES_ARB enum: GL_CURRENT_MATRIX_STACK_DEPTH_ARB enum: GL_CURRENT_MATRIX_ARB enum: GL_VERTEX_PROGRAM_POINT_SIZE_ARB enum: GL_VERTEX_PROGRAM_TWO_SIDE_ARB enum: GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB enum: GL_PROGRAM_ERROR_POSITION_ARB enum: GL_PROGRAM_BINDING_ARB enum: GL_MAX_VERTEX_ATTRIBS_ARB enum: GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB enum: GL_PROGRAM_ERROR_STRING_ARB enum: GL_PROGRAM_FORMAT_ASCII_ARB enum: GL_PROGRAM_FORMAT_ARB enum: GL_PROGRAM_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_INSTRUCTIONS_ARB enum: GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB enum: GL_PROGRAM_TEMPORARIES_ARB enum: GL_MAX_PROGRAM_TEMPORARIES_ARB enum: GL_PROGRAM_NATIVE_TEMPORARIES_ARB enum: GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB enum: GL_PROGRAM_PARAMETERS_ARB enum: GL_MAX_PROGRAM_PARAMETERS_ARB enum: GL_PROGRAM_NATIVE_PARAMETERS_ARB enum: GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB enum: GL_PROGRAM_ATTRIBS_ARB enum: GL_MAX_PROGRAM_ATTRIBS_ARB enum: GL_PROGRAM_NATIVE_ATTRIBS_ARB enum: GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB enum: GL_PROGRAM_ADDRESS_REGISTERS_ARB enum: GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB enum: GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB enum: GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB enum: GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB enum: GL_MAX_PROGRAM_ENV_PARAMETERS_ARB enum: GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB enum: GL_TRANSPOSE_CURRENT_MATRIX_ARB enum: GL_MATRIX0_ARB enum: GL_MATRIX1_ARB enum: GL_MATRIX2_ARB enum: GL_MATRIX3_ARB enum: GL_MATRIX4_ARB enum: GL_MATRIX5_ARB enum: GL_MATRIX6_ARB enum: GL_MATRIX7_ARB enum: GL_MATRIX8_ARB enum: GL_MATRIX9_ARB enum: GL_MATRIX10_ARB enum: GL_MATRIX11_ARB enum: GL_MATRIX12_ARB enum: GL_MATRIX13_ARB enum: GL_MATRIX14_ARB enum: GL_MATRIX15_ARB enum: GL_MATRIX16_ARB enum: GL_MATRIX17_ARB enum: GL_MATRIX18_ARB enum: GL_MATRIX19_ARB enum: GL_MATRIX20_ARB enum: GL_MATRIX21_ARB enum: GL_MATRIX22_ARB enum: GL_MATRIX23_ARB enum: GL_MATRIX24_ARB enum: GL_MATRIX25_ARB enum: GL_MATRIX26_ARB enum: GL_MATRIX27_ARB enum: GL_MATRIX28_ARB enum: GL_MATRIX29_ARB enum: GL_MATRIX30_ARB enum: GL_MATRIX31_ARB enum: GL_FRAGMENT_PROGRAM_ARB enum: GL_PROGRAM_ALU_INSTRUCTIONS_ARB enum: GL_PROGRAM_TEX_INSTRUCTIONS_ARB enum: GL_PROGRAM_TEX_INDIRECTIONS_ARB enum: GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB enum: GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB enum: GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB enum: GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB enum: GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB enum: GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB enum: GL_MAX_TEXTURE_COORDS_ARB enum: GL_MAX_TEXTURE_IMAGE_UNITS_ARB enum: GL_BUFFER_SIZE_ARB enum: GL_BUFFER_USAGE_ARB enum: GL_ARRAY_BUFFER_ARB enum: GL_ELEMENT_ARRAY_BUFFER_ARB enum: GL_ARRAY_BUFFER_BINDING_ARB enum: GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB enum: GL_VERTEX_ARRAY_BUFFER_BINDING_ARB enum: GL_NORMAL_ARRAY_BUFFER_BINDING_ARB enum: GL_COLOR_ARRAY_BUFFER_BINDING_ARB enum: GL_INDEX_ARRAY_BUFFER_BINDING_ARB enum: GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB enum: GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB enum: GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB enum: GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB enum: GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB enum: GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB enum: GL_READ_ONLY_ARB enum: GL_WRITE_ONLY_ARB enum: GL_READ_WRITE_ARB enum: GL_BUFFER_ACCESS_ARB enum: GL_BUFFER_MAPPED_ARB enum: GL_BUFFER_MAP_POINTER_ARB enum: GL_STREAM_DRAW_ARB enum: GL_STREAM_READ_ARB enum: GL_STREAM_COPY_ARB enum: GL_STATIC_DRAW_ARB enum: GL_STATIC_READ_ARB enum: GL_STATIC_COPY_ARB enum: GL_DYNAMIC_DRAW_ARB enum: GL_DYNAMIC_READ_ARB enum: GL_DYNAMIC_COPY_ARB enum: GL_QUERY_COUNTER_BITS_ARB enum: GL_CURRENT_QUERY_ARB enum: GL_QUERY_RESULT_ARB enum: GL_QUERY_RESULT_AVAILABLE_ARB enum: GL_SAMPLES_PASSED_ARB enum: GL_PROGRAM_OBJECT_ARB enum: GL_SHADER_OBJECT_ARB enum: GL_OBJECT_TYPE_ARB enum: GL_OBJECT_SUBTYPE_ARB enum: GL_FLOAT_VEC2_ARB enum: GL_FLOAT_VEC3_ARB enum: GL_FLOAT_VEC4_ARB enum: GL_INT_VEC2_ARB enum: GL_INT_VEC3_ARB enum: GL_INT_VEC4_ARB enum: GL_BOOL_ARB enum: GL_BOOL_VEC2_ARB enum: GL_BOOL_VEC3_ARB enum: GL_BOOL_VEC4_ARB enum: GL_FLOAT_MAT2_ARB enum: GL_FLOAT_MAT3_ARB enum: GL_FLOAT_MAT4_ARB enum: GL_SAMPLER_1D_ARB enum: GL_SAMPLER_2D_ARB enum: GL_SAMPLER_3D_ARB enum: GL_SAMPLER_CUBE_ARB enum: GL_SAMPLER_1D_SHADOW_ARB enum: GL_SAMPLER_2D_SHADOW_ARB enum: GL_SAMPLER_2D_RECT_ARB enum: GL_SAMPLER_2D_RECT_SHADOW_ARB enum: GL_OBJECT_DELETE_STATUS_ARB enum: GL_OBJECT_COMPILE_STATUS_ARB enum: GL_OBJECT_LINK_STATUS_ARB enum: GL_OBJECT_VALIDATE_STATUS_ARB enum: GL_OBJECT_INFO_LOG_LENGTH_ARB enum: GL_OBJECT_ATTACHED_OBJECTS_ARB enum: GL_OBJECT_ACTIVE_UNIFORMS_ARB enum: GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB enum: GL_OBJECT_SHADER_SOURCE_LENGTH_ARB enum: GL_VERTEX_SHADER_ARB enum: GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB enum: GL_MAX_VARYING_FLOATS_ARB enum: GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB enum: GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB enum: GL_OBJECT_ACTIVE_ATTRIBUTES_ARB enum: GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB enum: GL_FRAGMENT_SHADER_ARB enum: GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB enum: GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB enum: GL_SHADING_LANGUAGE_VERSION_ARB enum: GL_POINT_SPRITE_ARB enum: GL_COORD_REPLACE_ARB enum: GL_MAX_DRAW_BUFFERS_ARB enum: GL_DRAW_BUFFER0_ARB enum: GL_DRAW_BUFFER1_ARB enum: GL_DRAW_BUFFER2_ARB enum: GL_DRAW_BUFFER3_ARB enum: GL_DRAW_BUFFER4_ARB enum: GL_DRAW_BUFFER5_ARB enum: GL_DRAW_BUFFER6_ARB enum: GL_DRAW_BUFFER7_ARB enum: GL_DRAW_BUFFER8_ARB enum: GL_DRAW_BUFFER9_ARB enum: GL_DRAW_BUFFER10_ARB enum: GL_DRAW_BUFFER11_ARB enum: GL_DRAW_BUFFER12_ARB enum: GL_DRAW_BUFFER13_ARB enum: GL_DRAW_BUFFER14_ARB enum: GL_DRAW_BUFFER15_ARB enum: GL_TEXTURE_RECTANGLE_ARB enum: GL_TEXTURE_BINDING_RECTANGLE_ARB enum: GL_PROXY_TEXTURE_RECTANGLE_ARB enum: GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB enum: GL_RGBA_FLOAT_MODE_ARB enum: GL_CLAMP_VERTEX_COLOR_ARB enum: GL_CLAMP_FRAGMENT_COLOR_ARB enum: GL_CLAMP_READ_COLOR_ARB enum: GL_FIXED_ONLY_ARB enum: GL_HALF_FLOAT_ARB enum: GL_TEXTURE_RED_TYPE_ARB enum: GL_TEXTURE_GREEN_TYPE_ARB enum: GL_TEXTURE_BLUE_TYPE_ARB enum: GL_TEXTURE_ALPHA_TYPE_ARB enum: GL_TEXTURE_LUMINANCE_TYPE_ARB enum: GL_TEXTURE_INTENSITY_TYPE_ARB enum: GL_TEXTURE_DEPTH_TYPE_ARB enum: GL_UNSIGNED_NORMALIZED_ARB enum: GL_RGBA32F_ARB enum: GL_RGB32F_ARB enum: GL_ALPHA32F_ARB enum: GL_INTENSITY32F_ARB enum: GL_LUMINANCE32F_ARB enum: GL_LUMINANCE_ALPHA32F_ARB enum: GL_RGBA16F_ARB enum: GL_RGB16F_ARB enum: GL_ALPHA16F_ARB enum: GL_INTENSITY16F_ARB enum: GL_LUMINANCE16F_ARB enum: GL_LUMINANCE_ALPHA16F_ARB enum: GL_PIXEL_PACK_BUFFER_ARB enum: GL_PIXEL_UNPACK_BUFFER_ARB enum: GL_PIXEL_PACK_BUFFER_BINDING_ARB enum: GL_PIXEL_UNPACK_BUFFER_BINDING_ARB enum: GL_DEPTH_COMPONENT32F enum: GL_DEPTH32F_STENCIL8 enum: GL_FLOAT_32_UNSIGNED_INT_24_8_REV enum: GL_INVALID_FRAMEBUFFER_OPERATION enum: GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING enum: GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE enum: GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE enum: GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE enum: GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE enum: GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE enum: GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE enum: GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE enum: GL_FRAMEBUFFER_DEFAULT enum: GL_FRAMEBUFFER_UNDEFINED enum: GL_DEPTH_STENCIL_ATTACHMENT enum: GL_MAX_RENDERBUFFER_SIZE enum: GL_DEPTH_STENCIL enum: GL_UNSIGNED_INT_24_8 enum: GL_DEPTH24_STENCIL8 enum: GL_TEXTURE_STENCIL_SIZE enum: GL_TEXTURE_RED_TYPE enum: GL_TEXTURE_GREEN_TYPE enum: GL_TEXTURE_BLUE_TYPE enum: GL_TEXTURE_ALPHA_TYPE enum: GL_TEXTURE_DEPTH_TYPE enum: GL_UNSIGNED_NORMALIZED enum: GL_FRAMEBUFFER_BINDING enum: GL_DRAW_FRAMEBUFFER_BINDING enum: GL_RENDERBUFFER_BINDING enum: GL_READ_FRAMEBUFFER enum: GL_DRAW_FRAMEBUFFER enum: GL_READ_FRAMEBUFFER_BINDING enum: GL_RENDERBUFFER_SAMPLES enum: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE enum: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER enum: GL_FRAMEBUFFER_COMPLETE enum: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT enum: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT enum: GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER enum: GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER enum: GL_FRAMEBUFFER_UNSUPPORTED enum: GL_MAX_COLOR_ATTACHMENTS enum: GL_COLOR_ATTACHMENT0 enum: GL_COLOR_ATTACHMENT1 enum: GL_COLOR_ATTACHMENT2 enum: GL_COLOR_ATTACHMENT3 enum: GL_COLOR_ATTACHMENT4 enum: GL_COLOR_ATTACHMENT5 enum: GL_COLOR_ATTACHMENT6 enum: GL_COLOR_ATTACHMENT7 enum: GL_COLOR_ATTACHMENT8 enum: GL_COLOR_ATTACHMENT9 enum: GL_COLOR_ATTACHMENT10 enum: GL_COLOR_ATTACHMENT11 enum: GL_COLOR_ATTACHMENT12 enum: GL_COLOR_ATTACHMENT13 enum: GL_COLOR_ATTACHMENT14 enum: GL_COLOR_ATTACHMENT15 enum: GL_DEPTH_ATTACHMENT enum: GL_STENCIL_ATTACHMENT enum: GL_FRAMEBUFFER enum: GL_RENDERBUFFER enum: GL_RENDERBUFFER_WIDTH enum: GL_RENDERBUFFER_HEIGHT enum: GL_RENDERBUFFER_INTERNAL_FORMAT enum: GL_STENCIL_INDEX1 enum: GL_STENCIL_INDEX4 enum: GL_STENCIL_INDEX8 enum: GL_STENCIL_INDEX16 enum: GL_RENDERBUFFER_RED_SIZE enum: GL_RENDERBUFFER_GREEN_SIZE enum: GL_RENDERBUFFER_BLUE_SIZE enum: GL_RENDERBUFFER_ALPHA_SIZE enum: GL_RENDERBUFFER_DEPTH_SIZE enum: GL_RENDERBUFFER_STENCIL_SIZE enum: GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE enum: GL_MAX_SAMPLES enum: GL_INDEX enum: GL_TEXTURE_LUMINANCE_TYPE enum: GL_TEXTURE_INTENSITY_TYPE enum: GL_FRAMEBUFFER_SRGB enum: GL_LINES_ADJACENCY_ARB enum: GL_LINE_STRIP_ADJACENCY_ARB enum: GL_TRIANGLES_ADJACENCY_ARB enum: GL_TRIANGLE_STRIP_ADJACENCY_ARB enum: GL_PROGRAM_POINT_SIZE_ARB enum: GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB enum: GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB enum: GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB enum: GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB enum: GL_GEOMETRY_SHADER_ARB enum: GL_GEOMETRY_VERTICES_OUT_ARB enum: GL_GEOMETRY_INPUT_TYPE_ARB enum: GL_GEOMETRY_OUTPUT_TYPE_ARB enum: GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB enum: GL_MAX_VERTEX_VARYING_COMPONENTS_ARB enum: GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB enum: GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB enum: GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB enum: GL_HALF_FLOAT enum: GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB enum: GL_MAP_READ_BIT enum: GL_MAP_WRITE_BIT enum: GL_MAP_INVALIDATE_RANGE_BIT enum: GL_MAP_INVALIDATE_BUFFER_BIT enum: GL_MAP_FLUSH_EXPLICIT_BIT enum: GL_MAP_UNSYNCHRONIZED_BIT enum: GL_TEXTURE_BUFFER_ARB enum: GL_MAX_TEXTURE_BUFFER_SIZE_ARB enum: GL_TEXTURE_BINDING_BUFFER_ARB enum: GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB enum: GL_TEXTURE_BUFFER_FORMAT_ARB enum: GL_COMPRESSED_RED_RGTC1 enum: GL_COMPRESSED_SIGNED_RED_RGTC1 enum: GL_COMPRESSED_RG_RGTC2 enum: GL_COMPRESSED_SIGNED_RG_RGTC2 enum: GL_RG enum: GL_RG_INTEGER enum: GL_R8 enum: GL_R16 enum: GL_RG8 enum: GL_RG16 enum: GL_R16F enum: GL_R32F enum: GL_RG16F enum: GL_RG32F enum: GL_R8I enum: GL_R8UI enum: GL_R16I enum: GL_R16UI enum: GL_R32I enum: GL_R32UI enum: GL_RG8I enum: GL_RG8UI enum: GL_RG16I enum: GL_RG16UI enum: GL_RG32I enum: GL_RG32UI enum: GL_VERTEX_ARRAY_BINDING enum: GL_UNIFORM_BUFFER enum: GL_UNIFORM_BUFFER_BINDING enum: GL_UNIFORM_BUFFER_START enum: GL_UNIFORM_BUFFER_SIZE enum: GL_MAX_VERTEX_UNIFORM_BLOCKS enum: GL_MAX_GEOMETRY_UNIFORM_BLOCKS enum: GL_MAX_FRAGMENT_UNIFORM_BLOCKS enum: GL_MAX_COMBINED_UNIFORM_BLOCKS enum: GL_MAX_UNIFORM_BUFFER_BINDINGS enum: GL_MAX_UNIFORM_BLOCK_SIZE enum: GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS enum: GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS enum: GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS enum: GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT enum: GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH enum: GL_ACTIVE_UNIFORM_BLOCKS enum: GL_UNIFORM_TYPE enum: GL_UNIFORM_SIZE enum: GL_UNIFORM_NAME_LENGTH enum: GL_UNIFORM_BLOCK_INDEX enum: GL_UNIFORM_OFFSET enum: GL_UNIFORM_ARRAY_STRIDE enum: GL_UNIFORM_MATRIX_STRIDE enum: GL_UNIFORM_IS_ROW_MAJOR enum: GL_UNIFORM_BLOCK_BINDING enum: GL_UNIFORM_BLOCK_DATA_SIZE enum: GL_UNIFORM_BLOCK_NAME_LENGTH enum: GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS enum: GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES enum: GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER enum: GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER enum: GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER enum: GL_INVALID_INDEX enum: GL_COPY_READ_BUFFER_BINDING enum: GL_COPY_READ_BUFFER enum: GL_COPY_WRITE_BUFFER_BINDING enum: GL_COPY_WRITE_BUFFER enum: GL_DEPTH_CLAMP enum: GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION enum: GL_FIRST_VERTEX_CONVENTION enum: GL_LAST_VERTEX_CONVENTION enum: GL_PROVOKING_VERTEX enum: GL_TEXTURE_CUBE_MAP_SEAMLESS enum: GL_MAX_SERVER_WAIT_TIMEOUT enum: GL_OBJECT_TYPE enum: GL_SYNC_CONDITION enum: GL_SYNC_STATUS enum: GL_SYNC_FLAGS enum: GL_SYNC_FENCE enum: GL_SYNC_GPU_COMMANDS_COMPLETE enum: GL_UNSIGNALED enum: GL_SIGNALED enum: GL_ALREADY_SIGNALED enum: GL_TIMEOUT_EXPIRED enum: GL_CONDITION_SATISFIED enum: GL_WAIT_FAILED enum: GL_SYNC_FLUSH_COMMANDS_BIT enum: GL_TIMEOUT_IGNORED enum: GL_SAMPLE_POSITION enum: GL_SAMPLE_MASK enum: GL_SAMPLE_MASK_VALUE enum: GL_MAX_SAMPLE_MASK_WORDS enum: GL_TEXTURE_2D_MULTISAMPLE enum: GL_PROXY_TEXTURE_2D_MULTISAMPLE enum: GL_TEXTURE_2D_MULTISAMPLE_ARRAY enum: GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY enum: GL_TEXTURE_BINDING_2D_MULTISAMPLE enum: GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY enum: GL_TEXTURE_SAMPLES enum: GL_TEXTURE_FIXED_SAMPLE_LOCATIONS enum: GL_SAMPLER_2D_MULTISAMPLE enum: GL_INT_SAMPLER_2D_MULTISAMPLE enum: GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE enum: GL_SAMPLER_2D_MULTISAMPLE_ARRAY enum: GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY enum: GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY enum: GL_MAX_COLOR_TEXTURE_SAMPLES enum: GL_MAX_DEPTH_TEXTURE_SAMPLES enum: GL_MAX_INTEGER_SAMPLES enum: GL_SAMPLE_SHADING_ARB enum: GL_MIN_SAMPLE_SHADING_VALUE_ARB enum: GL_TEXTURE_CUBE_MAP_ARRAY_ARB enum: GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB enum: GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB enum: GL_SAMPLER_CUBE_MAP_ARRAY_ARB enum: GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB enum: GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB enum: GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB enum: GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB enum: GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB enum: GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB enum: GL_SHADER_INCLUDE_ARB enum: GL_NAMED_STRING_LENGTH_ARB enum: GL_NAMED_STRING_TYPE_ARB enum: GL_COMPRESSED_RGBA_BPTC_UNORM_ARB enum: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB enum: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB enum: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB enum: GL_SRC1_COLOR enum: GL_ONE_MINUS_SRC1_COLOR enum: GL_ONE_MINUS_SRC1_ALPHA enum: GL_MAX_DUAL_SOURCE_DRAW_BUFFERS enum: GL_ANY_SAMPLES_PASSED enum: GL_SAMPLER_BINDING enum: GL_RGB10_A2UI enum: GL_TEXTURE_SWIZZLE_R enum: GL_TEXTURE_SWIZZLE_G enum: GL_TEXTURE_SWIZZLE_B enum: GL_TEXTURE_SWIZZLE_A enum: GL_TEXTURE_SWIZZLE_RGBA enum: GL_TIME_ELAPSED enum: GL_TIMESTAMP enum: GL_INT_2_10_10_10_REV enum: GL_DRAW_INDIRECT_BUFFER enum: GL_DRAW_INDIRECT_BUFFER_BINDING enum: GL_GEOMETRY_SHADER_INVOCATIONS enum: GL_MAX_GEOMETRY_SHADER_INVOCATIONS enum: GL_MIN_FRAGMENT_INTERPOLATION_OFFSET enum: GL_MAX_FRAGMENT_INTERPOLATION_OFFSET enum: GL_FRAGMENT_INTERPOLATION_OFFSET_BITS enum: GL_DOUBLE_VEC2 enum: GL_DOUBLE_VEC3 enum: GL_DOUBLE_VEC4 enum: GL_DOUBLE_MAT2 enum: GL_DOUBLE_MAT3 enum: GL_DOUBLE_MAT4 enum: GL_DOUBLE_MAT2x3 enum: GL_DOUBLE_MAT2x4 enum: GL_DOUBLE_MAT3x2 enum: GL_DOUBLE_MAT3x4 enum: GL_DOUBLE_MAT4x2 enum: GL_DOUBLE_MAT4x3 enum: GL_ACTIVE_SUBROUTINES enum: GL_ACTIVE_SUBROUTINE_UNIFORMS enum: GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS enum: GL_ACTIVE_SUBROUTINE_MAX_LENGTH enum: GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH enum: GL_MAX_SUBROUTINES enum: GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS enum: GL_NUM_COMPATIBLE_SUBROUTINES enum: GL_COMPATIBLE_SUBROUTINES enum: GL_PATCHES enum: GL_PATCH_VERTICES enum: GL_PATCH_DEFAULT_INNER_LEVEL enum: GL_PATCH_DEFAULT_OUTER_LEVEL enum: GL_TESS_CONTROL_OUTPUT_VERTICES enum: GL_TESS_GEN_MODE enum: GL_TESS_GEN_SPACING enum: GL_TESS_GEN_VERTEX_ORDER enum: GL_TESS_GEN_POINT_MODE enum: GL_ISOLINES enum: GL_FRACTIONAL_ODD enum: GL_FRACTIONAL_EVEN enum: GL_MAX_PATCH_VERTICES enum: GL_MAX_TESS_GEN_LEVEL enum: GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS enum: GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS enum: GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS enum: GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS enum: GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS enum: GL_MAX_TESS_PATCH_COMPONENTS enum: GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS enum: GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS enum: GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS enum: GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS enum: GL_MAX_TESS_CONTROL_INPUT_COMPONENTS enum: GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS enum: GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS enum: GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS enum: GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER enum: GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER enum: GL_TESS_EVALUATION_SHADER enum: GL_TESS_CONTROL_SHADER enum: GL_TRANSFORM_FEEDBACK enum: GL_TRANSFORM_FEEDBACK_PAUSED enum: GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED enum: GL_TRANSFORM_FEEDBACK_ACTIVE enum: GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE enum: GL_TRANSFORM_FEEDBACK_BINDING enum: GL_MAX_TRANSFORM_FEEDBACK_BUFFERS enum: GL_MAX_VERTEX_STREAMS enum: GL_FIXED enum: GL_IMPLEMENTATION_COLOR_READ_TYPE enum: GL_IMPLEMENTATION_COLOR_READ_FORMAT enum: GL_LOW_FLOAT enum: GL_MEDIUM_FLOAT enum: GL_HIGH_FLOAT enum: GL_LOW_INT enum: GL_MEDIUM_INT enum: GL_HIGH_INT enum: GL_SHADER_COMPILER enum: GL_SHADER_BINARY_FORMATS enum: GL_NUM_SHADER_BINARY_FORMATS enum: GL_MAX_VERTEX_UNIFORM_VECTORS enum: GL_MAX_VARYING_VECTORS enum: GL_MAX_FRAGMENT_UNIFORM_VECTORS enum: GL_RGB565 enum: GL_PROGRAM_BINARY_RETRIEVABLE_HINT enum: GL_PROGRAM_BINARY_LENGTH enum: GL_NUM_PROGRAM_BINARY_FORMATS enum: GL_PROGRAM_BINARY_FORMATS enum: GL_VERTEX_SHADER_BIT enum: GL_FRAGMENT_SHADER_BIT enum: GL_GEOMETRY_SHADER_BIT enum: GL_TESS_CONTROL_SHADER_BIT enum: GL_TESS_EVALUATION_SHADER_BIT enum: GL_ALL_SHADER_BITS enum: GL_PROGRAM_SEPARABLE enum: GL_ACTIVE_PROGRAM enum: GL_PROGRAM_PIPELINE_BINDING enum: GL_MAX_VIEWPORTS enum: GL_VIEWPORT_SUBPIXEL_BITS enum: GL_VIEWPORT_BOUNDS_RANGE enum: GL_LAYER_PROVOKING_VERTEX enum: GL_VIEWPORT_INDEX_PROVOKING_VERTEX enum: GL_UNDEFINED_VERTEX enum: GL_SYNC_CL_EVENT_ARB enum: GL_SYNC_CL_EVENT_COMPLETE_ARB enum: GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB enum: GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB enum: GL_DEBUG_CALLBACK_FUNCTION_ARB enum: GL_DEBUG_CALLBACK_USER_PARAM_ARB enum: GL_DEBUG_SOURCE_API_ARB enum: GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB enum: GL_DEBUG_SOURCE_SHADER_COMPILER_ARB enum: GL_DEBUG_SOURCE_THIRD_PARTY_ARB enum: GL_DEBUG_SOURCE_APPLICATION_ARB enum: GL_DEBUG_SOURCE_OTHER_ARB enum: GL_DEBUG_TYPE_ERROR_ARB enum: GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB enum: GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB enum: GL_DEBUG_TYPE_PORTABILITY_ARB enum: GL_DEBUG_TYPE_PERFORMANCE_ARB enum: GL_DEBUG_TYPE_OTHER_ARB enum: GL_MAX_DEBUG_MESSAGE_LENGTH_ARB enum: GL_MAX_DEBUG_LOGGED_MESSAGES_ARB enum: GL_DEBUG_LOGGED_MESSAGES_ARB enum: GL_DEBUG_SEVERITY_HIGH_ARB enum: GL_DEBUG_SEVERITY_MEDIUM_ARB enum: GL_DEBUG_SEVERITY_LOW_ARB enum: GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB enum: GL_LOSE_CONTEXT_ON_RESET_ARB enum: GL_GUILTY_CONTEXT_RESET_ARB enum: GL_INNOCENT_CONTEXT_RESET_ARB enum: GL_UNKNOWN_CONTEXT_RESET_ARB enum: GL_RESET_NOTIFICATION_STRATEGY_ARB enum: GL_NO_RESET_NOTIFICATION_ARB enum: GL_UNPACK_COMPRESSED_BLOCK_WIDTH enum: GL_UNPACK_COMPRESSED_BLOCK_HEIGHT enum: GL_UNPACK_COMPRESSED_BLOCK_DEPTH enum: GL_UNPACK_COMPRESSED_BLOCK_SIZE enum: GL_PACK_COMPRESSED_BLOCK_WIDTH enum: GL_PACK_COMPRESSED_BLOCK_HEIGHT enum: GL_PACK_COMPRESSED_BLOCK_DEPTH enum: GL_PACK_COMPRESSED_BLOCK_SIZE enum: GL_NUM_SAMPLE_COUNTS enum: GL_MIN_MAP_BUFFER_ALIGNMENT enum: GL_ATOMIC_COUNTER_BUFFER enum: GL_ATOMIC_COUNTER_BUFFER_BINDING enum: GL_ATOMIC_COUNTER_BUFFER_START enum: GL_ATOMIC_COUNTER_BUFFER_SIZE enum: GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE enum: GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS enum: GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER enum: GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_VERTEX_ATOMIC_COUNTERS enum: GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS enum: GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS enum: GL_MAX_GEOMETRY_ATOMIC_COUNTERS enum: GL_MAX_FRAGMENT_ATOMIC_COUNTERS enum: GL_MAX_COMBINED_ATOMIC_COUNTERS enum: GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE enum: GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS enum: GL_ACTIVE_ATOMIC_COUNTER_BUFFERS enum: GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX enum: GL_UNSIGNED_INT_ATOMIC_COUNTER enum: GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT enum: GL_ELEMENT_ARRAY_BARRIER_BIT enum: GL_UNIFORM_BARRIER_BIT enum: GL_TEXTURE_FETCH_BARRIER_BIT enum: GL_SHADER_IMAGE_ACCESS_BARRIER_BIT enum: GL_COMMAND_BARRIER_BIT enum: GL_PIXEL_BUFFER_BARRIER_BIT enum: GL_TEXTURE_UPDATE_BARRIER_BIT enum: GL_BUFFER_UPDATE_BARRIER_BIT enum: GL_FRAMEBUFFER_BARRIER_BIT enum: GL_TRANSFORM_FEEDBACK_BARRIER_BIT enum: GL_ATOMIC_COUNTER_BARRIER_BIT enum: GL_ALL_BARRIER_BITS enum: GL_MAX_IMAGE_UNITS enum: GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS enum: GL_IMAGE_BINDING_NAME enum: GL_IMAGE_BINDING_LEVEL enum: GL_IMAGE_BINDING_LAYERED enum: GL_IMAGE_BINDING_LAYER enum: GL_IMAGE_BINDING_ACCESS enum: GL_IMAGE_1D enum: GL_IMAGE_2D enum: GL_IMAGE_3D enum: GL_IMAGE_2D_RECT enum: GL_IMAGE_CUBE enum: GL_IMAGE_BUFFER enum: GL_IMAGE_1D_ARRAY enum: GL_IMAGE_2D_ARRAY enum: GL_IMAGE_CUBE_MAP_ARRAY enum: GL_IMAGE_2D_MULTISAMPLE enum: GL_IMAGE_2D_MULTISAMPLE_ARRAY enum: GL_INT_IMAGE_1D enum: GL_INT_IMAGE_2D enum: GL_INT_IMAGE_3D enum: GL_INT_IMAGE_2D_RECT enum: GL_INT_IMAGE_CUBE enum: GL_INT_IMAGE_BUFFER enum: GL_INT_IMAGE_1D_ARRAY enum: GL_INT_IMAGE_2D_ARRAY enum: GL_INT_IMAGE_CUBE_MAP_ARRAY enum: GL_INT_IMAGE_2D_MULTISAMPLE enum: GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY enum: GL_UNSIGNED_INT_IMAGE_1D enum: GL_UNSIGNED_INT_IMAGE_2D enum: GL_UNSIGNED_INT_IMAGE_3D enum: GL_UNSIGNED_INT_IMAGE_2D_RECT enum: GL_UNSIGNED_INT_IMAGE_CUBE enum: GL_UNSIGNED_INT_IMAGE_BUFFER enum: GL_UNSIGNED_INT_IMAGE_1D_ARRAY enum: GL_UNSIGNED_INT_IMAGE_2D_ARRAY enum: GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY enum: GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE enum: GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY enum: GL_MAX_IMAGE_SAMPLES enum: GL_IMAGE_BINDING_FORMAT enum: GL_IMAGE_FORMAT_COMPATIBILITY_TYPE enum: GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE enum: GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS enum: GL_MAX_VERTEX_IMAGE_UNIFORMS enum: GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS enum: GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS enum: GL_MAX_GEOMETRY_IMAGE_UNIFORMS enum: GL_MAX_FRAGMENT_IMAGE_UNIFORMS enum: GL_MAX_COMBINED_IMAGE_UNIFORMS enum: GL_TEXTURE_IMMUTABLE_FORMAT enum: GL_COMPRESSED_RGBA_ASTC_4x4_KHR enum: GL_COMPRESSED_RGBA_ASTC_5x4_KHR enum: GL_COMPRESSED_RGBA_ASTC_5x5_KHR enum: GL_COMPRESSED_RGBA_ASTC_6x5_KHR enum: GL_COMPRESSED_RGBA_ASTC_6x6_KHR enum: GL_COMPRESSED_RGBA_ASTC_8x5_KHR enum: GL_COMPRESSED_RGBA_ASTC_8x6_KHR enum: GL_COMPRESSED_RGBA_ASTC_8x8_KHR enum: GL_COMPRESSED_RGBA_ASTC_10x5_KHR enum: GL_COMPRESSED_RGBA_ASTC_10x6_KHR enum: GL_COMPRESSED_RGBA_ASTC_10x8_KHR enum: GL_COMPRESSED_RGBA_ASTC_10x10_KHR enum: GL_COMPRESSED_RGBA_ASTC_12x10_KHR enum: GL_COMPRESSED_RGBA_ASTC_12x12_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR enum: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR enum: GL_DEBUG_OUTPUT_SYNCHRONOUS enum: GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH enum: GL_DEBUG_CALLBACK_FUNCTION enum: GL_DEBUG_CALLBACK_USER_PARAM enum: GL_DEBUG_SOURCE_API enum: GL_DEBUG_SOURCE_WINDOW_SYSTEM enum: GL_DEBUG_SOURCE_SHADER_COMPILER enum: GL_DEBUG_SOURCE_THIRD_PARTY enum: GL_DEBUG_SOURCE_APPLICATION enum: GL_DEBUG_SOURCE_OTHER enum: GL_DEBUG_TYPE_ERROR enum: GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR enum: GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR enum: GL_DEBUG_TYPE_PORTABILITY enum: GL_DEBUG_TYPE_PERFORMANCE enum: GL_DEBUG_TYPE_OTHER enum: GL_DEBUG_TYPE_MARKER enum: GL_DEBUG_TYPE_PUSH_GROUP enum: GL_DEBUG_TYPE_POP_GROUP enum: GL_DEBUG_SEVERITY_NOTIFICATION enum: GL_MAX_DEBUG_GROUP_STACK_DEPTH enum: GL_DEBUG_GROUP_STACK_DEPTH enum: GL_BUFFER enum: GL_SHADER enum: GL_PROGRAM enum: GL_QUERY enum: GL_PROGRAM_PIPELINE enum: GL_SAMPLER enum: GL_DISPLAY_LIST enum: GL_MAX_LABEL_LENGTH enum: GL_MAX_DEBUG_MESSAGE_LENGTH enum: GL_MAX_DEBUG_LOGGED_MESSAGES enum: GL_DEBUG_LOGGED_MESSAGES enum: GL_DEBUG_SEVERITY_HIGH enum: GL_DEBUG_SEVERITY_MEDIUM enum: GL_DEBUG_SEVERITY_LOW enum: GL_DEBUG_OUTPUT enum: GL_CONTEXT_FLAG_DEBUG_BIT enum: GL_COMPUTE_SHADER enum: GL_MAX_COMPUTE_UNIFORM_BLOCKS enum: GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS enum: GL_MAX_COMPUTE_IMAGE_UNIFORMS enum: GL_MAX_COMPUTE_SHARED_MEMORY_SIZE enum: GL_MAX_COMPUTE_UNIFORM_COMPONENTS enum: GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS enum: GL_MAX_COMPUTE_ATOMIC_COUNTERS enum: GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS enum: GL_MAX_COMPUTE_LOCAL_INVOCATIONS enum: GL_MAX_COMPUTE_WORK_GROUP_COUNT enum: GL_MAX_COMPUTE_WORK_GROUP_SIZE enum: GL_COMPUTE_LOCAL_WORK_SIZE enum: GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER enum: GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER enum: GL_DISPATCH_INDIRECT_BUFFER enum: GL_DISPATCH_INDIRECT_BUFFER_BINDING enum: GL_COMPUTE_SHADER_BIT enum: GL_TEXTURE_VIEW_MIN_LEVEL enum: GL_TEXTURE_VIEW_NUM_LEVELS enum: GL_TEXTURE_VIEW_MIN_LAYER enum: GL_TEXTURE_VIEW_NUM_LAYERS enum: GL_TEXTURE_IMMUTABLE_LEVELS enum: GL_VERTEX_ATTRIB_BINDING enum: GL_VERTEX_ATTRIB_RELATIVE_OFFSET enum: GL_VERTEX_BINDING_DIVISOR enum: GL_VERTEX_BINDING_OFFSET enum: GL_VERTEX_BINDING_STRIDE enum: GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET enum: GL_MAX_VERTEX_ATTRIB_BINDINGS enum: GL_COMPRESSED_RGB8_ETC2 enum: GL_COMPRESSED_SRGB8_ETC2 enum: GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 enum: GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 enum: GL_COMPRESSED_RGBA8_ETC2_EAC enum: GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC enum: GL_COMPRESSED_R11_EAC enum: GL_COMPRESSED_SIGNED_R11_EAC enum: GL_COMPRESSED_RG11_EAC enum: GL_COMPRESSED_SIGNED_RG11_EAC enum: GL_PRIMITIVE_RESTART_FIXED_INDEX enum: GL_ANY_SAMPLES_PASSED_CONSERVATIVE enum: GL_MAX_ELEMENT_INDEX enum: GL_MAX_UNIFORM_LOCATIONS enum: GL_FRAMEBUFFER_DEFAULT_WIDTH enum: GL_FRAMEBUFFER_DEFAULT_HEIGHT enum: GL_FRAMEBUFFER_DEFAULT_LAYERS enum: GL_FRAMEBUFFER_DEFAULT_SAMPLES enum: GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS enum: GL_MAX_FRAMEBUFFER_WIDTH enum: GL_MAX_FRAMEBUFFER_HEIGHT enum: GL_MAX_FRAMEBUFFER_LAYERS enum: GL_MAX_FRAMEBUFFER_SAMPLES enum: GL_INTERNALFORMAT_SUPPORTED enum: GL_INTERNALFORMAT_PREFERRED enum: GL_INTERNALFORMAT_RED_SIZE enum: GL_INTERNALFORMAT_GREEN_SIZE enum: GL_INTERNALFORMAT_BLUE_SIZE enum: GL_INTERNALFORMAT_ALPHA_SIZE enum: GL_INTERNALFORMAT_DEPTH_SIZE enum: GL_INTERNALFORMAT_STENCIL_SIZE enum: GL_INTERNALFORMAT_SHARED_SIZE enum: GL_INTERNALFORMAT_RED_TYPE enum: GL_INTERNALFORMAT_GREEN_TYPE enum: GL_INTERNALFORMAT_BLUE_TYPE enum: GL_INTERNALFORMAT_ALPHA_TYPE enum: GL_INTERNALFORMAT_DEPTH_TYPE enum: GL_INTERNALFORMAT_STENCIL_TYPE enum: GL_MAX_WIDTH enum: GL_MAX_HEIGHT enum: GL_MAX_DEPTH enum: GL_MAX_LAYERS enum: GL_MAX_COMBINED_DIMENSIONS enum: GL_COLOR_COMPONENTS enum: GL_DEPTH_COMPONENTS enum: GL_STENCIL_COMPONENTS enum: GL_COLOR_RENDERABLE enum: GL_DEPTH_RENDERABLE enum: GL_STENCIL_RENDERABLE enum: GL_FRAMEBUFFER_RENDERABLE enum: GL_FRAMEBUFFER_RENDERABLE_LAYERED enum: GL_FRAMEBUFFER_BLEND enum: GL_READ_PIXELS enum: GL_READ_PIXELS_FORMAT enum: GL_READ_PIXELS_TYPE enum: GL_TEXTURE_IMAGE_FORMAT enum: GL_TEXTURE_IMAGE_TYPE enum: GL_GET_TEXTURE_IMAGE_FORMAT enum: GL_GET_TEXTURE_IMAGE_TYPE enum: GL_MIPMAP enum: GL_MANUAL_GENERATE_MIPMAP enum: GL_AUTO_GENERATE_MIPMAP enum: GL_COLOR_ENCODING enum: GL_SRGB_READ enum: GL_SRGB_WRITE enum: GL_SRGB_DECODE_ARB enum: GL_FILTER enum: GL_VERTEX_TEXTURE enum: GL_TESS_CONTROL_TEXTURE enum: GL_TESS_EVALUATION_TEXTURE enum: GL_GEOMETRY_TEXTURE enum: GL_FRAGMENT_TEXTURE enum: GL_COMPUTE_TEXTURE enum: GL_TEXTURE_SHADOW enum: GL_TEXTURE_GATHER enum: GL_TEXTURE_GATHER_SHADOW enum: GL_SHADER_IMAGE_LOAD enum: GL_SHADER_IMAGE_STORE enum: GL_SHADER_IMAGE_ATOMIC enum: GL_IMAGE_TEXEL_SIZE enum: GL_IMAGE_COMPATIBILITY_CLASS enum: GL_IMAGE_PIXEL_FORMAT enum: GL_IMAGE_PIXEL_TYPE enum: GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST enum: GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST enum: GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE enum: GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE enum: GL_TEXTURE_COMPRESSED_BLOCK_WIDTH enum: GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT enum: GL_TEXTURE_COMPRESSED_BLOCK_SIZE enum: GL_CLEAR_BUFFER enum: GL_TEXTURE_VIEW enum: GL_VIEW_COMPATIBILITY_CLASS enum: GL_FULL_SUPPORT enum: GL_CAVEAT_SUPPORT enum: GL_IMAGE_CLASS_4_X_32 enum: GL_IMAGE_CLASS_2_X_32 enum: GL_IMAGE_CLASS_1_X_32 enum: GL_IMAGE_CLASS_4_X_16 enum: GL_IMAGE_CLASS_2_X_16 enum: GL_IMAGE_CLASS_1_X_16 enum: GL_IMAGE_CLASS_4_X_8 enum: GL_IMAGE_CLASS_2_X_8 enum: GL_IMAGE_CLASS_1_X_8 enum: GL_IMAGE_CLASS_11_11_10 enum: GL_IMAGE_CLASS_10_10_10_2 enum: GL_VIEW_CLASS_128_BITS enum: GL_VIEW_CLASS_96_BITS enum: GL_VIEW_CLASS_64_BITS enum: GL_VIEW_CLASS_48_BITS enum: GL_VIEW_CLASS_32_BITS enum: GL_VIEW_CLASS_24_BITS enum: GL_VIEW_CLASS_16_BITS enum: GL_VIEW_CLASS_8_BITS enum: GL_VIEW_CLASS_S3TC_DXT1_RGB enum: GL_VIEW_CLASS_S3TC_DXT1_RGBA enum: GL_VIEW_CLASS_S3TC_DXT3_RGBA enum: GL_VIEW_CLASS_S3TC_DXT5_RGBA enum: GL_VIEW_CLASS_RGTC1_RED enum: GL_VIEW_CLASS_RGTC2_RG enum: GL_VIEW_CLASS_BPTC_UNORM enum: GL_VIEW_CLASS_BPTC_FLOAT enum: GL_UNIFORM enum: GL_UNIFORM_BLOCK enum: GL_PROGRAM_INPUT enum: GL_PROGRAM_OUTPUT enum: GL_BUFFER_VARIABLE enum: GL_SHADER_STORAGE_BLOCK enum: GL_VERTEX_SUBROUTINE enum: GL_TESS_CONTROL_SUBROUTINE enum: GL_TESS_EVALUATION_SUBROUTINE enum: GL_GEOMETRY_SUBROUTINE enum: GL_FRAGMENT_SUBROUTINE enum: GL_COMPUTE_SUBROUTINE enum: GL_VERTEX_SUBROUTINE_UNIFORM enum: GL_TESS_CONTROL_SUBROUTINE_UNIFORM enum: GL_TESS_EVALUATION_SUBROUTINE_UNIFORM enum: GL_GEOMETRY_SUBROUTINE_UNIFORM enum: GL_FRAGMENT_SUBROUTINE_UNIFORM enum: GL_COMPUTE_SUBROUTINE_UNIFORM enum: GL_TRANSFORM_FEEDBACK_VARYING enum: GL_ACTIVE_RESOURCES enum: GL_MAX_NAME_LENGTH enum: GL_MAX_NUM_ACTIVE_VARIABLES enum: GL_MAX_NUM_COMPATIBLE_SUBROUTINES enum: GL_NAME_LENGTH enum: GL_TYPE enum: GL_ARRAY_SIZE enum: GL_OFFSET enum: GL_BLOCK_INDEX enum: GL_ARRAY_STRIDE enum: GL_MATRIX_STRIDE enum: GL_IS_ROW_MAJOR enum: GL_ATOMIC_COUNTER_BUFFER_INDEX enum: GL_BUFFER_BINDING enum: GL_BUFFER_DATA_SIZE enum: GL_NUM_ACTIVE_VARIABLES enum: GL_ACTIVE_VARIABLES enum: GL_REFERENCED_BY_VERTEX_SHADER enum: GL_REFERENCED_BY_TESS_CONTROL_SHADER enum: GL_REFERENCED_BY_TESS_EVALUATION_SHADER enum: GL_REFERENCED_BY_GEOMETRY_SHADER enum: GL_REFERENCED_BY_FRAGMENT_SHADER enum: GL_REFERENCED_BY_COMPUTE_SHADER enum: GL_TOP_LEVEL_ARRAY_SIZE enum: GL_TOP_LEVEL_ARRAY_STRIDE enum: GL_LOCATION enum: GL_LOCATION_INDEX enum: GL_IS_PER_PATCH enum: GL_SHADER_STORAGE_BUFFER enum: GL_SHADER_STORAGE_BUFFER_BINDING enum: GL_SHADER_STORAGE_BUFFER_START enum: GL_SHADER_STORAGE_BUFFER_SIZE enum: GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS enum: GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS enum: GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS enum: GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS enum: GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS enum: GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS enum: GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS enum: GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS enum: GL_MAX_SHADER_STORAGE_BLOCK_SIZE enum: GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT enum: GL_SHADER_STORAGE_BARRIER_BIT enum: GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES enum: GL_DEPTH_STENCIL_TEXTURE_MODE enum: GL_TEXTURE_BUFFER_OFFSET enum: GL_TEXTURE_BUFFER_SIZE enum: GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT enum: GL_ABGR_EXT enum: GL_CONSTANT_COLOR_EXT enum: GL_ONE_MINUS_CONSTANT_COLOR_EXT enum: GL_CONSTANT_ALPHA_EXT enum: GL_ONE_MINUS_CONSTANT_ALPHA_EXT enum: GL_BLEND_COLOR_EXT enum: GL_POLYGON_OFFSET_EXT enum: GL_POLYGON_OFFSET_FACTOR_EXT enum: GL_POLYGON_OFFSET_BIAS_EXT enum: GL_ALPHA4_EXT enum: GL_ALPHA8_EXT enum: GL_ALPHA12_EXT enum: GL_ALPHA16_EXT enum: GL_LUMINANCE4_EXT enum: GL_LUMINANCE8_EXT enum: GL_LUMINANCE12_EXT enum: GL_LUMINANCE16_EXT enum: GL_LUMINANCE4_ALPHA4_EXT enum: GL_LUMINANCE6_ALPHA2_EXT enum: GL_LUMINANCE8_ALPHA8_EXT enum: GL_LUMINANCE12_ALPHA4_EXT enum: GL_LUMINANCE12_ALPHA12_EXT enum: GL_LUMINANCE16_ALPHA16_EXT enum: GL_INTENSITY_EXT enum: GL_INTENSITY4_EXT enum: GL_INTENSITY8_EXT enum: GL_INTENSITY12_EXT enum: GL_INTENSITY16_EXT enum: GL_RGB2_EXT enum: GL_RGB4_EXT enum: GL_RGB5_EXT enum: GL_RGB8_EXT enum: GL_RGB10_EXT enum: GL_RGB12_EXT enum: GL_RGB16_EXT enum: GL_RGBA2_EXT enum: GL_RGBA4_EXT enum: GL_RGB5_A1_EXT enum: GL_RGBA8_EXT enum: GL_RGB10_A2_EXT enum: GL_RGBA12_EXT enum: GL_RGBA16_EXT enum: GL_TEXTURE_RED_SIZE_EXT enum: GL_TEXTURE_GREEN_SIZE_EXT enum: GL_TEXTURE_BLUE_SIZE_EXT enum: GL_TEXTURE_ALPHA_SIZE_EXT enum: GL_TEXTURE_LUMINANCE_SIZE_EXT enum: GL_TEXTURE_INTENSITY_SIZE_EXT enum: GL_REPLACE_EXT enum: GL_PROXY_TEXTURE_1D_EXT enum: GL_PROXY_TEXTURE_2D_EXT enum: GL_TEXTURE_TOO_LARGE_EXT enum: GL_PACK_SKIP_IMAGES_EXT enum: GL_PACK_IMAGE_HEIGHT_EXT enum: GL_UNPACK_SKIP_IMAGES_EXT enum: GL_UNPACK_IMAGE_HEIGHT_EXT enum: GL_TEXTURE_3D_EXT enum: GL_PROXY_TEXTURE_3D_EXT enum: GL_TEXTURE_DEPTH_EXT enum: GL_TEXTURE_WRAP_R_EXT enum: GL_MAX_3D_TEXTURE_SIZE_EXT enum: GL_FILTER4_SGIS enum: GL_TEXTURE_FILTER4_SIZE_SGIS enum: GL_HISTOGRAM_EXT enum: GL_PROXY_HISTOGRAM_EXT enum: GL_HISTOGRAM_WIDTH_EXT enum: GL_HISTOGRAM_FORMAT_EXT enum: GL_HISTOGRAM_RED_SIZE_EXT enum: GL_HISTOGRAM_GREEN_SIZE_EXT enum: GL_HISTOGRAM_BLUE_SIZE_EXT enum: GL_HISTOGRAM_ALPHA_SIZE_EXT enum: GL_HISTOGRAM_LUMINANCE_SIZE_EXT enum: GL_HISTOGRAM_SINK_EXT enum: GL_MINMAX_EXT enum: GL_MINMAX_FORMAT_EXT enum: GL_MINMAX_SINK_EXT enum: GL_TABLE_TOO_LARGE_EXT enum: GL_CONVOLUTION_1D_EXT enum: GL_CONVOLUTION_2D_EXT enum: GL_SEPARABLE_2D_EXT enum: GL_CONVOLUTION_BORDER_MODE_EXT enum: GL_CONVOLUTION_FILTER_SCALE_EXT enum: GL_CONVOLUTION_FILTER_BIAS_EXT enum: GL_REDUCE_EXT enum: GL_CONVOLUTION_FORMAT_EXT enum: GL_CONVOLUTION_WIDTH_EXT enum: GL_CONVOLUTION_HEIGHT_EXT enum: GL_MAX_CONVOLUTION_WIDTH_EXT enum: GL_MAX_CONVOLUTION_HEIGHT_EXT enum: GL_POST_CONVOLUTION_RED_SCALE_EXT enum: GL_POST_CONVOLUTION_GREEN_SCALE_EXT enum: GL_POST_CONVOLUTION_BLUE_SCALE_EXT enum: GL_POST_CONVOLUTION_ALPHA_SCALE_EXT enum: GL_POST_CONVOLUTION_RED_BIAS_EXT enum: GL_POST_CONVOLUTION_GREEN_BIAS_EXT enum: GL_POST_CONVOLUTION_BLUE_BIAS_EXT enum: GL_POST_CONVOLUTION_ALPHA_BIAS_EXT enum: GL_COLOR_MATRIX_SGI enum: GL_COLOR_MATRIX_STACK_DEPTH_SGI enum: GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI enum: GL_POST_COLOR_MATRIX_RED_SCALE_SGI enum: GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI enum: GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI enum: GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI enum: GL_POST_COLOR_MATRIX_RED_BIAS_SGI enum: GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI enum: GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI enum: GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI enum: GL_COLOR_TABLE_SGI enum: GL_POST_CONVOLUTION_COLOR_TABLE_SGI enum: GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI enum: GL_PROXY_COLOR_TABLE_SGI enum: GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI enum: GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI enum: GL_COLOR_TABLE_SCALE_SGI enum: GL_COLOR_TABLE_BIAS_SGI enum: GL_COLOR_TABLE_FORMAT_SGI enum: GL_COLOR_TABLE_WIDTH_SGI enum: GL_COLOR_TABLE_RED_SIZE_SGI enum: GL_COLOR_TABLE_GREEN_SIZE_SGI enum: GL_COLOR_TABLE_BLUE_SIZE_SGI enum: GL_COLOR_TABLE_ALPHA_SIZE_SGI enum: GL_COLOR_TABLE_LUMINANCE_SIZE_SGI enum: GL_COLOR_TABLE_INTENSITY_SIZE_SGI enum: GL_PIXEL_TEXTURE_SGIS enum: GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS enum: GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS enum: GL_PIXEL_GROUP_COLOR_SGIS enum: GL_PIXEL_TEX_GEN_SGIX enum: GL_PIXEL_TEX_GEN_MODE_SGIX enum: GL_PACK_SKIP_VOLUMES_SGIS enum: GL_PACK_IMAGE_DEPTH_SGIS enum: GL_UNPACK_SKIP_VOLUMES_SGIS enum: GL_UNPACK_IMAGE_DEPTH_SGIS enum: GL_TEXTURE_4D_SGIS enum: GL_PROXY_TEXTURE_4D_SGIS enum: GL_TEXTURE_4DSIZE_SGIS enum: GL_TEXTURE_WRAP_Q_SGIS enum: GL_MAX_4D_TEXTURE_SIZE_SGIS enum: GL_TEXTURE_4D_BINDING_SGIS enum: GL_TEXTURE_COLOR_TABLE_SGI enum: GL_PROXY_TEXTURE_COLOR_TABLE_SGI enum: GL_CMYK_EXT enum: GL_CMYKA_EXT enum: GL_PACK_CMYK_HINT_EXT enum: GL_UNPACK_CMYK_HINT_EXT enum: GL_TEXTURE_PRIORITY_EXT enum: GL_TEXTURE_RESIDENT_EXT enum: GL_TEXTURE_1D_BINDING_EXT enum: GL_TEXTURE_2D_BINDING_EXT enum: GL_TEXTURE_3D_BINDING_EXT enum: GL_DETAIL_TEXTURE_2D_SGIS enum: GL_DETAIL_TEXTURE_2D_BINDING_SGIS enum: GL_LINEAR_DETAIL_SGIS enum: GL_LINEAR_DETAIL_ALPHA_SGIS enum: GL_LINEAR_DETAIL_COLOR_SGIS enum: GL_DETAIL_TEXTURE_LEVEL_SGIS enum: GL_DETAIL_TEXTURE_MODE_SGIS enum: GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS enum: GL_LINEAR_SHARPEN_SGIS enum: GL_LINEAR_SHARPEN_ALPHA_SGIS enum: GL_LINEAR_SHARPEN_COLOR_SGIS enum: GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS enum: GL_UNSIGNED_BYTE_3_3_2_EXT enum: GL_UNSIGNED_SHORT_4_4_4_4_EXT enum: GL_UNSIGNED_SHORT_5_5_5_1_EXT enum: GL_UNSIGNED_INT_8_8_8_8_EXT enum: GL_UNSIGNED_INT_10_10_10_2_EXT enum: GL_TEXTURE_MIN_LOD_SGIS enum: GL_TEXTURE_MAX_LOD_SGIS enum: GL_TEXTURE_BASE_LEVEL_SGIS enum: GL_TEXTURE_MAX_LEVEL_SGIS enum: GL_MULTISAMPLE_SGIS enum: GL_SAMPLE_ALPHA_TO_MASK_SGIS enum: GL_SAMPLE_ALPHA_TO_ONE_SGIS enum: GL_SAMPLE_MASK_SGIS enum: GL_1PASS_SGIS enum: GL_2PASS_0_SGIS enum: GL_2PASS_1_SGIS enum: GL_4PASS_0_SGIS enum: GL_4PASS_1_SGIS enum: GL_4PASS_2_SGIS enum: GL_4PASS_3_SGIS enum: GL_SAMPLE_BUFFERS_SGIS enum: GL_SAMPLES_SGIS enum: GL_SAMPLE_MASK_VALUE_SGIS enum: GL_SAMPLE_MASK_INVERT_SGIS enum: GL_SAMPLE_PATTERN_SGIS enum: GL_RESCALE_NORMAL_EXT enum: GL_VERTEX_ARRAY_EXT enum: GL_NORMAL_ARRAY_EXT enum: GL_COLOR_ARRAY_EXT enum: GL_INDEX_ARRAY_EXT enum: GL_TEXTURE_COORD_ARRAY_EXT enum: GL_EDGE_FLAG_ARRAY_EXT enum: GL_VERTEX_ARRAY_SIZE_EXT enum: GL_VERTEX_ARRAY_TYPE_EXT enum: GL_VERTEX_ARRAY_STRIDE_EXT enum: GL_VERTEX_ARRAY_COUNT_EXT enum: GL_NORMAL_ARRAY_TYPE_EXT enum: GL_NORMAL_ARRAY_STRIDE_EXT enum: GL_NORMAL_ARRAY_COUNT_EXT enum: GL_COLOR_ARRAY_SIZE_EXT enum: GL_COLOR_ARRAY_TYPE_EXT enum: GL_COLOR_ARRAY_STRIDE_EXT enum: GL_COLOR_ARRAY_COUNT_EXT enum: GL_INDEX_ARRAY_TYPE_EXT enum: GL_INDEX_ARRAY_STRIDE_EXT enum: GL_INDEX_ARRAY_COUNT_EXT enum: GL_TEXTURE_COORD_ARRAY_SIZE_EXT enum: GL_TEXTURE_COORD_ARRAY_TYPE_EXT enum: GL_TEXTURE_COORD_ARRAY_STRIDE_EXT enum: GL_TEXTURE_COORD_ARRAY_COUNT_EXT enum: GL_EDGE_FLAG_ARRAY_STRIDE_EXT enum: GL_EDGE_FLAG_ARRAY_COUNT_EXT enum: GL_VERTEX_ARRAY_POINTER_EXT enum: GL_NORMAL_ARRAY_POINTER_EXT enum: GL_COLOR_ARRAY_POINTER_EXT enum: GL_INDEX_ARRAY_POINTER_EXT enum: GL_TEXTURE_COORD_ARRAY_POINTER_EXT enum: GL_EDGE_FLAG_ARRAY_POINTER_EXT enum: GL_GENERATE_MIPMAP_SGIS enum: GL_GENERATE_MIPMAP_HINT_SGIS enum: GL_LINEAR_CLIPMAP_LINEAR_SGIX enum: GL_TEXTURE_CLIPMAP_CENTER_SGIX enum: GL_TEXTURE_CLIPMAP_FRAME_SGIX enum: GL_TEXTURE_CLIPMAP_OFFSET_SGIX enum: GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX enum: GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX enum: GL_TEXTURE_CLIPMAP_DEPTH_SGIX enum: GL_MAX_CLIPMAP_DEPTH_SGIX enum: GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX enum: GL_NEAREST_CLIPMAP_NEAREST_SGIX enum: GL_NEAREST_CLIPMAP_LINEAR_SGIX enum: GL_LINEAR_CLIPMAP_NEAREST_SGIX enum: GL_TEXTURE_COMPARE_SGIX enum: GL_TEXTURE_COMPARE_OPERATOR_SGIX enum: GL_TEXTURE_LEQUAL_R_SGIX enum: GL_TEXTURE_GEQUAL_R_SGIX enum: GL_CLAMP_TO_EDGE_SGIS enum: GL_CLAMP_TO_BORDER_SGIS enum: GL_FUNC_ADD_EXT enum: GL_MIN_EXT enum: GL_MAX_EXT enum: GL_BLEND_EQUATION_EXT enum: GL_FUNC_SUBTRACT_EXT enum: GL_FUNC_REVERSE_SUBTRACT_EXT enum: GL_INTERLACE_SGIX enum: GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX enum: GL_PIXEL_TILE_CACHE_INCREMENT_SGIX enum: GL_PIXEL_TILE_WIDTH_SGIX enum: GL_PIXEL_TILE_HEIGHT_SGIX enum: GL_PIXEL_TILE_GRID_WIDTH_SGIX enum: GL_PIXEL_TILE_GRID_HEIGHT_SGIX enum: GL_PIXEL_TILE_GRID_DEPTH_SGIX enum: GL_PIXEL_TILE_CACHE_SIZE_SGIX enum: GL_DUAL_ALPHA4_SGIS enum: GL_DUAL_ALPHA8_SGIS enum: GL_DUAL_ALPHA12_SGIS enum: GL_DUAL_ALPHA16_SGIS enum: GL_DUAL_LUMINANCE4_SGIS enum: GL_DUAL_LUMINANCE8_SGIS enum: GL_DUAL_LUMINANCE12_SGIS enum: GL_DUAL_LUMINANCE16_SGIS enum: GL_DUAL_INTENSITY4_SGIS enum: GL_DUAL_INTENSITY8_SGIS enum: GL_DUAL_INTENSITY12_SGIS enum: GL_DUAL_INTENSITY16_SGIS enum: GL_DUAL_LUMINANCE_ALPHA4_SGIS enum: GL_DUAL_LUMINANCE_ALPHA8_SGIS enum: GL_QUAD_ALPHA4_SGIS enum: GL_QUAD_ALPHA8_SGIS enum: GL_QUAD_LUMINANCE4_SGIS enum: GL_QUAD_LUMINANCE8_SGIS enum: GL_QUAD_INTENSITY4_SGIS enum: GL_QUAD_INTENSITY8_SGIS enum: GL_DUAL_TEXTURE_SELECT_SGIS enum: GL_QUAD_TEXTURE_SELECT_SGIS enum: GL_SPRITE_SGIX enum: GL_SPRITE_MODE_SGIX enum: GL_SPRITE_AXIS_SGIX enum: GL_SPRITE_TRANSLATION_SGIX enum: GL_SPRITE_AXIAL_SGIX enum: GL_SPRITE_OBJECT_ALIGNED_SGIX enum: GL_SPRITE_EYE_ALIGNED_SGIX enum: GL_TEXTURE_MULTI_BUFFER_HINT_SGIX enum: GL_POINT_SIZE_MIN_EXT enum: GL_POINT_SIZE_MAX_EXT enum: GL_POINT_FADE_THRESHOLD_SIZE_EXT enum: GL_DISTANCE_ATTENUATION_EXT enum: GL_POINT_SIZE_MIN_SGIS enum: GL_POINT_SIZE_MAX_SGIS enum: GL_POINT_FADE_THRESHOLD_SIZE_SGIS enum: GL_DISTANCE_ATTENUATION_SGIS enum: GL_INSTRUMENT_BUFFER_POINTER_SGIX enum: GL_INSTRUMENT_MEASUREMENTS_SGIX enum: GL_POST_TEXTURE_FILTER_BIAS_SGIX enum: GL_POST_TEXTURE_FILTER_SCALE_SGIX enum: GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX enum: GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX enum: GL_FRAMEZOOM_SGIX enum: GL_FRAMEZOOM_FACTOR_SGIX enum: GL_MAX_FRAMEZOOM_FACTOR_SGIX enum: GL_TEXTURE_DEFORMATION_BIT_SGIX enum: GL_GEOMETRY_DEFORMATION_BIT_SGIX enum: GL_GEOMETRY_DEFORMATION_SGIX enum: GL_TEXTURE_DEFORMATION_SGIX enum: GL_DEFORMATIONS_MASK_SGIX enum: GL_MAX_DEFORMATION_ORDER_SGIX enum: GL_REFERENCE_PLANE_SGIX enum: GL_REFERENCE_PLANE_EQUATION_SGIX enum: GL_DEPTH_COMPONENT16_SGIX enum: GL_DEPTH_COMPONENT24_SGIX enum: GL_DEPTH_COMPONENT32_SGIX enum: GL_FOG_FUNC_SGIS enum: GL_FOG_FUNC_POINTS_SGIS enum: GL_MAX_FOG_FUNC_POINTS_SGIS enum: GL_FOG_OFFSET_SGIX enum: GL_FOG_OFFSET_VALUE_SGIX enum: GL_IMAGE_SCALE_X_HP enum: GL_IMAGE_SCALE_Y_HP enum: GL_IMAGE_TRANSLATE_X_HP enum: GL_IMAGE_TRANSLATE_Y_HP enum: GL_IMAGE_ROTATE_ANGLE_HP enum: GL_IMAGE_ROTATE_ORIGIN_X_HP enum: GL_IMAGE_ROTATE_ORIGIN_Y_HP enum: GL_IMAGE_MAG_FILTER_HP enum: GL_IMAGE_MIN_FILTER_HP enum: GL_IMAGE_CUBIC_WEIGHT_HP enum: GL_CUBIC_HP enum: GL_AVERAGE_HP enum: GL_IMAGE_TRANSFORM_2D_HP enum: GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP enum: GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP enum: GL_IGNORE_BORDER_HP enum: GL_CONSTANT_BORDER_HP enum: GL_REPLICATE_BORDER_HP enum: GL_CONVOLUTION_BORDER_COLOR_HP enum: GL_TEXTURE_ENV_BIAS_SGIX enum: GL_VERTEX_DATA_HINT_PGI enum: GL_VERTEX_CONSISTENT_HINT_PGI enum: GL_MATERIAL_SIDE_HINT_PGI enum: GL_MAX_VERTEX_HINT_PGI enum: GL_COLOR3_BIT_PGI enum: GL_COLOR4_BIT_PGI enum: GL_EDGEFLAG_BIT_PGI enum: GL_INDEX_BIT_PGI enum: GL_MAT_AMBIENT_BIT_PGI enum: GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI enum: GL_MAT_DIFFUSE_BIT_PGI enum: GL_MAT_EMISSION_BIT_PGI enum: GL_MAT_COLOR_INDEXES_BIT_PGI enum: GL_MAT_SHININESS_BIT_PGI enum: GL_MAT_SPECULAR_BIT_PGI enum: GL_NORMAL_BIT_PGI enum: GL_TEXCOORD1_BIT_PGI enum: GL_TEXCOORD2_BIT_PGI enum: GL_TEXCOORD3_BIT_PGI enum: GL_TEXCOORD4_BIT_PGI enum: GL_VERTEX23_BIT_PGI enum: GL_VERTEX4_BIT_PGI enum: GL_PREFER_DOUBLEBUFFER_HINT_PGI enum: GL_CONSERVE_MEMORY_HINT_PGI enum: GL_RECLAIM_MEMORY_HINT_PGI enum: GL_NATIVE_GRAPHICS_HANDLE_PGI enum: GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI enum: GL_NATIVE_GRAPHICS_END_HINT_PGI enum: GL_ALWAYS_FAST_HINT_PGI enum: GL_ALWAYS_SOFT_HINT_PGI enum: GL_ALLOW_DRAW_OBJ_HINT_PGI enum: GL_ALLOW_DRAW_WIN_HINT_PGI enum: GL_ALLOW_DRAW_FRG_HINT_PGI enum: GL_ALLOW_DRAW_MEM_HINT_PGI enum: GL_STRICT_DEPTHFUNC_HINT_PGI enum: GL_STRICT_LIGHTING_HINT_PGI enum: GL_STRICT_SCISSOR_HINT_PGI enum: GL_FULL_STIPPLE_HINT_PGI enum: GL_CLIP_NEAR_HINT_PGI enum: GL_CLIP_FAR_HINT_PGI enum: GL_WIDE_LINE_HINT_PGI enum: GL_BACK_NORMALS_HINT_PGI enum: GL_COLOR_INDEX1_EXT enum: GL_COLOR_INDEX2_EXT enum: GL_COLOR_INDEX4_EXT enum: GL_COLOR_INDEX8_EXT enum: GL_COLOR_INDEX12_EXT enum: GL_COLOR_INDEX16_EXT enum: GL_TEXTURE_INDEX_SIZE_EXT enum: GL_CLIP_VOLUME_CLIPPING_HINT_EXT enum: GL_LIST_PRIORITY_SGIX enum: GL_IR_INSTRUMENT1_SGIX enum: GL_CALLIGRAPHIC_FRAGMENT_SGIX enum: GL_TEXTURE_LOD_BIAS_S_SGIX enum: GL_TEXTURE_LOD_BIAS_T_SGIX enum: GL_TEXTURE_LOD_BIAS_R_SGIX enum: GL_SHADOW_AMBIENT_SGIX enum: GL_INDEX_MATERIAL_EXT enum: GL_INDEX_MATERIAL_PARAMETER_EXT enum: GL_INDEX_MATERIAL_FACE_EXT enum: GL_INDEX_TEST_EXT enum: GL_INDEX_TEST_FUNC_EXT enum: GL_INDEX_TEST_REF_EXT enum: GL_IUI_V2F_EXT enum: GL_IUI_V3F_EXT enum: GL_IUI_N3F_V2F_EXT enum: GL_IUI_N3F_V3F_EXT enum: GL_T2F_IUI_V2F_EXT enum: GL_T2F_IUI_V3F_EXT enum: GL_T2F_IUI_N3F_V2F_EXT enum: GL_T2F_IUI_N3F_V3F_EXT enum: GL_ARRAY_ELEMENT_LOCK_FIRST_EXT enum: GL_ARRAY_ELEMENT_LOCK_COUNT_EXT enum: GL_CULL_VERTEX_EXT enum: GL_CULL_VERTEX_EYE_POSITION_EXT enum: GL_CULL_VERTEX_OBJECT_POSITION_EXT enum: GL_YCRCB_422_SGIX enum: GL_YCRCB_444_SGIX enum: GL_FRAGMENT_LIGHTING_SGIX enum: GL_FRAGMENT_COLOR_MATERIAL_SGIX enum: GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX enum: GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX enum: GL_MAX_FRAGMENT_LIGHTS_SGIX enum: GL_MAX_ACTIVE_LIGHTS_SGIX enum: GL_CURRENT_RASTER_NORMAL_SGIX enum: GL_LIGHT_ENV_MODE_SGIX enum: GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX enum: GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX enum: GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX enum: GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX enum: GL_FRAGMENT_LIGHT0_SGIX enum: GL_FRAGMENT_LIGHT1_SGIX enum: GL_FRAGMENT_LIGHT2_SGIX enum: GL_FRAGMENT_LIGHT3_SGIX enum: GL_FRAGMENT_LIGHT4_SGIX enum: GL_FRAGMENT_LIGHT5_SGIX enum: GL_FRAGMENT_LIGHT6_SGIX enum: GL_FRAGMENT_LIGHT7_SGIX enum: GL_RASTER_POSITION_UNCLIPPED_IBM enum: GL_TEXTURE_LIGHTING_MODE_HP enum: GL_TEXTURE_POST_SPECULAR_HP enum: GL_TEXTURE_PRE_SPECULAR_HP enum: GL_MAX_ELEMENTS_VERTICES_EXT enum: GL_MAX_ELEMENTS_INDICES_EXT enum: GL_PHONG_WIN enum: GL_PHONG_HINT_WIN enum: GL_FOG_SPECULAR_TEXTURE_WIN enum: GL_FRAGMENT_MATERIAL_EXT enum: GL_FRAGMENT_NORMAL_EXT enum: GL_FRAGMENT_COLOR_EXT enum: GL_ATTENUATION_EXT enum: GL_SHADOW_ATTENUATION_EXT enum: GL_TEXTURE_APPLICATION_MODE_EXT enum: GL_TEXTURE_LIGHT_EXT enum: GL_TEXTURE_MATERIAL_FACE_EXT enum: GL_TEXTURE_MATERIAL_PARAMETER_EXT enum: GL_ALPHA_MIN_SGIX enum: GL_ALPHA_MAX_SGIX enum: GL_PIXEL_TEX_GEN_Q_CEILING_SGIX enum: GL_PIXEL_TEX_GEN_Q_ROUND_SGIX enum: GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX enum: GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX enum: GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX enum: GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX enum: GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX enum: GL_BGR_EXT enum: GL_BGRA_EXT enum: GL_ASYNC_MARKER_SGIX enum: GL_ASYNC_TEX_IMAGE_SGIX enum: GL_ASYNC_DRAW_PIXELS_SGIX enum: GL_ASYNC_READ_PIXELS_SGIX enum: GL_MAX_ASYNC_TEX_IMAGE_SGIX enum: GL_MAX_ASYNC_DRAW_PIXELS_SGIX enum: GL_MAX_ASYNC_READ_PIXELS_SGIX enum: GL_ASYNC_HISTOGRAM_SGIX enum: GL_MAX_ASYNC_HISTOGRAM_SGIX enum: GL_PARALLEL_ARRAYS_INTEL enum: GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL enum: GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL enum: GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL enum: GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL enum: GL_OCCLUSION_TEST_HP enum: GL_OCCLUSION_TEST_RESULT_HP enum: GL_PIXEL_TRANSFORM_2D_EXT enum: GL_PIXEL_MAG_FILTER_EXT enum: GL_PIXEL_MIN_FILTER_EXT enum: GL_PIXEL_CUBIC_WEIGHT_EXT enum: GL_CUBIC_EXT enum: GL_AVERAGE_EXT enum: GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT enum: GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT enum: GL_PIXEL_TRANSFORM_2D_MATRIX_EXT enum: GL_SHARED_TEXTURE_PALETTE_EXT enum: GL_LIGHT_MODEL_COLOR_CONTROL_EXT enum: GL_SINGLE_COLOR_EXT enum: GL_SEPARATE_SPECULAR_COLOR_EXT enum: GL_COLOR_SUM_EXT enum: GL_CURRENT_SECONDARY_COLOR_EXT enum: GL_SECONDARY_COLOR_ARRAY_SIZE_EXT enum: GL_SECONDARY_COLOR_ARRAY_TYPE_EXT enum: GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT enum: GL_SECONDARY_COLOR_ARRAY_POINTER_EXT enum: GL_SECONDARY_COLOR_ARRAY_EXT enum: GL_PERTURB_EXT enum: GL_TEXTURE_NORMAL_EXT enum: GL_FOG_COORDINATE_SOURCE_EXT enum: GL_FOG_COORDINATE_EXT enum: GL_FRAGMENT_DEPTH_EXT enum: GL_CURRENT_FOG_COORDINATE_EXT enum: GL_FOG_COORDINATE_ARRAY_TYPE_EXT enum: GL_FOG_COORDINATE_ARRAY_STRIDE_EXT enum: GL_FOG_COORDINATE_ARRAY_POINTER_EXT enum: GL_FOG_COORDINATE_ARRAY_EXT enum: GL_SCREEN_COORDINATES_REND enum: GL_INVERTED_SCREEN_W_REND enum: GL_TANGENT_ARRAY_EXT enum: GL_BINORMAL_ARRAY_EXT enum: GL_CURRENT_TANGENT_EXT enum: GL_CURRENT_BINORMAL_EXT enum: GL_TANGENT_ARRAY_TYPE_EXT enum: GL_TANGENT_ARRAY_STRIDE_EXT enum: GL_BINORMAL_ARRAY_TYPE_EXT enum: GL_BINORMAL_ARRAY_STRIDE_EXT enum: GL_TANGENT_ARRAY_POINTER_EXT enum: GL_BINORMAL_ARRAY_POINTER_EXT enum: GL_MAP1_TANGENT_EXT enum: GL_MAP2_TANGENT_EXT enum: GL_MAP1_BINORMAL_EXT enum: GL_MAP2_BINORMAL_EXT enum: GL_COMBINE_EXT enum: GL_COMBINE_RGB_EXT enum: GL_COMBINE_ALPHA_EXT enum: GL_RGB_SCALE_EXT enum: GL_ADD_SIGNED_EXT enum: GL_INTERPOLATE_EXT enum: GL_CONSTANT_EXT enum: GL_PRIMARY_COLOR_EXT enum: GL_PREVIOUS_EXT enum: GL_SOURCE0_RGB_EXT enum: GL_SOURCE1_RGB_EXT enum: GL_SOURCE2_RGB_EXT enum: GL_SOURCE0_ALPHA_EXT enum: GL_SOURCE1_ALPHA_EXT enum: GL_SOURCE2_ALPHA_EXT enum: GL_OPERAND0_RGB_EXT enum: GL_OPERAND1_RGB_EXT enum: GL_OPERAND2_RGB_EXT enum: GL_OPERAND0_ALPHA_EXT enum: GL_OPERAND1_ALPHA_EXT enum: GL_OPERAND2_ALPHA_EXT enum: GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE enum: GL_TRANSFORM_HINT_APPLE enum: GL_FOG_SCALE_SGIX enum: GL_FOG_SCALE_VALUE_SGIX enum: GL_UNPACK_CONSTANT_DATA_SUNX enum: GL_TEXTURE_CONSTANT_DATA_SUNX enum: GL_GLOBAL_ALPHA_SUN enum: GL_GLOBAL_ALPHA_FACTOR_SUN enum: GL_RESTART_SUN enum: GL_REPLACE_MIDDLE_SUN enum: GL_REPLACE_OLDEST_SUN enum: GL_TRIANGLE_LIST_SUN enum: GL_REPLACEMENT_CODE_SUN enum: GL_REPLACEMENT_CODE_ARRAY_SUN enum: GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN enum: GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN enum: GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN enum: GL_R1UI_V3F_SUN enum: GL_R1UI_C4UB_V3F_SUN enum: GL_R1UI_C3F_V3F_SUN enum: GL_R1UI_N3F_V3F_SUN enum: GL_R1UI_C4F_N3F_V3F_SUN enum: GL_R1UI_T2F_V3F_SUN enum: GL_R1UI_T2F_N3F_V3F_SUN enum: GL_R1UI_T2F_C4F_N3F_V3F_SUN enum: GL_BLEND_DST_RGB_EXT enum: GL_BLEND_SRC_RGB_EXT enum: GL_BLEND_DST_ALPHA_EXT enum: GL_BLEND_SRC_ALPHA_EXT enum: GL_RED_MIN_CLAMP_INGR enum: GL_GREEN_MIN_CLAMP_INGR enum: GL_BLUE_MIN_CLAMP_INGR enum: GL_ALPHA_MIN_CLAMP_INGR enum: GL_RED_MAX_CLAMP_INGR enum: GL_GREEN_MAX_CLAMP_INGR enum: GL_BLUE_MAX_CLAMP_INGR enum: GL_ALPHA_MAX_CLAMP_INGR enum: GL_INTERLACE_READ_INGR enum: GL_INCR_WRAP_EXT enum: GL_DECR_WRAP_EXT enum: GL_422_EXT enum: GL_422_REV_EXT enum: GL_422_AVERAGE_EXT enum: GL_422_REV_AVERAGE_EXT enum: GL_NORMAL_MAP_NV enum: GL_REFLECTION_MAP_NV enum: GL_NORMAL_MAP_EXT enum: GL_REFLECTION_MAP_EXT enum: GL_TEXTURE_CUBE_MAP_EXT enum: GL_TEXTURE_BINDING_CUBE_MAP_EXT enum: GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT enum: GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT enum: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT enum: GL_PROXY_TEXTURE_CUBE_MAP_EXT enum: GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT enum: GL_WRAP_BORDER_SUN enum: GL_MAX_TEXTURE_LOD_BIAS_EXT enum: GL_TEXTURE_FILTER_CONTROL_EXT enum: GL_TEXTURE_LOD_BIAS_EXT enum: GL_TEXTURE_MAX_ANISOTROPY_EXT enum: GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT enum: GL_MODELVIEW0_STACK_DEPTH_EXT enum: GL_MODELVIEW1_STACK_DEPTH_EXT enum: GL_MODELVIEW0_MATRIX_EXT enum: GL_MODELVIEW1_MATRIX_EXT enum: GL_VERTEX_WEIGHTING_EXT enum: GL_MODELVIEW0_EXT enum: GL_MODELVIEW1_EXT enum: GL_CURRENT_VERTEX_WEIGHT_EXT enum: GL_VERTEX_WEIGHT_ARRAY_EXT enum: GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT enum: GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT enum: GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT enum: GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT enum: GL_MAX_SHININESS_NV enum: GL_MAX_SPOT_EXPONENT_NV enum: GL_VERTEX_ARRAY_RANGE_NV enum: GL_VERTEX_ARRAY_RANGE_LENGTH_NV enum: GL_VERTEX_ARRAY_RANGE_VALID_NV enum: GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV enum: GL_VERTEX_ARRAY_RANGE_POINTER_NV enum: GL_REGISTER_COMBINERS_NV enum: GL_VARIABLE_A_NV enum: GL_VARIABLE_B_NV enum: GL_VARIABLE_C_NV enum: GL_VARIABLE_D_NV enum: GL_VARIABLE_E_NV enum: GL_VARIABLE_F_NV enum: GL_VARIABLE_G_NV enum: GL_CONSTANT_COLOR0_NV enum: GL_CONSTANT_COLOR1_NV enum: GL_PRIMARY_COLOR_NV enum: GL_SECONDARY_COLOR_NV enum: GL_SPARE0_NV enum: GL_SPARE1_NV enum: GL_DISCARD_NV enum: GL_E_TIMES_F_NV enum: GL_SPARE0_PLUS_SECONDARY_COLOR_NV enum: GL_UNSIGNED_IDENTITY_NV enum: GL_UNSIGNED_INVERT_NV enum: GL_EXPAND_NORMAL_NV enum: GL_EXPAND_NEGATE_NV enum: GL_HALF_BIAS_NORMAL_NV enum: GL_HALF_BIAS_NEGATE_NV enum: GL_SIGNED_IDENTITY_NV enum: GL_SIGNED_NEGATE_NV enum: GL_SCALE_BY_TWO_NV enum: GL_SCALE_BY_FOUR_NV enum: GL_SCALE_BY_ONE_HALF_NV enum: GL_BIAS_BY_NEGATIVE_ONE_HALF_NV enum: GL_COMBINER_INPUT_NV enum: GL_COMBINER_MAPPING_NV enum: GL_COMBINER_COMPONENT_USAGE_NV enum: GL_COMBINER_AB_DOT_PRODUCT_NV enum: GL_COMBINER_CD_DOT_PRODUCT_NV enum: GL_COMBINER_MUX_SUM_NV enum: GL_COMBINER_SCALE_NV enum: GL_COMBINER_BIAS_NV enum: GL_COMBINER_AB_OUTPUT_NV enum: GL_COMBINER_CD_OUTPUT_NV enum: GL_COMBINER_SUM_OUTPUT_NV enum: GL_MAX_GENERAL_COMBINERS_NV enum: GL_NUM_GENERAL_COMBINERS_NV enum: GL_COLOR_SUM_CLAMP_NV enum: GL_COMBINER0_NV enum: GL_COMBINER1_NV enum: GL_COMBINER2_NV enum: GL_COMBINER3_NV enum: GL_COMBINER4_NV enum: GL_COMBINER5_NV enum: GL_COMBINER6_NV enum: GL_COMBINER7_NV enum: GL_FOG_DISTANCE_MODE_NV enum: GL_EYE_RADIAL_NV enum: GL_EYE_PLANE_ABSOLUTE_NV enum: GL_EMBOSS_LIGHT_NV enum: GL_EMBOSS_CONSTANT_NV enum: GL_EMBOSS_MAP_NV enum: GL_COMBINE4_NV enum: GL_SOURCE3_RGB_NV enum: GL_SOURCE3_ALPHA_NV enum: GL_OPERAND3_RGB_NV enum: GL_OPERAND3_ALPHA_NV enum: GL_COMPRESSED_RGB_S3TC_DXT1_EXT enum: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT enum: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT enum: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT enum: GL_CULL_VERTEX_IBM enum: GL_VERTEX_ARRAY_LIST_IBM enum: GL_NORMAL_ARRAY_LIST_IBM enum: GL_COLOR_ARRAY_LIST_IBM enum: GL_INDEX_ARRAY_LIST_IBM enum: GL_TEXTURE_COORD_ARRAY_LIST_IBM enum: GL_EDGE_FLAG_ARRAY_LIST_IBM enum: GL_FOG_COORDINATE_ARRAY_LIST_IBM enum: GL_SECONDARY_COLOR_ARRAY_LIST_IBM enum: GL_VERTEX_ARRAY_LIST_STRIDE_IBM enum: GL_NORMAL_ARRAY_LIST_STRIDE_IBM enum: GL_COLOR_ARRAY_LIST_STRIDE_IBM enum: GL_INDEX_ARRAY_LIST_STRIDE_IBM enum: GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM enum: GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM enum: GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM enum: GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM enum: GL_PACK_SUBSAMPLE_RATE_SGIX enum: GL_UNPACK_SUBSAMPLE_RATE_SGIX enum: GL_PIXEL_SUBSAMPLE_4444_SGIX enum: GL_PIXEL_SUBSAMPLE_2424_SGIX enum: GL_PIXEL_SUBSAMPLE_4242_SGIX enum: GL_YCRCB_SGIX enum: GL_YCRCBA_SGIX enum: GL_DEPTH_PASS_INSTRUMENT_SGIX enum: GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX enum: GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX enum: GL_COMPRESSED_RGB_FXT1_3DFX enum: GL_COMPRESSED_RGBA_FXT1_3DFX enum: GL_MULTISAMPLE_3DFX enum: GL_SAMPLE_BUFFERS_3DFX enum: GL_SAMPLES_3DFX enum: GL_MULTISAMPLE_BIT_3DFX enum: GL_MULTISAMPLE_EXT enum: GL_SAMPLE_ALPHA_TO_MASK_EXT enum: GL_SAMPLE_ALPHA_TO_ONE_EXT enum: GL_SAMPLE_MASK_EXT enum: GL_1PASS_EXT enum: GL_2PASS_0_EXT enum: GL_2PASS_1_EXT enum: GL_4PASS_0_EXT enum: GL_4PASS_1_EXT enum: GL_4PASS_2_EXT enum: GL_4PASS_3_EXT enum: GL_SAMPLE_BUFFERS_EXT enum: GL_SAMPLES_EXT enum: GL_SAMPLE_MASK_VALUE_EXT enum: GL_SAMPLE_MASK_INVERT_EXT enum: GL_SAMPLE_PATTERN_EXT enum: GL_MULTISAMPLE_BIT_EXT enum: GL_VERTEX_PRECLIP_SGIX enum: GL_VERTEX_PRECLIP_HINT_SGIX enum: GL_CONVOLUTION_HINT_SGIX enum: GL_PACK_RESAMPLE_SGIX enum: GL_UNPACK_RESAMPLE_SGIX enum: GL_RESAMPLE_REPLICATE_SGIX enum: GL_RESAMPLE_ZERO_FILL_SGIX enum: GL_RESAMPLE_DECIMATE_SGIX enum: GL_EYE_DISTANCE_TO_POINT_SGIS enum: GL_OBJECT_DISTANCE_TO_POINT_SGIS enum: GL_EYE_DISTANCE_TO_LINE_SGIS enum: GL_OBJECT_DISTANCE_TO_LINE_SGIS enum: GL_EYE_POINT_SGIS enum: GL_OBJECT_POINT_SGIS enum: GL_EYE_LINE_SGIS enum: GL_OBJECT_LINE_SGIS enum: GL_TEXTURE_COLOR_WRITEMASK_SGIS enum: GL_DOT3_RGB_EXT enum: GL_DOT3_RGBA_EXT enum: GL_MIRROR_CLAMP_ATI enum: GL_MIRROR_CLAMP_TO_EDGE_ATI enum: GL_ALL_COMPLETED_NV enum: GL_FENCE_STATUS_NV enum: GL_FENCE_CONDITION_NV enum: GL_MIRRORED_REPEAT_IBM enum: GL_EVAL_2D_NV enum: GL_EVAL_TRIANGULAR_2D_NV enum: GL_MAP_TESSELLATION_NV enum: GL_MAP_ATTRIB_U_ORDER_NV enum: GL_MAP_ATTRIB_V_ORDER_NV enum: GL_EVAL_FRACTIONAL_TESSELLATION_NV enum: GL_EVAL_VERTEX_ATTRIB0_NV enum: GL_EVAL_VERTEX_ATTRIB1_NV enum: GL_EVAL_VERTEX_ATTRIB2_NV enum: GL_EVAL_VERTEX_ATTRIB3_NV enum: GL_EVAL_VERTEX_ATTRIB4_NV enum: GL_EVAL_VERTEX_ATTRIB5_NV enum: GL_EVAL_VERTEX_ATTRIB6_NV enum: GL_EVAL_VERTEX_ATTRIB7_NV enum: GL_EVAL_VERTEX_ATTRIB8_NV enum: GL_EVAL_VERTEX_ATTRIB9_NV enum: GL_EVAL_VERTEX_ATTRIB10_NV enum: GL_EVAL_VERTEX_ATTRIB11_NV enum: GL_EVAL_VERTEX_ATTRIB12_NV enum: GL_EVAL_VERTEX_ATTRIB13_NV enum: GL_EVAL_VERTEX_ATTRIB14_NV enum: GL_EVAL_VERTEX_ATTRIB15_NV enum: GL_MAX_MAP_TESSELLATION_NV enum: GL_MAX_RATIONAL_EVAL_ORDER_NV enum: GL_DEPTH_STENCIL_NV enum: GL_UNSIGNED_INT_24_8_NV enum: GL_PER_STAGE_CONSTANTS_NV enum: GL_TEXTURE_RECTANGLE_NV enum: GL_TEXTURE_BINDING_RECTANGLE_NV enum: GL_PROXY_TEXTURE_RECTANGLE_NV enum: GL_MAX_RECTANGLE_TEXTURE_SIZE_NV enum: GL_OFFSET_TEXTURE_RECTANGLE_NV enum: GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV enum: GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV enum: GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV enum: GL_UNSIGNED_INT_S8_S8_8_8_NV enum: GL_UNSIGNED_INT_8_8_S8_S8_REV_NV enum: GL_DSDT_MAG_INTENSITY_NV enum: GL_SHADER_CONSISTENT_NV enum: GL_TEXTURE_SHADER_NV enum: GL_SHADER_OPERATION_NV enum: GL_CULL_MODES_NV enum: GL_OFFSET_TEXTURE_MATRIX_NV enum: GL_OFFSET_TEXTURE_SCALE_NV enum: GL_OFFSET_TEXTURE_BIAS_NV enum: GL_OFFSET_TEXTURE_2D_MATRIX_NV enum: GL_OFFSET_TEXTURE_2D_SCALE_NV enum: GL_OFFSET_TEXTURE_2D_BIAS_NV enum: GL_PREVIOUS_TEXTURE_INPUT_NV enum: GL_CONST_EYE_NV enum: GL_PASS_THROUGH_NV enum: GL_CULL_FRAGMENT_NV enum: GL_OFFSET_TEXTURE_2D_NV enum: GL_DEPENDENT_AR_TEXTURE_2D_NV enum: GL_DEPENDENT_GB_TEXTURE_2D_NV enum: GL_DOT_PRODUCT_NV enum: GL_DOT_PRODUCT_DEPTH_REPLACE_NV enum: GL_DOT_PRODUCT_TEXTURE_2D_NV enum: GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV enum: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV enum: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV enum: GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV enum: GL_HILO_NV enum: GL_DSDT_NV enum: GL_DSDT_MAG_NV enum: GL_DSDT_MAG_VIB_NV enum: GL_HILO16_NV enum: GL_SIGNED_HILO_NV enum: GL_SIGNED_HILO16_NV enum: GL_SIGNED_RGBA_NV enum: GL_SIGNED_RGBA8_NV enum: GL_SIGNED_RGB_NV enum: GL_SIGNED_RGB8_NV enum: GL_SIGNED_LUMINANCE_NV enum: GL_SIGNED_LUMINANCE8_NV enum: GL_SIGNED_LUMINANCE_ALPHA_NV enum: GL_SIGNED_LUMINANCE8_ALPHA8_NV enum: GL_SIGNED_ALPHA_NV enum: GL_SIGNED_ALPHA8_NV enum: GL_SIGNED_INTENSITY_NV enum: GL_SIGNED_INTENSITY8_NV enum: GL_DSDT8_NV enum: GL_DSDT8_MAG8_NV enum: GL_DSDT8_MAG8_INTENSITY8_NV enum: GL_SIGNED_RGB_UNSIGNED_ALPHA_NV enum: GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV enum: GL_HI_SCALE_NV enum: GL_LO_SCALE_NV enum: GL_DS_SCALE_NV enum: GL_DT_SCALE_NV enum: GL_MAGNITUDE_SCALE_NV enum: GL_VIBRANCE_SCALE_NV enum: GL_HI_BIAS_NV enum: GL_LO_BIAS_NV enum: GL_DS_BIAS_NV enum: GL_DT_BIAS_NV enum: GL_MAGNITUDE_BIAS_NV enum: GL_VIBRANCE_BIAS_NV enum: GL_TEXTURE_BORDER_VALUES_NV enum: GL_TEXTURE_HI_SIZE_NV enum: GL_TEXTURE_LO_SIZE_NV enum: GL_TEXTURE_DS_SIZE_NV enum: GL_TEXTURE_DT_SIZE_NV enum: GL_TEXTURE_MAG_SIZE_NV enum: GL_DOT_PRODUCT_TEXTURE_3D_NV enum: GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV enum: GL_VERTEX_PROGRAM_NV enum: GL_VERTEX_STATE_PROGRAM_NV enum: GL_ATTRIB_ARRAY_SIZE_NV enum: GL_ATTRIB_ARRAY_STRIDE_NV enum: GL_ATTRIB_ARRAY_TYPE_NV enum: GL_CURRENT_ATTRIB_NV enum: GL_PROGRAM_LENGTH_NV enum: GL_PROGRAM_STRING_NV enum: GL_MODELVIEW_PROJECTION_NV enum: GL_IDENTITY_NV enum: GL_INVERSE_NV enum: GL_TRANSPOSE_NV enum: GL_INVERSE_TRANSPOSE_NV enum: GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV enum: GL_MAX_TRACK_MATRICES_NV enum: GL_MATRIX0_NV enum: GL_MATRIX1_NV enum: GL_MATRIX2_NV enum: GL_MATRIX3_NV enum: GL_MATRIX4_NV enum: GL_MATRIX5_NV enum: GL_MATRIX6_NV enum: GL_MATRIX7_NV enum: GL_CURRENT_MATRIX_STACK_DEPTH_NV enum: GL_CURRENT_MATRIX_NV enum: GL_VERTEX_PROGRAM_POINT_SIZE_NV enum: GL_VERTEX_PROGRAM_TWO_SIDE_NV enum: GL_PROGRAM_PARAMETER_NV enum: GL_ATTRIB_ARRAY_POINTER_NV enum: GL_PROGRAM_TARGET_NV enum: GL_PROGRAM_RESIDENT_NV enum: GL_TRACK_MATRIX_NV enum: GL_TRACK_MATRIX_TRANSFORM_NV enum: GL_VERTEX_PROGRAM_BINDING_NV enum: GL_PROGRAM_ERROR_POSITION_NV enum: GL_VERTEX_ATTRIB_ARRAY0_NV enum: GL_VERTEX_ATTRIB_ARRAY1_NV enum: GL_VERTEX_ATTRIB_ARRAY2_NV enum: GL_VERTEX_ATTRIB_ARRAY3_NV enum: GL_VERTEX_ATTRIB_ARRAY4_NV enum: GL_VERTEX_ATTRIB_ARRAY5_NV enum: GL_VERTEX_ATTRIB_ARRAY6_NV enum: GL_VERTEX_ATTRIB_ARRAY7_NV enum: GL_VERTEX_ATTRIB_ARRAY8_NV enum: GL_VERTEX_ATTRIB_ARRAY9_NV enum: GL_VERTEX_ATTRIB_ARRAY10_NV enum: GL_VERTEX_ATTRIB_ARRAY11_NV enum: GL_VERTEX_ATTRIB_ARRAY12_NV enum: GL_VERTEX_ATTRIB_ARRAY13_NV enum: GL_VERTEX_ATTRIB_ARRAY14_NV enum: GL_VERTEX_ATTRIB_ARRAY15_NV enum: GL_MAP1_VERTEX_ATTRIB0_4_NV enum: GL_MAP1_VERTEX_ATTRIB1_4_NV enum: GL_MAP1_VERTEX_ATTRIB2_4_NV enum: GL_MAP1_VERTEX_ATTRIB3_4_NV enum: GL_MAP1_VERTEX_ATTRIB4_4_NV enum: GL_MAP1_VERTEX_ATTRIB5_4_NV enum: GL_MAP1_VERTEX_ATTRIB6_4_NV enum: GL_MAP1_VERTEX_ATTRIB7_4_NV enum: GL_MAP1_VERTEX_ATTRIB8_4_NV enum: GL_MAP1_VERTEX_ATTRIB9_4_NV enum: GL_MAP1_VERTEX_ATTRIB10_4_NV enum: GL_MAP1_VERTEX_ATTRIB11_4_NV enum: GL_MAP1_VERTEX_ATTRIB12_4_NV enum: GL_MAP1_VERTEX_ATTRIB13_4_NV enum: GL_MAP1_VERTEX_ATTRIB14_4_NV enum: GL_MAP1_VERTEX_ATTRIB15_4_NV enum: GL_MAP2_VERTEX_ATTRIB0_4_NV enum: GL_MAP2_VERTEX_ATTRIB1_4_NV enum: GL_MAP2_VERTEX_ATTRIB2_4_NV enum: GL_MAP2_VERTEX_ATTRIB3_4_NV enum: GL_MAP2_VERTEX_ATTRIB4_4_NV enum: GL_MAP2_VERTEX_ATTRIB5_4_NV enum: GL_MAP2_VERTEX_ATTRIB6_4_NV enum: GL_MAP2_VERTEX_ATTRIB7_4_NV enum: GL_MAP2_VERTEX_ATTRIB8_4_NV enum: GL_MAP2_VERTEX_ATTRIB9_4_NV enum: GL_MAP2_VERTEX_ATTRIB10_4_NV enum: GL_MAP2_VERTEX_ATTRIB11_4_NV enum: GL_MAP2_VERTEX_ATTRIB12_4_NV enum: GL_MAP2_VERTEX_ATTRIB13_4_NV enum: GL_MAP2_VERTEX_ATTRIB14_4_NV enum: GL_MAP2_VERTEX_ATTRIB15_4_NV enum: GL_TEXTURE_MAX_CLAMP_S_SGIX enum: GL_TEXTURE_MAX_CLAMP_T_SGIX enum: GL_TEXTURE_MAX_CLAMP_R_SGIX enum: GL_SCALEBIAS_HINT_SGIX enum: GL_INTERLACE_OML enum: GL_INTERLACE_READ_OML enum: GL_FORMAT_SUBSAMPLE_24_24_OML enum: GL_FORMAT_SUBSAMPLE_244_244_OML enum: GL_PACK_RESAMPLE_OML enum: GL_UNPACK_RESAMPLE_OML enum: GL_RESAMPLE_REPLICATE_OML enum: GL_RESAMPLE_ZERO_FILL_OML enum: GL_RESAMPLE_AVERAGE_OML enum: GL_RESAMPLE_DECIMATE_OML enum: GL_DEPTH_STENCIL_TO_RGBA_NV enum: GL_DEPTH_STENCIL_TO_BGRA_NV enum: GL_BUMP_ROT_MATRIX_ATI enum: GL_BUMP_ROT_MATRIX_SIZE_ATI enum: GL_BUMP_NUM_TEX_UNITS_ATI enum: GL_BUMP_TEX_UNITS_ATI enum: GL_DUDV_ATI enum: GL_DU8DV8_ATI enum: GL_BUMP_ENVMAP_ATI enum: GL_BUMP_TARGET_ATI enum: GL_FRAGMENT_SHADER_ATI enum: GL_REG_0_ATI enum: GL_REG_1_ATI enum: GL_REG_2_ATI enum: GL_REG_3_ATI enum: GL_REG_4_ATI enum: GL_REG_5_ATI enum: GL_REG_6_ATI enum: GL_REG_7_ATI enum: GL_REG_8_ATI enum: GL_REG_9_ATI enum: GL_REG_10_ATI enum: GL_REG_11_ATI enum: GL_REG_12_ATI enum: GL_REG_13_ATI enum: GL_REG_14_ATI enum: GL_REG_15_ATI enum: GL_REG_16_ATI enum: GL_REG_17_ATI enum: GL_REG_18_ATI enum: GL_REG_19_ATI enum: GL_REG_20_ATI enum: GL_REG_21_ATI enum: GL_REG_22_ATI enum: GL_REG_23_ATI enum: GL_REG_24_ATI enum: GL_REG_25_ATI enum: GL_REG_26_ATI enum: GL_REG_27_ATI enum: GL_REG_28_ATI enum: GL_REG_29_ATI enum: GL_REG_30_ATI enum: GL_REG_31_ATI enum: GL_CON_0_ATI enum: GL_CON_1_ATI enum: GL_CON_2_ATI enum: GL_CON_3_ATI enum: GL_CON_4_ATI enum: GL_CON_5_ATI enum: GL_CON_6_ATI enum: GL_CON_7_ATI enum: GL_CON_8_ATI enum: GL_CON_9_ATI enum: GL_CON_10_ATI enum: GL_CON_11_ATI enum: GL_CON_12_ATI enum: GL_CON_13_ATI enum: GL_CON_14_ATI enum: GL_CON_15_ATI enum: GL_CON_16_ATI enum: GL_CON_17_ATI enum: GL_CON_18_ATI enum: GL_CON_19_ATI enum: GL_CON_20_ATI enum: GL_CON_21_ATI enum: GL_CON_22_ATI enum: GL_CON_23_ATI enum: GL_CON_24_ATI enum: GL_CON_25_ATI enum: GL_CON_26_ATI enum: GL_CON_27_ATI enum: GL_CON_28_ATI enum: GL_CON_29_ATI enum: GL_CON_30_ATI enum: GL_CON_31_ATI enum: GL_MOV_ATI enum: GL_ADD_ATI enum: GL_MUL_ATI enum: GL_SUB_ATI enum: GL_DOT3_ATI enum: GL_DOT4_ATI enum: GL_MAD_ATI enum: GL_LERP_ATI enum: GL_CND_ATI enum: GL_CND0_ATI enum: GL_DOT2_ADD_ATI enum: GL_SECONDARY_INTERPOLATOR_ATI enum: GL_NUM_FRAGMENT_REGISTERS_ATI enum: GL_NUM_FRAGMENT_CONSTANTS_ATI enum: GL_NUM_PASSES_ATI enum: GL_NUM_INSTRUCTIONS_PER_PASS_ATI enum: GL_NUM_INSTRUCTIONS_TOTAL_ATI enum: GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI enum: GL_NUM_LOOPBACK_COMPONENTS_ATI enum: GL_COLOR_ALPHA_PAIRING_ATI enum: GL_SWIZZLE_STR_ATI enum: GL_SWIZZLE_STQ_ATI enum: GL_SWIZZLE_STR_DR_ATI enum: GL_SWIZZLE_STQ_DQ_ATI enum: GL_SWIZZLE_STRQ_ATI enum: GL_SWIZZLE_STRQ_DQ_ATI enum: GL_RED_BIT_ATI enum: GL_GREEN_BIT_ATI enum: GL_BLUE_BIT_ATI enum: GL_2X_BIT_ATI enum: GL_4X_BIT_ATI enum: GL_8X_BIT_ATI enum: GL_HALF_BIT_ATI enum: GL_QUARTER_BIT_ATI enum: GL_EIGHTH_BIT_ATI enum: GL_SATURATE_BIT_ATI enum: GL_COMP_BIT_ATI enum: GL_NEGATE_BIT_ATI enum: GL_BIAS_BIT_ATI enum: GL_PN_TRIANGLES_ATI enum: GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI enum: GL_PN_TRIANGLES_POINT_MODE_ATI enum: GL_PN_TRIANGLES_NORMAL_MODE_ATI enum: GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI enum: GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI enum: GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI enum: GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI enum: GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI enum: GL_STATIC_ATI enum: GL_DYNAMIC_ATI enum: GL_PRESERVE_ATI enum: GL_DISCARD_ATI enum: GL_OBJECT_BUFFER_SIZE_ATI enum: GL_OBJECT_BUFFER_USAGE_ATI enum: GL_ARRAY_OBJECT_BUFFER_ATI enum: GL_ARRAY_OBJECT_OFFSET_ATI enum: GL_VERTEX_SHADER_EXT enum: GL_VERTEX_SHADER_BINDING_EXT enum: GL_OP_INDEX_EXT enum: GL_OP_NEGATE_EXT enum: GL_OP_DOT3_EXT enum: GL_OP_DOT4_EXT enum: GL_OP_MUL_EXT enum: GL_OP_ADD_EXT enum: GL_OP_MADD_EXT enum: GL_OP_FRAC_EXT enum: GL_OP_MAX_EXT enum: GL_OP_MIN_EXT enum: GL_OP_SET_GE_EXT enum: GL_OP_SET_LT_EXT enum: GL_OP_CLAMP_EXT enum: GL_OP_FLOOR_EXT enum: GL_OP_ROUND_EXT enum: GL_OP_EXP_BASE_2_EXT enum: GL_OP_LOG_BASE_2_EXT enum: GL_OP_POWER_EXT enum: GL_OP_RECIP_EXT enum: GL_OP_RECIP_SQRT_EXT enum: GL_OP_SUB_EXT enum: GL_OP_CROSS_PRODUCT_EXT enum: GL_OP_MULTIPLY_MATRIX_EXT enum: GL_OP_MOV_EXT enum: GL_OUTPUT_VERTEX_EXT enum: GL_OUTPUT_COLOR0_EXT enum: GL_OUTPUT_COLOR1_EXT enum: GL_OUTPUT_TEXTURE_COORD0_EXT enum: GL_OUTPUT_TEXTURE_COORD1_EXT enum: GL_OUTPUT_TEXTURE_COORD2_EXT enum: GL_OUTPUT_TEXTURE_COORD3_EXT enum: GL_OUTPUT_TEXTURE_COORD4_EXT enum: GL_OUTPUT_TEXTURE_COORD5_EXT enum: GL_OUTPUT_TEXTURE_COORD6_EXT enum: GL_OUTPUT_TEXTURE_COORD7_EXT enum: GL_OUTPUT_TEXTURE_COORD8_EXT enum: GL_OUTPUT_TEXTURE_COORD9_EXT enum: GL_OUTPUT_TEXTURE_COORD10_EXT enum: GL_OUTPUT_TEXTURE_COORD11_EXT enum: GL_OUTPUT_TEXTURE_COORD12_EXT enum: GL_OUTPUT_TEXTURE_COORD13_EXT enum: GL_OUTPUT_TEXTURE_COORD14_EXT enum: GL_OUTPUT_TEXTURE_COORD15_EXT enum: GL_OUTPUT_TEXTURE_COORD16_EXT enum: GL_OUTPUT_TEXTURE_COORD17_EXT enum: GL_OUTPUT_TEXTURE_COORD18_EXT enum: GL_OUTPUT_TEXTURE_COORD19_EXT enum: GL_OUTPUT_TEXTURE_COORD20_EXT enum: GL_OUTPUT_TEXTURE_COORD21_EXT enum: GL_OUTPUT_TEXTURE_COORD22_EXT enum: GL_OUTPUT_TEXTURE_COORD23_EXT enum: GL_OUTPUT_TEXTURE_COORD24_EXT enum: GL_OUTPUT_TEXTURE_COORD25_EXT enum: GL_OUTPUT_TEXTURE_COORD26_EXT enum: GL_OUTPUT_TEXTURE_COORD27_EXT enum: GL_OUTPUT_TEXTURE_COORD28_EXT enum: GL_OUTPUT_TEXTURE_COORD29_EXT enum: GL_OUTPUT_TEXTURE_COORD30_EXT enum: GL_OUTPUT_TEXTURE_COORD31_EXT enum: GL_OUTPUT_FOG_EXT enum: GL_SCALAR_EXT enum: GL_VECTOR_EXT enum: GL_MATRIX_EXT enum: GL_VARIANT_EXT enum: GL_INVARIANT_EXT enum: GL_LOCAL_CONSTANT_EXT enum: GL_LOCAL_EXT enum: GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT enum: GL_MAX_VERTEX_SHADER_VARIANTS_EXT enum: GL_MAX_VERTEX_SHADER_INVARIANTS_EXT enum: GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT enum: GL_MAX_VERTEX_SHADER_LOCALS_EXT enum: GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT enum: GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT enum: GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT enum: GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT enum: GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT enum: GL_VERTEX_SHADER_INSTRUCTIONS_EXT enum: GL_VERTEX_SHADER_VARIANTS_EXT enum: GL_VERTEX_SHADER_INVARIANTS_EXT enum: GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT enum: GL_VERTEX_SHADER_LOCALS_EXT enum: GL_VERTEX_SHADER_OPTIMIZED_EXT enum: GL_X_EXT enum: GL_Y_EXT enum: GL_Z_EXT enum: GL_W_EXT enum: GL_NEGATIVE_X_EXT enum: GL_NEGATIVE_Y_EXT enum: GL_NEGATIVE_Z_EXT enum: GL_NEGATIVE_W_EXT enum: GL_ZERO_EXT enum: GL_ONE_EXT enum: GL_NEGATIVE_ONE_EXT enum: GL_NORMALIZED_RANGE_EXT enum: GL_FULL_RANGE_EXT enum: GL_CURRENT_VERTEX_EXT enum: GL_MVP_MATRIX_EXT enum: GL_VARIANT_VALUE_EXT enum: GL_VARIANT_DATATYPE_EXT enum: GL_VARIANT_ARRAY_STRIDE_EXT enum: GL_VARIANT_ARRAY_TYPE_EXT enum: GL_VARIANT_ARRAY_EXT enum: GL_VARIANT_ARRAY_POINTER_EXT enum: GL_INVARIANT_VALUE_EXT enum: GL_INVARIANT_DATATYPE_EXT enum: GL_LOCAL_CONSTANT_VALUE_EXT enum: GL_LOCAL_CONSTANT_DATATYPE_EXT enum: GL_MAX_VERTEX_STREAMS_ATI enum: GL_VERTEX_STREAM0_ATI enum: GL_VERTEX_STREAM1_ATI enum: GL_VERTEX_STREAM2_ATI enum: GL_VERTEX_STREAM3_ATI enum: GL_VERTEX_STREAM4_ATI enum: GL_VERTEX_STREAM5_ATI enum: GL_VERTEX_STREAM6_ATI enum: GL_VERTEX_STREAM7_ATI enum: GL_VERTEX_SOURCE_ATI enum: GL_ELEMENT_ARRAY_ATI enum: GL_ELEMENT_ARRAY_TYPE_ATI enum: GL_ELEMENT_ARRAY_POINTER_ATI enum: GL_QUAD_MESH_SUN enum: GL_TRIANGLE_MESH_SUN enum: GL_SLICE_ACCUM_SUN enum: GL_MULTISAMPLE_FILTER_HINT_NV enum: GL_DEPTH_CLAMP_NV enum: GL_PIXEL_COUNTER_BITS_NV enum: GL_CURRENT_OCCLUSION_QUERY_ID_NV enum: GL_PIXEL_COUNT_NV enum: GL_PIXEL_COUNT_AVAILABLE_NV enum: GL_POINT_SPRITE_NV enum: GL_COORD_REPLACE_NV enum: GL_POINT_SPRITE_R_MODE_NV enum: GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV enum: GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV enum: GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV enum: GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV enum: GL_OFFSET_HILO_TEXTURE_2D_NV enum: GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV enum: GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV enum: GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV enum: GL_DEPENDENT_HILO_TEXTURE_2D_NV enum: GL_DEPENDENT_RGB_TEXTURE_3D_NV enum: GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV enum: GL_DOT_PRODUCT_PASS_THROUGH_NV enum: GL_DOT_PRODUCT_TEXTURE_1D_NV enum: GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV enum: GL_HILO8_NV enum: GL_SIGNED_HILO8_NV enum: GL_FORCE_BLUE_TO_ONE_NV enum: GL_STENCIL_TEST_TWO_SIDE_EXT enum: GL_ACTIVE_STENCIL_FACE_EXT enum: GL_TEXT_FRAGMENT_SHADER_ATI enum: GL_UNPACK_CLIENT_STORAGE_APPLE enum: GL_ELEMENT_ARRAY_APPLE enum: GL_ELEMENT_ARRAY_TYPE_APPLE enum: GL_ELEMENT_ARRAY_POINTER_APPLE enum: GL_DRAW_PIXELS_APPLE enum: GL_FENCE_APPLE enum: GL_VERTEX_ARRAY_BINDING_APPLE enum: GL_VERTEX_ARRAY_RANGE_APPLE enum: GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE enum: GL_VERTEX_ARRAY_STORAGE_HINT_APPLE enum: GL_VERTEX_ARRAY_RANGE_POINTER_APPLE enum: GL_STORAGE_CLIENT_APPLE enum: GL_STORAGE_CACHED_APPLE enum: GL_STORAGE_SHARED_APPLE enum: GL_YCBCR_422_APPLE enum: GL_UNSIGNED_SHORT_8_8_APPLE enum: GL_UNSIGNED_SHORT_8_8_REV_APPLE enum: GL_RGB_S3TC enum: GL_RGB4_S3TC enum: GL_RGBA_S3TC enum: GL_RGBA4_S3TC enum: GL_RGBA_DXT5_S3TC enum: GL_RGBA4_DXT5_S3TC enum: GL_MAX_DRAW_BUFFERS_ATI enum: GL_DRAW_BUFFER0_ATI enum: GL_DRAW_BUFFER1_ATI enum: GL_DRAW_BUFFER2_ATI enum: GL_DRAW_BUFFER3_ATI enum: GL_DRAW_BUFFER4_ATI enum: GL_DRAW_BUFFER5_ATI enum: GL_DRAW_BUFFER6_ATI enum: GL_DRAW_BUFFER7_ATI enum: GL_DRAW_BUFFER8_ATI enum: GL_DRAW_BUFFER9_ATI enum: GL_DRAW_BUFFER10_ATI enum: GL_DRAW_BUFFER11_ATI enum: GL_DRAW_BUFFER12_ATI enum: GL_DRAW_BUFFER13_ATI enum: GL_DRAW_BUFFER14_ATI enum: GL_DRAW_BUFFER15_ATI enum: GL_RGBA_FLOAT_MODE_ATI enum: GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI enum: GL_MODULATE_ADD_ATI enum: GL_MODULATE_SIGNED_ADD_ATI enum: GL_MODULATE_SUBTRACT_ATI enum: GL_RGBA_FLOAT32_ATI enum: GL_RGB_FLOAT32_ATI enum: GL_ALPHA_FLOAT32_ATI enum: GL_INTENSITY_FLOAT32_ATI enum: GL_LUMINANCE_FLOAT32_ATI enum: GL_LUMINANCE_ALPHA_FLOAT32_ATI enum: GL_RGBA_FLOAT16_ATI enum: GL_RGB_FLOAT16_ATI enum: GL_ALPHA_FLOAT16_ATI enum: GL_INTENSITY_FLOAT16_ATI enum: GL_LUMINANCE_FLOAT16_ATI enum: GL_LUMINANCE_ALPHA_FLOAT16_ATI enum: GL_FLOAT_R_NV enum: GL_FLOAT_RG_NV enum: GL_FLOAT_RGB_NV enum: GL_FLOAT_RGBA_NV enum: GL_FLOAT_R16_NV enum: GL_FLOAT_R32_NV enum: GL_FLOAT_RG16_NV enum: GL_FLOAT_RG32_NV enum: GL_FLOAT_RGB16_NV enum: GL_FLOAT_RGB32_NV enum: GL_FLOAT_RGBA16_NV enum: GL_FLOAT_RGBA32_NV enum: GL_TEXTURE_FLOAT_COMPONENTS_NV enum: GL_FLOAT_CLEAR_COLOR_VALUE_NV enum: GL_FLOAT_RGBA_MODE_NV enum: GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV enum: GL_FRAGMENT_PROGRAM_NV enum: GL_MAX_TEXTURE_COORDS_NV enum: GL_MAX_TEXTURE_IMAGE_UNITS_NV enum: GL_FRAGMENT_PROGRAM_BINDING_NV enum: GL_PROGRAM_ERROR_STRING_NV enum: GL_HALF_FLOAT_NV enum: GL_WRITE_PIXEL_DATA_RANGE_NV enum: GL_READ_PIXEL_DATA_RANGE_NV enum: GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV enum: GL_READ_PIXEL_DATA_RANGE_LENGTH_NV enum: GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV enum: GL_READ_PIXEL_DATA_RANGE_POINTER_NV enum: GL_PRIMITIVE_RESTART_NV enum: GL_PRIMITIVE_RESTART_INDEX_NV enum: GL_TEXTURE_UNSIGNED_REMAP_MODE_NV enum: GL_STENCIL_BACK_FUNC_ATI enum: GL_STENCIL_BACK_FAIL_ATI enum: GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI enum: GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI enum: GL_IMPLEMENTATION_COLOR_READ_TYPE_OES enum: GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES enum: GL_DEPTH_BOUNDS_TEST_EXT enum: GL_DEPTH_BOUNDS_EXT enum: GL_MIRROR_CLAMP_EXT enum: GL_MIRROR_CLAMP_TO_EDGE_EXT enum: GL_MIRROR_CLAMP_TO_BORDER_EXT enum: GL_BLEND_EQUATION_RGB_EXT enum: GL_BLEND_EQUATION_ALPHA_EXT enum: GL_PACK_INVERT_MESA enum: GL_UNSIGNED_SHORT_8_8_MESA enum: GL_UNSIGNED_SHORT_8_8_REV_MESA enum: GL_YCBCR_MESA enum: GL_PIXEL_PACK_BUFFER_EXT enum: GL_PIXEL_UNPACK_BUFFER_EXT enum: GL_PIXEL_PACK_BUFFER_BINDING_EXT enum: GL_PIXEL_UNPACK_BUFFER_BINDING_EXT enum: GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV enum: GL_MAX_PROGRAM_CALL_DEPTH_NV enum: GL_MAX_PROGRAM_IF_DEPTH_NV enum: GL_MAX_PROGRAM_LOOP_DEPTH_NV enum: GL_MAX_PROGRAM_LOOP_COUNT_NV enum: GL_INVALID_FRAMEBUFFER_OPERATION_EXT enum: GL_MAX_RENDERBUFFER_SIZE_EXT enum: GL_FRAMEBUFFER_BINDING_EXT enum: GL_RENDERBUFFER_BINDING_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT enum: GL_FRAMEBUFFER_COMPLETE_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT enum: GL_FRAMEBUFFER_UNSUPPORTED_EXT enum: GL_MAX_COLOR_ATTACHMENTS_EXT enum: GL_COLOR_ATTACHMENT0_EXT enum: GL_COLOR_ATTACHMENT1_EXT enum: GL_COLOR_ATTACHMENT2_EXT enum: GL_COLOR_ATTACHMENT3_EXT enum: GL_COLOR_ATTACHMENT4_EXT enum: GL_COLOR_ATTACHMENT5_EXT enum: GL_COLOR_ATTACHMENT6_EXT enum: GL_COLOR_ATTACHMENT7_EXT enum: GL_COLOR_ATTACHMENT8_EXT enum: GL_COLOR_ATTACHMENT9_EXT enum: GL_COLOR_ATTACHMENT10_EXT enum: GL_COLOR_ATTACHMENT11_EXT enum: GL_COLOR_ATTACHMENT12_EXT enum: GL_COLOR_ATTACHMENT13_EXT enum: GL_COLOR_ATTACHMENT14_EXT enum: GL_COLOR_ATTACHMENT15_EXT enum: GL_DEPTH_ATTACHMENT_EXT enum: GL_STENCIL_ATTACHMENT_EXT enum: GL_FRAMEBUFFER_EXT enum: GL_RENDERBUFFER_EXT enum: GL_RENDERBUFFER_WIDTH_EXT enum: GL_RENDERBUFFER_HEIGHT_EXT enum: GL_RENDERBUFFER_INTERNAL_FORMAT_EXT enum: GL_STENCIL_INDEX1_EXT enum: GL_STENCIL_INDEX4_EXT enum: GL_STENCIL_INDEX8_EXT enum: GL_STENCIL_INDEX16_EXT enum: GL_RENDERBUFFER_RED_SIZE_EXT enum: GL_RENDERBUFFER_GREEN_SIZE_EXT enum: GL_RENDERBUFFER_BLUE_SIZE_EXT enum: GL_RENDERBUFFER_ALPHA_SIZE_EXT enum: GL_RENDERBUFFER_DEPTH_SIZE_EXT enum: GL_RENDERBUFFER_STENCIL_SIZE_EXT enum: GL_DEPTH_STENCIL_EXT enum: GL_UNSIGNED_INT_24_8_EXT enum: GL_DEPTH24_STENCIL8_EXT enum: GL_TEXTURE_STENCIL_SIZE_EXT enum: GL_STENCIL_TAG_BITS_EXT enum: GL_STENCIL_CLEAR_TAG_VALUE_EXT enum: GL_SRGB_EXT enum: GL_SRGB8_EXT enum: GL_SRGB_ALPHA_EXT enum: GL_SRGB8_ALPHA8_EXT enum: GL_SLUMINANCE_ALPHA_EXT enum: GL_SLUMINANCE8_ALPHA8_EXT enum: GL_SLUMINANCE_EXT enum: GL_SLUMINANCE8_EXT enum: GL_COMPRESSED_SRGB_EXT enum: GL_COMPRESSED_SRGB_ALPHA_EXT enum: GL_COMPRESSED_SLUMINANCE_EXT enum: GL_COMPRESSED_SLUMINANCE_ALPHA_EXT enum: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT enum: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT enum: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT enum: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT enum: GL_READ_FRAMEBUFFER_EXT enum: GL_DRAW_FRAMEBUFFER_EXT enum: GL_DRAW_FRAMEBUFFER_BINDING_EXT enum: GL_READ_FRAMEBUFFER_BINDING_EXT enum: GL_RENDERBUFFER_SAMPLES_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT enum: GL_MAX_SAMPLES_EXT enum: GL_TEXTURE_1D_STACK_MESAX enum: GL_TEXTURE_2D_STACK_MESAX enum: GL_PROXY_TEXTURE_1D_STACK_MESAX enum: GL_PROXY_TEXTURE_2D_STACK_MESAX enum: GL_TEXTURE_1D_STACK_BINDING_MESAX enum: GL_TEXTURE_2D_STACK_BINDING_MESAX enum: GL_TIME_ELAPSED_EXT enum: GL_BUFFER_SERIALIZED_MODIFY_APPLE enum: GL_BUFFER_FLUSHING_UNMAP_APPLE enum: GL_MIN_PROGRAM_TEXEL_OFFSET_NV enum: GL_MAX_PROGRAM_TEXEL_OFFSET_NV enum: GL_PROGRAM_ATTRIB_COMPONENTS_NV enum: GL_PROGRAM_RESULT_COMPONENTS_NV enum: GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV enum: GL_MAX_PROGRAM_RESULT_COMPONENTS_NV enum: GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV enum: GL_MAX_PROGRAM_GENERIC_RESULTS_NV enum: GL_LINES_ADJACENCY_EXT enum: GL_LINE_STRIP_ADJACENCY_EXT enum: GL_TRIANGLES_ADJACENCY_EXT enum: GL_TRIANGLE_STRIP_ADJACENCY_EXT enum: GL_GEOMETRY_PROGRAM_NV enum: GL_MAX_PROGRAM_OUTPUT_VERTICES_NV enum: GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV enum: GL_GEOMETRY_VERTICES_OUT_EXT enum: GL_GEOMETRY_INPUT_TYPE_EXT enum: GL_GEOMETRY_OUTPUT_TYPE_EXT enum: GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT enum: GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT enum: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT enum: GL_PROGRAM_POINT_SIZE_EXT enum: GL_GEOMETRY_SHADER_EXT enum: GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT enum: GL_MAX_VERTEX_VARYING_COMPONENTS_EXT enum: GL_MAX_VARYING_COMPONENTS_EXT enum: GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT enum: GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT enum: GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT enum: GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV enum: GL_SAMPLER_1D_ARRAY_EXT enum: GL_SAMPLER_2D_ARRAY_EXT enum: GL_SAMPLER_BUFFER_EXT enum: GL_SAMPLER_1D_ARRAY_SHADOW_EXT enum: GL_SAMPLER_2D_ARRAY_SHADOW_EXT enum: GL_SAMPLER_CUBE_SHADOW_EXT enum: GL_UNSIGNED_INT_VEC2_EXT enum: GL_UNSIGNED_INT_VEC3_EXT enum: GL_UNSIGNED_INT_VEC4_EXT enum: GL_INT_SAMPLER_1D_EXT enum: GL_INT_SAMPLER_2D_EXT enum: GL_INT_SAMPLER_3D_EXT enum: GL_INT_SAMPLER_CUBE_EXT enum: GL_INT_SAMPLER_2D_RECT_EXT enum: GL_INT_SAMPLER_1D_ARRAY_EXT enum: GL_INT_SAMPLER_2D_ARRAY_EXT enum: GL_INT_SAMPLER_BUFFER_EXT enum: GL_UNSIGNED_INT_SAMPLER_1D_EXT enum: GL_UNSIGNED_INT_SAMPLER_2D_EXT enum: GL_UNSIGNED_INT_SAMPLER_3D_EXT enum: GL_UNSIGNED_INT_SAMPLER_CUBE_EXT enum: GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT enum: GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT enum: GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT enum: GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT enum: GL_R11F_G11F_B10F_EXT enum: GL_UNSIGNED_INT_10F_11F_11F_REV_EXT enum: GL_RGBA_SIGNED_COMPONENTS_EXT enum: GL_TEXTURE_1D_ARRAY_EXT enum: GL_PROXY_TEXTURE_1D_ARRAY_EXT enum: GL_TEXTURE_2D_ARRAY_EXT enum: GL_PROXY_TEXTURE_2D_ARRAY_EXT enum: GL_TEXTURE_BINDING_1D_ARRAY_EXT enum: GL_TEXTURE_BINDING_2D_ARRAY_EXT enum: GL_MAX_ARRAY_TEXTURE_LAYERS_EXT enum: GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT enum: GL_TEXTURE_BUFFER_EXT enum: GL_MAX_TEXTURE_BUFFER_SIZE_EXT enum: GL_TEXTURE_BINDING_BUFFER_EXT enum: GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT enum: GL_TEXTURE_BUFFER_FORMAT_EXT enum: GL_COMPRESSED_LUMINANCE_LATC1_EXT enum: GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT enum: GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT enum: GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT enum: GL_COMPRESSED_RED_RGTC1_EXT enum: GL_COMPRESSED_SIGNED_RED_RGTC1_EXT enum: GL_COMPRESSED_RED_GREEN_RGTC2_EXT enum: GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT enum: GL_RGB9_E5_EXT enum: GL_UNSIGNED_INT_5_9_9_9_REV_EXT enum: GL_TEXTURE_SHARED_SIZE_EXT enum: GL_DEPTH_COMPONENT32F_NV enum: GL_DEPTH32F_STENCIL8_NV enum: GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV enum: GL_DEPTH_BUFFER_FLOAT_MODE_NV enum: GL_RENDERBUFFER_COVERAGE_SAMPLES_NV enum: GL_RENDERBUFFER_COLOR_SAMPLES_NV enum: GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV enum: GL_MULTISAMPLE_COVERAGE_MODES_NV enum: GL_FRAMEBUFFER_SRGB_EXT enum: GL_FRAMEBUFFER_SRGB_CAPABLE_EXT enum: GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV enum: GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV enum: GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV enum: GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV enum: GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV enum: GL_BACK_PRIMARY_COLOR_NV enum: GL_BACK_SECONDARY_COLOR_NV enum: GL_TEXTURE_COORD_NV enum: GL_CLIP_DISTANCE_NV enum: GL_VERTEX_ID_NV enum: GL_PRIMITIVE_ID_NV enum: GL_GENERIC_ATTRIB_NV enum: GL_TRANSFORM_FEEDBACK_ATTRIBS_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV enum: GL_ACTIVE_VARYINGS_NV enum: GL_ACTIVE_VARYING_MAX_LENGTH_NV enum: GL_TRANSFORM_FEEDBACK_VARYINGS_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_START_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV enum: GL_TRANSFORM_FEEDBACK_RECORD_NV enum: GL_PRIMITIVES_GENERATED_NV enum: GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV enum: GL_RASTERIZER_DISCARD_NV enum: GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV enum: GL_INTERLEAVED_ATTRIBS_NV enum: GL_SEPARATE_ATTRIBS_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV enum: GL_LAYER_NV enum: GL_NEXT_BUFFER_NV enum: GL_SKIP_COMPONENTS4_NV enum: GL_SKIP_COMPONENTS3_NV enum: GL_SKIP_COMPONENTS2_NV enum: GL_SKIP_COMPONENTS1_NV enum: GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT enum: GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT enum: GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT enum: GL_MAX_BINDABLE_UNIFORM_SIZE_EXT enum: GL_UNIFORM_BUFFER_EXT enum: GL_UNIFORM_BUFFER_BINDING_EXT enum: GL_RGBA32UI_EXT enum: GL_RGB32UI_EXT enum: GL_ALPHA32UI_EXT enum: GL_INTENSITY32UI_EXT enum: GL_LUMINANCE32UI_EXT enum: GL_LUMINANCE_ALPHA32UI_EXT enum: GL_RGBA16UI_EXT enum: GL_RGB16UI_EXT enum: GL_ALPHA16UI_EXT enum: GL_INTENSITY16UI_EXT enum: GL_LUMINANCE16UI_EXT enum: GL_LUMINANCE_ALPHA16UI_EXT enum: GL_RGBA8UI_EXT enum: GL_RGB8UI_EXT enum: GL_ALPHA8UI_EXT enum: GL_INTENSITY8UI_EXT enum: GL_LUMINANCE8UI_EXT enum: GL_LUMINANCE_ALPHA8UI_EXT enum: GL_RGBA32I_EXT enum: GL_RGB32I_EXT enum: GL_ALPHA32I_EXT enum: GL_INTENSITY32I_EXT enum: GL_LUMINANCE32I_EXT enum: GL_LUMINANCE_ALPHA32I_EXT enum: GL_RGBA16I_EXT enum: GL_RGB16I_EXT enum: GL_ALPHA16I_EXT enum: GL_INTENSITY16I_EXT enum: GL_LUMINANCE16I_EXT enum: GL_LUMINANCE_ALPHA16I_EXT enum: GL_RGBA8I_EXT enum: GL_RGB8I_EXT enum: GL_ALPHA8I_EXT enum: GL_INTENSITY8I_EXT enum: GL_LUMINANCE8I_EXT enum: GL_LUMINANCE_ALPHA8I_EXT enum: GL_RED_INTEGER_EXT enum: GL_GREEN_INTEGER_EXT enum: GL_BLUE_INTEGER_EXT enum: GL_ALPHA_INTEGER_EXT enum: GL_RGB_INTEGER_EXT enum: GL_RGBA_INTEGER_EXT enum: GL_BGR_INTEGER_EXT enum: GL_BGRA_INTEGER_EXT enum: GL_LUMINANCE_INTEGER_EXT enum: GL_LUMINANCE_ALPHA_INTEGER_EXT enum: GL_RGBA_INTEGER_MODE_EXT enum: GL_QUERY_WAIT_NV enum: GL_QUERY_NO_WAIT_NV enum: GL_QUERY_BY_REGION_WAIT_NV enum: GL_QUERY_BY_REGION_NO_WAIT_NV enum: GL_FRAME_NV enum: GL_FIELDS_NV enum: GL_CURRENT_TIME_NV enum: GL_NUM_FILL_STREAMS_NV enum: GL_PRESENT_TIME_NV enum: GL_PRESENT_DURATION_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_EXT enum: GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT enum: GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT enum: GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT enum: GL_INTERLEAVED_ATTRIBS_EXT enum: GL_SEPARATE_ATTRIBS_EXT enum: GL_PRIMITIVES_GENERATED_EXT enum: GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT enum: GL_RASTERIZER_DISCARD_EXT enum: GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT enum: GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT enum: GL_TRANSFORM_FEEDBACK_VARYINGS_EXT enum: GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT enum: GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT enum: GL_PROGRAM_MATRIX_EXT enum: GL_TRANSPOSE_PROGRAM_MATRIX_EXT enum: GL_PROGRAM_MATRIX_STACK_DEPTH_EXT enum: GL_TEXTURE_SWIZZLE_R_EXT enum: GL_TEXTURE_SWIZZLE_G_EXT enum: GL_TEXTURE_SWIZZLE_B_EXT enum: GL_TEXTURE_SWIZZLE_A_EXT enum: GL_TEXTURE_SWIZZLE_RGBA_EXT enum: GL_SAMPLE_POSITION_NV enum: GL_SAMPLE_MASK_NV enum: GL_SAMPLE_MASK_VALUE_NV enum: GL_TEXTURE_BINDING_RENDERBUFFER_NV enum: GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV enum: GL_TEXTURE_RENDERBUFFER_NV enum: GL_SAMPLER_RENDERBUFFER_NV enum: GL_INT_SAMPLER_RENDERBUFFER_NV enum: GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV enum: GL_MAX_SAMPLE_MASK_WORDS_NV enum: GL_TRANSFORM_FEEDBACK_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV enum: GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV enum: GL_TRANSFORM_FEEDBACK_BINDING_NV enum: GL_VBO_FREE_MEMORY_ATI enum: GL_TEXTURE_FREE_MEMORY_ATI enum: GL_RENDERBUFFER_FREE_MEMORY_ATI enum: GL_COUNTER_TYPE_AMD enum: GL_COUNTER_RANGE_AMD enum: GL_UNSIGNED_INT64_AMD enum: GL_PERCENTAGE_AMD enum: GL_PERFMON_RESULT_AVAILABLE_AMD enum: GL_PERFMON_RESULT_SIZE_AMD enum: GL_PERFMON_RESULT_AMD enum: GL_SAMPLER_BUFFER_AMD enum: GL_INT_SAMPLER_BUFFER_AMD enum: GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD enum: GL_TESSELLATION_MODE_AMD enum: GL_TESSELLATION_FACTOR_AMD enum: GL_DISCRETE_AMD enum: GL_CONTINUOUS_AMD enum: GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT enum: GL_FIRST_VERTEX_CONVENTION_EXT enum: GL_LAST_VERTEX_CONVENTION_EXT enum: GL_PROVOKING_VERTEX_EXT enum: GL_ALPHA_SNORM enum: GL_LUMINANCE_SNORM enum: GL_LUMINANCE_ALPHA_SNORM enum: GL_INTENSITY_SNORM enum: GL_ALPHA8_SNORM enum: GL_LUMINANCE8_SNORM enum: GL_LUMINANCE8_ALPHA8_SNORM enum: GL_INTENSITY8_SNORM enum: GL_ALPHA16_SNORM enum: GL_LUMINANCE16_SNORM enum: GL_LUMINANCE16_ALPHA16_SNORM enum: GL_INTENSITY16_SNORM enum: GL_TEXTURE_RANGE_LENGTH_APPLE enum: GL_TEXTURE_RANGE_POINTER_APPLE enum: GL_TEXTURE_STORAGE_HINT_APPLE enum: GL_STORAGE_PRIVATE_APPLE enum: GL_HALF_APPLE enum: GL_RGBA_FLOAT32_APPLE enum: GL_RGB_FLOAT32_APPLE enum: GL_ALPHA_FLOAT32_APPLE enum: GL_INTENSITY_FLOAT32_APPLE enum: GL_LUMINANCE_FLOAT32_APPLE enum: GL_LUMINANCE_ALPHA_FLOAT32_APPLE enum: GL_RGBA_FLOAT16_APPLE enum: GL_RGB_FLOAT16_APPLE enum: GL_ALPHA_FLOAT16_APPLE enum: GL_INTENSITY_FLOAT16_APPLE enum: GL_LUMINANCE_FLOAT16_APPLE enum: GL_LUMINANCE_ALPHA_FLOAT16_APPLE enum: GL_COLOR_FLOAT_APPLE enum: GL_VERTEX_ATTRIB_MAP1_APPLE enum: GL_VERTEX_ATTRIB_MAP2_APPLE enum: GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE enum: GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE enum: GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE enum: GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE enum: GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE enum: GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE enum: GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE enum: GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE enum: GL_AUX_DEPTH_STENCIL_APPLE enum: GL_BUFFER_OBJECT_APPLE enum: GL_RELEASED_APPLE enum: GL_VOLATILE_APPLE enum: GL_RETAINED_APPLE enum: GL_UNDEFINED_APPLE enum: GL_PURGEABLE_APPLE enum: GL_PACK_ROW_BYTES_APPLE enum: GL_UNPACK_ROW_BYTES_APPLE enum: GL_RGB_422_APPLE enum: GL_VIDEO_BUFFER_NV enum: GL_VIDEO_BUFFER_BINDING_NV enum: GL_FIELD_UPPER_NV enum: GL_FIELD_LOWER_NV enum: GL_NUM_VIDEO_CAPTURE_STREAMS_NV enum: GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV enum: GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV enum: GL_LAST_VIDEO_CAPTURE_STATUS_NV enum: GL_VIDEO_BUFFER_PITCH_NV enum: GL_VIDEO_COLOR_CONVERSION_MATRIX_NV enum: GL_VIDEO_COLOR_CONVERSION_MAX_NV enum: GL_VIDEO_COLOR_CONVERSION_MIN_NV enum: GL_VIDEO_COLOR_CONVERSION_OFFSET_NV enum: GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV enum: GL_PARTIAL_SUCCESS_NV enum: GL_SUCCESS_NV enum: GL_FAILURE_NV enum: GL_YCBYCR8_422_NV enum: GL_YCBAYCR8A_4224_NV enum: GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV enum: GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV enum: GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV enum: GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV enum: GL_Z4Y12Z4CB12Z4CR12_444_NV enum: GL_VIDEO_CAPTURE_FRAME_WIDTH_NV enum: GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV enum: GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV enum: GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV enum: GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV enum: GL_ACTIVE_PROGRAM_EXT enum: GL_BUFFER_GPU_ADDRESS_NV enum: GL_GPU_ADDRESS_NV enum: GL_MAX_SHADER_BUFFER_ADDRESS_NV enum: GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV enum: GL_ELEMENT_ARRAY_UNIFIED_NV enum: GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV enum: GL_VERTEX_ARRAY_ADDRESS_NV enum: GL_NORMAL_ARRAY_ADDRESS_NV enum: GL_COLOR_ARRAY_ADDRESS_NV enum: GL_INDEX_ARRAY_ADDRESS_NV enum: GL_TEXTURE_COORD_ARRAY_ADDRESS_NV enum: GL_EDGE_FLAG_ARRAY_ADDRESS_NV enum: GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV enum: GL_FOG_COORD_ARRAY_ADDRESS_NV enum: GL_ELEMENT_ARRAY_ADDRESS_NV enum: GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV enum: GL_VERTEX_ARRAY_LENGTH_NV enum: GL_NORMAL_ARRAY_LENGTH_NV enum: GL_COLOR_ARRAY_LENGTH_NV enum: GL_INDEX_ARRAY_LENGTH_NV enum: GL_TEXTURE_COORD_ARRAY_LENGTH_NV enum: GL_EDGE_FLAG_ARRAY_LENGTH_NV enum: GL_SECONDARY_COLOR_ARRAY_LENGTH_NV enum: GL_FOG_COORD_ARRAY_LENGTH_NV enum: GL_ELEMENT_ARRAY_LENGTH_NV enum: GL_DRAW_INDIRECT_UNIFIED_NV enum: GL_DRAW_INDIRECT_ADDRESS_NV enum: GL_DRAW_INDIRECT_LENGTH_NV enum: GL_MAX_IMAGE_UNITS_EXT enum: GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT enum: GL_IMAGE_BINDING_NAME_EXT enum: GL_IMAGE_BINDING_LEVEL_EXT enum: GL_IMAGE_BINDING_LAYERED_EXT enum: GL_IMAGE_BINDING_LAYER_EXT enum: GL_IMAGE_BINDING_ACCESS_EXT enum: GL_IMAGE_1D_EXT enum: GL_IMAGE_2D_EXT enum: GL_IMAGE_3D_EXT enum: GL_IMAGE_2D_RECT_EXT enum: GL_IMAGE_CUBE_EXT enum: GL_IMAGE_BUFFER_EXT enum: GL_IMAGE_1D_ARRAY_EXT enum: GL_IMAGE_2D_ARRAY_EXT enum: GL_IMAGE_CUBE_MAP_ARRAY_EXT enum: GL_IMAGE_2D_MULTISAMPLE_EXT enum: GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT enum: GL_INT_IMAGE_1D_EXT enum: GL_INT_IMAGE_2D_EXT enum: GL_INT_IMAGE_3D_EXT enum: GL_INT_IMAGE_2D_RECT_EXT enum: GL_INT_IMAGE_CUBE_EXT enum: GL_INT_IMAGE_BUFFER_EXT enum: GL_INT_IMAGE_1D_ARRAY_EXT enum: GL_INT_IMAGE_2D_ARRAY_EXT enum: GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT enum: GL_INT_IMAGE_2D_MULTISAMPLE_EXT enum: GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT enum: GL_UNSIGNED_INT_IMAGE_1D_EXT enum: GL_UNSIGNED_INT_IMAGE_2D_EXT enum: GL_UNSIGNED_INT_IMAGE_3D_EXT enum: GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT enum: GL_UNSIGNED_INT_IMAGE_CUBE_EXT enum: GL_UNSIGNED_INT_IMAGE_BUFFER_EXT enum: GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT enum: GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT enum: GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT enum: GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT enum: GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT enum: GL_MAX_IMAGE_SAMPLES_EXT enum: GL_IMAGE_BINDING_FORMAT_EXT enum: GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT enum: GL_ELEMENT_ARRAY_BARRIER_BIT_EXT enum: GL_UNIFORM_BARRIER_BIT_EXT enum: GL_TEXTURE_FETCH_BARRIER_BIT_EXT enum: GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT enum: GL_COMMAND_BARRIER_BIT_EXT enum: GL_PIXEL_BUFFER_BARRIER_BIT_EXT enum: GL_TEXTURE_UPDATE_BARRIER_BIT_EXT enum: GL_BUFFER_UPDATE_BARRIER_BIT_EXT enum: GL_FRAMEBUFFER_BARRIER_BIT_EXT enum: GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT enum: GL_ATOMIC_COUNTER_BARRIER_BIT_EXT enum: GL_ALL_BARRIER_BITS_EXT enum: GL_DOUBLE_VEC2_EXT enum: GL_DOUBLE_VEC3_EXT enum: GL_DOUBLE_VEC4_EXT enum: GL_DOUBLE_MAT2_EXT enum: GL_DOUBLE_MAT3_EXT enum: GL_DOUBLE_MAT4_EXT enum: GL_DOUBLE_MAT2x3_EXT enum: GL_DOUBLE_MAT2x4_EXT enum: GL_DOUBLE_MAT3x2_EXT enum: GL_DOUBLE_MAT3x4_EXT enum: GL_DOUBLE_MAT4x2_EXT enum: GL_DOUBLE_MAT4x3_EXT enum: GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV enum: GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV enum: GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV enum: GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV enum: GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV enum: GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV enum: GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV enum: GL_MAX_PROGRAM_SUBROUTINE_NUM_NV enum: GL_INT64_NV enum: GL_UNSIGNED_INT64_NV enum: GL_INT8_NV enum: GL_INT8_VEC2_NV enum: GL_INT8_VEC3_NV enum: GL_INT8_VEC4_NV enum: GL_INT16_NV enum: GL_INT16_VEC2_NV enum: GL_INT16_VEC3_NV enum: GL_INT16_VEC4_NV enum: GL_INT64_VEC2_NV enum: GL_INT64_VEC3_NV enum: GL_INT64_VEC4_NV enum: GL_UNSIGNED_INT8_NV enum: GL_UNSIGNED_INT8_VEC2_NV enum: GL_UNSIGNED_INT8_VEC3_NV enum: GL_UNSIGNED_INT8_VEC4_NV enum: GL_UNSIGNED_INT16_NV enum: GL_UNSIGNED_INT16_VEC2_NV enum: GL_UNSIGNED_INT16_VEC3_NV enum: GL_UNSIGNED_INT16_VEC4_NV enum: GL_UNSIGNED_INT64_VEC2_NV enum: GL_UNSIGNED_INT64_VEC3_NV enum: GL_UNSIGNED_INT64_VEC4_NV enum: GL_FLOAT16_NV enum: GL_FLOAT16_VEC2_NV enum: GL_FLOAT16_VEC3_NV enum: GL_FLOAT16_VEC4_NV enum: GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV enum: GL_MAX_PROGRAM_PATCH_ATTRIBS_NV enum: GL_TESS_CONTROL_PROGRAM_NV enum: GL_TESS_EVALUATION_PROGRAM_NV enum: GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV enum: GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV enum: GL_COVERAGE_SAMPLES_NV enum: GL_COLOR_SAMPLES_NV enum: GL_DATA_BUFFER_AMD enum: GL_PERFORMANCE_MONITOR_AMD enum: GL_QUERY_OBJECT_AMD enum: GL_VERTEX_ARRAY_OBJECT_AMD enum: GL_SAMPLER_OBJECT_AMD enum: GL_MAX_DEBUG_MESSAGE_LENGTH_AMD enum: GL_MAX_DEBUG_LOGGED_MESSAGES_AMD enum: GL_DEBUG_LOGGED_MESSAGES_AMD enum: GL_DEBUG_SEVERITY_HIGH_AMD enum: GL_DEBUG_SEVERITY_MEDIUM_AMD enum: GL_DEBUG_SEVERITY_LOW_AMD enum: GL_DEBUG_CATEGORY_API_ERROR_AMD enum: GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD enum: GL_DEBUG_CATEGORY_DEPRECATION_AMD enum: GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD enum: GL_DEBUG_CATEGORY_PERFORMANCE_AMD enum: GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD enum: GL_DEBUG_CATEGORY_APPLICATION_AMD enum: GL_DEBUG_CATEGORY_OTHER_AMD enum: GL_SURFACE_STATE_NV enum: GL_SURFACE_REGISTERED_NV enum: GL_SURFACE_MAPPED_NV enum: GL_WRITE_DISCARD_NV enum: GL_DEPTH_CLAMP_NEAR_AMD enum: GL_DEPTH_CLAMP_FAR_AMD enum: GL_TEXTURE_SRGB_DECODE_EXT enum: GL_DECODE_EXT enum: GL_SKIP_DECODE_EXT enum: GL_TEXTURE_COVERAGE_SAMPLES_NV enum: GL_TEXTURE_COLOR_SAMPLES_NV enum: GL_FACTOR_MIN_AMD enum: GL_FACTOR_MAX_AMD enum: GL_SUBSAMPLE_DISTANCE_AMD enum: GL_SYNC_X11_FENCE_EXT enum: GL_SCALED_RESOLVE_FASTEST_EXT enum: GL_SCALED_RESOLVE_NICEST_EXT enum: GL_PATH_FORMAT_SVG_NV enum: GL_PATH_FORMAT_PS_NV enum: GL_STANDARD_FONT_NAME_NV enum: GL_SYSTEM_FONT_NAME_NV enum: GL_FILE_NAME_NV enum: GL_PATH_STROKE_WIDTH_NV enum: GL_PATH_END_CAPS_NV enum: GL_PATH_INITIAL_END_CAP_NV enum: GL_PATH_TERMINAL_END_CAP_NV enum: GL_PATH_JOIN_STYLE_NV enum: GL_PATH_MITER_LIMIT_NV enum: GL_PATH_DASH_CAPS_NV enum: GL_PATH_INITIAL_DASH_CAP_NV enum: GL_PATH_TERMINAL_DASH_CAP_NV enum: GL_PATH_DASH_OFFSET_NV enum: GL_PATH_CLIENT_LENGTH_NV enum: GL_PATH_FILL_MODE_NV enum: GL_PATH_FILL_MASK_NV enum: GL_PATH_FILL_COVER_MODE_NV enum: GL_PATH_STROKE_COVER_MODE_NV enum: GL_PATH_STROKE_MASK_NV enum: GL_PATH_SAMPLE_QUALITY_NV enum: GL_PATH_STROKE_BOUND_NV enum: GL_PATH_STROKE_OVERSAMPLE_COUNT_NV enum: GL_COUNT_UP_NV enum: GL_COUNT_DOWN_NV enum: GL_PATH_OBJECT_BOUNDING_BOX_NV enum: GL_CONVEX_HULL_NV enum: GL_MULTI_HULLS_NV enum: GL_BOUNDING_BOX_NV enum: GL_TRANSLATE_X_NV enum: GL_TRANSLATE_Y_NV enum: GL_TRANSLATE_2D_NV enum: GL_TRANSLATE_3D_NV enum: GL_AFFINE_2D_NV enum: GL_PROJECTIVE_2D_NV enum: GL_AFFINE_3D_NV enum: GL_PROJECTIVE_3D_NV enum: GL_TRANSPOSE_AFFINE_2D_NV enum: GL_TRANSPOSE_PROJECTIVE_2D_NV enum: GL_TRANSPOSE_AFFINE_3D_NV enum: GL_TRANSPOSE_PROJECTIVE_3D_NV enum: GL_UTF8_NV enum: GL_UTF16_NV enum: GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV enum: GL_PATH_COMMAND_COUNT_NV enum: GL_PATH_COORD_COUNT_NV enum: GL_PATH_DASH_ARRAY_COUNT_NV enum: GL_PATH_COMPUTED_LENGTH_NV enum: GL_PATH_FILL_BOUNDING_BOX_NV enum: GL_PATH_STROKE_BOUNDING_BOX_NV enum: GL_SQUARE_NV enum: GL_ROUND_NV enum: GL_TRIANGULAR_NV enum: GL_BEVEL_NV enum: GL_MITER_REVERT_NV enum: GL_MITER_TRUNCATE_NV enum: GL_SKIP_MISSING_GLYPH_NV enum: GL_USE_MISSING_GLYPH_NV enum: GL_PATH_ERROR_POSITION_NV enum: GL_PATH_FOG_GEN_MODE_NV enum: GL_ACCUM_ADJACENT_PAIRS_NV enum: GL_ADJACENT_PAIRS_NV enum: GL_FIRST_TO_REST_NV enum: GL_PATH_GEN_MODE_NV enum: GL_PATH_GEN_COEFF_NV enum: GL_PATH_GEN_COLOR_FORMAT_NV enum: GL_PATH_GEN_COMPONENTS_NV enum: GL_PATH_STENCIL_FUNC_NV enum: GL_PATH_STENCIL_REF_NV enum: GL_PATH_STENCIL_VALUE_MASK_NV enum: GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV enum: GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV enum: GL_PATH_COVER_DEPTH_FUNC_NV enum: GL_PATH_DASH_OFFSET_RESET_NV enum: GL_MOVE_TO_RESETS_NV enum: GL_MOVE_TO_CONTINUES_NV enum: GL_CLOSE_PATH_NV enum: GL_MOVE_TO_NV enum: GL_RELATIVE_MOVE_TO_NV enum: GL_LINE_TO_NV enum: GL_RELATIVE_LINE_TO_NV enum: GL_HORIZONTAL_LINE_TO_NV enum: GL_RELATIVE_HORIZONTAL_LINE_TO_NV enum: GL_VERTICAL_LINE_TO_NV enum: GL_RELATIVE_VERTICAL_LINE_TO_NV enum: GL_QUADRATIC_CURVE_TO_NV enum: GL_RELATIVE_QUADRATIC_CURVE_TO_NV enum: GL_CUBIC_CURVE_TO_NV enum: GL_RELATIVE_CUBIC_CURVE_TO_NV enum: GL_SMOOTH_QUADRATIC_CURVE_TO_NV enum: GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV enum: GL_SMOOTH_CUBIC_CURVE_TO_NV enum: GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV enum: GL_SMALL_CCW_ARC_TO_NV enum: GL_RELATIVE_SMALL_CCW_ARC_TO_NV enum: GL_SMALL_CW_ARC_TO_NV enum: GL_RELATIVE_SMALL_CW_ARC_TO_NV enum: GL_LARGE_CCW_ARC_TO_NV enum: GL_RELATIVE_LARGE_CCW_ARC_TO_NV enum: GL_LARGE_CW_ARC_TO_NV enum: GL_RELATIVE_LARGE_CW_ARC_TO_NV enum: GL_RESTART_PATH_NV enum: GL_DUP_FIRST_CUBIC_CURVE_TO_NV enum: GL_DUP_LAST_CUBIC_CURVE_TO_NV enum: GL_RECT_NV enum: GL_CIRCULAR_CCW_ARC_TO_NV enum: GL_CIRCULAR_CW_ARC_TO_NV enum: GL_CIRCULAR_TANGENT_ARC_TO_NV enum: GL_ARC_TO_NV enum: GL_RELATIVE_ARC_TO_NV enum: GL_BOLD_BIT_NV enum: GL_ITALIC_BIT_NV enum: GL_GLYPH_WIDTH_BIT_NV enum: GL_GLYPH_HEIGHT_BIT_NV enum: GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV enum: GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV enum: GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV enum: GL_GLYPH_VERTICAL_BEARING_X_BIT_NV enum: GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV enum: GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV enum: GL_GLYPH_HAS_KERNING_NV enum: GL_FONT_X_MIN_BOUNDS_NV enum: GL_FONT_Y_MIN_BOUNDS_NV enum: GL_FONT_X_MAX_BOUNDS_NV enum: GL_FONT_Y_MAX_BOUNDS_NV enum: GL_FONT_UNITS_PER_EM_NV enum: GL_FONT_ASCENDER_NV enum: GL_FONT_DESCENDER_NV enum: GL_FONT_HEIGHT_NV enum: GL_FONT_MAX_ADVANCE_WIDTH_NV enum: GL_FONT_MAX_ADVANCE_HEIGHT_NV enum: GL_FONT_UNDERLINE_POSITION_NV enum: GL_FONT_UNDERLINE_THICKNESS_NV enum: GL_FONT_HAS_KERNING_NV enum: GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD enum: GL_SET_AMD enum: GL_REPLACE_VALUE_AMD enum: GL_STENCIL_OP_VALUE_AMD enum: GL_STENCIL_BACK_OP_VALUE_AMD enum: GL_QUERY_BUFFER_AMD enum: GL_QUERY_BUFFER_BINDING_AMD enum: GL_QUERY_RESULT_NO_WAIT_AMD enum: GL_VIRTUAL_PAGE_SIZE_X_AMD enum: GL_VIRTUAL_PAGE_SIZE_Y_AMD enum: GL_VIRTUAL_PAGE_SIZE_Z_AMD enum: GL_MAX_SPARSE_TEXTURE_SIZE_AMD enum: GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD enum: GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS enum: GL_MIN_SPARSE_LEVEL_AMD enum: GL_MIN_LOD_WARNING_AMD enum: GL_TEXTURE_STORAGE_SPARSE_BIT_AMD enum: GL_VERSION_1_2 enum: GL_VERSION_1_3 enum: GL_VERSION_1_4 enum: GL_VERSION_1_5 enum: GL_VERSION_2_0 enum: GL_VERSION_2_1 enum: GL_VERSION_3_0 enum: GL_VERSION_3_1 enum: GL_VERSION_3_2 enum: GL_VERSION_3_3 enum: GL_VERSION_4_0 enum: GL_VERSION_4_1 enum: GL_VERSION_4_2 enum: GL_VERSION_4_3 enum: GL_ARB_multitexture enum: GL_ARB_transpose_matrix enum: GL_ARB_multisample enum: GL_ARB_texture_env_add enum: GL_ARB_texture_cube_map enum: GL_ARB_texture_compression enum: GL_ARB_texture_border_clamp enum: GL_ARB_point_parameters enum: GL_ARB_vertex_blend enum: GL_ARB_matrix_palette enum: GL_ARB_texture_env_combine enum: GL_ARB_texture_env_crossbar enum: GL_ARB_texture_env_dot3 enum: GL_ARB_texture_mirrored_repeat enum: GL_ARB_depth_texture enum: GL_ARB_shadow enum: GL_ARB_shadow_ambient enum: GL_ARB_window_pos enum: GL_ARB_vertex_program enum: GL_ARB_fragment_program enum: GL_ARB_vertex_buffer_object enum: GL_ARB_occlusion_query enum: GL_ARB_shader_objects enum: GL_ARB_vertex_shader enum: GL_ARB_fragment_shader enum: GL_ARB_shading_language_100 enum: GL_ARB_texture_non_power_of_two enum: GL_ARB_point_sprite enum: GL_ARB_fragment_program_shadow enum: GL_ARB_draw_buffers enum: GL_ARB_texture_rectangle enum: GL_ARB_color_buffer_float enum: GL_ARB_half_float_pixel enum: GL_ARB_texture_float enum: GL_ARB_pixel_buffer_object enum: GL_ARB_depth_buffer_float enum: GL_ARB_draw_instanced enum: GL_ARB_framebuffer_object enum: GL_ARB_framebuffer_sRGB enum: GL_ARB_geometry_shader4 enum: GL_ARB_half_float_vertex enum: GL_ARB_instanced_arrays enum: GL_ARB_map_buffer_range enum: GL_ARB_texture_buffer_object enum: GL_ARB_texture_compression_rgtc enum: GL_ARB_texture_rg enum: GL_ARB_vertex_array_object enum: GL_ARB_uniform_buffer_object enum: GL_ARB_compatibility enum: GL_ARB_copy_buffer enum: GL_ARB_shader_texture_lod enum: GL_ARB_depth_clamp enum: GL_ARB_draw_elements_base_vertex enum: GL_ARB_fragment_coord_conventions enum: GL_ARB_provoking_vertex enum: GL_ARB_seamless_cube_map enum: GL_ARB_sync enum: GL_ARB_texture_multisample enum: GL_ARB_vertex_array_bgra enum: GL_ARB_draw_buffers_blend enum: GL_ARB_sample_shading enum: GL_ARB_texture_cube_map_array enum: GL_ARB_texture_gather enum: GL_ARB_texture_query_lod enum: GL_ARB_shading_language_include enum: GL_ARB_texture_compression_bptc enum: GL_ARB_blend_func_extended enum: GL_ARB_explicit_attrib_location enum: GL_ARB_occlusion_query2 enum: GL_ARB_sampler_objects enum: GL_ARB_shader_bit_encoding enum: GL_ARB_texture_rgb10_a2ui enum: GL_ARB_texture_swizzle enum: GL_ARB_timer_query enum: GL_ARB_vertex_type_2_10_10_10_rev enum: GL_ARB_draw_indirect enum: GL_ARB_gpu_shader5 enum: GL_ARB_gpu_shader_fp64 enum: GL_ARB_shader_subroutine enum: GL_ARB_tessellation_shader enum: GL_ARB_texture_buffer_object_rgb32 enum: GL_ARB_transform_feedback2 enum: GL_ARB_transform_feedback3 enum: GL_ARB_ES2_compatibility enum: GL_ARB_get_program_binary enum: GL_ARB_separate_shader_objects enum: GL_ARB_vertex_attrib_64bit enum: GL_ARB_viewport_array enum: GL_ARB_cl_event enum: GL_ARB_debug_output enum: GL_ARB_robustness enum: GL_ARB_shader_stencil_export enum: GL_ARB_base_instance enum: GL_ARB_shading_language_420pack enum: GL_ARB_transform_feedback_instanced enum: GL_ARB_compressed_texture_pixel_storage enum: GL_ARB_conservative_depth enum: GL_ARB_internalformat_query enum: GL_ARB_map_buffer_alignment enum: GL_ARB_shader_atomic_counters enum: GL_ARB_shader_image_load_store enum: GL_ARB_shading_language_packing enum: GL_ARB_texture_storage enum: GL_KHR_texture_compression_astc_ldr enum: GL_KHR_debug enum: GL_ARB_arrays_of_arrays enum: GL_ARB_clear_buffer_object enum: GL_ARB_compute_shader enum: GL_ARB_copy_image enum: GL_ARB_texture_view enum: GL_ARB_vertex_attrib_binding enum: GL_ARB_robustness_isolation enum: GL_ARB_ES3_compatibility enum: GL_ARB_explicit_uniform_location enum: GL_ARB_fragment_layer_viewport enum: GL_ARB_framebuffer_no_attachments enum: GL_ARB_internalformat_query2 enum: GL_ARB_invalidate_subdata enum: GL_ARB_multi_draw_indirect enum: GL_ARB_program_interface_query enum: GL_ARB_robust_buffer_access_behavior enum: GL_ARB_shader_image_size enum: GL_ARB_shader_storage_buffer_object enum: GL_ARB_stencil_texturing enum: GL_ARB_texture_buffer_range enum: GL_ARB_texture_query_levels enum: GL_ARB_texture_storage_multisample enum: GL_EXT_abgr enum: GL_EXT_blend_color enum: GL_EXT_polygon_offset enum: GL_EXT_texture enum: GL_EXT_texture3D enum: GL_SGIS_texture_filter4 enum: GL_EXT_subtexture enum: GL_EXT_copy_texture enum: GL_EXT_histogram enum: GL_EXT_convolution enum: GL_SGI_color_matrix enum: GL_SGI_color_table enum: GL_SGIX_pixel_texture enum: GL_SGIS_pixel_texture enum: GL_SGIS_texture4D enum: GL_SGI_texture_color_table enum: GL_EXT_cmyka enum: GL_EXT_texture_object enum: GL_SGIS_detail_texture enum: GL_SGIS_sharpen_texture enum: GL_EXT_packed_pixels enum: GL_SGIS_texture_lod enum: GL_SGIS_multisample enum: GL_EXT_rescale_normal enum: GL_EXT_vertex_array enum: GL_EXT_misc_attribute enum: GL_SGIS_generate_mipmap enum: GL_SGIX_clipmap enum: GL_SGIX_shadow enum: GL_SGIS_texture_edge_clamp enum: GL_SGIS_texture_border_clamp enum: GL_EXT_blend_minmax enum: GL_EXT_blend_subtract enum: GL_EXT_blend_logic_op enum: GL_SGIX_interlace enum: GL_SGIX_pixel_tiles enum: GL_SGIX_texture_select enum: GL_SGIX_sprite enum: GL_SGIX_texture_multi_buffer enum: GL_EXT_point_parameters enum: GL_SGIS_point_parameters enum: GL_SGIX_instruments enum: GL_SGIX_texture_scale_bias enum: GL_SGIX_framezoom enum: GL_SGIX_tag_sample_buffer enum: GL_SGIX_polynomial_ffd enum: GL_SGIX_reference_plane enum: GL_SGIX_flush_raster enum: GL_SGIX_depth_texture enum: GL_SGIS_fog_function enum: GL_SGIX_fog_offset enum: GL_HP_image_transform enum: GL_HP_convolution_border_modes enum: GL_SGIX_texture_add_env enum: GL_EXT_color_subtable enum: GL_PGI_vertex_hints enum: GL_PGI_misc_hints enum: GL_EXT_paletted_texture enum: GL_EXT_clip_volume_hint enum: GL_SGIX_list_priority enum: GL_SGIX_ir_instrument1 enum: GL_SGIX_calligraphic_fragment enum: GL_SGIX_texture_lod_bias enum: GL_SGIX_shadow_ambient enum: GL_EXT_index_texture enum: GL_EXT_index_material enum: GL_EXT_index_func enum: GL_EXT_index_array_formats enum: GL_EXT_compiled_vertex_array enum: GL_EXT_cull_vertex enum: GL_SGIX_ycrcb enum: GL_SGIX_fragment_lighting enum: GL_IBM_rasterpos_clip enum: GL_HP_texture_lighting enum: GL_EXT_draw_range_elements enum: GL_WIN_phong_shading enum: GL_WIN_specular_fog enum: GL_EXT_light_texture enum: GL_SGIX_blend_alpha_minmax enum: GL_EXT_bgra enum: GL_SGIX_async enum: GL_SGIX_async_pixel enum: GL_SGIX_async_histogram enum: GL_INTEL_parallel_arrays enum: GL_HP_occlusion_test enum: GL_EXT_pixel_transform enum: GL_EXT_pixel_transform_color_table enum: GL_EXT_shared_texture_palette enum: GL_EXT_separate_specular_color enum: GL_EXT_secondary_color enum: GL_EXT_texture_perturb_normal enum: GL_EXT_multi_draw_arrays enum: GL_EXT_fog_coord enum: GL_REND_screen_coordinates enum: GL_EXT_coordinate_frame enum: GL_EXT_texture_env_combine enum: GL_APPLE_specular_vector enum: GL_APPLE_transform_hint enum: GL_SGIX_fog_scale enum: GL_SUNX_constant_data enum: GL_SUN_global_alpha enum: GL_SUN_triangle_list enum: GL_SUN_vertex enum: GL_EXT_blend_func_separate enum: GL_INGR_blend_func_separate enum: GL_INGR_color_clamp enum: GL_INGR_interlace_read enum: GL_EXT_stencil_wrap enum: GL_EXT_422_pixels enum: GL_NV_texgen_reflection enum: GL_SUN_convolution_border_modes enum: GL_EXT_texture_env_add enum: GL_EXT_texture_lod_bias enum: GL_EXT_texture_filter_anisotropic enum: GL_EXT_vertex_weighting enum: GL_NV_light_max_exponent enum: GL_NV_vertex_array_range enum: GL_NV_register_combiners enum: GL_NV_fog_distance enum: GL_NV_texgen_emboss enum: GL_NV_blend_square enum: GL_NV_texture_env_combine4 enum: GL_MESA_resize_buffers enum: GL_MESA_window_pos enum: GL_IBM_cull_vertex enum: GL_IBM_multimode_draw_arrays enum: GL_IBM_vertex_array_lists enum: GL_SGIX_subsample enum: GL_SGIX_ycrcba enum: GL_SGIX_ycrcb_subsample enum: GL_SGIX_depth_pass_instrument enum: GL_3DFX_texture_compression_FXT1 enum: GL_3DFX_multisample enum: GL_3DFX_tbuffer enum: GL_EXT_multisample enum: GL_SGIX_vertex_preclip enum: GL_SGIX_convolution_accuracy enum: GL_SGIX_resample enum: GL_SGIS_point_line_texgen enum: GL_SGIS_texture_color_mask enum: GL_SGIX_igloo_interface enum: GL_EXT_texture_env_dot3 enum: GL_ATI_texture_mirror_once enum: GL_NV_fence enum: GL_NV_evaluators enum: GL_NV_packed_depth_stencil enum: GL_NV_register_combiners2 enum: GL_NV_texture_compression_vtc enum: GL_NV_texture_rectangle enum: GL_NV_texture_shader enum: GL_NV_texture_shader2 enum: GL_NV_vertex_array_range2 enum: GL_NV_vertex_program enum: GL_SGIX_texture_coordinate_clamp enum: GL_SGIX_scalebias_hint enum: GL_OML_interlace enum: GL_OML_subsample enum: GL_OML_resample enum: GL_NV_copy_depth_to_color enum: GL_ATI_envmap_bumpmap enum: GL_ATI_fragment_shader enum: GL_ATI_pn_triangles enum: GL_ATI_vertex_array_object enum: GL_EXT_vertex_shader enum: GL_ATI_vertex_streams enum: GL_ATI_element_array enum: GL_SUN_mesh_array enum: GL_SUN_slice_accum enum: GL_NV_multisample_filter_hint enum: GL_NV_depth_clamp enum: GL_NV_occlusion_query enum: GL_NV_point_sprite enum: GL_NV_texture_shader3 enum: GL_NV_vertex_program1_1 enum: GL_EXT_shadow_funcs enum: GL_EXT_stencil_two_side enum: GL_ATI_text_fragment_shader enum: GL_APPLE_client_storage enum: GL_APPLE_element_array enum: GL_APPLE_fence enum: GL_APPLE_vertex_array_object enum: GL_APPLE_vertex_array_range enum: GL_APPLE_ycbcr_422 enum: GL_S3_s3tc enum: GL_ATI_draw_buffers enum: GL_ATI_pixel_format_float enum: GL_ATI_texture_env_combine3 enum: GL_ATI_texture_float enum: GL_NV_float_buffer enum: GL_NV_fragment_program enum: GL_NV_half_float enum: GL_NV_pixel_data_range enum: GL_NV_primitive_restart enum: GL_NV_texture_expand_normal enum: GL_NV_vertex_program2 enum: GL_ATI_map_object_buffer enum: GL_ATI_separate_stencil enum: GL_ATI_vertex_attrib_array_object enum: GL_OES_read_format enum: GL_EXT_depth_bounds_test enum: GL_EXT_texture_mirror_clamp enum: GL_EXT_blend_equation_separate enum: GL_MESA_pack_invert enum: GL_MESA_ycbcr_texture enum: GL_EXT_pixel_buffer_object enum: GL_NV_fragment_program_option enum: GL_NV_fragment_program2 enum: GL_NV_vertex_program2_option enum: GL_NV_vertex_program3 enum: GL_EXT_framebuffer_object enum: GL_GREMEDY_string_marker enum: GL_EXT_packed_depth_stencil enum: GL_EXT_stencil_clear_tag enum: GL_EXT_texture_sRGB enum: GL_EXT_framebuffer_blit enum: GL_EXT_framebuffer_multisample enum: GL_MESAX_texture_stack enum: GL_EXT_timer_query enum: GL_EXT_gpu_program_parameters enum: GL_APPLE_flush_buffer_range enum: GL_NV_gpu_program4 enum: GL_NV_geometry_program4 enum: GL_EXT_geometry_shader4 enum: GL_NV_vertex_program4 enum: GL_EXT_gpu_shader4 enum: GL_EXT_draw_instanced enum: GL_EXT_packed_float enum: GL_EXT_texture_array enum: GL_EXT_texture_buffer_object enum: GL_EXT_texture_compression_latc enum: GL_EXT_texture_compression_rgtc enum: GL_EXT_texture_shared_exponent enum: GL_NV_depth_buffer_float enum: GL_NV_fragment_program4 enum: GL_NV_framebuffer_multisample_coverage enum: GL_EXT_framebuffer_sRGB enum: GL_NV_geometry_shader4 enum: GL_NV_parameter_buffer_object enum: GL_EXT_draw_buffers2 enum: GL_NV_transform_feedback enum: GL_EXT_bindable_uniform enum: GL_EXT_texture_integer enum: GL_GREMEDY_frame_terminator enum: GL_NV_conditional_render enum: GL_NV_present_video enum: GL_EXT_transform_feedback enum: GL_EXT_direct_state_access enum: GL_EXT_vertex_array_bgra enum: GL_EXT_texture_swizzle enum: GL_NV_explicit_multisample enum: GL_NV_transform_feedback2 enum: GL_ATI_meminfo enum: GL_AMD_performance_monitor enum: GL_AMD_texture_texture4 enum: GL_AMD_vertex_shader_tesselator enum: GL_EXT_provoking_vertex enum: GL_EXT_texture_snorm enum: GL_AMD_draw_buffers_blend enum: GL_APPLE_texture_range enum: GL_APPLE_float_pixels enum: GL_APPLE_vertex_program_evaluators enum: GL_APPLE_aux_depth_stencil enum: GL_APPLE_object_purgeable enum: GL_APPLE_row_bytes enum: GL_APPLE_rgb_422 enum: GL_NV_video_capture enum: GL_NV_copy_image enum: GL_EXT_separate_shader_objects enum: GL_NV_parameter_buffer_object2 enum: GL_NV_shader_buffer_load enum: GL_NV_vertex_buffer_unified_memory enum: GL_NV_texture_barrier enum: GL_AMD_shader_stencil_export enum: GL_AMD_seamless_cubemap_per_texture enum: GL_AMD_conservative_depth enum: GL_EXT_shader_image_load_store enum: GL_EXT_vertex_attrib_64bit enum: GL_NV_gpu_program5 enum: GL_NV_gpu_shader5 enum: GL_NV_shader_buffer_store enum: GL_NV_tessellation_program5 enum: GL_NV_vertex_attrib_integer_64bit enum: GL_NV_multisample_coverage enum: GL_AMD_name_gen_delete enum: GL_AMD_debug_output enum: GL_NV_vdpau_interop enum: GL_AMD_transform_feedback3_lines_triangles enum: GL_AMD_depth_clamp_separate enum: GL_EXT_texture_sRGB_decode enum: GL_NV_texture_multisample enum: GL_AMD_blend_minmax_factor enum: GL_AMD_sample_positions enum: GL_EXT_x11_sync_object enum: GL_AMD_multi_draw_indirect enum: GL_EXT_framebuffer_multisample_blit_scaled enum: GL_NV_path_rendering enum: GL_AMD_pinned_memory enum: GL_AMD_stencil_operation_extended enum: GL_AMD_vertex_shader_viewport_index enum: GL_AMD_vertex_shader_layer enum: GL_NV_bindless_texture enum: GL_NV_shader_atomic_float enum: GL_AMD_query_buffer_object enum: GL_AMD_sparse_texture # from /usr/include/GL/gl.h: ctypedef unsigned int GLenum ctypedef unsigned char GLboolean ctypedef unsigned int GLbitfield ctypedef void GLvoid ctypedef signed char GLbyte ctypedef short GLshort ctypedef int GLint ctypedef unsigned char GLubyte ctypedef unsigned short GLushort ctypedef unsigned int GLuint ctypedef int GLsizei ctypedef float GLfloat ctypedef float GLclampf ctypedef double GLdouble ctypedef double GLclampd # from /usr/include/GL/glext.h: ctypedef char GLchar ctypedef ptrdiff_t GLintptr ctypedef ptrdiff_t GLsizeiptr cdef extern from *: ctypedef GLubyte* const_GLubyte_ptr "const GLubyte*" ctypedef GLboolean* const_GLboolean_ptr "const GLboolean*" ctypedef GLvoid* const_GLvoid_ptr "const GLvoid*" ctypedef GLchar* const_GLchar_ptr "const GLchar*" ctypedef GLfloat* const_GLfloat_ptr "const GLfloat*" ctypedef GLint* const_GLint_ptr "const GLint*" ctypedef GLshort* const_GLshort_ptr "const GLshort*" ctypedef GLbyte* const_GLbyte_ptr "const GLbyte*" ctypedef GLuint* const_GLuint_ptr "const GLuint*" ctypedef GLushort* const_GLushort_ptr "const GLushort*" ctypedef GLclampf* const_GLclampf_ptr "const GLclampf*" ctypedef GLsizei* const_GLsizei_ptr "const GLsizei*" ctypedef GLenum* const_GLenum_ptr "const GLenum*" ctypedef void* const_void_ptr "const void*" # from /usr/include/GL/gl.h with: cdef extern from 'GL/gl.h': cdef void glClearIndex( GLfloat c ) cdef void glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) cdef void glClear( GLbitfield mask ) cdef void glIndexMask( GLuint mask ) cdef void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) cdef void glAlphaFunc( GLenum func, GLclampf ref ) cdef void glBlendFunc( GLenum sfactor, GLenum dfactor ) cdef void glLogicOp( GLenum opcode ) cdef void glCullFace( GLenum mode ) cdef void glFrontFace( GLenum mode ) cdef void glPointSize( GLfloat size ) cdef void glLineWidth( GLfloat width ) cdef void glLineStipple( GLint factor, GLushort pattern ) cdef void glPolygonMode( GLenum face, GLenum mode ) cdef void glPolygonOffset( GLfloat factor, GLfloat units ) cdef void glPolygonStipple( GLubyte *mask ) cdef void glGetPolygonStipple( GLubyte *mask ) cdef void glEdgeFlag( GLboolean flag ) cdef void glEdgeFlagv( GLboolean *flag ) cdef void glScissor( GLint x, GLint y, GLsizei width, GLsizei height) cdef void glClipPlane( GLenum plane, GLdouble *equation ) cdef void glGetClipPlane( GLenum plane, GLdouble *equation ) cdef void glDrawBuffer( GLenum mode ) cdef void glReadBuffer( GLenum mode ) cdef void glEnable( GLenum cap ) cdef void glDisable( GLenum cap ) cdef GLboolean glIsEnabled( GLenum cap ) cdef void glEnableClientState( GLenum cap ) #/* 1.1 */ cdef void glDisableClientState( GLenum cap ) #/* 1.1 */ cdef void glGetBooleanv( GLenum pname, GLboolean *params ) cdef void glGetDoublev( GLenum pname, GLdouble *params ) cdef void glGetFloatv( GLenum pname, GLfloat *params ) cdef void glGetIntegerv( GLenum pname, GLint *params ) cdef void glPushAttrib( GLbitfield mask ) cdef void glPopAttrib() cdef void glPushClientAttrib( GLbitfield mask ) #/* 1.1 */ cdef void glPopClientAttrib() #/* 1.1 */ cdef GLint glRenderMode( GLenum mode ) cdef GLenum glGetError() cdef GLubyte * glGetString( GLenum name ) cdef void glFinish() cdef void glFlush() cdef void glHint( GLenum target, GLenum mode ) cdef void glClearDepth( GLclampd depth ) cdef void glDepthFunc( GLenum func ) cdef void glDepthMask( GLboolean flag ) cdef void glDepthRange( GLclampd near_val, GLclampd far_val ) cdef void glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) cdef void glAccum( GLenum op, GLfloat value ) cdef void glMatrixMode( GLenum mode ) cdef void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ) cdef void glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ) cdef void glViewport( GLint x, GLint y, GLsizei width, GLsizei height ) cdef void glPushMatrix() cdef void glPopMatrix() cdef void glLoadIdentity() cdef void glLoadMatrixd( GLdouble *m ) cdef void glLoadMatrixf( GLfloat *m ) cdef void glMultMatrixd( GLdouble *m ) cdef void glMultMatrixf( GLfloat *m ) cdef void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) cdef void glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) cdef void glScaled( GLdouble x, GLdouble y, GLdouble z ) cdef void glScalef( GLfloat x, GLfloat y, GLfloat z ) cdef void glTranslated( GLdouble x, GLdouble y, GLdouble z ) cdef void glTranslatef( GLfloat x, GLfloat y, GLfloat z ) cdef GLboolean glIsList( GLuint list ) cdef void glDeleteLists( GLuint list, GLsizei range ) cdef GLuint glGenLists( GLsizei range ) cdef void glNewList( GLuint list, GLenum mode ) cdef void glEndList() cdef void glCallList( GLuint list ) cdef void glCallLists( GLsizei n, GLenum type, GLvoid *lists ) cdef void glListBase( GLuint base ) cdef void glBegin( GLenum mode ) cdef void glEnd() cdef void glVertex2d( GLdouble x, GLdouble y ) cdef void glVertex2f( GLfloat x, GLfloat y ) cdef void glVertex2i( GLint x, GLint y ) cdef void glVertex2s( GLshort x, GLshort y ) cdef void glVertex3d( GLdouble x, GLdouble y, GLdouble z ) cdef void glVertex3f( GLfloat x, GLfloat y, GLfloat z ) cdef void glVertex3i( GLint x, GLint y, GLint z ) cdef void glVertex3s( GLshort x, GLshort y, GLshort z ) cdef void glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ) cdef void glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) cdef void glVertex4i( GLint x, GLint y, GLint z, GLint w ) cdef void glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ) cdef void glVertex2dv( GLdouble *v ) cdef void glVertex2fv( GLfloat *v ) cdef void glVertex2iv( GLint *v ) cdef void glVertex2sv( GLshort *v ) cdef void glVertex3dv( GLdouble *v ) cdef void glVertex3fv( GLfloat *v ) cdef void glVertex3iv( GLint *v ) cdef void glVertex3sv( GLshort *v ) cdef void glVertex4dv( GLdouble *v ) cdef void glVertex4fv( GLfloat *v ) cdef void glVertex4iv( GLint *v ) cdef void glVertex4sv( GLshort *v ) cdef void glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ) cdef void glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ) cdef void glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ) cdef void glNormal3i( GLint nx, GLint ny, GLint nz ) cdef void glNormal3s( GLshort nx, GLshort ny, GLshort nz ) cdef void glNormal3bv( GLbyte *v ) cdef void glNormal3dv( GLdouble *v ) cdef void glNormal3fv( GLfloat *v ) cdef void glNormal3iv( GLint *v ) cdef void glNormal3sv( GLshort *v ) cdef void glIndexd( GLdouble c ) cdef void glIndexf( GLfloat c ) cdef void glIndexi( GLint c ) cdef void glIndexs( GLshort c ) cdef void glIndexub( GLubyte c ) #/* 1.1 */ cdef void glIndexdv( GLdouble *c ) cdef void glIndexfv( GLfloat *c ) cdef void glIndexiv( GLint *c ) cdef void glIndexsv( GLshort *c ) cdef void glIndexubv( GLubyte *c ) #/* 1.1 */ cdef void glColor3b( GLbyte red, GLbyte green, GLbyte blue ) cdef void glColor3d( GLdouble red, GLdouble green, GLdouble blue ) cdef void glColor3f( GLfloat red, GLfloat green, GLfloat blue ) cdef void glColor3i( GLint red, GLint green, GLint blue ) cdef void glColor3s( GLshort red, GLshort green, GLshort blue ) cdef void glColor3ub( GLubyte red, GLubyte green, GLubyte blue ) cdef void glColor3ui( GLuint red, GLuint green, GLuint blue ) cdef void glColor3us( GLushort red, GLushort green, GLushort blue ) cdef void glColor4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ) cdef void glColor4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ) cdef void glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) cdef void glColor4i( GLint red, GLint green, GLint blue, GLint alpha ) cdef void glColor4s( GLshort red, GLshort green, GLshort blue, GLshort alpha ) cdef void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ) cdef void glColor4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha ) cdef void glColor4us( GLushort red, GLushort green, GLushort blue, GLushort alpha ) cdef void glColor3bv( GLbyte *v ) cdef void glColor3dv( GLdouble *v ) cdef void glColor3fv( GLfloat *v ) cdef void glColor3iv( GLint *v ) cdef void glColor3sv( GLshort *v ) cdef void glColor3ubv( GLubyte *v ) cdef void glColor3uiv( GLuint *v ) cdef void glColor3usv( GLushort *v ) cdef void glColor4bv( GLbyte *v ) cdef void glColor4dv( GLdouble *v ) cdef void glColor4fv( GLfloat *v ) cdef void glColor4iv( GLint *v ) cdef void glColor4sv( GLshort *v ) cdef void glColor4ubv( GLubyte *v ) cdef void glColor4uiv( GLuint *v ) cdef void glColor4usv( GLushort *v ) cdef void glTexCoord1d( GLdouble s ) cdef void glTexCoord1f( GLfloat s ) cdef void glTexCoord1i( GLint s ) cdef void glTexCoord1s( GLshort s ) cdef void glTexCoord2d( GLdouble s, GLdouble t ) cdef void glTexCoord2f( GLfloat s, GLfloat t ) cdef void glTexCoord2i( GLint s, GLint t ) cdef void glTexCoord2s( GLshort s, GLshort t ) cdef void glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ) cdef void glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ) cdef void glTexCoord3i( GLint s, GLint t, GLint r ) cdef void glTexCoord3s( GLshort s, GLshort t, GLshort r ) cdef void glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ) cdef void glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ) cdef void glTexCoord4i( GLint s, GLint t, GLint r, GLint q ) cdef void glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ) cdef void glTexCoord1dv( GLdouble *v ) cdef void glTexCoord1fv( GLfloat *v ) cdef void glTexCoord1iv( GLint *v ) cdef void glTexCoord1sv( GLshort *v ) cdef void glTexCoord2dv( GLdouble *v ) cdef void glTexCoord2fv( GLfloat *v ) cdef void glTexCoord2iv( GLint *v ) cdef void glTexCoord2sv( GLshort *v ) cdef void glTexCoord3dv( GLdouble *v ) cdef void glTexCoord3fv( GLfloat *v ) cdef void glTexCoord3iv( GLint *v ) cdef void glTexCoord3sv( GLshort *v ) cdef void glTexCoord4dv( GLdouble *v ) cdef void glTexCoord4fv( GLfloat *v ) cdef void glTexCoord4iv( GLint *v ) cdef void glTexCoord4sv( GLshort *v ) cdef void glRasterPos2d( GLdouble x, GLdouble y ) cdef void glRasterPos2f( GLfloat x, GLfloat y ) cdef void glRasterPos2i( GLint x, GLint y ) cdef void glRasterPos2s( GLshort x, GLshort y ) cdef void glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ) cdef void glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ) cdef void glRasterPos3i( GLint x, GLint y, GLint z ) cdef void glRasterPos3s( GLshort x, GLshort y, GLshort z ) cdef void glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ) cdef void glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) cdef void glRasterPos4i( GLint x, GLint y, GLint z, GLint w ) cdef void glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ) cdef void glRasterPos2dv( GLdouble *v ) cdef void glRasterPos2fv( GLfloat *v ) cdef void glRasterPos2iv( GLint *v ) cdef void glRasterPos2sv( GLshort *v ) cdef void glRasterPos3dv( GLdouble *v ) cdef void glRasterPos3fv( GLfloat *v ) cdef void glRasterPos3iv( GLint *v ) cdef void glRasterPos3sv( GLshort *v ) cdef void glRasterPos4dv( GLdouble *v ) cdef void glRasterPos4fv( GLfloat *v ) cdef void glRasterPos4iv( GLint *v ) cdef void glRasterPos4sv( GLshort *v ) cdef void glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ) cdef void glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) cdef void glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ) cdef void glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ) cdef void glRectdv( GLdouble *v1, GLdouble *v2 ) cdef void glRectfv( GLfloat *v1, GLfloat *v2 ) cdef void glRectiv( GLint *v1, GLint *v2 ) cdef void glRectsv( GLshort *v1, GLshort *v2 ) cdef void glVertexPointer( GLint size, GLenum type, GLsizei stride, GLvoid *ptr ) cdef void glNormalPointer( GLenum type, GLsizei stride, GLvoid *ptr ) cdef void glColorPointer( GLint size, GLenum type, GLsizei stride, GLvoid *ptr ) cdef void glIndexPointer( GLenum type, GLsizei stride, GLvoid *ptr ) cdef void glTexCoordPointer( GLint size, GLenum type, GLsizei stride, GLvoid *ptr ) cdef void glEdgeFlagPointer( GLsizei stride, GLvoid *ptr ) cdef void glGetPointerv( GLenum pname, GLvoid **params ) cdef void glArrayElement( GLint i ) cdef void glDrawArrays( GLenum mode, GLint first, GLsizei count ) cdef void glDrawElements( GLenum mode, GLsizei count, GLenum type, GLvoid *indices ) cdef void glInterleavedArrays( GLenum format, GLsizei stride, GLvoid *pointer ) cdef void glShadeModel( GLenum mode ) cdef void glLightf( GLenum light, GLenum pname, GLfloat param ) cdef void glLighti( GLenum light, GLenum pname, GLint param ) cdef void glLightfv( GLenum light, GLenum pname, GLfloat *params ) cdef void glLightiv( GLenum light, GLenum pname, GLint *params ) cdef void glGetLightfv( GLenum light, GLenum pname, GLfloat *params ) cdef void glGetLightiv( GLenum light, GLenum pname, GLint *params ) cdef void glLightModelf( GLenum pname, GLfloat param ) cdef void glLightModeli( GLenum pname, GLint param ) cdef void glLightModelfv( GLenum pname, GLfloat *params ) cdef void glLightModeliv( GLenum pname, GLint *params ) cdef void glMaterialf( GLenum face, GLenum pname, GLfloat param ) cdef void glMateriali( GLenum face, GLenum pname, GLint param ) cdef void glMaterialfv( GLenum face, GLenum pname, GLfloat *params ) cdef void glMaterialiv( GLenum face, GLenum pname, GLint *params ) cdef void glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) cdef void glGetMaterialiv( GLenum face, GLenum pname, GLint *params ) cdef void glColorMaterial( GLenum face, GLenum mode ) cdef void glPixelZoom( GLfloat xfactor, GLfloat yfactor ) cdef void glPixelStoref( GLenum pname, GLfloat param ) cdef void glPixelStorei( GLenum pname, GLint param ) cdef void glPixelTransferf( GLenum pname, GLfloat param ) cdef void glPixelTransferi( GLenum pname, GLint param ) cdef void glPixelMapfv( GLenum map, GLsizei mapsize, GLfloat *values ) cdef void glPixelMapuiv( GLenum map, GLsizei mapsize, GLuint *values ) cdef void glPixelMapusv( GLenum map, GLsizei mapsize, GLushort *values ) cdef void glGetPixelMapfv( GLenum map, GLfloat *values ) cdef void glGetPixelMapuiv( GLenum map, GLuint *values ) cdef void glGetPixelMapusv( GLenum map, GLushort *values ) cdef void glBitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, GLubyte *bitmap ) cdef void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) cdef void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) cdef void glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ) cdef void glStencilFunc( GLenum func, GLint ref, GLuint mask ) cdef void glStencilMask( GLuint mask ) cdef void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ) cdef void glClearStencil( GLint s ) cdef void glTexGend( GLenum coord, GLenum pname, GLdouble param ) cdef void glTexGenf( GLenum coord, GLenum pname, GLfloat param ) cdef void glTexGeni( GLenum coord, GLenum pname, GLint param ) cdef void glTexGendv( GLenum coord, GLenum pname, GLdouble *params ) cdef void glTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) cdef void glTexGeniv( GLenum coord, GLenum pname, GLint *params ) cdef void glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) cdef void glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) cdef void glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ) cdef void glTexEnvf( GLenum target, GLenum pname, GLfloat param ) cdef void glTexEnvi( GLenum target, GLenum pname, GLint param ) cdef void glTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glTexEnviv( GLenum target, GLenum pname, GLint *params ) cdef void glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glGetTexEnviv( GLenum target, GLenum pname, GLint *params ) cdef void glTexParameterf( GLenum target, GLenum pname, GLfloat param ) cdef void glTexParameteri( GLenum target, GLenum pname, GLint param ) cdef void glTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glTexParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params) cdef void glGetTexParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glGetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ) cdef void glGetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ) cdef void glTexImage1D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, GLvoid *pixels ) cdef void glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLvoid *pixels ) cdef void glGetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ) cdef void glGenTextures( GLsizei n, GLuint *textures ) cdef void glDeleteTextures( GLsizei n, GLuint *textures) cdef void glBindTexture( GLenum target, GLuint texture ) cdef void glPrioritizeTextures( GLsizei n, GLuint *textures, GLclampf *priorities ) cdef GLboolean glAreTexturesResident( GLsizei n, GLuint *textures, GLboolean *residences ) cdef GLboolean glIsTexture( GLuint texture ) cdef void glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, GLvoid *pixels ) cdef void glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) cdef void glCopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ) cdef void glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) cdef void glCopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ) cdef void glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ) cdef void glMap1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, GLdouble *points ) cdef void glMap1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, GLfloat *points ) cdef void glMap2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble *points ) cdef void glMap2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat *points ) cdef void glGetMapdv( GLenum target, GLenum query, GLdouble *v ) cdef void glGetMapfv( GLenum target, GLenum query, GLfloat *v ) cdef void glGetMapiv( GLenum target, GLenum query, GLint *v ) cdef void glEvalCoord1d( GLdouble u ) cdef void glEvalCoord1f( GLfloat u ) cdef void glEvalCoord1dv( GLdouble *u ) cdef void glEvalCoord1fv( GLfloat *u ) cdef void glEvalCoord2d( GLdouble u, GLdouble v ) cdef void glEvalCoord2f( GLfloat u, GLfloat v ) cdef void glEvalCoord2dv( GLdouble *u ) cdef void glEvalCoord2fv( GLfloat *u ) cdef void glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) cdef void glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) cdef void glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ) cdef void glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ) cdef void glEvalPoint1( GLint i ) cdef void glEvalPoint2( GLint i, GLint j ) cdef void glEvalMesh1( GLenum mode, GLint i1, GLint i2 ) cdef void glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) cdef void glFogf( GLenum pname, GLfloat param ) cdef void glFogi( GLenum pname, GLint param ) cdef void glFogfv( GLenum pname, GLfloat *params ) cdef void glFogiv( GLenum pname, GLint *params ) cdef void glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) cdef void glPassThrough( GLfloat token ) cdef void glSelectBuffer( GLsizei size, GLuint *buffer ) cdef void glInitNames() cdef void glLoadName( GLuint name ) cdef void glPushName( GLuint name ) cdef void glPopName() cdef void glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices ) cdef void glTexImage3D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid *pixels ) cdef void glTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *pixels) cdef void glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) cdef void glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid *table ) cdef void glColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, GLvoid *data ) cdef void glColorTableParameteriv(GLenum target, GLenum pname, GLint *params) cdef void glColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params) cdef void glCopyColorSubTable( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ) cdef void glCopyColorTable( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) cdef void glGetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *table ) cdef void glGetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glGetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glBlendEquation( GLenum mode ) cdef void glBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) cdef void glHistogram( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ) cdef void glResetHistogram( GLenum target ) cdef void glGetHistogram( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values ) cdef void glGetHistogramParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glGetHistogramParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glMinmax( GLenum target, GLenum internalformat, GLboolean sink ) cdef void glResetMinmax( GLenum target ) cdef void glGetMinmax( GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values ) cdef void glGetMinmaxParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glGetMinmaxParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glConvolutionFilter1D( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid *image ) cdef void glConvolutionFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *image ) cdef void glConvolutionParameterf( GLenum target, GLenum pname, GLfloat params ) cdef void glConvolutionParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glConvolutionParameteri( GLenum target, GLenum pname, GLint params ) cdef void glConvolutionParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glCopyConvolutionFilter1D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) cdef void glCopyConvolutionFilter2D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) cdef void glGetConvolutionFilter( GLenum target, GLenum format, GLenum type, GLvoid *image ) cdef void glGetConvolutionParameterfv( GLenum target, GLenum pname, GLfloat *params ) cdef void glGetConvolutionParameteriv( GLenum target, GLenum pname, GLint *params ) cdef void glSeparableFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *row, GLvoid *column ) cdef void glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ) cdef void glActiveTexture( GLenum texture ) cdef void glClientActiveTexture( GLenum texture ) cdef void glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, GLvoid *data ) cdef void glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLvoid *data ) cdef void glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLvoid *data ) cdef void glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, GLvoid *data ) cdef void glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLvoid *data ) cdef void glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLvoid *data ) cdef void glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ) cdef void glMultiTexCoord1d( GLenum target, GLdouble s ) cdef void glMultiTexCoord1dv( GLenum target, GLdouble *v ) cdef void glMultiTexCoord1f( GLenum target, GLfloat s ) cdef void glMultiTexCoord1fv( GLenum target, GLfloat *v ) cdef void glMultiTexCoord1i( GLenum target, GLint s ) cdef void glMultiTexCoord1iv( GLenum target, GLint *v ) cdef void glMultiTexCoord1s( GLenum target, GLshort s ) cdef void glMultiTexCoord1sv( GLenum target, GLshort *v ) cdef void glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ) cdef void glMultiTexCoord2dv( GLenum target, GLdouble *v ) cdef void glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ) cdef void glMultiTexCoord2fv( GLenum target, GLfloat *v ) cdef void glMultiTexCoord2i( GLenum target, GLint s, GLint t ) cdef void glMultiTexCoord2iv( GLenum target, GLint *v ) cdef void glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ) cdef void glMultiTexCoord2sv( GLenum target, GLshort *v ) cdef void glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ) cdef void glMultiTexCoord3dv( GLenum target, GLdouble *v ) cdef void glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ) cdef void glMultiTexCoord3fv( GLenum target, GLfloat *v ) cdef void glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ) cdef void glMultiTexCoord3iv( GLenum target, GLint *v ) cdef void glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ) cdef void glMultiTexCoord3sv( GLenum target, GLshort *v ) cdef void glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ) cdef void glMultiTexCoord4dv( GLenum target, GLdouble *v ) cdef void glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ) cdef void glMultiTexCoord4fv( GLenum target, GLfloat *v ) cdef void glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ) cdef void glMultiTexCoord4iv( GLenum target, GLint *v ) cdef void glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ) cdef void glMultiTexCoord4sv( GLenum target, GLshort *v ) cdef void glLoadTransposeMatrixd( GLdouble m[16] ) cdef void glLoadTransposeMatrixf( GLfloat m[16] ) cdef void glMultTransposeMatrixd( GLdouble m[16] ) cdef void glMultTransposeMatrixf( GLfloat m[16] ) cdef void glSampleCoverage( GLclampf value, GLboolean invert ) # from /usr/include/GL/glext.h with: cdef extern from 'GL/glext.h': cdef void glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) cdef void glBlendEquation (GLenum mode) cdef void glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices) cdef void glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid *pixels) cdef void glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *pixels) cdef void glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) cdef void glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid *table) cdef void glColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glColorTableParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) cdef void glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table) cdef void glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, GLvoid *data) cdef void glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) cdef void glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid *image) cdef void glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *image) cdef void glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params) cdef void glConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glConvolutionParameteri (GLenum target, GLenum pname, GLint params) cdef void glConvolutionParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) cdef void glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) cdef void glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image) cdef void glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span) cdef void glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *row, GLvoid *column) cdef void glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) cdef void glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) cdef void glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params) cdef void glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) cdef void glMinmax (GLenum target, GLenum internalformat, GLboolean sink) cdef void glResetHistogram (GLenum target) cdef void glResetMinmax (GLenum target) cdef void glActiveTexture (GLenum texture) cdef void glSampleCoverage (GLfloat value, GLboolean invert) cdef void glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLvoid *data) cdef void glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLvoid *data) cdef void glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, GLvoid *data) cdef void glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLvoid *data) cdef void glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLvoid *data) cdef void glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, GLvoid *data) cdef void glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img) cdef void glClientActiveTexture (GLenum texture) cdef void glMultiTexCoord1d (GLenum target, GLdouble s) cdef void glMultiTexCoord1dv (GLenum target, GLdouble *v) cdef void glMultiTexCoord1f (GLenum target, GLfloat s) cdef void glMultiTexCoord1fv (GLenum target, GLfloat *v) cdef void glMultiTexCoord1i (GLenum target, GLint s) cdef void glMultiTexCoord1iv (GLenum target, GLint *v) cdef void glMultiTexCoord1s (GLenum target, GLshort s) cdef void glMultiTexCoord1sv (GLenum target, GLshort *v) cdef void glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t) cdef void glMultiTexCoord2dv (GLenum target, GLdouble *v) cdef void glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t) cdef void glMultiTexCoord2fv (GLenum target, GLfloat *v) cdef void glMultiTexCoord2i (GLenum target, GLint s, GLint t) cdef void glMultiTexCoord2iv (GLenum target, GLint *v) cdef void glMultiTexCoord2s (GLenum target, GLshort s, GLshort t) cdef void glMultiTexCoord2sv (GLenum target, GLshort *v) cdef void glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r) cdef void glMultiTexCoord3dv (GLenum target, GLdouble *v) cdef void glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r) cdef void glMultiTexCoord3fv (GLenum target, GLfloat *v) cdef void glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r) cdef void glMultiTexCoord3iv (GLenum target, GLint *v) cdef void glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r) cdef void glMultiTexCoord3sv (GLenum target, GLshort *v) cdef void glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) cdef void glMultiTexCoord4dv (GLenum target, GLdouble *v) cdef void glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) cdef void glMultiTexCoord4fv (GLenum target, GLfloat *v) cdef void glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q) cdef void glMultiTexCoord4iv (GLenum target, GLint *v) cdef void glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) cdef void glMultiTexCoord4sv (GLenum target, GLshort *v) cdef void glLoadTransposeMatrixf (GLfloat *m) cdef void glLoadTransposeMatrixd (GLdouble *m) cdef void glMultTransposeMatrixf (GLfloat *m) cdef void glMultTransposeMatrixd (GLdouble *m) cdef void glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) cdef void glMultiDrawArrays (GLenum mode, GLint *first, GLsizei *count, GLsizei drawcount) cdef void glMultiDrawElements (GLenum mode, GLsizei *count, GLenum type, GLvoid* *indices, GLsizei drawcount) cdef void glPointParameterf (GLenum pname, GLfloat param) cdef void glPointParameterfv (GLenum pname, GLfloat *params) cdef void glPointParameteri (GLenum pname, GLint param) cdef void glPointParameteriv (GLenum pname, GLint *params) cdef void glFogCoordf (GLfloat coord) cdef void glFogCoordfv (GLfloat *coord) cdef void glFogCoordd (GLdouble coord) cdef void glFogCoorddv (GLdouble *coord) cdef void glFogCoordPointer (GLenum type, GLsizei stride, GLvoid *pointer) cdef void glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue) cdef void glSecondaryColor3bv (GLbyte *v) cdef void glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue) cdef void glSecondaryColor3dv (GLdouble *v) cdef void glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue) cdef void glSecondaryColor3fv (GLfloat *v) cdef void glSecondaryColor3i (GLint red, GLint green, GLint blue) cdef void glSecondaryColor3iv (GLint *v) cdef void glSecondaryColor3s (GLshort red, GLshort green, GLshort blue) cdef void glSecondaryColor3sv (GLshort *v) cdef void glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue) cdef void glSecondaryColor3ubv (GLubyte *v) cdef void glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue) cdef void glSecondaryColor3uiv (GLuint *v) cdef void glSecondaryColor3us (GLushort red, GLushort green, GLushort blue) cdef void glSecondaryColor3usv (GLushort *v) cdef void glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, GLvoid *pointer) cdef void glWindowPos2d (GLdouble x, GLdouble y) cdef void glWindowPos2dv (GLdouble *v) cdef void glWindowPos2f (GLfloat x, GLfloat y) cdef void glWindowPos2fv (GLfloat *v) cdef void glWindowPos2i (GLint x, GLint y) cdef void glWindowPos2iv (GLint *v) cdef void glWindowPos2s (GLshort x, GLshort y) cdef void glWindowPos2sv (GLshort *v) cdef void glWindowPos3d (GLdouble x, GLdouble y, GLdouble z) cdef void glWindowPos3dv (GLdouble *v) cdef void glWindowPos3f (GLfloat x, GLfloat y, GLfloat z) cdef void glWindowPos3fv (GLfloat *v) cdef void glWindowPos3i (GLint x, GLint y, GLint z) cdef void glWindowPos3iv (GLint *v) cdef void glWindowPos3s (GLshort x, GLshort y, GLshort z) cdef void glWindowPos3sv (GLshort *v) cdef void glGenQueries (GLsizei n, GLuint *ids) cdef void glDeleteQueries (GLsizei n, GLuint *ids) cdef GLboolean glIsQuery (GLuint id) cdef void glBeginQuery (GLenum target, GLuint id) cdef void glEndQuery (GLenum target) cdef void glGetQueryiv (GLenum target, GLenum pname, GLint *params) cdef void glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params) cdef void glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params) cdef void glBindBuffer (GLenum target, GLuint buffer) cdef void glDeleteBuffers (GLsizei n, GLuint *buffers) cdef void glGenBuffers (GLsizei n, GLuint *buffers) cdef GLboolean glIsBuffer (GLuint buffer) cdef void glBufferData (GLenum target, GLsizeiptr size, GLvoid *data, GLenum usage) cdef void glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data) cdef void glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data) cdef GLvoid* glMapBuffer (GLenum target, GLenum access) cdef GLboolean glUnmapBuffer (GLenum target) cdef void glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params) cdef void glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha) cdef void glDrawBuffers (GLsizei n, GLenum *bufs) cdef void glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) cdef void glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask) cdef void glStencilMaskSeparate (GLenum face, GLuint mask) cdef void glAttachShader (GLuint program, GLuint shader) cdef void glBindAttribLocation (GLuint program, GLuint index, GLchar *name) cdef void glCompileShader (GLuint shader) cdef GLuint glCreateProgram () cdef GLuint glCreateShader (GLenum type) cdef void glDeleteProgram (GLuint program) cdef void glDeleteShader (GLuint shader) cdef void glDetachShader (GLuint program, GLuint shader) cdef void glDisableVertexAttribArray (GLuint index) cdef void glEnableVertexAttribArray (GLuint index) cdef void glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) cdef void glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) cdef void glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj) cdef GLint glGetAttribLocation (GLuint program, GLchar *name) cdef void glGetProgramiv (GLuint program, GLenum pname, GLint *params) cdef void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) cdef void glGetShaderiv (GLuint shader, GLenum pname, GLint *params) cdef void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) cdef void glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) cdef GLint glGetUniformLocation (GLuint program, GLchar *name) cdef void glGetUniformfv (GLuint program, GLint location, GLfloat *params) cdef void glGetUniformiv (GLuint program, GLint location, GLint *params) cdef void glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params) cdef void glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params) cdef void glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params) cdef void glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer) cdef GLboolean glIsProgram (GLuint program) cdef GLboolean glIsShader (GLuint shader) cdef void glLinkProgram (GLuint program) cdef void glShaderSource (GLuint shader, GLsizei count, GLchar* *string, GLint *length) cdef void glUseProgram (GLuint program) cdef void glUniform1f (GLint location, GLfloat v0) cdef void glUniform2f (GLint location, GLfloat v0, GLfloat v1) cdef void glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) cdef void glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) cdef void glUniform1i (GLint location, GLint v0) cdef void glUniform2i (GLint location, GLint v0, GLint v1) cdef void glUniform3i (GLint location, GLint v0, GLint v1, GLint v2) cdef void glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) cdef void glUniform1fv (GLint location, GLsizei count, GLfloat *value) cdef void glUniform2fv (GLint location, GLsizei count, GLfloat *value) cdef void glUniform3fv (GLint location, GLsizei count, GLfloat *value) cdef void glUniform4fv (GLint location, GLsizei count, GLfloat *value) cdef void glUniform1iv (GLint location, GLsizei count, GLint *value) cdef void glUniform2iv (GLint location, GLsizei count, GLint *value) cdef void glUniform3iv (GLint location, GLsizei count, GLint *value) cdef void glUniform4iv (GLint location, GLsizei count, GLint *value) cdef void glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glValidateProgram (GLuint program) cdef void glVertexAttrib1d (GLuint index, GLdouble x) cdef void glVertexAttrib1dv (GLuint index, GLdouble *v) cdef void glVertexAttrib1f (GLuint index, GLfloat x) cdef void glVertexAttrib1fv (GLuint index, GLfloat *v) cdef void glVertexAttrib1s (GLuint index, GLshort x) cdef void glVertexAttrib1sv (GLuint index, GLshort *v) cdef void glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y) cdef void glVertexAttrib2dv (GLuint index, GLdouble *v) cdef void glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y) cdef void glVertexAttrib2fv (GLuint index, GLfloat *v) cdef void glVertexAttrib2s (GLuint index, GLshort x, GLshort y) cdef void glVertexAttrib2sv (GLuint index, GLshort *v) cdef void glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z) cdef void glVertexAttrib3dv (GLuint index, GLdouble *v) cdef void glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z) cdef void glVertexAttrib3fv (GLuint index, GLfloat *v) cdef void glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z) cdef void glVertexAttrib3sv (GLuint index, GLshort *v) cdef void glVertexAttrib4Nbv (GLuint index, GLbyte *v) cdef void glVertexAttrib4Niv (GLuint index, GLint *v) cdef void glVertexAttrib4Nsv (GLuint index, GLshort *v) cdef void glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) cdef void glVertexAttrib4Nubv (GLuint index, GLubyte *v) cdef void glVertexAttrib4Nuiv (GLuint index, GLuint *v) cdef void glVertexAttrib4Nusv (GLuint index, GLushort *v) cdef void glVertexAttrib4bv (GLuint index, GLbyte *v) cdef void glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) cdef void glVertexAttrib4dv (GLuint index, GLdouble *v) cdef void glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) cdef void glVertexAttrib4fv (GLuint index, GLfloat *v) cdef void glVertexAttrib4iv (GLuint index, GLint *v) cdef void glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) cdef void glVertexAttrib4sv (GLuint index, GLshort *v) cdef void glVertexAttrib4ubv (GLuint index, GLubyte *v) cdef void glVertexAttrib4uiv (GLuint index, GLuint *v) cdef void glVertexAttrib4usv (GLuint index, GLushort *v) cdef void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLvoid *pointer) cdef void glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) cdef void glGetBooleani_v (GLenum target, GLuint index, GLboolean *data) cdef void glGetIntegeri_v (GLenum target, GLuint index, GLint *data) cdef void glEnablei (GLenum target, GLuint index) cdef void glDisablei (GLenum target, GLuint index) cdef GLboolean glIsEnabledi (GLenum target, GLuint index) cdef void glBeginTransformFeedback (GLenum primitiveMode) cdef void glEndTransformFeedback () cdef void glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) cdef void glBindBufferBase (GLenum target, GLuint index, GLuint buffer) cdef void glTransformFeedbackVaryings (GLuint program, GLsizei count, GLchar* *varyings, GLenum bufferMode) cdef void glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) cdef void glClampColor (GLenum target, GLenum clamp) cdef void glBeginConditionalRender (GLuint id, GLenum mode) cdef void glEndConditionalRender () cdef void glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, GLvoid *pointer) cdef void glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params) cdef void glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params) cdef void glVertexAttribI1i (GLuint index, GLint x) cdef void glVertexAttribI2i (GLuint index, GLint x, GLint y) cdef void glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z) cdef void glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w) cdef void glVertexAttribI1ui (GLuint index, GLuint x) cdef void glVertexAttribI2ui (GLuint index, GLuint x, GLuint y) cdef void glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z) cdef void glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) cdef void glVertexAttribI1iv (GLuint index, GLint *v) cdef void glVertexAttribI2iv (GLuint index, GLint *v) cdef void glVertexAttribI3iv (GLuint index, GLint *v) cdef void glVertexAttribI4iv (GLuint index, GLint *v) cdef void glVertexAttribI1uiv (GLuint index, GLuint *v) cdef void glVertexAttribI2uiv (GLuint index, GLuint *v) cdef void glVertexAttribI3uiv (GLuint index, GLuint *v) cdef void glVertexAttribI4uiv (GLuint index, GLuint *v) cdef void glVertexAttribI4bv (GLuint index, GLbyte *v) cdef void glVertexAttribI4sv (GLuint index, GLshort *v) cdef void glVertexAttribI4ubv (GLuint index, GLubyte *v) cdef void glVertexAttribI4usv (GLuint index, GLushort *v) cdef void glGetUniformuiv (GLuint program, GLint location, GLuint *params) cdef void glBindFragDataLocation (GLuint program, GLuint color, GLchar *name) cdef GLint glGetFragDataLocation (GLuint program, GLchar *name) cdef void glUniform1ui (GLint location, GLuint v0) cdef void glUniform2ui (GLint location, GLuint v0, GLuint v1) cdef void glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2) cdef void glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) cdef void glUniform1uiv (GLint location, GLsizei count, GLuint *value) cdef void glUniform2uiv (GLint location, GLsizei count, GLuint *value) cdef void glUniform3uiv (GLint location, GLsizei count, GLuint *value) cdef void glUniform4uiv (GLint location, GLsizei count, GLuint *value) cdef void glTexParameterIiv (GLenum target, GLenum pname, GLint *params) cdef void glTexParameterIuiv (GLenum target, GLenum pname, GLuint *params) cdef void glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params) cdef void glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params) cdef void glClearBufferiv (GLenum buffer, GLint drawbuffer, GLint *value) cdef void glClearBufferuiv (GLenum buffer, GLint drawbuffer, GLuint *value) cdef void glClearBufferfv (GLenum buffer, GLint drawbuffer, GLfloat *value) cdef void glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) cdef GLubyte * glGetStringi (GLenum name, GLuint index) cdef void glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount) cdef void glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, GLvoid *indices, GLsizei instancecount) cdef void glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer) cdef void glPrimitiveRestartIndex (GLuint index) cdef void glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level) cdef void glVertexAttribDivisor (GLuint index, GLuint divisor) cdef void glMinSampleShading (GLfloat value) cdef void glBlendEquationi (GLuint buf, GLenum mode) cdef void glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha) cdef void glBlendFunci (GLuint buf, GLenum src, GLenum dst) cdef void glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) cdef GLboolean glIsRenderbuffer (GLuint renderbuffer) cdef void glBindRenderbuffer (GLenum target, GLuint renderbuffer) cdef void glDeleteRenderbuffers (GLsizei n, GLuint *renderbuffers) cdef void glGenRenderbuffers (GLsizei n, GLuint *renderbuffers) cdef void glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) cdef void glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params) cdef GLboolean glIsFramebuffer (GLuint framebuffer) cdef void glBindFramebuffer (GLenum target, GLuint framebuffer) cdef void glDeleteFramebuffers (GLsizei n, GLuint *framebuffers) cdef void glGenFramebuffers (GLsizei n, GLuint *framebuffers) cdef GLenum glCheckFramebufferStatus (GLenum target) cdef void glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) cdef void glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) cdef void glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) cdef void glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) cdef void glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params) cdef void glGenerateMipmap (GLenum target) cdef void glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) cdef void glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) cdef void glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) cdef GLvoid* glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) cdef void glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length) cdef void glBindVertexArray (GLuint array) cdef void glDeleteVertexArrays (GLsizei n, GLuint *arrays) cdef void glGenVertexArrays (GLsizei n, GLuint *arrays) cdef GLboolean glIsVertexArray (GLuint array) cdef void glGetUniformIndices (GLuint program, GLsizei uniformCount, GLchar* *uniformNames, GLuint *uniformIndices) cdef void glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, GLuint *uniformIndices, GLenum pname, GLint *params) cdef void glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName) cdef GLuint glGetUniformBlockIndex (GLuint program, GLchar *uniformBlockName) cdef void glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params) cdef void glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) cdef void glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) cdef void glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) cdef void glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, GLvoid *indices, GLint basevertex) cdef void glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid *indices, GLint basevertex) cdef void glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, GLvoid *indices, GLsizei instancecount, GLint basevertex) cdef void glMultiDrawElementsBaseVertex (GLenum mode, GLsizei *count, GLenum type, GLvoid* *indices, GLsizei drawcount, GLint *basevertex) cdef void glProvokingVertex (GLenum mode) cdef void glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) cdef void glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) cdef void glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val) cdef void glSampleMaski (GLuint index, GLbitfield mask) cdef void glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, GLchar *name) cdef GLint glGetFragDataIndex (GLuint program, GLchar *name) cdef void glGenSamplers (GLsizei count, GLuint *samplers) cdef void glDeleteSamplers (GLsizei count, GLuint *samplers) cdef GLboolean glIsSampler (GLuint sampler) cdef void glBindSampler (GLuint unit, GLuint sampler) cdef void glSamplerParameteri (GLuint sampler, GLenum pname, GLint param) cdef void glSamplerParameteriv (GLuint sampler, GLenum pname, GLint *param) cdef void glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param) cdef void glSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *param) cdef void glSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *param) cdef void glSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *param) cdef void glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params) cdef void glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params) cdef void glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params) cdef void glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params) cdef void glQueryCounter (GLuint id, GLenum target) cdef void glVertexP2ui (GLenum type, GLuint value) cdef void glVertexP2uiv (GLenum type, GLuint *value) cdef void glVertexP3ui (GLenum type, GLuint value) cdef void glVertexP3uiv (GLenum type, GLuint *value) cdef void glVertexP4ui (GLenum type, GLuint value) cdef void glVertexP4uiv (GLenum type, GLuint *value) cdef void glTexCoordP1ui (GLenum type, GLuint coords) cdef void glTexCoordP1uiv (GLenum type, GLuint *coords) cdef void glTexCoordP2ui (GLenum type, GLuint coords) cdef void glTexCoordP2uiv (GLenum type, GLuint *coords) cdef void glTexCoordP3ui (GLenum type, GLuint coords) cdef void glTexCoordP3uiv (GLenum type, GLuint *coords) cdef void glTexCoordP4ui (GLenum type, GLuint coords) cdef void glTexCoordP4uiv (GLenum type, GLuint *coords) cdef void glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords) cdef void glMultiTexCoordP1uiv (GLenum texture, GLenum type, GLuint *coords) cdef void glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords) cdef void glMultiTexCoordP2uiv (GLenum texture, GLenum type, GLuint *coords) cdef void glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords) cdef void glMultiTexCoordP3uiv (GLenum texture, GLenum type, GLuint *coords) cdef void glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords) cdef void glMultiTexCoordP4uiv (GLenum texture, GLenum type, GLuint *coords) cdef void glNormalP3ui (GLenum type, GLuint coords) cdef void glNormalP3uiv (GLenum type, GLuint *coords) cdef void glColorP3ui (GLenum type, GLuint color) cdef void glColorP3uiv (GLenum type, GLuint *color) cdef void glColorP4ui (GLenum type, GLuint color) cdef void glColorP4uiv (GLenum type, GLuint *color) cdef void glSecondaryColorP3ui (GLenum type, GLuint color) cdef void glSecondaryColorP3uiv (GLenum type, GLuint *color) cdef void glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) cdef void glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, GLuint *value) cdef void glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) cdef void glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, GLuint *value) cdef void glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) cdef void glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, GLuint *value) cdef void glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) cdef void glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, GLuint *value) cdef void glDrawArraysIndirect (GLenum mode, GLvoid *indirect) cdef void glDrawElementsIndirect (GLenum mode, GLenum type, GLvoid *indirect) cdef void glUniform1d (GLint location, GLdouble x) cdef void glUniform2d (GLint location, GLdouble x, GLdouble y) cdef void glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z) cdef void glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) cdef void glUniform1dv (GLint location, GLsizei count, GLdouble *value) cdef void glUniform2dv (GLint location, GLsizei count, GLdouble *value) cdef void glUniform3dv (GLint location, GLsizei count, GLdouble *value) cdef void glUniform4dv (GLint location, GLsizei count, GLdouble *value) cdef void glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glGetUniformdv (GLuint program, GLint location, GLdouble *params) cdef GLint glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, GLchar *name) cdef GLuint glGetSubroutineIndex (GLuint program, GLenum shadertype, GLchar *name) cdef void glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values) cdef void glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name) cdef void glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name) cdef void glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, GLuint *indices) cdef void glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params) cdef void glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values) cdef void glPatchParameteri (GLenum pname, GLint value) cdef void glPatchParameterfv (GLenum pname, GLfloat *values) cdef void glBindTransformFeedback (GLenum target, GLuint id) cdef void glDeleteTransformFeedbacks (GLsizei n, GLuint *ids) cdef void glGenTransformFeedbacks (GLsizei n, GLuint *ids) cdef GLboolean glIsTransformFeedback (GLuint id) cdef void glPauseTransformFeedback () cdef void glResumeTransformFeedback () cdef void glDrawTransformFeedback (GLenum mode, GLuint id) cdef void glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream) cdef void glBeginQueryIndexed (GLenum target, GLuint index, GLuint id) cdef void glEndQueryIndexed (GLenum target, GLuint index) cdef void glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params) cdef void glReleaseShaderCompiler () cdef void glShaderBinary (GLsizei count, GLuint *shaders, GLenum binaryformat, GLvoid *binary, GLsizei length) cdef void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) cdef void glDepthRangef (GLfloat n, GLfloat f) cdef void glClearDepthf (GLfloat d) cdef void glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary) cdef void glProgramBinary (GLuint program, GLenum binaryFormat, GLvoid *binary, GLsizei length) cdef void glProgramParameteri (GLuint program, GLenum pname, GLint value) cdef void glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program) cdef void glActiveShaderProgram (GLuint pipeline, GLuint program) cdef GLuint glCreateShaderProgramv (GLenum type, GLsizei count, GLchar* *strings) cdef void glBindProgramPipeline (GLuint pipeline) cdef void glDeleteProgramPipelines (GLsizei n, GLuint *pipelines) cdef void glGenProgramPipelines (GLsizei n, GLuint *pipelines) cdef GLboolean glIsProgramPipeline (GLuint pipeline) cdef void glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params) cdef void glProgramUniform1i (GLuint program, GLint location, GLint v0) cdef void glProgramUniform1iv (GLuint program, GLint location, GLsizei count, GLint *value) cdef void glProgramUniform1f (GLuint program, GLint location, GLfloat v0) cdef void glProgramUniform1fv (GLuint program, GLint location, GLsizei count, GLfloat *value) cdef void glProgramUniform1d (GLuint program, GLint location, GLdouble v0) cdef void glProgramUniform1dv (GLuint program, GLint location, GLsizei count, GLdouble *value) cdef void glProgramUniform1ui (GLuint program, GLint location, GLuint v0) cdef void glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, GLuint *value) cdef void glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1) cdef void glProgramUniform2iv (GLuint program, GLint location, GLsizei count, GLint *value) cdef void glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1) cdef void glProgramUniform2fv (GLuint program, GLint location, GLsizei count, GLfloat *value) cdef void glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1) cdef void glProgramUniform2dv (GLuint program, GLint location, GLsizei count, GLdouble *value) cdef void glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1) cdef void glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, GLuint *value) cdef void glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2) cdef void glProgramUniform3iv (GLuint program, GLint location, GLsizei count, GLint *value) cdef void glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) cdef void glProgramUniform3fv (GLuint program, GLint location, GLsizei count, GLfloat *value) cdef void glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2) cdef void glProgramUniform3dv (GLuint program, GLint location, GLsizei count, GLdouble *value) cdef void glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) cdef void glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, GLuint *value) cdef void glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) cdef void glProgramUniform4iv (GLuint program, GLint location, GLsizei count, GLint *value) cdef void glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) cdef void glProgramUniform4fv (GLuint program, GLint location, GLsizei count, GLfloat *value) cdef void glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) cdef void glProgramUniform4dv (GLuint program, GLint location, GLsizei count, GLdouble *value) cdef void glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) cdef void glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, GLuint *value) cdef void glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, GLdouble *value) cdef void glValidateProgramPipeline (GLuint pipeline) cdef void glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog) cdef void glVertexAttribL1d (GLuint index, GLdouble x) cdef void glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y) cdef void glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z) cdef void glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) cdef void glVertexAttribL1dv (GLuint index, GLdouble *v) cdef void glVertexAttribL2dv (GLuint index, GLdouble *v) cdef void glVertexAttribL3dv (GLuint index, GLdouble *v) cdef void glVertexAttribL4dv (GLuint index, GLdouble *v) cdef void glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, GLvoid *pointer) cdef void glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params) cdef void glViewportArrayv (GLuint first, GLsizei count, GLfloat *v) cdef void glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) cdef void glViewportIndexedfv (GLuint index, GLfloat *v) cdef void glScissorArrayv (GLuint first, GLsizei count, GLint *v) cdef void glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) cdef void glScissorIndexedv (GLuint index, GLint *v) cdef void glDepthRangeArrayv (GLuint first, GLsizei count, GLdouble *v) cdef void glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f) cdef void glGetFloati_v (GLenum target, GLuint index, GLfloat *data) cdef void glGetDoublei_v (GLenum target, GLuint index, GLdouble *data) cdef void glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) cdef void glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, void *indices, GLsizei instancecount, GLuint baseinstance) cdef void glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) cdef void glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount) cdef void glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount) cdef void glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params) cdef void glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params) cdef void glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) cdef void glMemoryBarrier (GLbitfield barriers) cdef void glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) cdef void glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) cdef void glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) cdef void glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, GLuint *ids, GLboolean enabled) cdef void glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, GLchar *buf) cdef GLuint glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog) cdef void glPushDebugGroup (GLenum source, GLuint id, GLsizei length, GLchar *message) cdef void glPopDebugGroup () cdef void glObjectLabel (GLenum identifier, GLuint name, GLsizei length, GLchar *label) cdef void glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label) cdef void glObjectPtrLabel (void *ptr, GLsizei length, GLchar *label) cdef void glGetObjectPtrLabel (void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) cdef void glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, void *data) cdef void glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, void *data) cdef void glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) cdef void glDispatchComputeIndirect (GLintptr indirect) cdef void glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) cdef void glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) cdef void glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) cdef void glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) cdef void glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) cdef void glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) cdef void glVertexAttribBinding (GLuint attribindex, GLuint bindingindex) cdef void glVertexBindingDivisor (GLuint bindingindex, GLuint divisor) cdef void glFramebufferParameteri (GLenum target, GLenum pname, GLint param) cdef void glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params) cdef void glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) cdef void glInvalidateTexImage (GLuint texture, GLint level) cdef void glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length) cdef void glInvalidateBufferData (GLuint buffer) cdef void glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, GLenum *attachments) cdef void glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) cdef void glMultiDrawArraysIndirect (GLenum mode, void *indirect, GLsizei drawcount, GLsizei stride) cdef void glMultiDrawElementsIndirect (GLenum mode, GLenum type, void *indirect, GLsizei drawcount, GLsizei stride) cdef void glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params) cdef GLuint glGetProgramResourceIndex (GLuint program, GLenum programInterface, GLchar *name) cdef void glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) cdef void glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params) cdef GLint glGetProgramResourceLocation (GLuint program, GLenum programInterface, GLchar *name) cdef GLint glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, GLchar *name) cdef void glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) cdef void glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) cdef void glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) cdef void glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) pybik-1.1/pybiklib/gldraw.py0000644000175000017500000002540012152102517016273 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # cython: profile=False # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: cube.c, drwBlock.c # Original copyright and license: 1998, 2003, 2004 Dale Mellor, John Darrington, GPL3+ # although this file is compiled with Python3 syntax, Cython needs at least division from __future__ from __future__ import print_function, division # This line makes cython happy global __name__, __package__ # pylint: disable=W0604 #px/__compiled = True __compiled = False __all__ = ['VERTEX_ATTRIB_LOCATION', 'NORMAL_ATTRIB_LOCATION', 'COLOR_ATTRIB_LOCATION', 'TEXCOORD_ATTRIB_LOCATION', 'gl_draw_cube', 'gl_pick_cube', 'gl_init_buffers', 'gl_delete_buffers', 'gl_draw_cube_debug', 'gl_init_object_location'] from .debug import debug # pylint: disable=W0614,W0401 #pxd/from gl cimport * from OpenGL.GL import * # pylint: disable=W0614,W0401 #px/from glm cimport * from .glm import * debug('Importing module:', __name__) debug(' from package:', __package__) debug(' compiled:', __compiled) #pxd/cdef enum: # if True: MAX_BLOCKS = 1000 MAX_FACES = 6 MAX_FACES_PER_BLOCK = 6 #pxd=4 VERTEX_ATTRIB_LOCATION = 0 NORMAL_ATTRIB_LOCATION = 1 COLOR_ATTRIB_LOCATION = 2 TEXCOORD_ATTRIB_LOCATION = 3 #px/cdef struct Block: class Block: # pylint: disable=R0903 #px- def __init__(self): # The position from the centre of the cube, and the rotation from the # 'natural' position. #px/mat4 transformation self.transformation = mat4() #px/bint in_motion self.in_motion = None #px/int cnt_faces self.cnt_faces = None #px/int idx_label[MAX_FACES_PER_BLOCK] self.idx_label = [None]*MAX_FACES_PER_BLOCK #px/int cnt_label[MAX_FACES_PER_BLOCK] self.cnt_label = [None]*MAX_FACES_PER_BLOCK #px/int texname[MAX_FACES_PER_BLOCK] self.texname = [None]*MAX_FACES_PER_BLOCK #px/int idx_triangles self.idx_triangles = None #px/int cnt_triangles self.cnt_triangles = None #px/cdef struct Cube: class cube: # pylint: disable=W0232, R0903 #px+unsigned int number_blocks #px/Block blocks[MAX_BLOCKS] blocks = [Block() for __block in range(MAX_BLOCKS)] #px+int idx_pick #px+int cnt_pick #px+int idx_debug #px+GLuint object_location #px+GLuint glbuffer #px+cdef Cube cube #px/cdef struct Animation_Struct: class animation: # pylint: disable=W0232, R0903 #px+float angle, angle_max #px/vec3 rotation rotation = [None] * 3 #px+mat4 rotation_matrix #px+cdef Animation_Struct animation def init_module(): #px+cdef int i cube.number_blocks = 0 #cube.blocks cube.idx_pick = 0 cube.cnt_pick = 0 cube.idx_debug = 0 animation.angle = animation.angle_max = 0 def set_transformations(blocks): #px+cdef unsigned int b,i,j for b in range(cube.number_blocks): for i in range(4): for j in range(4): cube.blocks[b].transformation[i][j] = float(blocks[b][i][j]) cube.blocks[b].in_motion = False #px/cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): def set_animation_start(blocks, angle_max, axisx, axisy, axisz): animation.angle = 0.0 animation.angle_max = angle_max animation.rotation = vec3(axisx, axisy, axisz) animation.rotation_matrix = mat4(1.) #px+cdef int block_id #px+cdef bint selected for block_id, selected in blocks: cube.blocks[block_id].in_motion = selected #px/cpdef set_animation_next(float increment): def set_animation_next(increment): animation.angle -= increment animation.rotation_matrix = rotate(animation.angle, animation.rotation) return abs(animation.angle) < animation.angle_max #pxd/cdef void gl_draw_cube(): def gl_draw_cube(): glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glEnableVertexAttribArray(NORMAL_ATTRIB_LOCATION) glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) glEnableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) #px+cdef unsigned int i #px+cdef mat4 object_matrix for i in range(cube.number_blocks): if cube.blocks[i].in_motion: object_matrix = animation.rotation_matrix * cube.blocks[i].transformation #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) else: #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) _gl_draw_block(i) glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) glDisableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) #px/cdef void _gl_draw_block(int block_id): def _gl_draw_block(block_id): #px+cdef int i glBindTexture(GL_TEXTURE_2D, 0) glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_triangles, cube.blocks[block_id].cnt_triangles) for i in range(cube.blocks[block_id].cnt_faces): # render the colors (ie the little sticky labels) glBindTexture(GL_TEXTURE_2D, cube.blocks[block_id].texname[i]) #TODO: Workaround for artifacts on the bottom and left sides of images glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT) glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_label[i], cube.blocks[block_id].cnt_label[i]) #pxd/cdef void gl_pick_cube(): def gl_pick_cube(): glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) #pxd/cdef void gl_init_buffers(): def gl_init_buffers(): #px/glGenBuffers(1, &cube.glbuffer) cube.glbuffer = glGenBuffers(1) #pxd/cdef void gl_delete_buffers(): def gl_delete_buffers(): glBindBuffer(GL_ARRAY_BUFFER, 0) #px/glDeleteBuffers(1, &cube.glbuffer) glDeleteBuffers(1, [cube.glbuffer]) cube.glbuffer = 0 #px/cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, texnames): def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, texnames): cube.number_blocks = nblocks assert cube.number_blocks <= MAX_BLOCKS #### Create the raw GL data #### #px+cdef long normalpointer, colorpointer, texpospointer #px+cdef unsigned int idx_block, idx_pick, cnt_pick, idx_debug normalpointer, colorpointer, texpospointer = vertexpointers labelinfos, idx_block, cnts_block, idx_pick, cnt_pick, idx_debug = vertexinfo #px+cdef unsigned int block, i, idx_label, cnt, faceno idx_label = 0 for block in range(cube.number_blocks): cube.blocks[block].cnt_faces = len(labelinfos[block]) for i, (cnt, faceno) in enumerate(labelinfos[block]): cube.blocks[block].idx_label[i] = idx_label cube.blocks[block].cnt_label[i] = cnt cube.blocks[block].texname[i] = texnames[faceno] idx_label += cnt cube.blocks[block].idx_triangles = idx_block cube.blocks[block].cnt_triangles = cnts_block[block] idx_block += cnts_block[block] cube.idx_pick = idx_pick cube.cnt_pick = cnt_pick cube.idx_debug = idx_debug debug('GL data: %d bytes' % len(vertexdata)) glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) #px/glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) #px/glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) #px/glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) #px/glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) #pxd/cdef void gl_draw_cube_debug(): def gl_draw_cube_debug(): #px+cdef mat4 object_matrix object_matrix = mat4(1.) #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) glDrawArrays(GL_LINES, cube.idx_debug, 6) glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) #pxd/cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): def gl_draw_select_debug(selectdata, size, prog_hud): #px+cdef int i, j #px+cdef GLintptr offset offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) #px/glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) glBufferSubData(GL_ARRAY_BUFFER, offset, size, selectdata) glDisable(GL_DEPTH_TEST) glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) glDrawArrays(GL_LINES, cube.idx_debug+6, 2) glUseProgram(prog_hud) glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) glEnable(GL_DEPTH_TEST) #pxd/cdef void gl_init_object_location(GLuint location): def gl_init_object_location(location): cube.object_location = location pybik-1.1/pybiklib/gamestate.py0000644000175000017500000001553012137176560017004 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: ui.c # Original copyright and license: GPL3+ # 1998, 2003 John Darrington # 2004 John Darrington, Dale Mellor from .debug import * # pylint: disable=W0614,W0401 from .model import empty_model from . import cubestate from .moves import MoveQueue class GameState (object): def __init__(self): self.mark_before = False self.initial_cube_state = cubestate.CubeState(empty_model) self.initial_cube_state.set_solved() self.current_cube_state = self.initial_cube_state.copy() self.all_moves = MoveQueue() def copy(self): gamestate = GameState() gamestate.mark_before = self.mark_before gamestate.initial_cube_state = self.initial_cube_state.copy() gamestate.current_cube_state = self.current_cube_state.copy() gamestate.all_moves = self.all_moves.copy() return gamestate def set_state(self, model, blocks, moves, position): self.initial_cube_state = cubestate.CubeState(model) try: self.initial_cube_state.parse_block(blocks) except ValueError as e: debug('Invalid block list:', *e.args) debug(' start with solved game') self.initial_cube_state.set_solved() self.current_cube_state = self.initial_cube_state.copy() self.all_moves = MoveQueue() if moves.startswith('native:'): moves = moves.split(':', 1)[1].lstrip() else: moves = '' pos, unused_cpos = self.all_moves.parse(moves, position, model) self.do_fast_forward(to_pos=pos) def get_state(self): model = self.initial_cube_state.model blocks = self.initial_cube_state.format_block() moves, position, unused_markup = self.all_moves.format(model) return model, blocks, 'native: ' + moves, position def set_model(self, model): self.initial_cube_state.set_model(model) self.current_cube_state.set_model(model) def new_game(self, model, solved): self.initial_cube_state = cubestate.CubeState(model) self.initial_cube_state.set_solved() if not solved: self.initial_cube_state.randomize() self.current_cube_state = self.initial_cube_state.copy() self.all_moves.reset() ### Funktions to control the cube for use in callbacks and plugins def request_back(self): '''One step back in the sequence of moves''' if self.all_moves.at_start(): return None self.mark_before = self.all_moves.is_mark_current() self.all_moves.retard() move = self.all_moves.current().inverted() self.current_cube_state.rotate_slice(move) return move def request_next(self): '''One step forward in the sequence of moves''' move = self.all_moves.current() if move: self.mark_before = self.all_moves.is_mark_current() self.current_cube_state.rotate_slice(move) self.all_moves.advance() return move def request_rotation(self, maxis, mslice, mdir): '''Make one new move. The usual rotation request, called when user uses mouse to rotate the cube by hand. The move is put into the `current' place, and all the moves in all_moves afterwards are zapped.''' self.all_moves.push_current((maxis, mslice, mdir)) def do_rewind_to_mark(self): if self.all_moves.at_start(): return False while True: self.all_moves.retard() move = self.all_moves.current().inverted() self.current_cube_state.rotate_slice(move) if self.all_moves.is_mark_current(): break return True def do_rewind_to_start(self): # for edit mode cloning is a must, even if already at start self.current_cube_state = self.initial_cube_state.copy() self.all_moves.rewind_start() def do_fast_forward(self, to_pos=-1): '''Go to end of the sequence of moves. All the moves take place on the cube, not via the animation routines, so the effect is to show the result instantaneously.''' move = self.all_moves.current() while move: if to_pos == self.all_moves.current_place: break self.current_cube_state.rotate_slice(move) self.all_moves.advance() if to_pos < 0 and self.all_moves.is_mark_current(): break move = self.all_moves.current() def set_from_formula(self, code, pos): self.current_cube_state = self.initial_cube_state.copy() self.all_moves.rewind_start() self.all_moves.reset() pos, unused_cpos = self.all_moves.parse(code, pos, self.current_cube_state.model) self.do_fast_forward(to_pos=pos) def set_as_initial_state(self): self.initial_cube_state = self.current_cube_state.copy() self.all_moves.truncate_before() def invert_moves(self): self.current_cube_state = self.initial_cube_state.copy() self.all_moves.invert() pos = self.all_moves.current_place self.all_moves.rewind_start() self.do_fast_forward(to_pos=pos) def normalize_complete_rotations(self): self.current_cube_state = self.initial_cube_state.copy() self.all_moves.normalize_complete_rotations(self.initial_cube_state.model) pos = self.all_moves.current_place self.all_moves.rewind_start() self.do_fast_forward(to_pos=pos) def swap_block(self, blockpos, maxis, mslice, mdir): self.initial_cube_state.swap_block(blockpos, maxis, mslice, mdir) # Because initial_cube_state changed, current_cube_state must be cloned now, # do_rewind_to_start does that. self.do_rewind_to_start() def rotate_block(self, blockpos, rdir): self.initial_cube_state.rotate_block(blockpos, rdir) self.do_rewind_to_start() pybik-1.1/pybiklib/plugins.py0000644000175000017500000004247512150713571016515 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: guile-hooks.c # Original copyright and license: 2004 Dale Mellor, GPL3+ import os import sys import imp from collections import namedtuple, OrderedDict from .debug import * # pylint: disable=W0401, W0614 from . import config from .moves import MoveQueue from . import model FILE_VERSION = '1.1' class PluginState (object): def __init__(self, app): self.initial_state = None self.current_state = app.gamestate.current_cube_state.copy() self.moves = MoveQueue() self.error_dialog = app.error_dialog self.set_progress = app.set_progress self.end_progress = app.end_progress def add_moves(self, moves): for move in moves: self.current_state.rotate_slice(move) self.moves.push(move) def add_flubrd(self, code): #TODO: here flubrd should be used, not the one in all_moves, # the converter in all_moves may be configurable in the future for res in self.moves.parse_iter(code, len(code), self.current_state.model): self.current_state.rotate_slice(res[0]) def random(self, count=-1): self.current_state.set_solved() self.current_state.randomize(count) self.initial_state = self.current_state.copy() self.moves.reset() def test_model(self, models, show_error=True): cube = self.current_state for unused_modelstr, Model, sizes, exp in models: if Model == '*': return True if Model is None: continue if cube.type != Model.type: continue sizedict = {} for size1, size2 in zip(sizes, cube.model.sizes): if size1 is None: continue if type(size1) is int: if size1 != size2: break else: sizedict[size1] = size2 else: try: if exp is None or eval(exp, {}, sizedict): return True except ValueError: continue if not show_error: return False models = [model_[0] for model_ in models if model_[1] is not None] if not models: self.error_dialog(_('This algorithm does not work for any model.\n')) elif len(models) == 1: self.error_dialog(_('This algorithm only works for:\n') + ' ' + models[0]) else: self.error_dialog( _('This algorithm only works for:\n') + '\n'.join([' • ' + m for m in models]) ) return False class PluginHelper (object): def __init__(self): self.scripts = OrderedDict() self.error_messages = [] def call(self, app, index): plugin_state = PluginState(app) all_models = [] for models, func in list(self.scripts.values())[index]: if plugin_state.test_model(models, show_error=False): func(plugin_state) break all_models += models else: plugin_state.test_model(all_models, show_error=True) return plugin_state.initial_state, plugin_state.moves def load_plugins_from_directory(self, dirname): if not os.path.isdir(dirname): debug('Plugins path does not exist:', dirname) return debug('Loading Plugins from', dirname) sys.path.insert(0, dirname) for filename in sorted(os.listdir(dirname), key=str.lower): unused_name, ext = os.path.splitext(filename) if ext != '.algorithm': continue if DEBUG_ALG: debug(' algorithm:', filename) try: self.load_text_plugin(os.path.join(dirname, filename)) except Exception as e: # pylint: disable=W0703 self.error_messages.append('Error loading {}:\n{}'.format(os.path.basename(filename), e)) sys.excepthook(*sys.exc_info()) def load_plugins(self): '''This function initializes the plugins for us, and once the plugins have all been imported, it returns the requested menu structure to the caller.''' self.scripts.clear() del self.error_messages[:] self.load_plugins_from_directory(config.SCRIPT_DIR) self.load_plugins_from_directory(config.USER_SCRIPT_DIR) if DEBUG_ALG: debug('found', len(self.scripts)) return [(path, i) for i, path in enumerate(self.scripts.keys())] @staticmethod def parse_text_plugin(filename): with open(filename, 'rt', encoding='utf-8') as fp: lines = fp.readlines() paras = [] # parse file para = {} key = None for line in lines: line = line.rstrip() if not line: # end para if para: paras.append(para) para = {} elif line[0] == '#': # comment pass elif line[0] in ' \t': line = line.strip() if para and line[0] != '#': # multiline para[key].append(line) else: key, value = line.split(':') value = value.strip() para[key] = [value] if value else [] if para: paras.append(para) return paras @staticmethod def eval_model(modelstrings): model_infos = [] for modelstr in modelstrings: try: model_info = model.from_string(modelstr) except ValueError as e: debug('Error in model %s:' % modelstr, e) else: model_infos.append(model_info) return model_infos @classmethod def eval_header(cls, header): value = header.get('File-Version', []) if len(value) == 0: value = FILE_VERSION debug('No file version found, assume version', value) elif len(value) == 1: value = value[0] else: debug('Multiple version numbers found:\n ', '\n '.join(value)) value = value[0] debug('assume version', value) if value != FILE_VERSION: debug('Wrong file version:', value) return None, None models = header.get('Model', []) models = cls.eval_model(models) ref_blocks = header.get('Ref-Blocks', None) if ref_blocks: ref_blocks = ' '.join(ref_blocks).split() return models, ref_blocks @classmethod def eval_paras(cls, models, ref_blocks, paras): for para in paras: value = para.get('Path', ()) if len(value) != 1 or not value[0]: if DEBUG_ALG: debug(' skip Path:', value) para.clear() continue def split_path(value): if not value: return None, () sep = value[0] value = value.strip(sep).split(sep) return sep, tuple(v for v in value if v) sep, value = split_path(value[0]) if not value: if DEBUG_ALG: debug(' skip Path:', value) para.clear() continue if DEBUG_ALG: debug(' Path:', value) para['Path'] = sep, value value = para.get('Depends', []) value = [split_path(v)[1] for v in value] para['Depends'] = value value = para.get('Model', None) para['Model'] = models if value is None else cls.eval_model(value) value = para.get('Ref-Blocks', None) if value: value = ' '.join(value).split() para['Ref-Blocks'] = value or ref_blocks value = para.get('Solution', None) def split_solution(value): value = value.split('#', 1)[0] value = value.split(',', 1) if len(value) != 2: return None cond = value[0].strip().split(' ') cond = [c.split('=') for c in cond if c] cond = [c for c in cond if len(c) == 2] return cond, value[1].strip() if value is not None: value = [split_solution(v) for v in value if v] para['Solution'] = value value = para.get('Moves', None) or None if value is not None: value = ' '.join(value) para['Moves'] = value value = para.get('Module', None) or None if value is not None: value = value[0] para['Module'] = value def load_text_plugin(self, filename): paras = self.parse_text_plugin(filename) if not paras: return # evaluate header models, ref_blocks = self.eval_header(paras[0]) if models is None: return # evaluate solutions self.eval_paras(models, ref_blocks, paras) scripts = [] for para in paras: if not para: continue sep, path = para['Path'] models = para['Model'] depends = para['Depends'] solution = para['Solution'] moves = para['Moves'] module = para['Module'] if depends or solution is not None: if moves is not None: debug(' solution can not have moves:', path) if module is not None: debug(' solution can not have a module field:', path) params = ScriptParams( depends=depends, ref_blocks=para['Ref-Blocks'], solution=solution, scripts=scripts, models=models, sep_path=(sep, path), ) scripts.append((path, sep!='@', models, ScriptFactory(self, params))) elif moves is not None: if module is not None: debug(' Moves can not have a module field:', path) def play_moves(moves, models): def func(game): if game.test_model(models): game.add_flubrd(moves) return func scripts.append((path, True, models, play_moves(moves, models))) elif module is not None: dirname = os.path.dirname(filename) modulename, funcname = module.split(' ', 1) mfile, mpath, mdesc = imp.find_module(modulename, [dirname]) moduleobj = imp.load_module(modulename, mfile, mpath, mdesc) modulefunc = getattr(moduleobj, funcname) scripts.append((path, True, models, modulefunc)) else: debug(' skip Path without algorithm:', path) for path, visible, models, func in scripts: if visible: funclist = self.scripts.setdefault(path, []) funclist.append((models, func)) ScriptParams = namedtuple('ScriptParams', 'depends ref_blocks solution scripts models sep_path') class ScriptFactory (object): def __init__(self, plugin, params): self.solved_face_colors = {} self.plugin = plugin self.params = params def __call__(self, plugin_state): if not plugin_state.test_model(self.params.models): return depends = list(reversed(self.params.depends)) scripts = {path: func for path, visible, models, func in self.params.scripts} for depend in depends: instance = scripts[depend] depends += instance.params.depends for depend in reversed(depends): instance = scripts[depend] self.execute(plugin_state, instance.params) self.execute(plugin_state, self.params) def test_face(self, cube, blocksym, condition, face): try: color2 = self.solved_face_colors[condition[face]] except KeyError: return True blocknum = cube.model.block_symbolic_to_block_index(blocksym) color1 = cube.get_colorsymbol(blocknum, blocksym[face]) return color1 == color2 def test_basic_condition(self, cube, position, condition): assert len(position) == len(condition) for i in range(len(position)): if not self.test_face(cube, position, condition, i): return False return True @staticmethod def opposite(face): return { 'f': 'b', 'b': 'f', 'l': 'r', 'r': 'l', 'u': 'd', 'd': 'u', }[face] def test_pattern_condition(self, cube, position, condition): if '?' in condition: conditions = (condition.replace('?', face, 1) for face in 'flubrd' if face not in condition if self.opposite(face) not in condition) return self.test_or_conditions(cube, position, conditions) else: return self.test_basic_condition(cube, position, condition) @staticmethod def rotated_conditions(condition): for i in range(len(condition)): yield condition[i:] + condition[:i] def test_prefix_condition(self, cube, position, condition): if condition.startswith('!*'): return not self.test_or_conditions(cube, position, self.rotated_conditions(condition[2:])) elif condition.startswith('*'): #TODO: Instead of testing only rotated conditions, test all permutations. # This should not break existing rules, and would allow to match # e.g. dfr and dfl. Could be done by comparing sorted strings after # expanding patterns. return self.test_or_conditions(cube, position, self.rotated_conditions(condition[1:])) elif condition.startswith('!'): return not self.test_pattern_condition(cube, position, condition[1:]) else: return self.test_pattern_condition(cube, position, condition) def test_or_conditions(self, cube, position, conditions): for prefix_cond in conditions: if self.test_prefix_condition(cube, position, prefix_cond): return True return False def test_and_conditions(self, cube, conditions): for position, or_cond in conditions: if not self.test_or_conditions(cube, position, or_cond.split('|')): return False return True def execute(self, plugin_state, params): rules = params.solution if rules is None: return cube = plugin_state.current_state count = 0 pos = 0 while pos < len(rules): self.solved_face_colors.clear() for block in params.ref_blocks: blocknum = cube.model.block_symbolic_to_block_index(block) for face in block: self.solved_face_colors[face] = cube.get_colorsymbol(blocknum, face) conditions, moves = rules[pos] if self.test_and_conditions(cube, conditions): if DEBUG_ALG: print('{}: accept: {:2}. {}, {}'.format( params.sep_path[0].join(params.sep_path[1]), pos+1, ' '.join('='.join(c) for c in conditions), moves)) if moves == '@@solved': return if count > 4 * len(rules): # this value is just guessed plugin_state.error_dialog( 'An infinite loop was detected. ' 'This is probably an error in the solution.') return count += 1 plugin_state.add_flubrd(moves) pos = 0 else: pos += 1 plugin_state.error_dialog( 'No matching rules found. ' 'This is probably an error in the solution.') pybik-1.1/pybiklib/dialogs.py0000644000175000017500000007342412157270261016455 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: menus.c # Original copyright and license: 2003, 2004 John Darrington, GPL3+ # pylint: disable=C0321 import os import re # pylint: disable=W0614,W0401 from PyQt4.QtCore import * from PyQt4.QtCore import pyqtSignal as Signal, pyqtSlot as Slot from PyQt4.QtGui import * from .debug import * # pylint: enable=W0614,W0401 from . import config from .settings import settings from .textures import textures from .model import models try: _ except NameError: _ = lambda t: t class Dialog (QDialog): _instance = None _classes = [] def __init__(self, parent): QDialog.__init__(self, parent) self.accepted.connect(self.on_response) self._ignore_changed = False self.bound = {} settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) @classmethod def run(cls, parent_window=None): if cls._instance is None: cls._instance = cls(parent_window) ret = cls._instance cls._classes.append(cls) else: ret = None cls._instance.move(cls._instance.pos()) cls._instance.show() return ret @classmethod def delete(cls): while cls._classes: cls_ = cls._classes.pop(0) # pylint: disable=W0212 cls_._instance.close() cls_._instance.deleteLater() # pylint: enable=W0212 cls_._instance = None def bind(self, key, widget, getter, setter, signal): if isinstance(getter, str): getter = getattr(widget, getter) if isinstance(setter, str): setter = getattr(widget, setter) if isinstance(signal, str): signal = getattr(widget, signal) setter(getattr(settings, key)) if signal is not None: signal.connect(lambda: self.on_widget_changed(key)) self.bound[key] = (getter, setter, signal) @staticmethod def bind_reset(settings_key, button): button.clicked.connect(lambda: delattr(settings, settings_key)) def on_response(self): pass def on_widget_changed(self, key): if self._ignore_changed: return try: getter = self.bound[key][0] except KeyError: return self._ignore_changed = True setattr(settings, key, getter()) self._ignore_changed = False def on_settings_changed(self, key): if self._ignore_changed: return try: setter = self.bound[key][1] except KeyError: return self._ignore_changed = True setter(getattr(settings, key)) self._ignore_changed = False class ColorIconEngine (QIconEngineV2): def __init__(self): QIconEngineV2.__init__(self) self.color = 'black' def paint(self, painter, rect, unused_mode, unused_state): painter.fillRect(rect, QColor(self.color)) class ColorButton (QPushButton): color_changed = Signal(str) def __init__(self, replace_button): self._icon = ColorIconEngine() parent = replace_button.parentWidget() QPushButton.__init__(self, QIcon(self._icon), '', parent) height = self.iconSize().height() self.setIconSize(QSize(height * self.width() // self.height(), height)) self.setSizePolicy(replace_button.sizePolicy()) self.setObjectName(replace_button.objectName()) layout = replace_button.parentWidget().layout() index = layout.indexOf(replace_button) position = layout.getItemPosition(index) layout.removeWidget(replace_button) layout.addWidget(self, *position) replace_button.deleteLater() self.clicked.connect(self.on_clicked) def set_color(self, color): self._icon.color = color self.update() def get_color(self): return self._icon.color def on_clicked(self): dialog = QColorDialog(self) dialog.setCurrentColor(QColor(self.get_color())) if dialog.exec_() == QDialog.Accepted: color = dialog.currentColor().name() self.set_color(color) self.color_changed.emit(color) class ShortcutEditor (QLabel): key_pressed = Signal() def __init__(self, parent): QLabel.__init__(self, _('Press a key …'), parent) self.setFocusPolicy(Qt.StrongFocus) self.setAutoFillBackground(True) self.key = None SAFE_MODIFIER_MASK = Qt.ShiftModifier | Qt.ControlModifier IGNORE_KEYS = [Qt.Key_Shift, Qt.Key_Control, Qt.Key_Meta, Qt.Key_Alt, Qt.Key_AltGr, Qt.Key_CapsLock, Qt.Key_NumLock, Qt.Key_ScrollLock] def keyPressEvent(self, event): if event.key() in self.IGNORE_KEYS or event.count() != 1: return QLabel.keyPressEvent(self, event) mod = event.modifiers() & self.SAFE_MODIFIER_MASK key = QKeySequence(event.key() | mod).toString().split('+') if event.modifiers() & Qt.KeypadModifier: key.insert(-1, 'KP') self.key = '+'.join(key) self.key_pressed.emit() class ShortcutDelegate (QStyledItemDelegate): def __init__(self, parent): QStyledItemDelegate.__init__(self, parent) def createEditor(self, parent, unused_option, unused_index): editor = ShortcutEditor(parent) editor.key_pressed.connect(self.on_editor_key_pressed) return editor def setEditorData(self, editor, index): pass def setModelData(self, editor, model, index): if editor.key is not None: model.setData(index, editor.key, Qt.DisplayRole) def on_editor_key_pressed(self): editor = self.sender() self.commitData.emit(editor) self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint) class PreferencesDialog (Dialog): sample_buffers = 0 def __init__(self, parent): Dialog.__init__(self, parent) self.ui = UI(self, 'preferences.ui') from .ui.preferences import retranslate retranslate(self) self.ui.button_animspeed_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_lighting_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_antialiasing_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_mirror_faces_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_movekey_add.setIcon(QIcon.fromTheme('list-add')) self.ui.button_movekey_remove.setIcon(QIcon.fromTheme('list-remove')) self.ui.button_movekey_reset.setIcon(QIcon.fromTheme('document-revert')) self.ui.button_color_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_image_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_background_color_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_mousemode_quad.setIcon(QIcon(os.path.join(config.UI_DIR, "mousemode-quad.png"))) self.ui.button_mousemode_ext.setIcon(QIcon(os.path.join(config.UI_DIR, "mousemode-ext.png"))) self.ui.buttonBox.button(QDialogButtonBox.Close).setDefault(True) self.ui.label_needs_restarted.setVisible(False) # graphic tab self.ui.slider_animspeed.setValue(settings.draw.speed) self.ui.slider_animspeed.setRange(*settings.draw.speed_range) self.bind('draw.speed', self.ui.slider_animspeed, 'value', 'setValue', 'valueChanged') self.bind_reset('draw.speed', self.ui.button_animspeed_reset) self.bind('draw.lighting', self.ui.checkbox_lighting, 'isChecked', 'setChecked', 'toggled') self.bind_reset('draw.lighting', self.ui.button_lighting_reset) def reset_antialiasing(): del settings.draw.samples self.ui.button_antialiasing_reset.clicked.connect(reset_antialiasing) for text in settings.draw.samples_range: self.ui.combobox_samples.addItem(_(text), text) self.ui.combobox_samples.setCurrentIndex(settings.draw.samples) self.bind('draw.samples', self.ui.combobox_samples, 'currentIndex', 'setCurrentIndex', 'currentIndexChanged') self.ui.spinbox_mirror_faces.setRange(*settings.draw.mirror_distance_range) def set_mirror_faces(checked): self.ui.checkbox_mirror_faces.setChecked(checked) self.ui.spinbox_mirror_faces.setEnabled(checked) self.bind('draw.mirror_faces', self.ui.checkbox_mirror_faces, 'isChecked', set_mirror_faces, 'toggled') self.bind_reset('draw.mirror_faces', self.ui.button_mirror_faces_reset) self.bind('draw.mirror_distance', self.ui.spinbox_mirror_faces, 'value', 'setValue', 'valueChanged') self.bind_reset('draw.mirror_distance', self.ui.button_mirror_faces_reset) html = '

{}

' html = html.format(Qt.escape(_('The program needs to be restarted for the changes to take effect.'))) self.ui.label_needs_restarted.setText(html) # mouse tab def set_selection_mode(unused_mode): if settings.draw.selection_nick == 'quadrant': self.ui.button_mousemode_quad.setChecked(True) elif settings.draw.selection_nick == 'simple': self.ui.button_mousemode_ext.setChecked(True) self.bind('draw.selection', None, None, set_selection_mode, None) # keys tab self.liststore_movekeys = QStandardItemModel(self) self.fill_liststore_movekeys() self.ui.listview_movekeys.setModel(self.liststore_movekeys) self.liststore_movekeys.itemChanged.connect(self.on_liststore_movekeys_itemChanged) self.shortcut_delegate = ShortcutDelegate(self.ui.listview_movekeys) self.ui.listview_movekeys.setItemDelegateForColumn(1, self.shortcut_delegate) # design tab self.image_dirname = os.environ.get('HOME', '') #TODO: Use Picture folder, Qt5 has a class for that self.active_face = 0 self.liststore_faces = self.create_face_selector() self.button_color = ColorButton(self.ui.button_color) self.ui.button_color = None self.setTabOrder(self.ui.listview_faces, self.button_color) self.button_color.color_changed.connect(self.on_button_color_color_changed) self.button_background_color = ColorButton(self.ui.button_background_color) self.ui.button_background_color = None self.setTabOrder(self.ui.radiobutton_mosaic, self.button_background_color) # Only a single color, no picture or pattern self.ui.combobox_image.addItem(_('plain'), '') for filename in textures.stock_files: pixmap = QPixmap(textures.get_stock_pixbuf(filename)) icon = QIcon(pixmap) self.ui.combobox_image.addItem(icon, '', filename) self.ui.combobox_image.addItem(_('select …'), '/') self.bind_reset_item('theme.face.{}.color', self.ui.button_color_reset) self.bind_reset_item('theme.face.{}.image', self.ui.button_image_reset) self.bind('theme.bgcolor', self.button_background_color, 'get_color', 'set_color', 'color_changed') self.bind_reset('theme.bgcolor', self.ui.button_background_color_reset) index = self.liststore_faces.index(self.active_face, 1) self.ui.listview_faces.setCurrentIndex(index) def create_face_selector(self): liststore_faces = QStandardItemModel() face_names = [_('Up'), _('Down'), _('Left'), _('Right'), _('Front'), _('Back')] for i in range(6): liststore_faces.appendRow((QStandardItem(i), QStandardItem(face_names[i]))) filename = settings.theme.face[i].image if filename.startswith('/'): self.image_dirname = os.path.dirname(filename) self.ui.listview_faces.setModel(liststore_faces) self.ui.listview_faces.setModelColumn(1) #XXX: workaround, listview_faces should automatically set to the correct width fm = QFontMetrics(self.ui.listview_faces.font()) width = max(fm.width(fn) for fn in face_names) + 8 self.ui.listview_faces.setMaximumWidth(width) self.ui.listview_faces.selectionModel().currentChanged.connect(self.on_listview_faces_currentChanged) return liststore_faces def fill_liststore_movekeys(self): for move, key in settings.draw.accels: self.liststore_movekeys.appendRow([QStandardItem(move), QStandardItem(key)]) self.liststore_movekeys.setHeaderData(0, Qt.Horizontal, _('Move')) self.liststore_movekeys.setHeaderData(1, Qt.Horizontal, _('Key')) def bind_reset_item(self, settings_key, button): def on_clicked(): delattr(settings, settings_key.format(self.active_face)) button.clicked.connect(on_clicked) @ staticmethod def _accel_mods_to_str(accel_mods): accel_str = '' for a in accel_mods.value_nicks: if accel_str: accel_str += '+' if a.endswith('-mask'): a = a[:-5] accel_str += a return accel_str def set_imagefile(self, imagefile): index_icon = len(textures.stock_files) + 1 if not imagefile: index = 0 icon = QIcon() elif imagefile.startswith('/'): index = index_icon icon = QIcon(imagefile) else: try: index = textures.stock_files.index(imagefile) + 1 except ValueError: index = 0 icon = QIcon() self.ui.combobox_image.setItemIcon(index_icon, icon) self.ui.combobox_image.setCurrentIndex(index) def on_settings_changed(self, key): Dialog.on_settings_changed(self, key) if self._ignore_changed: return self._ignore_changed = True if key == 'draw.samples': visible = (self.sample_buffers != 2**settings.draw.samples > 1) self.ui.label_needs_restarted.setVisible(visible) elif key == 'draw.accels': self.liststore_movekeys.clear() self.fill_liststore_movekeys() elif key == 'theme.face.{}.color'.format(self.active_face): self.button_color.set_color(settings.theme.face[self.active_face].color) elif key == 'theme.face.{}.image'.format(self.active_face): self.set_imagefile(settings.theme.face[self.active_face].image) elif key == 'theme.face.{}.mode': imagemode = settings.theme.face[self.active_face].mode_nick if imagemode == 'tiled': self.ui.radiobutton_tiled.setChecked(True) elif imagemode == 'mosaic': self.ui.radiobutton_mosaic.setChecked(True) self._ignore_changed = False ### @Slot(bool) def on_checkbox_mirror_faces_toggled(self, checked): self.ui.spinbox_mirror_faces.setEnabled(checked) ### mouse handlers ### def set_mousemode(self, checked, mode): if self._ignore_changed: return if checked: self._ignore_changed = True settings.draw.selection_nick = mode self._ignore_changed = False @Slot(bool) def on_button_mousemode_quad_toggled(self, checked): self.set_mousemode(checked, 'quadrant') @Slot(bool) def on_button_mousemode_ext_toggled(self, checked): self.set_mousemode(checked, 'simple') ### key handlers ### def get_move_key_list(self): move_keys = [] for i in range(self.liststore_movekeys.rowCount()): move, key = [self.liststore_movekeys.item(i, j).data(Qt.DisplayRole) for j in (0, 1)] move_keys.append((move, key)) return move_keys @Slot() def on_button_movekey_add_clicked(self): row = self.ui.listview_movekeys.currentIndex().row() self._ignore_changed = True self.liststore_movekeys.insertRow(row, (QStandardItem(''), QStandardItem(''))) index = self.liststore_movekeys.index(row, 0) self.ui.listview_movekeys.setCurrentIndex(index) self.ui.listview_movekeys.edit(index) self._ignore_changed = False @Slot() def on_button_movekey_remove_clicked(self): row = self.ui.listview_movekeys.currentIndex().row() self._ignore_changed = True self.liststore_movekeys.takeRow(row) settings.draw.accels = self.get_move_key_list() self._ignore_changed = False @Slot() def on_button_movekey_reset_clicked(self): # pylint: disable=R0201 del settings.draw.accels def on_liststore_movekeys_itemChanged(self, unused_item): self._ignore_changed = True settings.draw.accels = self.get_move_key_list() self._ignore_changed = False ### appearance handlers ### def on_listview_faces_currentChanged(self, current): self.active_face = current.row() self._ignore_changed = True self.button_color.set_color(settings.theme.face[self.active_face].color) self.set_imagefile(settings.theme.face[self.active_face].image) imagemode = settings.theme.face[self.active_face].mode_nick if imagemode == 'tiled': self.ui.radiobutton_tiled.setChecked(True) elif imagemode == 'mosaic': self.ui.radiobutton_mosaic.setChecked(True) self._ignore_changed = False def on_button_color_color_changed(self, color): if self._ignore_changed: return self._ignore_changed = True settings.theme.face[self.active_face].color = color self._ignore_changed = False @Slot(int) def on_combobox_image_activated(self, index): if self._ignore_changed: return if index == 0: filename = '' else: try: filename = textures.stock_files[index-1] except IndexError: filename = QFileDialog.getOpenFileName(self, _("Open Image"), self.image_dirname) if isinstance(filename, (tuple, list)): filename = filename[0] if filename == '': # canceled, set the old image filename = settings.theme.face[self.active_face].image self.set_imagefile(filename) else: self.image_dirname = os.path.dirname(filename) self._ignore_changed = True settings.theme.face[self.active_face].image = filename self._ignore_changed = False @Slot(bool) def on_radiobutton_tiled_toggled(self, checked): self.set_imagemode(checked, 'tiled') @Slot(bool) def on_radiobutton_mosaic_toggled(self, checked): self.set_imagemode(checked, 'mosaic') def set_imagemode(self, checked, mode): if self._ignore_changed: return if checked: self._ignore_changed = True settings.theme.face[self.active_face].mode_nick = mode self._ignore_changed = False class SelectModelDialog (Dialog): response_ok = Signal(int, tuple, bool) def __init__(self, parent): Dialog.__init__(self, parent) self.ui = UI(self, 'model.ui') from .ui.model import retranslate retranslate(self) for text in settings.game.type_range: self.ui.combobox_model.addItem(_(text), text) mtype = settings.game.type self.ui.combobox_model.setCurrentIndex(mtype) self.on_combobox_model_activated(mtype) size = settings.game.size width, height, depth = size self.ui.spin_size1.setValue(width) self.ui.spin_size2.setValue(height) self.ui.spin_size3.setValue(depth) @Slot(int) def on_combobox_model_activated(self, index): mtype = models[index].type self.ui.label_width.setText({'Cube':_('Size:'), 'Tower':_('Basis:')}.get(mtype, _('Width:'))) self.ui.label_width.setEnabled(mtype in ['Cube', 'Tower', 'Brick']) self.ui.label_heigth.setEnabled(mtype in ['Tower', 'Brick']) self.ui.label_depth.setEnabled(mtype == 'Brick') self.ui.spin_size1.setEnabled(mtype in ['Cube', 'Tower', 'Brick']) self.ui.spin_size2.setEnabled(mtype in ['Tower', 'Brick']) self.ui.spin_size3.setEnabled(mtype == 'Brick') def on_response(self): self.response_ok.emit( self.ui.combobox_model.currentIndex(), (self.ui.spin_size1.value(), self.ui.spin_size2.value(), self.ui.spin_size3.value()), self.ui.checkbox_solved.isChecked()) class ProgressDialog (QProgressDialog): def __init__(self, parent): QProgressDialog.__init__(self, parent) self.canceled_ = False self.value_max = 10 self.value = 0 self.setWindowModality(Qt.WindowModal) self.setMaximum(self.value_max) self.setMinimumDuration(0) self.setAutoReset(False) self.canceled.connect(self.on_canceled) def on_canceled(self): self.canceled_ = True self.setLabelText(_('Canceling operation, please wait')) def tick(self, step, message=None, value_max=None): if not self.isVisible(): self.show() if message is not None: self.setLabelText(message) if value_max is not None: self.value_max = value_max self.value = 0 self.setMaximum(value_max) if step < 0 or self.value > self.value_max: self.setValue(0) self.setMaximum(0) else: self.setValue(self.value) self.value += step return self.canceled_ def done(self): self.canceled_ = False self.reset() def linkedtext_to_html(text): html = QTextDocumentFragment.fromPlainText(text).toHtml() html = re.sub(r'<((?:http:|https:|text:).*?)\|>', r'', html) html = re.sub(r'<\|>', r'', html) return re.sub(r'<((?:http:|https:).*?)>', r'<\1>', html) class UI: def __init__(self, toplevel, filename): self._toplevel = toplevel from PyQt4 import uic uic.loadUi(os.path.join(config.UI_DIR, filename), toplevel) def __getattr__(self, attrname): if attrname[0] == '_': return object.__getattr__(self, attrname) else: return self._toplevel.findChild(QObject, attrname) class AboutDialog (QDialog): def __init__(self, parent): QDialog.__init__(self, parent) self.about = UI(self, 'about.ui') from .ui.about import retranslate retranslate(self) self.fill_header() self.fill_about_tab() self.fill_feedback_tab() self.fill_translation_tab() self.fill_license_tab() self.index_tab_about = self.about.tab_widget.indexOf(self.about.tab_about) self.index_tab_license = self.about.tab_widget.indexOf(self.about.tab_license) # About tab animation self.scrollbar = self.about.text_translators.verticalScrollBar() self.animation = QPropertyAnimation(self.scrollbar, 'value') self.animation.setLoopCount(-1) def fill_header(self): self.about.label_icon.setPixmap(QPixmap(os.path.join(config.PIXMAP_DIR, 'pybik-64'))) self.about.label_appname.setText(_(config.APPNAME)) self.about.label_version.setText(config.VERSION) self.about.label_description.setText(_(config.SHORT_DESCRIPTION)) def fill_about_tab(self): self.about.label_copyright.setText(config.COPYRIGHT) self.about.label_website.setText( '

{}

' .format(config.WEBSITE, _('Pybik project website'))) html_template = ''' {}''' html_p_template = '

{}

' html_language_template = '{}' html_person_template = '{}' html_p_items = [] from .translators import translators try: import icu except ImportError: print('PyICU is not installed') langname_from_code = lambda code, name: name else: def langname_from_code(code, name): iculocale = icu.Locale.createFromName(code) lang = iculocale.getLanguage() if icu.Locale.createFromName(lang).getDisplayName() == lang: return name return str(iculocale.getDisplayName()) or name import locale sortfunc = lambda v: locale.strxfrm(v[0]) def gentranslators(): for language, langcode, persons in translators: language = langname_from_code(langcode, language) yield language, persons for language, persons in sorted(gentranslators(), key=sortfunc): language = Qt.escape(language) html_items = [html_language_template.format(language)] for name, link in sorted(persons, key=sortfunc): name = Qt.escape(name) html_items.append(html_person_template.format(link, name)) html_p_items.append(html_p_template.format('
'.join(html_items))) html = html_template.format(''.join(html_p_items)) self.about.text_translators.setHtml(html) self.about.text_translators.anchorClicked.connect(QDesktopServices.openUrl) self.about.text_translators.viewport().installEventFilter(self) def fill_feedback_tab(self): html = linkedtext_to_html(config.get_filebug_text()) self.about.label_feedback.setText(html) def fill_translation_tab(self): html = linkedtext_to_html(_(config.TRANSLATION_TEXT)) self.about.label_translation.setText(html) def fill_license_tab(self): self.about.text_license_short.hide() self.about.text_license_full.hide() html = linkedtext_to_html('\n\n'.join((_(config.LICENSE_INFO), _(config.LICENSE_FURTHER)))) self.about.text_license_short.setHtml(html) try: with open(config.LICENSE_FILE, 'rt', encoding='utf-8') as license_file: text = license_file.read() except Exception as e: print('Unable to find license text:', e) text = _(config.LICENSE_NOT_FOUND) self.about.text_license_full.setLineWrapMode(QTextEdit.WidgetWidth) html = linkedtext_to_html(text) self.about.text_license_full.setHtml(html) self.about.tab_widget.currentChanged.connect(self._on_tab_widget_currentChanged) self.about.text_license_short.anchorClicked.connect(self._on_text_license_anchorClicked) def update_animation(self): smin = self.scrollbar.minimum() smax = self.scrollbar.maximum() if smax <= smin: return self.animation.setDuration((smax-smin) * 40) self.animation.setKeyValueAt(0., smin) self.animation.setKeyValueAt(0.04, smin) self.animation.setKeyValueAt(0.50, smax) self.animation.setKeyValueAt(0.54, smax) self.animation.setKeyValueAt(1., smin) def showEvent(self, event): if self.animation.state() == QAbstractAnimation.Stopped: self.update_animation() self.scrollbar.hide() self.animation.start() def resizeEvent(self, event): self.update_animation() def eventFilter(self, obj, event): #assert obj == self.about.text_translators.viewport() if event.type() in [QEvent.MouseButtonPress, QEvent.Wheel]: self.animation.pause() self.scrollbar.show() return False def _on_tab_widget_currentChanged(self, index): if index == self.index_tab_about: self.animation.resume() self.scrollbar.hide() else: self.animation.pause() self.scrollbar.show() if index == self.index_tab_license: self.about.text_license_short.setVisible(True) self.about.text_license_full.setVisible(False) QTimer.singleShot(0, self.adjustSize) def _on_text_license_anchorClicked(self, url): if url.toString() == 'text:FULL_LICENSE_TEXT': self.about.text_license_short.setVisible(False) self.about.text_license_full.setVisible(True) else: QDesktopServices.openUrl(url) def run(self): self.exec_() self.deleteLater() pybik-1.1/pybiklib/application.py0000644000175000017500000010417312152244221017322 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: widget-set.c # Original copyright and license: 2003, 2004 John Darrington, GPL3+ from collections import OrderedDict # pylint: disable=W0614,W0401 from PyQt4.QtCore import * from PyQt4.QtCore import pyqtSignal as Signal, pyqtSlot as Slot from PyQt4.QtGui import * from .debug import * # pylint: enable=W0614,W0401 from . import config from . import dialogs from . import plugins from .model import models from . import gamestate from . import drawingarea from .settings import settings try: _, ngettext except NameError: debug('gettext not found') _ = lambda string: string ngettext = lambda singular, plural, cnt: singular if cnt == 1 else plural class AnimType (object): # pylint: disable=R0903 NONE, FWD, BWD, KEY, NEW = list(range(5)) class ElideLabel (QLabel): def paintEvent(self, unused_event): p = QPainter(self) fm = QFontMetrics(self.font()) rect = self.contentsRect() if fm.width(self.text()) > rect.width(): gradient = QLinearGradient(rect.topLeft(), rect.topRight()) start = (rect.width() - 2*rect.height()) / rect.width() gradient.setColorAt(start, self.palette().color(QPalette.WindowText)) gradient.setColorAt(1.0, self.palette().color(QPalette.Window)) pen = QPen() pen.setBrush(QBrush(gradient)) p.setPen(pen) p.drawText(self.rect(), Qt.TextSingleLine, self.text()) class QMoveEdit (QLineEdit): nextword = Signal() prevword = Signal() swapnext = Signal() swapprev = Signal() def keyPressEvent(self, event): if event.matches(QKeySequence.MoveToNextWord): self.nextword.emit() elif event.matches(QKeySequence.MoveToPreviousWord): self.prevword.emit() elif event.key() == Qt.Key_Right and event.modifiers() == Qt.AltModifier: self.swapnext.emit() elif event.key() == Qt.Key_Left and event.modifiers() == Qt.AltModifier: self.swapprev.emit() else: QLineEdit.keyPressEvent(self, event) class MainWindow (QMainWindow): ### init ### def __init__(self, opts): QMainWindow.__init__(self) self.ui = dialogs.UI(self, 'main.ui') from .ui.main import retranslate retranslate(self) # UI self.ui.splitter.setCollapsible(0, False) self.ui.splitter.setStretchFactor(0, 1) self.ui.splitter.setStretchFactor(1, 0) self.ui.label_debug_text.setVisible(DEBUG_DRAW or DEBUG_FPS) # set icons self.setWindowIcon(QIcon(config.IMAGE_FILE)) self.ui.button_edit_exec.setIcon(QIcon.fromTheme('system-run')) self.ui.button_edit_clear.setIcon(QIcon.fromTheme('edit-clear')) self.ui.action_new.setIcon(QIcon.fromTheme('document-new')) self.ui.action_new_solved.setIcon(QIcon.fromTheme('document-new')) #self.ui.action_selectmodel.setIcon(QIcon.fromTheme('document-properties')) self.ui.action_quit.setIcon(QIcon.fromTheme('application-exit')) self.ui.action_rewind.setIcon(QIcon.fromTheme('media-seek-backward')) self.ui.action_previous.setIcon(QIcon.fromTheme('media-skip-backward')) self.ui.action_stop.setIcon(QIcon.fromTheme('media-playback-stop')) self.ui.action_play.setIcon(QIcon.fromTheme('media-playback-start')) self.ui.action_next.setIcon(QIcon.fromTheme('media-skip-forward')) self.ui.action_forward.setIcon(QIcon.fromTheme('media-seek-forward')) self.ui.action_add_mark.setIcon(QIcon.fromTheme('list-add')) self.ui.action_remove_mark.setIcon(QIcon.fromTheme('list-remove')) self.ui.action_preferences.setIcon(QIcon.fromTheme('document-properties')) self.ui.action_info.setIcon(QIcon.fromTheme('help-about')) self.ui.action_selectmodel.setShortcut(QKeySequence(settings.action.selectmodel)) self.ui.action_initial_state.setShortcut(QKeySequence(settings.action.initial_state)) self.ui.action_reset_rotation.setShortcut(QKeySequence(settings.action.reset_rotation)) self.ui.action_invert_moves.setShortcut(QKeySequence(settings.action.invert_moves)) self.ui.action_reload_scripts.setShortcut(QKeySequence(settings.action.reload_scripts)) self.ui.action_preferences.setShortcut(QKeySequence(settings.action.preferences)) self.ui.action_normalize_complete_rotations.setShortcut( QKeySequence(settings.action.normalize_complete_rotations)) # widgets that are not created with Qt Designer self.playbarstate = self.create_toolbar() self.edit_moves = QMoveEdit() self.edit_moves.setObjectName("edit_moves") self.edit_moves.setFrame(False) self.ui.layout_moves.insertWidget(1, self.edit_moves) self.edit_moves.returnPressed.connect(self.on_edit_moves_returnPressed) self.edit_moves.nextword.connect(self.on_edit_moves_nextword) self.edit_moves.prevword.connect(self.on_edit_moves_prevword) self.edit_moves.swapprev.connect(self.on_edit_moves_swapprev) self.edit_moves.swapnext.connect(self.on_edit_moves_swapnext) self.cube_area = self.create_cube_area(opts) self.cube_area.drop_color.connect(self.on_cubearea_drop_color) self.cube_area.drop_file.connect(self.on_cubearea_drop_file) self.cube_area.debug_text.connect(self.on_cubearea_debug_text) self.setTabOrder(self.edit_moves, self.cube_area) self.setTabOrder(self.cube_area, self.ui.box_sidepane) self.cube_area.setFocus(Qt.OtherFocusReason) self.status_text = ElideLabel() p = self.status_text.sizePolicy() p.setHorizontalStretch(1) p.setHorizontalPolicy(QSizePolicy.Ignored) self.status_text.setSizePolicy(p) self.ui.statusbar.addWidget(self.status_text) # created when needed self.progress_dialog = None # actions that belongs to no widget self.action_jump_to_editbar = QAction(self) self.action_jump_to_editbar.setObjectName('action_jump_to_editbar') self.action_jump_to_editbar.setShortcut(QKeySequence(settings.action.edit_moves)) self.action_jump_to_editbar.triggered.connect(self.on_action_jump_to_editbar_triggered) self.addAction(self.action_jump_to_editbar) self.action_edit_model = QAction(self) self.action_edit_model.setObjectName('action_edit_model') self.action_edit_model.setShortcut(QKeySequence(settings.action.edit_model)) self.action_edit_model.triggered.connect(self.on_action_edit_model_triggered) self.addAction(self.action_edit_model) self.action_reload_shader = QAction(self) self.action_reload_shader.setObjectName('action_reload_shader') self.action_reload_shader.setShortcut(QKeySequence(settings.action.reload_shader)) self.action_reload_shader.triggered.connect(self.on_action_reload_shader_triggered) self.addAction(self.action_reload_shader) # plugins self.treestore = QStandardItemModel() self.selected_tree_path = None self.active_script_group = 0 self.plugin_helper = plugins.PluginHelper() self.add_scripts_to_sidepane(False) QTimer.singleShot(0, self.add_scripts_to_sidepane) self.unsolved = False self.animtype = AnimType.NONE # Load window state from settings self.ui.action_toolbar.setChecked(settings.window.toolbar) self.ui.action_editbar.setChecked(settings.window.editbar) self.ui.action_statusbar.setChecked(settings.window.statusbar) self.ui.toolbar.setVisible(settings.window.toolbar) self.ui.frame_editbar.setVisible(settings.window.editbar) self.ui.statusbar.setVisible(settings.window.statusbar) self.move_keys = self.get_move_key_dict() settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) settings.keystore.error.connect(self.on_settings_error) # Reload last game self.gamestate = gamestate.GameState() QTimer.singleShot(0, self.load_game) self.update_ui() self.resize(*settings.window.size) divider_position = settings.window.divider self.show() sizes = self.ui.splitter.sizes() self.ui.splitter.setSizes([divider_position, sum(sizes)-divider_position]) def create_cube_area(self, opts): if DEBUG_THREAD: cube_area = drawingarea.CubeAreaThreaded(opts) else: cube_area = drawingarea.CubeArea(opts) cube_area.setObjectName('drawingarea') sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) cube_area.setSizePolicy(sizePolicy) self.ui.verticalLayout.addWidget(cube_area) cube_area.animation_ending.connect(self.on_cubearea_animation_ending) cube_area.request_rotation.connect(self.on_cubearea_request_rotation) cube_area.request_swap_blocks.connect(self.on_cubearea_request_swap_blocks) cube_area.request_rotate_block.connect(self.on_cubearea_request_rotate_block) glformat = cube_area.format() dialogs.PreferencesDialog.sample_buffers = max(glformat.samples(), 1) cube_area.start() return cube_area def create_toolbar(self): play_actions = [self.ui.action_rewind, self.ui.action_previous, self.ui.action_stop, self.ui.action_play, self.ui.action_next, self.ui.action_forward, self.ui.action_add_mark, self.ui.action_remove_mark] for action in play_actions: self.ui.toolbar.addAction(action) playbarstate = PlaybarState(play_actions) return playbarstate ### helper functions ### @staticmethod def keyval_from_name(keystr): key = QKeySequence(keystr) if key.count() == 0: return 0 key = key[0] if 'KP' in keystr.split('+'): key |= int(Qt.KeypadModifier) return key def get_move_key_dict(self): return {self.keyval_from_name(key): move for (move, key) in settings.draw.accels} def add_scripts_to_sidepane(self, load=True): self.ui.treeview.setModel(None) self.treestore.clear() for widget in self.ui.box_sidepane.children(): if isinstance(widget, QPushButton): self.ui.layout_sidepane.removeWidget(widget) widget.deleteLater() if load: algorithms = self.plugin_helper.load_plugins() if self.plugin_helper.error_messages: self.error_dialog('\n\n'.join(self.plugin_helper.error_messages)) else: algorithms = [] ptree = OrderedDict() for plugin_path, func in algorithms: subtree = [None, ptree] for name in plugin_path: subtree = subtree[1].setdefault(name, [None, OrderedDict()]) if plugin_path: subtree[0] = func def fill_treeview(parent, tree): for name, [func, subtree] in tree.items(): item = QStandardItem(_(name)) item.setData(func) parent.appendRow(item) fill_treeview(item, subtree) for i, (name, [func, subtree]) in enumerate(ptree.items()): button = QPushButton(self.ui.box_sidepane) button.setText(_(name)) button.setFlat(True) button.setFocusPolicy(Qt.TabFocus) self.ui.layout_sidepane.addWidget(button) obsc = lambda i: lambda: self.on_button_sidepane_clicked(i) button.clicked.connect(obsc(i)) fill_treeview(self.treestore, ptree) self.set_active_script_group(self.active_script_group) def set_active_script_group(self, i): self.ui.layout_sidepane.insertWidget(i+1, self.ui.treeview) self.ui.treeview.setModel(self.treestore) index = self.treestore.index(i, 0) self.ui.treeview.setRootIndex(index) self.active_script_group = i def load_game(self): mtype, size, blocks = settings.game.type, settings.game.size, settings.game.blocks Model = models[mtype] mirror_distance = settings.draw.mirror_distance if settings.draw.mirror_faces else None model = Model(size, mirror_distance) self.gamestate.set_state(model, blocks, settings.game.moves, settings.game.position) self.cube_area.set_model(model, self.gamestate.current_cube_state.blocks) self.update_ui() def new_game(self, mtype=None, size=None, solved=False): if self.is_animating(): return if mtype is None: model = self.gamestate.current_cube_state.model if size is None: size = model.sizes Model = model.__class__ else: Model = models[mtype] assert size is not None mirror_distance = settings.draw.mirror_distance if settings.draw.mirror_faces else None model = Model(size, mirror_distance) self.gamestate.new_game(model, solved) self.unsolved = not solved self.cube_area.set_model(model, self.gamestate.current_cube_state.blocks) self.update_ui() def is_animating(self): return self.cube_area.animation_active def start_animation(self, move_data, stop_after, animtype): if move_data: blocks = self.gamestate.current_cube_state.identify_rotation_blocks( move_data.axis, move_data.slice) self.cube_area.animate_rotation(move_data, blocks, stop_after) self.playbarstate.playing(self.gamestate.mark_before) self.animtype = animtype return True return False def update_statusbar(self): '''This function must be called before any action that change the move queue length to reflect total count of moves and after each single move''' if self.cube_area.editing_model: mesg = _('Press the Esc key to exit Edit Mode') self.unsolved = False else: current = self.gamestate.all_moves.current_place total = self.gamestate.all_moves.queue_length solved = self.gamestate.current_cube_state.is_solved() model_text = str(self.gamestate.current_cube_state.model) # substitution for {move_text} in statusbar text move_text = ngettext("{current} / {total} move", "{current} / {total} moves", total).format(current=current, total=total) # substitution for {solved_text} in statusbar text solved_text = _('solved') if solved else _('not solved') # statusbar text mesg = _('{model_text}, {move_text}, {solved_text}').format( model_text=model_text, move_text=move_text, solved_text=solved_text) if self.unsolved and solved: self.unsolved = False QTimer.singleShot(0, self.show_solved_message) self.status_text.setText(mesg) def update_ui(self): # update toolbar if self.gamestate.all_moves.at_start(): if self.gamestate.all_moves.at_end(): self.playbarstate.empty() else: self.playbarstate.first() else: if self.gamestate.all_moves.at_end(): self.playbarstate.last(self.gamestate.all_moves.is_mark_after(-1)) else: self.playbarstate.mid(self.gamestate.all_moves.is_mark_current()) # update formula code, pos, markup = self.gamestate.all_moves.format( self.gamestate.current_cube_state.model) self.set_edit_moves(code, pos, markup) self.update_statusbar() def show_solved_message(self): dialog = QMessageBox(self) dialog.setWindowTitle(_(config.APPNAME)) mtype = _(self.gamestate.current_cube_state.model.type) dialog.setText(_('Congratulations, you have solved the puzzle!')) dialog.setIcon(QMessageBox.Information) dialog.setStandardButtons(QMessageBox.Close) self.cube_area.set_std_cursor() dialog.exec_() def error_dialog(self, message): '''Popup an error dialog box''' dialog = QMessageBox(self) dialog.setWindowTitle(_(config.APPNAME)) dialog.setText(message) dialog.setIcon(QMessageBox.Warning) dialog.setStandardButtons(QMessageBox.Close) self.cube_area.set_std_cursor() dialog.exec_() def set_progress(self, step, message=None, value_max=None): if self.progress_dialog is None: self.progress_dialog = dialogs.ProgressDialog(self) canceled = self.progress_dialog.tick(step, message, value_max) qApp.processEvents() return canceled def end_progress(self): if self.progress_dialog is not None: self.progress_dialog.done() ### application handlers ### def resizeEvent(self, event): settings.window.size = event.size().width(), event.size().height() sizes = self.ui.splitter.sizes() if sum(sizes) > 0: # ignore the first resize event where sizes==[0,0] settings.window.divider = sizes[0] QMainWindow.resizeEvent(self, event) def closeEvent(self, event): try: dialogs.Dialog.delete() self.cube_area.stop() model, blocks, moves, position = self.gamestate.get_state() try: mtype = models.index(model.__class__) except ValueError: print('unknown model') else: settings.keystore.changed.disconnect(self.on_settings_changed) settings.keystore.error.disconnect(self.on_settings_error) settings.game.blocks = blocks settings.game.moves = moves settings.game.position = position settings.game.type = mtype settings.game.size = model.sizes finally: settings.close() # Needed for PyQt4 to prevent warning: # QObject::startTimer: QTimer can only be used with threads started with QThread self.ui.treeview.setModel(None) finally: QMainWindow.closeEvent(self, event) def on_settings_changed(self, key): if key in ['draw.mirror_faces', 'draw.mirror_distance']: sizes = self.gamestate.initial_cube_state.model.sizes Model = self.gamestate.initial_cube_state.model.__class__ mirror_distance = settings.draw.mirror_distance if settings.draw.mirror_faces else None model = Model(sizes, mirror_distance) self.gamestate.set_model(model) self.cube_area.set_model(model) elif key == 'draw.accels': self.move_keys = self.get_move_key_dict() def on_settings_error(self, message): self.status_text.setText(message) MODIFIER_MASK = int(Qt.ShiftModifier | Qt.ControlModifier | Qt.KeypadModifier) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.cube_area.set_editing_mode(False) self.update_ui() return try: move = self.move_keys[event.key() | int(event.modifiers()) & self.MODIFIER_MASK] except KeyError: event.ignore() QMainWindow.keyPressEvent(self, event) return else: if self.is_animating() and self.animtype != AnimType.KEY: return if not self.is_animating(): self.gamestate.all_moves.truncate() self.gamestate.all_moves.parse(move, len(move), self.gamestate.current_cube_state.model) self.update_ui() if not self.is_animating(): move_data = self.gamestate.request_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.KEY) ### GL area handlers ### def on_cubearea_animation_ending(self, last_move): self.cube_area.set_transformations(self.gamestate.current_cube_state) if not last_move: # go again self.update_statusbar() if self.animtype == AnimType.BWD: move_data = self.gamestate.request_back() else: move_data = self.gamestate.request_next() if self.start_animation(move_data, stop_after=False, animtype=self.animtype): return self.cube_area.animation_end() self.update_ui() def on_cubearea_request_rotation(self, maxis, mslice, mdir): self.gamestate.request_rotation(maxis, mslice, mdir) self.update_statusbar() move_data = self.gamestate.request_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.NEW) def on_cubearea_request_swap_blocks(self, blockpos, maxis, mslice, mdir): self.gamestate.swap_block(blockpos, maxis, mslice, mdir) self.cube_area.set_transformations(self.gamestate.current_cube_state) def on_cubearea_request_rotate_block(self, blockpos, rdir): self.gamestate.rotate_block(blockpos, rdir) self.cube_area.set_transformations(self.gamestate.current_cube_state) def on_cubearea_drop_color(self, blocknum, facesym, colorname): if blocknum < 0: settings.theme.bgcolor = colorname else: colornum = self.gamestate.current_cube_state.get_colornum(blocknum, facesym) settings.theme.face[colornum].color = colorname def on_cubearea_drop_file(self, blocknum, facesym, filename): #TODO: background images colornum = self.gamestate.current_cube_state.get_colornum(blocknum, facesym) settings.theme.face[colornum].image = filename def on_cubearea_debug_text(self, text): self.ui.label_debug_text.setText(text) ### @Slot(int, int) def on_splitter_splitterMoved(self, pos, index): # pylint: disable=R0201 if index == 1: settings.window.divider = pos ### sidepane handlers ### def on_button_sidepane_clicked(self, i): self.set_active_script_group(i) @Slot(QModelIndex) def on_treeview_activated(self, index): if self.is_animating(): return func = index.data(Qt.UserRole + 1) if func is None: return state, moves = self.plugin_helper.call(self, func) if state is None: self.unsolved = False else: self.gamestate.initial_cube_state = state self.gamestate.current_cube_state = state.copy() self.gamestate.all_moves.reset() self.unsolved = True position = self.gamestate.all_moves.mark_and_extend(moves) if position >= 0: self.gamestate.do_fast_forward(position) self.cube_area.set_transformations(self.gamestate.current_cube_state) self.update_ui() move_data = self.gamestate.request_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.NEW) elif state is not None: self.cube_area.set_transformations(self.gamestate.current_cube_state) self.update_ui() self.cube_area.update() ### action handlers ### @Slot() def on_action_new_activated(self): self.new_game(solved=False) @Slot() def on_action_new_solved_activated(self): self.new_game(solved=True) @Slot() def on_action_selectmodel_activated(self): dialog = dialogs.SelectModelDialog.run(self) if dialog: def response_ok(mtype, size, solved): self.new_game(mtype, size, solved) dialog.response_ok.connect(response_ok) @Slot() def on_action_quit_activated(self): self.close() @Slot() def on_action_preferences_activated(self): dialogs.PreferencesDialog.run(self) @Slot(bool) def on_action_toolbar_toggled(self, checked): self.ui.toolbar.setVisible(checked) settings.window.toolbar = checked @Slot(bool) def on_action_editbar_toggled(self, checked): self.ui.frame_editbar.setVisible(checked) settings.window.editbar = checked @Slot(bool) def on_action_statusbar_toggled(self, checked): self.ui.statusbar.setVisible(checked) settings.window.statusbar = checked @Slot() def on_action_reset_rotation_activated(self): self.cube_area.reset_rotation() @Slot() def on_action_info_activated(self): about = dialogs.AboutDialog(self) about.run() @Slot() def on_action_rewind_activated(self): if self.is_animating(): self.cube_area.stop_requested = True if self.animtype == AnimType.BWD: self.gamestate.request_next() # undo the already applied move self.gamestate.do_rewind_to_mark() self.cube_area.animate_abort() else: needs_update = self.gamestate.do_rewind_to_mark() self.cube_area.set_transformations(self.gamestate.current_cube_state) if needs_update: self.cube_area.update() self.update_ui() @Slot() def on_action_previous_activated(self): if self.is_animating(): if self.animtype == AnimType.BWD: # request another BWD move self.cube_area.stop_requested = False else: self.cube_area.stop_requested = True self.gamestate.request_back() self.cube_area.animate_abort() self.cube_area.stop_requested = True else: move_data = self.gamestate.request_back() self.start_animation(move_data, stop_after=True, animtype=AnimType.BWD) @Slot() def on_action_stop_activated(self): if self.is_animating(): if self.cube_area.stop_requested: self.cube_area.animate_abort() else: self.cube_area.stop_requested = True @Slot() def on_action_play_activated(self): if not self.is_animating(): move_data = self.gamestate.request_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.FWD) @Slot() def on_action_next_activated(self): if self.is_animating(): sr = self.cube_area.stop_requested if self.animtype == AnimType.BWD: self.cube_area.stop_requested = True self.gamestate.request_next() else: self.cube_area.stop_requested = False self.cube_area.animate_abort() self.cube_area.stop_requested = sr else: move_data = self.gamestate.request_next() self.start_animation(move_data, stop_after=True, animtype=AnimType.FWD) @Slot() def on_action_forward_activated(self): if self.is_animating(): self.cube_area.stop_requested = True if self.animtype != AnimType.BWD: self.gamestate.request_back() # undo the already applied move self.gamestate.do_fast_forward() self.cube_area.animate_abort() else: self.gamestate.do_fast_forward() self.cube_area.set_transformations(self.gamestate.current_cube_state) self.cube_area.update() self.update_ui() @Slot() def on_action_add_mark_activated(self): self.gamestate.all_moves.mark_current(True) self.update_ui() @Slot() def on_action_remove_mark_activated(self): self.gamestate.all_moves.mark_current(False) self.update_ui() @Slot() def on_action_initial_state_activated(self): if self.is_animating(): return self.gamestate.set_as_initial_state() self.update_ui() @Slot() def on_action_reload_scripts_activated(self): self.add_scripts_to_sidepane() @Slot() def on_action_invert_moves_activated(self): if self.is_animating(): return self.gamestate.invert_moves() self.cube_area.set_transformations(self.gamestate.current_cube_state) self.cube_area.update() self.update_ui() @Slot() def on_action_normalize_complete_rotations_activated(self): if self.is_animating(): return self.gamestate.normalize_complete_rotations() self.cube_area.set_transformations(self.gamestate.current_cube_state) self.cube_area.update() self.update_ui() ### edit formula handlers ### def on_action_jump_to_editbar_triggered(self): self.edit_moves.setFocus() def on_edit_moves_returnPressed(self): if self.is_animating(): self.cube_area.animate_abort(update=False) code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() self.gamestate.set_from_formula(code, pos) self.cube_area.set_transformations(self.gamestate.current_cube_state) self.cube_area.update() self.update_ui() def on_edit_moves_nextword(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.gamestate.all_moves.converter.parse(code, pos, self.gamestate.current_cube_state.model) moves.current_place = mpos if cpos <= pos: moves.advance() code, pos, unused_markup = moves.format(self.gamestate.current_cube_state.model) self.edit_moves.setCursorPosition(pos) def on_edit_moves_prevword(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.gamestate.all_moves.converter.parse(code, pos, self.gamestate.current_cube_state.model) moves.current_place = mpos if cpos >= pos: moves.retard() code, pos, unused_markup = moves.format(self.gamestate.current_cube_state.model) self.edit_moves.setCursorPosition(pos) def on_edit_moves_swapnext(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.gamestate.all_moves.converter.parse(code, pos, self.gamestate.current_cube_state.model) moves.current_place = mpos if pos < cpos: moves.retard() moves.swapnext() code, pos, unused_markup = moves.format(self.gamestate.current_cube_state.model) self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) def on_edit_moves_swapprev(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.gamestate.all_moves.converter.parse(code, pos, self.gamestate.current_cube_state.model) moves.current_place = mpos if pos < cpos: moves.retard() moves.swapprev() code, pos, unused_markup = moves.format(self.gamestate.current_cube_state.model) self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) @Slot() def on_button_edit_clear_clicked(self): self.edit_moves.setText('') self.on_edit_moves_returnPressed() @Slot() def on_button_edit_exec_clicked(self): self.on_edit_moves_returnPressed() def set_edit_moves(self, code, pos, unused_markup=None): self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) def on_action_edit_model_triggered(self): self.cube_area.animate_abort(update=False) self.gamestate.do_rewind_to_start() if DEBUG_ROTATE: self.gamestate.current_cube_state.debug_blocksymbols(allsyms=True) self.cube_area.set_transformations(self.gamestate.current_cube_state) self.cube_area.set_editing_mode(True) self.update_ui() def on_action_reload_shader_triggered(self): self.cube_area.reload_shader() class PlaybarState (object): def __init__(self, play_actions): self.play_button_list = play_actions self.empty() def set_toolbar_state(self, sflags, vflags, mark): if mark: vflags ^= 0b11 for a in reversed(self.play_button_list): a.setEnabled(sflags & 1) a.setVisible(vflags & 1) sflags >>= 1 vflags >>= 1 # pylint: disable=C0321 def empty(self): self.set_toolbar_state(0b00000000, 0b11011101, False) def first(self): self.set_toolbar_state(0b00011100, 0b11011101, False) def mid(self, mark): self.set_toolbar_state(0b11011111, 0b11011110, mark) def last(self, mark): self.set_toolbar_state(0b11000011, 0b11011110, mark) def playing(self, mark): self.set_toolbar_state(0b11101100, 0b11101110, mark) # pylint: enable=C0321 pybik-1.1/pybiklib/textures.py0000644000175000017500000000472212137727426016721 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: textures.c # Original copyright and license: 2003 John Darrington, GPL3+ import os from glob import glob # pylint: disable=W0614,W0401 from PyQt4.QtCore import Qt from PyQt4.QtGui import * # pylint: enable=W0614,W0401 from . import config class Textures (object): max_size = 256 stock_dir = os.path.join(config.UI_DIR, 'images') def __init__(self): self.stock_files = sorted(os.path.basename(f) for f in glob(os.path.join(self.stock_dir, '*'))) self.stock_pixbuf = {'': self.create_dummy()} def get_stock_pixbuf(self, name): try: return self.stock_pixbuf[name] except KeyError: if name not in self.stock_files: return self.stock_pixbuf[''] filename = os.path.join(self.stock_dir, name) self.stock_pixbuf[name] = pixbuf = self.create_pixbuf_from_file(filename) return pixbuf @classmethod def create_pixbuf_from_file(cls, filename): image = QImage(filename) # We must scale the image, because Mesa/OpenGL insists on it being of size # 2^n ( where n is integer ) width = image.width() height = image.height() scaled_width = cls.max_size while scaled_width > width: scaled_width //= 2 scaled_height = cls.max_size while scaled_height > height: scaled_height //= 2 return image.scaled(scaled_width, scaled_height, transformMode=Qt.SmoothTransformation) @classmethod def create_dummy(cls): image = QImage(1, 1, QImage.Format_ARGB32) image.fill(0) return image textures = Textures() pybik-1.1/pybiklib/cubestate.py0000644000175000017500000002654612137177715017025 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import random from copy import deepcopy from .debug import * # pylint: disable=W0614,W0401 # This class is currently used to store the initial state of the cube # and to provide the cube to plugins. class CubeState (object): rand = random.Random() if DEBUG_RAND: print('rand.seed(123)') rand.seed(123) def __init__(self, model): self.model = model self._blocksn = None def copy(self): other = CubeState(self.model) other._blocksn = deepcopy(self._blocksn) return other @property def type(self): return self.model.type @property def size(self): return self.model.size @property def blocks(self): assert self._blocksn is not None blocks = [self.model.rotation_symbolic_to_matrix(*blockn) for blockn in self._blocksn] return blocks def set_model(self, model): assert self.model.type == model.type assert self.model.sizes == model.sizes self.model = model def set_solved(self): # '' symbolic rotation for identity self._blocksn = [(i, '') for i, unused_block in enumerate(self.model.blocks)] def is_solved(self): '''Check whether the cube is solved. Only test the colors of the visible faces. Cubes with rotated center faces are treated as solved. ''' face_colors = {} for index, (unused_pos, rot) in enumerate(self._blocksn): for face in self.model.blocks[index].visible_faces: color = self.get_colorsymbol(index, face.lower()) try: color_ref = face_colors[face] except KeyError: face_colors[face] = color else: if color != color_ref: return False return True def is_solved_strict(self): '''Check whether the cube is solved. Test the rotation and position of the blocks. Cubes with rotated center faces are treated as not solved. ''' #FIXME: currently unused function, should be used for faces with images allrot = self._blocksn[0][1] for index, (pos, rot) in enumerate(self._blocksn): if rot != allrot: return False # Cubie rotated block = self.model.rotated_position[index, rot] if pos != block: return False # Cubie at wrong place return True def identify_rotation_blocks(self, maxis, mslice): assert self._blocksn if mslice == -1: for i in range(len(self._blocksn)): yield i, True else: for i, blockn in enumerate(self._blocksn): bslice = self.model.blocks[blockn[0]].axis_to_slice(maxis) yield i, bslice == mslice def _rotate_slice(self, axis, slice_, dir_): assert self._blocksn if DEBUG_ROTATE: print('rotate axis={} slice={} dir={!s:5}\n blocks:'.format(axis, slice_, dir_), end=' ') for block_id, selected in self.identify_rotation_blocks(axis, slice_): if selected: if DEBUG_ROTATE: print('{}:{}{}'.format(block_id, *self._blocksn[block_id]), end='') block = self.model.rotate_symbolic(axis, dir_, *self._blocksn[block_id]) if DEBUG_ROTATE: print('-{}{}'.format(*block), end=' ') self._blocksn[block_id] = block if DEBUG_ROTATE: print() def get_colorsymbol(self, blocknum, facesym): for pos, rot in self._blocksn: if pos == blocknum: return self.model.face_symbolic_to_face_color(facesym, rot) assert False, 'Should not be reached' def get_colornum(self, blocknum, facesym): #FIXME: face and color symbols should be upper colorsym = self.get_colorsymbol(blocknum, facesym.lower()) return self.model.faces.index(colorsym.upper()) def format_block(self): assert self._blocksn is not None # every block is stored as pos-sym, where sym is a symbolic rotation blocks = ['{}-{}'.format(pos, sym) for pos, sym in self._blocksn] return 'idx-rot: ' + ' '.join(blocks) def parse_block(self, blocks): if blocks == 'solved': return self.set_solved() bformat, blocks = blocks.split(':', 1) if bformat != 'idx-rot': raise ValueError('unknown block format:', bformat) blocks = blocks.strip().split(' ') if len(blocks) != len(self.model.blocks): raise ValueError('wrong block count: %s, expected: %s' % (len(blocks), len(self.model.blocks))) blocksn = [] for block in blocks: # every block is stored as idx-rot, where idx: index to blocklist, rot: symbolic rotation block = block.strip().split('-', 1) index, rot = block index = int(index) rot = self.model.norm_symbol(rot) blocksn.append((index, rot)) # test whether block indices is a permutation, # in fact thats not enough, e.g. swap a corner cubie with an edge, # also cubie rotation may be invalid, it can be possible that a # label is rotated inside the cube. for i1, i2 in enumerate(sorted(i for i, r in blocksn)): if i1 != i2: raise ValueError('block list is not a permutation') self._blocksn = blocksn def randomize(self, count=-1): if not sum(self.model.sizes): return if count >= 0: midslice = -1 count_ = count else: midslice = [s // 2 for s in self.model.sizes] count_ = 20 * sum(self.model.sizes) cubemoves = [] debug('random moves:', count_) lastaxis = None lastslices = [] for unused_i in range(count_): while True: maxis = self.rand.randrange(3) mdir = bool(self.rand.randrange(2)) msign = -1 if mdir else 1 mslice = self.rand.randrange(self.model.sizes[maxis]) if maxis != lastaxis: lastaxis = maxis lastslices = [0] * self.model.sizes[maxis] lastslices[mslice] = msign break # subsequent different axes are accepted nslices = lastslices[mslice] + msign if abs(nslices) < abs(lastslices[mslice]): continue # moves that revert a previous one are rejected if abs(nslices * self.model.symmetry[maxis]) > 180.: continue # moves that rotate a slice more than 180° are rejected lastslices[mslice] += msign if (sum(1 for ls in lastslices if ls > 0 or ls * self.model.symmetry[maxis] == -180.) > self.model.sizes[maxis] // 2): lastslices[mslice] -= msign continue if (sum(1 for ls in lastslices if ls < 0 or ls * self.model.symmetry[maxis] == 180.) > self.model.sizes[maxis] // 2): lastslices[mslice] -= msign continue break if mslice == midslice: cubemoves.append((maxis, mdir)) self._rotate_slice(maxis, mslice, mdir) for maxis, mdir in reversed(cubemoves): self._rotate_slice(maxis, -1, not mdir) def rotate_slice(self, move_data): self._rotate_slice(*move_data) def swap_block(self, blockpos1, maxis, mslice, mdir): if DEBUG_ROTATE: print('rotate axis={} slice={} dir={!s:5}\n from:'.format(maxis, mslice, mdir), end=' ') for blockidx1, (pos, blockrot1) in enumerate(self._blocksn): if pos == blockpos1: break else: blockidx1 = blockrot1 = None assert False blockpos1r, blockrot1r = self.model.rotate_symbolic(maxis, mdir, blockpos1, blockrot1) if DEBUG_ROTATE: print('{}:{}{}->{}{}\n to:'.format(blockidx1, blockpos1, blockrot1, blockpos1r, blockrot1r), end=' ') for blockidx2, unused_selected in self.identify_rotation_blocks(maxis, mslice): blockpos2, blockrot2 = self._blocksn[blockidx2] if blockpos1r == blockpos2: self._blocksn[blockidx1] = blockpos1r, blockrot1r blockpos2r, blockrot2r = self.model.rotate_symbolic(maxis, not mdir, blockpos2, blockrot2) if DEBUG_ROTATE: print('{}:{}{}->{}{}'.format(blockidx2, blockpos2, blockrot2, blockpos2r, blockrot2r), end=' ') self._blocksn[blockidx2] = blockpos2r, blockrot2r break if DEBUG_ROTATE: print() def rotate_block(self, blockpos, rdir): for blockidx, (pos, blockrot) in enumerate(self._blocksn): if pos == blockpos: break else: blockidx = blockrot = None assert False block = self.model.blocks[blockpos] try: rot = block.inplace_rotations[-1 if rdir else 0] except IndexError: # not every block can be rotated inline: e.g. edges and center faces on the 4×4×4-Cube, # edges and corners on towers and bricks #TODO: swap edge at pos n with the one at pos (size-1 - n), # rotate all center faces on the same ring return blockrot2 = self.model.norm_symbol(blockrot + rot) self._blocksn[blockidx] = blockpos, blockrot2 if DEBUG_ROTATE: sym1, colorsym1 = self.model.block_index_to_block_symbolic(blockpos, blockrot) sym2, colorsym2 = self.model.block_index_to_block_symbolic(blockpos, blockrot2) print('{}:{}{}->{}{} ({}:{}->{}:{})'.format(blockidx, blockpos, blockrot, blockpos, blockrot2, sym1, colorsym1, sym2, colorsym2)) self.debug_blocksymbols(allsyms=False) def debug_blocksymbols(self, allsyms): for blockpos, blockrot in self._blocksn: blocksym, colorsym = self.model.block_index_to_block_symbolic(blockpos, blockrot) if allsyms or blocksym != colorsym: print(' {}:{}'.format(blocksym, colorsym), end='') print('') pybik-1.1/pybiklib/__init__.py0000644000175000017500000000000012130757601016545 0ustar barccbarcc00000000000000pybik-1.1/pybiklib/moves.py0000644000175000017500000003024312155425235016155 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Ported from GNUbik # Original filename: move-queue.c # Original copyright and license: 2004 Dale Mellor, GPL3+ import re from collections import namedtuple from .debug import * # pylint: disable=W0401, W0614 # A structure containing information about a movement taking place. class MoveData (namedtuple('_MoveData', 'axis slice dir')): # pylint: disable=W0232 # axis = 0... # slice = 0...dim-1 or -1 for all slices # dir = 0 or 1 def inverted(self): return self._replace(dir=not self.dir) # pylint: disable=E1101 class MoveQueue(object): class MoveQueueItem(object): def __init__(self, data, mark_after=False, code=None, markup=None): self.data = MoveData(*data) or MoveData(0, 0, 0) self.mark_after = mark_after self.code = code self.markup = markup axis = property(lambda self: self.data.axis) slice = property(lambda self: self.data.slice) dir = property(lambda self: self.data.dir) def copy(self): return MoveQueue.MoveQueueItem(self.data, mark_after=self.mark_after, code=self.code, markup=self.markup) def invert(self): self.data = self.data.inverted() def rotate_by(self, model, totalmove): rmove = model.rotate_move(totalmove.data, self.data) self.data = MoveData(*rmove) self.code = None self.markup = None def __init__(self): self.current_place = 0 # Number of steps of current from head. self.moves = [] self.converter = FormatFlubrd def copy(self): movequeue = MoveQueue() movequeue.current_place = self.current_place movequeue.moves = [m.copy() for m in self.moves] movequeue.converter = self.converter return movequeue def at_start(self): return self.current_place == 0 def at_end(self): return self.current_place == self.queue_length @property def _prev(self): return self.moves[self.current_place-1] @property def _current(self): return self.moves[self.current_place] @property def queue_length(self): return len(self.moves) def __str__(self): return 'MoveQueue(len=%s)' % self.queue_length # Routine to push a new MoveData object onto the _back_ of the given queue. A # new, locally-managed copy is made of the incumbent datum. Return 1 (one) if # the operation is successful; 0 (zero) indicates that there was insufficient # memory to grow the queue. def push(self, move_data, mark_after=False, code=None, markup=None): new_element = self.MoveQueueItem(move_data, mark_after=mark_after, code=code, markup=markup) self.moves.append(new_element) # Procedure to copy the incumbent datum to the current place in the queue, and # drop all subsequent queue entries (so that the current element becomes the # tail). If current points past the end of the tail (including the case when # there are no data in the queue), then a regular push operation is performed # at the tail. In all other cases 1 (one) will be returned. def push_current(self, move_data): # If there are no data in the queue, then perform a standard push # operation. Also do this if we are at the tail. if not self.at_end(): self.moves[self.current_place:] = [] self.push(move_data) # Routine to get the data at the 'current' position in the queue. If there are # no data in the queue, None will be returned. def current(self): return None if self.at_end() else self._current.data # Routine to retard the current pointer (move it towards the _head_ of the queue). def retard(self): if not self.at_start(): self.current_place -= 1 def rewind_start(self): self.current_place = 0 def forward_end(self): self.current_place = self.queue_length # Remove the current object and all those that come afterwards. def truncate(self): self.moves[self.current_place:] = [] def truncate_before(self): self.moves[:self.current_place] = [] self.current_place = 0 def reset(self): self.current_place = 0 self.moves[:] = [] def advance(self): if not self.at_end(): self.current_place += 1 def swapnext(self): cp = self.current_place if cp+1 < self.queue_length: ma, mb = self.moves[cp], self.moves[cp+1] ma.code = mb.code = None ma.data, mb.data = mb.data, ma.data self.advance() def swapprev(self): cp = self.current_place if 0 < cp < self.queue_length: ma, mb = self.moves[cp-1], self.moves[cp] ma.code = mb.code = None ma.data, mb.data = mb.data, ma.data self.retard() def invert(self): # a mark at the end of the moves is discarded because a mark at start is not supported mark = False for move in self.moves: move.invert() move.code = None move.markup = None move.mark_after, mark = mark, move.mark_after self.moves.reverse() if not (self.at_start() or self.at_end()): self.current_place = len(self.moves) - self.current_place def normalize_complete_rotations(self, model): totalmoves = [] new_moves = [] for i, move in enumerate(self.moves): if i == self.current_place: self.current_place = len(new_moves) if move.slice < 0: totalmoves.append(move) else: for totalmove in reversed(totalmoves): move.rotate_by(model, totalmove) new_moves.append(move) self.moves = new_moves + totalmoves def is_mark_current(self): return self.at_start() or self._prev.mark_after def is_mark_after(self, pos): return self.moves[pos].mark_after def mark_current(self, mark=True): if not self.at_start(): self._prev.mark_after = mark if self._prev.code is not None: self._prev.code = self._prev.code.replace(' ','') #FIXME: recreate self._prev.markup if mark: self._prev.code += ' ' def mark_and_extend(self, other): if not other.moves: return -1 self.mark_current() self.truncate() self.moves += other.moves return self.current_place + other.current_place def format(self, model): #TODO: arg to use explicit converter code = '' markup = '' pos = 0 for i, move in enumerate(self.moves): if move.code is None: move.code, move.markup = self.converter.format(move, model) code += move.code markup += move.markup if i < self.current_place: pos = len(code) return code, pos, markup def parse_iter(self, code, pos, model): #TODO: arg to use explicit converter code = code.lstrip(' ') queue_pos = self.current_place move_code = '' for i, c in enumerate(code): if move_code and self.converter.isstart(c, model): data, mark, markup_code = self.converter.parse_move(move_code, model) if data is not None: #FIXME: invalid chars at start get lost, other invalid chars are just ignored self.push(data, mark, move_code, markup_code) yield data, queue_pos, i if i == pos: queue_pos = self.queue_length move_code = c else: move_code += c if i < pos: queue_pos = self.queue_length + 1 if move_code: data, mark, markup_code = self.converter.parse_move(move_code, model) if data is not None: self.push(data, mark, move_code, markup_code) if len(code)-len(move_code) < pos: queue_pos = self.queue_length yield data, queue_pos, len(code) def parse(self, code, pos, model): qpos = 0 cpos = 0 for res in self.parse_iter(code, pos, model): qpos = res[1] if cpos < pos: cpos = res[2] return qpos, cpos class FormatFlubrd: # pylint: disable=W0232 re_flubrd = re.compile(r"(.)(\d*)(['-]?)([^ ]*)( *)(.*)") @classmethod def isstart(cls, char, model): return char.upper() in model.faces @staticmethod def _format_markup(mface, mslice, mdir, err1, mark, err2): if err1: err1 = '%s' % err1 if err2: err2 = '%s' % err2 return ''.join((mface, mslice, mdir, err1, mark, err2)) @staticmethod def intern_to_normal_move(maxis, mslice, mdir, model): if mslice == -1: return model.symbolsI[maxis] if mdir else model.symbols[maxis], 0, 0, True elif mslice*2 > model.sizes[maxis]-1: return model.symbolsI[maxis], model.sizes[maxis]-1 - mslice, 1-mdir, False else: return model.symbols[maxis], mslice, mdir, False @classmethod def format(cls, move, model): mface, mslice, mdir, whole_cube = cls.intern_to_normal_move(move.axis, move.slice, move.dir, model) mface = mface.upper() if whole_cube else mface.lower() mslice = str(mslice+1) if mslice else '' mdir = '-' if mdir else "" mark = ' ' if move.mark_after else '' move_code = mface + mslice + mdir + mark markup_code = cls._format_markup(mface, mslice, mdir, '', mark, '') return move_code, markup_code @staticmethod def normal_to_intern_move(mface, mslice, mdir, whole_cube, model): if mface in model.symbols: return model.symbols.index(mface), (-1 if whole_cube else mslice), mdir elif mface in model.symbolsI: maxis = model.symbolsI.index(mface) return maxis, (-1 if whole_cube else model.sizes[maxis]-1 - mslice), 1-mdir else: return None, None, None @classmethod def parse_move(cls, move_code, model): #debug('move_code: '+move_code) mface, mslice, mdir, err1, mark, err2 = cls.re_flubrd.match(move_code).groups() markup_code = cls._format_markup(mface, mslice, mdir, err1, mark, err2) whole_cube = mface.isupper() mface = mface.upper() mslice = int(mslice or 1) - 1 mdir = int(bool(mdir)) mark = bool(mark) # move finished, normalize it maxis, mslice2, mdir = cls.normal_to_intern_move(mface, mslice, mdir, whole_cube, model) if maxis is not None and 0 <= mslice < model.sizes[maxis]: return MoveData(maxis, mslice2, mdir), mark, markup_code debug('Error parsing formula') return None, False, move_code @staticmethod def parse(code, pos, model): moves = MoveQueue() qpos, cpos = moves.parse(code, pos, model) return moves, qpos, cpos pybik-1.1/pybiklib/glm.py0000664000175000017500000000522312142441700015574 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import math import numpy class vec3 (numpy.ndarray): def __new__(cls, x=0., y=0., z=0.): buf = numpy.array([x, y, z], dtype='f') return numpy.ndarray.__new__(cls, (3,), dtype='f', buffer=buf) def _seti(self, i, value): self[i] = value return value x = property(lambda self: self[0], lambda self, value: self._seti(0, value)) y = property(lambda self: self[1], lambda self, value: self._seti(1, value)) z = property(lambda self: self[2], lambda self, value: self._seti(2, value)) class vec4 (numpy.ndarray): def __new__(cls, x=0., y=0., z=0., w=1.): buf = numpy.array([x, y, z, w], dtype='f') return numpy.ndarray.__new__(cls, (4,), dtype='f', buffer=buf) def _seti(self, i, value): self[i] = value return value x = property(lambda self: self[0], lambda self, value: self._seti(0, value)) y = property(lambda self: self[1], lambda self, value: self._seti(1, value)) z = property(lambda self: self[2], lambda self, value: self._seti(2, value)) w = property(lambda self: self[3], lambda self, value: self._seti(3, value)) class mat4(numpy.ndarray): def __new__(cls, diag=1.): buf = numpy.array([[diag, 0., 0., 0.], [0., diag, 0., 0.], [0., 0., diag, 0.], [0., 0., 0., 1.]], dtype='f') return numpy.ndarray.__new__(cls, (4,4), dtype='f', buffer=buf) def rotate(angle, vect): result = mat4() x = vect[0] y = vect[1] z = vect[2] c = math.cos(angle) s = math.sin(angle) result[0][0] = x*x*(1-c) + c result[0][1] = x*y*(1-c) - z*s result[0][2] = x*z*(1-c) + y*s result[1][0] = y*x*(1-c) + z*s result[1][1] = y*y*(1-c) + c result[1][2] = y*z*(1-c) - x*s result[2][0] = x*z*(1-c) - y*s result[2][1] = y*z*(1-c) + x*s result[2][2] = z*z*(1-c) + c return result pybik-1.1/pybiklib/translators.py0000664000175000017500000000610512157351646017410 0ustar barccbarcc00000000000000# generated with: ./merge-translators.sh translators = ( [ ('Asturian', 'ast', [ ('Xuacu Saturio', 'https://launchpad.net/~xuacusk8'), ('ivarela', 'https://launchpad.net/~ivarela'), ]), ('Bengali', 'bn', [ ('Iftekhar Mohammad', 'https://launchpad.net/~iftekhar'), ]), ('Bosnian', 'bs', [ ('Kenan Dervišević', 'https://launchpad.net/~kenan3008'), ]), ('Brazilian Portuguese', 'pt_BR', [ ('Fábio Nogueira', 'https://launchpad.net/~fnogueira'), ('Rafael Neri', 'https://launchpad.net/~rafepel'), ]), ('Chinese (Simplified)', 'zh_CN', [ ('Xiaoxing Ye', 'https://launchpad.net/~xiaoxing'), ]), ('Chinese (Traditional)', 'zh_TW', [ ('Po-Chun Huang', 'https://launchpad.net/~aphroteus'), ]), ('English (United Kingdom)', 'en_GB', [ ('Andi Chandler', 'https://launchpad.net/~bing'), ('Anthony Harrington', 'https://launchpad.net/~untaintableangel'), ('B Clausius', 'https://launchpad.net/~barcc'), ]), ('French', 'fr', [ ('Aurélien Ribeiro', 'https://launchpad.net/~aurel-koala'), ('Baptiste Fontaine', 'https://launchpad.net/~bfontaine'), ('Célestin Taramarcaz', 'https://launchpad.net/~celestin'), ('Havok Novak', 'https://launchpad.net/~havok-novak'), ('Nicolas Delvaux', 'https://launchpad.net/~malizor'), ('Sylvie Gallet', 'https://launchpad.net/~sylvie-gallet'), ('lann', 'https://launchpad.net/~lann'), ]), ('Galician', 'gl', [ ('Miguel Anxo Bouzada', 'https://launchpad.net/~mbouzada'), ]), ('German', 'de', [ ('B Clausius', 'https://launchpad.net/~barcc'), ]), ('Greek', 'el', [ ('George Christofis', 'https://launchpad.net/~geochr'), ('mara sdr', 'https://launchpad.net/~paren8esis'), ]), ('Hebrew', 'he', [ ('Yaron', 'https://launchpad.net/~sh-yaron'), ]), ('Indonesian', 'id', [ ('Trisno Pamuji', 'https://launchpad.net/~tri.snowman'), ]), ('Italian', 'it', [ ('Alfio Missaglia', 'https://launchpad.net/~missaglialfio'), ('Claudio Arseni', 'https://launchpad.net/~claudio.arseni'), ('Francesco Muriana', 'https://launchpad.net/~f-muriana'), ]), ('Japanese', 'ja', [ ('epii', 'https://launchpad.net/~epii'), ]), ('Kirghiz', 'ky', [ ('ballpen', 'https://launchpad.net/~ballpen'), ]), ('Malay', 'ms', [ ('abuyop', 'https://launchpad.net/~abuyop'), ]), ('Polish', 'pl', [ ('Mike08', 'https://launchpad.net/~micou8'), ('Szymon Nieznański', 'https://launchpad.net/~isamu715'), ]), ('Russian', 'ru', [ ('Oleg Koptev', 'https://launchpad.net/~koptev-oleg'), ('scientistnik', 'https://launchpad.net/~nozdrin-plotnitsky'), ]), ('Serbian', 'sr', [ ('Мирослав Николић', 'https://launchpad.net/~lipek'), ]), ('Spanish', 'es', [ ('Adolfo Jayme Barrientos', 'https://launchpad.net/~fitoschido'), ('Dante Díaz', 'https://launchpad.net/~dante'), ('Eduardo Alberto Calvo', 'https://launchpad.net/~edu5800'), ]), ('Ukrainian', 'uk', [ ('Yuri Chornoivan', 'https://launchpad.net/~yurchor-gmail'), ]), ('Uzbek', 'uz', [ ('Akmal Xushvaqov', 'https://launchpad.net/~uzadmin'), ]), ] ) pybik-1.1/pybiklib/debug.py0000644000175000017500000000736212155413246016117 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This line is not really needed, but leave it until glarea and gldraw are compiled with cython3 from __future__ import print_function, division import sys DEBUG = False DEBUG_FUNC = DEBUG_MSG = DEBUG_RAND = DEBUG_ROTATE = False DEBUG_DRAW = DEBUG_KEYS = DEBUG_PICK = False DEBUG_FPS = DEBUG_VFPS = DEBUG_NOLABEL = DEBUG_NOBEVEL = DEBUG_INNER = False DEBUG_ALG = DEBUG_NOVSHADER = DEBUG_NOFSHADER = DEBUG_NOSHADER = False DEBUG_THREAD = DEBUG_PUREPYTHON = False __all__ = ['error', 'debug', 'debug_func', 'DEBUG', ] + [__n for __n in dir(sys.modules[__name__]) if __n.startswith('DEBUG_')] def error(*args, **kwargs): print('ERROR:', *args, **kwargs) debug = lambda *args, **kwargs: None debug_func = lambda x: x def set_flags(debug_flags): module = sys.modules[__name__] module.DEBUG = True for flag in debug_flags: setattr(module, 'DEBUG_' + flag.upper(), True) if module.DEBUG_VFPS: module.DEBUG_FPS = True if module.DEBUG_FUNC: def _debug_pre_func(func, *args, **kwargs): def short_arg(arg): arg = str(arg) maxlen = 80 - debug_func.indent * 3 - 2 if len(arg) > maxlen: return arg[:maxlen] return arg try: func_name = func.__name__ except AttributeError: func_name = func.__name__ print('%s--%s' % (' |'*debug_func.indent, func_name)) debug_func.indent += 1 for arg in args: try: print('%s: %s' % (' |'*debug_func.indent, short_arg(arg))) except Exception: pass for kw, arg in kwargs: try: print('%s: %s=%s' % (' |'*debug_func.indent, kw, short_arg(arg))) except Exception: pass def debug_func(func): def ret_func(*args, **kwargs): _debug_pre_func(func, *args, **kwargs) try: return func(*args, **kwargs) except Exception as e: if debug_func.last_exc != e: print(' X'*debug_func.indent) debug_func.last_exc = e raise finally: debug_func.indent -= 1 print(' |'*debug_func.indent + "--'") try: ret_func.__dict__ = func.__dict__ except AttributeError: pass ret_func.__doc__ = func.__doc__ ret_func.__module__ = func.__module__ ret_func.__name__ = func.__name__ try: ret_func.__defaults__ = func.__defaults__ except AttributeError: pass return ret_func debug_func.indent = 0 debug_func.last_exc = None module.debug_func = debug_func if module.DEBUG_MSG: module.debug = print pybik-1.1/pybiklib/pybik.py0000644000175000017500000000173112137177715016151 0ustar barccbarcc00000000000000#!/usr/bin/python3 #-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import pybiklib.main root_dir = os.path.dirname(os.path.realpath(os.path.dirname(__file__))) def main(): pybiklib.main.run(root_dir) if __name__ == '__main__': main() pybik-1.1/pybiklib/config.py0000644000175000017500000001265512157424144016300 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os, sys N_ = lambda s: s AUTHOR = 'B. Clausius' CONTACT_EMAIL = 'barcc@gmx.de' COPYRIGHT = 'Copyright © 2009-2013, B. Clausius' LICENSE_NAME = 'GPL-3+' PACKAGE = 'pybik' # Name of the application, probably should not be translated. APPNAME = N_('Pybik') VERSION = '1.1' WEBSITE = 'https://launchpad.net/pybik/' DOWNLOADS = 'https://launchpad.net/pybik/+download' CONTACT_FILEBUG = 'https://bugs.launchpad.net/pybik/+filebug' # The following two lines are replaced by setup.py data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data') appdata_dir = data_dir LOCALE_DIR = os.path.join(data_dir, 'locale') QT_LOCALE_DIR = os.path.join(sys.prefix, 'share', 'qt4', 'translations') PIXMAP_DIR = os.path.join(data_dir, 'pixmaps') IMAGE_FILE = os.path.join(PIXMAP_DIR, PACKAGE+'.png') LICENSE_FILE = os.path.join(appdata_dir, 'GPL-3') MODELS_DIR = os.path.join(appdata_dir, 'models') SCRIPT_DIR = os.path.join(appdata_dir, 'plugins') UI_DIR = os.path.join(appdata_dir, 'ui') TESTDATA_DIR = os.path.join(appdata_dir, 'tests') def get_testdatafiles(): return [f for f in os.listdir(TESTDATA_DIR) if not f.endswith('~')] def get_config_home(): return os.environ.get('XDG_CONFIG_HOME', '') or os.path.expanduser("~/.config") def get_data_home(): return os.environ.get('XDG_DATA_HOME', '') or os.path.expanduser("~/.local/share") USER_CONFIG_DIR = os.path.join(get_config_home(), PACKAGE) USER_SETTINGS_FILE = os.path.join(USER_CONFIG_DIR, 'settings.conf') USER_VERSION_FILE = os.path.join(USER_CONFIG_DIR, 'version') USER_SCRIPT_DIR = os.path.join(get_data_home(), PACKAGE, 'plugins') SHORT_DESCRIPTION = N_("3D Rubik's cube game") LONG_DESCRIPTION = N_( 'Pybik is an interactive, graphical, single player puzzle about the cube invented by' ' Ernő Rubik. Besides the cube the program can handle towers and bricks (non cubic' ' puzzles). Pybik also has solvers, pretty patterns and a collection of various' ' moves. The cube can be manipulated with the mouse or keyboard. You can change the' ' colors or images on the faces of the cube.' ) LICENSE_INFO = N_( 'This program is free software: you can redistribute it and/or modify ' 'it under the terms of the GNU General Public License as published by ' 'the Free Software Foundation, either version 3 of the License, or ' '(at your option) any later version.\n\n' 'This program is distributed in the hope that it will be useful, ' 'but WITHOUT ANY WARRANTY; without even the implied warranty of ' 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' 'GNU General Public License for more details.') LICENSE_FURTHER = N_( # Text between "<" and ">" is expanded to a link by the program and should not be modified. # Text between "" and "<|>" is the translatable text for the link. 'Read the full text of the GNU General Public License' '<|> or see .') LICENSE_NOT_FOUND = N_( 'You should have received a copy of the GNU General Public License' ' along with this program. If not, see .') def get_filebug_text(): return _( # "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated 'If you find any bugs in Pybik or have a suggestion for an improvement then please ' 'submit a <{CONTACT_FILEBUG}|>bug report<|>. ' 'In the latter case you can mark the bug report as "Wishlist".' ).format(CONTACT_FILEBUG=CONTACT_FILEBUG) TRANSLATION_TEXT = N_( 'Translations are managed by the ' '' 'Launchpad translation group<|>.\n\n' 'If you want help to translate Pybik to your language you can do it through ' 'the web interface<|>.\n\n' 'Read more about "Translating with Launchpad"<|> ' 'and "Starting to translate"<|>.') def splitlines(description): line = None for word in description.split(): if line is None: line = word elif len(line) + 1 + len(word) > 78: yield line line = word else: line = ' '.join((line, word)) if line is not None: yield line def wrap(text, sep='\n'): if type(text) in [list, tuple]: text, lines = text else: lines = None text = sep.join(splitlines(text)) if lines: text += sep + sep + sep.join(lines) return text pybik-1.1/pybiklib/model.py0000664000175000017500000011071512151646622016132 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os from math import sin, cos, pi, sqrt import re import pickle as pickle from collections import OrderedDict import array import numpy as np from .debug import DEBUG, DEBUG_NOLABEL, DEBUG_NOBEVEL, DEBUG_INNER, DEBUG_DRAW from .config import MODELS_DIR N_ = lambda t: t try: _ except NameError: _ = N_ use_modeldata = True modeldata_cache = {} class Face (object): def __init__(self, symbol, vindices=None, vertices=None): self.symbol = symbol self.vindices = vindices self.vertices = vertices self.normal = None self.scaled = None # Face with indices for beveled_vertices self.faces = None # adjacent faces def __repr__(self): return 'Face({}, {})'.format(self.symbol, self.vindices) def edges(self): vertices = self.vertices if self.vindices is None else self.vindices v1 = vertices[0] for v2 in vertices[1:]: yield v1, v2 v1 = v2 yield v1, vertices[0] def center(self, vertices=None): if vertices is None: vertices = self.vertices if self.vindices is not None: vertices = [vertices[vi] for vi in self.vindices] return [sum(_i)/len(_i) for _i in zip(*vertices)] def create_scaled(self, vertices, factor, new_vertices): bf = [] for vi in self.vindices: # Scale orthogonal to the center bv = [(v-c)*factor+c for v, c in zip(vertices[vi], self.center(vertices))] bf.append(len(new_vertices)) new_vertices.append(bv) self.scaled = Face(self.symbol, bf) def translated(self, vertices, offset, factor=1): tf = [] if vertices is None: for v in self.vertices: tv = [xv+xo*factor for xv, xo in zip(v, offset)] tf.append(tv) else: for vi in self.vindices: tv = [xv+xo*factor for xv, xo in zip(vertices[vi], offset)] tf.append(tv) return Face(self.symbol, vertices=tf) def roll(self, n): if self.vindices is not None: vlen = len(self.vindices) self.vindices = [self.vindices[(i-n)%vlen] for i in range(vlen)] elif self.vertices is not None: vlen = len(self.vertices) self.vertices = [self.vertices[(i-n)%vlen] for i in range(vlen)] def init_adjacent_faces(self, faces): self.faces = [] for edge in self.edges(): edge = tuple(reversed(edge)) for f in faces: for e in f.edges(): if e == edge: break else: continue self.faces.append(f.symbol) break else: assert False, 'No adjacent face for edge: ' + str((self, edge, faces)) assert len(self.faces) == len(self.vindices) def flip(self): self.vertices.reverse() if self.normal is not None: for i in range(len(self.normal)): self.normal[i] = -self.normal[i] class Block (object): def __init__(self, model, index, data=None): if data is not None: self.__dict__.update(data) return self.index = index self.indices = (index % model.sizes[0], index // model.sizes[0] % model.sizes[1], index // model.sizes[0] // model.sizes[1]) self.coords = [float(2*idx - model.sizes[i] + 1) for i, idx in enumerate(self.indices)] self.coords.append(1.) self.symbol_to_move = {} self.visible_faces = [] self.visible_glfaces = [] for symbol in model.faces: mdir = symbol not in model.symbols maxis = model.symbols.index(model.invers_symbols[symbol] if mdir else symbol) mslice = self.axis_to_slice(maxis) self.symbol_to_move[symbol] = (maxis, mslice, mdir) if mslice == (model.sizes[maxis]-1 if mdir else 0): self.visible_faces.append(symbol) self.inplace_rotations = [] def init_inplace_rotations(self, model): for (blocknum, rotsym), blocknum2 in model.rotated_position.items(): if blocknum == blocknum2 == self.index and rotsym: self.inplace_rotations.append(rotsym) self.inplace_rotations = sorted(self.inplace_rotations, key=len)[:2] def __repr__(self): return 'Block({}, {}, {}, {})'.format(self.index, self.indices, self.coords, self.visible_faces) def axis_to_slice(self, maxis): return self.indices[maxis] class Geometry (object): def __init__(self, vertices=None, faces=None, bevel_factor=None): self.vertices = vertices self.faces = faces self.beveled_vertices = [] # list of vertex positions for f in self.faces.values(): f.normal = f.center(self.vertices) f.create_scaled(self.vertices, bevel_factor, self.beveled_vertices) f.init_adjacent_faces(list(self.faces.values())) def create_permutation(self, matrix): m = np.matrix(matrix) indices = {} for i, v in enumerate(self.vertices): rv = (m * np.matrix(v+[0]).T).T.tolist()[0][:-1] ri = self.vertices.index(rv) indices[i] = ri symbols = {} for sym, f in self.faces.items(): rvindices = [indices[i] for i in f.vindices] for rsym, rf in self.faces.items(): if set(rvindices) == set(rf.vindices): symbols[rsym.lower()] = sym.lower() return symbols class EmptyModel (object): type = 'Empty' mformat = 'Empty' symbols = '' symbolsI = '' faces = '' sizes = [0, 0, 0] size = None bounding_sphere_radius = 1. blocks = [] def __init__(self, *unused_args): pass def gl_vertex_data(self, unused_selection_mode, unused_design): return b'', b'', b'', b'', [], 0, [], 0, 0 class BrickModel (object): type = N_('Brick') mformat = _('{0}×{1}×{2}-Brick') symmetry = 180., 180., 180. axes = [(-1,0,0), (0,-1,0), (0,0,-1)] # pylint: disable=C0324 symbols = 'LDB' symbolsI = 'RUF' faces = 'UDLRFB' epsilon = 0.00001 #### geometry of the cube #### # vertex standard # indices orientation face symbols # 2------3 +---+ # |\ |\ y | U | # | 6------7 | +---+---+---+---+ # | | | | o--x | L | F | R | B | # 0-|----1 | \ +---+---+---+---+ # \| \| z | D | # 4------5 +---+ geom = Geometry( # vertex-positions, used for unbeveled faces and picking vertices=[[-1,-1,-1], [1,-1,-1], [-1, 1,-1], [1, 1,-1], [-1,-1, 1], [1,-1, 1], [-1, 1, 1], [1, 1, 1]], # vertex-indices for unbeveled faces, used for picking faces=OrderedDict(( ('U', Face('U', [2,6,7,3])), ('D', Face('D', [4,0,1,5])), ('L', Face('L', [2,0,4,6])), ('R', Face('R', [7,5,1,3])), ('F', Face('F', [6,4,5,7])), ('B', Face('B', [3,1,0,2])))), bevel_factor=0.9 ) texpos_tiled = [(0, 0), (0, 1), (1, 1), (1, 0)] face_axes = OrderedDict(( ('U', (0, 2)), ('D', (0, 2)), ('L', (2, 1)), ('R', (2, 1)), ('F', (0, 1)), ('B', (0, 1)))) def __init__(self, size, mirror_distance): self.sizes = self.norm_sizes(size) # tuple of lenght 3 assert len(self.sizes) == 3 for _size in self.sizes: assert 1 <= _size <= 10 self.size = size # derived classes can assign a different value self.mirror_distance = mirror_distance and mirror_distance * max(self.sizes) #TODO: The bounding_sphere_radius is optimised for the far clipping plane, # for the near clipping plane the radius without the mirror_distance # would be sufficient. s = max(self.sizes) sm = s + (self.mirror_distance or 0) self.bounding_sphere_radius = sqrt(2*s*s + sm*sm) self.invers_symbols = {} for sym, isym in zip(self.symbols, self.symbolsI): self.invers_symbols[sym] = isym self.invers_symbols[isym] = sym self.axesI = [tuple(-x for x in a) for a in self.axes] self.normal_rotation_symbols = {} self.rotation_matrices = {} self._init_rotations() self.face_permutations = self._create_permutations() if use_modeldata: global modeldata_cache try: modeldata = modeldata_cache[(self.type, self.sizes)] except KeyError: datafilename = self.get_datafilename(self.sizes) datafilename = os.path.join(MODELS_DIR, datafilename) with open(datafilename, 'rb') as datafile: modeldata = pickle.load(datafile) modeldata_cache = modeldata modeldata = modeldata_cache[(self.type, self.sizes)] self.blocks = [Block(None, None, data=data) for data in modeldata['blocks']] self.rotated_position = modeldata['rotated_position'] self.gl_never_visible_face = self._gl_never_visible_face_cached else: nblocks = self.sizes[0] * self.sizes[1] * self.sizes[2] self.blocks = [Block(self, i) for i in range(nblocks)] self.rotated_position = self._create_rotated_position() for block in self.blocks: block.init_inplace_rotations(self) self.gl_never_visible_face = self._gl_never_visible_face_create_cache self.pick_vector = {} for maxis, axis in enumerate(self.axes): for symbol, face in self.geom.faces.items(): self.pick_vector[maxis, False, symbol] = np.cross(axis, face.normal).tolist() self.pick_vector[maxis, True, symbol] = np.cross(face.normal, axis).tolist() self.pick_data = [()] # list of (maxis, mslice, mdir, face, center, block, symbol) @classmethod def norm_sizes(cls, sizes): return sizes @classmethod def displaystring(cls, size): return cls.mformat.format(*size) def __str__(self): return self.displaystring(self.sizes) @classmethod def _create_rotation(cls, axis, angle): angle = angle / 180. * pi sa = sin(angle) ca = cos(angle) e_ca = 1 - ca n1 = axis[0] n2 = axis[1] n3 = axis[2] m = np.matrix([ [n1*n1*e_ca + ca, n1*n2*e_ca - n3*sa, n1*n3*e_ca + n2*sa, 0.], [n2*n1*e_ca + n3*sa, n2*n2*e_ca + ca, n2*n3*e_ca - n1*sa, 0.], [n3*n1*e_ca - n2*sa, n3*n2*e_ca + n1*sa, n3*n3*e_ca + ca, 0.], [0., 0., 0., 1.], ]) #XXX: try to keep the matrix clean mx, my = m.shape for y in range(my): for x in range(mx): if abs(m.A[y][x]) < cls.epsilon: m.A[y][x] = 0. return m @classmethod def _matrix_equal(cls, m1, m2): assert m1.shape == m2.shape, (m1, m2) mx, my = m1.shape for y in range(my): for x in range(mx): if abs(m1.A[y][x] - m2.A[y][x]) > cls.epsilon: return False return True def _init_rotations(self): prim = [(sym, self._create_rotation(axis, angle)) for axis, sym, angle in zip(self.axes + self.axesI, self.symbols + self.symbolsI, self.symmetry + self.symmetry)] self.normal_rotation_symbols[''] = '' transform = [('', np.matrix(np.identity(4)))] for sp, p in prim: transform.append((sp, p)) for sm, m in transform: for sp, p in prim: n = m * p sn = sm + sp for st, t in transform: if self._matrix_equal(t, n): self.normal_rotation_symbols[sn] = st break else: self.normal_rotation_symbols[sn] = sn transform.append((sn, n)) for sm, m in transform: self.rotation_matrices[sm] = m.A.tolist() def _create_permutations(self): face_permutations = {} for msym, matrix in self.rotation_matrices.items(): face_permutations[msym] = self.geom.create_permutation(matrix) return face_permutations def _create_rotated_position(self): rotated_position = {} for b, block in enumerate(self.blocks): for sym, rotation in self.rotation_matrices.items(): coords = (np.matrix([block.coords]) * rotation).A.tolist()[0] for p, pos in enumerate(self.blocks): if pos.coords == coords: rotated_position[b, sym] = p break else: assert False, 'not a permutation' return rotated_position @classmethod def get_datafilename(cls, sizes): x, y, unused_z = sizes if x <= 2: return 'mdata_01-02' else: return 'mdata_{:02}_{}'.format(x, 0 if x<=5 else y%2 if x<=8 else y%3) def get_savedata(self): self.calc_data() blocks = [block.__dict__ for block in self.blocks] return {'blocks': blocks, 'rotated_position': self.rotated_position} def norm_symbol(self, sym): try: return self.normal_rotation_symbols[sym] except KeyError: new_sym = '' for c in sym: try: new_sym = self.normal_rotation_symbols[new_sym+c] except KeyError: raise ValueError('invalid symbol:', sym) return new_sym def block_indices_to_index(self, indices): indices = tuple(indices) for b, block in enumerate(self.blocks): if block.indices == indices: return b raise ValueError('Invalid block indices:', indices) def rotation_symbolic_to_matrix(self, block, sym): m = self.rotation_matrices[sym][:] m[3] = self.blocks[block].coords return m def block_symbolic_to_block_index(self, symblock): indices = [1] * len(self.axes) for match in re.finditer(r'(.)(\d*)', symblock): blockface, blockslice = match.groups() blockface = blockface.upper() blockslicenum = int(blockslice)-1 if blockslice else 0 if blockface in self.symbolsI: axis = self.symbolsI.index(blockface) blockslicenum = self.sizes[axis]-1 - blockslicenum blockface = self.invers_symbols[blockface] else: axis = self.symbols.index(blockface) indices[axis] = blockslicenum return self.block_indices_to_index(indices) def block_index_to_block_symbolic(self, blockpos, rotsym): def axisidx_to_sym(axis, idx): if idx <= self.sizes[axis] // 2: sym = self.symbols[axis] else: idx = self.sizes[axis]-1 - idx sym = self.symbolsI[axis] sym = sym.lower() if idx == 0: # skip idx for corners return sym, self.face_symbolic_to_face_color(sym, rotsym) elif idx == 1 and self.sizes[axis] == 3: # for size == 3 there is only one edge return '', '' else: # symbol with index to distinguish edge, but no color because the face is not visible return sym + str(idx+1), '?' x, y, z = self.blocks[blockpos].indices symx, colorsymx = axisidx_to_sym(0, x) symy, colorsymy = axisidx_to_sym(1, y) symz, colorsymz = axisidx_to_sym(2, z) return symx + symy + symz, colorsymx + colorsymy + colorsymz def face_symbolic_to_face_color(self, face, rot): for k, v in self.face_permutations[rot].items(): if v == face: return k else: assert False, (face, rot) def rotate_symbolic(self, axis, rdir, block, sym): rsym = (self.symbols if not rdir else self.symbolsI)[axis] block = self.rotated_position[block, rsym] sym = self.norm_symbol(sym + rsym) return block, sym def rotate_move(self, complete_move, move): caxis, unused_cslice, cdir = complete_move maxis, mslice, mdir = move caxissym = (self.symbols if cdir else self.symbolsI)[caxis] maxissym = (self.symbols if not mdir else self.symbolsI)[maxis] raxissym = self.face_permutations[caxissym][maxissym.lower()].upper() rdir = raxissym not in self.symbols raxis = self.symbols.index(self.invers_symbols[raxissym] if rdir else raxissym) if mdir != rdir: mslice = self.sizes[raxis] - 1 - mslice return raxis, mslice, rdir @staticmethod def get_selected_move(block, face, edgeno): '''block: a block in the rotation slice face -> edgeno is the direction of slice rotation ''' edgeno = (edgeno - 1) % 4 rotation_symbol = face.faces[edgeno] return block.symbol_to_move[rotation_symbol] def compare_move_to_pick(self, maxis, unused_mslice, mdir, face, faceedge): axis = self.axes[maxis] if mdir: vpick = np.cross(axis, face.normal).tolist() else: vpick = np.cross(face.normal, axis).tolist() #TODO: rather test whether face.center+pick_vector intersects with the edge return vpick == faceedge.normal @staticmethod def get_selected_move_center(block, face): maxis, mslice, mdir = block.symbol_to_move[face.symbol] return maxis, mslice, not mdir def _gl_never_visible_face_cached(self, block, face): # pylint: disable=R0201 return face not in block.visible_glfaces def _gl_never_visible_face_create_cache(self, block, face): if not self._gl_never_visible_face_calculated(block, face): block.visible_glfaces.append(face) # create the cache and discard the real gl face return True def _gl_never_visible_face_calculated(self, block, face): if max(self.sizes) == 2 and self.sizes.count(2) >= 2: #FIXME: the algorithm to detect invisible faces is wrong, # deactivate the test for the cubes that are most affected. return False vertices = self.geom.beveled_vertices c = block.coords sqr0 = self.sizes[0] * self.sizes[0] sqr1 = self.sizes[1] * self.sizes[1] sqr2 = self.sizes[2] * self.sizes[2] for vi in face: v = [vk+ck for vk, ck in zip(vertices[vi], c)] if (v[0]*v[0] + v[1]*v[1] > min(sqr0, sqr1) or v[0]*v[0] + v[2]*v[2] > min(sqr0, sqr2) or v[1]*v[1] + v[2]*v[2] > min(sqr1, sqr2)): return False return True def texpos_tiled_to_mosaic(self, block, face, texpos_tiled): axisx, axisy = self.face_axes[face.symbol] sizex, sizey = self.sizes[axisx], self.sizes[axisy] tptx, tpty = texpos_tiled vertices = [self.geom.vertices[vi] for vi in face.vindices] subx = [(c1-c0)/2 for c0, c1 in zip(vertices[0], vertices[-1])] suby = [(c1-c0)/2 for c0, c1 in zip(vertices[0], vertices[1])] coords = block.coords[:3] tpmx = sum(tc*bc for tc, bc in zip(subx, coords)) tpmy = sum(tc*bc for tc, bc in zip(suby, coords)) texx = ((sizex-1 + tpmx) / 2. + tptx) / sizex texy = ((sizey-1 + tpmy) / 2. + tpty) / sizey return texx, texy def gl_label_quads(self, block, visible): if DEBUG: if DEBUG_INNER: for i in range(3): if block.indices[i] in [0, self.sizes[i]-1]: return if DEBUG_NOLABEL and visible: return if DEBUG_NOBEVEL and not visible: return for faceno, symbol in enumerate(self.faces): face = self.geom.faces[symbol] if (symbol in block.visible_faces) != visible: continue f = face.scaled if self.gl_never_visible_face(block, f.vindices): continue for i in [0, 1, 2, 0, 2, 3]: vi = f.vindices[i] v = self.geom.beveled_vertices[vi] texpos_tiled = self.texpos_tiled[i] texpos_mosaic = self.texpos_tiled_to_mosaic(block, face, texpos_tiled) yield (v, face.normal, faceno, texpos_tiled, texpos_mosaic) if self.mirror_distance is not None and visible: f = f.translated(self.geom.beveled_vertices, face.normal, self.mirror_distance) f.normal = face.normal[:] f.flip() for i in [0, 1, 2, 0, 2, 3]: v = f.vertices[i] tptx, tpty = self.texpos_tiled[i] texpos_tiled = 1. - tptx, tpty texpos_mosaic = self.texpos_tiled_to_mosaic(block, face, texpos_tiled) yield (v, f.normal, faceno, texpos_tiled, texpos_mosaic) def gl_beveled_quads(self, block): '''For every edge create a face''' if DEBUG: if DEBUG_INNER: for i in range(3): if block.indices[i] in [0, self.sizes[i]-1]: return if DEBUG_NOBEVEL: return for symbol, f in self.geom.faces.items(): for symbol2, (vi, vi2) in zip(f.faces, f.edges()): if symbol >= symbol2: # find the corners only once, no matter in which order continue f2 = self.geom.faces[symbol2] # f and f2 have a common edge (vi,vi2) # we now need the vertices and normals of the adjacent labels. # remember, the face must be counterclockwise! bvi1 = f.scaled.vindices[f.vindices.index(vi2)] bvi2 = f.scaled.vindices[f.vindices.index(vi)] bvi3 = f2.scaled.vindices[f2.vindices.index(vi)] bvi4 = f2.scaled.vindices[f2.vindices.index(vi2)] if self.gl_never_visible_face(block, [bvi1, bvi2, bvi3, bvi4]): continue yield self.geom.beveled_vertices[bvi1], f.normal yield self.geom.beveled_vertices[bvi2], f.normal yield self.geom.beveled_vertices[bvi3], f2.normal yield self.geom.beveled_vertices[bvi1], f.normal yield self.geom.beveled_vertices[bvi3], f2.normal yield self.geom.beveled_vertices[bvi4], f2.normal def gl_beveled_triangles(self, block): '''For every corner create a face''' if DEBUG: if DEBUG_INNER: for i in range(3): if block.indices[i] in [0, self.sizes[i]-1]: return if DEBUG_NOBEVEL: return for vi in range(len(self.geom.vertices)): bf = [] # one beveled face for each vertex bn = [] for face_first in self.geom.faces.values(): if vi in face_first.vindices: # we now have one adjacent face, this code should be reached if the model is valid break else: face_first = None assert False face = face_first while True: ivi = face.vindices.index(vi) bvi = face.scaled.vindices[ivi] bf.insert(0, bvi) # we need counterclockwise order bn.insert(0, face.normal) symbol = face.faces[ivi] face = self.geom.faces[symbol] ## we now have the clockwise next face if face_first.symbol == face.symbol: break if self.gl_never_visible_face(block, bf): continue for vi, n in zip(bf, bn): yield self.geom.beveled_vertices[vi], n def gl_pick_triangles(self, selection_mode): def edge_center(v1, v2): return [(_v1 + _v2) / 2 for _v1, _v2 in zip(v1, v2)] for block in self.blocks: cnt_faces = 0 for i in range(3): if block.indices[i] in [0, self.sizes[i]-1]: cnt_faces += 1 for face, symbol in enumerate(self.faces): f = self.geom.faces[symbol] assert f.symbol == symbol if symbol not in block.visible_faces: continue cnt_n = 0 for _sym in f.faces: if _sym in block.visible_faces: cnt_n += 1 ft = f.translated(self.geom.vertices, block.coords) vc = ft.center() if self.mirror_distance is None: ftt = ft else: ftt = ft.translated(None, f.normal, self.mirror_distance) vct = ftt.center() if selection_mode == 1 and cnt_n == 0: maxis, mslice, mdir = self.get_selected_move_center(block, f) color = len(self.pick_data) self.pick_data.append((maxis, mslice, mdir, face, True, block, symbol, None, None)) for i in (0,1,2, 2,3,0): # pylint: disable=C0324 yield color, ft.vertices[i] if self.mirror_distance is not None: color = len(self.pick_data) self.pick_data.append((maxis, mslice, not mdir, face, True, block, symbol, None, None)) for i in (0,2,1, 2,0,3): # pylint: disable=C0324 yield color, ftt.vertices[i] elif selection_mode == 1 and cnt_n == 1 and cnt_faces == 2: for edgeno, symboledge in enumerate(f.faces): # find the other face on the block if symboledge in block.visible_faces: break else: edgeno = symboledge = None assert False maxis, mslice, mdir = self.get_selected_move(block, f, edgeno) if DEBUG: assert self.compare_move_to_pick(maxis, mslice, mdir, f, self.geom.faces[symboledge]) ec = edge_center(*list(ft.edges())[edgeno]) color = len(self.pick_data) self.pick_data.append((maxis, mslice, mdir, face, False, block, symbol, vc, ec)) for i in (0,1,2, 2,3,0): # pylint: disable=C0324 yield color, ft.vertices[i] if self.mirror_distance is not None: for i in (0,2,1, 2,0,3): # pylint: disable=C0324 yield color, ftt.vertices[i] elif selection_mode == 1 and cnt_n == 2 and cnt_faces == 3: # find the two other faces on the block for i1, symboledge1 in enumerate(f.faces): # find the other face on the block i2 = (i1 + 1) % 4 symboledge2 = f.faces[i2] visible_faces = block.visible_faces if symboledge1 in visible_faces and symboledge2 in visible_faces: break else: i1 = symboledge1 = None assert False symboledges = (i1, symboledge1, i1-1), (i2, symboledge2, i2) for edgeno, symboledge, offset in symboledges: maxis, mslice, mdir = self.get_selected_move(block, f, edgeno) if DEBUG: assert self.compare_move_to_pick(maxis, mslice, mdir, f, self.geom.faces[symboledge]) ec = edge_center(*list(ft.edges())[edgeno]) color = len(self.pick_data) self.pick_data.append((maxis, mslice, mdir, face, False, block, symbol, vc, ec)) for i in (0, 1, 2): yield color, ft.vertices[(i+offset)%4] if self.mirror_distance is not None: for i in (0, 2, 1): yield color, ftt.vertices[(i+offset)%4] else: for edgeno, (edge, edget) in enumerate(zip(ft.edges(), ftt.edges())): maxis, mslice, mdir = self.get_selected_move(block, f, edgeno) ec = edge_center(*edge) color = len(self.pick_data) self.pick_data.append((maxis, mslice, mdir, face, False, block, symbol, vc, ec)) # pylint: disable=C0321 yield color, vc; yield color, edge[0]; yield color, edge[1] if self.mirror_distance is not None: yield color, vct; yield color, edget[1]; yield color, edget[0] def gl_vertex_data(self, selection_mode, design): vertices = [] normals = [] colors = [] texpos = [] # list of [count vertices, face index] labelinfos = [None for unused_b in self.blocks] cnts_block = [0 for unused_b in self.blocks] # label vertices for iblock, block in enumerate(self.blocks): cnt = 0 facesinfo = [] last_faceno = -1 for v, n, f, tpt, tpm in self.gl_label_quads(block, True): vertices += v normals += n colors += design.label_colors[f] texpos += tpm if design.imagemodes[f] else tpt if last_faceno != f: cnt = 1 facesinfo.append((cnt, f)) last_faceno = f else: cnt += 1 facesinfo[-1] = (cnt, f) labelinfos[iblock] = facesinfo # bevel, hidden labels idx_block = len(vertices) // 3 for iblock, block in enumerate(self.blocks): cnt = 0 for v, n in self.gl_beveled_quads(block): vertices += v normals += n colors += design.bevel_color cnt += 1 for v, n, f, tpt, tpm in self.gl_label_quads(block, False): vertices += v normals += n colors += design.bevel_color cnt += 1 for v, n in self.gl_beveled_triangles(block): vertices += v normals += n colors += design.bevel_color cnt += 1 cnts_block[iblock] = cnt pickvertices, pickcolors = self.gl_pick_data(selection_mode) idx_pick = len(vertices) // 3 cnt_pick = len(pickvertices) // 3 vertices += pickvertices colors += pickcolors idx_debug = len(vertices) // 3 if DEBUG_DRAW: x = float(-self.sizes[0]) y = float(-self.sizes[1]) z = float(-self.sizes[2]) # axes vertices += [x-1, y-1, z, -x, y-1, z] colors += [255, 0, 0, 255, 0, 0] vertices += [x-1, y-1, z, x-1, -y, z] colors += [0, 255, 0, 0, 255, 0] vertices += [x-1, y-1, z, x-1, y-1, -z] colors += [0, 0, 255, 0, 0, 255] # selection (modelview) vertices += [0, 0, 0, 1, 1, 1] colors += [255, 255, 255, 255, 255, 255] # selection (viewport) vertices += [0, 0, 0, 1, 1, 0] colors += [255, 255, 0, 255, 0, 0] if DEBUG: assert sum([cnt for _bi in labelinfos for cnt, unused_faceno in _bi]) == idx_block return ( array.array('f', vertices).tobytes(), array.array('f', normals).tobytes(), array.array('B', colors).tobytes(), array.array('f', texpos).tobytes(), labelinfos, idx_block, cnts_block, idx_pick, cnt_pick, idx_debug, ) def calc_data(self): '''Function to verify that Block.visible_glfaces lists are initialized.''' for iblock, block in enumerate(self.blocks): for v, n, f, tpt, tpm in self.gl_label_quads(block, True): pass for v, n in self.gl_beveled_quads(block): pass for v, n, f, tpt, tpm in self.gl_label_quads(block, False): pass for v, n in self.gl_beveled_triangles(block): pass def gl_pick_data(self, selection_mode): # Pick TRIANGLES vertices vertices = [] colors = [] for col, v in self.gl_pick_triangles(selection_mode): vertices += v color = [(col>>4) & 0xf0, (col) & 0xf0, (col<<4) & 0xf0] colors += color assert len(vertices) == len(colors) return vertices, colors class TowerModel (BrickModel): type = N_('Tower') mformat = _('{0}×{1}-Tower') symmetry = 180., 90., 180. def __init__(self, size, mirror_distance): BrickModel.__init__(self, size, mirror_distance) self.size = size[:2] @classmethod def norm_sizes(cls, sizes): x, y, unused_z = sizes return x, y, x class CubeModel (BrickModel): type = N_('Cube') mformat = _('{0}×{0}×{0}-Cube') symmetry = 90., 90., 90. def __init__(self, size, mirror_distance): BrickModel.__init__(self, size, mirror_distance) self.size = size[0], @classmethod def norm_sizes(cls, sizes): x, unused_y, unused_z = sizes return x, x, x empty_model = EmptyModel() models = [CubeModel, TowerModel, BrickModel] def from_string(modelstr): if modelstr == '*': return '*', '*', (), None re_model = r'''^(\w+) (?: \s+(\w+) (?: \s*(\W) \s*(\w+) (?: \s*\3 \s*(\w+) )?)? (?:\s+with \s+(.+) )?)?\s*$''' match = re.match(re_model, modelstr, re.X) if match is None: raise ValueError('Invalid model: ' + modelstr) mtype, width, height, depth, exp = match.group(1, 2, 4, 5, 6) for Model in models: if mtype == Model.type: break else: Model = None raise ValueError('Unknown model type %r' % mtype) def convert_if_int(value): if value is None: return value try: return int(value) except ValueError: return value sizes = tuple(convert_if_int(s) for s in (width, height, depth)) return modelstr, Model, sizes, exp pybik-1.1/pybiklib/settings.py0000644000175000017500000003256412155411670016672 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Pybik -- A 3 dimensional magic cube game. # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os from ast import literal_eval import errno from PyQt4.QtCore import * # pylint: disable=W0614,W0401 from PyQt4.QtCore import pyqtSignal as Signal from .debug import debug from . import config from . import model N_ = lambda s: s def tuple_validator(lenght, itemtype, value, valuerange=None): if type(value) is not tuple: return False if len(value) != lenght: return False for v in value: if type(v) is not itemtype: return False if valuerange is not None and not valuerange[0] <= v <= valuerange[1]: return False return True class KeyStore (QObject): schema = { # key: (default, range/enum/validator) # None: value without restriction # tuple: contains two values (min, max) # list: contains strings for the enum text, # the index is the enum value # function: returns True, if value is valid 'window.size': ((480, 360),lambda v: tuple_validator(2, int, v)), 'window.divider': (300, lambda v: type(v) is int), 'window.toolbar': (True, lambda v: type(v) is bool), 'window.editbar': (True, lambda v: type(v) is bool), 'window.statusbar': (True, lambda v: type(v) is bool), 'draw.default_rotation':((-30.,39.),lambda v: tuple_validator(2, float, v)), 'draw.lighting': (True, lambda v: type(v) is bool), 'draw.selection': (1, ['quadrant', 'simple']), 'draw.speed': (30, (1, 100)), 'game.type': (0, [m.type for m in model.models]), 'game.size': ((3,4,2), lambda v: tuple_validator(3, int, v, (1, 10))), 'game.blocks': ('solved', lambda v: type(v) is str), 'game.moves': ('', lambda v: type(v) is str), 'game.position': (0, lambda v: type(v) is int and v >= 0), 'theme.face.0.color': ('#a81407', lambda v: type(v) is str), 'theme.face.1.color': ('#d94b1c', lambda v: type(v) is str), 'theme.face.2.color': ('#f0c829', lambda v: type(v) is str), 'theme.face.3.color': ('#e3e3e3', lambda v: type(v) is str), 'theme.face.4.color': ('#1d6311', lambda v: type(v) is str), 'theme.face.5.color': ('#00275e', lambda v: type(v) is str), 'theme.face.#.image': ('', lambda v: type(v) is str), 'theme.face.#.mode': (0, ['tiled', 'mosaic']), 'theme.bgcolor': ('#B9a177', lambda v: type(v) is str), 'draw.accels': ([('r', 'KP+6'), ('r-', 'Shift+KP+Right'), ('l', 'KP+4'), ('l-', 'Shift+KP+Left'), ('u', 'KP+8'), ('u-', 'Shift+KP+Up'), ('d', 'KP+2'), ('d-', 'Shift+KP+Down'), ('f', 'KP+5'), ('f-', 'Shift+KP+Clear'), ('b', 'KP+0'), ('b-', 'Shift+KP+Ins'), ('R', 'Ctrl+KP+8'), ('L', 'Ctrl+KP+2'), ('U', 'Ctrl+KP+4'), ('D', 'Ctrl+KP+6'), ('F', 'Ctrl+KP+5'), ('B', 'Ctrl+KP+0'), ], lambda v: type(v) is list), 'draw.zoom': (1.0, (0.1, 100.0)), # The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher 'draw.samples': (3, [N_('disabled'), N_('ugly'), N_('low'), N_('medium'), N_('high'), N_('higher')]), 'draw.mirror_faces': (False, lambda v: type(v) is bool), 'draw.mirror_distance': (2.1, (0.1, 10.0)), 'action.edit_moves': ('Ctrl+L', lambda v: type(v) is str), 'action.edit_model': ('', lambda v: type(v) is str), 'action.reload_shader': ('', lambda v: type(v) is str), 'action.selectmodel': ('', lambda v: type(v) is str), 'action.initial_state': ('', lambda v: type(v) is str), 'action.reset_rotation':('', lambda v: type(v) is str), 'action.invert_moves': ('', lambda v: type(v) is str), 'action.reload_scripts':('', lambda v: type(v) is str), 'action.preferences': ('', lambda v: type(v) is str), 'action.normalize_complete_rotations':('',lambda v: type(v) is str), } changed = Signal(str) error = Signal(str) def __init__(self, filename): QObject.__init__(self) self.filename = filename self.keystore = {} self.read_settings() self.write_timer = QTimer(self) self.write_timer.setSingleShot(True) self.write_timer.setInterval(5000) self.write_timer.timeout.connect(self.write_settings) def get_default(self, key): return self.schema[key][0] def get_range(self, key): return self.schema[key][1] def get_value(self, key): try: return self.keystore[key] except KeyError: return self.get_default(key) def get_nick(self, key): value = self.get_value(key) valuerange = self.get_range(key) if not isinstance(valuerange, list): raise ValueError('{} is not an enum'.format(key)) return valuerange[value] def set_value(self, key, value): self.keystore[key] = value self.changed.emit(key) if not self.write_timer.isActive(): self.write_timer.start() def set_nick(self, key, nick): valuerange = self.get_range(key) if not isinstance(valuerange, list): raise ValueError('{} is not an enum'.format(key)) value = valuerange.index(nick) return self.set_value(key, value) def del_value(self, key): try: del self.keystore[key] except KeyError: pass # already the default value self.changed.emit(key) if not self.write_timer.isActive(): self.write_timer.start() def read_settings(self): if not self.filename: return keys = list(self.schema.keys()) dirname = os.path.dirname(self.filename) if dirname and not os.path.exists(dirname): os.makedirs(dirname) # Only convert from gconf to standard location write_version_file = False if self.filename == config.USER_SETTINGS_FILE and not os.path.exists(config.USER_VERSION_FILE): write_version_file = True try: if not os.path.exists(self.filename): from . import migration migration.gconf_0_5_to_settings_1_0(self.filename) except Exception: # pylint: disable=W0703 # Never fail, but report error sys.excepthook(*sys.exc_info()) # read settings try: with open(self.filename, 'rt', encoding='utf-8') as settings_file: lines = settings_file.readlines() except IOError as e: if e.errno == errno.ENOENT: lines = [] else: raise for line in lines: # parse the line, discard invalid keys try: key, strvalue = line.split('=', 1) except ValueError: continue key = key.strip() strvalue = strvalue.strip() if key not in keys: continue try: value = literal_eval(strvalue) except (ValueError, SyntaxError): continue # translate enums and validate values valuerange = self.get_range(key) if isinstance(valuerange, list): try: value = valuerange.index(value) except ValueError: continue elif isinstance(valuerange, tuple): if not valuerange[0] <= value <= valuerange[1]: continue elif valuerange is not None: if not valuerange(value): continue self.keystore[key] = value if write_version_file: with open(config.USER_VERSION_FILE, 'wt', encoding='utf-8') as version_file: version_file.write(config.VERSION) def dump(self, file, all=False): # pylint: disable=W0622 keydict = self.schema if all else self.keystore for key in sorted(keydict.keys()): if '#' in key: continue value = self.get_value(key) # translate enums valuerange = self.get_range(key) if isinstance(valuerange, list): value = valuerange[value] print(key, '=', repr(value), file=file) def write_settings(self): if not self.filename: return try: with open(self.filename, 'wt', encoding='utf-8') as settings_file: self.dump(settings_file) except EnvironmentError as e: error_message = _('Settings can not be written to file: ' '{error_message}').format(error_message=e) debug(error_message) self.error.emit(error_message) class Settings (object): keystore = None def __init__(self, key=''): object.__setattr__(self, '_key', key) object.__setattr__(self, '_array_len', 0) def load(self, filename): self.__class__.keystore = KeyStore(filename) keys = list(self.keystore.schema.keys()) deferred = [] for key in keys: subkeys = key.split('.') settings_parent = self for subkey in subkeys[:-1]: if subkey == '#': deferred.append(key) break if subkey.isdigit(): subkey = str(int(subkey)) try: settings_child = getattr(settings_parent, subkey) except KeyError: settings_child = Settings(settings_parent._key + subkey + '.') object.__setattr__(settings_parent, subkey, settings_child) assert isinstance(settings_child, Settings) settings_parent = settings_child else: object.__setattr__(settings_parent, subkeys[-1]+'_range', self.keystore.get_range(key)) changed = False for key in deferred: subkeys = key.split('.') settings_parent = self for i, subkey in enumerate(subkeys): if subkey == '#': for subkey in list(settings_parent.__dict__.keys()): if subkey[0] == '_': continue expanded = '.'.join(subkeys[:i] + [subkey] + subkeys[i+1:]) if expanded not in self.keystore.schema: changed = True self.keystore.schema[expanded] = self.keystore.schema[key] break settings_parent = getattr(settings_parent, subkey) if changed: self.load(filename) def close(self): self.keystore.write_timer.stop() self.keystore.write_settings() def __getattr__(self, key): if key.endswith('_nick'): return self.keystore.get_nick(self._key + key[:-5]) return self.keystore.get_value(self._key + key) def __getitem__(self, key): return getattr(self, str(key)) def __setattr__(self, key, value): if key.endswith('_nick'): key = self._key + key[:-5] func = self.keystore.set_nick else: key = self._key + key func = self.keystore.set_value if key in list(self.keystore.schema.keys()): func(key, value) else: raise AttributeError('use object.__setattr__ to set attributes') def __delattr__(self, key): _key = self._key + key if _key in list(self.keystore.schema.keys()): self.keystore.del_value(_key) else: raise AttributeError('use object.__delattr__ to delete attributes') settings = Settings() pybik-1.1/pybiklib/migration.py0000664000175000017500000001640212157360423017017 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os, subprocess rotation_symbolic_compact_to_idxrot = { "":"", "ff":"FF", "ll":"LL", "uu":"UU", "f":"F", "f'":"B", "fuu":"UUB", "fll":"UUF", "ffu":"ULL", "u":"U", "u'":"D", "ffu'":"UFF", "fu":"UL", "f'u":"UR", "fu'":"FD", "f'u'":"LB", "f'l'":"DB", "uf":"UF", "fl":"LD", "lu":"UB", "l'":"R", "ffl'":"UUL", "l":"L", "ffl":"UUR", } def indices_compact_to_index(indices, size): indices = tuple(indices) for b in range(size * size * size): bindices = (b % size, b // size % size, b // size // size) if bindices == indices: return b raise ValueError('Invalid block indices:', indices) def index_compact_to_indices(index, size): return index % size, index // size % size, index // size // size def block_compact_to_index_rot(block, size): # every block is stored as 4-tuple (x,y,z,sym), where sym is a symbolic rotation block = block.strip().split(',') x, y, z, rot = block x, y, z = int(x), int(y), int(z) x, y, z = y, size-1 - z, size-1 - x indices = x, y, z try: rot = rotation_symbolic_compact_to_idxrot[rot] except KeyError: raise ValueError('Invalid block rotation:', rot) index = indices_compact_to_index(indices, size) return '{}-{}'.format(index, rot) def blocks_compact_to_index_rot(blocks, size): def blocks_perm(index): x, y, z = index_compact_to_indices(index, size) x, y, z = size-1 - z, x, size-1 - y index = indices_compact_to_index((x, y, z), size) return blocks[index] blocks = blocks.strip().split(' ') for i, block in enumerate(blocks): blocks[i] = block_compact_to_index_rot(block, size) blocks = [blocks_perm(i) for i, unused_b in enumerate(blocks)] return ' '.join(blocks) def parse_initial_state(state): msf, blocks = state.split(':', 1) model, size, bformat = msf.split(' ', 2) if model != 'Cube': print('Unknown model:', repr(model)) print(' Fallback:', 'Cube', 3, 'solved') return 'Cube', 3, 'solved' try: size = int(size) except ValueError: print('Unknown size:', repr(size)) print(' Fallback:', 'Cube', 3, 'solved') return 'Cube', 3, 'solved' if bformat == 'identity': blocks = 'solved' elif bformat == 'blocks_compact': blocks = 'idx-rot: ' + blocks_compact_to_index_rot(blocks, size) else: blocks = 'solved' return model, size, blocks def gconf_0_5_to_settings_1_0(settings_file): path_to_face = {#'/apps/pybik': None, #'/apps/pybik/colors:': None, '/apps/pybik/colors/0:': 0, '/apps/pybik/colors/1:': 1, '/apps/pybik/colors/2:': 2, '/apps/pybik/colors/3:': 3, '/apps/pybik/colors/4:': 4, '/apps/pybik/colors/5:': 5, } path = '/apps/pybik' try: process = subprocess.Popen(['gconftool', '--recursive-list', path], stdout=subprocess.PIPE, universal_newlines=True) except OSError: return lines = process.communicate()[0] settings_dir = os.path.dirname(settings_file) if settings_dir and not os.path.exists(settings_dir): os.makedirs(settings_dir) with open(settings_file, 'wt', encoding='utf-8') as settings: face = 0 for line in lines.splitlines(): line = line.strip() face = path_to_face.get(line, face) if '=' not in line: facetype = None pattern = None imagefile = None imagemode = None continue key, value = line.split('=', 1) key = key.strip() value = value.strip() # pylint: disable=C0321 if key == 'saved_pos': print('game.position =', value, file=settings) elif key == 'selection_mode': value = 'quadrant' if value == '0' else 'simple' print('draw.selection =', repr(value), file=settings) elif key == 'saved_moves': print('game.moves =', repr('native: '+value), file=settings) elif key == 'lighting': print('draw.lighting =', value=='true', file=settings) elif key == 'background_color': print('theme.bgcolor =', repr(value), file=settings) elif key == 'saved_state': if value: mtype, size, blocks = parse_initial_state(value) print('game.type =', repr(mtype), file=settings) print('game.size =', (size, size, size), file=settings) print('game.blocks =', repr(blocks), file=settings) elif key == 'color': print('theme.face.%s.color =' % face, repr(value), file=settings) elif key == 'facetype': facetype = value if facetype == '1' and pattern is not None: print('theme.face.%s.image =' % face, repr(pattern), file=settings) if facetype == '2' and imagefile is not None: print('theme.face.%s.image =' % face, repr(imagefile), file=settings) if facetype == '2' and imagemode is not None: print('theme.face.%s.mode =' % face, repr(imagemode), file=settings) elif key == 'pattern': if value == '0': pattern = 'BEAMED EIGHTH NOTES.png' elif value == '1': pattern = 'diagonal-lines.png' elif value == '2': pattern = 'WHITE SMILING FACE.png' elif value == '3': pattern = 'BLACK SMILING FACE.png' elif value == '4': pattern = 'squares.png' elif value == '5': pattern = 'WHITE SUN WITH RAYS.png' if facetype == '1': print('theme.face.%s.image =' % face, repr(pattern), file=settings) elif key == 'imagefile': imagefile = value if facetype == '2': print('theme.face.%s.image =' % face, repr(imagefile), file=settings) elif key == 'imagemode': imagemode = 'tiled' if value != '1' else 'mosaic' if facetype == '2': print('theme.face.%s.mode =' % face, repr(imagemode), file=settings) def main(): if len(sys.argv) != 2: sys.exit(1) gconf_0_5_to_settings_1_0(sys.argv[1]) if __name__ == '__main__': main() pybik-1.1/setup.py0000755000175000017500000011101112157415625014357 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2009, 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # pylint: disable=W0201 from glob import glob import os import sys import re import distutils from distutils.core import setup import distutils.cmd from distutils.extension import Extension from distutils.dir_util import remove_tree from distutils.file_util import move_file from distutils.dep_util import newer, newer_group from distutils.log import warn, info, error, debug import distutils.dist import distutils.command.build import distutils.command.build_ext import distutils.command.build_scripts import distutils.command.install import distutils.command.install_data import distutils.command.install_lib import distutils.command.clean import distutils.command.sdist #from Cython.Distutils import build_ext from tools.po_isempty import po_isempty from pybiklib import config class Distribution (distutils.dist.Distribution): def __init__(self, attrs=None): self.bug_contact = None self.qt_ui_files = None distutils.dist.Distribution.__init__(self, attrs=attrs) class build(distutils.command.build.build): """Adds extra commands to the build target.""" user_options = distutils.command.build.build.user_options + [ ('inplace', 'i', 'ignore build-lib and put compiled modules into the source directory'), ('use-generated-code', None, 'Use generated Code included in distributed source' ' to avoid build-dependencies'), ('parallel=', None, 'Build in parallel with the given number of processes or "auto"'), ('arch-only', None, 'Build only architecture dependent files'), ('indep-only', None, 'Build only architecture independent files'), ('fast', None, 'Build models without optimization'), ] boolean_options = distutils.command.build.build.boolean_options + [ 'inplace', 'use-generated-code', 'arch-only', 'indep-only', 'fast', ] def has_pure_modules(self): return self.indep_only and not self.inplace and distutils.command.build.build.has_pure_modules(self) _commands_dict = dict(distutils.command.build.build.sub_commands) # pylint: disable=W0212 sub_commands = [('build_py', has_pure_modules), ('build_ext', lambda self: self.arch_only and self._commands_dict['build_ext'](self)), ('build_scripts', lambda self: self.indep_only and self._commands_dict['build_scripts'](self)), ('build_ui', lambda self: self.indep_only), ('build_models', lambda self: self.indep_only), ('build_i18n', lambda self: self.indep_only), ('build_man', lambda self: self.indep_only and not self.inplace), ] # pylint: enable=W0212 def initialize_options(self): distutils.command.build.build.initialize_options(self) self.inplace = 0 self.use_generated_code = False self.parallel = None self.arch_only = False self.indep_only = False self.fast = False def finalize_options(self): distutils.command.build.build.finalize_options(self) if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True class _build_csrc (distutils.command.build_ext.build_ext): user_options = distutils.command.build_ext.build_ext.user_options + [ ('cython-opts=', None, 'Cython options'), ('gles=', None, 'Build for GLES (experimental)'), ] def initialize_options(self): distutils.command.build_ext.build_ext.initialize_options(self) self.inplace = None self.cython_opts = '' self.gles = None def finalize_options(self): distutils.command.build_ext.build_ext.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ) self.cython_opts = self.cython_opts.split() def compare_file(self, filename1, filename2): if self.force or not os.path.exists(filename2): return False with open(filename1, 'rb') as file1, open(filename2, 'rb') as file2: return file1.read() == file2.read() @staticmethod def run_py2pyx(py_file, pyx_file, pxd_file): info('py2pyx: %s --> %s, %s' % (py_file, pyx_file, pxd_file)) from tools.py2pyx import create_pyx, Py2pyxParseError try: create_pyx(py_file, pyx_file, pxd_file) except Py2pyxParseError as e: error("error: %s", e) sys.exit(1) def run_cython(self, cython_opts, infile, outfile): info('cython: %s --> %s' % (infile, outfile)) self.spawn(['cython3', '-3'] + cython_opts + ['-o', outfile, infile]) def build_pyx(self, py_file, pyx_file, pxd_file): pxd_file_tmp = pxd_file + '.tmp' self.mkpath(os.path.dirname(pyx_file)) self.make_file([py_file], pyx_file, self.run_py2pyx, (py_file, pyx_file, pxd_file_tmp)) if os.path.exists(pxd_file_tmp): if self.compare_file(pxd_file_tmp, pxd_file): os.remove(pxd_file_tmp) info("unchanged file '%s'", pxd_file) else: if os.path.exists(pxd_file): os.remove(pxd_file) move_file(pxd_file_tmp, pxd_file) def build_extension(self, extension): sources = extension.sources depends = sources + extension.depends # generate pxd- and pyx-files from py-files with #px annotations pyx_files = [] pyx_files_dep = [] for in_file in depends: base, ext = os.path.splitext(in_file) if ext == '.py': base = os.path.join(self.build_temp, os.path.splitext(in_file)[0]) basename = os.path.basename(base) dirname = os.path.dirname(base) pyx_file = os.path.join(dirname, '_%s.pyx' % basename) pxd_file = os.path.join(dirname, '_%s.pxd' % basename) self.build_pyx(in_file, pyx_file, pxd_file) if in_file in extension.sources: pyx_files.append(pyx_file) pyx_files_dep.append(pxd_file) if self.gles is not None: info('Changing source for GLES %s', self.gles) with open(pyx_file, 'rt', encoding='utf-8') as f: text = f.read() text = text.replace("DEF SOURCEGLVERSION = 'GL'", "DEF SOURCEGLVERSION = 'GLES%s'" % self.gles) with open(pyx_file, 'wt', encoding='utf-8') as f: f.write(text) elif ext in ('.pxi','.pxd'): out_file = os.path.join(self.build_temp, in_file) self.mkpath(os.path.dirname(out_file)) self.copy_file(in_file, out_file) pyx_files_dep.append(out_file) else: if in_file in extension.sources: pyx_files.append(in_file) else: pyx_files_dep.append(in_file) # generate C-files with cython if extension.language == 'c++': c_file_ext = '.cpp' cython_opts = ['--cplus'] + self.cython_opts else: c_file_ext = '.c' cython_opts = self.cython_opts c_files = [] for in_file in pyx_files: base, ext = os.path.splitext(in_file) if ext == '.pyx': out_file = base + c_file_ext inplace_file = os.path.join('csrc', os.path.basename(out_file)) if self.inplace and os.path.exists(inplace_file) and not self.force: self.mkpath(os.path.dirname(out_file)) self.copy_file(inplace_file, out_file) else: self.make_file(pyx_files+pyx_files_dep, out_file, self.run_cython, (cython_opts, in_file, out_file)) c_files.append(out_file) else: c_files.append(in_file) # exclude Cython-files from dependencies c_files_dep = [] for in_file in pyx_files_dep: base, ext = os.path.splitext(in_file) if ext not in ('.pxi', '.pxd'): c_files_dep.append(in_file) extension.depends = c_files_dep extension.sources = c_files class build_csrc (_build_csrc): description = "create C source code for Python extensions" def build_extension(self, extension): _build_csrc.build_extension(self, extension) for c_file in extension.sources: inplace_file = os.path.join('csrc', os.path.basename(c_file)) self.mkpath('csrc') self.copy_file(c_file, inplace_file) class build_ext (_build_csrc): def build_extension(self, extension): if self.gles == '2': extension.libraries[:] = ['GLESv2'] sources = extension.sources ext_path = self.get_ext_fullpath(extension.name) depends = sources + extension.depends if self.force or newer_group(depends, ext_path, 'newer'): info('building C-Code for %r extension', extension.name) else: debug('skipping %r extension (up-to-date)', extension.name) return # build C-code _build_csrc.build_extension(self, extension) # build extension module from C-code distutils.command.build_ext.build_ext.build_extension(self, extension) #HACK: Due to _build_csrc.compare_file the C compiler may not run, even though # the dependencies expect this. Therefore update the timestamp manually. ext_path = self.get_ext_fullpath(extension.name) try: os.utime(ext_path, None) except OSError: pass class build_scripts (distutils.command.build_scripts.build_scripts): user_options = distutils.command.build_scripts.build_scripts.user_options + [ ('inplace', 'i', 'ignore build-lib and put compiled modules into the source directory'), ('build-temp=', 't', "temporary build directory"), ] boolean_options = distutils.command.build.build.boolean_options + ['inplace'] def initialize_options(self): distutils.command.build_scripts.build_scripts.initialize_options(self) self.inplace = None self.build_temp = None def finalize_options(self): distutils.command.build_scripts.build_scripts.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ('build_temp', 'build_temp'), ) def run(self): build_dir = self.build_dir self.build_dir = self.build_temp distutils.command.build_scripts.build_scripts.run(self) self.build_dir = build_dir for script in self.scripts: outfile = os.path.basename(script) script = os.path.join(self.build_temp, outfile) script = os.path.join(self.build_temp, outfile) if not os.path.exists(script): continue if not self.inplace: self.mkpath(self.build_dir) outfile = os.path.join(self.build_dir, outfile) outfile, ext = os.path.splitext(outfile) if ext != '.py': outfile += ext self.copy_file(script, outfile) class build_ui(distutils.cmd.Command): description = "Compile Qt user interfaces files (.ui) and resources to python modules." user_options = [ ('indent=', 'I', 'set indent width to N spaces, tab if N is 0 (default: 4)'), ('ui-execute', 'x', 'generate extra code to test and display the class'), ('from-imports','F', 'generate imports relative to "."'), ('build-lib=', 'b', 'directory for compiled UI modules'), ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ('use-generated-code', None, 'Use generated Code included in distributed source' ' to avoid build-dependencies'), ] boolean_options = ['from-imports', 'ui-execute', 'inplace', 'force', 'use-generated-code', ] def initialize_options(self): self.qt_ui_files = None self.indent = 4 self.ui_execute = False self.from_imports = False self.build_lib = None self.inplace = None self.force = None self.use_generated_code = None def finalize_options(self): self.qt_ui_files = self.distribution.qt_ui_files self.set_undefined_options('build', ('build_lib', 'build_lib'), ('inplace', 'inplace'), ('force', 'force'), ('use_generated_code', 'use_generated_code'), ) def run(self): for package_dir, ui_files in self.qt_ui_files: if self.use_generated_code: if not self.inplace: self.copy_tree(package_dir, os.path.join(self.build_lib, package_dir)) else: if not self.inplace: package_dir = os.path.join(self.build_lib, package_dir) self.mkpath(package_dir) init_file = os.path.join(package_dir, '__init__.py') if self.force and os.path.exists(init_file): os.remove(init_file) if not os.path.exists(init_file): self.execute(lambda: open(init_file, 'wt', encoding='utf-8').close(), [], 'generating ' + init_file) for ui_file in ui_files: filebase = os.path.splitext(os.path.basename(ui_file))[0] py_file = os.path.join(package_dir, filebase + '.py') self.make_file(ui_file, py_file, self.compile_ui, [ui_file, py_file]) def compile_ui(self, ui_file, py_file): from tools import translation_from_ui windowinfo = translation_from_ui.parse_file(ui_file) with open(py_file, 'wt', encoding='utf-8') as file: translation_from_ui.write_file(*windowinfo, file=file) class build_models(distutils.cmd.Command): description = "Create data for Pybik models and write it to python modules." user_options = [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ('parallel=', None,'Build in parallel with the given number of processes or "auto"'), ('fast', None,'Build models without optimization'), ] boolean_options = ['inplace', 'force', 'fast'] def initialize_options(self): self.build_base = None self.inplace = None self.force = None self.parallel = None self.fast = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('inplace', 'inplace'), ('force', 'force'), ('parallel', 'parallel'), ('fast', 'fast'), ) if self.parallel is None: self.parallel = 1 elif self.parallel == 'auto': import multiprocessing self.parallel = multiprocessing.cpu_count() else: self.parallel = int(self.parallel) def run(self): from tools import modeldata modeldir = os.path.join('data' if self.inplace else self.build_base, 'models') self.mkpath(modeldir) if self.force and not self.dry_run: for filename in os.listdir(modeldir): filename = os.path.join(modeldir, filename) os.remove(filename) def create_modeldata(directory, testfunc): modeldata.create_modeldata(directory, testfunc, self.parallel, self.fast) if self.force: testfunc = None else: testfunc = lambda filename: newer('pybiklib/model.py', filename) message = 'generating model data using {} processes'.format(self.parallel) self.execute(create_modeldata, [modeldir, testfunc], msg=message) data_files = self.distribution.data_files for filename in os.listdir(modeldir): sourcepath = os.path.join(modeldir, filename) data_files.append(('share/pybik/models', (sourcepath,))) class build_i18n(distutils.cmd.Command): description = "integrate the gettext framework" user_options = [ ('desktop-files=', None, '.desktop.in files that should be merged'), ('xml-files=', None, '.xml.in files that should be merged'), ('schemas-files=', None, '.schemas.in files that should be merged'), ('key-files=', None, '.key.in files that should be merged'), ('domain=', 'd', 'gettext domain'), ('merge-po', 'm', 'merge po files against template'), ('po-dir=', 'p', 'directory that holds the i18n files'), ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ] boolean_options = ['merge-po', 'inplace', 'force'] def initialize_options(self): self.build_base = None self.desktop_files = [] self.xml_files = [] self.key_files = [] self.schemas_files = [] self.domain = None self.merge_po = False self.po_dir = None self.inplace = None self.force = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('inplace', 'inplace'), ('force', 'force'), ) if self.inplace: self.mo_dir = 'data/locale' else: self.mo_dir = os.path.join(self.build_base, 'mo') if self.domain is None: self.domain = self.distribution.metadata.name if self.po_dir is None: self.po_dir = "po" def do_merge_po(self): '''Update po(t) files and print a report''' from tools.conv_plugin_for_translation import convert # We have to change the working dir to the po dir for intltool wd = os.getcwd() temp_files = [] try: for unused_target, files in self.distribution.data_files: for in_file in files: if in_file.endswith('.algorithm'): out_file = in_file + '.py' self.make_file(in_file, out_file, convert, [in_file, out_file]) temp_files.append(out_file) os.chdir(self.po_dir) self.spawn(["intltool-update", "-r", "-g", self.domain]) finally: os.chdir(wd) for temp_file in temp_files: os.remove(temp_file) def run(self): """Update the language files, generate mo files and add them to the to be installed files""" os.environ["XGETTEXT_ARGS"] = "--msgid-bugs-address=%s " % self.distribution.bug_contact # Print a warning if there is a Makefile that would overwrite our values if os.path.exists("%s/Makefile" % self.po_dir): self.announce('' 'WARNING: Intltool will use the values specified from the' ' existing po/Makefile in favor of the vaules' ' from setup.cfg.' ' Remove the Makefile to avoid problems.') if self.merge_po: #TODO: --merge-po should do this and nothing else self.do_merge_po() data_files = self.distribution.data_files for po_file in glob("%s/*.po" % self.po_dir): if po_isempty(po_file): print('skipping empty po file', po_file) continue lang = os.path.splitext(os.path.basename(po_file))[0] mo_dir = os.path.join(self.mo_dir, lang, "LC_MESSAGES") mo_file = os.path.join(mo_dir, "%s.mo" % self.domain) self.mkpath(mo_dir) def msgfmt(po_file, mo_file): self.spawn(["msgfmt", po_file, "-o", mo_file]) self.make_file([po_file], mo_file, msgfmt, [po_file, mo_file]) targetpath = os.path.join("share/locale", lang, "LC_MESSAGES") data_files.append((targetpath, (mo_file,))) if not self.merge_po: return #FIXME: currently *.desktop is treated as source and generated from *.desktop.in with merge-po.sh # better: *.desktop.in is treated as source and *.desktop not committed # merge .in with translation if not self.desktop_files: for targetpath, files in data_files: for f in files: if f.endswith('.desktop'): self.desktop_files.append(f) for (files, switch) in ((self.xml_files, "-x"), (self.desktop_files, "-d"), (self.schemas_files, "-s"), (self.key_files, "-k"),): for f in files: if f.endswith(".in"): self.warn("aDon't know, what to do with this file: " + f) continue srcfile = f + '.in' if not os.path.isfile(srcfile): self.warn("sDon't know, what to do with this file: " + f) continue dstfile = f def intltool_merge(switch, src, dst): self.spawn(["intltool-merge", switch, self.po_dir, src, dst]) self.make_file(glob('%s/*.po'%self.po_dir)+[srcfile], dstfile, intltool_merge, [switch, srcfile, dstfile]) class build_man (distutils.cmd.Command): description = "build the manpage" user_options = [ ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ] def initialize_options(self): self.force = None self.build_base = None self.build_dir = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('force', 'force'), ) self.set_undefined_options('build_scripts', ('build_dir', 'build_dir')) def run(self): def create_manpage(script_file, section, man_file): os.environ['PYTHONPATH'] = '.' self.spawn(['help2man', '--name', config.SHORT_DESCRIPTION, '--section', section, '--output', man_file, '--no-info', script_file]) data_files = self.distribution.data_files man_dir = os.path.join(self.build_base, 'man') self.mkpath(man_dir) if '.' not in sys.path: sys.path.insert(0, '.') section = '6' for script in os.listdir(self.build_dir): script_file = os.path.join(self.build_dir, script) man_file = os.path.join(man_dir, '.'.join((script, section))) self.make_file(['pybiklib/config.py', script_file], man_file, create_manpage, [script_file, section, man_file]) data_files.append(('share/man/man'+section, [man_file])) class install_lib (distutils.command.install_lib.install_lib): user_options = distutils.command.install_lib.install_lib.user_options + [ ('arch-only', None, 'Install only architecture dependent files'), ('indep-only', None, 'Install only architecture independent files'), ] boolean_options = ['arch-only', 'indep-only'] def initialize_options(self): distutils.command.install_lib.install_lib.initialize_options(self) self.data_dir = None self.arch_only = None self.indep_only = None def finalize_options(self): distutils.command.install_lib.install_lib.finalize_options(self) self.set_undefined_options('install', ('arch_only', 'arch_only'), ('indep_only', 'indep_only'), ) if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True def build(self): if not self.skip_build: if self.distribution.has_pure_modules() and self.indep_only: self.run_command('build_py') if self.distribution.has_ext_modules() and self.arch_only: self.run_command('build_ext') class install (distutils.command.install.install): user_options = distutils.command.install.install.user_options + [ ('data-dir=', 't', 'Directory where the application will find the data'), ('arch-only', None, 'Install only architecture dependent files'), ('indep-only', None, 'Install only architecture independent files'), ] boolean_options = ['arch-only', 'indep-only'] def initialize_options(self): distutils.command.install.install.initialize_options(self) self.data_dir = None self.arch_only = False self.indep_only = False def finalize_options(self): distutils.command.install.install.finalize_options(self) if self.data_dir is None: self.data_dir = os.path.join(self.install_data, 'share') if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True if not self.indep_only: self.__class__.sub_commands = [(cmd, func) for cmd, func in distutils.command.install.install.sub_commands if cmd == 'install_lib'] def run(self): if not self.skip_build: # distutils.command.install.install.run() will run build, but we need # to modify a file between build and install build_cmd = self.distribution.get_command_obj('build') build_cmd.arch_only = self.arch_only build_cmd.indep_only = self.indep_only self.run_command('build') self.skip_build = True filename = os.path.join(self.build_lib, 'pybiklib', 'config.py') app_data_dir = os.path.join(self.data_dir, 'pybik') if self.indep_only: with open(filename, 'rt', encoding='utf-8') as f: text = f.read() for pattern, repl in [ (r'^(data_dir\s*=\s*).*$', r'\1' + repr(self.data_dir)), (r'^(appdata_dir\s*=\s*).*$', r'\1' + repr(app_data_dir)),]: text = re.sub(pattern, repl, text, count=1, flags=re.MULTILINE) with open(filename, 'wt', encoding='utf-8') as f: f.write(text) distutils.command.install.install.run(self) if self.record: self.warn('The --record option is broken, files from the build_ui command are not recorded.') class clean (distutils.command.clean.clean): user_options = distutils.command.clean.clean.user_options + [ ('inplace', 'i', 'clean up files in the source directory'), ] boolean_options = distutils.command.clean.clean.boolean_options + [ 'inplace', ] def initialize_options(self): distutils.command.clean.clean.initialize_options(self) self.inplace = None def finalize_options(self): distutils.command.clean.clean.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ) def run(self): def remove_tree_(directory): if os.path.exists(directory): remove_tree(directory, dry_run=self.dry_run, verbose=self.verbose) else: warn("%r does not exist -- can't clean it", directory) def remove_file(filename): if os.path.exists(filename): info('removing %r', filename) if not self.dry_run: os.remove(filename) else: warn("%r does not exist -- can't clean it", filename) if self.all: for _dir in ['mo', 'man', 'models']: remove_tree_(os.path.join(self.build_base, _dir)) distutils.command.clean.clean.run(self) if self.inplace: for dirname in ('pybiklib/', 'pybiklib/ui/', 'data/plugins/', 'pybiktest/'): for filename in glob(dirname + '*.pyc'): remove_file(filename) remove_tree_(dirname + '__pycache__') if self.all: dirnames = ['pybiklib/ui', 'data/locale', 'data/models'] for dirname in dirnames: remove_tree_(dirname) for filename in glob('pybiklib/*.so'): remove_file(filename) remove_file('pybik') class sdist(distutils.command.sdist.sdist): user_options = distutils.command.sdist.sdist.user_options + [ ('debian-names', None, 'Create archive files with Debian names'), ] boolean_options = distutils.command.sdist.sdist.boolean_options + [ 'debian-names' ] def initialize_options(self): distutils.command.sdist.sdist.initialize_options(self) self.debian_names = False def run(self): from tools import create_docs copyright = create_docs.read_utf8('debian/copyright') # pylint: disable=W0622 copyright = copyright.replace( ' The full text of the GPL is distributed in\n' ' /usr/share/common-licenses/GPL-3 on Debian systems.', ' The full text of the GPL is distributed in\n' ' the original source archive in the file COPYING.') create_docs.write_utf8('copyright', copyright) create_docs.create_README() def remove_tree_(directory): if os.path.exists(directory): remove_tree(directory, dry_run=self.dry_run, verbose=self.verbose) else: warn("%r does not exist -- can't clean it", directory) remove_tree_('csrc') self.run_command('build_csrc') distutils.command.sdist.sdist.run(self) for archive_file in self.archive_files: if self.debian_names: debian_file = archive_file.replace('-', '_', 1).replace('.tar', '.orig.tar', 1) os.rename(archive_file, debian_file) remove_tree_('csrc') def get_file_list(self): self.filelist.append('copyright') for f in glob('po/*.po'): if po_isempty(f): print('skipping empty po file', f) else: self.filelist.files.append(f) distutils.command.sdist.sdist.get_file_list(self) setup( # Metadata name=config.PACKAGE, version=config.VERSION, author=config.AUTHOR, author_email=config.CONTACT_EMAIL, url=config.WEBSITE, description=config.SHORT_DESCRIPTION, long_description=config.LONG_DESCRIPTION, download_url=config.DOWNLOADS, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: X11 Applications :: Qt', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 'Operating System :: POSIX', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python :: 3', 'Programming Language :: Cython', 'Programming Language :: OpenGL Shading Language', 'Topic :: Games/Entertainment :: Puzzle Games', ], license=config.LICENSE_NAME, # Metadata added in overloaded Distribution bug_contact=config.CONTACT_FILEBUG, # Files scripts=['pybiklib/pybik.py'], data_files=[ ('share/applications', ['data/applications/pybik.desktop']), ('share/pixmaps', ['data/pixmaps/pybik.png']), ('share/pybik/ui', glob('data/ui/*.*')), ('share/pybik/ui/images', glob('data/ui/images/*')), ('share/pybik/plugins', glob('data/plugins/*.py')), ('share/pybik/plugins', glob('data/plugins/*.algorithm')), ('share/pybik/shaders', glob('data/shaders/*')), ('share/pybik/tests', glob('data/tests/*')), ('share/pybik/', ['data/GPL-3']), ], qt_ui_files=[('pybiklib/ui', glob('data/ui/*.ui'))], ext_modules=[ Extension('pybiklib/_gldraw', ['pybiklib/gldraw.py'], language='c++', depends=['pybiklib/gl.pxd', 'pybiklib/glm.pxd'], libraries=['GL'], define_macros=[('GL_GLEXT_PROTOTYPES', None)]), Extension('pybiklib/_glarea', ["pybiklib/glarea.py"], language='c++', depends=['pybiklib/gl.pxd', 'pybiklib/glm.pxd', 'pybiklib/gldraw.py'], libraries=['GL'], define_macros=[('GL_GLEXT_PROTOTYPES', None)]), ], packages=['pybiklib', 'pybiktest'], package_dir={'pybiklib': 'pybiklib', 'pybiktest': 'pybiktest'}, package_data={'pybiktest': ['data/*']}, # setup classes distclass=Distribution, cmdclass={ 'build': build, 'build_csrc': build_csrc, 'build_ext': build_ext, 'build_scripts': build_scripts, 'build_ui': build_ui, 'build_models': build_models, 'build_i18n': build_i18n, 'build_man': build_man, 'install_data': distutils.command.install_data.install_data, 'install_lib': install_lib, 'install': install, 'clean': clean, 'sdist': sdist, }, ) pybik-1.1/PKG-INFO0000664000175000017500000000222112157424343013740 0ustar barccbarcc00000000000000Metadata-Version: 1.1 Name: pybik Version: 1.1 Summary: 3D Rubik's cube game Home-page: https://launchpad.net/pybik/ Author: B. Clausius Author-email: barcc@gmx.de License: GPL-3+ Download-URL: https://launchpad.net/pybik/+download Description: Pybik is an interactive, graphical, single player puzzle about the cube invented by Ernő Rubik. Besides the cube the program can handle towers and bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a collection of various moves. The cube can be manipulated with the mouse or keyboard. You can change the colors or images on the faces of the cube. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: X11 Applications :: Qt Classifier: Intended Audience :: End Users/Desktop Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Cython Classifier: Programming Language :: OpenGL Shading Language Classifier: Topic :: Games/Entertainment :: Puzzle Games pybik-1.1/po/0000775000175000017500000000000012157424343013264 5ustar barccbarcc00000000000000pybik-1.1/po/ja.po0000664000175000017500000005650212157352352014226 0ustar barccbarcc00000000000000# Japanese translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-10 04:36+0000\n" "Last-Translator: epii \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Esc キーを押すと編集モードを終了します" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ムーブ" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "おめでとうございます、パズルを解くことができました!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "三次元ルービックキューブゲーム" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "キーを押してください…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "プレイン" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "選択…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "上" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "下" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "左" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "右" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "前" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "後" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "画像を開く" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "サイズ:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "操作を中止しています、しばらくお待ちください" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik プロジェクトのウェブサイト" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "設定の読込中にエラーが発生しました:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "このアルゴリズムはどのモデルでもうまくいきません。\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/es.po0000664000175000017500000006415712157352352014250 0ustar barccbarcc00000000000000# Spanish translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 12:02+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Oprima la tecla Esc para salir del modo de edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movimiento" msgstr[1] "{current} / {total} movimientos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "resuelto" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "sin resolver" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "¡Felicidades, ha resuelto el rompecabezas!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Juego del cubo de Rubik en 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Este programa es software libre: puede redistribuirlo y/o modificarlo bajo " "los términos de la Licencia Pública General de GNU, como la publica la Free " "Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) " "cualquier versión posterior.\n" "\n" "Este programa se distribuye con la esperanza de que será útil, pero SIN " "NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o " "IDONEIDAD PARA UN PROPÓSITO EN PARTICULAR. Consulte la Licencia Pública " "General de GNU para más detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lea el texto completo de la Licencia Pública " "General de GNU<|> o consulte ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Debería haber recibido una copia de la Licencia Pública General GNU junto " "con este programa. De no ser así, visite ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "El grupo " "de traducción de Launchpad<|> gestiona las traducciones.\n" "\n" "Si quiere ayudar a traducir Pybik a su idioma natal puede hacerlo mediante " "la interfaz web<|>.\n" "\n" "Lea más sobre traducir con " "Launchpad<|> y cómo empezar<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Oprima una tecla…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Necesita reiniciar el programa para que los cambios surtan efecto." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "plano" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "seleccionar…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Arriba" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Abajo" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Izquierda" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Derecha" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Anverso" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Reverso" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Clave" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imagen" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Tamaño:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Base:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Anchura:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Cancelando la operación, espere un momento" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Sitio web del proyecto Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Ocurrió un error mientras se leían las configuraciones:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Ladrillo" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Bloque" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Torre" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Torre" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cubo" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubo" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Este algoritmo no funciona para cualquier modelo.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Este algoritmo sólo funciona para:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "desactivado" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "horrible" #: ../pybiklib/settings.py:89 msgid "low" msgstr "baja" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "media" #: ../pybiklib/settings.py:90 msgid "high" msgstr "alta" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" "Las configuraciones no pueden ser leídas para el archivo: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Acerca de Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Acerca de" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Traductores:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Sugerencias" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Traducir" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licencia" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Juego" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "Ay&uda" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Salir" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Seleccionar modelo…" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Invertir movimientos" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Recargar complementos" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferencias…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Barra de herramientas" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Barra de e&stado" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Información…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Retroceder" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Detener" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Reproducir" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Siguiente" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Avanzar" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Añadir marca" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Marcar el lugar actual en la secuencia de movimientos" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Quitar marca" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Desmarcar el lugar actual en la secuencia de movimientos" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "Barra de &edición" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Seleccionar modelo" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Altura:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profundidad:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferencias" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Velocidad de la animación:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Iluminación" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Distancia de espejo:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Suavizado" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Ratón" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Cuatro direcciones" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Teclas" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Añadir" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Quitar" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Restablecer" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Apariencia" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Color:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Archivo de imagen:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "En mosaico" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Fondo:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubo;rompecabezas;mágico;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Desafíos" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Resolver un cubo aleatorio" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Resolver en un movimiento" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Resolver en 2 movimientos" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Resolver en 3 movimientos" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Resolver en 4 movimientos" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Resolver en 5 movimientos" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Resolver en 6 movimientos" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Resolver en 7 movimientos" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Resolver en 8 movimientos" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Resolver en 9 movimientos" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Resolver en 10 movimientos" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Solucionadores" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel mejorado" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Método de capas (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Rayas" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Entrecruzado" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Tablero de ajedrez" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Cruzado" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Hora del T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cubo en un cubo" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Ortoedros de seis cuadrados" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Capa central" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Girar esquinas" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Arriba y adelante" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Arriba y abajo" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Varios" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/uk.po0000664000175000017500000007720012157352352014251 0ustar barccbarcc00000000000000# Ukrainian translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # # FIRST AUTHOR , 2012. # Yuri Chornoivan , 2012. msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-02 05:44+0000\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Натисніть клавішу Esc, щоб вийти з режиму редагування" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} з {total} ходу" msgstr[1] "{current} з {total} ходів" msgstr[2] "{current} з {total} ходів" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "розв’язано" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "не розв’язано" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Вітаємо, ви розв’язали головоломку!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Тривимірний кубик Рубіка" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik — інтерактивна графічна головоломка для одного гравця, створена на " "основі кубика винайденого Ерньо Рубіком. Окрім кубиків програма може " "працювати з баштами та цеглинками (некубічними головоломками). У Pybik " "передбачено інструменти розв’язування, створення візерунків та збірку " "різноманітних ходів. Кубиком можна керувати за допомогою миші або " "клавіатури. Передбачено можливість зміни кольорів або зображень на поверхнях " "кубика." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Ця програма є вільним програмним забезпеченням. Ви можете поширювати і/або " "змінювати її за умов дотримання GNU General Public License у тій формі, у " "якій її оприлюднено Free Software Foundation; версії 3 цієї ліцензії або " "(якщо бажаєте) будь-якої пізнішої її версії.\n" "\n" "Ця програм поширюється у сподіванні, що вона буде корисною, але її поширення " "НЕ СУПРОВОДЖУЄТЬСЯ ЖОДНИМИ ГАРАНТІЯМИ навіть очевидними гарантіями " "КОМЕРЦІЙНОЇ ЦІННОСТІ або ПРИДАТНОСТІ ДО ПЕВНОЇ МЕТИ. Докладніше про це можна " "дізнатися з GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Ознайомтеся з повним текстом Загальної громадської " "ліцензії GNU<|> або відвідайте сторінку ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Ви маєте отримати копію GNU General Public License разом з цією програмою. " "Якщо цього не сталося, скористайтеся ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Якщо вами буде виявлено вади у Pybik або у вас виникнуть пропозиції щодо її " "покращення, будь ласка, створіть відповідний <{CONTACT_FILEBUG}|>звіт щодо " "вади<|>. У останньому випадку позначте звіт щодо вади міткою " "«Wishlist» («побажання»)." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Переклади виконуються групою перекладачів Launchpad<|>.\n" "\n" "Якщо ви хочете допомогти перекласти Pybik вашою мовою, скористайтеся " "відповідним інтерфейсом<|>.\n" "\n" "Ознайомтеся з настановами щодо перекладу за допомогою Launchpad<|> та початкових кроків з перекладу<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Натисніть клавішу…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Щоб зміни набули чинності, програму слід перезапустити." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "площина" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "вибрати…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Вгору" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Вниз" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Ліворуч" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Праворуч" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Перед" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Зворот" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Хід" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Клавіша" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Відкрити зображення" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Розмір:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Основа:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Ширина:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Скасовуємо дію, зачекайте" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Сайт проекту Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Під час спроби читання параметрів сталася помилка:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Цеглинка" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "Цеглинка-{0}×{1}×{2}" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Башта" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "Башта-{0}×{1}" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Куб" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "Куб-{0}×{0}×{0}" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Цей алгоритм працює не для всіх моделей.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Цей алгоритм працює лише для таких випадків:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "вимкнено" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "слабке" #: ../pybiklib/settings.py:89 msgid "low" msgstr "низьке" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "середнє" #: ../pybiklib/settings.py:90 msgid "high" msgstr "значне" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "потужне" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Не вдалося записати параметри до файла: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Про Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Про програму" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Перекладачі:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Зворотній зв’язок" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Перекласти" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Ліцензія" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Гра" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "З&міни" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "П&ерегляд" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Довідка" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Новий випадковий" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Н&овий розв’язаний" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "Ви&йти" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Вибрати модель…" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "З&робити початковим станом" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "С&кинути обертання" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Інвертувати ходи" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Перезавантажити додатки" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "П&араметри…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Панель інструментів" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Смужка &стану" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "Ін&формація…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Повний назад" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Перейти до попередньої позначки (або до початку) послідовності обертань" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Попередній" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Повернутися на одне обертання назад" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Зупинити" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Припинити виконання послідовності обертань" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Пуск" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Запустити послідовність обертань" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Далі" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Виконати наступне обертання" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Вперед" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Перейти до наступної позначки (або кінця) послідовності ходів" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Додати позначку" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Встановити позначку на поточній позиції у послідовності обертань" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Вилучити позначку" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Вилучити позначку з поточного місця у послідовності ходів" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "Панель &редагування" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Нормалізувати обертання кубика" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Вибір моделі" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Висота:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Глибина:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Параметри" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Графіка" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Швидкість анімації:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Підсвічування" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Відстань до дзеркала:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Менше згладжування знижує рівень навантаження на систему, більше " "згладжування покращує якість зображення.\n" "Якщо анімація виконується з ривками, змініть значення цього параметра. Після " "зміни значення параметра програму доведеться перезапустити." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Згладжування" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Миша" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Чотири напрямки" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Спрощена,\n" "права кнопка скасовує хід" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Клавіші" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Додати" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Вилучити" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Скинути" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Вигляд" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Колір:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Файл зображення:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Плиткою" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Мозаїка" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Тло:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;рубік;кубик;головоломка;загадка;гра;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Виклики" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Розв’язати випадковий куб" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Розв’язати за 1 хід" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Розв’язати за 2 ходи" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Розв’язати за 3 ходи" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Розв’язати за 4 ходи" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Розв’язати за 5 ходів" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Розв’язати за 6 ходів" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Розв’язати за 7 ходів" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Розв’язати за 8 ходів" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Розв’язати за 9 ходів" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Розв’язати за 10 ходів" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Розв’язувачі" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Метод Шпігеля" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Верхні краї" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Верхні кути" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Середній шар" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Місце нижнього краю" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Орієнтація нижнього краю" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Місце нижнього кута" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Орієнтація нижнього кута" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Покращений метод Шпігеля" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Метод шарів (Леян Ло)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Верхній шар" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Чудові візерунки" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Смуги" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Хрест-навхрест" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Яєшня" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Велика оката яєшня" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 очка у яєшні" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Шахова дошка" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Хрестик" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Зиґзаґ" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Час-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Куб у кубі" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Смуговий куб у кубі" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Шість квадратних кубоїдів" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Супервіддзеркалення" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Просте супервіддзеркалення" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Зелена мамба" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Анаконда" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Качина лапа" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Бібліотека" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Середній шар" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Перед праворуч" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Перед ліворуч" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Останній шар" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Поміняти місцями краї" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Перевернути краї" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Поміняти місцями кути" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Обертати кути" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Обертати центр" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "Подвійний вгору" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Згори і спереду" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Згори і знизу" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Інше" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Назад без повертання" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "Подвійний назад без повертання" pybik-1.1/po/uz.po0000664000175000017500000005570712157352352014300 0ustar barccbarcc00000000000000# Uzbek translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-02 00:46+0000\n" "Last-Translator: Akmal Xushvaqov \n" "Language-Team: Uzbek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "\"Tahrirlash usuli\"dan chiqish uchun \"Esc\" tugmasini bosing." #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} koʻchirish" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "hal qilindi" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "hal qilinmadi" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Tabriklaymiz, siz muammoni hal qildingiz!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "3D Rubik'ning kub oʻyini" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/ast.po0000664000175000017500000006727612157352352014435 0ustar barccbarcc00000000000000# Asturian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 11:23+0000\n" "Last-Translator: Xuacu Saturio \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Calque la tecla Esc pa salir del mou d'edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movimientu" msgstr[1] "{current} / {total} movimientos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "resueltu" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "ensin resolver" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "¡Norabona, resolvió'l rompecabeces!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Xuegu del cubu de Rubik 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik ye un rompecabeces gráficu interactivu, basáu nel cubu inventáu por " "Ernő Rubik. Amás del cubu, el programa pue manexar torres y lladriyos " "(rompecabeces non cúbicos). Pybik dispón tamién de solucionadores, guapos " "patrones y una coleición d'algunos movimientos. El cubu pue manipuliase col " "mur o col tecláu. Pue camudar los colores o les imaxes de les cares del cubu." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Esti programa ye software llibre: pue redistribuílu y/o camudalu baxo los " "términos de la Llicencia Pública Xeneral GNU, tal y como la publica la Free " "Software Foundation, o bien la versión 3 de la llicencia, o (como prefiera) " "cualquier versión posterior.\n" "\n" "Esti programa distribúise esperando que seya útil, pero ENSIN NENGUNA " "GARANTÍA, sin siquiera la garantía implícita de COMERCIALIDÁ o ADAUTACIÖN PA " "UN PROPÓSITU PARTICULAR. Vea la Llicencia Pública Xeneral GNU pa más " "detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Llea'l testu completu de la Llicencia Pública " "Xeneral GNU<|> o vea ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Habría de tener recibío una copia de la Llicencia Pública Xeneral GNU xunto " "con esti programa. Sinón visite ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Se atopa algún fallu en Pybik o tien una suxerencia p'ameyoralu, por favor, " "unvie un <{CONTACT_FILEBUG}|>informe d'error<|>. Si ye una suxerencia, pue " "marcar l'informe d'error como «Wishlist» (Llista de deseos)." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" "Les traducciones xestionense pol " "Grupu de " "traducción de Launchpad<|>.\n" "\n" "Si quier ayudar a traducir Pybik al so idioma pue facelo usando la " "interfaz web<|>.\n" "\n" "Llea más tocante a \"Traducir con " "Launchpad\"<|> y " "\"Principiar a " "traducir\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Calca una tecla…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Necesites reaniciar el programa pa que los cambeos surtan efeutu." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "planu" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "seleicionar…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Xubir" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Baxar" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Esquierda" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Drecha" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Frente" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Reversu" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Clave" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imaxe" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Tamañu:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Base:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Anchor:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Encaboxando la operación, espera un momentu" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Sitiu web del proyeutu Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Hebo un error al lleer la configuración:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Lladriyu" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Bloque" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Torre" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Torre" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cubu" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubu" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Esti algoritmu nun funciona pa cualquier modelu.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Esti algoritmu namái funciona pa:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "desactiváu" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "feu" #: ../pybiklib/settings.py:89 msgid "low" msgstr "baxo" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "mediu" #: ../pybiklib/settings.py:90 msgid "high" msgstr "Altu/a" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "mayor" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Les configuraciones nun puen lleese pal ficheru: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Tocante a Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Tocante a" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Traductores:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Suxerencias" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Traducir" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Llicencia" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Xuegu" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Ayuda" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Nuevu al debalu" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Nue&vu resueltu" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "Co&lar" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Seleicionar modelu..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Definir como estáu inicial" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Reestablecer xiru" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Invertir los movimientos" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Recargar Complementos" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferencies…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Barra de &ferramientes" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Barra d'&estáu" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Info…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Rebobinar" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Dir a la marca anterior (o al principiu) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Dar un pasu atrás" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Parar" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Detener la execución de la secuencia de movimientos" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Xugar" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Executar p'alantre la secuencia de movimientos" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Siguiente" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Dar un pasu alantre" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Alantre" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Dir a la siguiente marca (o al final) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Amestar marca" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Marcar el llugar actual na secuencia de movimientos" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Desaniciar marca" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Desaniciar la marca del llugar actual na secuencia de movimientos" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Editar barra" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Normalizar los xiros del cubu" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Seleicionar modelu" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Altor:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profundidá:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferencies" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Gráficu" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Velocidá de l'animación:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Illuminación" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Distancia d'espeyu:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Un suavizáu baxu supón un meyor rindimientu,un suavizáu altu supón meyor " "calidá.\n" "Si les animaciones nun son suaves, pue axustar esta configuración. Llueu " "tendrá que reaniciar el programa." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialies" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Mur" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Cuatro direiciones" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplificáu,\n" "o botón drechu invierte'l movimientu" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Tecles" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Amestar" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Desaniciar" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Reaniciar" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Aspeutu" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Color:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Ficheru d'imaxe:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "En mosaicu" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaicu" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Fondu:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubu;rompecabeces;máxicu;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Retos" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Resolver un cubu al debalu" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Resolver nun movimientu" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Resolver en 2 movimientos" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Resolver en 3 movimientos" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Resolver en 4 movimientos" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Resolver en 5 movimientos" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Resolver en 6 movimientos" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Resolver en 7 movimientos" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Resolver en 8 movimientos" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Resolver en 9 movimientos" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Resolver en 10 movimientos" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Solucionadores" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Bordes superiores" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Esquines superiores" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Banda del mediu" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Llugar del borde inferior" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Orientar el borde inferior" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Llugar d'esqina inferior" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Orientar esquina inferior" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel ameyoráu" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Métodu de la capa (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Banda superior" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Patrones guapos" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Rayes" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Entrellazáu" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Güevos fritos" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Güevos fritos grandes" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 güevos fritos" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Tableru d'axedrez" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Cruz" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Ziszás" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Tiempu-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cubu nun cubu" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Cubu a rayes nun cubu" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Seyes cuboides cuadraos" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Superflip fácil" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Pie de coríu" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Capa del mediu" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Frente pa la drecha" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Frente pa la izquierda" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Última capa" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Intercambiar los bordes" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Voltiar los bordes" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Intercambiar esquines" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Xirar esquines" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Xirar el centru" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×Arriba" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Arriba y al frente" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Arriba y abaxo" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Otros" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Atrás ensin retornu" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2xAtrás ensin retornu" pybik-1.1/po/bs.po0000664000175000017500000006403112157352352014234 0ustar barccbarcc00000000000000# Bosnian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-09 11:55+0000\n" "Last-Translator: Kenan Dervišević \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-06-11 05:57+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Pritisnite Esc tipku da zatvorite mod za uređivanje" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} pokret" msgstr[1] "{current} / {total} pokreta" msgstr[2] "{current} / {total} pokreta" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "riješeno" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "nije riješeno" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "nije riješeno" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Čestitamo, riješili ste zagonetku!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "3D Rubikova kocka" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik je interaktivna grafička zagonetka za jednog igrača o kocki koju je " "izumio Ernő Rubik. Osim kocki, program može raditi sa kulama i ciglama. " "Pybik također može i rješavati probleme, uzorke i kolekcije raznih poteza. " "Kockom se može upravljati pomoću miša ili tastature. Možete mijenjati boje " "ili slike na svakoj od strana kocke." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Pročitajte cijeli tekst GNU Opće javne licence<|> " "ili posjetite ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Trebali ste da primite primjerak GNU Opće javne licence uz %s; ako niste, " "pogledajte ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Pritisnite tipku ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Program je potrebno ponovo pokrenuti da bi promjene počele djelovati." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "obično" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "odaberi ..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Gore" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Dole" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Lijevo" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Desno" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Naprijed" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Nazad" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Pomjeri" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Tipka" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Otvori sliku" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Veličina:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Baza:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Širina:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Poništavam operaciju, molim sačekajte" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik web stranica" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Desila se greška prilikom čitanja postavki:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Cigla" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Cigla" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Kula" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Kula" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Kocka" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Kocka" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Ovaj algoritam ne radi ni na jednom modelu.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Ovaj algoritam radi samo za:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "onemogućeno" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "ružno" #: ../pybiklib/settings.py:89 msgid "low" msgstr "slabo" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "srednji" #: ../pybiklib/settings.py:90 msgid "high" msgstr "jako" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "više" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Postavke ne mogu biti zapisane u datoteku: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "O Pybiku" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "O programu" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Prevodioci:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Povratne informacije" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Prevođenje" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licenca" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Igra" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Uredi" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Prikaz" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Pomoć" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Novo slučajno" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "No&vo riješeno" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Izađi" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Odaberi model..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Postavi kao početno stanje" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Resetuj rotaciju" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Izokreni pokrete" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Ponovo učitaj plugine" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Opcije..." #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Alatna traka" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&Statusna traka" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Premotaj" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Idi na prethodnu oznaku (ili na početak) sekvence pokreta" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Prethodna" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Jedan korak unazad" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Stani" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Zaustavi izvršavanje sekvence koraka" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Pokreni" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Prođi kroz sekvencu koraka" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Sljedeća" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Jedan korak unaprijed" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Naprijed" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Pređi na sljedeći dio (ili kraj) sekvence koraka" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Dodaj mjesto" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Označi trenutno mjestu u sekvenci koraka" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Ukloni mjesto" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Ukloni oznaku na trenutnoj lokaciji u sekvenci koraka" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Traka za uređivanje" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Normaliziraj rotacije kocke" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Odaberi model" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Visina:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Dubina:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Postavke" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Grafika" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Brzina animacije:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Osvjetljenje" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Udaljenost slike:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialiasing" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Miš" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Četiri smjera" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Pojednostavljeno,\n" "desni klik obrće potez" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Tipke" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Dodaj" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Ukloni" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Resetuj" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Izgled" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Boja:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Datoteka slike:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Popločano" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mozaik" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Pozadina:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kocka;puzzle;slagalica;zagonetka;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Izazovi" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Riješite slučajno odabranu kocku" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Riješi u 1 potezu" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Riješi u 2 poteza" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Riješi u 3 poteza" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Riješi u 4 poteza" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Riješi u 5 poteza" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Riješi u 6 poteza" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Riješi u 7 poteza" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Riješi u 8 poteza" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Riješi u 9 poteza" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Riješi u 10 poteza" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Način rješavanja" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Gornje ivice" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Gornji uglovi" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Srednji dio" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Lokacija donje ivice" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Orijentacija donje ivice" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Lokacija donjeg ugla" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Orijentacija donjeg ugla" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Poboljšani Spiegel" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Metoda slojeva (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Gornji dio" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Lijepi uzorci" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Trake" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Križanja" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Pržena jaja" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Velika pržena jaja" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 pržena jajeta" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Šahovska tabla" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Ukrštanje" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Cik-cak" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "T-vrijeme" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Kocka u kocki" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Prugasta kocka u kocki" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Šest kvadratnih kuboida" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Pojednostavljeni superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Zelena Mamba" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Pačije stopalo" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteka" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Srednji sloj" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Sprijeda na desno" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Sprijeda na lijevo" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Posljednji sloj" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Zamjena ivica" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Obrtanje ivica" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Zamjena uglova" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Rotiranje uglova" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Rotiranje centra" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×Gore" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Gore i naprijed" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Gore i dole" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Razno" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Nazad bez poleđine" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×Nazad bez poleđine" pybik-1.1/po/el.po0000664000175000017500000007700012157352352014230 0ustar barccbarcc00000000000000# Greek translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-09 15:59+0000\n" "Last-Translator: mara sdr \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:57+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Πατήστε Esc για να φύγετε από τη λειτουργία Επεξεργασίας" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} κίνηση" msgstr[1] "{current} / {total} κινήσεις" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "επιλυμένο" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "μη επιλυμένο" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Συγχαρητήρια, επιλύσατε το γρίφο!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Τρισδιάστατος κύβος του Ρούμπικ" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Το Pybik είναι ένα διαδραστικό, γραφικό παιχνίδι για έναν παίχτη σχετικά με " "τον κύβο που εφηύρε ο Ernő Rubik. Εκτός από τον κύβο, το παιχνίδι μπορεί να " "διαχειριστεί πύργους και τούβλα (μη κυβικούς γρίφους). Το Pybik διαθέτει " "επίσης λύτες, όμορφα μοτίβα και μια ευρεία γκάμα κινήσεων. Μπορείτε να " "χειριστείτε τον κύβο με το ποντίκι ή το πληκτρολόγιο. Μπορείτε επίσης να " "αλλάξετε τα χρώματα ή τις εικόνες στις πλευρές του κύβου." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Το πρόγραμμα αυτό αποτελεί ελεύθερο λογισμικό: μπορείτε να το αναδιανείμετε " "και/ή να το τροποποιήσετε σύμφωνα με τους όρους της άδειας χρήσης GNU " "General Public License, όπως αυτή έχει δημοσιευτεί από το Free Software " "Foundation, είτε την έκδοση 3, ή (βάσει επιλογής σας) οποιαδήποτε " "μεταγενέστερη.\n" "\n" "Αυτό το πρόγραμμα διανέμεται με την ελπίδα ότι θα αποβεί χρήσιμο, αλλά ΧΩΡΙΣ " "ΚΑΜΙΑ ΕΓΓΥΗΣΗ, ούτε καν την εγγύηση που υπονοείται όσον αφορά την " "ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑ ή την ΚΑΤΑΛΛΗΛΟΤΗΤΑ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Για περισσότερες " "λεπτομέρειες ανατρέξτε στην άδεια χρήσης GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Διαβάστε το πλήρες κείμενο της άδειας GNU General " "Public License<|> ή επισκεφθείτε το ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Θα πρέπει να έχετε λάβει αντίγραφο της Γενικής Άδειας Δημόσιας Χρήσης GNU " "(GPL) μαζί με το πρόγραμμα. Εάν όχι, επισκεφθείτε το " "." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Αν βρείτε κάποια σφάλματα (bugs) στο Pybik ή αν έχετε κάποια πρόταση για " "βελτίωση, τότε παρακαλώ υποβάλετε μια <{CONTACT_FILEBUG}|>αναφορά " "σφάλματος<|>. Σε άλλη περίπτωση, μπορείτε να σημειώσετε την αναφορά " "σφάλματος ως \"Wishlist\"." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" "Οι μεταφράσεις βρίσκονται υπό τη διαχείριση της " "μεταφραστικής ομάδας του Launchpad<|>.\n" "\n" " Αν θέλετε να βοηθήσετε στη μετάφραση του Pybik, μπορείτε να το κάνετε μέσω " "διαδικτυακής διεπαφής<|>.\n" "\n" "Διαβάστε περισσότερα: " "\"Μεταφράζοντας στο Launchpad\"<|> " "και " "\"Ξεκινώντας " "τη μετάφραση\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Πατήστε κάποιο πλήκτρο ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Το πρόγραμμα χρειάζεται επανεκκίνηση για να ενεργοποιηθούν οι αλλαγές." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "απλό" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "επιλογή ..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Πάνω" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Κάτω" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Αριστερά" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Δεξιά" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Μπροστά" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Πίσω" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Κίνηση" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Πλήκτρο" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Άνοιγμα εικόνας" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Μέγεθος:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Βάση:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Πλάτος:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Ακύρωση ενέργειας, παρακαλώ περιμένετε" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Ιστοσελίδα του Pybik project" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Προέκυψε ένα σφάλμα κατά την ανάγνωση των ρυθμίσεων:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Τούβλο" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "Τούβλο {0}×{1}×{2}" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Πύργος" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "Πύργος {0}×{1}" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Κύβος" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "Κύβος {0}×{0}×{0}" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Αυτός ο αλγόριθμος δε λειτουργεί για οποιοδήποτε μοντέλο.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Αυτός ο αλγόριθμος λειτουργεί μόνο για:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "απενεργοποιημένο" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "άσχημο" #: ../pybiklib/settings.py:89 msgid "low" msgstr "χαμηλό" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "μέτριο" #: ../pybiklib/settings.py:90 msgid "high" msgstr "υψηλό" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "υψηλότερο" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Αδύνατη η εγγραφή των ρυθμίσεων στο αρχείο: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Σχετικά με το Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Περί" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Μεταφραστές:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Σχόλια" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Μετάφραση" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Άδεια χρήσης" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Παιχνίδι" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Επεξεργασία" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "Προ&βολή" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "Βοή&θεια" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Τυχαίο" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Επι&λυμένο" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "Έ&ξοδος" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "Επιλογή &Μοντέλου …" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Ορισμός ως αρχική κατάσταση" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "Επα&ναφορά Περιστροφής" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Αντιστροφή κινήσεων" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Επαναφόρτωση προσθέτων" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "Π&ροτιμήσεις …" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Γραμμή ερ&γαλείων" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Γραμμή &κατάστασης" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "Πληρο&φορίες …" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Πίσω" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Πήγαινε στο προηγούμενο σημάδι (ή την αρχή) της αλληλουχίας κινήσεων" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Προηγούμενο" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Κάνε ένα βήμα πίσω" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Διακοπή" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Παύση αναπαραγωγής της αλληλουχίας κινήσεων" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Αναπαραγωγή" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Προχώρα μπροστά στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Επόμενο" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Κάνε ένα βήμα μπροστά" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Μπροστά" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Πήγαινε στο επόμενο σημάδι (ή στο τέλος) της αλληλουχίας κινήσεων" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Προσθήκη σημαδιού" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Σημάδεψε την τρέχουσα θέση στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Απομάκρυνση σημαδιού" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Απομάκρυνε το σημάδι από την τρέχουσα θέση στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "Μπάρα &Επεξεργασίας" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Ομαλοποίηση Περιστροφών του Κύβου" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Επιλογή μοντέλου" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Ύψος:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Βάθος:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Προτιμήσεις" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Γραφικά" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Ταχύτητα animation:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Φωτισμός" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Απόσταση καθρέφτη:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Χαμηλότερη εξομάλυνση σημαίνει καλύτερη απόδοση, υψηλότερη εξομάλυνση " "σημαίνει καλύτερη ποιότητα.\n" "Αν τα γραφικά δεν είναι ομαλά, μπορείτε να αλλάξετε αυτή τη ρύθμιση. Στη " "συνέχεια θα πρέπει να επανεκκινήσετε το πρόγραμμα." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Εξομάλυνση (Antialiasing)" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Ποντίκι" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Τέσσερις διευθύνσεις" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Απλοποιημένο,\n" "το δεξί πλήκτρο αντιστρέφει την κίνηση" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Πλήκτρα" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Προσθήκη" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Αφαίρεση" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Επαναφορά" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Εμφάνιση" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Χρώμα:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Αρχείο εικόνας:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Πλακίδια" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Μωσαϊκό" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Φόντο:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" "ρούμπικ;ρουμπικ;κύβος;κυβος;γρίφος;γριφος;kybos;kivos;kyvos;kubos;kuvos;grifo" "s;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Δοκιμασίες" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Επίλυση τυχαίου κύβου" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Επίλυση σε 1 κίνηση" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Επίλυση σε 2 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Επίλυση σε 3 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Επίλυση σε 4 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Επίλυση σε 5 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Επίλυση σε 6 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Επίλυση σε 7 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Επίλυση σε 8 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Επίλυση σε 9 κινήσεις" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Επίλυση σε 10 κινήσεις" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Λύτες" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Επάνω Ακμές" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Επάνω Γωνίες" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Μεσαίο τμήμα" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Τοποθέτηση Κάτω Ακμής" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Προσανατολισμός Κάτω Ακμής" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Τοποθέτηση Κάτω Γωνίας" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Προσανατολισμός Κάτω Γωνίας" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Βελτιωμένο Spiegel" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Μέθοδος Στρώσης (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Επάνω Πλευρά" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Όμορφα Μοτίβα" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Ρίγες" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Σταυρωτά" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Μεγάλα Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Σκακιέρα" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Σταυρός" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Ζιγκ Ζαγκ" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Κύβος μέσα σε Κύβο" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Ριγέ Κύβος μέσα σε Κύβο" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Εύκολο Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Green Mamba" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Duck Feet" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Βιβλιοθήκη" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Μεσαία Στρώση" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Από Μπροστά προς τα Δεξιά" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Από Μπροστά προς τα Αριστερά" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Τελευταία Στρώση" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Αντιμετάθεση Ακμών" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Αντιμετάθεση Γωνιών" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Περιστροφή γωνιών" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Περιστροφή Κέντρου" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×Πάνω" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Πάνω και Μπροστά" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Πάνω και Κάτω" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Διάφορα" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Back without Back" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×Back without Back" pybik-1.1/po/zh_CN.po0000664000175000017500000006076312157352352014641 0ustar barccbarcc00000000000000# Chinese (Simplified) translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 13:51+0000\n" "Last-Translator: Xiaoxing Ye \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "按下Esc键来退出编辑模式" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "第 {current} 步 / 共 {total} 步" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "已解出" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "未解出" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "恭喜,你已经解出了这个难题!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "3D 魔方游戏" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik是一个有着强互动性的单人魔方,由Ernő " "Rubik发明。除了立方体,程序还可以进行塔砖(非立方拼图)游戏。Pybik也有解惑器,漂亮的图案和各种动作的收集器。它可以由鼠标或键盘操控。你还可以改变" "立方体面上的颜色和图像。" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "这是一个免费软件,你可以重打包或者修改它,唯你需遵循自由软件基金会所发布的GNU通用公共许可证第三版或以上。\n" "\n" "这个软件打包的目的在于它十分有用,但是不提供任何担保;也没有适销性或针对特定用途的保证。详情请参阅GNU通用公共许可证。" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "阅读 GNU 通用公共许可协议<|>的全文或者参阅 " "。" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "您应该能够随此软件获得一份 GNU 通用公共许可协议的副本。如果没有,请访问 。" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "如果你在Pybik中发现任何漏洞或者有什么建议,请提交一份 <{CONTACT_FILEBUG}|>漏洞报告<|> " "。如果你是想要提交建议,请将这份报告标志为“Wishlist”。" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "按下任意按钮 ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "需要重启程序来使修改生效。" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "纯色" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "选择" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "上移" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "下移" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "左转" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "右转" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "正面" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "背面" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "移动" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "密钥" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "打开图像" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "大小:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "基准:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "宽度:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "取消操作中,请稍候。" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik项目主页" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "在读取设置时发生错误:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "砖块" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-砖块" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "塔" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-塔" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "立方体" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-立方体" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "这个算法不适用于任何模式。\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "翻译者:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "意见反馈" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "翻译" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "许可协议" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "游戏(&G)" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "编辑(&E)" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "查看(&V)" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "帮助(&H)" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "新游戏(&N)" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "退出(&Q)" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/ms.po0000664000175000017500000006674212157352352014262 0ustar barccbarcc00000000000000# Malay translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 12:23+0000\n" "Last-Translator: abuyop \n" "Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Tekan kekunci Esc untuk keluar dari Mod Sunting" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} gerakan" msgstr[1] "{current} / {total} gerakan" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "diselesaikan" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "tidak selesai" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Tahniah, anda telah berjaya menyelesaikannya!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Permainan kiub Rubrik 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik merupakan teka-teki seorang pemain yang bergrafik dan berinteraktif. " "Ianya direka oleh Ernő Rubik. Selain dari kiub, program ini boleh kendalikan " "bentuk menara dan bata (teka-teki bukan-kiub). Pybik juga mempunyai " "penyelesai, corak yang menarik dan koleksi pelbagai gerakan. Kiub boleh " "dimanipulasi dengan menggunakan tetikus atau papan kekunci. Anda juga boleh " "mengubah warna dan imej permukaan kiub." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Program ini adalah perisian bebas; anda boleh mengedarkannya dan/atau " "mengubahsuainya dibawah terma Pelesenan Awam Am GNU yang diterbitkan oleh " "Free Software Foundation, versi 3, atau (mengikut pilihan anda) mana-mana " "versi terkemudian.\\n\n" "\n" "Perisian ini diedarkan dengan harapan ianya akan berguna, TANPA SEBARANG " "JAMINAN; termasuk juga KESESUAIAN UNTUK DIPASARKAN, JAMINAN KUALITI, atau " "JAMINAN ATAS APA JUA SEBAB. Sila lihat GNU General Public License untuk " "maklumat lanjut." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Baca teks penuh GNU General Public License<|> atau " "rujuk ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Anda seharusnya menerima salinan GNU General Public License bersama program " "ini. Jika tidak, sila layari ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jika anda temui sebarang pepijat di dalam Pybik atau mempunyai cadangan " "untuk penambahbaikan, sila serahkan <{CONTACT_FILEBUG}|>laporan pepijat<|>. " "Bagi kes terkemudian anda boleh tanda laporan pepijat sebagai \"Wishlist\"." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Terjemahan diurus oleh Launchpad translation group<|>.\n" "\n" "Jika anda mahu bantu menterjemah Pybik ke bahasa ibunda anda, anda boleh " "lakukan melalui antaramuka " "sesawang<|>.\n" "\n" "Ketahui lebih lanjut mengenai " "\"Menterjemah menggunakan Launchpad\"<|> dan \"Memulakan terjemahan\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Tekan mana-mana kekunci ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Program perlu dimulakan semula supaya perubahan berkesan." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "biasa" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "pilih ..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Naik" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Turun" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Kiri" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Kanan" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Hadapan" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Undur" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Gerak" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Kekunci" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Buka Imej" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Saiz:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Asas:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Lebar:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Membatalkan operasi, sila tunggu" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Laman sesawang projek Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Ralat berlaku semasa membaca tetapan:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Bata" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "Bata-{0}×{1}×{2}" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Menara" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "Menara-{0}×{1}" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Kiub" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "Kiub-{0}×{0}×{0}" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Algoritma ini tidak berfungsi dengan mana-mana model.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Algoritma ini hanya berfungsi untuk:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "dilumpuhkan" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "buruk" #: ../pybiklib/settings.py:89 msgid "low" msgstr "rendah" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "sederhana" #: ../pybiklib/settings.py:90 msgid "high" msgstr "tinggi" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "lebih tinggi" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Tetapan tidak dapat ditulis ke fail: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Perihal Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Perihal" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Penterjemah:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Maklumbalas" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Terjemah" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Lesen" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "Per&mainan" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Sunting" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Lihat" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Bantuan" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "Rawak &Baru" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Diselesai Ba&ru" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Keluar" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Pilih Model ..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Tetap sebagai Keadaan Awal" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Tetap Semula Putaran" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "S&ongsang Gerakan" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Muat Semula Pemalam" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "K&eutamaan ..." #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Palang Ala&t" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Palang &Status" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Maklumat ..." #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Ulang Semula" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Pergi ke tanda terdahulu (atau permulaan) bagi jujukan gerakan" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Terdahulu" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Buat satu langkah mengundur" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Henti" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Henti menjalankan jujukan gerakan" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Main" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Jalan kehadapan menerusi jujukan gerakan" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Berikutnya" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Buat satu langkah kehadapan" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Maju" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Pergi ke tanda berikutnya (atau hujung) bagi jujukan gerakan" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Tambah Tanda" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Tanda tempat semasa dalam jujukan gerakan" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Buang Tanda" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Buang tanda pada tempat semasa dalam jujukan gerakan" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "S&unting Palang" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Normalkan Putaran Kiub" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Pilih Model" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Tinggi:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Kedalaman:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Keutamaan" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Grafik" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Kelajuan Animasi:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Pencahayaan" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Jarak Cermin:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Antialias lebih rendah bermaksud prestasi lebih baik, lebih tinggi antialias " "bermaksud lebih baik kualitinya.\n" "Jika animasi tidak lancar, anda boleh laras tetapan ini. Selepas itu, anda " "boleh mulakan semula program." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialias" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Tetikus" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Empat arah" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Diringkaskan,\n" "butang kanan songsangkan gerakan" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Kunci" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Tambah" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Buang" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Tetap Semula" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Penampilan" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Warna:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Fail Imej:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Berjubin" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mozek" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Latar Belakang:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kuib;teka-teki;magik;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Cabaran" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Selesaikan kiub rawak" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Selesaikan dalam 1 gerakan" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Selesai dalam 2 gerakan" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Selesai dalam 3 gerakan" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Selesai dalam 4 gerakan" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Selesai dalam 5 gerakan" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Selesai dalam 6 gerakan" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Selesai dalam 7 gerakan" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Selesai dalam 8 gerakan" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Selesai dalam 9 gerakan" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Selesai dalam 10 gerakan" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Penyelesai" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Pingir teratas" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Bucu teratas" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Hirisan tengah" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Tempat dipinggir bawah" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "orientasi pinggir bawah" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Tempat dibucu bawah" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Orientasi bucu bawah" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel dipertingkat" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Kaedah Lapisan (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Hirisan teratas" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Corak cantik" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Jalur" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Silang" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Telur Goreng" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Telur Goreng Besar" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 Telur Goreng" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Papan Catur" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Silang" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Masa-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Kiub dalam Kiub" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Kiub Berjalur dalam Kiub" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Kuboid Petak Enam" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Kalih Super" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Kalih super mudah" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Mamba Hijau" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Kaki Itik" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Pustaka" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Lapisan Tengah" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Hadapan ke Kanan" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Hadapan ke Kiri" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Lapisan Terakhir" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Silih Pinggir" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Kalih Pinggir" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Silih Bucu" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Putar Bucu" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Putar Tengah" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2xNaik" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Naik dan Hadapan" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Naik dan Turun" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Pelbagai" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Belakang tanpa Undur" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2xUndur tanpa Belakang" pybik-1.1/po/ky.po0000664000175000017500000005744712157352352014270 0ustar barccbarcc00000000000000# Kirghiz translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2012-12-14 10:00+0000\n" "Last-Translator: ballpen \n" "Language-Team: Kirghiz \n" "Language: ky\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Клавишаны басыңыз…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "тандоо…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Өйдө" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Ылдый" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Солго" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Оңго" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Алды" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Арты" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Ташуу" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Клавиша" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Сүрөттү ачуу" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Өлчөм:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Туурасы:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik долбоорунун веб-сайты" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Куб" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Pybik жөнүндө" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Программа жөнүндө" #: ../pybiklib/ui/about.py:16 #, fuzzy msgid "Translators:" msgstr "Котормо" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Кербайланыш" #: ../pybiklib/ui/about.py:18 #, fuzzy msgid "Translate" msgstr "Котормо" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Лицензия" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Оюн" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Оңдоо" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Көрүнүш" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Жардам" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Жаңы кокустук" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Чыгуу" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "Моделди &тандоо…" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Тегеретүү түшүрүү" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Плагиндерди жаңыртуу" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Параметрлер…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Аспап панели" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&Абал сабы" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Инфо…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Мурунку" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Токтотуу" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Ойнотуу" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Кийинки" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Алга" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Белгини кошуу" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Белгини өчүрүү" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Оңдоо панели" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Моделди тандоо" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Тереңдик:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Параметрлер" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Графика" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Анимациянын ылдамдыгы:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Жарык" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Күзгүнүн аралыгы:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Тегиздөө" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Чычкан" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Клавишалар" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Кошуу" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Өчүрүү" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Түшүрүү" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Түс:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Сүрөт файлы:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Фон:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/it.po0000664000175000017500000005771212157352352014254 0ustar barccbarcc00000000000000# Italian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 16:05+0000\n" "Last-Translator: Alfio Missaglia \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} mossa" msgstr[1] "{current} / {total} mosse" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "risolto" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "non risolto" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Congratulazioni, hai risolto il rompicapo!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Gioco 3D del cubo di Rubik" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Premi un tasto..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Il programma deve essere riavviato affinché le modifiche abbiano effetto." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Dimensione:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Larghezza:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Sito del progetto Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Si è verificato un errore durante la lettura delle impostazioni:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Questo algoritmo non funziona per alcun modello.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Questo algoritmo funziona solo per:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Le impostazioni non possono essere scritte su file: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Informazioni su Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Informazioni" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Traduttori:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Commenti" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licenza" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Gioco" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Modifica" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Visualizza" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "A&iuto" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Esci" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Seleziona modello..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Reimposta la rotazione" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Inverti i movimenti" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Ricarica i plugin" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferenze..." #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Barra degli s&trumenti" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Barra di &stato" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "I&nformazioni" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Seleziona modello" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Altezza:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profondità:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferenze" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Grafica" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialiasing" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Quattro direzioni" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Tasti" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Aggiugi" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Rimuovi" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Reimposta" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Aspetto" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Colore:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "File immagine:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Sfondo:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Sfide" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Risolvi un cubo casuale" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Risolvi in 1 mossa" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Risolvi in 2 mosse" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Risolvi in 3 mosse" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Risolvi in 4 mosse" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Risolvi in 5 mosse" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Risolvi in 6 mosse" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Risolvi in 7 mosse" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Risolvi in 8 mosse" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Risolvi in 9 mosse" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Risolvi in 10 mosse" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Risolutori" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel migliorato" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/he.po0000664000175000017500000007231612157352352014231 0ustar barccbarcc00000000000000# Hebrew translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-03 14:41+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "יש ללחוץ על מקש ה־Esc כדי לצאת ממצב העריכה" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / מהלך {total}" msgstr[1] "{current} / {total} מהלכים" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "נפתר" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "לא נפתר" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "ברכות, פתרת את הפאזל!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "משחק קוביה הונגרית תלת־ממדי" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik הנו פאזל אינטראקטיבי, גרפי לשחקן יחיד על הקוביה שהמציא ארנו רוביק " "(Ernő Rubik). מלבד הקוביה התכנית יכולה לטפל במגדלים ולבנים (פאזלים שאינם " "בצורת קוביה). ל־Pybik יש גם אפשרויות פתרון, תבניות יפות ואוסף של מהלכים " "מגוונים. ניתן לתפעל את הקוביה עם העכבר או עם המקלדת. ניתן לשנות את הצבעים או " "התמונות על פאות הקוביה." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "תכנית זו הנה תכנה חופשית; ניתן להפיץ אותה תחת תנאי הרישיון הציבורי הכללי של " "גנו כפי שפורסם על ידי קרן התכנה החופשית, בין אם גרסה 3 של הרישיון או כל גרסה " "עדכנית יותר לבחירתך.\n" "\n" "תכנית זו מופצת בתקווה שתביא תועלת אך אינה כוללת כל סוג של אחריות; אפילו לא " "מרומזת לצורכי מסחר או התאמה לצרכים מסוימים. ניתן לעיין ברישיון הציבורי הכללי " "של גנו לקבלת פרטים נוספים." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "ניתן לקרוא את התוכן המלא של הרישיון הציבורי הכללי " "של גנו<|> להיכנס ל־." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "לתכנית זו אמור היה להיות מצורף עותק של הרישיון הציבורי הכללי של GNU; אם לא " "צורף, ניתן לבקר בכתובת ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "אם מצאת תקלות ב־Pybik או שיש לך הצעות לשיפורים נא לשלוח <{CONTACT_FILEBUG}|" ">דיווח על תקלה<|>. במקרה השני שצוין ניתן לסמן את התקלה בתור " "„משאלה“ (Wishlist)" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "התרגומים מנוהלים באמצעות קבוצת התרגום של לאנצ׳פד<|>.\n" "\n" "אם בא לך לסייע בתרגום Pybik לשפתך ניתן לעשות זאת דרך המנשק המקוון<|>.\n" "\n" "ניתן לקרוא עוד על \"תרגום עם " "לאנצ׳פד\"<|> ועל \"כיצד מתחילים לתרגם\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "נא ללחוץ על מקש כלשהו …" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "יש להפעיל את התכנית מחדש כדי שהשינויים יכנסו לתוקף." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "פשוט" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "בחירה …" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "למעלה" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "למטה" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "שמאלה" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "ימינה" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "חזית" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "אחורה" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "הזזה" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "מקש" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "פתיחת תמונה" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "גודל:‏" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "בסיס:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "רוחב:‏" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "הפעולה מבוטלת, נא להמתין" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "אתר המיזם Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "אירעה שגיאה בעת קריאת ההגדרות:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "לבנה" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-לבנה" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "מגדל" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-מגדל" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "קוביה" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-קוביה" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "האלגוריתם הזה לא עובד עם כל דגם.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "האלגוריתם הזה עובד רק עם:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "מנוטרל" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "מכוער" #: ../pybiklib/settings.py:89 msgid "low" msgstr "נמוך" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "רגיל" #: ../pybiklib/settings.py:90 msgid "high" msgstr "גבוה" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "גבוה יותר" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "לא ניתן לכתוב את ההגדרות לקובץ: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "על אודות Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "על אודות" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "מתרגמים:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "משוב" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "תרגום" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "רישיון" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "מ&שחק" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "ע&ריכה" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&תצוגה" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "ע&זרה" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "אקראי &חדש" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "&פתור חדש" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "י&ציאה" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&בחירת דגם …" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "ה&גדרה כמצב ההתחלתי" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "איפוס ה&סיבוב" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "הי&פוך המהלכים" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "טעינת התוספים מחדש" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "ה&עדפות …" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "ס&רגל כלים" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&שורת מצב" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&פרטים …" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "הרצה אחורנית" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "מעבר לנקודת הציון הקודמת (או ההתחלה) של רצף המהלכים" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "אחורה" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "לחזור שלב אחד אחורה" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "עצירה" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "עצירת הרצת רצף המהלכים" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "נגינה" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "הרצת רצף המהלכים בסדר כרונולוגי" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "הבא" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "התקדמות לצעד הבא" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "קדימה" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "מעבר לסימון הבא (או הסוף) של רצף המהלכים" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "הוספת סמן" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "סימון המיקום הנוכחי ברצף המהלכים" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "הסרת סמן" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "הסרת סמן מהמיקום הנוכחי ברצף המהלכים" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "סרגל &עריכה" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "נרמול סיבובי הקוביה" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "בחירת דגם" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "גובה:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "עומק:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "העדפות" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "גרפיקה" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "מהירות ההנפשה:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "תאורה" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "מרחק מהמראה:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "החלקת קצוות ברמה נמוכה משמעה ביצועים טובים יותר, החלקת קצוות ברמה גבוהה " "משמעה איכות גבוהה יותר.\n" "אם ההנפשות אינן חלקות, ניתן לשנות הגדרות אלו. לאחר מכן יהיה עליך להפעיל את " "התכנית מחדש." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "החלקת קצוות" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "עכבר" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "ארבעה כיוונים" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "פשוט,\n" "הלחצן הימני הופך את המהלך" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "מקשים" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "הוספה" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "הסרה" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "איפוס" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "מראה" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "צבע:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "קובץ תמונה:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "פרוש" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "פסיפס" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "רקע:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "הונגרית;רוביק;תצרף;פאזל;פזל;קסם;טריק;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "אתגרים" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "פתירת קוביה אקראית" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "פתירה במהלך אחד" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "פתירה בשני מהלכים" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "פתירה בשלושה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "פתירה בארבעה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "פתירה בחמישה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "פתירה בשישה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "פתירה בשבעה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "פתירה בשמונה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "פתירה בתשעה מהלכים" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "פתירה בעשרה מהלכים" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "פותרים" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "שפיגל" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "קצוות עליונים" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "פינות עליונות" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "חיתוך באמצע" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "מיקום קצה תחתון" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "כיוון קצה תחתון" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "מיקום פינה תחתונה" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "כיוון פינה תחתונה" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "שפיגל משופר" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "שיטת השכבות (לֵיַאן לוֹ)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "חיתוך עליון" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "תבניות יפות" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "רצועות" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "משבצות" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "ביצים מטוגנות" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "ביצים גדולות מטוגנות" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 ביצים מטוגנות" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "לוח שח" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "צלב" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "זיג זג" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "זמן T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "קובייה בתוך קובייה" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "קוביה מפוספסת בתוך קוביה" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "תיבות בעלות שישה ריבועים" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "סופר היפוך" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "סופר היפוך קל" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "ממבה ירוקה" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "אנקונדה" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "רגלי ברווז" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "ספרייה" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "שכבה אמצעית" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "חזית לימין" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "חזית לשמאל" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "שכבה אחרונה" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "החלפת קצוות" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "היפוך קצוות" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "היפוך פינות" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "סיבוב פינות" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "סיבוב המרכז" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×למעלה" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "למעלה ולחזית" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "למעלה ולמטה" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "שונות" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "גב ללא גב" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×גב ללא גב" pybik-1.1/po/zh_TW.po0000664000175000017500000005777712157352352014706 0ustar barccbarcc00000000000000# Chinese (Traditional) translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 13:53+0000\n" "Last-Translator: Po-Chun Huang \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "按下 Esc 鍵離開編輯模式" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} 移動" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "已解決" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "未解決" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "恭喜,您已解決難題!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "3D 魔術方塊遊戲" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "您應能在本程式中取得一份 GNU 通用公共許可證的副本。如果沒有, 請參照 ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "按一個鍵 ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "程式需要重新啟動使變更生效。" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "素面" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "選擇 ..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "上面" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "下面" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "左面" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "右面" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "前面" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "後面" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "移動" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "開啟影像" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "大小:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "基礎:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "寬度:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "正在取消操作,請稍候" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik 專案網站" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "讀取設定時發生錯誤:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "磚塊" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "塔" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "立方體" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "此演算法僅適用於:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "停用" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "劣" #: ../pybiklib/settings.py:89 msgid "low" msgstr "低" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "中" #: ../pybiklib/settings.py:90 msgid "high" msgstr "高" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "更高" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "關於 Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "關於" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "翻譯人員:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "意見回饋" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "翻譯" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "許可證" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "遊戲 (&G)" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "編輯 (&E)" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "檢視 (&V)" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "說明 (&H)" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "離開 (&Q)" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "選擇模型 ... (&S)" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "重新載入擴充套件" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "偏好設定 ... (&P)" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "工具列 (&T)" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "狀態列 (&S)" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "資訊 ... (&I)" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "上一個" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "停止" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "玩" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "下一個" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "編輯列 (&E)" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "選擇模型" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "高度:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "深度:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "偏好設定" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "圖形" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "動畫速度:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "反鋸齒" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "滑鼠" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "新增" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "移除" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "重設" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "外觀" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "色彩:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "影像檔案:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "背景:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;魔術;方塊;立方體;拼圖;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "挑戰" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "解決隨機的立方體" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "用一招解決" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "用兩招解決" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "用三招解決" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "用四招解決" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "用五招解決" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "用六招解決" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "用七招解決" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "用八招解決" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "用九招解決" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "用十招解決" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "之字形" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/id.po0000664000175000017500000005557312157352352014237 0ustar barccbarcc00000000000000# Indonesian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 08:57+0000\n" "Last-Translator: Trisno Pamuji \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Tekan tombol ESC untuk keluar Mode Edit" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "terselesaikan" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "tak terselesaikan" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Selamat, anda berhasil menyelesaikan puzzel!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Game rubik 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/fr.po0000664000175000017500000006615212157352352014245 0ustar barccbarcc00000000000000# French translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-09 12:53+0000\n" "Last-Translator: Célestin Taramarcaz \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:57+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Appuyez sur la touche Échap pour quitter le mode Édition" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} mouvement" msgstr[1] "{current} / {total} mouvements" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "résolu" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "non résolu" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Félicitations, vous avez résolu le casse-tête !" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Jeu de Rubik's cube en 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik est un casse-tête graphique interactif pour un seul joueur basé sur le " "cube inventé par Ernő Rubik. Outre le cube, le programme peut manipuler les " "tours et les briques (casse-tête non cubiques). Pybik possède aussi des " "solveurs, de jolis motifs et une collection de mouvements divers. Le cube " "peut être manipulé à l'aide de la souris ou du clavier. Vous pouvez changer " "les couleurs ou les images des faces du cube." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Ce programme est un logiciel libre : vous pouvez le modifier et/ou le " "redistribuer selon les termes de la licence publique générale GNU, telle que " "publiée par la Free Software Foundation, que ce soit la version 3 de la " "licence ou (à votre choix) n'importe quelle version ultérieure.\n" "\n" "Le programme est distribué en espérant qu'il vous soit utile, mais ce SANS " "AUCUNE GARANTIE ; sans même les garanties implicites de VALEUR COMMERCIALE, " "QUALITÉ, ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la licence publique " "générale GNU pour plus de détails." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Veuillez lire le texte intégral de lalicence " "publique générale GNU<|> ou aller sur ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Vous devriez avoir reçu une copie de la « GNU General Public License » avec " "ce programme. Sinon, voir ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Si vous trouvez des bogues dans Pybik ou si vous souhaitez suggérer une " "amélioration, veuillez déposer un <{CONTACT_FILEBUG}|>rapport de bogue<|>. " "Dans le dernier cas, vous pouvez marquer le rapport de bogue comme " "« Wishlist »." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Appuyez sur une touche…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Ce programme a besoin d'être redémarré pour que les changements prennent " "effet" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "uni" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "sélectionner…" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Haut" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Bas" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Gauche" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Droite" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Avant" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Arrière" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Mouvement" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Ouvrir une image" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Taille :" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Principe de base :" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Largeur :" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Arrêt de l'opération, veuillez patienter" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Site web du projet Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Une erreur s'est produite pendant la lecture des options :\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Tour" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cube" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Cet algorithme ne fonctionne pas pour tous les modèles.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Cet algorithme fonctionne seulement pour :\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "Désactivé" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "moche" #: ../pybiklib/settings.py:89 msgid "low" msgstr "faible" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "moyen" #: ../pybiklib/settings.py:90 msgid "high" msgstr "élevé" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "maximum" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Impossible d'écrire les paramètres dans le fichier : {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "À propos de Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "À propos" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Traducteurs :" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Avis" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Traduire" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licence" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Jeu" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Édition" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Vue" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Aide" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Nouveau aléatoire" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "No&uveau résolu" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Quitter" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Sélectionner le modèle…" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Définir comme l'état initial" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Annuler la rotation" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Inverser les mouvements" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Recharger les greffons" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Préférences…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Barre d’outils" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Ba&rre d'état" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Info…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Reculer" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Revenir à la marque précédente (ou au début) de la séquence de mouvements" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Précedent" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Reculer d'une étape" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Arrêter" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Arrêter la séquence de mouvements" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Lire" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Avancer dans la séquence de mouvements" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Suivant" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Avancer d'une étape" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "En avant" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" "Avancer à la marque suivante (ou à la fin) de la séquence de mouvements" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Ajouter une marque" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Marquer la position actuelle dans la séquence de mouvements" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Supprimer une marque" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" "Supprimer la marque de la position actuelle dans la séquence de mouvements" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Barre d'édition" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Sélectionner le modèle" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Hauteur :" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profondeur :" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Préférences" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Graphique" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Vitesse d'animation :" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Éclairage" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Distance du miroir :" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Un anticrénelage plus faible signifie de meilleures performance tandis qu'un " "anticrénelage plus élevé donne une image plus belle.\n" "Vous pouvez modifier ce paramètre si les animations ne sont pas fluides. " "Vous devrez redémarrer le programme pour que les changements soient " "appliqués." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Anticrénelage" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Souris" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Quatre directions" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplifié,\n" "le bouton droit inverse les mouvements" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Touches" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Ajouter" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Enlever" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Réinitialiser" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Apparence" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Couleur :" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Fichier image :" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaïque" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Arrière plan :" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;casse-tête;magique;jeu;énigme;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Défis" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Résoudre un cube aléatoire" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Résoudre en 1 mouvement" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Résoudre en 2 mouvements" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Résoudre en 3 mouvements" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Résoudre en 4 mouvements" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Résoudre en 5 mouvements" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Résoudre en 6 mouvements" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Résoudre en 7 mouvements" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Résoudre en 8 mouvements" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Résoudre en 9 mouvements" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Résoudre en 10 mouvements" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Solveurs" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Bords supérieurs" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Coins supérieurs" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2x2x2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Tranche supérieure" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Jolis motifs" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Œufs au plat" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Grands œufs au plat" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 œufs au plat" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Heure du T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cube dans un cube" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Superflip facile" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Bibliothèque" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Échanger les coins" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Pivoter les coins" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Pivoter le centre" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Divers" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/en_GB.po0000664000175000017500000006607012157352352014607 0ustar barccbarcc00000000000000# English (United Kingdom) translation of pybik # Copyright (C) 2009-2011 B. Clausius # This file is distributed under the same license as the pybik package. # B. Clausius , 2009. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-01 23:31+0000\n" "Last-Translator: Anthony Harrington \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Press the Esc key to exit Edit Mode" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} move" msgstr[1] "{current} / {total} moves" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "solved" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "not solved" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Congratulations, you have solved the puzzle!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "3D Rubik's cube game" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colours or images on the faces of the cube." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public Licence as published by the Free " "Software Foundation, either version 3 of the Licence, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for " "more details." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Read the full text of the GNU General Public " "Licence<|> or see ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "You should have received a copy of the GNU General Public Licence along with " "this program. If not, see ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Press a key …" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "The program needs to be restarted for the changes to take effect." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "plain" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "select …" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Up" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Down" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Left" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Right" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Front" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Back" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Move" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Key" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Open Image" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Size:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Basis:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Width:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Canceling operation, please wait" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik project website" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "An error occurred while reading the settings:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Brick" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Brick" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Tower" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Tower" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cube" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cube" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "This algorithm does not work for any model.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "This algorithm only works for:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "disabled" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "ugly" #: ../pybiklib/settings.py:89 msgid "low" msgstr "low" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "medium" #: ../pybiklib/settings.py:90 msgid "high" msgstr "high" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "higher" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Settings can not be written to file: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "About Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "About" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Translators:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Feedback" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Translate" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licence" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Game" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Edit" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&View" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Help" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&New Random" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Ne&w Solved" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Quit" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Select Model …" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Set as Initial State" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Reset Rotation" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Invert Moves" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Reload Plug-ins" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferences …" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Toolbar" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&Status Bar" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Rewind" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Go to the previous mark (or the beginning) of the sequence of moves" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Previous" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Make one step backwards" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Stop" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Stop running the sequence of moves" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Play" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Run forward through the sequence of moves" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Next" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Make one step forwards" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Forward" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Go to the next mark (or the end) of the sequence of moves" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Add Mark" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Mark the current place in the sequence of moves" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Remove Mark" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Remove the mark at the current place in the sequence of moves" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Edit Bar" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Normalise Cube Rotations" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Select Model" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Height:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Depth:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferences" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Graphic" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Animation Speed:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Lighting" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Mirror Distance:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. You have to " "restart the program afterwards." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialiasing" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Four directions" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplified,\n" "right button inverts move" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Keys" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Add" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Remove" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Reset" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Appearance" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Colour:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Image File:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Tiled" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaic" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Background:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Challenges" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Solve random cube" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Solve in 1 move" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Solve in 2 moves" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Solve in 3 moves" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Solve in 4 moves" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Solve in 5 moves" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Solve in 6 moves" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Solve in 7 moves" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Solve in 8 moves" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Solve in 9 moves" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Solve in 10 moves" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Solvers" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Top edges" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Top corners" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Middle slice" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Bottom edge place" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Bottom edge orient" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Bottom corner place" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Bottom corner orient" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel improved" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Layer Method (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Top slice" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Pretty patterns" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Stripes" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Criss-Cross" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Fried Eggs" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Big Fried Eggs" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 Fried Eggs" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Chessboard" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Cross" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cube in a Cube" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Striped Cube in a Cube" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Six Square Cuboids" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Superflip easy" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Green Mamba" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Duck Feet" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Library" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Middle Layer" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Front to Right" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Front to Left" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Last Layer" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Swap Edges" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Flip Edges" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Swap Corners" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Rotate Corners" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Rotate Centre" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×Up" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Up and Front" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Up and Down" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Misc" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Back without Back" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×Back without Back" pybik-1.1/po/gl.po0000664000175000017500000006730312157352352014237 0ustar barccbarcc00000000000000# Galician translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-01 22:21+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:57+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Prema a tecla Esc para saír do modo de edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movemento" msgstr[1] "{current} / {total} movementos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "resolto" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "sen resolver" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Parabéns, resolveu o crebacabezas!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Xogo do cubo de Rubik en 3D" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik é un crebacabezas gráfico e interactivo, baseado no cubo inventado " "por Ernő Rubik. Ademais do cubo, o programa pode manexar torres e ladrillos " "(crebacabezas que non son cúbicos). Pybik dispón tamén de solucionadores, " "modelos agradábeis e unha colección de movementos. O cubo pode manipularse " "co rato ou co teclado. Vostede pode cambiarlle as cores ou as imaxes nas " "caras do cubo." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Este programa é software lbre: vostede pode redistribuílo e/pu modificalo " "baixo os termos da Licenza Pública Xeral GNU, tal e como é publicada pola " "Free Software Foundation, na súa versión 3, ou (á súa elección) segundo unha " "versión posterior.\n" "\n" "Este programa distribúese agardando que sexa útil, mais SEN NINGUNHA " "GARANTÍA, incluso sen a garantía expresa de COMERCIALIZACIÓN ou de " "IDONEIDADE PARA UN PROPÓSITO PARTICULAR. Vexa a Licenza Pública Xeral GNU " "para obter máis detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lea o texto completo da Licenza Pública Xeral de " "GNU<|> ou olle ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Debeu recibir unha copia da Licenza pública xeral GNU xunto con este " "programa; en caso contrario, olle ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Se atopa algún erro no Pybik ou ten unha suxestión para melloralo, envíe un " "<{CONTACT_FILEBUG}|>informe de erro<|>. Neste último caso se pode marcar o " "informe de erro como «Wishlist» (Lista de desexos)." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "As traducións son xestionadas polo Grupo de tradución de Launchpad<|>.\n" "\n" "Se quere axudar na tradución do Pybik ao seu idioma pode facelos na interface web<|>.\n" "\n" "Bótelle unha ollada a \"Traducindo " "co Launchpad\"<|> e \"Comezar a traducir\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Prema unha tecla…" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "É necesario reiniciar o programa para que os cambios teñan efecto" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "simple" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "seleccionar..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Arriba" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Abaixo" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Esquerda" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Dereita" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Adiante" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Atrás" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Tecla" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir a imaxe" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Tamaño:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Base:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Largo:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Cancelando a operación, agarde un chisco" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Páxina web do proxecto Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Produciuse un erro ao ler a configuración:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Ladrillo" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-ladrillo" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Torre" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-torre" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cubo" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubo" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Este algoritmo non funciona para calquera modelo.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Este algoritmo só funciona para:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "desactivado" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "pobre" #: ../pybiklib/settings.py:89 msgid "low" msgstr "baixo" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "medio" #: ../pybiklib/settings.py:90 msgid "high" msgstr "alto" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "moi alto" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Non foi posíbel gardar as configuracións no ficheiro: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Sobre o Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Sobre" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Tradutores:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Comentarios" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Tradución" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licenza" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Xogo" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Axuda" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Novo ao chou" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "No&vo resolto" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Saír" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Seleccionar modelo..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Definir como estado inicial" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Restabelecer a rotación" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Inverter os movementos" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Recargar os engadidos" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferencias…" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Barra de &ferramentas" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Barra de &estado" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Información…" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Retroceder" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Ir á marca anterior (ou ao principio) da secuencia de movementos" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Definir un paso atrás" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Deter" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Deter a execución da secuencia de movementos" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Xogar" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Executar cara diante a secuencia de movementos" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Seguinte" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Definir un paso adiante" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Avanzar" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Ir á seguinte marca (ou a fin) da secuencia de movementos" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Engadir marca" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Marcar o lugar actual na secuencia de movementos" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Retirar marca" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Retirar a marcar do lugar actual na secuencia de movementos" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Editar barra" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Homoxeneizar as rotacións do cubo" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Seleccionar modelo" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Alto:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profundidade:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferencias" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Velocidade da animación:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Iluminación" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Distancia do espello:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Un suavizado baixo supón un mellor rendemento,un suavizado alto supón mellor " "calidade.\n" "Se las animacións non son suaves, pode axustar esta configuración. A seguir " "terá que reiniciar o programa." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Suavizado" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Rato" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Catro direccións" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplificado,\n" "o botón dereito inverte o movemento" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Teclas" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Engadir" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Retirar" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Restabelecer" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Aparencia" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Cor:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Ficheiro de imaxe:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Teselado" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Fondo:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubo;quebracabezas;maxico;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Retos" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Resolver o cuno ao chou" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Resolver nun movemento" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Resolver en 2 movementos" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Resolver en 3 movementos" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Resolver en 4 movementos" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Resolver en 5 movementos" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Resolver en 6 movementos" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Resolver en 7 movementos" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Resolver en 8 movementos" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Resolver en 9 movementos" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Resolver en 10 movementos" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Solucionadores" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Marxes superiores" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Cantos superiores" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Banda do medio" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Situar o bordo inferior" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Orientar o bordo inferior" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Situar o canto inferior" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Orientar o canto inferior" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel mellorado" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Método de capa (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Banda superior" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Patróns agradábeis" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Raias" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Entrelazado" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Ovos fritidos" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Ovos fritidos grandes" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 ovos fritidos" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Taboleiro de xadrez" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Cruzamento" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zigzag" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "T-tempo" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cubo nun cubo" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Cubo a raias nun cubo" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Cuboide de seis caras" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Superflip doado" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Pé de pato" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Capa do medio" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Fronte para dereita" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Fronte para esquerda" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Última capa" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Intercambiar os bordos" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Voltear os bordos" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Intercambiar os cantos" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Rotar os cantos" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Rotar o centro" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×arriba" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Arriba e á fronte" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Arriba e abaixo" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Miscelánea" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Atrás sen retorno" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×atrás sen retorno" pybik-1.1/po/de.po0000664000175000017500000006753712157352352014236 0ustar barccbarcc00000000000000# German translation for pybik # Copyright (C) 2009-2012 B. Clausius # This file is distributed under the same license as the pybik package. # B. Clausius , 2009-2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-05-31 23:46+0000\n" "Last-Translator: B Clausius \n" "Language-Team: German\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:57+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Drücken Sie die Esc-Taste, um den Edit-Modus zu beenden" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} Zug" msgstr[1] "{current} / {total} Züge" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "gelöst" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "ungelöst" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Glückwunsch, Sie haben das Puzzle gelöst!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Ein 3D-Zauberwürfelspiel" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik ist ein interaktives, grafisches, Ein-Personen-Puzzle mit dem " "Zauberwürfel, der von Ernő Rubik erfunden wurde. Neben dem Würfel kann das " "Programm auch Türme und Ziegel (nicht-kubische Puzzle) darstellen. Pybik hat " "auch Lösungsalgorithmen, Muster und eine Sammlung verschiedener " "interessanter Züge. Man kann den Würfel mit der Maus oder der Tastatur " "drehen. Man kann die Farben des Würfels ändern und Bilder auf die " "Würfelseiten legen." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der " "GNU General Public License, wie von der Free Software Foundation " "veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 " "der Lizenz oder (nach Ihrer Option) jeder späteren Version.\n" "\n" "Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen " "von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die " "implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN " "BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lesen sie den vollständigen Text der GNU General " "Public License<|> oder siehe ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem " "Programm erhalten haben. Falls nicht, siehe ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Wenn Sie irgendwelche Fehler in Pybik gefunden haben oder einen " "Verbesserungsvorschlag haben, erstellen Sie bitte einen <{CONTACT_FILEBUG}|" ">Fehlerbericht<|>. Im letzteren Fall können Sie den Fehlerbericht als " "„Wishlist“ markieren." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Übersetzungen werden von der Launchpad Übersetzer-Gruppe<|> gemacht.\n" "\n" "Wenn Sie bei der Übersetzung von Pybik helfen wollen, können Sie das über " "die Web-Oberfläche<|> tun.\n" "\n" "Lesen Sie mehr über „Translating " "with Launchpad“<|> und „Starting to translate“<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Drücken Sie eine Taste …" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Das Programm muss neu gestartet werden, damit die Änderungen wirksam werden." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "einfarbig" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "Auswählen …" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Oben" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Unten" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Links" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Rechts" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Vorne" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Hinten" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Zug" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Taste" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Ein Bild öffnen" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Größe:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Basis:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Breite:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Der Vorgang wird abgebrochen, bitte warten" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Pybik Projekt-Webseite" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Beim Lesen der Einstellungen ist ein Fehler aufgetreten:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Ziegel" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Ziegel" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Turm" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Turm" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Würfel" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Würfel" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Dieser Algorithmus funktioniert für kein Modell.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Dieser Algorithmus funktioniert nur für:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "deaktiviert" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "hässlich" #: ../pybiklib/settings.py:89 msgid "low" msgstr "schwach" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "mittel" #: ../pybiklib/settings.py:90 msgid "high" msgstr "stark" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "stärker" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" "Die Einstellungen können nicht in die Datei geschrieben werden: " "{error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Über Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Über" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Übersetzer:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Feedback" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Übersetzen" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Lizenz" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Spiel" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Bearbeiten" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Ansicht" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Hilfe" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Neu, zufällig" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "Ne&u, gelöst" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Beenden" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "Modell aus&wählen …" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "Als &Ausgangszustand festlegen" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Rotation zurücksetzen" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "Züge &invertieren" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Plugins neu laden" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Einstellungen …" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Werkzeugleiste" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&Statusleiste" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Zurückspulen" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Gehe zur vorherigen Markierung (oder dem Anfang) der Zugabfolge" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Zurück" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Einen Schritt zurücknehmen" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Stopp" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Abspielen der Zugabfolge beenden" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Abspielen" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Laufe vorwärts durch die Zugabfolge" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Weiter" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Einen Schritt weiter" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Vorspulen" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Gehe zur nächsten Markierung (oder dem Ende) der Zugabfolge" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Markierung einfügen" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Markiere die aktuelle Stelle in der Zugabfolge" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Markierung entfernen" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Markierung an der aktuellen Stelle in der Zugabfolge entfernen" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Bearbeiten-Leiste" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Würfeldrehungen normalisieren" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Ein Modell wählen" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Höhe:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Tiefe:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Einstellungen" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Grafik" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Animationsgeschwindigkeit:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Beleuchtung" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "Spiegel-Abstand:" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Schwächeres Antialiasing bedeutet eine bessere Leistung, stärkeres " "Antialiasing bedeutet eine bessere Qualität.\n" "Wenn die Animationen nicht flüssig sind, können Sie diese Einstellung " "ändern. Danach müssen Sie das Programm neu starten." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Antialiasing" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Maus" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Vier Richtungen" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Vereinfacht,\n" "die rechte Taste invertiert den Zug" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Tasten" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Hinzufügen" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Entfernen" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Zurücksetzen" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Aussehen" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Farbe:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Bildauswahl:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "Gekachelt" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaik" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Hintergrund:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;würfel;puzzle;zauberwürfel;" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Herausforderungen" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Zufälligen Würfel lösen" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "In einem Zug lösen" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "In 2 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "In 3 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "In 4 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "In 5 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "In 6 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "In 7 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "In 8 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "In 9 Zügen lösen" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "In 10 Zügen lösen" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Lösungen" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Obere Kanten" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Obere Ecken" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Mittlere Schicht" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Untere Kanten platzieren" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Untere Kanten ausrichten" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Untere Ecken platzieren" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Untere Ecken ausrichten" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Spiegel verbessert" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "Schichten-Methode (Leyan Lo)" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Obere Schicht" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Muster" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Streifen" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Kreuz und Quer" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Spiegeleier" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Große Spiegeleier" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 Spiegeleier" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Schachbrett" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Kreuz" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zick Zack" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Würfel im Würfel" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "gestreifter Würfel im Würfel" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Sechs quadratische Quader" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "Superflip einfach" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Grüne Mamba" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Entenfüße" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Sammlung" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Mittlere Schicht" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Vorne nach Rechts" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Vorne nach Links" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Letzte Schicht" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Tausche Kanten" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Kanten kippen" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Ecken vertauschen" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Ecken drehen" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Zentrum drehen" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2×Oben" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "Oben und Vorne" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "Oben und Unten" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Verschiedenes" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "Hinten ohne Hinten" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "2×Hinten ohne Hinten" pybik-1.1/po/POTFILES.in0000644000175000017500000000142212130247774015040 0ustar barccbarcc00000000000000pybiklib/application.py pybiklib/config.py pybiklib/cubestate.py pybiklib/debug.py pybiklib/dialogs.py pybiklib/drawingarea.py pybiklib/gamestate.py pybiklib/glarea.py pybiklib/gldraw.py pybiklib/main.py pybiklib/model.py pybiklib/moves.py pybiklib/plugins.py pybiklib/pybik.py pybiklib/settings.py pybiklib/textures.py pybiklib/ui/about.py pybiklib/ui/main.py pybiklib/ui/model.py pybiklib/ui/preferences.py data/applications/pybik.desktop.in data/plugins/01-challenges.algorithm.py data/plugins/10-spiegel.algorithm.py data/plugins/11-spiegel-improved.algorithm.py data/plugins/12-lbl-leyan.algorithm.py data/plugins/20-2x2x2.algorithm.py data/plugins/80-pretty-patterns.algorithm.py data/plugins/90-library.algorithm.py data/plugins/challenges.py data/plugins/pretty_patterns.py pybik-1.1/po/ru.po0000664000175000017500000006066112157352352014263 0ustar barccbarcc00000000000000# Russian translation for pybik # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 09:25+0000\n" "Last-Translator: Oleg Koptev \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Нажмите на кнопку Esc для выхода из режима редактирования" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ход" msgstr[1] "{current} / {total} хода" msgstr[2] "{current} / {total} ходов" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "решено" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "не решено" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Поздравляю, вы решили головоломку!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Трёхмерный кубик Рубика" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Прочтите полный текст универсальной общественной " "лицензии GNU <|>, либо перейдите на сайт ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Вместе с этой программой вы должны были получить копию GNU General Public " "License. Если нет, обратитесь к ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Перевод программы ведётся группой переводчиков Launchpad<|>.\n" "\n" "Если вы хотите помочь перевести Pybik на другие языки, вы можете сделать это " "через веб-интерфейс<|>.\n" "\n" "Узнайте больше в разделах помощи «Translating with Launchpad»<|> и «Starting to translate»<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Нажмите клавишу..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Для вступления изменений в силу, программу следует перезапустить." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/bn.po0000664000175000017500000005776712157352352014251 0ustar barccbarcc00000000000000# Bengali translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 04:31+0000\n" "Last-Translator: Iftekhar Mohammad \n" "Language-Team: Bengali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "সম্পাদনা মোড থেকে প্রস্থান করতে Esc কী টিপুন" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "মীমাংসিত" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "মীমাংসিত নয়" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "অভিনন্দন, আপনি ধাঁধা সমাধান করেছেন!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "ত্রিমাত্রিক Rubik's কিউব খেলা" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "এই প্রোগ্রামটির সাথে আপনি হয়ত GNU সাধারণ পাবলিক লাইসেন্সের একটি অনুলিপি পেয়ে " "থাকবেন। যদি না পান, দেখুন।" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "একটি কী চাপুন..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "প্রোগ্রাম পরিবর্তন কার্যকর করতে পুনরায় আরম্ভ করা প্রয়োজন।" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "সমান" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "নির্বাচন..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "উপরে" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "নিচে" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "বাম" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "ডান" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "সামনে" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "পেছনে" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "স্থানান্তর" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "কী" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "ছবি খুলুন" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "আকার:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "প্রস্থ:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "ঘনক" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "নিস্ক্রিয় করা হয়েছে" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "নিম্ন" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "মাঝারি / মাধ্যম" #: ../pybiklib/settings.py:90 msgid "high" msgstr "উচ্চ" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "সম্পর্কিত" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "প্রতিক্রিয়া" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "অনুবাদ করুন" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "লাইসেন্স" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/sr.po0000664000175000017500000006105112157352352014253 0ustar barccbarcc00000000000000# Serbian translation for pybik # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the pybik package. # Мирослав Николић , 2012, 2013. msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-02-27 13:26+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} потез" msgstr[1] "{current} / {total} потеза" msgstr[2] "{current} / {total} потеза" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "решено" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "није решено" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Питонова коцка" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Требали сте да примите примерак Гнуове опште јавне лиценце уз овај програм. " "Ако нисте, погледајте ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "обично" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Горе" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Доле" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Лево" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Десно" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Спреда" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Отпозади" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Величина:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "" #: ../pybiklib/ui/main.py:35 #, fuzzy msgid "&Game" msgstr "&Игра" #: ../pybiklib/ui/main.py:36 #, fuzzy msgid "&Edit" msgstr "&Уређивање" #: ../pybiklib/ui/main.py:37 #, fuzzy msgid "&View" msgstr "П&реглед" #: ../pybiklib/ui/main.py:38 #, fuzzy msgid "&Help" msgstr "&Помоћ" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "" #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Идите на следећи знак (или на крај) у низу потеза" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Вратите се један потез уназад" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Зауставите извршавање низа потеза" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Покрените унапред кроз низ потеза" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "Начините један потез унапред" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Идите на претходни знак (или на крај) у низу потеза" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Забележите овај потез у низ потеза" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Уклоните знак на текућем месту у низу потеза" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Поставке" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Осветљавање" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Миш" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Четири смера" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Боја:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Датотека слике:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Позадина:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "Решавачи" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Шпигел" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Горње ивице" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Горњи углови" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Средњи прстен" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "Место доње ивице" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "Оријентир доње ивице" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "Место доњег угла" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "Оријентир доњег угла" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "Побољшани шпигел" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Горњи прстен" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "Занимљиви обрасци" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Траке" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "Унакрсно" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Пржена јаја" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 пржених јаја" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Цик-цак" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "Т време" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/pl.po0000664000175000017500000006457712157352352014262 0ustar barccbarcc00000000000000# Polish translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2013-06-15 11:18+0000\n" "Last-Translator: Szymon Nieznański \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-06-16 04:40+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Wciśnij Esc by opuścić tryb edycji" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ruch" msgstr[1] "{current} / {total} ruchy" msgstr[2] "{current} / {total} ruchów" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "rozwiązane" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "nierozwiązane" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Gratulacje, łamigłówka rozwiązana!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Trójwymiarowe układanie kostki Rubika" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" "Pybik jest interaktywną graficzną łamigłówką dla jednego gracza na podstawie " "kostki wynalezionej przez Ernő Rubika. Oprócz kostki program obsługuje " "również wieże i klocki(niesześcienne łamigłówki). Pybik posiada wbudowane " "mechanizmy rozwiązywania, wzory i różnorodną kolekcję ruchów. Kostkę można " "obracać za pomocą muszy lub klawiatury. Możesz zmieniać kolory i obrazy na " "wszystkich stronach kostki." #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Przeczytaj pełny tekst Powszechnej licencji " "publicznej GNU<|> lub zobacz ." #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Wraz z niniejszym programem dostarczono egzemplarz Powszechnej Licencji " "Publicznej GNU (GNU General Public License); jeśli nie - odwiedź stronę " "." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jeśli znajdziesz jakiekolwiek błędy w programie Pybik lub masz sugestie " "dotyczące jego usprawnienia zgłoś <{CONTACT_FILEBUG}|>raport o błędach<|>. W " "przypadku sugestii oznacz raport jako \"Wishlist\"." #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Wciśnij dowolny klawisz ..." #: ../pybiklib/dialogs.py:263 msgid "The program needs to be restarted for the changes to take effect." msgstr "Aby wprowadzić zmiany niezbędne jest ponowne uruchomienie programu." #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "zwykły" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "wybierz ..." #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "W górę" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "W dół" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "W lewo" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "W prawo" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Przód" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Tył" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Przesuń" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Otwórz obraz" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Rozmiar:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Podstawa" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Szerokość:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Anulowanie operacji, proszę czekać" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "Strona projektu Pybik" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Wystąpił błąd podczas wczytywania ustawień:\n" "{error_message}" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Klocek" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Klocek" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Wieża" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Wieża" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Kostka" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Kostka" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "Ten algorytm nie działa dla żadnego modelu.\n" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "Ten algorytm działa tylko dla:\n" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "wyłączony" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "brzydki" #: ../pybiklib/settings.py:89 msgid "low" msgstr "niski" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "średni" #: ../pybiklib/settings.py:90 msgid "high" msgstr "wysoki" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "wyższy" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Nie można zapisać ustawień do pliku: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "O programie Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "O programie" #: ../pybiklib/ui/about.py:16 msgid "Translators:" msgstr "Tłumacze:" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Opinia" #: ../pybiklib/ui/about.py:18 msgid "Translate" msgstr "Tłumacz" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licencja" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Gra" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Edycja" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Widok" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "&Pomoc" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "&Nowa losowa" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "No&wa rozwiązana" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Wyjdź" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Wybierz model..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "&Ustaw jako stan początkowy" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "&Resetuj obrót" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Odwróć ruchy" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Załaduj wtyczki ponownie" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferencje" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "&Pasek narzędzi" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "&Pasek stanu" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Informacje..." #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "Przewiń do tyłu" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Idź do poprzedniego oznaczenia(lub początku) sekwencji ruchów" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Poprzedni" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "Cofnij się o jeden krok" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Zatrzymaj" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "Zatrzymaj odtwarzanie sekwencji ruchów" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Odtwarzaj" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "Przewiń sekwencję ruchów do przodu" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Następny" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Dalej" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Idź do następnego oznaczenia (lub końca) w sekwencji ruchów" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Dodaj oznaczenie" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Oznacz aktualne miejsce w sekwencji ruchów" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Usuń oznaczenie" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Usuń oznaczenie z aktualnego miejsca w sekwencji ruchów" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Pasek edycji" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "Normalizuj obrót kostki" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Wybierz model" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "Wysokość:" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Głębokość:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Preferencje" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Grafika" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Szybkość animacji:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Oświetlenie" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" "Niższy poziom wygładzania oznacza większą wydajność, z kolei wyższy oznacza " "wyższą jakość.\n" "Jeśli animacje nie są płynne, możesz dostosować to ustawienie. Potem musisz " "uruchomić program ponownie." #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Wygładzanie" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Mysz" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Cztery kierunki" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Uproszczone,\n" "prawy przycisk odwraca ruch." #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Klawisze" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Dodaj" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Usuń" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Przywróć" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Wygląd" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Kolor:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Plik obrazu:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Tło:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik,kostka,puzzle,łamigłówka,magiczna" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Wyzwania" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "Rozwiąż losową kostkę" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Rozwiąż w jednym ruchu" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Rozwiąż w dwóch ruchach" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Rozwiąż w trzech ruchach" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Rozwiąż w 4 ruchach" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Rozwiąż w 5 ruchach" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Rozwiąż w 6 ruchach" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Rozwiąż w 7 ruchach" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Rozwiąż w 8 ruchach" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Rozwiąż w 9 ruchach" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Rozwiąż w 10 ruchach" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Górne krawędzie" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Górne rogi" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "Paski" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "Jajka sadzone" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "Duże jajka sadzone" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "4 jajaka sadzone" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Szachownica" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zygzak" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Kostka w kostce" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "Pasiasta kostka w kostce" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "Sześć sześcianów" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "Zielona mamba" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "Kacza stopa" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteka" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "Środkowa warstwa" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Ostatnia warstwa" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "Zamień krawędzie miejscami" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "Odwróć krawędzie" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "Zamień rogi miejscami" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "Obróć rogi" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "Obróć centrum" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "2xDo góry" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/po/pt_BR.po0000664000175000017500000006100312157352352014632 0ustar barccbarcc00000000000000# Brazilian Portuguese translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2013-06-10 23:50+0200\n" "PO-Revision-Date: 2012-12-14 14:05+0000\n" "Last-Translator: Rafael Neri \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-06-11 05:58+0000\n" "X-Generator: Launchpad (build 16667)\n" #: ../pybiklib/application.py:343 msgid "Press the Esc key to exit Edit Mode" msgstr "Pressione a tecla ESC para sair do Modo edição" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:352 msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:356 ../pybiklib/ui/model.py:16 msgid "solved" msgstr "resolvido" #: ../pybiklib/application.py:356 msgid "not solved" msgstr "não resolvido" #. statusbar text #: ../pybiklib/application.py:359 msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:392 msgid "Congratulations, you have solved the puzzle!" msgstr "Parabéns! Você resolveu o quebra-cabeças!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:34 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:65 ../data/applications/pybik.desktop.in.h:2 msgid "3D Rubik's cube game" msgstr "Jogo 3D do cubo de Rubik" #: ../pybiklib/config.py:67 msgid "" "Pybik is an interactive, graphical, single player puzzle about the cube " "invented by Ernő Rubik. Besides the cube the program can handle towers and " "bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a " "collection of various moves. The cube can be manipulated with the mouse or " "keyboard. You can change the colors or images on the faces of the cube." msgstr "" #: ../pybiklib/config.py:75 msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:87 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:90 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Você deve ter recebido uma cópia da GNU General Public License junto com " "este programa. Se não, veja ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:96 msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:102 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Pressione uma tecla ..." #: ../pybiklib/dialogs.py:263 #, fuzzy msgid "The program needs to be restarted for the changes to take effect." msgstr "" "

O programa precisa ser " "reiniciado para que as alterações tenham efeito.

" #. Only a single color, no picture or pattern #: ../pybiklib/dialogs.py:296 msgid "plain" msgstr "plano" #: ../pybiklib/dialogs.py:301 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:313 msgid "Up" msgstr "Aumentar" #: ../pybiklib/dialogs.py:313 msgid "Down" msgstr "Para baixo" #: ../pybiklib/dialogs.py:313 msgid "Left" msgstr "Esquerda" #: ../pybiklib/dialogs.py:313 msgid "Right" msgstr "Direita" #: ../pybiklib/dialogs.py:313 msgid "Front" msgstr "Frente" #: ../pybiklib/dialogs.py:313 msgid "Back" msgstr "Para trás" #: ../pybiklib/dialogs.py:331 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:332 msgid "Key" msgstr "Tecla" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imagem" #: ../pybiklib/dialogs.py:533 ../pybiklib/ui/model.py:13 msgid "Size:" msgstr "Tamanho:" #: ../pybiklib/dialogs.py:533 msgid "Basis:" msgstr "Base:" #: ../pybiklib/dialogs.py:533 msgid "Width:" msgstr "Largura:" #: ../pybiklib/dialogs.py:562 msgid "Canceling operation, please wait" msgstr "Cancelando a operação, por favor aguarde" #: ../pybiklib/dialogs.py:634 msgid "Pybik project website" msgstr "" #: ../pybiklib/main.py:230 msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/model.py:205 msgid "Brick" msgstr "Tijolo" #: ../pybiklib/model.py:206 msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../pybiklib/model.py:852 msgid "Tower" msgstr "Torre" #: ../pybiklib/model.py:853 msgid "{0}×{1}-Tower" msgstr "" #: ../pybiklib/model.py:867 msgid "Cube" msgstr "Cubo" #: ../pybiklib/model.py:868 msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../pybiklib/plugins.py:92 msgid "This algorithm does not work for any model.\n" msgstr "" #: ../pybiklib/plugins.py:94 ../pybiklib/plugins.py:97 msgid "This algorithm only works for:\n" msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/settings.py:89 msgid "disabled" msgstr "" #: ../pybiklib/settings.py:89 msgid "ugly" msgstr "" #: ../pybiklib/settings.py:89 msgid "low" msgstr "" #: ../pybiklib/settings.py:90 msgid "medium" msgstr "" #: ../pybiklib/settings.py:90 msgid "high" msgstr "" #: ../pybiklib/settings.py:90 msgid "higher" msgstr "" #: ../pybiklib/settings.py:241 msgid "Settings can not be written to file: {error_message}" msgstr "Não foi possível gravar as configurações no arquivo: {error_message}" #: ../pybiklib/ui/about.py:14 msgid "About Pybik" msgstr "Sobre o Pybik" #: ../pybiklib/ui/about.py:15 msgid "About" msgstr "Sobre" #: ../pybiklib/ui/about.py:16 #, fuzzy msgid "Translators:" msgstr "Tradução" #: ../pybiklib/ui/about.py:17 msgid "Feedback" msgstr "Sugestões" #: ../pybiklib/ui/about.py:18 #, fuzzy msgid "Translate" msgstr "Tradução" #: ../pybiklib/ui/about.py:19 msgid "License" msgstr "Licença" #: ../pybiklib/ui/main.py:35 msgid "&Game" msgstr "&Jogo" #: ../pybiklib/ui/main.py:36 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:37 msgid "&View" msgstr "&Visualizar" #: ../pybiklib/ui/main.py:38 msgid "&Help" msgstr "A&juda" #: ../pybiklib/ui/main.py:39 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:40 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:41 msgid "&Quit" msgstr "&Sair" #: ../pybiklib/ui/main.py:42 msgid "&Select Model …" msgstr "&Selecionar modelo ..." #: ../pybiklib/ui/main.py:43 msgid "&Set as Initial State" msgstr "Definir como estado inicial" #: ../pybiklib/ui/main.py:44 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:45 msgid "&Invert Moves" msgstr "&Inverter movimentos" #: ../pybiklib/ui/main.py:46 msgid "Reload Plugins" msgstr "Atualizar plugins" #: ../pybiklib/ui/main.py:47 msgid "&Preferences …" msgstr "&Preferências" #: ../pybiklib/ui/main.py:48 msgid "&Toolbar" msgstr "Barra de ferramen&tas" #: ../pybiklib/ui/main.py:49 msgid "&Status Bar" msgstr "Barra de &status" #: ../pybiklib/ui/main.py:50 msgid "&Info …" msgstr "&Informações ..." #: ../pybiklib/ui/main.py:51 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:52 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:54 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "Stop" msgstr "Parar" #: ../pybiklib/ui/main.py:56 msgid "Stop running the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "Play" msgstr "Reproduzir" #: ../pybiklib/ui/main.py:58 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "Next" msgstr "Próximo" #: ../pybiklib/ui/main.py:60 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "Forward" msgstr "Avançar" #: ../pybiklib/ui/main.py:62 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "Add Mark" msgstr "Adicionar marcador" #: ../pybiklib/ui/main.py:64 msgid "Mark the current place in the sequence of moves" msgstr "Marcar o lugar atual na sequencia de movimentos" #: ../pybiklib/ui/main.py:65 msgid "Remove Mark" msgstr "Remover marcador" #: ../pybiklib/ui/main.py:66 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Edit Bar" msgstr "&Editar barra" #: ../pybiklib/ui/main.py:68 msgid "Normalize Cube Rotations" msgstr "" #: ../pybiklib/ui/model.py:12 msgid "Select Model" msgstr "Selecionar modelo" #: ../pybiklib/ui/model.py:14 msgid "Height:" msgstr "" #: ../pybiklib/ui/model.py:15 msgid "Depth:" msgstr "Profundidade:" #: ../pybiklib/ui/preferences.py:27 msgid "Preferences" msgstr "Perferências" #: ../pybiklib/ui/preferences.py:28 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:29 msgid "Animation Speed:" msgstr "Velocidade da animação:" #: ../pybiklib/ui/preferences.py:30 msgid "Lighting" msgstr "Iluminação" #: ../pybiklib/ui/preferences.py:31 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:32 msgid "" "Lower antialiasing means better performance, higher antialiasing means " "better quality.\n" "If animations are not smooth, you can adjust this setting. Afterwards you " "have to restart the program." msgstr "" #: ../pybiklib/ui/preferences.py:33 msgid "Antialiasing" msgstr "Anti-serrilhamento" #: ../pybiklib/ui/preferences.py:34 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:35 msgid "Four directions" msgstr "Quatro direções" #: ../pybiklib/ui/preferences.py:36 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:37 msgid "Keys" msgstr "Chaves" #: ../pybiklib/ui/preferences.py:38 ../pybiklib/ui/preferences.py:39 msgid "Add" msgstr "Adicionar" #: ../pybiklib/ui/preferences.py:40 ../pybiklib/ui/preferences.py:41 msgid "Remove" msgstr "Remover" #: ../pybiklib/ui/preferences.py:42 ../pybiklib/ui/preferences.py:43 msgid "Reset" msgstr "Reiniciar" #: ../pybiklib/ui/preferences.py:44 msgid "Appearance" msgstr "Aparência" #: ../pybiklib/ui/preferences.py:45 msgid "Color:" msgstr "Cor:" #: ../pybiklib/ui/preferences.py:46 msgid "Image File:" msgstr "Arquivo de imagem:" #: ../pybiklib/ui/preferences.py:47 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:48 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:49 msgid "Background:" msgstr "Plano de fundo:" #. Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:19 #: ../data/plugins/01-challenges.algorithm.py:22 #: ../data/plugins/01-challenges.algorithm.py:25 #: ../data/plugins/01-challenges.algorithm.py:28 #: ../data/plugins/01-challenges.algorithm.py:31 #: ../data/plugins/01-challenges.algorithm.py:34 #: ../data/plugins/01-challenges.algorithm.py:37 #: ../data/plugins/01-challenges.algorithm.py:40 #: ../data/plugins/01-challenges.algorithm.py:43 #: ../data/plugins/01-challenges.algorithm.py:46 #: ../data/plugins/01-challenges.algorithm.py:49 msgid "Challenges" msgstr "Desafios" #: ../data/plugins/01-challenges.algorithm.py:20 msgid "Solve random cube" msgstr "" #: ../data/plugins/01-challenges.algorithm.py:23 msgid "Solve in 1 move" msgstr "Resolver em 1 movimento" #: ../data/plugins/01-challenges.algorithm.py:26 msgid "Solve in 2 moves" msgstr "Resolver em 2 movimentos" #: ../data/plugins/01-challenges.algorithm.py:29 msgid "Solve in 3 moves" msgstr "Resolver em 3 movimentos" #: ../data/plugins/01-challenges.algorithm.py:32 msgid "Solve in 4 moves" msgstr "Resolver em 4 movimentos" #: ../data/plugins/01-challenges.algorithm.py:35 msgid "Solve in 5 moves" msgstr "Resolver em 5 movimentos" #: ../data/plugins/01-challenges.algorithm.py:38 msgid "Solve in 6 moves" msgstr "Resolver em 6 movimentos" #: ../data/plugins/01-challenges.algorithm.py:41 msgid "Solve in 7 moves" msgstr "Resolver em 7 movimentos" #: ../data/plugins/01-challenges.algorithm.py:44 msgid "Solve in 8 moves" msgstr "Resolver em 8 movimentos" #: ../data/plugins/01-challenges.algorithm.py:47 msgid "Solve in 9 moves" msgstr "Resolver em 9 movimentos" #: ../data/plugins/01-challenges.algorithm.py:50 msgid "Solve in 10 moves" msgstr "Resolver em 10 movimentos" #: ../data/plugins/10-spiegel.algorithm.py:35 #: ../data/plugins/10-spiegel.algorithm.py:38 #: ../data/plugins/10-spiegel.algorithm.py:67 #: ../data/plugins/10-spiegel.algorithm.py:88 #: ../data/plugins/10-spiegel.algorithm.py:103 #: ../data/plugins/10-spiegel.algorithm.py:116 #: ../data/plugins/10-spiegel.algorithm.py:133 #: ../data/plugins/10-spiegel.algorithm.py:144 #: ../data/plugins/11-spiegel-improved.algorithm.py:35 #: ../data/plugins/11-spiegel-improved.algorithm.py:38 #: ../data/plugins/11-spiegel-improved.algorithm.py:83 #: ../data/plugins/11-spiegel-improved.algorithm.py:122 #: ../data/plugins/11-spiegel-improved.algorithm.py:154 #: ../data/plugins/11-spiegel-improved.algorithm.py:180 #: ../data/plugins/11-spiegel-improved.algorithm.py:198 #: ../data/plugins/11-spiegel-improved.algorithm.py:212 #: ../data/plugins/12-lbl-leyan.algorithm.py:22 #: ../data/plugins/12-lbl-leyan.algorithm.py:25 #: ../data/plugins/12-lbl-leyan.algorithm.py:54 #: ../data/plugins/12-lbl-leyan.algorithm.py:75 #: ../data/plugins/12-lbl-leyan.algorithm.py:91 #: ../data/plugins/12-lbl-leyan.algorithm.py:108 #: ../data/plugins/12-lbl-leyan.algorithm.py:130 #: ../data/plugins/12-lbl-leyan.algorithm.py:171 #: ../data/plugins/20-2x2x2.algorithm.py:19 #: ../data/plugins/20-2x2x2.algorithm.py:22 #: ../data/plugins/20-2x2x2.algorithm.py:41 #: ../data/plugins/20-2x2x2.algorithm.py:61 msgid "Solvers" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/10-spiegel.algorithm.py:37 #: ../data/plugins/10-spiegel.algorithm.py:39 #: ../data/plugins/10-spiegel.algorithm.py:68 #: ../data/plugins/10-spiegel.algorithm.py:89 #: ../data/plugins/10-spiegel.algorithm.py:104 #: ../data/plugins/10-spiegel.algorithm.py:117 #: ../data/plugins/10-spiegel.algorithm.py:134 #: ../data/plugins/10-spiegel.algorithm.py:145 msgid "Spiegel" msgstr "Spiegel" #: ../data/plugins/10-spiegel.algorithm.py:40 #: ../data/plugins/11-spiegel-improved.algorithm.py:40 #: ../data/plugins/12-lbl-leyan.algorithm.py:27 msgid "Top edges" msgstr "Margens superiores" #: ../data/plugins/10-spiegel.algorithm.py:69 #: ../data/plugins/11-spiegel-improved.algorithm.py:85 #: ../data/plugins/12-lbl-leyan.algorithm.py:56 msgid "Top corners" msgstr "Cantos superiores" #: ../data/plugins/10-spiegel.algorithm.py:90 #: ../data/plugins/11-spiegel-improved.algorithm.py:124 #: ../data/plugins/12-lbl-leyan.algorithm.py:77 msgid "Middle slice" msgstr "Fatia média" #: ../data/plugins/10-spiegel.algorithm.py:105 #: ../data/plugins/11-spiegel-improved.algorithm.py:156 #: ../data/plugins/12-lbl-leyan.algorithm.py:173 msgid "Bottom edge place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:118 #: ../data/plugins/11-spiegel-improved.algorithm.py:182 #: ../data/plugins/12-lbl-leyan.algorithm.py:93 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:135 #: ../data/plugins/11-spiegel-improved.algorithm.py:200 #: ../data/plugins/12-lbl-leyan.algorithm.py:110 #: ../data/plugins/20-2x2x2.algorithm.py:43 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-spiegel.algorithm.py:146 #: ../data/plugins/11-spiegel-improved.algorithm.py:214 #: ../data/plugins/12-lbl-leyan.algorithm.py:132 #: ../data/plugins/20-2x2x2.algorithm.py:63 msgid "Bottom corner orient" msgstr "" #. Spiegel is the name of a solution method #: ../data/plugins/11-spiegel-improved.algorithm.py:37 #: ../data/plugins/11-spiegel-improved.algorithm.py:39 #: ../data/plugins/11-spiegel-improved.algorithm.py:84 #: ../data/plugins/11-spiegel-improved.algorithm.py:123 #: ../data/plugins/11-spiegel-improved.algorithm.py:155 #: ../data/plugins/11-spiegel-improved.algorithm.py:181 #: ../data/plugins/11-spiegel-improved.algorithm.py:199 #: ../data/plugins/11-spiegel-improved.algorithm.py:213 msgid "Spiegel improved" msgstr "" #. Leyan Lo is the inventor of the solution method #: ../data/plugins/12-lbl-leyan.algorithm.py:24 #: ../data/plugins/12-lbl-leyan.algorithm.py:26 #: ../data/plugins/12-lbl-leyan.algorithm.py:55 #: ../data/plugins/12-lbl-leyan.algorithm.py:76 #: ../data/plugins/12-lbl-leyan.algorithm.py:92 #: ../data/plugins/12-lbl-leyan.algorithm.py:109 #: ../data/plugins/12-lbl-leyan.algorithm.py:131 #: ../data/plugins/12-lbl-leyan.algorithm.py:172 msgid "Layer Method (Leyan Lo)" msgstr "" #: ../data/plugins/20-2x2x2.algorithm.py:20 #: ../data/plugins/20-2x2x2.algorithm.py:23 #: ../data/plugins/20-2x2x2.algorithm.py:42 #: ../data/plugins/20-2x2x2.algorithm.py:62 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.algorithm.py:24 msgid "Top slice" msgstr "Fatia superior" #: ../data/plugins/80-pretty-patterns.algorithm.py:18 #: ../data/plugins/80-pretty-patterns.algorithm.py:22 #: ../data/plugins/80-pretty-patterns.algorithm.py:26 #: ../data/plugins/80-pretty-patterns.algorithm.py:30 #: ../data/plugins/80-pretty-patterns.algorithm.py:34 #: ../data/plugins/80-pretty-patterns.algorithm.py:39 #: ../data/plugins/80-pretty-patterns.algorithm.py:43 #: ../data/plugins/80-pretty-patterns.algorithm.py:48 #: ../data/plugins/80-pretty-patterns.algorithm.py:52 #: ../data/plugins/80-pretty-patterns.algorithm.py:56 #: ../data/plugins/80-pretty-patterns.algorithm.py:60 #: ../data/plugins/80-pretty-patterns.algorithm.py:64 #: ../data/plugins/80-pretty-patterns.algorithm.py:68 #: ../data/plugins/80-pretty-patterns.algorithm.py:74 #: ../data/plugins/80-pretty-patterns.algorithm.py:78 #: ../data/plugins/80-pretty-patterns.algorithm.py:83 #: ../data/plugins/80-pretty-patterns.algorithm.py:87 #: ../data/plugins/80-pretty-patterns.algorithm.py:91 #: ../data/plugins/80-pretty-patterns.algorithm.py:95 #: ../data/plugins/80-pretty-patterns.algorithm.py:99 #: ../data/plugins/80-pretty-patterns.algorithm.py:103 #: ../data/plugins/80-pretty-patterns.algorithm.py:108 #: ../data/plugins/80-pretty-patterns.algorithm.py:112 #: ../data/plugins/80-pretty-patterns.algorithm.py:116 #: ../data/plugins/80-pretty-patterns.algorithm.py:120 #: ../data/plugins/80-pretty-patterns.algorithm.py:125 #: ../data/plugins/80-pretty-patterns.algorithm.py:129 #: ../data/plugins/80-pretty-patterns.algorithm.py:133 #: ../data/plugins/80-pretty-patterns.algorithm.py:137 #: ../data/plugins/80-pretty-patterns.algorithm.py:141 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:19 #: ../data/plugins/80-pretty-patterns.algorithm.py:23 #: ../data/plugins/80-pretty-patterns.algorithm.py:27 #: ../data/plugins/80-pretty-patterns.algorithm.py:31 #: ../data/plugins/80-pretty-patterns.algorithm.py:35 #: ../data/plugins/80-pretty-patterns.algorithm.py:40 #: ../data/plugins/80-pretty-patterns.algorithm.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:49 #: ../data/plugins/80-pretty-patterns.algorithm.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:65 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:69 msgid "Chessboard" msgstr "Tabuleiro de xadrez" #: ../data/plugins/80-pretty-patterns.algorithm.py:75 msgid "Cross" msgstr "Cruz" #: ../data/plugins/80-pretty-patterns.algorithm.py:79 msgid "Zig Zag" msgstr "Zigue-zague" #. T is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:85 #: ../data/plugins/80-pretty-patterns.algorithm.py:88 #: ../data/plugins/80-pretty-patterns.algorithm.py:92 #: ../data/plugins/80-pretty-patterns.algorithm.py:96 #: ../data/plugins/80-pretty-patterns.algorithm.py:100 #: ../data/plugins/80-pretty-patterns.algorithm.py:104 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.algorithm.py:110 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.algorithm.py:113 msgid "Cube in a Cube" msgstr "Cubo em um cubo" #: ../data/plugins/80-pretty-patterns.algorithm.py:117 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:121 msgid "Six Square Cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.algorithm.py:127 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:130 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:134 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.algorithm.py:138 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.algorithm.py:142 msgid "Duck Feet" msgstr "" #: ../data/plugins/90-library.algorithm.py:20 #: ../data/plugins/90-library.algorithm.py:23 #: ../data/plugins/90-library.algorithm.py:26 #: ../data/plugins/90-library.algorithm.py:29 #: ../data/plugins/90-library.algorithm.py:32 #: ../data/plugins/90-library.algorithm.py:35 #: ../data/plugins/90-library.algorithm.py:38 #: ../data/plugins/90-library.algorithm.py:41 #: ../data/plugins/90-library.algorithm.py:44 #: ../data/plugins/90-library.algorithm.py:47 #: ../data/plugins/90-library.algorithm.py:50 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.algorithm.py:21 #: ../data/plugins/90-library.algorithm.py:24 msgid "Middle Layer" msgstr "" #: ../data/plugins/90-library.algorithm.py:22 msgid "Front to Right" msgstr "Frente para Direita" #: ../data/plugins/90-library.algorithm.py:25 msgid "Front to Left" msgstr "Frente para Esquerda" #: ../data/plugins/90-library.algorithm.py:27 #: ../data/plugins/90-library.algorithm.py:30 #: ../data/plugins/90-library.algorithm.py:33 #: ../data/plugins/90-library.algorithm.py:36 msgid "Last Layer" msgstr "Última camada" #: ../data/plugins/90-library.algorithm.py:28 msgid "Swap Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:31 msgid "Flip Edges" msgstr "" #: ../data/plugins/90-library.algorithm.py:34 msgid "Swap Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:37 msgid "Rotate Corners" msgstr "" #: ../data/plugins/90-library.algorithm.py:39 #: ../data/plugins/90-library.algorithm.py:42 #: ../data/plugins/90-library.algorithm.py:45 msgid "Rotate Center" msgstr "" #: ../data/plugins/90-library.algorithm.py:40 msgid "2×Up" msgstr "" #: ../data/plugins/90-library.algorithm.py:43 msgid "Up and Front" msgstr "" #: ../data/plugins/90-library.algorithm.py:46 msgid "Up and Down" msgstr "" #: ../data/plugins/90-library.algorithm.py:48 #: ../data/plugins/90-library.algorithm.py:51 msgid "Misc" msgstr "Diversos" #: ../data/plugins/90-library.algorithm.py:49 msgid "Back without Back" msgstr "" #: ../data/plugins/90-library.algorithm.py:52 msgid "2×Back without Back" msgstr "" pybik-1.1/copyright0000664000175000017500000000521712157424343014606 0ustar barccbarcc00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: pybik Upstream-Contact: B. Clausius Source: https://launchpad.net/pybik/+download Comment: Originally this package was derived from GNUbik 2.3 and ported from C to Python. Authors of GNUbik: * John Mark Darrington is the main author and maintainer of GNUbik. * Dale Mellor Files: * Copyright: 2009-2013 B. Clausius License: GPL-3+ Files: data/ui/images/BEAMED?EIGHTH?NOTES.png data/ui/images/ATOM?SYMBOL.png data/ui/images/SNOWFLAKE.png data/ui/images/WHITE?SUN?WITH?RAYS.png Copyright: 2002-2010 Free Software Foundation 2012 B. Clausius License: GPL-3+ Comment: Images created from font FreeSerif: U+266B BEAMED EIGHTH NOTES U+269B ATOM SYMBOL U+2744 SNOWFLAKE Image created from font FreeMono: U+263C WHITE SUN WITH RAYS Files: data/ui/images/SHAMROCK.png data/ui/images/SKULL?AND?CROSSBONES.png data/ui/images/PEACE?SYMBOL.png data/ui/images/YIN?YANG.png data/ui/images/BLACK?SMILING?FACE.png data/ui/images/WHITE?SMILING?FACE.png Copyright: DejaVu Authors 2012 B. Clausius License: public-domain The DejaVu fonts are a font family based on the Vera Fonts. License of DejaVu (http://dejavu-fonts.org/wiki/Main_Page): Fonts are © Bitstream (…). DejaVu changes are in public domain. …. Glyphs imported from Arev fonts are © Tavmjung Bah (…). . The used symbols where added in version 2.4 as stated by DejaVu in the file status.txt and therefore are in the public domain. Comment: Images were created from font DejaVu-Sans-Oblique: U+2618 SHAMROCK U+2620 SKULL AND CROSSBONES U+262E PEACE SYMBOL U+262F YIN YANG U+263A WHITE SMILING FACE U+263B BLACK SMILING FACE License: GPL-3+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . The full text of the GPL is distributed in the original source archive in the file COPYING. pybik-1.1/README0000664000175000017500000000401012157424343013521 0ustar barccbarcc00000000000000 About Pybik 1.1 =============== Pybik is an interactive, graphical, single player puzzle about the cube invented by Ernő Rubik. Besides the cube the program can handle towers and bricks (non cubic puzzles). Pybik also has solvers, pretty patterns and a collection of various moves. The cube can be manipulated with the mouse or keyboard. You can change the colors or images on the faces of the cube. Author: B. Clausius License: GPL-3+ Project page: Installation ============ If Pybik is available for your distribution, you should install Pybik with a package manager. Otherwise see the file INSTALL for installation instructions. Feedback ======== If you find any bugs in Pybik or have a suggestion for an improvement then please submit a bug report [1]. In the latter case you can mark the bug report as "Wishlist". [1] Translation =========== Translations are managed by the Launchpad translation group [1]. If you want help to translate Pybik to your language you can do it through the web interface [2]. Read more about "Translating with Launchpad" [3] and "Starting to translate" [4]. [1] [2] [3] [4] License ======= This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . pybik-1.1/build_local.sh0000755000175000017500000000014112145350620015441 0ustar barccbarcc00000000000000#!/bin/sh set -e ./setup.py build --inplace --parallel=auto "$@" ./tools/create_docs.py README pybik-1.1/pybiktest/0000775000175000017500000000000012157424343014664 5ustar barccbarcc00000000000000pybik-1.1/pybiktest/testrunner.py0000664000175000017500000010312512157302545017450 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os import random from collections import namedtuple, OrderedDict import tempfile from PyQt4.QtCore import Qt, QTimer from PyQt4.QtGui import QAction from PyQt4.QtTest import QTest from . import utils from pybiklib.settings import settings class Logger (object): logfilename = 'pybiktest/test.log' def __init__(self): self.lineno = None self.result = None self.logfile = None def open(self, log): if not log: self.log('Logfile disabled\n') return try: self.logfile = open(self.logfilename, 'wt', encoding='utf-8') self.logf('Use logfile: {}\n', self.logfilename) except IOError as e: self.logfile = None self.log('Logfile disabled:', e) def close(self): if self.logfile is not None: self.logfile.close() self.logfile = None def log(self, *args, **kwargs): if self.lineno is not None: args = ('line {}:'.format(self.lineno),) + args print(*args, **kwargs) if self.logfile is not None: kwargs['file'] = self.logfile print(*args, **kwargs) def logf(self, format, *args, **kwargs): self.log(format.format(*args), **kwargs) def error(self, message, *args, **kwargs): kwargs['file'] = sys.stderr self.log(message, *args, **kwargs) message = message.rstrip(':') if message not in self.result: self.result[message] = 1 else: self.result[message] += 1 def errorf(self, message, format, *args, **kwargs): self.error(message, format.format(*args), **kwargs) logger = Logger() log = logger.log logf = logger.logf log_error = logger.error logf_error = logger.errorf class NamedObject (object): # pylint: disable=R0903 def __init__(self, name): self.name = name def __repr__(self): return self.name matchall = NamedObject('matchall') nomatch = NamedObject('nomatch') def mkState(fields): _State = namedtuple('_State', fields) class State(_State): # pylint: disable=W0232 def tostr(self, other=None): def field_tostr(i): if self[i] is matchall: return '' elif other is None or self[i] != other[i]: return '{}={!r}, '.format(self.fields[i], self[i]) else: return ' ' * (len(self.fields[i]) + len(repr(self[i])) + 3) return ''.join([field_tostr(i) for i in range(len(self))]).rstrip(', ') fields = _State._fields asdict = _State._asdict replace = _State._replace State.default = State(**{f: matchall for f in State.fields}) return State class StateInfo (object): # pylint: disable=R0903 def __init__(self): self.untested_tnames = None self.islimit = None def __str__(self): return 'StateInfo: untested_t: #{}, islimit: {}'.format( len(self.untested_tnames, self.islimit)) class StatesInfo (dict): def __init__(self): dict.__init__(self) def istested(self, *args): if len(args) == 0: for s in self.values(): if s.untested_tnames and s.islimit: return False return True elif len(args) == 1: state = args[0] return state in self and not (self[state].untested_tnames and self[state].islimit) else: raise TypeError('istested expected at most 1 argument, got %s' % len(args)) def reset(self, untested_tnames): for v in self.values(): v.untested_tnames = untested_tnames[:] def get_unreached(self): return [s for s, si in self.items() if si.untested_tnames and si.islimit] class Transition (object): def __init__(self, func=None, exprs=None, states=None): self.func = func self.exprs = {} if exprs is None else exprs self.states = {} if states is None else states class Transitions (dict): def __init__(self): self.limits = [] self.stateinfos = StatesInfo() self.path_to_untested = [] def islimit(self, state): state = state.asdict() for limit in self.limits: try: if not eval(limit, state): return False except Exception as e: # pylint: disable=W0703 log_error('error in limit:', e) return True def reset(self): self.stateinfos.reset(list(self.keys())) def add_stateinfo(self, state): try: return self.stateinfos[state] except KeyError: stateinfo = dict.setdefault(self.stateinfos, state, StateInfo()) stateinfo.untested_tnames = list(self.keys()) stateinfo.islimit = self.islimit(state) return stateinfo def update_transition(self, transition, state, target): transition.states[state] = target self.add_stateinfo(state) if target is not None and target not in transition.states: transition.states[target] = None self.add_stateinfo(target) @staticmethod def _path_to_list(path): result = [] while path is not None: item, path = path result.append(item) return result def get_path_to_untested(self, state): paths = [[(state, None), None]] reachable = set() while paths: path = paths.pop(0) state = path[0][0] stateinfo = self.stateinfos[state] reachable.add(state) if stateinfo.islimit and stateinfo.untested_tnames: return self._path_to_list(path) for name, transition in self.items(): target = transition.states[state] if not stateinfo.islimit or self.stateinfos[target].islimit: if target not in reachable: paths.append([(target, name), path]) return None def get_random_transition(self, state): if not self.path_to_untested: stateinfo = self.stateinfos[state] while stateinfo.untested_tnames: name = stateinfo.untested_tnames.pop(random.randrange(len(stateinfo.untested_tnames))) states = self[name].states target = states.get(state, None) if target is None or self.stateinfos[target].islimit: return name self.path_to_untested = self.get_path_to_untested(state) if self.path_to_untested is None: raise Quit('all reachable states tested') target, name = self.path_to_untested.pop() assert name is None assert target == state target, name = self.path_to_untested.pop() assert name is not None return name class Result (OrderedDict): __slots__ = () def __init__(self): OrderedDict.__init__(self) self._dict = dict(visited=0, states=0, transitions=0) errors = property(lambda self: sum(self.values())) def __str__(self): summary = '\n visited: {0.visited}, states: {0.states}, transitions: {0.transitions}'.format(self) errors = self.errors if errors: summary += '\n errors: {}'.format(errors) for k, v in self.items(): summary += '\n {} {}'.format(v, k) return summary def __getattr__(self, key): if key.startswith('_'): raise AttributeError() return self._dict[key] def __setattr__(self, key, value): if key.startswith('_'): OrderedDict.__setattr__(self, key, value) else: self._dict[key] = value def __iadd__(self, other): for k, v in other._dict.items(): # pylint: disable=W0212 self._dict[k] += v for k, v in other.items(): self[k] = self.get(k, 0) + v return self class Quit (Exception): pass # pylint: disable=C0321 class TestRunner (object): _instance = None lineno = None def __init__(self, testdata_dir, test, test_args): assert self._instance is None self.current_test = test self.write_mode = 'no' self.log_widgets = False for a in test_args: if a.startswith('write-n'): self.write_mode = 'no' elif a.startswith('write-y'): self.write_mode = 'yes' elif a.startswith('write-e'): self.write_mode = 'error' elif a == 'log-widgets': self.log_widgets = True self.current_testfile = os.path.join(testdata_dir, test) self.oneway_transitions = [] self.transitions = Transitions() self.widgets = {} self.conditions = [] self.known_widget_functions = [] self.field_functions = [] def run(self, main_window): self.main_window = main_window self.running = True settings.draw.speed = 120 QTimer.singleShot(0, self.loop) def isvalid(self, state): state = state.asdict() for condition in self.conditions[:]: try: if not eval(condition, state): return False except Exception as e: # pylint: disable=W0703 log_error('error in condition:', e) self.conditions.remove(condition) return True def read_test(self): def parse_fields(line): fields = OrderedDict() if line != 'Fields:\n': for f in sorted(utils.field_functions.keys()): fields[f] = [] return parse_conditions, line, [fields] return parse_field, None, [fields] def parse_field(line, fields): if not line.startswith(' '): return parse_conditions, line, [fields] field, value = line.split('=', 1) field = field.strip() if field not in list(utils.field_functions.keys()): log_error('unknown field:', field) else: value = eval(value, {}) fields[field] = value return parse_field, None, [fields] def parse_conditions(line, fields): self.State = mkState(fields) self.fields = fields if line != 'Conditions:\n': return parse_limits, line, [] return parse_condition, None, [] def parse_condition(line): if not line.startswith(' '): return parse_limits, line, [] self.conditions.append(line.strip()) return parse_condition, None, [] def parse_limits(line): if line != 'Limits:\n': return parse_initialstate, line, [] return parse_limit, None, [] def parse_limit(line): if not line.startswith(' '): return parse_initialstate, line, [] self.transitions.limits.append(line.strip()) return parse_limit, None, [] def _parse_state_value(default, line, exprs=None): try: state = eval('dict({})'.format(line), {}) except SyntaxError: logf_error('error parsing state:', '{!r}', line) state = None else: exprs = list((exprs or {}).keys()) for field in list(state.keys()): if field not in self.State.fields: log_error('unselected field:', field) del state[field] elif field in exprs: logf_error('state contains expression field', '{}: {}', field, line) state = default and default.replace(**state) return state def parse_initialstate(line): if not line.startswith('Initial-State:'): self.initial_state = None return parse_transition, line, [] line = line.split(':', 1)[1].strip() self.initial_state = _parse_state_value(self.State.default, line) return parse_oneway, None, [] def parse_oneway(line): if not line.startswith('One-Way:'): return parse_transition, line, [] name = line.split(':', 1)[1].strip() transition = Transition() self.oneway_transitions.append((name, transition)) return parse_state, None, [transition, True] def parse_transition(line): if not line.startswith('Transition:'): return parse_unknown, line, ['transition'] name = line.split(':', 1)[1].strip() transition = Transition() if name in self.transitions: logf_error('duplicate transition:', '{!r}', name) else: self.transitions[name] = transition return parse_field_expr, None, [transition] def parse_field_expr(line, transition): if not line.startswith(' Expression:'): return parse_state, line, [transition, False] line = line.split(':', 1)[1].strip() try: field, expr = line.split('=', 1) except ValueError: logf_error('error parsing expression:', '{!r}', line) else: field = field.strip() expr = expr.strip() if field in transition.exprs: logf_error('duplicate expression', 'for {}: {!r}', field, expr) elif field not in self.State.fields: log_error('unknown expression field:', field) else: transition.exprs[field] = expr return parse_field_expr, None, [transition] def _replace_target(exprs, state, target, field, value): if field in exprs: try: value = eval(exprs[field], state.asdict()) except Exception as e: # pylint: disable=W0703 logf_error('error parsing expression', '{!r}: {}', exprs[field], e) target_value = getattr(target, field) if target_value is matchall: if value is matchall: value = getattr(state, field) target = target.replace(**{field: value}) else: if field in exprs: if value == target_value: log_error('target contains expression field:', field, 'value:', target_value) else: log_error('target contains expression field:', field, 'value:', target_value, 'expected:', value) return target def _expand_state(fields, state, target, exprs, i=0): if state is None or target is None: return if i >= len(fields): yield state, target return field, values = fields[i] if getattr(state, field) is matchall: for value in values: rstate = state.replace(**{field: value}) for estate, etarget in _expand_state(fields, rstate, target, exprs, i+1): etarget = _replace_target(exprs, estate, etarget, field, value) yield estate, etarget else: for estate, etarget in _expand_state(fields, state, target, exprs, i+1): etarget = _replace_target(exprs, estate, etarget, field, matchall) yield estate, etarget def parse_state(line, transition, oneway): if not line.startswith(' State:'): return parse_oneway if oneway else parse_transition, line, [] line = line.split(':', 1)[1].strip() state = _parse_state_value(self.State.default, line) return parse_target, None, [transition, state, oneway] def parse_target(line, transition, state, oneway): if not line.startswith(' '): target = self.State.default else: target = _parse_state_value(self.State.default, line.strip(), transition.exprs) line = None for state, target in _expand_state(list(self.fields.items()), state, target, transition.exprs): if state in transition.states and transition.states[state] is not None: log_error('duplicate state:', state.tostr()) elif self.isvalid(state): if not self.isvalid(target): log_error('invalid target state:', target.tostr()) target = None if oneway: transition.states[state] = target else: self.transitions.update_transition(transition, state, target) return parse_state, line, [transition, oneway] def parse_unknown(line, src): if line == 'End.' or src == 'end': return parse_unknown, None, ['end'] logf_error('error parsing', '{}: {!r}', src, line) return parse_transition, None, [] def process_line(func, line, *args): while line is not None: func, line, args = func(line, *args) return func, args try: func = parse_fields args = [] with open(self.current_testfile, 'rt', encoding='utf-8') as testfile: for logger.lineno, line in enumerate(testfile): if line.lstrip().startswith('#'): continue func, args = process_line(func, line, *args) finally: process_line(func, 'End.', *args) logger.lineno = None def _ignore_fields(self, states, igntype, exprs=None): result = {} for i, field in enumerate(self.State.fields): target_value = nomatch for state, target in states.items(): if igntype == 'unchanged': if state[i] != target[i]: result = {} break state = state.replace(**{field: matchall}) target = target.replace(**{field: matchall}) elif igntype == 'sametarget': if target_value in {nomatch, target[i]}: state = state.replace(**{field: matchall}) target_value = target[i] else: result = {} break elif igntype == 'expressions': if field in exprs: target = target.replace(**{field: matchall}) else: assert False, igntype if state in result and result[state] != target: result = {} break result[state] = target else: states = result result = {} return states def write_test(self): with open(self.current_testfile, 'wt', encoding='utf-8') as testfile: testfile.write('Fields:\n') for field, values in self.fields.items(): print(' ', field, '=', values, file=testfile) testfile.write('Conditions:\n') for condition in self.conditions: print(' ', condition, file=testfile) testfile.write('Limits:\n') for limit in self.transitions.limits: print(' ', limit, file=testfile) testfile.write('Initial-State: %s\n' % self.initial_state.tostr()) for name, transition in self.oneway_transitions: testfile.write('One-Way: %s\n' % name) states = list(transition.states.items()) #assert len(states) == 1 for state, target in states: testfile.write(' State: {}\n'.format(state.tostr())) if state != target and target.tostr(state).strip(): testfile.write(' {}\n'.format(target.tostr(state))) for name, transition in sorted(self.transitions.items()): testfile.write('Transition: %s\n' % name) states = {s:t for s, t in transition.states.items() if self.transitions.stateinfos[s].islimit} states = self._ignore_fields(states, 'expressions', transition.exprs) states = self._ignore_fields(states, 'unchanged') states = self._ignore_fields(states, 'sametarget') for field, expr in sorted(transition.exprs.items()): testfile.write(' Expression: {} = {}\n'.format(field, expr)) for state, target in sorted(states.items()): testfile.write(' State: {}\n'.format(state.tostr())) if state != target and target.tostr(state).strip(): testfile.write(' {}\n'.format(target.tostr(state))) def get_state(self): state = {field: func() for field, func in self.field_functions} return self.State(**state) def find_qobjects(self, root_widget, write_template=False): def log_obj(indent, msg, name, obj): if self.log_widgets: logf('{}{}: {} ({})', ' '*indent, msg, name, obj.__class__.__name__) objects = [(root_widget, 0)] while objects: obj, indent = objects.pop() name = obj.objectName() if name in self.widgets: log_obj(indent, 'kwnobj', name, obj) elif name and not name.startswith('qt_'): self.widgets[name] = obj if isinstance(obj, QAction): for tname, transition in self.oneway_transitions: if tname == name: assert transition.func is None transition.func = obj.trigger if name in self.transitions: transition = self.transitions[name] assert transition.func is None transition.func = obj.trigger elif write_template: self.transitions[name] = Transition(func=obj.trigger) log_obj(indent, 'object', name, obj) else: log_obj(indent, 'intobj', name, obj) for child in reversed(obj.children()): objects.append((child, indent+1)) def update_field_functions(self): self.field_functions = [] mk_func = lambda wname, func: lambda: func(self.widgets[wname]) mk_default = lambda default: lambda: default for field, (wname, default, func) in utils.field_functions.items(): if field in self.State.fields: if wname in self.widgets: self.field_functions.append((field, mk_func(wname, func))) else: self.field_functions.append((field, mk_default(default))) def update_transition_functions(self, write_template=False): def mk_transition(func, widgets, *args): args = tuple(widgets) + args return lambda: func(*args) for wnames, fname, func in utils.widget_functions: if fname in self.known_widget_functions: continue if not all((n in self.widgets) for n in wnames): continue self.known_widget_functions.append(fname) widgets = [self.widgets[n] for n in wnames] for tname, transition in self.oneway_transitions + list(self.transitions.items()): if ' ' in tname: tfname, args = tname.split(' ', 1) if tfname != fname: continue try: args = eval(args, {'Qt': Qt}) except Exception as e: # pylint: disable=W0703 logf_error('error parsing expression', '{!r}: {}', args, e) args = None else: if type(args) is not tuple: args = (args,) else: if tname != fname: continue args = () assert transition.func is None, (wnames, fname, transition.func) if args is None: transition.func = lambda: None else: transition.func = mk_transition(func, widgets, *args) if write_template: assert fname not in self.transitions self.transitions[fname] = Transition(func=mk_transition(func, widgets)) def init_test(self): try: self.read_test() except IOError as e: log('Error reading test data file:', e) assert list(self.fields.keys()) == list(self.State.fields), (list(self.fields.keys()), self.State.fields) write_template = False if not self.transitions: log_error('empty test') write_template = True # introspect ui self.find_qobjects(self.main_window, write_template) self.update_field_functions() self.update_transition_functions(write_template) # initial state self.current_state = self.get_state() if self.initial_state is None: self.initial_state = self.current_state log_error('missing initial state:', self.initial_state.tostr()) elif self.initial_state != self.current_state: logf_error('wrong initial state:', '\n found: {}\n expected: {}', self.current_state.tostr(), self.initial_state.tostr()) self.initial_state = self.current_state self.transitions.reset() if write_template: raise Quit('template created') def check_transition(self, name, transition, oneway=False): if oneway and len(transition.states) > 1: logf_error('ambiguous ow transition:', '\n {}: {} -> ({})', name, self.current_state.tostr(), len(transition.states)) for state in list(transition.states.keys()): if state != self.current_state: del transition.states[state] target = transition.states.get(self.current_state, None) current_state = self.get_state() if target != current_state: if target is None: logf_error('unknown transition:', '\n {}: {} -> {}', name, self.current_state.tostr(), current_state.tostr()) else: logf_error('wrong target', 'for {}: {}\n found: -> {}\n expected: -> {}', name, self.current_state.tostr(), current_state.tostr(), target.tostr()) if oneway: transition.states[self.current_state] = current_state else: self.transitions.update_transition(transition, self.current_state, current_state) self.current_state = current_state def check_result(self): for name, transition in list(self.transitions.items()): if transition.func is None: log_error('unused transition:', name) del self.transitions[name] all_states = list(self.transitions.stateinfos.keys()) all_transitions = [(name, state) for name, transition in self.transitions.items() for state in transition.states.keys()] logger.result.states = len(all_states) # pylint: disable=W0201 logger.result.transitions = len(all_transitions) # pylint: disable=W0201 unreached = self.transitions.stateinfos.get_unreached() for state in unreached: log_error('unreached', state.tostr()) field_values = {} for name, transition in self.transitions.items(): states = transition.states for state, target in list(states.items()): if state in unreached or not self.transitions.stateinfos[state].islimit or target is None: del states[state] continue for field, svalue, tvalue in zip(self.State.fields, state, target): field_values.setdefault(field, set()).update([svalue, tvalue]) for field, values in self.fields.items(): if field in field_values: if set(values) != field_values[field]: log_error('changed field values:', field) values[:] = sorted(field_values[field]) else: log_error('unused field', field) def step(self, name, transition): postfunc = transition.func() if postfunc == 'find_qobjects': self.find_qobjects(self.main_window) self.update_field_functions() self.update_transition_functions() logger.result.visited += 1 # pylint: disable=E1101 yield while self.main_window.is_animating(): yield def loop(self): for unused in self._iloop(): if not self.main_window.isVisible(): log_error('Unexpected end of test') self.running = False return QTest.qWait(10) # without this line sometimes there is a segfault in the next window self.main_window.deleteLater() def _iloop(self): self.current_state = name = target = None # for except statement try: log('Initializing test:', self.current_test) self.init_test() yield log('Running test:', self.current_test) for name, transition in self.oneway_transitions: #TODO python3.3: yield from self.step(name, transition) for unused in self.step(name, transition): yield self.check_transition(name, transition, True) if self.current_state not in self.transitions.stateinfos: log_error('unknown state:', self.current_state) stateinfo = self.transitions.add_stateinfo(self.current_state) if not stateinfo.islimit: log_error('state not in limit:', self.current_state) while True: name = self.transitions.get_random_transition(self.current_state) transition = self.transitions[name] #TODO python3.3: yield from self.step(name, transition) for unused in self.step(name, transition): yield self.check_transition(name, transition) except Quit as e: self.check_result() if self.write_mode == 'yes' or logger.result.errors and self.write_mode == 'error': self.write_test() log('test data file written') logf('End of test {}: {}', self.current_test, e) except Exception: self.check_result() logf('exception in {}: {} -> {}', name, self.current_state and self.current_state.tostr(), target and target.tostr()) sys.excepthook(*sys.exc_info()) finally: if self.running: self.running = False self.main_window.close() @classmethod def wrap(cls, testdata_dir, tests, test_args): logger.open('log-file' in test_args) result = Result() cnt_tests = 0 for test in tests: if '=' in test: test, repeat = test.split('=', 1) repeat = int(repeat) else: repeat = 1 cnt_tests += repeat for unused in range(repeat): logger.result = Result() instance = cls(testdata_dir, test, test_args) fileno, instance.settings_file = tempfile.mkstemp(suffix='-settings.conf', prefix='pybiktest-', text=True) os.close(fileno) yield instance if instance.running: log_error('Unexpected end of testrunner') log('Result:', logger.result) log('') os.remove(instance.settings_file) del instance.settings_file result += logger.result if cnt_tests > 1: logf('Summary ({}): {}', cnt_tests, result) logger.close() pybik-1.1/pybiktest/utils.py0000664000175000017500000001506212157303363016400 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys, os from PyQt4.QtCore import Qt, QPoint from PyQt4.QtGui import QDialogButtonBox from PyQt4.QtTest import QTest field_functions = { 'view_editbar': ('action_editbar', False, lambda widget: widget.isChecked()), 'view_toolbar': ('action_toolbar', False, lambda widget: widget.isChecked()), 'view_statusbar': ('action_statusbar', False, lambda widget: widget.isChecked()), 'edit_text': ('edit_moves', None, lambda widget: str(widget.text())), 'edit_pos': ('edit_moves', None, lambda widget: widget.cursorPosition()), 'game_pos': ('MainWindow', None, lambda widget: widget.gamestate.all_moves.current_place), 'game_len': ('MainWindow', None, lambda widget: len(widget.gamestate.all_moves.moves)), 'solved': ('MainWindow', None, lambda widget: widget.gamestate.current_cube_state.is_solved()), 'sizes': ('MainWindow', None, lambda widget: widget.gamestate.current_cube_state.model.sizes), 'rotationx': ('MainWindow', None, lambda widget: widget.cube_area.rotation_x), 'rotationy': ('MainWindow', None, lambda widget: widget.cube_area.rotation_y), 'selectdlg_exists': ('DialogSelectModel', False, lambda widget: True), 'selectdlg_visible':('DialogSelectModel', False, lambda widget: widget.isVisible()), 'dlg_model': ('combobox_model', None, lambda widget: widget.currentIndex()), 'lblsize1': ('label_width', None, lambda widget: widget.isEnabled()), 'lblsize2': ('label_heigth', None, lambda widget: widget.isEnabled()), 'lblsize3': ('label_depth', None, lambda widget: widget.isEnabled()), 'size1': ('spin_size1', None, lambda widget: (widget.value(), widget.isEnabled())), 'size2': ('spin_size2', None, lambda widget: (widget.value(), widget.isEnabled())), 'size3': ('spin_size3', None, lambda widget: (widget.value(), widget.isEnabled())), 'dlg_solved': ('checkbox_solved', None, lambda widget: widget.isChecked()), 'preferencesdlg_exists': ('DialogPreferences', False, lambda widget: True), 'preferencesdlg_visible': ('DialogPreferences', False, lambda widget: widget.isVisible()), 'aboutdlg_exists': ('AboutDialog', False, lambda widget: True), 'aboutdlg_visible': ('AboutDialog', False, lambda widget: widget.isVisible()), } widget_functions = [] def widget(*wnames, **kwargs): fname = kwargs.setdefault('fname', None) assert list(kwargs.keys()) == ['fname'], kwargs def decorator(func): widget_functions.append((wnames, fname or func.__name__, func)) return func return decorator @widget('edit_moves') def edit_moves_text(widget, text, enter=True): widget.setText(text) if enter: widget.returnPressed.emit() edit_moves_key = widget('edit_moves', fname='edit_moves_key')(QTest.keyClick) @widget('edit_moves') def edit_moves_key_enter(widget, key, modifiers=Qt.NoModifier): QTest.keyClick(widget, key, modifiers) QTest.keyClick(widget, Qt.Key_Enter) button_edit_exec_click = widget('button_edit_exec', fname='button_edit_exec_click')(QTest.mouseClick) button_edit_clear_click = widget('button_edit_clear', fname='button_edit_clear_click')(QTest.mouseClick) drawingarea_key = widget('drawingarea', fname='drawingarea_key')(QTest.keyClick) @widget('drawingarea') def drawingarea_mouse_click(widget, p, button, modifiers=Qt.NoModifier): QTest.mouseMove(widget, QPoint(*p)) QTest.mouseClick(widget, button, modifiers, QPoint(*p), delay=50) @widget('edit_moves', 'drawingarea') def empty_and_drawingarea_mouse_click(edit_moves, drawingarea, p, button, modifiers=Qt.NoModifier): edit_moves_text(edit_moves, '') QTest.qWait(50) drawingarea_mouse_click(drawingarea, p, button, modifiers) @widget('drawingarea') def drawingarea_mouse_move(widget, p1, p2, button, modifiers=Qt.NoModifier): QTest.mouseMove(widget, QPoint(*p1)) QTest.mousePress(widget, button, modifiers, QPoint(*p1), delay=50) QTest.mouseMove(widget, QPoint(*p2)) QTest.mouseRelease(widget, button, modifiers, QPoint(*p2)) @widget('action_selectmodel') def dialog_selectmodel(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('combobox_model') def dialog_selectmodel_changemodel(widget, key): if widget.isVisible(): QTest.keyClick(widget, key, delay=100) @widget('checkbox_solved') def dialog_selectmodel_checksolved(widget, check): if widget.isVisible(): QTest.qWait(100) widget.setChecked(check) @widget('buttonBox') def dialog_selectmodel_ok(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Ok), Qt.LeftButton) QTest.qWait(100) @widget('buttonBox') def dialog_selectmodel_cancel(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Cancel), Qt.LeftButton) QTest.qWait(100) @widget('action_preferences') def dialog_preferences(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('buttonBox') def dialog_preferences_close(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Close), Qt.LeftButton) QTest.qWait(100) #TODO: The testrunner can't currently test modal dialogs, this function will block @widget('action_info') def dialog_about(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('buttonBox') def dialog_about_close(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Close), Qt.LeftButton) QTest.qWait(100) pybik-1.1/pybiktest/__init__.py0000664000175000017500000000000012146422271016757 0ustar barccbarcc00000000000000pybik-1.1/INSTALL0000644000175000017500000000420112155415605013671 0ustar barccbarcc00000000000000Installation Instructions for Pybik 1.1 ======================================= Currently Pybik is available in the official archive for Ubuntu: https://apps.ubuntu.com/cat/applications/raring/pybik/ and Debian: http://packages.debian.org/unstable/pybik For Ubuntu the latest release is available in the Pybik Personal Package Archive (PPA) . Add `ppa:barcc/pybik` to your system's software sources (with the Ubuntu Software-Center). You can also do this in a terminal: sudo add-apt-repository ppa:barcc/pybik sudo apt-get update sudo apt-get install pybik If Pybik is not available for your distribution, see the following installation instructions. Run from source archive ======================= Please use the latest source from the official download site . Requirements ------------ Please make sure you satisfy Pybik's dependencies: * Python 3.2 * Qt4 and Python 3 bindings for Qt4 (PyQt4) * python3-numpy * Python 3 bindings for ICU (PyICU) (optional) For building the rendering engine: * C-compiler (gcc) * development files for Python 3 * Mesa development files * gettext, intltool (for translations) Build + Run ----------- Extract the archive, switch to the created directory in a terminal and enter: ./build_local.sh To run Pybik you can use the command in the same directory ./pybik System-wide installation ======================== This installation method is intended primarily for packagers. Pybik comes with a full featured `setup.py` installation script. To find out more, run: ./setup.py --help You may need additional software * Cython (for Python3, >= 0.17.4, to recreate files in `./csrc/`) * help2man to create a manpage VCS and Daily Builds ==================== Development happens with the Bazaar version control system. Location: You can get the latest revision with: bzr branch lp:pybik Daily build for Ubuntu are provided in the PPA `ppa:barcc/daily-build` pybik-1.1/csrc/0000775000175000017500000000000012157424343013600 5ustar barccbarcc00000000000000pybik-1.1/csrc/_gldraw.cpp0000664000175000017500000054610112157414550015731 0ustar barccbarcc00000000000000/* Generated by Cython 0.17.4 on Sun Jun 16 22:00:39 2013 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02040000 #error Cython requires Python 2.4+. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define CYTHON_FORMAT_SSIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) #define PyNumber_Index(o) ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \ (PyErr_Format(PyExc_TypeError, \ "expected index value, got %.200s", Py_TYPE(o)->tp_name), \ (PyObject*)0)) #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \ !PyComplex_Check(o)) #define PyIndex_Check __Pyx_PyIndex_Check #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #define __PYX_BUILD_PY_SSIZE_T "i" #else #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #define __Pyx_PyIndex_Check PyIndex_Check #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE) #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE) typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6 #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_READ(k, d, i) ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_VERSION_HEX < 0x03020000 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE___gldraw #define __PYX_HAVE_API___gldraw #include "stddef.h" #include "stdint.h" #include "GL/gl.h" #include "GL/glext.h" #include "glm/glm.hpp" #include "glm/gtx/transform.hpp" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "_gldraw.pyx", }; /* "gl.pxd":5147 * # from /usr/include/GL/gl.h: * * ctypedef unsigned int GLenum # <<<<<<<<<<<<<< * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield */ typedef unsigned int __pyx_t_2gl_GLenum; /* "gl.pxd":5148 * * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean # <<<<<<<<<<<<<< * ctypedef unsigned int GLbitfield * ctypedef void GLvoid */ typedef unsigned char __pyx_t_2gl_GLboolean; /* "gl.pxd":5149 * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield # <<<<<<<<<<<<<< * ctypedef void GLvoid * ctypedef signed char GLbyte */ typedef unsigned int __pyx_t_2gl_GLbitfield; /* "gl.pxd":5151 * ctypedef unsigned int GLbitfield * ctypedef void GLvoid * ctypedef signed char GLbyte # <<<<<<<<<<<<<< * ctypedef short GLshort * ctypedef int GLint */ typedef signed char __pyx_t_2gl_GLbyte; /* "gl.pxd":5152 * ctypedef void GLvoid * ctypedef signed char GLbyte * ctypedef short GLshort # <<<<<<<<<<<<<< * ctypedef int GLint * ctypedef unsigned char GLubyte */ typedef short __pyx_t_2gl_GLshort; /* "gl.pxd":5153 * ctypedef signed char GLbyte * ctypedef short GLshort * ctypedef int GLint # <<<<<<<<<<<<<< * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort */ typedef int __pyx_t_2gl_GLint; /* "gl.pxd":5154 * ctypedef short GLshort * ctypedef int GLint * ctypedef unsigned char GLubyte # <<<<<<<<<<<<<< * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint */ typedef unsigned char __pyx_t_2gl_GLubyte; /* "gl.pxd":5155 * ctypedef int GLint * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort # <<<<<<<<<<<<<< * ctypedef unsigned int GLuint * ctypedef int GLsizei */ typedef unsigned short __pyx_t_2gl_GLushort; /* "gl.pxd":5156 * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint # <<<<<<<<<<<<<< * ctypedef int GLsizei * ctypedef float GLfloat */ typedef unsigned int __pyx_t_2gl_GLuint; /* "gl.pxd":5157 * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint * ctypedef int GLsizei # <<<<<<<<<<<<<< * ctypedef float GLfloat * ctypedef float GLclampf */ typedef int __pyx_t_2gl_GLsizei; /* "gl.pxd":5158 * ctypedef unsigned int GLuint * ctypedef int GLsizei * ctypedef float GLfloat # <<<<<<<<<<<<<< * ctypedef float GLclampf * ctypedef double GLdouble */ typedef float __pyx_t_2gl_GLfloat; /* "gl.pxd":5159 * ctypedef int GLsizei * ctypedef float GLfloat * ctypedef float GLclampf # <<<<<<<<<<<<<< * ctypedef double GLdouble * ctypedef double GLclampd */ typedef float __pyx_t_2gl_GLclampf; /* "gl.pxd":5160 * ctypedef float GLfloat * ctypedef float GLclampf * ctypedef double GLdouble # <<<<<<<<<<<<<< * ctypedef double GLclampd * */ typedef double __pyx_t_2gl_GLdouble; /* "gl.pxd":5161 * ctypedef float GLclampf * ctypedef double GLdouble * ctypedef double GLclampd # <<<<<<<<<<<<<< * * */ typedef double __pyx_t_2gl_GLclampd; /* "gl.pxd":5166 * # from /usr/include/GL/glext.h: * * ctypedef char GLchar # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLintptr * ctypedef ptrdiff_t GLsizeiptr */ typedef char __pyx_t_2gl_GLchar; /* "gl.pxd":5167 * * ctypedef char GLchar * ctypedef ptrdiff_t GLintptr # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLsizeiptr * */ typedef ptrdiff_t __pyx_t_2gl_GLintptr; /* "gl.pxd":5168 * ctypedef char GLchar * ctypedef ptrdiff_t GLintptr * ctypedef ptrdiff_t GLsizeiptr # <<<<<<<<<<<<<< * * */ typedef ptrdiff_t __pyx_t_2gl_GLsizeiptr; /*--- Type declarations ---*/ /* "gl.pxd":5150 * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield * ctypedef void GLvoid # <<<<<<<<<<<<<< * ctypedef signed char GLbyte * ctypedef short GLshort */ typedef void __pyx_t_2gl_GLvoid; struct __pyx_t_7_gldraw_Block; struct __pyx_t_7_gldraw_Cube; struct __pyx_t_7_gldraw_Animation_Struct; /* "_gldraw.pxd":4 * * from gl cimport * #line 37 * cdef enum: # #line 48 # <<<<<<<<<<<<<< * VERTEX_ATTRIB_LOCATION = 0 #line 54 * NORMAL_ATTRIB_LOCATION = 1 #line 55 */ enum { __pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION = 0, __pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION = 1, __pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION = 2, __pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION = 3 }; /* "_gldraw.pyx":49 * * * cdef enum: # #pxd/ # <<<<<<<<<<<<<< * #px if True: * MAX_BLOCKS = 1000 */ enum { __pyx_e_7_gldraw_MAX_BLOCKS = 1000, __pyx_e_7_gldraw_MAX_FACES = 6, __pyx_e_7_gldraw_MAX_FACES_PER_BLOCK = 6 }; /* "_gldraw.pyx":60 * #px TEXCOORD_ATTRIB_LOCATION = 3 * * cdef struct Block: #px/ # <<<<<<<<<<<<<< * #px class Block: # pylint: disable=R0903 * #px #px- */ struct __pyx_t_7_gldraw_Block { glm::mat4 transformation; int in_motion; int cnt_faces; int idx_label[__pyx_e_7_gldraw_MAX_FACES_PER_BLOCK]; int cnt_label[__pyx_e_7_gldraw_MAX_FACES_PER_BLOCK]; int texname[__pyx_e_7_gldraw_MAX_FACES_PER_BLOCK]; int idx_triangles; int cnt_triangles; }; /* "_gldraw.pyx":86 * #px self.cnt_triangles = None * * cdef struct Cube: #px/ # <<<<<<<<<<<<<< * #px class cube: # pylint: disable=W0232, R0903 * unsigned int number_blocks #px+ */ struct __pyx_t_7_gldraw_Cube { unsigned int number_blocks; struct __pyx_t_7_gldraw_Block blocks[__pyx_e_7_gldraw_MAX_BLOCKS]; int idx_pick; int cnt_pick; int idx_debug; __pyx_t_2gl_GLuint object_location; __pyx_t_2gl_GLuint glbuffer; }; /* "_gldraw.pyx":101 * cdef Cube cube #px+ * * cdef struct Animation_Struct: #px/ # <<<<<<<<<<<<<< * #px class animation: # pylint: disable=W0232, R0903 * float angle, angle_max #px+ */ struct __pyx_t_7_gldraw_Animation_Struct { float angle; float angle_max; glm::vec3 rotation; glm::mat4 rotation_matrix; }; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */ #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_AsDouble(obj) \ (likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \ likely(PyInt_CheckExact(obj)) ? \ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #else #define __Pyx_PyObject_AsDouble(obj) \ ((likely(PyFloat_CheckExact(obj))) ? \ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) #endif static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_List_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (PyList_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { /* inlined PySequence_GetItem() */ PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (unlikely(l < 0)) return NULL; i += l; } return m->sq_item(o, i); } } #else if (PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name); static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static int __Pyx_check_binary_version(void); static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/ typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from 'libc.stddef' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'gl' */ /* Module declarations from 'glm' */ /* Module declarations from '_gldraw' */ static struct __pyx_t_7_gldraw_Cube __pyx_v_7_gldraw_cube; static struct __pyx_t_7_gldraw_Animation_Struct __pyx_v_7_gldraw_animation; static PyObject *__pyx_f_7_gldraw_set_animation_start(PyObject *, float, float, float, float, int __pyx_skip_dispatch); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_next(float, int __pyx_skip_dispatch); /*proto*/ static void __pyx_f_7_gldraw__gl_draw_block(int); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_data(int, PyObject *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/ #define __Pyx_MODULE_NAME "_gldraw" int __pyx_module_is_main__gldraw = 0; /* Implementation of '_gldraw' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_pf_7_gldraw_init_module(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_gldraw_2set_transformations(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks); /* proto */ static PyObject *__pyx_pf_7_gldraw_4set_animation_start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz); /* proto */ static PyObject *__pyx_pf_7_gldraw_6set_animation_next(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_increment); /* proto */ static PyObject *__pyx_pf_7_gldraw_8gl_set_data(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_texnames); /* proto */ static char __pyx_k_1[] = "GL data: %d bytes"; static char __pyx_k_2[] = "VERTEX_ATTRIB_LOCATION"; static char __pyx_k_3[] = "NORMAL_ATTRIB_LOCATION"; static char __pyx_k_4[] = "COLOR_ATTRIB_LOCATION"; static char __pyx_k_5[] = "TEXCOORD_ATTRIB_LOCATION"; static char __pyx_k_6[] = "gl_init_object_location"; static char __pyx_k_7[] = "Importing module:"; static char __pyx_k_8[] = " from package:"; static char __pyx_k_9[] = " compiled:"; static char __pyx_k_12[] = "/home/barcc/Projekte/pybik/trunk/build/temp.linux-x86_64-3.3/pybiklib/_gldraw.pyx"; static char __pyx_k__b[] = "b"; static char __pyx_k__i[] = "i"; static char __pyx_k__j[] = "j"; static char __pyx_k__axisx[] = "axisx"; static char __pyx_k__axisy[] = "axisy"; static char __pyx_k__axisz[] = "axisz"; static char __pyx_k__debug[] = "debug"; static char __pyx_k__range[] = "range"; static char __pyx_k__blocks[] = "blocks"; static char __pyx_k____all__[] = "__all__"; static char __pyx_k___gldraw[] = "_gldraw"; static char __pyx_k__nblocks[] = "nblocks"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____name__[] = "__name__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__texnames[] = "texnames"; static char __pyx_k__angle_max[] = "angle_max"; static char __pyx_k__enumerate[] = "enumerate"; static char __pyx_k____compiled[] = "__compiled"; static char __pyx_k__vertexdata[] = "vertexdata"; static char __pyx_k__vertexinfo[] = "vertexinfo"; static char __pyx_k____package__[] = "__package__"; static char __pyx_k__init_module[] = "init_module"; static char __pyx_k__gl_draw_cube[] = "gl_draw_cube"; static char __pyx_k__gl_pick_cube[] = "gl_pick_cube"; static char __pyx_k__vertexpointers[] = "vertexpointers"; static char __pyx_k__gl_init_buffers[] = "gl_init_buffers"; static char __pyx_k__gl_delete_buffers[] = "gl_delete_buffers"; static char __pyx_k__gl_draw_cube_debug[] = "gl_draw_cube_debug"; static char __pyx_k__set_transformations[] = "set_transformations"; static PyObject *__pyx_kp_u_1; static PyObject *__pyx_kp_s_12; static PyObject *__pyx_n_u_2; static PyObject *__pyx_n_u_3; static PyObject *__pyx_n_u_4; static PyObject *__pyx_n_u_5; static PyObject *__pyx_n_u_6; static PyObject *__pyx_kp_u_7; static PyObject *__pyx_kp_u_8; static PyObject *__pyx_kp_u_9; static PyObject *__pyx_n_s____all__; static PyObject *__pyx_n_s____compiled; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____name__; static PyObject *__pyx_n_s____package__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s___gldraw; static PyObject *__pyx_n_s__angle_max; static PyObject *__pyx_n_s__axisx; static PyObject *__pyx_n_s__axisy; static PyObject *__pyx_n_s__axisz; static PyObject *__pyx_n_s__b; static PyObject *__pyx_n_s__blocks; static PyObject *__pyx_n_s__debug; static PyObject *__pyx_n_s__enumerate; static PyObject *__pyx_n_u__gl_delete_buffers; static PyObject *__pyx_n_u__gl_draw_cube; static PyObject *__pyx_n_u__gl_draw_cube_debug; static PyObject *__pyx_n_u__gl_init_buffers; static PyObject *__pyx_n_u__gl_pick_cube; static PyObject *__pyx_n_s__i; static PyObject *__pyx_n_s__init_module; static PyObject *__pyx_n_s__j; static PyObject *__pyx_n_s__nblocks; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__set_transformations; static PyObject *__pyx_n_s__texnames; static PyObject *__pyx_n_s__vertexdata; static PyObject *__pyx_n_s__vertexinfo; static PyObject *__pyx_n_s__vertexpointers; static PyObject *__pyx_k_tuple_10; static PyObject *__pyx_k_tuple_13; static PyObject *__pyx_k_codeobj_11; static PyObject *__pyx_k_codeobj_14; /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_gldraw_1init_module = {__Pyx_NAMESTR("init_module"), (PyCFunction)__pyx_pw_7_gldraw_1init_module, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_gldraw_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module (wrapper)", 0); __pyx_r = __pyx_pf_7_gldraw_init_module(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":110 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ static PyObject *__pyx_pf_7_gldraw_init_module(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module", 0); /* "_gldraw.pyx":113 * cdef int i #px+ * * cube.number_blocks = 0 # <<<<<<<<<<<<<< * #cube.blocks * */ __pyx_v_7_gldraw_cube.number_blocks = 0; /* "_gldraw.pyx":116 * #cube.blocks * * cube.idx_pick = 0 # <<<<<<<<<<<<<< * cube.cnt_pick = 0 * cube.idx_debug = 0 */ __pyx_v_7_gldraw_cube.idx_pick = 0; /* "_gldraw.pyx":117 * * cube.idx_pick = 0 * cube.cnt_pick = 0 # <<<<<<<<<<<<<< * cube.idx_debug = 0 * */ __pyx_v_7_gldraw_cube.cnt_pick = 0; /* "_gldraw.pyx":118 * cube.idx_pick = 0 * cube.cnt_pick = 0 * cube.idx_debug = 0 # <<<<<<<<<<<<<< * * animation.angle = animation.angle_max = 0 */ __pyx_v_7_gldraw_cube.idx_debug = 0; /* "_gldraw.pyx":120 * cube.idx_debug = 0 * * animation.angle = animation.angle_max = 0 # <<<<<<<<<<<<<< * * def set_transformations(blocks): */ __pyx_v_7_gldraw_animation.angle = 0; __pyx_v_7_gldraw_animation.angle_max = 0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_3set_transformations(PyObject *__pyx_self, PyObject *__pyx_v_blocks); /*proto*/ static PyMethodDef __pyx_mdef_7_gldraw_3set_transformations = {__Pyx_NAMESTR("set_transformations"), (PyCFunction)__pyx_pw_7_gldraw_3set_transformations, METH_O, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_gldraw_3set_transformations(PyObject *__pyx_self, PyObject *__pyx_v_blocks) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_transformations (wrapper)", 0); __pyx_r = __pyx_pf_7_gldraw_2set_transformations(__pyx_self, ((PyObject *)__pyx_v_blocks)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":122 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int b,i,j #px+ * for b in range(cube.number_blocks): */ static PyObject *__pyx_pf_7_gldraw_2set_transformations(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks) { unsigned int __pyx_v_b; unsigned int __pyx_v_i; unsigned int __pyx_v_j; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations unsigned int __pyx_t_1; unsigned int __pyx_t_2; unsigned int __pyx_t_3; unsigned int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; double __pyx_t_7; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_transformations", 0); /* "_gldraw.pyx":124 * def set_transformations(blocks): * cdef unsigned int b,i,j #px+ * for b in range(cube.number_blocks): # <<<<<<<<<<<<<< * for i in range(4): * for j in range(4): */ __pyx_t_1 = __pyx_v_7_gldraw_cube.number_blocks; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_b = __pyx_t_2; /* "_gldraw.pyx":125 * cdef unsigned int b,i,j #px+ * for b in range(cube.number_blocks): * for i in range(4): # <<<<<<<<<<<<<< * for j in range(4): * cube.blocks[b].transformation[i][j] = float(blocks[b][i][j]) */ for (__pyx_t_3 = 0; __pyx_t_3 < 4; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; /* "_gldraw.pyx":126 * for b in range(cube.number_blocks): * for i in range(4): * for j in range(4): # <<<<<<<<<<<<<< * cube.blocks[b].transformation[i][j] = float(blocks[b][i][j]) * cube.blocks[b].in_motion = False */ for (__pyx_t_4 = 0; __pyx_t_4 < 4; __pyx_t_4+=1) { __pyx_v_j = __pyx_t_4; /* "_gldraw.pyx":127 * for i in range(4): * for j in range(4): * cube.blocks[b].transformation[i][j] = float(blocks[b][i][j]) # <<<<<<<<<<<<<< * cube.blocks[b].in_motion = False * */ __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_blocks, __pyx_v_b, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_j, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = __Pyx_PyObject_AsDouble(__pyx_t_5); if (unlikely(__pyx_t_7 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; (((__pyx_v_7_gldraw_cube.blocks[__pyx_v_b]).transformation[__pyx_v_i])[__pyx_v_j]) = __pyx_t_7; } } /* "_gldraw.pyx":128 * for j in range(4): * cube.blocks[b].transformation[i][j] = float(blocks[b][i][j]) * cube.blocks[b].in_motion = False # <<<<<<<<<<<<<< * * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_b]).in_motion = 0; } __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("_gldraw.set_transformations", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":130 * cube.blocks[b].in_motion = False * * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ # <<<<<<<<<<<<<< * #px def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 */ static PyObject *__pyx_pw_7_gldraw_5set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_start(PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz, CYTHON_UNUSED int __pyx_skip_dispatch) { int __pyx_v_block_id; int __pyx_v_selected; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *(*__pyx_t_3)(PyObject *); PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *(*__pyx_t_8)(PyObject *); int __pyx_t_9; int __pyx_t_10; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_start", 0); /* "_gldraw.pyx":132 * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ * #px def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 # <<<<<<<<<<<<<< * animation.angle_max = angle_max * animation.rotation = vec3(axisx, axisy, axisz) */ __pyx_v_7_gldraw_animation.angle = 0.0; /* "_gldraw.pyx":133 * #px def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 * animation.angle_max = angle_max # <<<<<<<<<<<<<< * animation.rotation = vec3(axisx, axisy, axisz) * animation.rotation_matrix = mat4(1.) */ __pyx_v_7_gldraw_animation.angle_max = __pyx_v_angle_max; /* "_gldraw.pyx":134 * animation.angle = 0.0 * animation.angle_max = angle_max * animation.rotation = vec3(axisx, axisy, axisz) # <<<<<<<<<<<<<< * animation.rotation_matrix = mat4(1.) * cdef int block_id #px+ */ __pyx_v_7_gldraw_animation.rotation = glm::vec3(__pyx_v_axisx, __pyx_v_axisy, __pyx_v_axisz); /* "_gldraw.pyx":135 * animation.angle_max = angle_max * animation.rotation = vec3(axisx, axisy, axisz) * animation.rotation_matrix = mat4(1.) # <<<<<<<<<<<<<< * cdef int block_id #px+ * cdef bint selected #px+ */ __pyx_v_7_gldraw_animation.rotation_matrix = glm::mat4(1.); /* "_gldraw.pyx":138 * cdef int block_id #px+ * cdef bint selected #px+ * for block_id, selected in blocks: # <<<<<<<<<<<<<< * cube.blocks[block_id].in_motion = selected * */ if (PyList_CheckExact(__pyx_v_blocks) || PyTuple_CheckExact(__pyx_v_blocks)) { __pyx_t_1 = __pyx_v_blocks; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; __pyx_t_3 = NULL; } else { __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_blocks); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; } for (;;) { if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) { if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else { __pyx_t_4 = __pyx_t_3(__pyx_t_1); if (unlikely(!__pyx_t_4)) { if (PyErr_Occurred()) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear(); else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } __Pyx_GOTREF(__pyx_t_4); } if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) { PyObject* sequence = __pyx_t_4; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_5 = PyList_GET_ITEM(sequence, 0); __pyx_t_6 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(__pyx_t_6); #else __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } else { Py_ssize_t index = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext; index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_6); if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = NULL; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_8 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_block_id = __pyx_t_9; __pyx_v_selected = __pyx_t_10; /* "_gldraw.pyx":139 * cdef bint selected #px+ * for block_id, selected in blocks: * cube.blocks[block_id].in_motion = selected # <<<<<<<<<<<<<< * * cpdef set_animation_next(float increment): #px/ */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).in_motion = __pyx_v_selected; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_5set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_gldraw_5set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_blocks = 0; float __pyx_v_angle_max; float __pyx_v_axisx; float __pyx_v_axisy; float __pyx_v_axisz; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_animation_start (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__blocks,&__pyx_n_s__angle_max,&__pyx_n_s__axisx,&__pyx_n_s__axisy,&__pyx_n_s__axisz,0}; PyObject* values[5] = {0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__blocks)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__angle_max)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__axisx)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__axisy)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__axisz)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_animation_start") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); } __pyx_v_blocks = values[0]; __pyx_v_angle_max = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_angle_max == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisx = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_axisx == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisy = __pyx_PyFloat_AsFloat(values[3]); if (unlikely((__pyx_v_axisy == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisz = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_axisz == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_gldraw_4set_animation_start(__pyx_self, __pyx_v_blocks, __pyx_v_angle_max, __pyx_v_axisx, __pyx_v_axisy, __pyx_v_axisz); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":130 * cube.blocks[b].in_motion = False * * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ # <<<<<<<<<<<<<< * #px def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 */ static PyObject *__pyx_pf_7_gldraw_4set_animation_start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_start", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_set_animation_start(__pyx_v_blocks, __pyx_v_angle_max, __pyx_v_axisx, __pyx_v_axisy, __pyx_v_axisz, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":141 * cube.blocks[block_id].in_motion = selected * * cpdef set_animation_next(float increment): #px/ # <<<<<<<<<<<<<< * #px def set_animation_next(increment): * animation.angle -= increment */ static PyObject *__pyx_pw_7_gldraw_7set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_next(float __pyx_v_increment, CYTHON_UNUSED int __pyx_skip_dispatch) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_next", 0); /* "_gldraw.pyx":143 * cpdef set_animation_next(float increment): #px/ * #px def set_animation_next(increment): * animation.angle -= increment # <<<<<<<<<<<<<< * animation.rotation_matrix = rotate(animation.angle, animation.rotation) * return abs(animation.angle) < animation.angle_max */ __pyx_v_7_gldraw_animation.angle = (__pyx_v_7_gldraw_animation.angle - __pyx_v_increment); /* "_gldraw.pyx":144 * #px def set_animation_next(increment): * animation.angle -= increment * animation.rotation_matrix = rotate(animation.angle, animation.rotation) # <<<<<<<<<<<<<< * return abs(animation.angle) < animation.angle_max * */ __pyx_v_7_gldraw_animation.rotation_matrix = glm::rotate(__pyx_v_7_gldraw_animation.angle, __pyx_v_7_gldraw_animation.rotation); /* "_gldraw.pyx":145 * animation.angle -= increment * animation.rotation_matrix = rotate(animation.angle, animation.rotation) * return abs(animation.angle) < animation.angle_max # <<<<<<<<<<<<<< * * cdef void gl_draw_cube(): #pxd/ */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyBool_FromLong((fabsf(__pyx_v_7_gldraw_animation.angle) < __pyx_v_7_gldraw_animation.angle_max)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_7set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment); /*proto*/ static PyObject *__pyx_pw_7_gldraw_7set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment) { float __pyx_v_increment; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_animation_next (wrapper)", 0); assert(__pyx_arg_increment); { __pyx_v_increment = __pyx_PyFloat_AsFloat(__pyx_arg_increment); if (unlikely((__pyx_v_increment == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_gldraw_6set_animation_next(__pyx_self, ((float)__pyx_v_increment)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":141 * cube.blocks[block_id].in_motion = selected * * cpdef set_animation_next(float increment): #px/ # <<<<<<<<<<<<<< * #px def set_animation_next(increment): * animation.angle -= increment */ static PyObject *__pyx_pf_7_gldraw_6set_animation_next(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_increment) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_next", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_set_animation_next(__pyx_v_increment, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":147 * return abs(animation.angle) < animation.angle_max * * cdef void gl_draw_cube(): #pxd/ # <<<<<<<<<<<<<< * #px def gl_draw_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ static void __pyx_f_7_gldraw_gl_draw_cube(void) { unsigned int __pyx_v_i; glm::mat4 __pyx_v_object_matrix; __Pyx_RefNannyDeclarations unsigned int __pyx_t_1; unsigned int __pyx_t_2; __Pyx_RefNannySetupContext("gl_draw_cube", 0); /* "_gldraw.pyx":149 * cdef void gl_draw_cube(): #pxd/ * #px def gl_draw_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":150 * #px def gl_draw_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(NORMAL_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glEnableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION); /* "_gldraw.pyx":151 * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) * cdef unsigned int i #px+ */ glEnableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":152 * glEnableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glEnableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * cdef unsigned int i #px+ * cdef mat4 object_matrix #px+ */ glEnableVertexAttribArray(__pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION); /* "_gldraw.pyx":155 * cdef unsigned int i #px+ * cdef mat4 object_matrix #px+ * for i in range(cube.number_blocks): # <<<<<<<<<<<<<< * if cube.blocks[i].in_motion: * object_matrix = animation.rotation_matrix * cube.blocks[i].transformation */ __pyx_t_1 = __pyx_v_7_gldraw_cube.number_blocks; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_i = __pyx_t_2; /* "_gldraw.pyx":156 * cdef mat4 object_matrix #px+ * for i in range(cube.number_blocks): * if cube.blocks[i].in_motion: # <<<<<<<<<<<<<< * object_matrix = animation.rotation_matrix * cube.blocks[i].transformation * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ */ if ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).in_motion) { /* "_gldraw.pyx":157 * for i in range(cube.number_blocks): * if cube.blocks[i].in_motion: * object_matrix = animation.rotation_matrix * cube.blocks[i].transformation # <<<<<<<<<<<<<< * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) */ __pyx_v_object_matrix = (__pyx_v_7_gldraw_animation.rotation_matrix * (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).transformation); /* "_gldraw.pyx":158 * if cube.blocks[i].in_motion: * object_matrix = animation.rotation_matrix * cube.blocks[i].transformation * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * else: */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&((__pyx_v_object_matrix[0])[0]))); goto __pyx_L5; } /*else*/ { /* "_gldraw.pyx":161 * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * else: * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) #px/ # <<<<<<<<<<<<<< * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) * _gl_draw_block(i) */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&(((__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).transformation[0])[0]))); } __pyx_L5:; /* "_gldraw.pyx":163 * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) #px/ * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) * _gl_draw_block(i) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) */ __pyx_f_7_gldraw__gl_draw_block(__pyx_v_i); } /* "_gldraw.pyx":164 * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) * _gl_draw_block(i) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glDisableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":165 * _gl_draw_block(i) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDisableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) */ glDisableVertexAttribArray(__pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION); /* "_gldraw.pyx":166 * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) * */ glDisableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":167 * glDisableVertexAttribArray(NORMAL_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDisableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * * cdef void _gl_draw_block(int block_id): #px/ */ glDisableVertexAttribArray(__pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION); __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":169 * glDisableVertexAttribArray(TEXCOORD_ATTRIB_LOCATION) * * cdef void _gl_draw_block(int block_id): #px/ # <<<<<<<<<<<<<< * #px def _gl_draw_block(block_id): * cdef int i #px+ */ static void __pyx_f_7_gldraw__gl_draw_block(int __pyx_v_block_id) { int __pyx_v_i; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_gl_draw_block", 0); /* "_gldraw.pyx":173 * cdef int i #px+ * * glBindTexture(GL_TEXTURE_2D, 0) # <<<<<<<<<<<<<< * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_triangles, cube.blocks[block_id].cnt_triangles) * */ glBindTexture(GL_TEXTURE_2D, 0); /* "_gldraw.pyx":174 * * glBindTexture(GL_TEXTURE_2D, 0) * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_triangles, cube.blocks[block_id].cnt_triangles) # <<<<<<<<<<<<<< * * for i in range(cube.blocks[block_id].cnt_faces): */ glDrawArrays(GL_TRIANGLES, (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).idx_triangles, (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).cnt_triangles); /* "_gldraw.pyx":176 * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_triangles, cube.blocks[block_id].cnt_triangles) * * for i in range(cube.blocks[block_id].cnt_faces): # <<<<<<<<<<<<<< * # render the colors (ie the little sticky labels) * glBindTexture(GL_TEXTURE_2D, cube.blocks[block_id].texname[i]) */ __pyx_t_1 = (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).cnt_faces; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_i = __pyx_t_2; /* "_gldraw.pyx":178 * for i in range(cube.blocks[block_id].cnt_faces): * # render the colors (ie the little sticky labels) * glBindTexture(GL_TEXTURE_2D, cube.blocks[block_id].texname[i]) # <<<<<<<<<<<<<< * #TODO: Workaround for artifacts on the bottom and left sides of images * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT) */ glBindTexture(GL_TEXTURE_2D, ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).texname[__pyx_v_i])); /* "_gldraw.pyx":180 * glBindTexture(GL_TEXTURE_2D, cube.blocks[block_id].texname[i]) * #TODO: Workaround for artifacts on the bottom and left sides of images * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT) # <<<<<<<<<<<<<< * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT) * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_label[i], cube.blocks[block_id].cnt_label[i]) */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); /* "_gldraw.pyx":181 * #TODO: Workaround for artifacts on the bottom and left sides of images * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT) * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT) # <<<<<<<<<<<<<< * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_label[i], cube.blocks[block_id].cnt_label[i]) * */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); /* "_gldraw.pyx":182 * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT) * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT) * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_label[i], cube.blocks[block_id].cnt_label[i]) # <<<<<<<<<<<<<< * * cdef void gl_pick_cube(): #pxd/ */ glDrawArrays(GL_TRIANGLES, ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).idx_label[__pyx_v_i]), ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).cnt_label[__pyx_v_i])); } __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":184 * glDrawArrays(GL_TRIANGLES, cube.blocks[block_id].idx_label[i], cube.blocks[block_id].cnt_label[i]) * * cdef void gl_pick_cube(): #pxd/ # <<<<<<<<<<<<<< * #px def gl_pick_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ static void __pyx_f_7_gldraw_gl_pick_cube(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_pick_cube", 0); /* "_gldraw.pyx":186 * cdef void gl_pick_cube(): #pxd/ * #px def gl_pick_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":187 * #px def gl_pick_cube(): * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":188 * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glDrawArrays(GL_TRIANGLES, __pyx_v_7_gldraw_cube.idx_pick, __pyx_v_7_gldraw_cube.cnt_pick); /* "_gldraw.pyx":189 * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * */ glDisableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":190 * glDrawArrays(GL_TRIANGLES, cube.idx_pick, cube.cnt_pick) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * * cdef void gl_init_buffers(): #pxd/ */ glDisableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":192 * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * * cdef void gl_init_buffers(): #pxd/ # <<<<<<<<<<<<<< * #px def gl_init_buffers(): * glGenBuffers(1, &cube.glbuffer) #px/ */ static void __pyx_f_7_gldraw_gl_init_buffers(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init_buffers", 0); /* "_gldraw.pyx":194 * cdef void gl_init_buffers(): #pxd/ * #px def gl_init_buffers(): * glGenBuffers(1, &cube.glbuffer) #px/ # <<<<<<<<<<<<<< * #px cube.glbuffer = glGenBuffers(1) * */ glGenBuffers(1, (&__pyx_v_7_gldraw_cube.glbuffer)); __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":197 * #px cube.glbuffer = glGenBuffers(1) * * cdef void gl_delete_buffers(): #pxd/ # <<<<<<<<<<<<<< * #px def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) */ static void __pyx_f_7_gldraw_gl_delete_buffers(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_delete_buffers", 0); /* "_gldraw.pyx":199 * cdef void gl_delete_buffers(): #pxd/ * #px def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) # <<<<<<<<<<<<<< * glDeleteBuffers(1, &cube.glbuffer) #px/ * #px glDeleteBuffers(1, [cube.glbuffer]) */ glBindBuffer(GL_ARRAY_BUFFER, 0); /* "_gldraw.pyx":200 * #px def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) * glDeleteBuffers(1, &cube.glbuffer) #px/ # <<<<<<<<<<<<<< * #px glDeleteBuffers(1, [cube.glbuffer]) * cube.glbuffer = 0 */ glDeleteBuffers(1, (&__pyx_v_7_gldraw_cube.glbuffer)); /* "_gldraw.pyx":202 * glDeleteBuffers(1, &cube.glbuffer) #px/ * #px glDeleteBuffers(1, [cube.glbuffer]) * cube.glbuffer = 0 # <<<<<<<<<<<<<< * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, texnames): #px/ */ __pyx_v_7_gldraw_cube.glbuffer = 0; __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":204 * cube.glbuffer = 0 * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, texnames): #px/ # <<<<<<<<<<<<<< * #px def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, texnames): * cube.number_blocks = nblocks */ static PyObject *__pyx_pw_7_gldraw_9gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_data(int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_texnames, CYTHON_UNUSED int __pyx_skip_dispatch) { long __pyx_v_normalpointer; long __pyx_v_colorpointer; long __pyx_v_texpospointer; unsigned int __pyx_v_idx_block; unsigned int __pyx_v_idx_pick; unsigned int __pyx_v_cnt_pick; unsigned int __pyx_v_idx_debug; PyObject *__pyx_v_labelinfos = NULL; PyObject *__pyx_v_cnts_block = NULL; unsigned int __pyx_v_block; unsigned int __pyx_v_i; unsigned int __pyx_v_idx_label; unsigned int __pyx_v_cnt; unsigned int __pyx_v_faceno; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *(*__pyx_t_5)(PyObject *); long __pyx_t_6; long __pyx_t_7; long __pyx_t_8; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; unsigned int __pyx_t_12; unsigned int __pyx_t_13; unsigned int __pyx_t_14; unsigned int __pyx_t_15; Py_ssize_t __pyx_t_16; PyObject *(*__pyx_t_17)(PyObject *); unsigned int __pyx_t_18; int __pyx_t_19; char *__pyx_t_20; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_data", 0); /* "_gldraw.pyx":206 * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, texnames): #px/ * #px def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, texnames): * cube.number_blocks = nblocks # <<<<<<<<<<<<<< * assert cube.number_blocks <= MAX_BLOCKS * */ __pyx_v_7_gldraw_cube.number_blocks = __pyx_v_nblocks; /* "_gldraw.pyx":207 * #px def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, texnames): * cube.number_blocks = nblocks * assert cube.number_blocks <= MAX_BLOCKS # <<<<<<<<<<<<<< * * #### Create the raw GL data #### */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!(__pyx_v_7_gldraw_cube.number_blocks <= __pyx_e_7_gldraw_MAX_BLOCKS))) { PyErr_SetNone(PyExc_AssertionError); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "_gldraw.pyx":212 * cdef long normalpointer, colorpointer, texpospointer #px+ * cdef unsigned int idx_block, idx_pick, cnt_pick, idx_debug #px+ * normalpointer, colorpointer, texpospointer = vertexpointers # <<<<<<<<<<<<<< * labelinfos, idx_block, cnts_block, idx_pick, cnt_pick, idx_debug = vertexinfo * */ if ((likely(PyTuple_CheckExact(__pyx_v_vertexpointers))) || (PyList_CheckExact(__pyx_v_vertexpointers))) { PyObject* sequence = __pyx_v_vertexpointers; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 3)) { if (size > 3) __Pyx_RaiseTooManyValuesError(3); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); } else { __pyx_t_1 = PyList_GET_ITEM(sequence, 0); __pyx_t_2 = PyList_GET_ITEM(sequence, 1); __pyx_t_3 = PyList_GET_ITEM(sequence, 2); } __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); #else __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else { Py_ssize_t index = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_vertexpointers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext; index = 0; __pyx_t_1 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_1); index = 1; __pyx_t_2 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_2); index = 2; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_3); if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = NULL; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L4_unpacking_done; __pyx_L3_unpacking_failed:; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_5 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L4_unpacking_done:; } __pyx_t_6 = __Pyx_PyInt_AsLong(__pyx_t_1); if (unlikely((__pyx_t_6 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7 = __Pyx_PyInt_AsLong(__pyx_t_2); if (unlikely((__pyx_t_7 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_t_3); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_normalpointer = __pyx_t_6; __pyx_v_colorpointer = __pyx_t_7; __pyx_v_texpospointer = __pyx_t_8; /* "_gldraw.pyx":213 * cdef unsigned int idx_block, idx_pick, cnt_pick, idx_debug #px+ * normalpointer, colorpointer, texpospointer = vertexpointers * labelinfos, idx_block, cnts_block, idx_pick, cnt_pick, idx_debug = vertexinfo # <<<<<<<<<<<<<< * * cdef unsigned int block, i, idx_label, cnt, faceno #px+ */ if ((likely(PyTuple_CheckExact(__pyx_v_vertexinfo))) || (PyList_CheckExact(__pyx_v_vertexinfo))) { PyObject* sequence = __pyx_v_vertexinfo; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 6)) { if (size > 6) __Pyx_RaiseTooManyValuesError(6); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); __pyx_t_1 = PyTuple_GET_ITEM(sequence, 2); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 3); __pyx_t_9 = PyTuple_GET_ITEM(sequence, 4); __pyx_t_10 = PyTuple_GET_ITEM(sequence, 5); } else { __pyx_t_3 = PyList_GET_ITEM(sequence, 0); __pyx_t_2 = PyList_GET_ITEM(sequence, 1); __pyx_t_1 = PyList_GET_ITEM(sequence, 2); __pyx_t_4 = PyList_GET_ITEM(sequence, 3); __pyx_t_9 = PyList_GET_ITEM(sequence, 4); __pyx_t_10 = PyList_GET_ITEM(sequence, 5); } __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_10); #else Py_ssize_t i; PyObject** temps[6] = {&__pyx_t_3,&__pyx_t_2,&__pyx_t_1,&__pyx_t_4,&__pyx_t_9,&__pyx_t_10}; for (i=0; i < 6; i++) { PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} *(temps[i]) = item; } #endif } else { Py_ssize_t index = -1; PyObject** temps[6] = {&__pyx_t_3,&__pyx_t_2,&__pyx_t_1,&__pyx_t_4,&__pyx_t_9,&__pyx_t_10}; __pyx_t_11 = PyObject_GetIter(__pyx_v_vertexinfo); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); __pyx_t_5 = Py_TYPE(__pyx_t_11)->tp_iternext; for (index=0; index < 6; index++) { PyObject* item = __pyx_t_5(__pyx_t_11); if (unlikely(!item)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(item); *(temps[index]) = item; } if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_11), 6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = NULL; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_5 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } __pyx_t_12 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_2); if (unlikely((__pyx_t_12 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_13 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_4); if (unlikely((__pyx_t_13 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_14 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_9); if (unlikely((__pyx_t_14 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_15 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_10); if (unlikely((__pyx_t_15 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_v_labelinfos = __pyx_t_3; __pyx_t_3 = 0; __pyx_v_idx_block = __pyx_t_12; __pyx_v_cnts_block = __pyx_t_1; __pyx_t_1 = 0; __pyx_v_idx_pick = __pyx_t_13; __pyx_v_cnt_pick = __pyx_t_14; __pyx_v_idx_debug = __pyx_t_15; /* "_gldraw.pyx":216 * * cdef unsigned int block, i, idx_label, cnt, faceno #px+ * idx_label = 0 # <<<<<<<<<<<<<< * for block in range(cube.number_blocks): * cube.blocks[block].cnt_faces = len(labelinfos[block]) */ __pyx_v_idx_label = 0; /* "_gldraw.pyx":217 * cdef unsigned int block, i, idx_label, cnt, faceno #px+ * idx_label = 0 * for block in range(cube.number_blocks): # <<<<<<<<<<<<<< * cube.blocks[block].cnt_faces = len(labelinfos[block]) * for i, (cnt, faceno) in enumerate(labelinfos[block]): */ __pyx_t_15 = __pyx_v_7_gldraw_cube.number_blocks; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_15; __pyx_t_14+=1) { __pyx_v_block = __pyx_t_14; /* "_gldraw.pyx":218 * idx_label = 0 * for block in range(cube.number_blocks): * cube.blocks[block].cnt_faces = len(labelinfos[block]) # <<<<<<<<<<<<<< * for i, (cnt, faceno) in enumerate(labelinfos[block]): * cube.blocks[block].idx_label[i] = idx_label */ __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_labelinfos, __pyx_v_block, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_16 = PyObject_Length(__pyx_t_10); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).cnt_faces = __pyx_t_16; /* "_gldraw.pyx":219 * for block in range(cube.number_blocks): * cube.blocks[block].cnt_faces = len(labelinfos[block]) * for i, (cnt, faceno) in enumerate(labelinfos[block]): # <<<<<<<<<<<<<< * cube.blocks[block].idx_label[i] = idx_label * cube.blocks[block].cnt_label[i] = cnt */ __pyx_t_13 = 0; __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_labelinfos, __pyx_v_block, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); if (PyList_CheckExact(__pyx_t_10) || PyTuple_CheckExact(__pyx_t_10)) { __pyx_t_9 = __pyx_t_10; __Pyx_INCREF(__pyx_t_9); __pyx_t_16 = 0; __pyx_t_17 = NULL; } else { __pyx_t_16 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_17 = Py_TYPE(__pyx_t_9)->tp_iternext; } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; for (;;) { if (!__pyx_t_17 && PyList_CheckExact(__pyx_t_9)) { if (__pyx_t_16 >= PyList_GET_SIZE(__pyx_t_9)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_10 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_16); __Pyx_INCREF(__pyx_t_10); __pyx_t_16++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_10 = PySequence_ITEM(__pyx_t_9, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else if (!__pyx_t_17 && PyTuple_CheckExact(__pyx_t_9)) { if (__pyx_t_16 >= PyTuple_GET_SIZE(__pyx_t_9)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_16); __Pyx_INCREF(__pyx_t_10); __pyx_t_16++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_10 = PySequence_ITEM(__pyx_t_9, __pyx_t_16); __pyx_t_16++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else { __pyx_t_10 = __pyx_t_17(__pyx_t_9); if (unlikely(!__pyx_t_10)) { if (PyErr_Occurred()) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear(); else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } __Pyx_GOTREF(__pyx_t_10); } if ((likely(PyTuple_CheckExact(__pyx_t_10))) || (PyList_CheckExact(__pyx_t_10))) { PyObject* sequence = __pyx_t_10; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_4 = PyList_GET_ITEM(sequence, 0); __pyx_t_1 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_1); #else __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else { Py_ssize_t index = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_5 = Py_TYPE(__pyx_t_2)->tp_iternext; index = 0; __pyx_t_4 = __pyx_t_5(__pyx_t_2); if (unlikely(!__pyx_t_4)) goto __pyx_L11_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); index = 1; __pyx_t_1 = __pyx_t_5(__pyx_t_2); if (unlikely(!__pyx_t_1)) goto __pyx_L11_unpacking_failed; __Pyx_GOTREF(__pyx_t_1); if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_2), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = NULL; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L12_unpacking_done; __pyx_L11_unpacking_failed:; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_5 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L12_unpacking_done:; } __pyx_t_12 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_4); if (unlikely((__pyx_t_12 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_18 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_1); if (unlikely((__pyx_t_18 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_cnt = __pyx_t_12; __pyx_v_faceno = __pyx_t_18; __pyx_v_i = __pyx_t_13; __pyx_t_13 = (__pyx_t_13 + 1); /* "_gldraw.pyx":220 * cube.blocks[block].cnt_faces = len(labelinfos[block]) * for i, (cnt, faceno) in enumerate(labelinfos[block]): * cube.blocks[block].idx_label[i] = idx_label # <<<<<<<<<<<<<< * cube.blocks[block].cnt_label[i] = cnt * cube.blocks[block].texname[i] = texnames[faceno] */ ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).idx_label[__pyx_v_i]) = __pyx_v_idx_label; /* "_gldraw.pyx":221 * for i, (cnt, faceno) in enumerate(labelinfos[block]): * cube.blocks[block].idx_label[i] = idx_label * cube.blocks[block].cnt_label[i] = cnt # <<<<<<<<<<<<<< * cube.blocks[block].texname[i] = texnames[faceno] * idx_label += cnt */ ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).cnt_label[__pyx_v_i]) = __pyx_v_cnt; /* "_gldraw.pyx":222 * cube.blocks[block].idx_label[i] = idx_label * cube.blocks[block].cnt_label[i] = cnt * cube.blocks[block].texname[i] = texnames[faceno] # <<<<<<<<<<<<<< * idx_label += cnt * cube.blocks[block].idx_triangles = idx_block */ __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_texnames, __pyx_v_faceno, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).texname[__pyx_v_i]) = __pyx_t_19; /* "_gldraw.pyx":223 * cube.blocks[block].cnt_label[i] = cnt * cube.blocks[block].texname[i] = texnames[faceno] * idx_label += cnt # <<<<<<<<<<<<<< * cube.blocks[block].idx_triangles = idx_block * cube.blocks[block].cnt_triangles = cnts_block[block] */ __pyx_v_idx_label = (__pyx_v_idx_label + __pyx_v_cnt); } __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; /* "_gldraw.pyx":224 * cube.blocks[block].texname[i] = texnames[faceno] * idx_label += cnt * cube.blocks[block].idx_triangles = idx_block # <<<<<<<<<<<<<< * cube.blocks[block].cnt_triangles = cnts_block[block] * idx_block += cnts_block[block] */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).idx_triangles = __pyx_v_idx_block; /* "_gldraw.pyx":225 * idx_label += cnt * cube.blocks[block].idx_triangles = idx_block * cube.blocks[block].cnt_triangles = cnts_block[block] # <<<<<<<<<<<<<< * idx_block += cnts_block[block] * */ __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_cnts_block, __pyx_v_block, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block]).cnt_triangles = __pyx_t_19; /* "_gldraw.pyx":226 * cube.blocks[block].idx_triangles = idx_block * cube.blocks[block].cnt_triangles = cnts_block[block] * idx_block += cnts_block[block] # <<<<<<<<<<<<<< * * cube.idx_pick = idx_pick */ __pyx_t_9 = PyLong_FromUnsignedLong(__pyx_v_idx_block); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_cnts_block, __pyx_v_block, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_13 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_1); if (unlikely((__pyx_t_13 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_idx_block = __pyx_t_13; } /* "_gldraw.pyx":228 * idx_block += cnts_block[block] * * cube.idx_pick = idx_pick # <<<<<<<<<<<<<< * cube.cnt_pick = cnt_pick * cube.idx_debug = idx_debug */ __pyx_v_7_gldraw_cube.idx_pick = __pyx_v_idx_pick; /* "_gldraw.pyx":229 * * cube.idx_pick = idx_pick * cube.cnt_pick = cnt_pick # <<<<<<<<<<<<<< * cube.idx_debug = idx_debug * */ __pyx_v_7_gldraw_cube.cnt_pick = __pyx_v_cnt_pick; /* "_gldraw.pyx":230 * cube.idx_pick = idx_pick * cube.cnt_pick = cnt_pick * cube.idx_debug = idx_debug # <<<<<<<<<<<<<< * * debug('GL data: %d bytes' % len(vertexdata)) */ __pyx_v_7_gldraw_cube.idx_debug = __pyx_v_idx_debug; /* "_gldraw.pyx":232 * cube.idx_debug = idx_debug * * debug('GL data: %d bytes' % len(vertexdata)) # <<<<<<<<<<<<<< * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) * glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/ */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (unlikely(((PyObject *)__pyx_v_vertexdata) == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_16 = PyBytes_GET_SIZE(((PyObject *)__pyx_v_vertexdata)); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_16); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_1), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_9)); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9)); __Pyx_GIVEREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; /* "_gldraw.pyx":233 * * debug('GL data: %d bytes' % len(vertexdata)) * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) # <<<<<<<<<<<<<< * glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/ * #px glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) */ glBindBuffer(GL_ARRAY_BUFFER, __pyx_v_7_gldraw_cube.glbuffer); /* "_gldraw.pyx":234 * debug('GL data: %d bytes' % len(vertexdata)) * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) * glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/ # <<<<<<<<<<<<<< * #px glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) * */ if (unlikely(((PyObject *)__pyx_v_vertexdata) == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_16 = PyBytes_GET_SIZE(((PyObject *)__pyx_v_vertexdata)); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_20 = PyBytes_AsString(((PyObject *)__pyx_v_vertexdata)); if (unlikely((!__pyx_t_20) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glBufferData(GL_ARRAY_BUFFER, __pyx_t_16, ((char *)__pyx_t_20), GL_STATIC_DRAW); /* "_gldraw.pyx":237 * #px glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) * * glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) #px/ # <<<<<<<<<<<<<< * #px glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) * glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) #px/ */ glVertexAttribPointer(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, ((void *)0)); /* "_gldraw.pyx":239 * glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) #px/ * #px glVertexAttribPointer(VERTEX_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0) * glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) #px/ # <<<<<<<<<<<<<< * #px glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) * glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) #px/ */ glVertexAttribPointer(__pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, ((void *)__pyx_v_normalpointer)); /* "_gldraw.pyx":241 * glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) #px/ * #px glVertexAttribPointer(NORMAL_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, normalpointer) * glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) #px/ # <<<<<<<<<<<<<< * #px glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) * glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) #px/ */ glVertexAttribPointer(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, ((void *)__pyx_v_colorpointer)); /* "_gldraw.pyx":243 * glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) #px/ * #px glVertexAttribPointer(COLOR_ATTRIB_LOCATION, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, colorpointer) * glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) #px/ # <<<<<<<<<<<<<< * #px glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) * */ glVertexAttribPointer(__pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, ((void *)__pyx_v_texpospointer)); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_labelinfos); __Pyx_XDECREF(__pyx_v_cnts_block); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_9gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_gldraw_9gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_nblocks; PyObject *__pyx_v_vertexdata = 0; PyObject *__pyx_v_vertexpointers = 0; PyObject *__pyx_v_vertexinfo = 0; PyObject *__pyx_v_texnames = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_set_data (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__nblocks,&__pyx_n_s__vertexdata,&__pyx_n_s__vertexpointers,&__pyx_n_s__vertexinfo,&__pyx_n_s__texnames,0}; PyObject* values[5] = {0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nblocks)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertexdata)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertexpointers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertexinfo)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__texnames)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_set_data") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); } __pyx_v_nblocks = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_nblocks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_vertexdata = ((PyObject*)values[1]); __pyx_v_vertexpointers = values[2]; __pyx_v_vertexinfo = values[3]; __pyx_v_texnames = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertexdata), (&PyBytes_Type), 1, "vertexdata", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_gldraw_8gl_set_data(__pyx_self, __pyx_v_nblocks, __pyx_v_vertexdata, __pyx_v_vertexpointers, __pyx_v_vertexinfo, __pyx_v_texnames); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":204 * cube.glbuffer = 0 * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, texnames): #px/ # <<<<<<<<<<<<<< * #px def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, texnames): * cube.number_blocks = nblocks */ static PyObject *__pyx_pf_7_gldraw_8gl_set_data(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_texnames) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_data", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_gl_set_data(__pyx_v_nblocks, __pyx_v_vertexdata, __pyx_v_vertexpointers, __pyx_v_vertexinfo, __pyx_v_texnames, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":246 * #px glVertexAttribPointer(TEXCOORD_ATTRIB_LOCATION, 2, GL_FLOAT, GL_FALSE, 0, texpospointer) * * cdef void gl_draw_cube_debug(): #pxd/ # <<<<<<<<<<<<<< * #px def gl_draw_cube_debug(): * cdef mat4 object_matrix #px+ */ static void __pyx_f_7_gldraw_gl_draw_cube_debug(void) { glm::mat4 __pyx_v_object_matrix; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_draw_cube_debug", 0); /* "_gldraw.pyx":249 * #px def gl_draw_cube_debug(): * cdef mat4 object_matrix #px+ * object_matrix = mat4(1.) # <<<<<<<<<<<<<< * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) */ __pyx_v_object_matrix = glm::mat4(1.); /* "_gldraw.pyx":250 * cdef mat4 object_matrix #px+ * object_matrix = mat4(1.) * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&((__pyx_v_object_matrix[0])[0]))); /* "_gldraw.pyx":252 * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug, 6) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":253 * #px glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDrawArrays(GL_LINES, cube.idx_debug, 6) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":254 * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug, 6) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glDrawArrays(GL_LINES, __pyx_v_7_gldraw_cube.idx_debug, 6); /* "_gldraw.pyx":255 * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug, 6) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * */ glDisableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":256 * glDrawArrays(GL_LINES, cube.idx_debug, 6) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * * cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): #pxd/ */ glDisableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":258 * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * * cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): #pxd/ # <<<<<<<<<<<<<< * #px def gl_draw_select_debug(selectdata, size, prog_hud): * cdef int i, j #px+ */ static void __pyx_f_7_gldraw_gl_draw_select_debug(__pyx_t_2gl_GLfloat *__pyx_v_selectdata, __pyx_t_2gl_GLsizeiptr __pyx_v_size, __pyx_t_2gl_GLuint __pyx_v_prog_hud) { __pyx_t_2gl_GLintptr __pyx_v_offset; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_draw_select_debug", 0); /* "_gldraw.pyx":262 * cdef int i, j #px+ * cdef GLintptr offset #px+ * offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) # <<<<<<<<<<<<<< * glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) #px/ * #px glBufferSubData(GL_ARRAY_BUFFER, offset, size, selectdata) */ __pyx_v_offset = (((__pyx_v_7_gldraw_cube.idx_debug + 6) * 3) * (sizeof(__pyx_t_2gl_GLfloat))); /* "_gldraw.pyx":263 * cdef GLintptr offset #px+ * offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) * glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) #px/ # <<<<<<<<<<<<<< * #px glBufferSubData(GL_ARRAY_BUFFER, offset, size, selectdata) * */ glBufferSubData(GL_ARRAY_BUFFER, __pyx_v_offset, __pyx_v_size, (&(__pyx_v_selectdata[0]))); /* "_gldraw.pyx":266 * #px glBufferSubData(GL_ARRAY_BUFFER, offset, size, selectdata) * * glDisable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glDisable(GL_DEPTH_TEST); /* "_gldraw.pyx":267 * * glDisable(GL_DEPTH_TEST) * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":268 * glDisable(GL_DEPTH_TEST) * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) */ glEnableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":269 * glEnableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) # <<<<<<<<<<<<<< * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) */ glDrawArrays(GL_LINES, (__pyx_v_7_gldraw_cube.idx_debug + 6), 2); /* "_gldraw.pyx":270 * glEnableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) # <<<<<<<<<<<<<< * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) */ glUseProgram(__pyx_v_prog_hud); /* "_gldraw.pyx":271 * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) */ glDrawArrays(GL_POINTS, ((__pyx_v_7_gldraw_cube.idx_debug + 6) + 2), 2); /* "_gldraw.pyx":272 * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glEnable(GL_DEPTH_TEST) */ glDisableVertexAttribArray(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); /* "_gldraw.pyx":273 * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) # <<<<<<<<<<<<<< * glEnable(GL_DEPTH_TEST) * */ glDisableVertexAttribArray(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); /* "_gldraw.pyx":274 * glDisableVertexAttribArray(VERTEX_ATTRIB_LOCATION) * glDisableVertexAttribArray(COLOR_ATTRIB_LOCATION) * glEnable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * * cdef void gl_init_object_location(GLuint location): #pxd/ */ glEnable(GL_DEPTH_TEST); __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":276 * glEnable(GL_DEPTH_TEST) * * cdef void gl_init_object_location(GLuint location): #pxd/ # <<<<<<<<<<<<<< * #px def gl_init_object_location(location): * cube.object_location = location */ static void __pyx_f_7_gldraw_gl_init_object_location(__pyx_t_2gl_GLuint __pyx_v_location) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init_object_location", 0); /* "_gldraw.pyx":278 * cdef void gl_init_object_location(GLuint location): #pxd/ * #px def gl_init_object_location(location): * cube.object_location = location # <<<<<<<<<<<<<< * * */ __pyx_v_7_gldraw_cube.object_location = __pyx_v_location; __Pyx_RefNannyFinishContext(); } static PyMethodDef __pyx_methods[] = { {__Pyx_NAMESTR("set_animation_start"), (PyCFunction)__pyx_pw_7_gldraw_5set_animation_start, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("set_animation_next"), (PyCFunction)__pyx_pw_7_gldraw_7set_animation_next, METH_O, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("gl_set_data"), (PyCFunction)__pyx_pw_7_gldraw_9gl_set_data, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("_gldraw"), 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 1, 0, 0}, {&__pyx_kp_s_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 0, 1, 0}, {&__pyx_n_u_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 1, 0, 1}, {&__pyx_n_u_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 1, 0, 1}, {&__pyx_n_u_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 1, 0, 1}, {&__pyx_n_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 1}, {&__pyx_n_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 1}, {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0}, {&__pyx_n_s____all__, __pyx_k____all__, sizeof(__pyx_k____all__), 0, 0, 1, 1}, {&__pyx_n_s____compiled, __pyx_k____compiled, sizeof(__pyx_k____compiled), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____name__, __pyx_k____name__, sizeof(__pyx_k____name__), 0, 0, 1, 1}, {&__pyx_n_s____package__, __pyx_k____package__, sizeof(__pyx_k____package__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s___gldraw, __pyx_k___gldraw, sizeof(__pyx_k___gldraw), 0, 0, 1, 1}, {&__pyx_n_s__angle_max, __pyx_k__angle_max, sizeof(__pyx_k__angle_max), 0, 0, 1, 1}, {&__pyx_n_s__axisx, __pyx_k__axisx, sizeof(__pyx_k__axisx), 0, 0, 1, 1}, {&__pyx_n_s__axisy, __pyx_k__axisy, sizeof(__pyx_k__axisy), 0, 0, 1, 1}, {&__pyx_n_s__axisz, __pyx_k__axisz, sizeof(__pyx_k__axisz), 0, 0, 1, 1}, {&__pyx_n_s__b, __pyx_k__b, sizeof(__pyx_k__b), 0, 0, 1, 1}, {&__pyx_n_s__blocks, __pyx_k__blocks, sizeof(__pyx_k__blocks), 0, 0, 1, 1}, {&__pyx_n_s__debug, __pyx_k__debug, sizeof(__pyx_k__debug), 0, 0, 1, 1}, {&__pyx_n_s__enumerate, __pyx_k__enumerate, sizeof(__pyx_k__enumerate), 0, 0, 1, 1}, {&__pyx_n_u__gl_delete_buffers, __pyx_k__gl_delete_buffers, sizeof(__pyx_k__gl_delete_buffers), 0, 1, 0, 1}, {&__pyx_n_u__gl_draw_cube, __pyx_k__gl_draw_cube, sizeof(__pyx_k__gl_draw_cube), 0, 1, 0, 1}, {&__pyx_n_u__gl_draw_cube_debug, __pyx_k__gl_draw_cube_debug, sizeof(__pyx_k__gl_draw_cube_debug), 0, 1, 0, 1}, {&__pyx_n_u__gl_init_buffers, __pyx_k__gl_init_buffers, sizeof(__pyx_k__gl_init_buffers), 0, 1, 0, 1}, {&__pyx_n_u__gl_pick_cube, __pyx_k__gl_pick_cube, sizeof(__pyx_k__gl_pick_cube), 0, 1, 0, 1}, {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, {&__pyx_n_s__init_module, __pyx_k__init_module, sizeof(__pyx_k__init_module), 0, 0, 1, 1}, {&__pyx_n_s__j, __pyx_k__j, sizeof(__pyx_k__j), 0, 0, 1, 1}, {&__pyx_n_s__nblocks, __pyx_k__nblocks, sizeof(__pyx_k__nblocks), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__set_transformations, __pyx_k__set_transformations, sizeof(__pyx_k__set_transformations), 0, 0, 1, 1}, {&__pyx_n_s__texnames, __pyx_k__texnames, sizeof(__pyx_k__texnames), 0, 0, 1, 1}, {&__pyx_n_s__vertexdata, __pyx_k__vertexdata, sizeof(__pyx_k__vertexdata), 0, 0, 1, 1}, {&__pyx_n_s__vertexinfo, __pyx_k__vertexinfo, sizeof(__pyx_k__vertexinfo), 0, 0, 1, 1}, {&__pyx_n_s__vertexpointers, __pyx_k__vertexpointers, sizeof(__pyx_k__vertexpointers), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "_gldraw.pyx":110 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_10); __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10)); __pyx_k_codeobj_11 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_10, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_12, __pyx_n_s__init_module, 110, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_gldraw.pyx":122 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int b,i,j #px+ * for b in range(cube.number_blocks): */ __pyx_k_tuple_13 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_13); __Pyx_INCREF(((PyObject *)__pyx_n_s__blocks)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_n_s__blocks)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__blocks)); __Pyx_INCREF(((PyObject *)__pyx_n_s__b)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 1, ((PyObject *)__pyx_n_s__b)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__b)); __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 2, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__j)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 3, ((PyObject *)__pyx_n_s__j)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__j)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13)); __pyx_k_codeobj_14 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_12, __pyx_n_s__set_transformations, 122, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_gldraw(void); /*proto*/ PyMODINIT_FUNC init_gldraw(void) #else PyMODINIT_FUNC PyInit__gldraw(void); /*proto*/ PyMODINIT_FUNC PyInit__gldraw(void) #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__gldraw(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_gldraw"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "_gldraw")) { if (unlikely(PyDict_SetItemString(modules, "_gldraw", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main__gldraw) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ if (__Pyx_ExportFunction("gl_draw_cube", (void (*)(void))__pyx_f_7_gldraw_gl_draw_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_pick_cube", (void (*)(void))__pyx_f_7_gldraw_gl_pick_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_init_buffers", (void (*)(void))__pyx_f_7_gldraw_gl_init_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_delete_buffers", (void (*)(void))__pyx_f_7_gldraw_gl_delete_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_draw_cube_debug", (void (*)(void))__pyx_f_7_gldraw_gl_draw_cube_debug, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_draw_select_debug", (void (*)(void))__pyx_f_7_gldraw_gl_draw_select_debug, "void (__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_init_object_location", (void (*)(void))__pyx_f_7_gldraw_gl_init_object_location, "void (__pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Type init code ---*/ /*--- Type import code ---*/ /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "_gldraw.pyx":29 * # This line makes cython happy * global __name__, __package__ # pylint: disable=W0604 * __compiled = True #px/ # <<<<<<<<<<<<<< * #px __compiled = False * */ __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____compiled, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_gldraw.pyx":32 * #px __compiled = False * * __all__ = ['VERTEX_ATTRIB_LOCATION', 'NORMAL_ATTRIB_LOCATION', 'COLOR_ATTRIB_LOCATION', 'TEXCOORD_ATTRIB_LOCATION', # <<<<<<<<<<<<<< * 'gl_draw_cube', 'gl_pick_cube', 'gl_init_buffers', 'gl_delete_buffers', * 'gl_draw_cube_debug', 'gl_init_object_location'] */ __pyx_t_1 = PyList_New(10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_n_u_2)); PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_u_2)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u_2)); __Pyx_INCREF(((PyObject *)__pyx_n_u_3)); PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_u_3)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u_3)); __Pyx_INCREF(((PyObject *)__pyx_n_u_4)); PyList_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_n_u_4)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u_4)); __Pyx_INCREF(((PyObject *)__pyx_n_u_5)); PyList_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_n_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u_5)); __Pyx_INCREF(((PyObject *)__pyx_n_u__gl_draw_cube)); PyList_SET_ITEM(__pyx_t_1, 4, ((PyObject *)__pyx_n_u__gl_draw_cube)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__gl_draw_cube)); __Pyx_INCREF(((PyObject *)__pyx_n_u__gl_pick_cube)); PyList_SET_ITEM(__pyx_t_1, 5, ((PyObject *)__pyx_n_u__gl_pick_cube)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__gl_pick_cube)); __Pyx_INCREF(((PyObject *)__pyx_n_u__gl_init_buffers)); PyList_SET_ITEM(__pyx_t_1, 6, ((PyObject *)__pyx_n_u__gl_init_buffers)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__gl_init_buffers)); __Pyx_INCREF(((PyObject *)__pyx_n_u__gl_delete_buffers)); PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_u__gl_delete_buffers)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__gl_delete_buffers)); __Pyx_INCREF(((PyObject *)__pyx_n_u__gl_draw_cube_debug)); PyList_SET_ITEM(__pyx_t_1, 8, ((PyObject *)__pyx_n_u__gl_draw_cube_debug)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__gl_draw_cube_debug)); __Pyx_INCREF(((PyObject *)__pyx_n_u_6)); PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_u_6)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u_6)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____all__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "_gldraw.pyx":36 * 'gl_draw_cube_debug', 'gl_init_object_location'] * * from .debug import debug # pylint: disable=W0614,W0401 # <<<<<<<<<<<<<< * * from gl cimport * #pxd/ */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_n_s__debug)); PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__debug)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__debug)); __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__debug), ((PyObject *)__pyx_t_1), 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__debug); if (__pyx_t_1 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__debug, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":44 * * * debug('Importing module:', __name__) # <<<<<<<<<<<<<< * debug(' from package:', __package__) * debug(' compiled:', __compiled) */ __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s____name__); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_7)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_7)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_gldraw.pyx":45 * * debug('Importing module:', __name__) * debug(' from package:', __package__) # <<<<<<<<<<<<<< * debug(' compiled:', __compiled) * */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s____package__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_kp_u_8)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_8)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8)); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_gldraw.pyx":46 * debug('Importing module:', __name__) * debug(' from package:', __package__) * debug(' compiled:', __compiled) # <<<<<<<<<<<<<< * * */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s____compiled); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_kp_u_9)); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_u_9)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9)); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":110 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_gldraw_1init_module, NULL, __pyx_n_s___gldraw); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__init_module, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":122 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int b,i,j #px+ * for b in range(cube.number_blocks): */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_gldraw_3set_transformations, NULL, __pyx_n_s___gldraw); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__set_transformations, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":1 * #-*- coding:utf-8 -*- # <<<<<<<<<<<<<< * # cython: profile=False * */ __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); if (__pyx_m) { __Pyx_AddTraceback("init _gldraw", __pyx_clineno, __pyx_lineno, __pyx_filename); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init _gldraw"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* CYTHON_REFNANNY */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) { if (dict != __pyx_b) { PyErr_Clear(); result = PyObject_GetAttr(__pyx_b, name); } if (!result) { PyErr_SetObject(PyExc_NameError, name); } } return result; } static double __Pyx__PyObject_AsDouble(PyObject* obj) { PyObject* float_value; #if CYTHON_COMPILING_IN_PYPY float_value = PyNumber_Float(obj); #else if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) { return PyFloat_AsDouble(obj); } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { #if PY_MAJOR_VERSION >= 3 float_value = PyFloat_FromString(obj); #else float_value = PyFloat_FromString(obj, 0); #endif } else { PyObject* args = PyTuple_New(1); if (unlikely(!args)) goto bad; PyTuple_SET_ITEM(args, 0, obj); float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); PyTuple_SET_ITEM(args, 0, 0); Py_DECREF(args); } #endif if (likely(float_value)) { double value = PyFloat_AS_DOUBLE(float_value); Py_DECREF(float_value); return value; } bad: return (double)-1; } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (Py_TYPE(obj) == type) return 1; } else { if (PyObject_TypeCheck(obj, type)) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%s' has incorrect type (expected %s, got %s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; #if PY_VERSION_HEX >= 0x02050000 { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { /* try package relative import first */ PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; /* try absolute import on failure */ } #endif if (!module) { PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); } } #else if (level>0) { PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); goto bad; } module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); #endif bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) { #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_ImportError, "cannot import name %.230s", PyString_AsString(name)); #else PyErr_Format(PyExc_ImportError, "cannot import name %S", name); #endif } static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)PyLong_AsUnsignedLong(x); } else { return (unsigned long)PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)PyLong_AsUnsignedLong(x); } else { return (long)PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (PY_LONG_LONG)PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)PyLong_AsUnsignedLong(x); } else { return (signed long)PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (signed PY_LONG_LONG)PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); #if PY_VERSION_HEX < 0x02050000 return PyErr_Warn(NULL, message); #else return PyErr_WarnEx(NULL, message, 1); #endif } return 0; } static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { PyObject *d = 0; PyObject *cobj = 0; union { void (*fp)(void); void *p; } tmp; d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); if (!d) { PyErr_Clear(); d = PyDict_New(); if (!d) goto bad; Py_INCREF(d); if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) goto bad; } tmp.fp = f; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) cobj = PyCapsule_New(tmp.p, sig, 0); #else cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); #endif if (!cobj) goto bad; if (PyDict_SetItemString(d, name, cobj) < 0) goto bad; Py_DECREF(cobj); Py_DECREF(d); return 0; bad: Py_XDECREF(cobj); Py_XDECREF(d); return -1; } static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, /*int argcount,*/ 0, /*int kwonlyargcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_globals = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ pybik-1.1/csrc/_glarea.cpp0000664000175000017500000134316612157414551015714 0ustar barccbarcc00000000000000/* Generated by Cython 0.17.4 on Sun Jun 16 22:00:40 2013 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02040000 #error Cython requires Python 2.4+. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define CYTHON_FORMAT_SSIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) #define PyNumber_Index(o) ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \ (PyErr_Format(PyExc_TypeError, \ "expected index value, got %.200s", Py_TYPE(o)->tp_name), \ (PyObject*)0)) #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \ !PyComplex_Check(o)) #define PyIndex_Check __Pyx_PyIndex_Check #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #define __PYX_BUILD_PY_SSIZE_T "i" #else #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #define __Pyx_PyIndex_Check PyIndex_Check #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE) #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE) typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6 #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_READ(k, d, i) ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_VERSION_HEX < 0x03020000 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE___glarea #define __PYX_HAVE_API___glarea #include "math.h" #include "stddef.h" #include "stdint.h" #include "GL/gl.h" #include "GL/glext.h" #include "glm/glm.hpp" #include "glm/gtx/transform.hpp" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "_glarea.pyx", }; /* "gl.pxd":5147 * # from /usr/include/GL/gl.h: * * ctypedef unsigned int GLenum # <<<<<<<<<<<<<< * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield */ typedef unsigned int __pyx_t_2gl_GLenum; /* "gl.pxd":5148 * * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean # <<<<<<<<<<<<<< * ctypedef unsigned int GLbitfield * ctypedef void GLvoid */ typedef unsigned char __pyx_t_2gl_GLboolean; /* "gl.pxd":5149 * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield # <<<<<<<<<<<<<< * ctypedef void GLvoid * ctypedef signed char GLbyte */ typedef unsigned int __pyx_t_2gl_GLbitfield; /* "gl.pxd":5151 * ctypedef unsigned int GLbitfield * ctypedef void GLvoid * ctypedef signed char GLbyte # <<<<<<<<<<<<<< * ctypedef short GLshort * ctypedef int GLint */ typedef signed char __pyx_t_2gl_GLbyte; /* "gl.pxd":5152 * ctypedef void GLvoid * ctypedef signed char GLbyte * ctypedef short GLshort # <<<<<<<<<<<<<< * ctypedef int GLint * ctypedef unsigned char GLubyte */ typedef short __pyx_t_2gl_GLshort; /* "gl.pxd":5153 * ctypedef signed char GLbyte * ctypedef short GLshort * ctypedef int GLint # <<<<<<<<<<<<<< * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort */ typedef int __pyx_t_2gl_GLint; /* "gl.pxd":5154 * ctypedef short GLshort * ctypedef int GLint * ctypedef unsigned char GLubyte # <<<<<<<<<<<<<< * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint */ typedef unsigned char __pyx_t_2gl_GLubyte; /* "gl.pxd":5155 * ctypedef int GLint * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort # <<<<<<<<<<<<<< * ctypedef unsigned int GLuint * ctypedef int GLsizei */ typedef unsigned short __pyx_t_2gl_GLushort; /* "gl.pxd":5156 * ctypedef unsigned char GLubyte * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint # <<<<<<<<<<<<<< * ctypedef int GLsizei * ctypedef float GLfloat */ typedef unsigned int __pyx_t_2gl_GLuint; /* "gl.pxd":5157 * ctypedef unsigned short GLushort * ctypedef unsigned int GLuint * ctypedef int GLsizei # <<<<<<<<<<<<<< * ctypedef float GLfloat * ctypedef float GLclampf */ typedef int __pyx_t_2gl_GLsizei; /* "gl.pxd":5158 * ctypedef unsigned int GLuint * ctypedef int GLsizei * ctypedef float GLfloat # <<<<<<<<<<<<<< * ctypedef float GLclampf * ctypedef double GLdouble */ typedef float __pyx_t_2gl_GLfloat; /* "gl.pxd":5159 * ctypedef int GLsizei * ctypedef float GLfloat * ctypedef float GLclampf # <<<<<<<<<<<<<< * ctypedef double GLdouble * ctypedef double GLclampd */ typedef float __pyx_t_2gl_GLclampf; /* "gl.pxd":5160 * ctypedef float GLfloat * ctypedef float GLclampf * ctypedef double GLdouble # <<<<<<<<<<<<<< * ctypedef double GLclampd * */ typedef double __pyx_t_2gl_GLdouble; /* "gl.pxd":5161 * ctypedef float GLclampf * ctypedef double GLdouble * ctypedef double GLclampd # <<<<<<<<<<<<<< * * */ typedef double __pyx_t_2gl_GLclampd; /* "gl.pxd":5166 * # from /usr/include/GL/glext.h: * * ctypedef char GLchar # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLintptr * ctypedef ptrdiff_t GLsizeiptr */ typedef char __pyx_t_2gl_GLchar; /* "gl.pxd":5167 * * ctypedef char GLchar * ctypedef ptrdiff_t GLintptr # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLsizeiptr * */ typedef ptrdiff_t __pyx_t_2gl_GLintptr; /* "gl.pxd":5168 * ctypedef char GLchar * ctypedef ptrdiff_t GLintptr * ctypedef ptrdiff_t GLsizeiptr # <<<<<<<<<<<<<< * * */ typedef ptrdiff_t __pyx_t_2gl_GLsizeiptr; /*--- Type declarations ---*/ /* "gl.pxd":5150 * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield * ctypedef void GLvoid # <<<<<<<<<<<<<< * ctypedef signed char GLbyte * ctypedef short GLshort */ typedef void __pyx_t_2gl_GLvoid; /* "_gldraw.pxd":4 * * from gl cimport * #line 37 * cdef enum: # #line 48 # <<<<<<<<<<<<<< * VERTEX_ATTRIB_LOCATION = 0 #line 54 * NORMAL_ATTRIB_LOCATION = 1 #line 55 */ enum { __pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION = 0, __pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION = 1, __pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION = 2, __pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION = 3 }; struct __pyx_t_7_glarea_Terrain; struct __pyx_t_7_glarea_Frustrum; struct __pyx_t_7_glarea_Program; struct __pyx_t_7_glarea_SelectionDebugPoints; /* "_glarea.pyx":59 * * * cdef struct Terrain: #px/ # <<<<<<<<<<<<<< * #px class terrain: pass # pylint: disable=W0232, C0321, R0903 * float red #px+ */ struct __pyx_t_7_glarea_Terrain { float red; float green; float blue; int width; int height; }; /* "_glarea.pyx":68 * cdef Terrain terrain #px+ * * cdef struct Frustrum: #px/ # <<<<<<<<<<<<<< * #px class frustrum: pass # pylint: disable=W0232, R0903 * float fovy_angle # field of view angle #px+ */ struct __pyx_t_7_glarea_Frustrum { float fovy_angle; float fovy_radius; float fovy_radius_zoom; double bounding_sphere_radius; int multisample; glm::mat4 modelview_matrix; glm::mat4 projection_matrix; glm::mat4 picking_matrix; }; /* "_glarea.pyx":80 * cdef Frustrum frustrum #px+ * * cdef struct Program: #px/ # <<<<<<<<<<<<<< * #px class program: pass * GLuint prog_render #px+ */ struct __pyx_t_7_glarea_Program { __pyx_t_2gl_GLuint prog_render; __pyx_t_2gl_GLuint projection_location; __pyx_t_2gl_GLuint modelview_location; __pyx_t_2gl_GLuint prog_hud; __pyx_t_2gl_GLuint prog_pick; __pyx_t_2gl_GLuint picking_location; __pyx_t_2gl_GLuint projection_pick_location; __pyx_t_2gl_GLuint modelview_pick_location; }; /* "_glarea.pyx":92 * cdef Program program #px+ * * cdef struct SelectionDebugPoints: #px/ # <<<<<<<<<<<<<< * #px class selection_debug_points: pass * float modelview1[3], modelview2[3] #px+ */ struct __pyx_t_7_glarea_SelectionDebugPoints { float modelview1[3]; float modelview2[3]; int viewport1[2]; int viewport2[2]; }; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); /*proto*/ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_List_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (PyList_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { /* inlined PySequence_GetItem() */ PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (unlikely(l < 0)) return NULL; i += l; } return m->sq_item(o, i); } } #else if (PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); #include static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name); static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename); /*proto*/ static int __Pyx_check_binary_version(void); #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #else #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #endif #endif static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); /*proto*/ typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from 'libc.math' */ /* Module declarations from 'libc.stddef' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'gl' */ /* Module declarations from 'glm' */ /* Module declarations from '_gldraw' */ static void (*__pyx_f_7_gldraw_gl_draw_cube)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_pick_cube)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_init_buffers)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_delete_buffers)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_draw_cube_debug)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_draw_select_debug)(__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint); /*proto*/ static void (*__pyx_f_7_gldraw_gl_init_object_location)(__pyx_t_2gl_GLuint); /*proto*/ /* Module declarations from '_glarea' */ static struct __pyx_t_7_glarea_Terrain __pyx_v_7_glarea_terrain; static struct __pyx_t_7_glarea_Frustrum __pyx_v_7_glarea_frustrum; static struct __pyx_t_7_glarea_Program __pyx_v_7_glarea_program; static struct __pyx_t_7_glarea_SelectionDebugPoints __pyx_v_7_glarea_selection_debug_points; static void __pyx_f_7_glarea__update_modelview_matrix_translation(void); /*proto*/ static void __pyx_f_7_glarea__set_modelview_matrix_rotation(float, float); /*proto*/ static void __pyx_f_7_glarea__update_projection_matrix(void); /*proto*/ static void __pyx_f_7_glarea__set_picking_matrix(int, int); /*proto*/ static void __pyx_f_7_glarea__set_picking_matrix_identity(void); /*proto*/ static void __pyx_f_7_glarea__gl_print_string(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_float(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_integer(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_bool(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_set_matrix(__pyx_t_2gl_GLint, glm::mat4 &); /*proto*/ static void __pyx_f_7_glarea__gl_render_pick(void); /*proto*/ static PyObject *__pyx_f_7_glarea_gl_pick_polygons(int, int, int __pyx_skip_dispatch); /*proto*/ static void __pyx_f_7_glarea__modelview_to_viewport(PyObject *, int *); /*proto*/ static void __pyx_f_7_glarea__gl_print_shader_log(__pyx_t_2gl_GLuint); /*proto*/ static void __pyx_f_7_glarea__gl_print_program_log(__pyx_t_2gl_GLuint); /*proto*/ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_compiled_shader(__pyx_t_2gl_GLenum, PyObject *); /*proto*/ static void __pyx_f_7_glarea__gl_print_program_info(__pyx_t_2gl_GLuint); /*proto*/ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_program(PyObject *, PyObject *, PyObject *); /*proto*/ #define __Pyx_MODULE_NAME "_glarea" int __pyx_module_is_main__glarea = 0; /* Implementation of '_glarea' */ static PyObject *__pyx_builtin_print; static PyObject *__pyx_builtin_range; static PyObject *__pyx_pf_7_glarea_init_module(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_2set_frustrum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_bounding_sphere_radius, PyObject *__pyx_v_zoom); /* proto */ static PyObject *__pyx_pf_7_glarea_4set_background_color(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_red, PyObject *__pyx_v_green, PyObject *__pyx_v_blue); /* proto */ static PyObject *__pyx_pf_7_glarea_6set_antialiasing(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_multisample); /* proto */ static PyObject *__pyx_pf_7_glarea_8set_rotation_xy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */ static PyObject *__pyx_pf_7_glarea_10gl_init(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_12gl_exit(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_14gl_resize(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_width, PyObject *__pyx_v_height); /* proto */ static PyObject *__pyx_pf_7_glarea_16gl_render(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_18gl_render_select_debug(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_20gl_pick_polygons(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7_glarea_22get_cursor_angle(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_point1, PyObject *__pyx_v_point2); /* proto */ static PyObject *__pyx_pf_7_glarea_24gl_create_render_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static PyObject *__pyx_pf_7_glarea_26gl_create_hud_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static PyObject *__pyx_pf_7_glarea_28gl_create_pick_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static char __pyx_k_1[] = "bounding_sphere_radius"; static char __pyx_k_2[] = "GL Strings:"; static char __pyx_k_4[] = " GL Vendor:"; static char __pyx_k_5[] = " GL Renderer:"; static char __pyx_k_6[] = " GL Version:"; static char __pyx_k_7[] = " GL Shading Language Version:"; static char __pyx_k_8[] = " GL_SAMPLE_BUFFERS:"; static char __pyx_k_9[] = " GL_SAMPLE_COVERAGE_VALUE:"; static char __pyx_k_10[] = " GL_SAMPLE_COVERAGE_INVERT:"; static char __pyx_k_11[] = " GL_SAMPLES:"; static char __pyx_k_12[] = " GL_MULTISAMPLE:"; static char __pyx_k_13[] = " GL_SAMPLE_ALPHA_TO_COVERAGE:"; static char __pyx_k_14[] = " GL_SAMPLE_COVERAGE:"; static char __pyx_k_15[] = "==== Error compiling shader:"; static char __pyx_k_17[] = "===="; static char __pyx_k_19[] = "==== Error compiling shader (no log)"; static char __pyx_k_21[] = "==== Error linking shader program:"; static char __pyx_k_24[] = "==== Error linking shader program (no log)"; static char __pyx_k_26[] = "Failed to create shader"; static char __pyx_k_28[] = "shader program info"; static char __pyx_k_29[] = "delete status"; static char __pyx_k_30[] = "link status"; static char __pyx_k_31[] = "validate status"; static char __pyx_k_32[] = "info log length"; static char __pyx_k_33[] = "attached shaders"; static char __pyx_k_34[] = "active attributes"; static char __pyx_k_35[] = "active attribute max length"; static char __pyx_k_36[] = "active uniforms"; static char __pyx_k_37[] = "active uniform max length"; static char __pyx_k_38[] = " "; static char __pyx_k_39[] = "active attributes:"; static char __pyx_k_41[] = " {}, {}: length={} size={} type={} location={}"; static char __pyx_k_42[] = "active uniforms:"; static char __pyx_k_44[] = " creating vertex shader"; static char __pyx_k_46[] = " creating fragment shader"; static char __pyx_k_48[] = "Importing module:"; static char __pyx_k_49[] = " from package:"; static char __pyx_k_50[] = " compiled:"; static char __pyx_k_51[] = " GL/GLES:"; static char __pyx_k_54[] = "/home/barcc/Projekte/pybik/trunk/build/temp.linux-x86_64-3.3/pybiklib/_glarea.pyx"; static char __pyx_k_59[] = "set_background_color"; static char __pyx_k_72[] = "gl_render_select_debug"; static char __pyx_k_77[] = "gl_create_render_program"; static char __pyx_k_80[] = "gl_create_hud_program"; static char __pyx_k_83[] = "gl_create_pick_program"; static char __pyx_k__i[] = "i"; static char __pyx_k__x[] = "x"; static char __pyx_k__y[] = "y"; static char __pyx_k__GL[] = "GL"; static char __pyx_k__red[] = "red"; static char __pyx_k__tex[] = "tex"; static char __pyx_k__blue[] = "blue"; static char __pyx_k__prog[] = "prog"; static char __pyx_k__zoom[] = "zoom"; static char __pyx_k__angle[] = "angle"; static char __pyx_k__debug[] = "debug"; static char __pyx_k__green[] = "green"; static char __pyx_k__print[] = "print"; static char __pyx_k__range[] = "range"; static char __pyx_k__width[] = "width"; static char __pyx_k__format[] = "format"; static char __pyx_k__height[] = "height"; static char __pyx_k__object[] = "object"; static char __pyx_k__point1[] = "point1"; static char __pyx_k__point2[] = "point2"; static char __pyx_k__rstrip[] = "rstrip"; static char __pyx_k___glarea[] = "_glarea"; static char __pyx_k__gl_exit[] = "gl_exit"; static char __pyx_k__gl_init[] = "gl_init"; static char __pyx_k__picking[] = "picking"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____name__[] = "__name__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__location[] = "location"; static char __pyx_k__DEBUG_MSG[] = "DEBUG_MSG"; static char __pyx_k__gl_render[] = "gl_render"; static char __pyx_k__gl_resize[] = "gl_resize"; static char __pyx_k__modelview[] = "modelview"; static char __pyx_k__DEBUG_DRAW[] = "DEBUG_DRAW"; static char __pyx_k__DEBUG_PICK[] = "DEBUG_PICK"; static char __pyx_k____compiled[] = "__compiled"; static char __pyx_k__attributes[] = "attributes"; static char __pyx_k__color_attr[] = "color_attr"; static char __pyx_k__projection[] = "projection"; static char __pyx_k__selectdata[] = "selectdata"; static char __pyx_k____package__[] = "__package__"; static char __pyx_k__init_module[] = "init_module"; static char __pyx_k__multisample[] = "multisample"; static char __pyx_k__normal_attr[] = "normal_attr"; static char __pyx_k__vertex_attr[] = "vertex_attr"; static char __pyx_k__set_frustrum[] = "set_frustrum"; static char __pyx_k__texcoord_attr[] = "texcoord_attr"; static char __pyx_k__vertex_source[] = "vertex_source"; static char __pyx_k__DEBUG_NOSHADER[] = "DEBUG_NOSHADER"; static char __pyx_k__DEBUG_NOFSHADER[] = "DEBUG_NOFSHADER"; static char __pyx_k__DEBUG_NOVSHADER[] = "DEBUG_NOVSHADER"; static char __pyx_k__fragment_source[] = "fragment_source"; static char __pyx_k__set_rotation_xy[] = "set_rotation_xy"; static char __pyx_k__get_cursor_angle[] = "get_cursor_angle"; static char __pyx_k__set_antialiasing[] = "set_antialiasing"; static PyObject *__pyx_n_s_1; static PyObject *__pyx_kp_u_10; static PyObject *__pyx_kp_u_11; static PyObject *__pyx_kp_u_12; static PyObject *__pyx_kp_u_13; static PyObject *__pyx_kp_u_14; static PyObject *__pyx_kp_u_15; static PyObject *__pyx_kp_u_17; static PyObject *__pyx_kp_u_19; static PyObject *__pyx_kp_u_2; static PyObject *__pyx_kp_u_21; static PyObject *__pyx_kp_u_24; static PyObject *__pyx_kp_u_26; static PyObject *__pyx_kp_u_28; static PyObject *__pyx_kp_u_29; static PyObject *__pyx_kp_u_30; static PyObject *__pyx_kp_u_31; static PyObject *__pyx_kp_u_32; static PyObject *__pyx_kp_u_33; static PyObject *__pyx_kp_u_34; static PyObject *__pyx_kp_u_35; static PyObject *__pyx_kp_u_36; static PyObject *__pyx_kp_u_37; static PyObject *__pyx_kp_u_38; static PyObject *__pyx_kp_u_39; static PyObject *__pyx_kp_u_4; static PyObject *__pyx_kp_u_41; static PyObject *__pyx_kp_u_42; static PyObject *__pyx_kp_u_44; static PyObject *__pyx_kp_u_46; static PyObject *__pyx_kp_u_48; static PyObject *__pyx_kp_u_49; static PyObject *__pyx_kp_u_5; static PyObject *__pyx_kp_u_50; static PyObject *__pyx_kp_u_51; static PyObject *__pyx_kp_s_54; static PyObject *__pyx_n_s_59; static PyObject *__pyx_kp_u_6; static PyObject *__pyx_kp_u_7; static PyObject *__pyx_n_s_72; static PyObject *__pyx_n_s_77; static PyObject *__pyx_kp_u_8; static PyObject *__pyx_n_s_80; static PyObject *__pyx_n_s_83; static PyObject *__pyx_kp_u_9; static PyObject *__pyx_n_s__DEBUG_DRAW; static PyObject *__pyx_n_s__DEBUG_MSG; static PyObject *__pyx_n_s__DEBUG_NOFSHADER; static PyObject *__pyx_n_s__DEBUG_NOSHADER; static PyObject *__pyx_n_s__DEBUG_NOVSHADER; static PyObject *__pyx_n_s__DEBUG_PICK; static PyObject *__pyx_n_u__GL; static PyObject *__pyx_n_s____compiled; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____name__; static PyObject *__pyx_n_s____package__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s___glarea; static PyObject *__pyx_n_s__angle; static PyObject *__pyx_n_s__attributes; static PyObject *__pyx_n_s__blue; static PyObject *__pyx_n_b__color_attr; static PyObject *__pyx_n_s__debug; static PyObject *__pyx_n_s__format; static PyObject *__pyx_n_s__fragment_source; static PyObject *__pyx_n_s__get_cursor_angle; static PyObject *__pyx_n_s__gl_exit; static PyObject *__pyx_n_s__gl_init; static PyObject *__pyx_n_s__gl_render; static PyObject *__pyx_n_s__gl_resize; static PyObject *__pyx_n_s__green; static PyObject *__pyx_n_s__height; static PyObject *__pyx_n_s__i; static PyObject *__pyx_n_s__init_module; static PyObject *__pyx_n_s__location; static PyObject *__pyx_n_s__multisample; static PyObject *__pyx_n_b__normal_attr; static PyObject *__pyx_n_s__point1; static PyObject *__pyx_n_s__point2; static PyObject *__pyx_n_s__print; static PyObject *__pyx_n_s__prog; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__red; static PyObject *__pyx_n_s__rstrip; static PyObject *__pyx_n_s__selectdata; static PyObject *__pyx_n_s__set_antialiasing; static PyObject *__pyx_n_s__set_frustrum; static PyObject *__pyx_n_s__set_rotation_xy; static PyObject *__pyx_n_b__texcoord_attr; static PyObject *__pyx_n_b__vertex_attr; static PyObject *__pyx_n_s__vertex_source; static PyObject *__pyx_n_s__width; static PyObject *__pyx_n_s__x; static PyObject *__pyx_n_s__y; static PyObject *__pyx_n_s__zoom; static PyObject *__pyx_int_0; static PyObject *__pyx_int_90; static PyObject *__pyx_int_neg_90; static PyObject *__pyx_int_360; static PyObject *__pyx_k_tuple_3; static PyObject *__pyx_k_tuple_16; static PyObject *__pyx_k_tuple_18; static PyObject *__pyx_k_tuple_20; static PyObject *__pyx_k_tuple_22; static PyObject *__pyx_k_tuple_23; static PyObject *__pyx_k_tuple_25; static PyObject *__pyx_k_tuple_27; static PyObject *__pyx_k_tuple_40; static PyObject *__pyx_k_tuple_43; static PyObject *__pyx_k_tuple_45; static PyObject *__pyx_k_tuple_47; static PyObject *__pyx_k_tuple_52; static PyObject *__pyx_k_tuple_55; static PyObject *__pyx_k_tuple_57; static PyObject *__pyx_k_tuple_60; static PyObject *__pyx_k_tuple_62; static PyObject *__pyx_k_tuple_65; static PyObject *__pyx_k_tuple_67; static PyObject *__pyx_k_tuple_70; static PyObject *__pyx_k_tuple_73; static PyObject *__pyx_k_tuple_75; static PyObject *__pyx_k_tuple_78; static PyObject *__pyx_k_tuple_81; static PyObject *__pyx_k_codeobj_53; static PyObject *__pyx_k_codeobj_56; static PyObject *__pyx_k_codeobj_58; static PyObject *__pyx_k_codeobj_61; static PyObject *__pyx_k_codeobj_63; static PyObject *__pyx_k_codeobj_64; static PyObject *__pyx_k_codeobj_66; static PyObject *__pyx_k_codeobj_68; static PyObject *__pyx_k_codeobj_69; static PyObject *__pyx_k_codeobj_71; static PyObject *__pyx_k_codeobj_74; static PyObject *__pyx_k_codeobj_76; static PyObject *__pyx_k_codeobj_79; static PyObject *__pyx_k_codeobj_82; /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_1init_module = {__Pyx_NAMESTR("init_module"), (PyCFunction)__pyx_pw_7_glarea_1init_module, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_init_module(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":100 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ static PyObject *__pyx_pf_7_glarea_init_module(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; float __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_module", 0); /* "_glarea.pyx":101 * * def init_module(): * terrain.red = 0.0 # <<<<<<<<<<<<<< * terrain.green = 0.0 * terrain.blue = 0.0 */ __pyx_v_7_glarea_terrain.red = 0.0; /* "_glarea.pyx":102 * def init_module(): * terrain.red = 0.0 * terrain.green = 0.0 # <<<<<<<<<<<<<< * terrain.blue = 0.0 * terrain.width = 1 */ __pyx_v_7_glarea_terrain.green = 0.0; /* "_glarea.pyx":103 * terrain.red = 0.0 * terrain.green = 0.0 * terrain.blue = 0.0 # <<<<<<<<<<<<<< * terrain.width = 1 * terrain.height = 1 */ __pyx_v_7_glarea_terrain.blue = 0.0; /* "_glarea.pyx":104 * terrain.green = 0.0 * terrain.blue = 0.0 * terrain.width = 1 # <<<<<<<<<<<<<< * terrain.height = 1 * */ __pyx_v_7_glarea_terrain.width = 1; /* "_glarea.pyx":105 * terrain.blue = 0.0 * terrain.width = 1 * terrain.height = 1 # <<<<<<<<<<<<<< * * frustrum.fovy_angle = 33.0 # field of view angle */ __pyx_v_7_glarea_terrain.height = 1; /* "_glarea.pyx":107 * terrain.height = 1 * * frustrum.fovy_angle = 33.0 # field of view angle # <<<<<<<<<<<<<< * frustrum.fovy_radius = 1 / tan(frustrum.fovy_angle * M_PI / 360.0) * frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. */ __pyx_v_7_glarea_frustrum.fovy_angle = 33.0; /* "_glarea.pyx":108 * * frustrum.fovy_angle = 33.0 # field of view angle * frustrum.fovy_radius = 1 / tan(frustrum.fovy_angle * M_PI / 360.0) # <<<<<<<<<<<<<< * frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. * frustrum.bounding_sphere_radius = 1. */ __pyx_t_1 = tan(((__pyx_v_7_glarea_frustrum.fovy_angle * M_PI) / 360.0)); if (unlikely(__pyx_t_1 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_7_glarea_frustrum.fovy_radius = (1.0 / __pyx_t_1); /* "_glarea.pyx":109 * frustrum.fovy_angle = 33.0 # field of view angle * frustrum.fovy_radius = 1 / tan(frustrum.fovy_angle * M_PI / 360.0) * frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. # <<<<<<<<<<<<<< * frustrum.bounding_sphere_radius = 1. * frustrum.multisample = 0 */ __pyx_t_2 = __pyx_v_7_glarea_frustrum.fovy_radius; __pyx_v_7_glarea_frustrum.fovy_radius_zoom = __pyx_t_2; /* "_glarea.pyx":110 * frustrum.fovy_radius = 1 / tan(frustrum.fovy_angle * M_PI / 360.0) * frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. * frustrum.bounding_sphere_radius = 1. # <<<<<<<<<<<<<< * frustrum.multisample = 0 * # fill modelview_matrix */ __pyx_v_7_glarea_frustrum.bounding_sphere_radius = 1.; /* "_glarea.pyx":111 * frustrum.fovy_radius_zoom = frustrum.fovy_radius # zoom == 1. * frustrum.bounding_sphere_radius = 1. * frustrum.multisample = 0 # <<<<<<<<<<<<<< * # fill modelview_matrix * frustrum.modelview_matrix = mat4(1.) */ __pyx_v_7_glarea_frustrum.multisample = 0; /* "_glarea.pyx":113 * frustrum.multisample = 0 * # fill modelview_matrix * frustrum.modelview_matrix = mat4(1.) # <<<<<<<<<<<<<< * _update_modelview_matrix_translation() * # fill projection_matrix, see doc of glFrustum */ __pyx_v_7_glarea_frustrum.modelview_matrix = glm::mat4(1.); /* "_glarea.pyx":114 * # fill modelview_matrix * frustrum.modelview_matrix = mat4(1.) * _update_modelview_matrix_translation() # <<<<<<<<<<<<<< * # fill projection_matrix, see doc of glFrustum * frustrum.projection_matrix = mat4(1.) */ __pyx_f_7_glarea__update_modelview_matrix_translation(); /* "_glarea.pyx":116 * _update_modelview_matrix_translation() * # fill projection_matrix, see doc of glFrustum * frustrum.projection_matrix = mat4(1.) # <<<<<<<<<<<<<< * frustrum.projection_matrix[2][3] = -1. * frustrum.projection_matrix[3][3] = 0. */ __pyx_v_7_glarea_frustrum.projection_matrix = glm::mat4(1.); /* "_glarea.pyx":117 * # fill projection_matrix, see doc of glFrustum * frustrum.projection_matrix = mat4(1.) * frustrum.projection_matrix[2][3] = -1. # <<<<<<<<<<<<<< * frustrum.projection_matrix[3][3] = 0. * _update_projection_matrix() */ ((__pyx_v_7_glarea_frustrum.projection_matrix[2])[3]) = -1.; /* "_glarea.pyx":118 * frustrum.projection_matrix = mat4(1.) * frustrum.projection_matrix[2][3] = -1. * frustrum.projection_matrix[3][3] = 0. # <<<<<<<<<<<<<< * _update_projection_matrix() * # fill picking_matrix */ ((__pyx_v_7_glarea_frustrum.projection_matrix[3])[3]) = 0.; /* "_glarea.pyx":119 * frustrum.projection_matrix[2][3] = -1. * frustrum.projection_matrix[3][3] = 0. * _update_projection_matrix() # <<<<<<<<<<<<<< * # fill picking_matrix * frustrum.picking_matrix = mat4(1.) */ __pyx_f_7_glarea__update_projection_matrix(); /* "_glarea.pyx":121 * _update_projection_matrix() * # fill picking_matrix * frustrum.picking_matrix = mat4(1.) # <<<<<<<<<<<<<< * * program.prog_render = 0 */ __pyx_v_7_glarea_frustrum.picking_matrix = glm::mat4(1.); /* "_glarea.pyx":123 * frustrum.picking_matrix = mat4(1.) * * program.prog_render = 0 # <<<<<<<<<<<<<< * program.prog_hud = 0 * program.prog_pick = 0 */ __pyx_v_7_glarea_program.prog_render = 0; /* "_glarea.pyx":124 * * program.prog_render = 0 * program.prog_hud = 0 # <<<<<<<<<<<<<< * program.prog_pick = 0 * */ __pyx_v_7_glarea_program.prog_hud = 0; /* "_glarea.pyx":125 * program.prog_render = 0 * program.prog_hud = 0 * program.prog_pick = 0 # <<<<<<<<<<<<<< * * cdef void _update_modelview_matrix_translation(): #px/ */ __pyx_v_7_glarea_program.prog_pick = 0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.init_module", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":127 * program.prog_pick = 0 * * cdef void _update_modelview_matrix_translation(): #px/ # <<<<<<<<<<<<<< * #px def _update_modelview_matrix_translation(): * frustrum.modelview_matrix[3][2] = -frustrum.bounding_sphere_radius * (frustrum.fovy_radius_zoom + 1.) */ static void __pyx_f_7_glarea__update_modelview_matrix_translation(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_update_modelview_matrix_translation", 0); /* "_glarea.pyx":129 * cdef void _update_modelview_matrix_translation(): #px/ * #px def _update_modelview_matrix_translation(): * frustrum.modelview_matrix[3][2] = -frustrum.bounding_sphere_radius * (frustrum.fovy_radius_zoom + 1.) # <<<<<<<<<<<<<< * * cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): #px/ */ ((__pyx_v_7_glarea_frustrum.modelview_matrix[3])[2]) = ((-__pyx_v_7_glarea_frustrum.bounding_sphere_radius) * (__pyx_v_7_glarea_frustrum.fovy_radius_zoom + 1.)); __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":131 * frustrum.modelview_matrix[3][2] = -frustrum.bounding_sphere_radius * (frustrum.fovy_radius_zoom + 1.) * * cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): #px/ # <<<<<<<<<<<<<< * #px def _set_modelview_matrix_rotation(radiansx, radiansy): * cdef vec4 *M #px+ */ static void __pyx_f_7_glarea__set_modelview_matrix_rotation(float __pyx_v_radiansx, float __pyx_v_radiansy) { glm::vec4 *__pyx_v_M; float __pyx_v_sx; float __pyx_v_sy; float __pyx_v_cx; float __pyx_v_cy; float __pyx_v_m00; float __pyx_v_m11; float __pyx_v_m12; float __pyx_v_m20; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_set_modelview_matrix_rotation", 0); /* "_glarea.pyx":137 * cdef float m00, m11, m12, m20 #px+ * * M = &frustrum.modelview_matrix[0] #px/ # <<<<<<<<<<<<<< * #px M = frustrum.modelview_matrix * */ __pyx_v_M = (&(__pyx_v_7_glarea_frustrum.modelview_matrix[0])); /* "_glarea.pyx":140 * #px M = frustrum.modelview_matrix * * sx = sin(radiansx/2) # <<<<<<<<<<<<<< * sy = sin(radiansy/2) * cx = cos(radiansx/2) */ __pyx_v_sx = sin((__pyx_v_radiansx / 2.0)); /* "_glarea.pyx":141 * * sx = sin(radiansx/2) * sy = sin(radiansy/2) # <<<<<<<<<<<<<< * cx = cos(radiansx/2) * cy = cos(radiansy/2) */ __pyx_v_sy = sin((__pyx_v_radiansy / 2.0)); /* "_glarea.pyx":142 * sx = sin(radiansx/2) * sy = sin(radiansy/2) * cx = cos(radiansx/2) # <<<<<<<<<<<<<< * cy = cos(radiansy/2) * */ __pyx_v_cx = cos((__pyx_v_radiansx / 2.0)); /* "_glarea.pyx":143 * sy = sin(radiansy/2) * cx = cos(radiansx/2) * cy = cos(radiansy/2) # <<<<<<<<<<<<<< * * m00 = 2*cx*cx - 1. */ __pyx_v_cy = cos((__pyx_v_radiansy / 2.0)); /* "_glarea.pyx":145 * cy = cos(radiansy/2) * * m00 = 2*cx*cx - 1. # <<<<<<<<<<<<<< * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy */ __pyx_v_m00 = (((2.0 * __pyx_v_cx) * __pyx_v_cx) - 1.); /* "_glarea.pyx":146 * * m00 = 2*cx*cx - 1. * m11 = 2*cy*cy - 1. # <<<<<<<<<<<<<< * m12 = 2*sy*cy * m20 = 2*sx*cx */ __pyx_v_m11 = (((2.0 * __pyx_v_cy) * __pyx_v_cy) - 1.); /* "_glarea.pyx":147 * m00 = 2*cx*cx - 1. * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy # <<<<<<<<<<<<<< * m20 = 2*sx*cx * # pylint: disable=C0321 */ __pyx_v_m12 = ((2.0 * __pyx_v_sy) * __pyx_v_cy); /* "_glarea.pyx":148 * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy * m20 = 2*sx*cx # <<<<<<<<<<<<<< * # pylint: disable=C0321 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 */ __pyx_v_m20 = ((2.0 * __pyx_v_sx) * __pyx_v_cx); /* "_glarea.pyx":150 * m20 = 2*sx*cx * # pylint: disable=C0321 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 # <<<<<<<<<<<<<< * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 */ ((__pyx_v_M[0])[0]) = __pyx_v_m00; ((__pyx_v_M[1])[0]) = 0.; ((__pyx_v_M[2])[0]) = __pyx_v_m20; /* "_glarea.pyx":151 * # pylint: disable=C0321 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 # <<<<<<<<<<<<<< * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 * # py lint: enable=C0321 */ ((__pyx_v_M[0])[1]) = (__pyx_v_m12 * __pyx_v_m20); ((__pyx_v_M[1])[1]) = __pyx_v_m11; ((__pyx_v_M[2])[1]) = ((-__pyx_v_m00) * __pyx_v_m12); /* "_glarea.pyx":152 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 # <<<<<<<<<<<<<< * # py lint: enable=C0321 * */ ((__pyx_v_M[0])[2]) = ((-__pyx_v_m11) * __pyx_v_m20); ((__pyx_v_M[1])[2]) = __pyx_v_m12; ((__pyx_v_M[2])[2]) = (__pyx_v_m00 * __pyx_v_m11); __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":155 * # py lint: enable=C0321 * * cdef void _update_projection_matrix(): #px/ # <<<<<<<<<<<<<< * #px def _update_projection_matrix(): * if terrain.width < terrain.height: */ static void __pyx_f_7_glarea__update_projection_matrix(void) { double __pyx_v_aspectx; double __pyx_v_aspecty; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_update_projection_matrix", 0); /* "_glarea.pyx":157 * cdef void _update_projection_matrix(): #px/ * #px def _update_projection_matrix(): * if terrain.width < terrain.height: # <<<<<<<<<<<<<< * aspectx = 1. * aspecty = terrain.height / terrain.width */ __pyx_t_1 = (__pyx_v_7_glarea_terrain.width < __pyx_v_7_glarea_terrain.height); if (__pyx_t_1) { /* "_glarea.pyx":158 * #px def _update_projection_matrix(): * if terrain.width < terrain.height: * aspectx = 1. # <<<<<<<<<<<<<< * aspecty = terrain.height / terrain.width * else: */ __pyx_v_aspectx = 1.; /* "_glarea.pyx":159 * if terrain.width < terrain.height: * aspectx = 1. * aspecty = terrain.height / terrain.width # <<<<<<<<<<<<<< * else: * aspectx = terrain.width / terrain.height */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_aspecty = (((double)__pyx_v_7_glarea_terrain.height) / ((double)__pyx_v_7_glarea_terrain.width)); goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":161 * aspecty = terrain.height / terrain.width * else: * aspectx = terrain.width / terrain.height # <<<<<<<<<<<<<< * aspecty = 1. * # see doc of glFrustum */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_aspectx = (((double)__pyx_v_7_glarea_terrain.width) / ((double)__pyx_v_7_glarea_terrain.height)); /* "_glarea.pyx":162 * else: * aspectx = terrain.width / terrain.height * aspecty = 1. # <<<<<<<<<<<<<< * # see doc of glFrustum * frustrum.projection_matrix[0][0] = frustrum.fovy_radius / aspectx */ __pyx_v_aspecty = 1.; } __pyx_L3:; /* "_glarea.pyx":164 * aspecty = 1. * # see doc of glFrustum * frustrum.projection_matrix[0][0] = frustrum.fovy_radius / aspectx # <<<<<<<<<<<<<< * frustrum.projection_matrix[1][1] = frustrum.fovy_radius / aspecty * frustrum.projection_matrix[2][2] = -(frustrum.fovy_radius_zoom + 1.) */ if (unlikely(__pyx_v_aspectx == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } ((__pyx_v_7_glarea_frustrum.projection_matrix[0])[0]) = (((double)__pyx_v_7_glarea_frustrum.fovy_radius) / __pyx_v_aspectx); /* "_glarea.pyx":165 * # see doc of glFrustum * frustrum.projection_matrix[0][0] = frustrum.fovy_radius / aspectx * frustrum.projection_matrix[1][1] = frustrum.fovy_radius / aspecty # <<<<<<<<<<<<<< * frustrum.projection_matrix[2][2] = -(frustrum.fovy_radius_zoom + 1.) * frustrum.projection_matrix[3][2] = -(frustrum.fovy_radius_zoom + 2. */ if (unlikely(__pyx_v_aspecty == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } ((__pyx_v_7_glarea_frustrum.projection_matrix[1])[1]) = (((double)__pyx_v_7_glarea_frustrum.fovy_radius) / __pyx_v_aspecty); /* "_glarea.pyx":166 * frustrum.projection_matrix[0][0] = frustrum.fovy_radius / aspectx * frustrum.projection_matrix[1][1] = frustrum.fovy_radius / aspecty * frustrum.projection_matrix[2][2] = -(frustrum.fovy_radius_zoom + 1.) # <<<<<<<<<<<<<< * frustrum.projection_matrix[3][2] = -(frustrum.fovy_radius_zoom + 2. * ) * frustrum.bounding_sphere_radius * frustrum.fovy_radius_zoom */ ((__pyx_v_7_glarea_frustrum.projection_matrix[2])[2]) = (-(__pyx_v_7_glarea_frustrum.fovy_radius_zoom + 1.)); /* "_glarea.pyx":167 * frustrum.projection_matrix[1][1] = frustrum.fovy_radius / aspecty * frustrum.projection_matrix[2][2] = -(frustrum.fovy_radius_zoom + 1.) * frustrum.projection_matrix[3][2] = -(frustrum.fovy_radius_zoom + 2. # <<<<<<<<<<<<<< * ) * frustrum.bounding_sphere_radius * frustrum.fovy_radius_zoom * */ ((__pyx_v_7_glarea_frustrum.projection_matrix[3])[2]) = (((-(__pyx_v_7_glarea_frustrum.fovy_radius_zoom + 2.)) * __pyx_v_7_glarea_frustrum.bounding_sphere_radius) * __pyx_v_7_glarea_frustrum.fovy_radius_zoom); goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("_glarea._update_projection_matrix", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":170 * ) * frustrum.bounding_sphere_radius * frustrum.fovy_radius_zoom * * cdef void _set_picking_matrix(int x, int y): #px/ # <<<<<<<<<<<<<< * #px def _set_picking_matrix(x, y): * # Set picking matrix, restrict drawing to one pixel of the viewport */ static void __pyx_f_7_glarea__set_picking_matrix(int __pyx_v_x, int __pyx_v_y) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_set_picking_matrix", 0); /* "_glarea.pyx":178 * # glTranslatef(terrain.width - 2*x, terrain.height - 2*y, 0.) * # glScalef(terrain.width, terrain.height, 1.0) * frustrum.picking_matrix[3][0] = terrain.width - 2*x # <<<<<<<<<<<<<< * frustrum.picking_matrix[3][1] = terrain.height - 2*y * frustrum.picking_matrix[0][0] = terrain.width */ ((__pyx_v_7_glarea_frustrum.picking_matrix[3])[0]) = (__pyx_v_7_glarea_terrain.width - (2 * __pyx_v_x)); /* "_glarea.pyx":179 * # glScalef(terrain.width, terrain.height, 1.0) * frustrum.picking_matrix[3][0] = terrain.width - 2*x * frustrum.picking_matrix[3][1] = terrain.height - 2*y # <<<<<<<<<<<<<< * frustrum.picking_matrix[0][0] = terrain.width * frustrum.picking_matrix[1][1] = terrain.height */ ((__pyx_v_7_glarea_frustrum.picking_matrix[3])[1]) = (__pyx_v_7_glarea_terrain.height - (2 * __pyx_v_y)); /* "_glarea.pyx":180 * frustrum.picking_matrix[3][0] = terrain.width - 2*x * frustrum.picking_matrix[3][1] = terrain.height - 2*y * frustrum.picking_matrix[0][0] = terrain.width # <<<<<<<<<<<<<< * frustrum.picking_matrix[1][1] = terrain.height * */ __pyx_t_1 = __pyx_v_7_glarea_terrain.width; ((__pyx_v_7_glarea_frustrum.picking_matrix[0])[0]) = __pyx_t_1; /* "_glarea.pyx":181 * frustrum.picking_matrix[3][1] = terrain.height - 2*y * frustrum.picking_matrix[0][0] = terrain.width * frustrum.picking_matrix[1][1] = terrain.height # <<<<<<<<<<<<<< * * cdef void _set_picking_matrix_identity(): #px/ */ __pyx_t_1 = __pyx_v_7_glarea_terrain.height; ((__pyx_v_7_glarea_frustrum.picking_matrix[1])[1]) = __pyx_t_1; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":183 * frustrum.picking_matrix[1][1] = terrain.height * * cdef void _set_picking_matrix_identity(): #px/ # <<<<<<<<<<<<<< * #px def _set_picking_matrix_identity(): * frustrum.picking_matrix[3][0] = 0. */ static void __pyx_f_7_glarea__set_picking_matrix_identity(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_set_picking_matrix_identity", 0); /* "_glarea.pyx":185 * cdef void _set_picking_matrix_identity(): #px/ * #px def _set_picking_matrix_identity(): * frustrum.picking_matrix[3][0] = 0. # <<<<<<<<<<<<<< * frustrum.picking_matrix[3][1] = 0. * frustrum.picking_matrix[0][0] = 1. */ ((__pyx_v_7_glarea_frustrum.picking_matrix[3])[0]) = 0.; /* "_glarea.pyx":186 * #px def _set_picking_matrix_identity(): * frustrum.picking_matrix[3][0] = 0. * frustrum.picking_matrix[3][1] = 0. # <<<<<<<<<<<<<< * frustrum.picking_matrix[0][0] = 1. * frustrum.picking_matrix[1][1] = 1. */ ((__pyx_v_7_glarea_frustrum.picking_matrix[3])[1]) = 0.; /* "_glarea.pyx":187 * frustrum.picking_matrix[3][0] = 0. * frustrum.picking_matrix[3][1] = 0. * frustrum.picking_matrix[0][0] = 1. # <<<<<<<<<<<<<< * frustrum.picking_matrix[1][1] = 1. * */ ((__pyx_v_7_glarea_frustrum.picking_matrix[0])[0]) = 1.; /* "_glarea.pyx":188 * frustrum.picking_matrix[3][1] = 0. * frustrum.picking_matrix[0][0] = 1. * frustrum.picking_matrix[1][1] = 1. # <<<<<<<<<<<<<< * * def set_frustrum(bounding_sphere_radius, zoom): */ ((__pyx_v_7_glarea_frustrum.picking_matrix[1])[1]) = 1.; __Pyx_RefNannyFinishContext(); } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_3set_frustrum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_3set_frustrum = {__Pyx_NAMESTR("set_frustrum"), (PyCFunction)__pyx_pw_7_glarea_3set_frustrum, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_3set_frustrum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_bounding_sphere_radius = 0; PyObject *__pyx_v_zoom = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_frustrum (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_1,&__pyx_n_s__zoom,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_1)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__zoom)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_frustrum", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_frustrum") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_bounding_sphere_radius = values[0]; __pyx_v_zoom = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_frustrum", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_frustrum", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_2set_frustrum(__pyx_self, __pyx_v_bounding_sphere_radius, __pyx_v_zoom); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":190 * frustrum.picking_matrix[1][1] = 1. * * def set_frustrum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * frustrum.bounding_sphere_radius = bounding_sphere_radius * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom */ static PyObject *__pyx_pf_7_glarea_2set_frustrum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_bounding_sphere_radius, PyObject *__pyx_v_zoom) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; float __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_frustrum", 0); /* "_glarea.pyx":191 * * def set_frustrum(bounding_sphere_radius, zoom): * frustrum.bounding_sphere_radius = bounding_sphere_radius # <<<<<<<<<<<<<< * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom * _update_modelview_matrix_translation() */ __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_bounding_sphere_radius); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_frustrum.bounding_sphere_radius = __pyx_t_1; /* "_glarea.pyx":192 * def set_frustrum(bounding_sphere_radius, zoom): * frustrum.bounding_sphere_radius = bounding_sphere_radius * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom # <<<<<<<<<<<<<< * _update_modelview_matrix_translation() * _update_projection_matrix() */ __pyx_t_2 = PyFloat_FromDouble(__pyx_v_7_glarea_frustrum.fovy_radius); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_2, __pyx_v_zoom); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_7_glarea_frustrum.fovy_radius_zoom = __pyx_t_4; /* "_glarea.pyx":193 * frustrum.bounding_sphere_radius = bounding_sphere_radius * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom * _update_modelview_matrix_translation() # <<<<<<<<<<<<<< * _update_projection_matrix() * */ __pyx_f_7_glarea__update_modelview_matrix_translation(); /* "_glarea.pyx":194 * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom * _update_modelview_matrix_translation() * _update_projection_matrix() # <<<<<<<<<<<<<< * * def set_background_color(red, green, blue): */ __pyx_f_7_glarea__update_projection_matrix(); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("_glarea.set_frustrum", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_5set_background_color(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_5set_background_color = {__Pyx_NAMESTR("set_background_color"), (PyCFunction)__pyx_pw_7_glarea_5set_background_color, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_5set_background_color(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_red = 0; PyObject *__pyx_v_green = 0; PyObject *__pyx_v_blue = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_background_color (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__red,&__pyx_n_s__green,&__pyx_n_s__blue,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__red)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__green)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__blue)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_background_color") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_red = values[0]; __pyx_v_green = values[1]; __pyx_v_blue = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_background_color", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_4set_background_color(__pyx_self, __pyx_v_red, __pyx_v_green, __pyx_v_blue); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":196 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ static PyObject *__pyx_pf_7_glarea_4set_background_color(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_red, PyObject *__pyx_v_green, PyObject *__pyx_v_blue) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_background_color", 0); /* "_glarea.pyx":197 * * def set_background_color(red, green, blue): * terrain.red = red # <<<<<<<<<<<<<< * terrain.green = green * terrain.blue = blue */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_red); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.red = __pyx_t_1; /* "_glarea.pyx":198 * def set_background_color(red, green, blue): * terrain.red = red * terrain.green = green # <<<<<<<<<<<<<< * terrain.blue = blue * */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_green); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.green = __pyx_t_1; /* "_glarea.pyx":199 * terrain.red = red * terrain.green = green * terrain.blue = blue # <<<<<<<<<<<<<< * * def set_antialiasing(multisample): */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_blue); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.blue = __pyx_t_1; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.set_background_color", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_7set_antialiasing(PyObject *__pyx_self, PyObject *__pyx_v_multisample); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_7set_antialiasing = {__Pyx_NAMESTR("set_antialiasing"), (PyCFunction)__pyx_pw_7_glarea_7set_antialiasing, METH_O, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_7set_antialiasing(PyObject *__pyx_self, PyObject *__pyx_v_multisample) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_antialiasing (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_6set_antialiasing(__pyx_self, ((PyObject *)__pyx_v_multisample)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":201 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustrum.multisample = multisample * */ static PyObject *__pyx_pf_7_glarea_6set_antialiasing(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_multisample) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_antialiasing", 0); /* "_glarea.pyx":202 * * def set_antialiasing(multisample): * frustrum.multisample = multisample # <<<<<<<<<<<<<< * * def set_rotation_xy(x, y): */ __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_multisample); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_frustrum.multisample = __pyx_t_1; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.set_antialiasing", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_9set_rotation_xy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_9set_rotation_xy = {__Pyx_NAMESTR("set_rotation_xy"), (PyCFunction)__pyx_pw_7_glarea_9set_rotation_xy, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_9set_rotation_xy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_x = 0; PyObject *__pyx_v_y = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_rotation_xy (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_rotation_xy", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_rotation_xy") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = values[0]; __pyx_v_y = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_rotation_xy", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_rotation_xy", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_8set_rotation_xy(__pyx_self, __pyx_v_x, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":204 * frustrum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ static PyObject *__pyx_pf_7_glarea_8set_rotation_xy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; float __pyx_t_5; float __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_rotation_xy", 0); __Pyx_INCREF(__pyx_v_x); __Pyx_INCREF(__pyx_v_y); /* "_glarea.pyx":205 * * def set_rotation_xy(x, y): * x %= 360 # <<<<<<<<<<<<<< * # pylint: disable=C0321 * if y < -90: y = -90 */ __pyx_t_1 = PyNumber_InPlaceRemainder(__pyx_v_x, __pyx_int_360); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_v_x); __pyx_v_x = __pyx_t_1; __pyx_t_1 = 0; /* "_glarea.pyx":207 * x %= 360 * # pylint: disable=C0321 * if y < -90: y = -90 # <<<<<<<<<<<<<< * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_y, __pyx_int_neg_90, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { __Pyx_INCREF(__pyx_int_neg_90); __Pyx_DECREF(__pyx_v_y); __pyx_v_y = __pyx_int_neg_90; goto __pyx_L3; } /* "_glarea.pyx":208 * # pylint: disable=C0321 * if y < -90: y = -90 * elif y > 90: y = 90 # <<<<<<<<<<<<<< * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) * return x, y */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_y, __pyx_int_90, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { __Pyx_INCREF(__pyx_int_90); __Pyx_DECREF(__pyx_v_y); __pyx_v_y = __pyx_int_90; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":209 * if y < -90: y = -90 * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) # <<<<<<<<<<<<<< * return x, y * */ __pyx_t_1 = PyFloat_FromDouble(M_PI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_v_x); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyFloat_FromDouble(180.0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyNumber_Divide(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(M_PI); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyNumber_Multiply(__pyx_t_4, __pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(180.0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __pyx_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_6 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_f_7_glarea__set_modelview_matrix_rotation(__pyx_t_5, __pyx_t_6); /* "_glarea.pyx":210 * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) * return x, y # <<<<<<<<<<<<<< * * ### GL state */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_x); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_x); __Pyx_GIVEREF(__pyx_v_x); __Pyx_INCREF(__pyx_v_y); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_y); __Pyx_GIVEREF(__pyx_v_y); __pyx_r = ((PyObject *)__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.set_rotation_xy", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_x); __Pyx_XDECREF(__pyx_v_y); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":214 * ### GL state * * cdef void _gl_print_string(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_string(msg, name): * print(msg, glGetString(name)) #px/ */ static void __pyx_f_7_glarea__gl_print_string(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_string", 0); /* "_glarea.pyx":216 * cdef void _gl_print_string(msg, GLenum name): #px/ * #px def _gl_print_string(msg, name): * print(msg, glGetString(name)) #px/ # <<<<<<<<<<<<<< * #px print(msg, glGetString(name)) * */ __pyx_t_1 = PyBytes_FromString(((char *)glGetString(__pyx_v_name))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_1)); __Pyx_GIVEREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_string", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":219 * #px print(msg, glGetString(name)) * * cdef void _gl_print_float(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_float(msg, name): * cdef GLfloat i #px+ */ static void __pyx_f_7_glarea__gl_print_float(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLfloat __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_float", 0); /* "_glarea.pyx":222 * #px def _gl_print_float(msg, name): * cdef GLfloat i #px+ * glGetFloatv(name, &i) #px/ # <<<<<<<<<<<<<< * #px i = glGetFloatv(name) * print(msg, i) */ glGetFloatv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":224 * glGetFloatv(name, &i) #px/ * #px i = glGetFloatv(name) * print(msg, i) # <<<<<<<<<<<<<< * * cdef void _gl_print_integer(msg, GLenum name): #px/ */ __pyx_t_1 = PyFloat_FromDouble(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_float", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":226 * print(msg, i) * * cdef void _gl_print_integer(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_integer(msg, name): * cdef GLint i #px+ */ static void __pyx_f_7_glarea__gl_print_integer(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLint __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_integer", 0); /* "_glarea.pyx":229 * #px def _gl_print_integer(msg, name): * cdef GLint i #px+ * glGetIntegerv(name, &i) #px/ # <<<<<<<<<<<<<< * #px i = glGetIntegerv(name) * print(msg, i) */ glGetIntegerv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":231 * glGetIntegerv(name, &i) #px/ * #px i = glGetIntegerv(name) * print(msg, i) # <<<<<<<<<<<<<< * * cdef void _gl_print_bool(msg, GLenum name): #px/ */ __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_integer", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":233 * print(msg, i) * * cdef void _gl_print_bool(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_bool(msg, name): * cdef GLboolean i #px+ */ static void __pyx_f_7_glarea__gl_print_bool(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLboolean __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_bool", 0); /* "_glarea.pyx":236 * #px def _gl_print_bool(msg, name): * cdef GLboolean i #px+ * glGetBooleanv(name, &i) #px/ # <<<<<<<<<<<<<< * #px i = glGetBooleanv(name) * print(msg, i) */ glGetBooleanv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":238 * glGetBooleanv(name, &i) #px/ * #px i = glGetBooleanv(name) * print(msg, i) # <<<<<<<<<<<<<< * * def gl_init(): */ __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_bool", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_11gl_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_11gl_init = {__Pyx_NAMESTR("gl_init"), (PyCFunction)__pyx_pw_7_glarea_11gl_init, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_11gl_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_10gl_init(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":240 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ static PyObject *__pyx_pf_7_glarea_10gl_init(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_init", 0); /* "_glarea.pyx":241 * * def gl_init(): * if DEBUG_MSG: # <<<<<<<<<<<<<< * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_MSG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":242 * def gl_init(): * if DEBUG_MSG: * print('GL Strings:') # <<<<<<<<<<<<<< * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) */ __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":243 * if DEBUG_MSG: * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) # <<<<<<<<<<<<<< * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_4); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_string(__pyx_t_1, GL_VENDOR); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":244 * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) # <<<<<<<<<<<<<< * _gl_print_string(' GL Version:', GL_VERSION) * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_5); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_string(__pyx_t_1, GL_RENDERER); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":245 * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) # <<<<<<<<<<<<<< * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_6); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_string(__pyx_t_1, GL_VERSION); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":246 * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) # <<<<<<<<<<<<<< * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_7); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_string(__pyx_t_1, GL_SHADING_LANGUAGE_VERSION); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":248 * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) # <<<<<<<<<<<<<< * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_8); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_integer(__pyx_t_1, GL_SAMPLE_BUFFERS); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":249 * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) # <<<<<<<<<<<<<< * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_9); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_float(__pyx_t_1, GL_SAMPLE_COVERAGE_VALUE); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":250 * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) # <<<<<<<<<<<<<< * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) * IF SOURCEGLVERSION == 'GL': #px/ */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_10); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_bool(__pyx_t_1, GL_SAMPLE_COVERAGE_INVERT); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":251 * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: */ __pyx_t_1 = ((PyObject *)__pyx_kp_u_11); __Pyx_INCREF(__pyx_t_1); __pyx_f_7_glarea__gl_print_integer(__pyx_t_1, GL_SAMPLES); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":254 * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: * print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) # <<<<<<<<<<<<<< * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) */ __pyx_t_1 = PyInt_FromLong(glIsEnabled(GL_MULTISAMPLE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_12)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_12)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_12)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":255 * #px if True: * print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) # <<<<<<<<<<<<<< * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) */ __pyx_t_1 = PyInt_FromLong(glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_13)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_13)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":257 * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) # <<<<<<<<<<<<<< * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) */ __pyx_t_1 = PyInt_FromLong(glIsEnabled(GL_SAMPLE_COVERAGE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_14)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_14)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_14)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":258 * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) * glClearColor(0., 0., 0., 1.) # <<<<<<<<<<<<<< * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up */ glClearColor(0., 0., 0., 1.); /* "_glarea.pyx":259 * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up * glCullFace(GL_BACK) */ glEnable(GL_DEPTH_TEST); /* "_glarea.pyx":260 * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up # <<<<<<<<<<<<<< * glCullFace(GL_BACK) * glFrontFace(GL_CCW) */ glEnable(GL_CULL_FACE); /* "_glarea.pyx":261 * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up * glCullFace(GL_BACK) # <<<<<<<<<<<<<< * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ glCullFace(GL_BACK); /* "_glarea.pyx":262 * glEnable(GL_CULL_FACE) # Rasterise only the exterior faces, to speed things up * glCullFace(GL_BACK) * glFrontFace(GL_CCW) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_init_buffers() */ glFrontFace(GL_CCW); /* "_glarea.pyx":263 * glCullFace(GL_BACK) * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_init_buffers() * */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":264 * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_init_buffers() # <<<<<<<<<<<<<< * * def gl_exit(): */ __pyx_f_7_gldraw_gl_init_buffers(); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("_glarea.gl_init", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_13gl_exit(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_13gl_exit = {__Pyx_NAMESTR("gl_exit"), (PyCFunction)__pyx_pw_7_glarea_13gl_exit, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_13gl_exit(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_exit (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_12gl_exit(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":266 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ static PyObject *__pyx_pf_7_glarea_12gl_exit(CYTHON_UNUSED PyObject *__pyx_self) { __pyx_t_2gl_GLuint __pyx_v_prog; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; __pyx_t_2gl_GLuint __pyx_t_6; int __pyx_t_7; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_exit", 0); /* "_glarea.pyx":267 * * def gl_exit(): * gl_delete_buffers() # <<<<<<<<<<<<<< * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: */ __pyx_f_7_gldraw_gl_delete_buffers(); /* "_glarea.pyx":269 * gl_delete_buffers() * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: # <<<<<<<<<<<<<< * if prog > 0: * glDeleteProgram(prog) */ __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_7_glarea_program.prog_render); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_7_glarea_program.prog_hud); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyLong_FromUnsignedLong(__pyx_v_7_glarea_program.prog_pick); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyList_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = ((PyObject *)__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; for (;;) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __pyx_t_6 = __Pyx_PyInt_AsUnsignedInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_prog = __pyx_t_6; /* "_glarea.pyx":270 * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: * if prog > 0: # <<<<<<<<<<<<<< * glDeleteProgram(prog) * program.prog_render = 0 */ __pyx_t_7 = (__pyx_v_prog > 0); if (__pyx_t_7) { /* "_glarea.pyx":271 * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: * if prog > 0: * glDeleteProgram(prog) # <<<<<<<<<<<<<< * program.prog_render = 0 * program.prog_hud = 0 */ glDeleteProgram(__pyx_v_prog); goto __pyx_L5; } __pyx_L5:; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":272 * if prog > 0: * glDeleteProgram(prog) * program.prog_render = 0 # <<<<<<<<<<<<<< * program.prog_hud = 0 * program.prog_pick = 0 */ __pyx_v_7_glarea_program.prog_render = 0; /* "_glarea.pyx":273 * glDeleteProgram(prog) * program.prog_render = 0 * program.prog_hud = 0 # <<<<<<<<<<<<<< * program.prog_pick = 0 * */ __pyx_v_7_glarea_program.prog_hud = 0; /* "_glarea.pyx":274 * program.prog_render = 0 * program.prog_hud = 0 * program.prog_pick = 0 # <<<<<<<<<<<<<< * * def gl_resize(width, height): */ __pyx_v_7_glarea_program.prog_pick = 0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_exit", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_15gl_resize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_15gl_resize = {__Pyx_NAMESTR("gl_resize"), (PyCFunction)__pyx_pw_7_glarea_15gl_resize, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_15gl_resize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_width = 0; PyObject *__pyx_v_height = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_resize (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__width,&__pyx_n_s__height,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__width)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__height)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_resize", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_resize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_width = values[0]; __pyx_v_height = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_resize", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_resize", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_14gl_resize(__pyx_self, __pyx_v_width, __pyx_v_height); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":276 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ static PyObject *__pyx_pf_7_glarea_14gl_resize(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_width, PyObject *__pyx_v_height) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_resize", 0); /* "_glarea.pyx":277 * * def gl_resize(width, height): * terrain.width = width # <<<<<<<<<<<<<< * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) */ __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_width); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.width = __pyx_t_1; /* "_glarea.pyx":278 * def gl_resize(width, height): * terrain.width = width * terrain.height = height # <<<<<<<<<<<<<< * glViewport(0, 0, terrain.width, terrain.height) * _update_projection_matrix() */ __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_height); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.height = __pyx_t_1; /* "_glarea.pyx":279 * terrain.width = width * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) # <<<<<<<<<<<<<< * _update_projection_matrix() * */ glViewport(0, 0, __pyx_v_7_glarea_terrain.width, __pyx_v_7_glarea_terrain.height); /* "_glarea.pyx":280 * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) * _update_projection_matrix() # <<<<<<<<<<<<<< * * ### render functions */ __pyx_f_7_glarea__update_projection_matrix(); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.gl_resize", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":284 * ### render functions * * cdef void _gl_set_matrix(GLint location, mat4 &matrix): #px/ # <<<<<<<<<<<<<< * #px def _gl_set_matrix(location, matrix): * glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) #px/ */ static void __pyx_f_7_glarea__gl_set_matrix(__pyx_t_2gl_GLint __pyx_v_location, glm::mat4 &__pyx_v_matrix) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_gl_set_matrix", 0); /* "_glarea.pyx":286 * cdef void _gl_set_matrix(GLint location, mat4 &matrix): #px/ * #px def _gl_set_matrix(location, matrix): * glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #px glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * */ glUniformMatrix4fv(__pyx_v_location, 1, GL_FALSE, (&((__pyx_v_matrix[0])[0]))); __Pyx_RefNannyFinishContext(); } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_17gl_render(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_17gl_render = {__Pyx_NAMESTR("gl_render"), (PyCFunction)__pyx_pw_7_glarea_17gl_render, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_17gl_render(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_render (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_16gl_render(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":289 * #px glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ static PyObject *__pyx_pf_7_glarea_16gl_render(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_render", 0); /* "_glarea.pyx":290 * * def gl_render(): * if DEBUG_PICK: # <<<<<<<<<<<<<< * _set_picking_matrix_identity() * _gl_render_pick() */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_PICK); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":291 * def gl_render(): * if DEBUG_PICK: * _set_picking_matrix_identity() # <<<<<<<<<<<<<< * _gl_render_pick() * else: */ __pyx_f_7_glarea__set_picking_matrix_identity(); /* "_glarea.pyx":292 * if DEBUG_PICK: * _set_picking_matrix_identity() * _gl_render_pick() # <<<<<<<<<<<<<< * else: * glUseProgram(program.prog_render) */ __pyx_f_7_glarea__gl_render_pick(); goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":294 * _gl_render_pick() * else: * glUseProgram(program.prog_render) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: */ glUseProgram(__pyx_v_7_glarea_program.prog_render); /* "_glarea.pyx":297 * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: * if frustrum.multisample: # <<<<<<<<<<<<<< * glEnable(GL_MULTISAMPLE) * else: */ if (__pyx_v_7_glarea_frustrum.multisample) { /* "_glarea.pyx":298 * #px if True: * if frustrum.multisample: * glEnable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * else: * glDisable(GL_MULTISAMPLE) */ glEnable(GL_MULTISAMPLE); goto __pyx_L4; } /*else*/ { /* "_glarea.pyx":300 * glEnable(GL_MULTISAMPLE) * else: * glDisable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustrum.projection_matrix) */ glDisable(GL_MULTISAMPLE); } __pyx_L4:; /* "_glarea.pyx":301 * else: * glDisable(GL_MULTISAMPLE) * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) # <<<<<<<<<<<<<< * _gl_set_matrix(program.projection_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) */ glClearColor(__pyx_v_7_glarea_terrain.red, __pyx_v_7_glarea_terrain.green, __pyx_v_7_glarea_terrain.blue, 1.); /* "_glarea.pyx":302 * glDisable(GL_MULTISAMPLE) * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustrum.projection_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.projection_location, __pyx_v_7_glarea_frustrum.projection_matrix); /* "_glarea.pyx":303 * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.modelview_location, __pyx_v_7_glarea_frustrum.modelview_matrix); /* "_glarea.pyx":304 * _gl_set_matrix(program.projection_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_draw_cube() * if DEBUG_DRAW: */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":305 * _gl_set_matrix(program.modelview_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() # <<<<<<<<<<<<<< * if DEBUG_DRAW: * gl_draw_cube_debug() */ __pyx_f_7_gldraw_gl_draw_cube(); } __pyx_L3:; /* "_glarea.pyx":306 * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() * if DEBUG_DRAW: # <<<<<<<<<<<<<< * gl_draw_cube_debug() * */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_DRAW); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":307 * gl_draw_cube() * if DEBUG_DRAW: * gl_draw_cube_debug() # <<<<<<<<<<<<<< * * def gl_render_select_debug(): */ __pyx_f_7_gldraw_gl_draw_cube_debug(); goto __pyx_L5; } __pyx_L5:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_glarea.gl_render", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_19gl_render_select_debug(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_19gl_render_select_debug = {__Pyx_NAMESTR("gl_render_select_debug"), (PyCFunction)__pyx_pw_7_glarea_19gl_render_select_debug, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_19gl_render_select_debug(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_render_select_debug (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_18gl_render_select_debug(__pyx_self); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":309 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px+ * selectdata[0] = selection_debug_points.modelview1[0] */ static PyObject *__pyx_pf_7_glarea_18gl_render_select_debug(CYTHON_UNUSED PyObject *__pyx_self) { __pyx_t_2gl_GLfloat __pyx_v_selectdata[12]; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_render_select_debug", 0); /* "_glarea.pyx":311 * def gl_render_select_debug(): * cdef GLfloat selectdata[12] #px+ * selectdata[0] = selection_debug_points.modelview1[0] # <<<<<<<<<<<<<< * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] */ (__pyx_v_selectdata[0]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[0]); /* "_glarea.pyx":312 * cdef GLfloat selectdata[12] #px+ * selectdata[0] = selection_debug_points.modelview1[0] * selectdata[1] = selection_debug_points.modelview1[1] # <<<<<<<<<<<<<< * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] */ (__pyx_v_selectdata[1]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[1]); /* "_glarea.pyx":313 * selectdata[0] = selection_debug_points.modelview1[0] * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] # <<<<<<<<<<<<<< * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] */ (__pyx_v_selectdata[2]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[2]); /* "_glarea.pyx":314 * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] # <<<<<<<<<<<<<< * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] */ (__pyx_v_selectdata[3]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[0]); /* "_glarea.pyx":315 * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] # <<<<<<<<<<<<<< * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 */ (__pyx_v_selectdata[4]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[1]); /* "_glarea.pyx":316 * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] # <<<<<<<<<<<<<< * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 */ (__pyx_v_selectdata[5]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[2]); /* "_glarea.pyx":317 * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 # <<<<<<<<<<<<<< * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[6]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport1[0])) / ((double)__pyx_v_7_glarea_terrain.width)) * 2.0) - 1.0); /* "_glarea.pyx":318 * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 # <<<<<<<<<<<<<< * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[7]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport1[1])) / ((double)__pyx_v_7_glarea_terrain.height)) * 2.0) - 1.0); /* "_glarea.pyx":319 * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 # <<<<<<<<<<<<<< * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 */ (__pyx_v_selectdata[8]) = 0.0; /* "_glarea.pyx":320 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 # <<<<<<<<<<<<<< * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[9]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport2[0])) / ((double)__pyx_v_7_glarea_terrain.width)) * 2.0) - 1.0); /* "_glarea.pyx":321 * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 # <<<<<<<<<<<<<< * selectdata[11] = 0 * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[10]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport2[1])) / ((double)__pyx_v_7_glarea_terrain.height)) * 2.0) - 1.0); /* "_glarea.pyx":322 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 # <<<<<<<<<<<<<< * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ * #px gl_draw_select_debug(selectdata, sizeof(selectdata), program.prog_hud) */ (__pyx_v_selectdata[11]) = 0.0; /* "_glarea.pyx":323 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ # <<<<<<<<<<<<<< * #px gl_draw_select_debug(selectdata, sizeof(selectdata), program.prog_hud) * */ __pyx_f_7_gldraw_gl_draw_select_debug((&(__pyx_v_selectdata[0])), (sizeof(__pyx_v_selectdata)), __pyx_v_7_glarea_program.prog_hud); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.gl_render_select_debug", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":329 * ### picking functions * * cdef void _gl_render_pick(): #px/ # <<<<<<<<<<<<<< * #px def _gl_render_pick(): * glUseProgram(program.prog_pick) */ static void __pyx_f_7_glarea__gl_render_pick(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_gl_render_pick", 0); /* "_glarea.pyx":331 * cdef void _gl_render_pick(): #px/ * #px def _gl_render_pick(): * glUseProgram(program.prog_pick) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: */ glUseProgram(__pyx_v_7_glarea_program.prog_pick); /* "_glarea.pyx":334 * IF SOURCEGLVERSION == 'GL': #px/ * #px if True: * glDisable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustrum.picking_matrix) */ glDisable(GL_MULTISAMPLE); /* "_glarea.pyx":335 * #px if True: * glDisable(GL_MULTISAMPLE) * glClearColor(0., 0., 0., 1.) # <<<<<<<<<<<<<< * _gl_set_matrix(program.picking_location, frustrum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) */ glClearColor(0., 0., 0., 1.); /* "_glarea.pyx":336 * glDisable(GL_MULTISAMPLE) * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustrum.picking_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.picking_location, __pyx_v_7_glarea_frustrum.picking_matrix); /* "_glarea.pyx":337 * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustrum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.projection_pick_location, __pyx_v_7_glarea_frustrum.projection_matrix); /* "_glarea.pyx":338 * _gl_set_matrix(program.picking_location, frustrum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_pick_cube() */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.modelview_pick_location, __pyx_v_7_glarea_frustrum.modelview_matrix); /* "_glarea.pyx":339 * _gl_set_matrix(program.projection_pick_location, frustrum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_pick_cube() * */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":340 * _gl_set_matrix(program.modelview_pick_location, frustrum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_pick_cube() # <<<<<<<<<<<<<< * * cpdef gl_pick_polygons(int x, int y): #px/ */ __pyx_f_7_gldraw_gl_pick_cube(); __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":342 * gl_pick_cube() * * cpdef gl_pick_polygons(int x, int y): #px/ # <<<<<<<<<<<<<< * #px def gl_pick_polygons(x, y): * cdef unsigned char pixel[3] #px+ */ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_glarea_gl_pick_polygons(int __pyx_v_x, int __pyx_v_y, CYTHON_UNUSED int __pyx_skip_dispatch) { unsigned char __pyx_v_pixel[3]; long __pyx_v_index; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_pick_polygons", 0); /* "_glarea.pyx":346 * cdef unsigned char pixel[3] #px+ * * if not (0 <= x < terrain.width and 0 <= y < terrain.height): # <<<<<<<<<<<<<< * return 0 * _set_picking_matrix(x, y) */ __pyx_t_1 = (0 <= __pyx_v_x); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_x < __pyx_v_7_glarea_terrain.width); } if (__pyx_t_1) { __pyx_t_2 = (0 <= __pyx_v_y); if (__pyx_t_2) { __pyx_t_2 = (__pyx_v_y < __pyx_v_7_glarea_terrain.height); } __pyx_t_3 = __pyx_t_2; } else { __pyx_t_3 = __pyx_t_1; } __pyx_t_1 = (!__pyx_t_3); if (__pyx_t_1) { /* "_glarea.pyx":347 * * if not (0 <= x < terrain.width and 0 <= y < terrain.height): * return 0 # <<<<<<<<<<<<<< * _set_picking_matrix(x, y) * _gl_render_pick() */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_int_0); __pyx_r = __pyx_int_0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":348 * if not (0 <= x < terrain.width and 0 <= y < terrain.height): * return 0 * _set_picking_matrix(x, y) # <<<<<<<<<<<<<< * _gl_render_pick() * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ */ __pyx_f_7_glarea__set_picking_matrix(__pyx_v_x, __pyx_v_y); /* "_glarea.pyx":349 * return 0 * _set_picking_matrix(x, y) * _gl_render_pick() # <<<<<<<<<<<<<< * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ * #px pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] */ __pyx_f_7_glarea__gl_render_pick(); /* "_glarea.pyx":350 * _set_picking_matrix(x, y) * _gl_render_pick() * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ # <<<<<<<<<<<<<< * #px pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 */ glReadPixels(__pyx_v_x, __pyx_v_y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, __pyx_v_pixel); /* "_glarea.pyx":352 * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ * #px pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 # <<<<<<<<<<<<<< * return index * */ __pyx_v_index = ((((__pyx_v_pixel[0]) << 4) | (__pyx_v_pixel[1])) | ((__pyx_v_pixel[2]) >> 4)); /* "_glarea.pyx":353 * #px pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 * return index # <<<<<<<<<<<<<< * * cdef void _modelview_to_viewport(vvect, int *mvect): #px/ */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = PyInt_FromLong(__pyx_v_index); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_x; int __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_pick_polygons (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_pick_polygons", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_pick_polygons") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_x == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_y == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_pick_polygons", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_20gl_pick_polygons(__pyx_self, __pyx_v_x, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":342 * gl_pick_cube() * * cpdef gl_pick_polygons(int x, int y): #px/ # <<<<<<<<<<<<<< * #px def gl_pick_polygons(x, y): * cdef unsigned char pixel[3] #px+ */ static PyObject *__pyx_pf_7_glarea_20gl_pick_polygons(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_pick_polygons", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_glarea_gl_pick_polygons(__pyx_v_x, __pyx_v_y, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":355 * return index * * cdef void _modelview_to_viewport(vvect, int *mvect): #px/ # <<<<<<<<<<<<<< * #px def _modelview_to_viewport(vvect, mvect): * cdef vec4 *M #px+ */ static void __pyx_f_7_glarea__modelview_to_viewport(PyObject *__pyx_v_vvect, int *__pyx_v_mvect) { glm::vec4 *__pyx_v_M; glm::vec4 *__pyx_v_P; float __pyx_v_u0; float __pyx_v_u1; float __pyx_v_u2; float __pyx_v_v0; float __pyx_v_v1; float __pyx_v_v3; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; float __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_modelview_to_viewport", 0); /* "_glarea.pyx":361 * cdef float u0, u1, u2, v0, v1, v3 #px+ * * M = &frustrum.modelview_matrix[0] #px/ # <<<<<<<<<<<<<< * #px M = frustrum.modelview_matrix * P = &frustrum.projection_matrix[0] #px/ */ __pyx_v_M = (&(__pyx_v_7_glarea_frustrum.modelview_matrix[0])); /* "_glarea.pyx":363 * M = &frustrum.modelview_matrix[0] #px/ * #px M = frustrum.modelview_matrix * P = &frustrum.projection_matrix[0] #px/ # <<<<<<<<<<<<<< * #px P = frustrum.projection_matrix * */ __pyx_v_P = (&(__pyx_v_7_glarea_frustrum.projection_matrix[0])); /* "_glarea.pyx":367 * * # u = M^T * vvect * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] # <<<<<<<<<<<<<< * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] */ __pyx_t_1 = PyFloat_FromDouble(((__pyx_v_M[0])[0])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_vvect, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[1])[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_vvect, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(((__pyx_v_M[2])[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_vvect, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[3])[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_u0 = __pyx_t_5; /* "_glarea.pyx":368 * # u = M^T * vvect * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] # <<<<<<<<<<<<<< * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] * #u3 = 1. */ __pyx_t_1 = PyFloat_FromDouble(((__pyx_v_M[0])[1])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_vvect, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[1])[1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_vvect, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(((__pyx_v_M[2])[1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_vvect, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[3])[1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_u1 = __pyx_t_5; /* "_glarea.pyx":369 * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] # <<<<<<<<<<<<<< * #u3 = 1. * */ __pyx_t_1 = PyFloat_FromDouble(((__pyx_v_M[0])[2])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_vvect, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[1])[2])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_vvect, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(((__pyx_v_M[2])[2])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_vvect, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(((__pyx_v_M[3])[2])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_u2 = __pyx_t_5; /* "_glarea.pyx":373 * * # v = P * u * v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 # <<<<<<<<<<<<<< * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 */ __pyx_v_v0 = ((((((__pyx_v_P[0])[0]) * __pyx_v_u0) + (((__pyx_v_P[1])[0]) * __pyx_v_u1)) + (((__pyx_v_P[2])[0]) * __pyx_v_u2)) + ((__pyx_v_P[3])[0])); /* "_glarea.pyx":374 * # v = P * u * v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 # <<<<<<<<<<<<<< * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 */ __pyx_v_v1 = ((((((__pyx_v_P[0])[1]) * __pyx_v_u0) + (((__pyx_v_P[1])[1]) * __pyx_v_u1)) + (((__pyx_v_P[2])[1]) * __pyx_v_u2)) + ((__pyx_v_P[3])[1])); /* "_glarea.pyx":376 * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 # <<<<<<<<<<<<<< * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) */ __pyx_v_v3 = ((((((__pyx_v_P[0])[3]) * __pyx_v_u0) + (((__pyx_v_P[1])[3]) * __pyx_v_u1)) + (((__pyx_v_P[2])[3]) * __pyx_v_u2)) + ((__pyx_v_P[3])[3])); /* "_glarea.pyx":378 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) # <<<<<<<<<<<<<< * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * */ if (unlikely(__pyx_v_v3 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[0]) = ((int)((((__pyx_v_v0 / __pyx_v_v3) + 1.0) / 2.0) * __pyx_v_7_glarea_terrain.width)); /* "_glarea.pyx":379 * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) # <<<<<<<<<<<<<< * * def get_cursor_angle(point1, point2): */ if (unlikely(__pyx_v_v3 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[1]) = ((int)((((__pyx_v_v1 / __pyx_v_v3) + 1.0) / 2.0) * __pyx_v_7_glarea_terrain.height)); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("_glarea._modelview_to_viewport", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_23get_cursor_angle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_7_glarea_22get_cursor_angle[] = "The result is the angle (on the screen)\n at which the mouse cursor needs to be drawn."; static PyMethodDef __pyx_mdef_7_glarea_23get_cursor_angle = {__Pyx_NAMESTR("get_cursor_angle"), (PyCFunction)__pyx_pw_7_glarea_23get_cursor_angle, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7_glarea_22get_cursor_angle)}; static PyObject *__pyx_pw_7_glarea_23get_cursor_angle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_point1 = 0; PyObject *__pyx_v_point2 = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("get_cursor_angle (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__point1,&__pyx_n_s__point2,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__point1)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__point2)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("get_cursor_angle", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_cursor_angle") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_point1 = values[0]; __pyx_v_point2 = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("get_cursor_angle", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.get_cursor_angle", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_22get_cursor_angle(__pyx_self, __pyx_v_point1, __pyx_v_point2); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":381 * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * * def get_cursor_angle(point1, point2): # <<<<<<<<<<<<<< * '''The result is the angle (on the screen) * at which the mouse cursor needs to be drawn.''' */ static PyObject *__pyx_pf_7_glarea_22get_cursor_angle(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_point1, PyObject *__pyx_v_point2) { float __pyx_v_angle; int __pyx_v_i; int __pyx_v_x; int __pyx_v_y; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; float __pyx_t_3; double __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_cursor_angle", 0); /* "_glarea.pyx":386 * cdef float angle #px+ * cdef int i, x, y #px+ * for i in range(3): # <<<<<<<<<<<<<< * selection_debug_points.modelview1[i] = point1[i] * selection_debug_points.modelview2[i] = point2[i] */ for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { __pyx_v_i = __pyx_t_1; /* "_glarea.pyx":387 * cdef int i, x, y #px+ * for i in range(3): * selection_debug_points.modelview1[i] = point1[i] # <<<<<<<<<<<<<< * selection_debug_points.modelview2[i] = point2[i] * _modelview_to_viewport(point1, selection_debug_points.viewport1) */ __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_point1, __pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; (__pyx_v_7_glarea_selection_debug_points.modelview1[__pyx_v_i]) = __pyx_t_3; /* "_glarea.pyx":388 * for i in range(3): * selection_debug_points.modelview1[i] = point1[i] * selection_debug_points.modelview2[i] = point2[i] # <<<<<<<<<<<<<< * _modelview_to_viewport(point1, selection_debug_points.viewport1) * _modelview_to_viewport(point2, selection_debug_points.viewport2) */ __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_point2, __pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_3 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; (__pyx_v_7_glarea_selection_debug_points.modelview2[__pyx_v_i]) = __pyx_t_3; } /* "_glarea.pyx":389 * selection_debug_points.modelview1[i] = point1[i] * selection_debug_points.modelview2[i] = point2[i] * _modelview_to_viewport(point1, selection_debug_points.viewport1) # <<<<<<<<<<<<<< * _modelview_to_viewport(point2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] */ __pyx_f_7_glarea__modelview_to_viewport(__pyx_v_point1, __pyx_v_7_glarea_selection_debug_points.viewport1); /* "_glarea.pyx":390 * selection_debug_points.modelview2[i] = point2[i] * _modelview_to_viewport(point1, selection_debug_points.viewport1) * _modelview_to_viewport(point2, selection_debug_points.viewport2) # <<<<<<<<<<<<<< * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] */ __pyx_f_7_glarea__modelview_to_viewport(__pyx_v_point2, __pyx_v_7_glarea_selection_debug_points.viewport2); /* "_glarea.pyx":391 * _modelview_to_viewport(point1, selection_debug_points.viewport1) * _modelview_to_viewport(point2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] # <<<<<<<<<<<<<< * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI */ __pyx_v_x = ((__pyx_v_7_glarea_selection_debug_points.viewport1[0]) - (__pyx_v_7_glarea_selection_debug_points.viewport2[0])); /* "_glarea.pyx":392 * _modelview_to_viewport(point2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] # <<<<<<<<<<<<<< * angle = atan2(x, y) * 180.0 / M_PI * return angle */ __pyx_v_y = ((__pyx_v_7_glarea_selection_debug_points.viewport1[1]) - (__pyx_v_7_glarea_selection_debug_points.viewport2[1])); /* "_glarea.pyx":393 * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI # <<<<<<<<<<<<<< * return angle * */ __pyx_t_4 = (atan2(__pyx_v_x, __pyx_v_y) * 180.0); if (unlikely(M_PI == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "float division"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_angle = (__pyx_t_4 / M_PI); /* "_glarea.pyx":394 * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI * return angle # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_angle); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("_glarea.get_cursor_angle", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":399 * ### shader functions * * cdef void _gl_print_shader_log(GLuint shader): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_shader_log(shader): * cdef GLint log_len #px+ */ static void __pyx_f_7_glarea__gl_print_shader_log(__pyx_t_2gl_GLuint __pyx_v_shader) { __pyx_t_2gl_GLint __pyx_v_log_len; __pyx_t_2gl_GLsizei __pyx_v_length; char __pyx_v_log[1024]; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_shader_log", 0); /* "_glarea.pyx":404 * cdef GLsizei length #px+ * cdef char log[1024] #px+ * glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) #px/ # <<<<<<<<<<<<<< * #px log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: */ glGetShaderiv(__pyx_v_shader, GL_INFO_LOG_LENGTH, (&__pyx_v_log_len)); /* "_glarea.pyx":406 * glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) #px/ * #px log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: # <<<<<<<<<<<<<< * print('==== Error compiling shader:') * glGetShaderInfoLog(shader, 1023, &length, log) #px/ */ __pyx_t_1 = (__pyx_v_log_len > 0); if (__pyx_t_1) { /* "_glarea.pyx":407 * #px log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error compiling shader:') # <<<<<<<<<<<<<< * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #px log = glGetShaderInfoLog(shader, 1023) */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_16), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":408 * if log_len > 0: * print('==== Error compiling shader:') * glGetShaderInfoLog(shader, 1023, &length, log) #px/ # <<<<<<<<<<<<<< * #px log = glGetShaderInfoLog(shader, 1023) * print(log.decode('utf-8').rstrip()) */ glGetShaderInfoLog(__pyx_v_shader, 1023, (&__pyx_v_length), __pyx_v_log); /* "_glarea.pyx":410 * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #px log = glGetShaderInfoLog(shader, 1023) * print(log.decode('utf-8').rstrip()) # <<<<<<<<<<<<<< * print('====') * else: */ __pyx_t_2 = ((PyObject *)__Pyx_decode_c_string(__pyx_v_log, 0, strlen(__pyx_v_log), NULL, NULL, PyUnicode_DecodeUTF8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_t_2), __pyx_n_s__rstrip); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":411 * #px log = glGetShaderInfoLog(shader, 1023) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error compiling shader (no log)') */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_18), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":413 * print('====') * else: * print('==== Error compiling shader (no log)') # <<<<<<<<<<<<<< * * cdef void _gl_print_program_log(GLuint program): #px/ */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_20), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_WriteUnraisable("_glarea._gl_print_shader_log", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":415 * print('==== Error compiling shader (no log)') * * cdef void _gl_print_program_log(GLuint program): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_program_log(program): * cdef GLint log_len #px+ */ static void __pyx_f_7_glarea__gl_print_program_log(__pyx_t_2gl_GLuint __pyx_v_program) { __pyx_t_2gl_GLint __pyx_v_log_len; __pyx_t_2gl_GLsizei __pyx_v_length; char __pyx_v_log[1024]; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_program_log", 0); /* "_glarea.pyx":420 * cdef GLsizei length #px+ * cdef char log[1024] #px+ * glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) #px/ # <<<<<<<<<<<<<< * #px log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: */ glGetProgramiv(__pyx_v_program, GL_INFO_LOG_LENGTH, (&__pyx_v_log_len)); /* "_glarea.pyx":422 * glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) #px/ * #px log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: # <<<<<<<<<<<<<< * print('==== Error linking shader program:') * glGetProgramInfoLog(program, 1023, &length, log) #px/ */ __pyx_t_1 = (__pyx_v_log_len > 0); if (__pyx_t_1) { /* "_glarea.pyx":423 * #px log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error linking shader program:') # <<<<<<<<<<<<<< * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #px log = glGetProgramInfoLog(program, 1023) */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":424 * if log_len > 0: * print('==== Error linking shader program:') * glGetProgramInfoLog(program, 1023, &length, log) #px/ # <<<<<<<<<<<<<< * #px log = glGetProgramInfoLog(program, 1023) * print(log.decode('utf-8').rstrip()) */ glGetProgramInfoLog(__pyx_v_program, 1023, (&__pyx_v_length), __pyx_v_log); /* "_glarea.pyx":426 * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #px log = glGetProgramInfoLog(program, 1023) * print(log.decode('utf-8').rstrip()) # <<<<<<<<<<<<<< * print('====') * else: */ __pyx_t_2 = ((PyObject *)__Pyx_decode_c_string(__pyx_v_log, 0, strlen(__pyx_v_log), NULL, NULL, PyUnicode_DecodeUTF8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_t_2), __pyx_n_s__rstrip); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":427 * #px log = glGetProgramInfoLog(program, 1023) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error linking shader program (no log)') */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":429 * print('====') * else: * print('==== Error linking shader program (no log)') # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_25), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_WriteUnraisable("_glarea._gl_print_program_log", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":431 * print('==== Error linking shader program (no log)') * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ # <<<<<<<<<<<<<< * #px def _gl_create_compiled_shader(shadertype, source): * cdef GLuint shader #px+ */ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_compiled_shader(__pyx_t_2gl_GLenum __pyx_v_shadertype, PyObject *__pyx_v_source) { __pyx_t_2gl_GLuint __pyx_v_shader; const GLchar* __pyx_v_pchar; __pyx_t_2gl_GLint __pyx_v_compile_status; __pyx_t_2gl_GLuint __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; char *__pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_create_compiled_shader", 0); /* "_glarea.pyx":437 * cdef GLint compile_status #px+ * * shader = glCreateShader(shadertype) # <<<<<<<<<<<<<< * if shader == 0: * print('Failed to create shader') */ __pyx_v_shader = glCreateShader(__pyx_v_shadertype); /* "_glarea.pyx":438 * * shader = glCreateShader(shadertype) * if shader == 0: # <<<<<<<<<<<<<< * print('Failed to create shader') * return 0 */ __pyx_t_1 = (__pyx_v_shader == 0); if (__pyx_t_1) { /* "_glarea.pyx":439 * shader = glCreateShader(shadertype) * if shader == 0: * print('Failed to create shader') # <<<<<<<<<<<<<< * return 0 * pchar = source #px+ */ __pyx_t_2 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_27), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":440 * if shader == 0: * print('Failed to create shader') * return 0 # <<<<<<<<<<<<<< * pchar = source #px+ * glShaderSource(shader, 1, &pchar, NULL) #px/ */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":441 * print('Failed to create shader') * return 0 * pchar = source #px+ # <<<<<<<<<<<<<< * glShaderSource(shader, 1, &pchar, NULL) #px/ * #px glShaderSource(shader, source) */ __pyx_t_3 = PyBytes_AsString(((PyObject *)__pyx_v_source)); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_pchar = ((const GLchar*)((char *)__pyx_t_3)); /* "_glarea.pyx":442 * return 0 * pchar = source #px+ * glShaderSource(shader, 1, &pchar, NULL) #px/ # <<<<<<<<<<<<<< * #px glShaderSource(shader, source) * glCompileShader(shader) */ glShaderSource(__pyx_v_shader, 1, (&__pyx_v_pchar), NULL); /* "_glarea.pyx":444 * glShaderSource(shader, 1, &pchar, NULL) #px/ * #px glShaderSource(shader, source) * glCompileShader(shader) # <<<<<<<<<<<<<< * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ * #px compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) */ glCompileShader(__pyx_v_shader); /* "_glarea.pyx":445 * #px glShaderSource(shader, source) * glCompileShader(shader) * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ # <<<<<<<<<<<<<< * #px compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: */ glGetShaderiv(__pyx_v_shader, GL_COMPILE_STATUS, (&__pyx_v_compile_status)); /* "_glarea.pyx":447 * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ * #px compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: # <<<<<<<<<<<<<< * _gl_print_shader_log(shader) * return 0 */ __pyx_t_1 = (!__pyx_v_compile_status); if (__pyx_t_1) { /* "_glarea.pyx":448 * #px compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: * _gl_print_shader_log(shader) # <<<<<<<<<<<<<< * return 0 * return shader */ __pyx_f_7_glarea__gl_print_shader_log(__pyx_v_shader); /* "_glarea.pyx":449 * if not compile_status: * _gl_print_shader_log(shader) * return 0 # <<<<<<<<<<<<<< * return shader * */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":450 * _gl_print_shader_log(shader) * return 0 * return shader # <<<<<<<<<<<<<< * * cdef void _gl_print_program_info(GLuint program): #px/ */ __pyx_r = __pyx_v_shader; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_create_compiled_shader", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":452 * return shader * * cdef void _gl_print_program_info(GLuint program): #px/ # <<<<<<<<<<<<<< * #px def _gl_print_program_info(program): * cdef GLint param #px+ */ static void __pyx_f_7_glarea__gl_print_program_info(__pyx_t_2gl_GLuint __pyx_v_program) { __pyx_t_2gl_GLint __pyx_v_param; int __pyx_v_i; __pyx_t_2gl_GLsizei __pyx_v_alength; __pyx_t_2gl_GLint __pyx_v_asize; __pyx_t_2gl_GLint __pyx_v_location; __pyx_t_2gl_GLenum __pyx_v_atype; char __pyx_v_aname[1024]; PyObject *__pyx_v_program_info = NULL; PyObject *__pyx_v_msg = NULL; PyObject *__pyx_v_pname = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; Py_ssize_t __pyx_t_11; PyObject *(*__pyx_t_12)(PyObject *); __pyx_t_2gl_GLenum __pyx_t_13; long __pyx_t_14; int __pyx_t_15; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_program_info", 0); /* "_glarea.pyx":461 * cdef char aname[1024] #px+ * * print('shader program info', program) # <<<<<<<<<<<<<< * glValidateProgram(program) * program_info = {} */ __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_program); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_kp_u_28)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_28)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_28)); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":462 * * print('shader program info', program) * glValidateProgram(program) # <<<<<<<<<<<<<< * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), */ glValidateProgram(__pyx_v_program); /* "_glarea.pyx":463 * print('shader program info', program) * glValidateProgram(program) * program_info = {} # <<<<<<<<<<<<<< * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); __pyx_v_program_info = __pyx_t_1; __pyx_t_1 = 0; /* "_glarea.pyx":464 * glValidateProgram(program) * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), # <<<<<<<<<<<<<< * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), */ __pyx_t_1 = PyInt_FromLong(GL_DELETE_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_kp_u_29)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_29)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_29)); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":465 * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), # <<<<<<<<<<<<<< * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), */ __pyx_t_1 = PyInt_FromLong(GL_LINK_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_30)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_30)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_30)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":466 * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), # <<<<<<<<<<<<<< * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), */ __pyx_t_1 = PyInt_FromLong(GL_VALIDATE_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)__pyx_kp_u_31)); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_31)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_31)); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":467 * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), # <<<<<<<<<<<<<< * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), */ __pyx_t_1 = PyInt_FromLong(GL_INFO_LOG_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)__pyx_kp_u_32)); PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_32)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_32)); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":468 * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), # <<<<<<<<<<<<<< * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), */ __pyx_t_1 = PyInt_FromLong(GL_ATTACHED_SHADERS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_INCREF(((PyObject *)__pyx_kp_u_33)); PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_u_33)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_33)); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":469 * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), # <<<<<<<<<<<<<< * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), */ __pyx_t_1 = PyInt_FromLong(GL_ACTIVE_ATTRIBUTES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(((PyObject *)__pyx_kp_u_34)); PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_u_34)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_34)); PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":470 * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), # <<<<<<<<<<<<<< * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: */ __pyx_t_1 = PyInt_FromLong(GL_ACTIVE_ATTRIBUTE_MAX_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(((PyObject *)__pyx_kp_u_35)); PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_u_35)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_35)); PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":471 * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), # <<<<<<<<<<<<<< * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: * glGetProgramiv(program, pname, ¶m) #px/ */ __pyx_t_1 = PyInt_FromLong(GL_ACTIVE_UNIFORMS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(((PyObject *)__pyx_kp_u_36)); PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_u_36)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_36)); PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":472 * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: # <<<<<<<<<<<<<< * glGetProgramiv(program, pname, ¶m) #px/ * #px param = glGetProgramiv(program, pname) */ __pyx_t_1 = PyInt_FromLong(GL_ACTIVE_UNIFORM_MAX_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_INCREF(((PyObject *)__pyx_kp_u_37)); PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_kp_u_37)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_37)); PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyList_New(9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3)); __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); PyList_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_t_4)); __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); PyList_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); PyList_SET_ITEM(__pyx_t_1, 4, ((PyObject *)__pyx_t_6)); __Pyx_GIVEREF(((PyObject *)__pyx_t_6)); PyList_SET_ITEM(__pyx_t_1, 5, ((PyObject *)__pyx_t_7)); __Pyx_GIVEREF(((PyObject *)__pyx_t_7)); PyList_SET_ITEM(__pyx_t_1, 6, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_t_9)); __Pyx_GIVEREF(((PyObject *)__pyx_t_9)); PyList_SET_ITEM(__pyx_t_1, 8, ((PyObject *)__pyx_t_10)); __Pyx_GIVEREF(((PyObject *)__pyx_t_10)); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_10 = ((PyObject *)__pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_11 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; for (;;) { /* "_glarea.pyx":464 * glValidateProgram(program) * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), # <<<<<<<<<<<<<< * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), */ if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_10)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_1 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_1 = PySequence_ITEM(__pyx_t_10, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { PyObject* sequence = __pyx_t_1; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_9 = PyList_GET_ITEM(sequence, 0); __pyx_t_8 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_8); #else __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else { Py_ssize_t index = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_12 = Py_TYPE(__pyx_t_7)->tp_iternext; index = 0; __pyx_t_9 = __pyx_t_12(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_9); index = 1; __pyx_t_8 = __pyx_t_12(__pyx_t_7); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_8); if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_12 = NULL; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_12 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } __Pyx_XDECREF(__pyx_v_msg); __pyx_v_msg = __pyx_t_9; __pyx_t_9 = 0; __Pyx_XDECREF(__pyx_v_pname); __pyx_v_pname = __pyx_t_8; __pyx_t_8 = 0; /* "_glarea.pyx":473 * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: * glGetProgramiv(program, pname, ¶m) #px/ # <<<<<<<<<<<<<< * #px param = glGetProgramiv(program, pname) * program_info[pname] = param */ __pyx_t_13 = __Pyx_PyInt_AsUnsignedInt(__pyx_v_pname); if (unlikely((__pyx_t_13 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glGetProgramiv(__pyx_v_program, __pyx_t_13, (&__pyx_v_param)); /* "_glarea.pyx":475 * glGetProgramiv(program, pname, ¶m) #px/ * #px param = glGetProgramiv(program, pname) * program_info[pname] = param # <<<<<<<<<<<<<< * print(' ', msg, param) * print('active attributes:') */ __pyx_t_1 = PyInt_FromLong(__pyx_v_param); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(((PyObject *)__pyx_v_program_info), __pyx_v_pname, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":476 * #px param = glGetProgramiv(program, pname) * program_info[pname] = param * print(' ', msg, param) # <<<<<<<<<<<<<< * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): */ __pyx_t_1 = PyInt_FromLong(__pyx_v_param); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(((PyObject *)__pyx_kp_u_38)); PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_u_38)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_38)); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; /* "_glarea.pyx":477 * program_info[pname] = param * print(' ', msg, param) * print('active attributes:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_t_10 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_40), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; /* "_glarea.pyx":478 * print(' ', msg, param) * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): # <<<<<<<<<<<<<< * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #px aname, asize, atype = glGetActiveAttrib(program, i); alength = '?' */ __pyx_t_10 = __Pyx_GetItemInt(((PyObject *)__pyx_v_program_info), GL_ACTIVE_ATTRIBUTES, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_t_10); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) { __pyx_v_i = __pyx_t_15; /* "_glarea.pyx":479 * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ # <<<<<<<<<<<<<< * #px aname, asize, atype = glGetActiveAttrib(program, i); alength = '?' * location = glGetAttribLocation(program, aname) */ glGetActiveAttrib(__pyx_v_program, __pyx_v_i, 1023, (&__pyx_v_alength), (&__pyx_v_asize), (&__pyx_v_atype), __pyx_v_aname); /* "_glarea.pyx":481 * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #px aname, asize, atype = glGetActiveAttrib(program, i); alength = '?' * location = glGetAttribLocation(program, aname) # <<<<<<<<<<<<<< * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') */ __pyx_v_location = glGetAttribLocation(__pyx_v_program, __pyx_v_aname); /* "_glarea.pyx":482 * #px aname, asize, atype = glGetActiveAttrib(program, i); alength = '?' * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) # <<<<<<<<<<<<<< * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): */ __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_kp_u_41), __pyx_n_s__format); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyBytes_FromString(__pyx_v_aname); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __pyx_t_9 = PyInt_FromLong(__pyx_v_alength); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_7 = PyInt_FromLong(__pyx_v_asize); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_atype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_5 = PyInt_FromLong(__pyx_v_location); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 5, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_1 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_7 = 0; __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } /* "_glarea.pyx":483 * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_t_5 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; /* "_glarea.pyx":484 * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): # <<<<<<<<<<<<<< * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #px aname, asize, atype = glGetActiveUniform(program, i); alength = '?' */ __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_v_program_info), GL_ACTIVE_UNIFORMS, sizeof(int), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_14 = __Pyx_PyInt_AsLong(__pyx_t_5); if (unlikely((__pyx_t_14 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) { __pyx_v_i = __pyx_t_15; /* "_glarea.pyx":485 * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ # <<<<<<<<<<<<<< * #px aname, asize, atype = glGetActiveUniform(program, i); alength = '?' * location = glGetUniformLocation(program, aname) */ glGetActiveUniform(__pyx_v_program, __pyx_v_i, 1023, (&__pyx_v_alength), (&__pyx_v_asize), (&__pyx_v_atype), __pyx_v_aname); /* "_glarea.pyx":487 * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #px aname, asize, atype = glGetActiveUniform(program, i); alength = '?' * location = glGetUniformLocation(program, aname) # <<<<<<<<<<<<<< * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * */ __pyx_v_location = glGetUniformLocation(__pyx_v_program, __pyx_v_aname); /* "_glarea.pyx":488 * #px aname, asize, atype = glGetActiveUniform(program, i); alength = '?' * location = glGetUniformLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, list attributes): #px/ */ __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_u_41), __pyx_n_s__format); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_10 = PyBytes_FromString(__pyx_v_aname); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_10)); __pyx_t_6 = PyInt_FromLong(__pyx_v_alength); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = PyInt_FromLong(__pyx_v_asize); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = PyLong_FromUnsignedLong(__pyx_v_atype); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_8 = PyInt_FromLong(__pyx_v_location); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_10)); __Pyx_GIVEREF(((PyObject *)__pyx_t_10)); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); __pyx_t_4 = 0; __pyx_t_10 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_9 = 0; __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_builtin_print, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_WriteUnraisable("_glarea._gl_print_program_info", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XDECREF(__pyx_v_program_info); __Pyx_XDECREF(__pyx_v_msg); __Pyx_XDECREF(__pyx_v_pname); __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":490 * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, list attributes): #px/ # <<<<<<<<<<<<<< * #px def _gl_create_program(vertex_source, fragment_source, attributes): * cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+ */ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_program(PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source, PyObject *__pyx_v_attributes) { __pyx_t_2gl_GLuint __pyx_v_vertex_shader; __pyx_t_2gl_GLuint __pyx_v_fragment_shader; __pyx_t_2gl_GLuint __pyx_v_program; __pyx_t_2gl_GLint __pyx_v_link_status; PyObject *__pyx_v_index = NULL; PyObject *__pyx_v_name = NULL; __pyx_t_2gl_GLuint __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *(*__pyx_t_9)(PyObject *); __pyx_t_2gl_GLuint __pyx_t_10; __pyx_t_2gl_GLchar *__pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_create_program", 0); /* "_glarea.pyx":492 * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, list attributes): #px/ * #px def _gl_create_program(vertex_source, fragment_source, attributes): * cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+ # <<<<<<<<<<<<<< * cdef GLuint program #px+ * cdef GLint link_status #px+ */ __pyx_v_vertex_shader = 0; __pyx_v_fragment_shader = 0; /* "_glarea.pyx":496 * cdef GLint link_status #px+ * * if DEBUG_NOSHADER: # <<<<<<<<<<<<<< * return 0 * */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_NOSHADER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":497 * * if DEBUG_NOSHADER: * return 0 # <<<<<<<<<<<<<< * * program = glCreateProgram() */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":499 * return 0 * * program = glCreateProgram() # <<<<<<<<<<<<<< * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') */ __pyx_v_program = glCreateProgram(); /* "_glarea.pyx":500 * * program = glCreateProgram() * if not DEBUG_NOVSHADER: # <<<<<<<<<<<<<< * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_NOVSHADER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (!__pyx_t_2); if (__pyx_t_3) { /* "_glarea.pyx":501 * program = glCreateProgram() * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') # <<<<<<<<<<<<<< * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * glAttachShader(program, vertex_shader) */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_45), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "_glarea.pyx":502 * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) # <<<<<<<<<<<<<< * glAttachShader(program, vertex_shader) * if not DEBUG_NOFSHADER: */ __pyx_v_vertex_shader = __pyx_f_7_glarea__gl_create_compiled_shader(GL_VERTEX_SHADER, __pyx_v_vertex_source); /* "_glarea.pyx":503 * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * glAttachShader(program, vertex_shader) # <<<<<<<<<<<<<< * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') */ glAttachShader(__pyx_v_program, __pyx_v_vertex_shader); goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":504 * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * glAttachShader(program, vertex_shader) * if not DEBUG_NOFSHADER: # <<<<<<<<<<<<<< * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_NOFSHADER); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_2 = (!__pyx_t_3); if (__pyx_t_2) { /* "_glarea.pyx":505 * glAttachShader(program, vertex_shader) * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') # <<<<<<<<<<<<<< * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * glAttachShader(program, fragment_shader) */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_47), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":506 * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) # <<<<<<<<<<<<<< * glAttachShader(program, fragment_shader) * for index, name in attributes: */ __pyx_v_fragment_shader = __pyx_f_7_glarea__gl_create_compiled_shader(GL_FRAGMENT_SHADER, __pyx_v_fragment_source); /* "_glarea.pyx":507 * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * glAttachShader(program, fragment_shader) # <<<<<<<<<<<<<< * for index, name in attributes: * glBindAttribLocation(program, index, name) */ glAttachShader(__pyx_v_program, __pyx_v_fragment_shader); goto __pyx_L5; } __pyx_L5:; /* "_glarea.pyx":508 * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * glAttachShader(program, fragment_shader) * for index, name in attributes: # <<<<<<<<<<<<<< * glBindAttribLocation(program, index, name) * glLinkProgram(program) */ if (unlikely(((PyObject *)__pyx_v_attributes) == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = ((PyObject *)__pyx_v_attributes); __Pyx_INCREF(__pyx_t_1); __pyx_t_5 = 0; for (;;) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) { PyObject* sequence = __pyx_t_4; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_6 = PyList_GET_ITEM(sequence, 0); __pyx_t_7 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); #else __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } else { Py_ssize_t index = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext; index = 0; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed; __Pyx_GOTREF(__pyx_t_6); index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed; __Pyx_GOTREF(__pyx_t_7); if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = NULL; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; goto __pyx_L9_unpacking_done; __pyx_L8_unpacking_failed:; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_9 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L9_unpacking_done:; } __Pyx_XDECREF(__pyx_v_index); __pyx_v_index = __pyx_t_6; __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_v_name); __pyx_v_name = __pyx_t_7; __pyx_t_7 = 0; /* "_glarea.pyx":509 * glAttachShader(program, fragment_shader) * for index, name in attributes: * glBindAttribLocation(program, index, name) # <<<<<<<<<<<<<< * glLinkProgram(program) * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ */ __pyx_t_10 = __Pyx_PyInt_AsUnsignedInt(__pyx_v_index); if (unlikely((__pyx_t_10 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_11 = PyBytes_AsString(__pyx_v_name); if (unlikely((!__pyx_t_11) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glBindAttribLocation(__pyx_v_program, __pyx_t_10, __pyx_t_11); } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":510 * for index, name in attributes: * glBindAttribLocation(program, index, name) * glLinkProgram(program) # <<<<<<<<<<<<<< * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ * #px link_status = glGetProgramiv(program, GL_LINK_STATUS) */ glLinkProgram(__pyx_v_program); /* "_glarea.pyx":511 * glBindAttribLocation(program, index, name) * glLinkProgram(program) * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ # <<<<<<<<<<<<<< * #px link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: */ glGetProgramiv(__pyx_v_program, GL_LINK_STATUS, (&__pyx_v_link_status)); /* "_glarea.pyx":513 * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ * #px link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: # <<<<<<<<<<<<<< * _gl_print_program_log(program) * return 0 */ __pyx_t_2 = (!__pyx_v_link_status); if (__pyx_t_2) { /* "_glarea.pyx":514 * #px link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: * _gl_print_program_log(program) # <<<<<<<<<<<<<< * return 0 * if DEBUG_MSG: */ __pyx_f_7_glarea__gl_print_program_log(__pyx_v_program); /* "_glarea.pyx":515 * if not link_status: * _gl_print_program_log(program) * return 0 # <<<<<<<<<<<<<< * if DEBUG_MSG: * _gl_print_program_info(program) */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L10; } __pyx_L10:; /* "_glarea.pyx":516 * _gl_print_program_log(program) * return 0 * if DEBUG_MSG: # <<<<<<<<<<<<<< * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__DEBUG_MSG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":517 * return 0 * if DEBUG_MSG: * _gl_print_program_info(program) # <<<<<<<<<<<<<< * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) */ __pyx_f_7_glarea__gl_print_program_info(__pyx_v_program); goto __pyx_L11; } __pyx_L11:; /* "_glarea.pyx":518 * if DEBUG_MSG: * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) # <<<<<<<<<<<<<< * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) */ glDetachShader(__pyx_v_program, __pyx_v_vertex_shader); /* "_glarea.pyx":519 * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) # <<<<<<<<<<<<<< * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) */ glDetachShader(__pyx_v_program, __pyx_v_fragment_shader); /* "_glarea.pyx":520 * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) # <<<<<<<<<<<<<< * glDeleteShader(fragment_shader) * return program */ glDeleteShader(__pyx_v_vertex_shader); /* "_glarea.pyx":521 * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) # <<<<<<<<<<<<<< * return program * */ glDeleteShader(__pyx_v_fragment_shader); /* "_glarea.pyx":522 * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) * return program # <<<<<<<<<<<<<< * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ */ __pyx_r = __pyx_v_program; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_WriteUnraisable("_glarea._gl_create_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_index); __Pyx_XDECREF(__pyx_v_name); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_25gl_create_render_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_25gl_create_render_program = {__Pyx_NAMESTR("gl_create_render_program"), (PyCFunction)__pyx_pw_7_glarea_25gl_create_render_program, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_25gl_create_render_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_render_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex_source,&__pyx_n_s__fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_render_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_render_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_render_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_render_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_24gl_create_render_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":524 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ static PyObject *__pyx_pf_7_glarea_24gl_create_render_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { __pyx_t_2gl_GLint __pyx_v_location; PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_render_program", 0); /* "_glarea.pyx":527 * #px def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ * if program.prog_render > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_render) * attributes = [ */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_render > 0); if (__pyx_t_1) { /* "_glarea.pyx":528 * cdef GLint location #px+ * if program.prog_render > 0: * glDeleteProgram(program.prog_render) # <<<<<<<<<<<<<< * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), */ glDeleteProgram(__pyx_v_7_glarea_program.prog_render); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":530 * glDeleteProgram(program.prog_render) * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), # <<<<<<<<<<<<<< * (NORMAL_ATTRIB_LOCATION, b'normal_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr'), */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__vertex_attr)); PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_n_b__vertex_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__vertex_attr)); __pyx_t_2 = 0; /* "_glarea.pyx":531 * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (NORMAL_ATTRIB_LOCATION, b'normal_attr'), # <<<<<<<<<<<<<< * (COLOR_ATTRIB_LOCATION, b'color_attr'), * (TEXCOORD_ATTRIB_LOCATION, b'texcoord_attr'), */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_NORMAL_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__normal_attr)); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_n_b__normal_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__normal_attr)); __pyx_t_2 = 0; /* "_glarea.pyx":532 * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (NORMAL_ATTRIB_LOCATION, b'normal_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr'), # <<<<<<<<<<<<<< * (TEXCOORD_ATTRIB_LOCATION, b'texcoord_attr'), * ] */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__color_attr)); PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_n_b__color_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__color_attr)); __pyx_t_2 = 0; /* "_glarea.pyx":533 * (NORMAL_ATTRIB_LOCATION, b'normal_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr'), * (TEXCOORD_ATTRIB_LOCATION, b'texcoord_attr'), # <<<<<<<<<<<<<< * ] * program.prog_render = _gl_create_program(vertex_source, fragment_source, attributes) */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_TEXCOORD_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__texcoord_attr)); PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_n_b__texcoord_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__texcoord_attr)); __pyx_t_2 = 0; __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3)); __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_4)); __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); PyList_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_t_6)); __Pyx_GIVEREF(((PyObject *)__pyx_t_6)); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_v_attributes = __pyx_t_2; __pyx_t_2 = 0; /* "_glarea.pyx":535 * (TEXCOORD_ATTRIB_LOCATION, b'texcoord_attr'), * ] * program.prog_render = _gl_create_program(vertex_source, fragment_source, attributes) # <<<<<<<<<<<<<< * if program.prog_render > 0: * glUseProgram(program.prog_render) */ __pyx_v_7_glarea_program.prog_render = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_v_attributes); /* "_glarea.pyx":536 * ] * program.prog_render = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_render > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_render > 0); if (__pyx_t_1) { /* "_glarea.pyx":537 * program.prog_render = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_render > 0: * glUseProgram(program.prog_render) # <<<<<<<<<<<<<< * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) */ glUseProgram(__pyx_v_7_glarea_program.prog_render); /* "_glarea.pyx":538 * if program.prog_render > 0: * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') # <<<<<<<<<<<<<< * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') */ __pyx_v_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k__tex); /* "_glarea.pyx":539 * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) # <<<<<<<<<<<<<< * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') */ glUniform1i(__pyx_v_location, 0); /* "_glarea.pyx":540 * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') # <<<<<<<<<<<<<< * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') */ __pyx_v_7_glarea_program.modelview_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k__modelview); /* "_glarea.pyx":541 * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') # <<<<<<<<<<<<<< * location = glGetUniformLocation(program.prog_render, b'object') * gl_init_object_location(location) */ __pyx_v_7_glarea_program.projection_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k__projection); /* "_glarea.pyx":542 * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') # <<<<<<<<<<<<<< * gl_init_object_location(location) * */ __pyx_v_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k__object); /* "_glarea.pyx":543 * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') * gl_init_object_location(location) # <<<<<<<<<<<<<< * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ */ __pyx_f_7_gldraw_gl_init_object_location(__pyx_v_location); goto __pyx_L4; } __pyx_L4:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("_glarea.gl_create_render_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_27gl_create_hud_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_27gl_create_hud_program = {__Pyx_NAMESTR("gl_create_hud_program"), (PyCFunction)__pyx_pw_7_glarea_27gl_create_hud_program, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_27gl_create_hud_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_hud_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex_source,&__pyx_n_s__fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_hud_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_hud_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_hud_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_hud_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_26gl_create_hud_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":545 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ static PyObject *__pyx_pf_7_glarea_26gl_create_hud_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_hud_program", 0); /* "_glarea.pyx":548 * #px def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ * if program.prog_hud > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_hud) * attributes = [ */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_hud > 0); if (__pyx_t_1) { /* "_glarea.pyx":549 * cdef GLint location #px+ * if program.prog_hud > 0: * glDeleteProgram(program.prog_hud) # <<<<<<<<<<<<<< * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), */ glDeleteProgram(__pyx_v_7_glarea_program.prog_hud); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":551 * glDeleteProgram(program.prog_hud) * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), # <<<<<<<<<<<<<< * (COLOR_ATTRIB_LOCATION, b'color_attr'), * ] */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__vertex_attr)); PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_n_b__vertex_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__vertex_attr)); __pyx_t_2 = 0; /* "_glarea.pyx":552 * attributes = [ * (VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr'), # <<<<<<<<<<<<<< * ] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, attributes) */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__color_attr)); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_n_b__color_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__color_attr)); __pyx_t_2 = 0; __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3)); __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_4)); __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_v_attributes = __pyx_t_2; __pyx_t_2 = 0; /* "_glarea.pyx":554 * (COLOR_ATTRIB_LOCATION, b'color_attr'), * ] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, attributes) # <<<<<<<<<<<<<< * if program.prog_hud > 0: * glUseProgram(program.prog_hud) */ __pyx_v_7_glarea_program.prog_hud = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_v_attributes); /* "_glarea.pyx":555 * ] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_hud > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_hud) * */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_hud > 0); if (__pyx_t_1) { /* "_glarea.pyx":556 * program.prog_hud = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_hud > 0: * glUseProgram(program.prog_hud) # <<<<<<<<<<<<<< * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ */ glUseProgram(__pyx_v_7_glarea_program.prog_hud); goto __pyx_L4; } __pyx_L4:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_create_hud_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_29gl_create_pick_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_29gl_create_pick_program = {__Pyx_NAMESTR("gl_create_pick_program"), (PyCFunction)__pyx_pw_7_glarea_29gl_create_pick_program, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pw_7_glarea_29gl_create_pick_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_pick_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex_source,&__pyx_n_s__fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_pick_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_pick_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_pick_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_pick_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_28gl_create_pick_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":558 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ static PyObject *__pyx_pf_7_glarea_28gl_create_pick_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_pick_program", 0); /* "_glarea.pyx":560 * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ * #px def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_pick) * attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_pick > 0); if (__pyx_t_1) { /* "_glarea.pyx":561 * #px def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: * glDeleteProgram(program.prog_pick) # <<<<<<<<<<<<<< * attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr')] */ glDeleteProgram(__pyx_v_7_glarea_program.prog_pick); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":562 * if program.prog_pick > 0: * glDeleteProgram(program.prog_pick) * attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), # <<<<<<<<<<<<<< * (COLOR_ATTRIB_LOCATION, b'color_attr')] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_VERTEX_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__vertex_attr)); PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_n_b__vertex_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__vertex_attr)); __pyx_t_2 = 0; /* "_glarea.pyx":563 * glDeleteProgram(program.prog_pick) * attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr')] # <<<<<<<<<<<<<< * program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_pick > 0: */ __pyx_t_2 = PyInt_FromLong(__pyx_e_7_gldraw_COLOR_ATTRIB_LOCATION); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_b__color_attr)); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_n_b__color_attr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_b__color_attr)); __pyx_t_2 = 0; __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3)); __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_4)); __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_v_attributes = __pyx_t_2; __pyx_t_2 = 0; /* "_glarea.pyx":564 * attributes = [(VERTEX_ATTRIB_LOCATION, b'vertex_attr'), * (COLOR_ATTRIB_LOCATION, b'color_attr')] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) # <<<<<<<<<<<<<< * if program.prog_pick > 0: * glUseProgram(program.prog_pick) */ __pyx_v_7_glarea_program.prog_pick = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_v_attributes); /* "_glarea.pyx":565 * (COLOR_ATTRIB_LOCATION, b'color_attr')] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_pick > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') */ __pyx_t_1 = (__pyx_v_7_glarea_program.prog_pick > 0); if (__pyx_t_1) { /* "_glarea.pyx":566 * program.prog_pick = _gl_create_program(vertex_source, fragment_source, attributes) * if program.prog_pick > 0: * glUseProgram(program.prog_pick) # <<<<<<<<<<<<<< * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') */ glUseProgram(__pyx_v_7_glarea_program.prog_pick); /* "_glarea.pyx":567 * if program.prog_pick > 0: * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') # <<<<<<<<<<<<<< * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') */ __pyx_v_7_glarea_program.picking_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k__picking); /* "_glarea.pyx":568 * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') # <<<<<<<<<<<<<< * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') * */ __pyx_v_7_glarea_program.projection_pick_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k__projection); /* "_glarea.pyx":569 * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') # <<<<<<<<<<<<<< * * */ __pyx_v_7_glarea_program.modelview_pick_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k__modelview); goto __pyx_L4; } __pyx_L4:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_create_pick_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {__Pyx_NAMESTR("gl_pick_polygons"), (PyCFunction)__pyx_pw_7_glarea_21gl_pick_polygons, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("_glarea"), 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 1}, {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0}, {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0}, {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0}, {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0}, {&__pyx_kp_u_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 1, 0, 0}, {&__pyx_kp_u_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 1, 0, 0}, {&__pyx_kp_u_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 1, 0, 0}, {&__pyx_kp_u_19, __pyx_k_19, sizeof(__pyx_k_19), 0, 1, 0, 0}, {&__pyx_kp_u_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 1, 0, 0}, {&__pyx_kp_u_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 1, 0, 0}, {&__pyx_kp_u_24, __pyx_k_24, sizeof(__pyx_k_24), 0, 1, 0, 0}, {&__pyx_kp_u_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 1, 0, 0}, {&__pyx_kp_u_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 1, 0, 0}, {&__pyx_kp_u_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 1, 0, 0}, {&__pyx_kp_u_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 1, 0, 0}, {&__pyx_kp_u_31, __pyx_k_31, sizeof(__pyx_k_31), 0, 1, 0, 0}, {&__pyx_kp_u_32, __pyx_k_32, sizeof(__pyx_k_32), 0, 1, 0, 0}, {&__pyx_kp_u_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 1, 0, 0}, {&__pyx_kp_u_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 1, 0, 0}, {&__pyx_kp_u_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 1, 0, 0}, {&__pyx_kp_u_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 1, 0, 0}, {&__pyx_kp_u_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 1, 0, 0}, {&__pyx_kp_u_38, __pyx_k_38, sizeof(__pyx_k_38), 0, 1, 0, 0}, {&__pyx_kp_u_39, __pyx_k_39, sizeof(__pyx_k_39), 0, 1, 0, 0}, {&__pyx_kp_u_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 1, 0, 0}, {&__pyx_kp_u_41, __pyx_k_41, sizeof(__pyx_k_41), 0, 1, 0, 0}, {&__pyx_kp_u_42, __pyx_k_42, sizeof(__pyx_k_42), 0, 1, 0, 0}, {&__pyx_kp_u_44, __pyx_k_44, sizeof(__pyx_k_44), 0, 1, 0, 0}, {&__pyx_kp_u_46, __pyx_k_46, sizeof(__pyx_k_46), 0, 1, 0, 0}, {&__pyx_kp_u_48, __pyx_k_48, sizeof(__pyx_k_48), 0, 1, 0, 0}, {&__pyx_kp_u_49, __pyx_k_49, sizeof(__pyx_k_49), 0, 1, 0, 0}, {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, {&__pyx_kp_u_50, __pyx_k_50, sizeof(__pyx_k_50), 0, 1, 0, 0}, {&__pyx_kp_u_51, __pyx_k_51, sizeof(__pyx_k_51), 0, 1, 0, 0}, {&__pyx_kp_s_54, __pyx_k_54, sizeof(__pyx_k_54), 0, 0, 1, 0}, {&__pyx_n_s_59, __pyx_k_59, sizeof(__pyx_k_59), 0, 0, 1, 1}, {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0}, {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, {&__pyx_n_s_72, __pyx_k_72, sizeof(__pyx_k_72), 0, 0, 1, 1}, {&__pyx_n_s_77, __pyx_k_77, sizeof(__pyx_k_77), 0, 0, 1, 1}, {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, {&__pyx_n_s_80, __pyx_k_80, sizeof(__pyx_k_80), 0, 0, 1, 1}, {&__pyx_n_s_83, __pyx_k_83, sizeof(__pyx_k_83), 0, 0, 1, 1}, {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0}, {&__pyx_n_s__DEBUG_DRAW, __pyx_k__DEBUG_DRAW, sizeof(__pyx_k__DEBUG_DRAW), 0, 0, 1, 1}, {&__pyx_n_s__DEBUG_MSG, __pyx_k__DEBUG_MSG, sizeof(__pyx_k__DEBUG_MSG), 0, 0, 1, 1}, {&__pyx_n_s__DEBUG_NOFSHADER, __pyx_k__DEBUG_NOFSHADER, sizeof(__pyx_k__DEBUG_NOFSHADER), 0, 0, 1, 1}, {&__pyx_n_s__DEBUG_NOSHADER, __pyx_k__DEBUG_NOSHADER, sizeof(__pyx_k__DEBUG_NOSHADER), 0, 0, 1, 1}, {&__pyx_n_s__DEBUG_NOVSHADER, __pyx_k__DEBUG_NOVSHADER, sizeof(__pyx_k__DEBUG_NOVSHADER), 0, 0, 1, 1}, {&__pyx_n_s__DEBUG_PICK, __pyx_k__DEBUG_PICK, sizeof(__pyx_k__DEBUG_PICK), 0, 0, 1, 1}, {&__pyx_n_u__GL, __pyx_k__GL, sizeof(__pyx_k__GL), 0, 1, 0, 1}, {&__pyx_n_s____compiled, __pyx_k____compiled, sizeof(__pyx_k____compiled), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____name__, __pyx_k____name__, sizeof(__pyx_k____name__), 0, 0, 1, 1}, {&__pyx_n_s____package__, __pyx_k____package__, sizeof(__pyx_k____package__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s___glarea, __pyx_k___glarea, sizeof(__pyx_k___glarea), 0, 0, 1, 1}, {&__pyx_n_s__angle, __pyx_k__angle, sizeof(__pyx_k__angle), 0, 0, 1, 1}, {&__pyx_n_s__attributes, __pyx_k__attributes, sizeof(__pyx_k__attributes), 0, 0, 1, 1}, {&__pyx_n_s__blue, __pyx_k__blue, sizeof(__pyx_k__blue), 0, 0, 1, 1}, {&__pyx_n_b__color_attr, __pyx_k__color_attr, sizeof(__pyx_k__color_attr), 0, 0, 0, 1}, {&__pyx_n_s__debug, __pyx_k__debug, sizeof(__pyx_k__debug), 0, 0, 1, 1}, {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1}, {&__pyx_n_s__fragment_source, __pyx_k__fragment_source, sizeof(__pyx_k__fragment_source), 0, 0, 1, 1}, {&__pyx_n_s__get_cursor_angle, __pyx_k__get_cursor_angle, sizeof(__pyx_k__get_cursor_angle), 0, 0, 1, 1}, {&__pyx_n_s__gl_exit, __pyx_k__gl_exit, sizeof(__pyx_k__gl_exit), 0, 0, 1, 1}, {&__pyx_n_s__gl_init, __pyx_k__gl_init, sizeof(__pyx_k__gl_init), 0, 0, 1, 1}, {&__pyx_n_s__gl_render, __pyx_k__gl_render, sizeof(__pyx_k__gl_render), 0, 0, 1, 1}, {&__pyx_n_s__gl_resize, __pyx_k__gl_resize, sizeof(__pyx_k__gl_resize), 0, 0, 1, 1}, {&__pyx_n_s__green, __pyx_k__green, sizeof(__pyx_k__green), 0, 0, 1, 1}, {&__pyx_n_s__height, __pyx_k__height, sizeof(__pyx_k__height), 0, 0, 1, 1}, {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, {&__pyx_n_s__init_module, __pyx_k__init_module, sizeof(__pyx_k__init_module), 0, 0, 1, 1}, {&__pyx_n_s__location, __pyx_k__location, sizeof(__pyx_k__location), 0, 0, 1, 1}, {&__pyx_n_s__multisample, __pyx_k__multisample, sizeof(__pyx_k__multisample), 0, 0, 1, 1}, {&__pyx_n_b__normal_attr, __pyx_k__normal_attr, sizeof(__pyx_k__normal_attr), 0, 0, 0, 1}, {&__pyx_n_s__point1, __pyx_k__point1, sizeof(__pyx_k__point1), 0, 0, 1, 1}, {&__pyx_n_s__point2, __pyx_k__point2, sizeof(__pyx_k__point2), 0, 0, 1, 1}, {&__pyx_n_s__print, __pyx_k__print, sizeof(__pyx_k__print), 0, 0, 1, 1}, {&__pyx_n_s__prog, __pyx_k__prog, sizeof(__pyx_k__prog), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__red, __pyx_k__red, sizeof(__pyx_k__red), 0, 0, 1, 1}, {&__pyx_n_s__rstrip, __pyx_k__rstrip, sizeof(__pyx_k__rstrip), 0, 0, 1, 1}, {&__pyx_n_s__selectdata, __pyx_k__selectdata, sizeof(__pyx_k__selectdata), 0, 0, 1, 1}, {&__pyx_n_s__set_antialiasing, __pyx_k__set_antialiasing, sizeof(__pyx_k__set_antialiasing), 0, 0, 1, 1}, {&__pyx_n_s__set_frustrum, __pyx_k__set_frustrum, sizeof(__pyx_k__set_frustrum), 0, 0, 1, 1}, {&__pyx_n_s__set_rotation_xy, __pyx_k__set_rotation_xy, sizeof(__pyx_k__set_rotation_xy), 0, 0, 1, 1}, {&__pyx_n_b__texcoord_attr, __pyx_k__texcoord_attr, sizeof(__pyx_k__texcoord_attr), 0, 0, 0, 1}, {&__pyx_n_b__vertex_attr, __pyx_k__vertex_attr, sizeof(__pyx_k__vertex_attr), 0, 0, 0, 1}, {&__pyx_n_s__vertex_source, __pyx_k__vertex_source, sizeof(__pyx_k__vertex_source), 0, 0, 1, 1}, {&__pyx_n_s__width, __pyx_k__width, sizeof(__pyx_k__width), 0, 0, 1, 1}, {&__pyx_n_s__x, __pyx_k__x, sizeof(__pyx_k__x), 0, 0, 1, 1}, {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1}, {&__pyx_n_s__zoom, __pyx_k__zoom, sizeof(__pyx_k__zoom), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_print = __Pyx_GetName(__pyx_b, __pyx_n_s__print); if (!__pyx_builtin_print) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "_glarea.pyx":242 * def gl_init(): * if DEBUG_MSG: * print('GL Strings:') # <<<<<<<<<<<<<< * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) */ __pyx_k_tuple_3 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_2)); PyTuple_SET_ITEM(__pyx_k_tuple_3, 0, ((PyObject *)__pyx_kp_u_2)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_2)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_3)); /* "_glarea.pyx":407 * #px log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error compiling shader:') # <<<<<<<<<<<<<< * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #px log = glGetShaderInfoLog(shader, 1023) */ __pyx_k_tuple_16 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_16); __Pyx_INCREF(((PyObject *)__pyx_kp_u_15)); PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, ((PyObject *)__pyx_kp_u_15)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_15)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16)); /* "_glarea.pyx":411 * #px log = glGetShaderInfoLog(shader, 1023) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error compiling shader (no log)') */ __pyx_k_tuple_18 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_18); __Pyx_INCREF(((PyObject *)__pyx_kp_u_17)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_kp_u_17)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_17)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18)); /* "_glarea.pyx":413 * print('====') * else: * print('==== Error compiling shader (no log)') # <<<<<<<<<<<<<< * * cdef void _gl_print_program_log(GLuint program): #px/ */ __pyx_k_tuple_20 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_20); __Pyx_INCREF(((PyObject *)__pyx_kp_u_19)); PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, ((PyObject *)__pyx_kp_u_19)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_19)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20)); /* "_glarea.pyx":423 * #px log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error linking shader program:') # <<<<<<<<<<<<<< * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #px log = glGetProgramInfoLog(program, 1023) */ __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_22); __Pyx_INCREF(((PyObject *)__pyx_kp_u_21)); PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_u_21)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_21)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22)); /* "_glarea.pyx":427 * #px log = glGetProgramInfoLog(program, 1023) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error linking shader program (no log)') */ __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_23); __Pyx_INCREF(((PyObject *)__pyx_kp_u_17)); PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_u_17)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_17)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23)); /* "_glarea.pyx":429 * print('====') * else: * print('==== Error linking shader program (no log)') # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ */ __pyx_k_tuple_25 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_25); __Pyx_INCREF(((PyObject *)__pyx_kp_u_24)); PyTuple_SET_ITEM(__pyx_k_tuple_25, 0, ((PyObject *)__pyx_kp_u_24)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_24)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_25)); /* "_glarea.pyx":439 * shader = glCreateShader(shadertype) * if shader == 0: * print('Failed to create shader') # <<<<<<<<<<<<<< * return 0 * pchar = source #px+ */ __pyx_k_tuple_27 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_27); __Pyx_INCREF(((PyObject *)__pyx_kp_u_26)); PyTuple_SET_ITEM(__pyx_k_tuple_27, 0, ((PyObject *)__pyx_kp_u_26)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_26)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_27)); /* "_glarea.pyx":477 * program_info[pname] = param * print(' ', msg, param) * print('active attributes:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_k_tuple_40 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_40); __Pyx_INCREF(((PyObject *)__pyx_kp_u_39)); PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, ((PyObject *)__pyx_kp_u_39)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_39)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40)); /* "_glarea.pyx":483 * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_43); __Pyx_INCREF(((PyObject *)__pyx_kp_u_42)); PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, ((PyObject *)__pyx_kp_u_42)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_42)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43)); /* "_glarea.pyx":501 * program = glCreateProgram() * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') # <<<<<<<<<<<<<< * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * glAttachShader(program, vertex_shader) */ __pyx_k_tuple_45 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_45)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_45); __Pyx_INCREF(((PyObject *)__pyx_kp_u_44)); PyTuple_SET_ITEM(__pyx_k_tuple_45, 0, ((PyObject *)__pyx_kp_u_44)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_44)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_45)); /* "_glarea.pyx":505 * glAttachShader(program, vertex_shader) * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') # <<<<<<<<<<<<<< * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * glAttachShader(program, fragment_shader) */ __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_47); __Pyx_INCREF(((PyObject *)__pyx_kp_u_46)); PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_u_46)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_46)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47)); /* "_glarea.pyx":56 * debug(' from package:', __package__) * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) # <<<<<<<<<<<<<< * * */ __pyx_k_tuple_52 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_52)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_52); __Pyx_INCREF(((PyObject *)__pyx_kp_u_51)); PyTuple_SET_ITEM(__pyx_k_tuple_52, 0, ((PyObject *)__pyx_kp_u_51)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_51)); __Pyx_INCREF(((PyObject *)__pyx_n_u__GL)); PyTuple_SET_ITEM(__pyx_k_tuple_52, 1, ((PyObject *)__pyx_n_u__GL)); __Pyx_GIVEREF(((PyObject *)__pyx_n_u__GL)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_52)); /* "_glarea.pyx":100 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ __pyx_k_codeobj_53 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__init_module, 100, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_53)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":190 * frustrum.picking_matrix[1][1] = 1. * * def set_frustrum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * frustrum.bounding_sphere_radius = bounding_sphere_radius * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom */ __pyx_k_tuple_55 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_55); __Pyx_INCREF(((PyObject *)__pyx_n_s_1)); PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, ((PyObject *)__pyx_n_s_1)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s_1)); __Pyx_INCREF(((PyObject *)__pyx_n_s__zoom)); PyTuple_SET_ITEM(__pyx_k_tuple_55, 1, ((PyObject *)__pyx_n_s__zoom)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__zoom)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55)); __pyx_k_codeobj_56 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_55, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__set_frustrum, 190, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_56)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":196 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_57); __Pyx_INCREF(((PyObject *)__pyx_n_s__red)); PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, ((PyObject *)__pyx_n_s__red)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__red)); __Pyx_INCREF(((PyObject *)__pyx_n_s__green)); PyTuple_SET_ITEM(__pyx_k_tuple_57, 1, ((PyObject *)__pyx_n_s__green)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__green)); __Pyx_INCREF(((PyObject *)__pyx_n_s__blue)); PyTuple_SET_ITEM(__pyx_k_tuple_57, 2, ((PyObject *)__pyx_n_s__blue)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__blue)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57)); __pyx_k_codeobj_58 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_57, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s_59, 196, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_58)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":201 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustrum.multisample = multisample * */ __pyx_k_tuple_60 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_60)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_60); __Pyx_INCREF(((PyObject *)__pyx_n_s__multisample)); PyTuple_SET_ITEM(__pyx_k_tuple_60, 0, ((PyObject *)__pyx_n_s__multisample)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__multisample)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_60)); __pyx_k_codeobj_61 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_60, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__set_antialiasing, 201, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_61)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":204 * frustrum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ __pyx_k_tuple_62 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_62)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_62); __Pyx_INCREF(((PyObject *)__pyx_n_s__x)); PyTuple_SET_ITEM(__pyx_k_tuple_62, 0, ((PyObject *)__pyx_n_s__x)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x)); __Pyx_INCREF(((PyObject *)__pyx_n_s__y)); PyTuple_SET_ITEM(__pyx_k_tuple_62, 1, ((PyObject *)__pyx_n_s__y)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_62)); __pyx_k_codeobj_63 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_62, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__set_rotation_xy, 204, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_63)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":240 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ __pyx_k_codeobj_64 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__gl_init, 240, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_64)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":266 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ __pyx_k_tuple_65 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_65)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_65); __Pyx_INCREF(((PyObject *)__pyx_n_s__prog)); PyTuple_SET_ITEM(__pyx_k_tuple_65, 0, ((PyObject *)__pyx_n_s__prog)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__prog)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_65)); __pyx_k_codeobj_66 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_65, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__gl_exit, 266, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_66)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":276 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ __pyx_k_tuple_67 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_67)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_67); __Pyx_INCREF(((PyObject *)__pyx_n_s__width)); PyTuple_SET_ITEM(__pyx_k_tuple_67, 0, ((PyObject *)__pyx_n_s__width)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__width)); __Pyx_INCREF(((PyObject *)__pyx_n_s__height)); PyTuple_SET_ITEM(__pyx_k_tuple_67, 1, ((PyObject *)__pyx_n_s__height)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__height)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_67)); __pyx_k_codeobj_68 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_67, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__gl_resize, 276, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_68)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":289 * #px glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ __pyx_k_codeobj_69 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__gl_render, 289, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_69)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":309 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px+ * selectdata[0] = selection_debug_points.modelview1[0] */ __pyx_k_tuple_70 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_70)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_70); __Pyx_INCREF(((PyObject *)__pyx_n_s__selectdata)); PyTuple_SET_ITEM(__pyx_k_tuple_70, 0, ((PyObject *)__pyx_n_s__selectdata)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__selectdata)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_70)); __pyx_k_codeobj_71 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_70, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s_72, 309, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_71)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":381 * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * * def get_cursor_angle(point1, point2): # <<<<<<<<<<<<<< * '''The result is the angle (on the screen) * at which the mouse cursor needs to be drawn.''' */ __pyx_k_tuple_73 = PyTuple_New(6); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_73); __Pyx_INCREF(((PyObject *)__pyx_n_s__point1)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_n_s__point1)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__point1)); __Pyx_INCREF(((PyObject *)__pyx_n_s__point2)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 1, ((PyObject *)__pyx_n_s__point2)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__point2)); __Pyx_INCREF(((PyObject *)__pyx_n_s__angle)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 2, ((PyObject *)__pyx_n_s__angle)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__angle)); __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 3, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__x)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 4, ((PyObject *)__pyx_n_s__x)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x)); __Pyx_INCREF(((PyObject *)__pyx_n_s__y)); PyTuple_SET_ITEM(__pyx_k_tuple_73, 5, ((PyObject *)__pyx_n_s__y)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73)); __pyx_k_codeobj_74 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_73, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s__get_cursor_angle, 381, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_74)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":524 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_k_tuple_75 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_75); __Pyx_INCREF(((PyObject *)__pyx_n_s__vertex_source)); PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_n_s__vertex_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vertex_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__fragment_source)); PyTuple_SET_ITEM(__pyx_k_tuple_75, 1, ((PyObject *)__pyx_n_s__fragment_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fragment_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__location)); PyTuple_SET_ITEM(__pyx_k_tuple_75, 2, ((PyObject *)__pyx_n_s__location)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__location)); __Pyx_INCREF(((PyObject *)__pyx_n_s__attributes)); PyTuple_SET_ITEM(__pyx_k_tuple_75, 3, ((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75)); __pyx_k_codeobj_76 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_75, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s_77, 524, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_76)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":545 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_k_tuple_78 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_78)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_78); __Pyx_INCREF(((PyObject *)__pyx_n_s__vertex_source)); PyTuple_SET_ITEM(__pyx_k_tuple_78, 0, ((PyObject *)__pyx_n_s__vertex_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vertex_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__fragment_source)); PyTuple_SET_ITEM(__pyx_k_tuple_78, 1, ((PyObject *)__pyx_n_s__fragment_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fragment_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__location)); PyTuple_SET_ITEM(__pyx_k_tuple_78, 2, ((PyObject *)__pyx_n_s__location)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__location)); __Pyx_INCREF(((PyObject *)__pyx_n_s__attributes)); PyTuple_SET_ITEM(__pyx_k_tuple_78, 3, ((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_78)); __pyx_k_codeobj_79 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_78, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s_80, 545, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_79)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":558 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ __pyx_k_tuple_81 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_81); __Pyx_INCREF(((PyObject *)__pyx_n_s__vertex_source)); PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, ((PyObject *)__pyx_n_s__vertex_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vertex_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__fragment_source)); PyTuple_SET_ITEM(__pyx_k_tuple_81, 1, ((PyObject *)__pyx_n_s__fragment_source)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fragment_source)); __Pyx_INCREF(((PyObject *)__pyx_n_s__attributes)); PyTuple_SET_ITEM(__pyx_k_tuple_81, 2, ((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__attributes)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81)); __pyx_k_codeobj_82 = (PyObject*)__Pyx_PyCode_New(2, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_81, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_54, __pyx_n_s_83, 558, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_82)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_90 = PyInt_FromLong(90); if (unlikely(!__pyx_int_90)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_neg_90 = PyInt_FromLong(-90); if (unlikely(!__pyx_int_neg_90)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_360 = PyInt_FromLong(360); if (unlikely(!__pyx_int_360)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_glarea(void); /*proto*/ PyMODINIT_FUNC init_glarea(void) #else PyMODINIT_FUNC PyInit__glarea(void); /*proto*/ PyMODINIT_FUNC PyInit__glarea(void) #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__glarea(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_glarea"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "_glarea")) { if (unlikely(PyDict_SetItemString(modules, "_glarea", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main__glarea) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ /*--- Variable import code ---*/ /*--- Function import code ---*/ __pyx_t_1 = __Pyx_ImportModule("_gldraw"); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_cube", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_pick_cube", (void (**)(void))&__pyx_f_7_gldraw_gl_pick_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_init_buffers", (void (**)(void))&__pyx_f_7_gldraw_gl_init_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_delete_buffers", (void (**)(void))&__pyx_f_7_gldraw_gl_delete_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_cube_debug", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_cube_debug, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_select_debug", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_select_debug, "void (__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_init_object_location", (void (**)(void))&__pyx_f_7_gldraw_gl_init_object_location, "void (__pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Execution code ---*/ /* "_glarea.pyx":30 * # This line makes cython happy * global __name__, __package__ # pylint: disable=W0604 * __compiled = True #px/ # <<<<<<<<<<<<<< * #px __compiled = False * */ __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____compiled, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":48 * # pylint: enable=W0614,W0401 * * from .debug import debug, DEBUG_DRAW, DEBUG_PICK, DEBUG_MSG, DEBUG_NOVSHADER, DEBUG_NOFSHADER, DEBUG_NOSHADER # <<<<<<<<<<<<<< * * DEF SOURCEGLVERSION = 'GL' #px/ */ __pyx_t_2 = PyList_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_n_s__debug)); PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s__debug)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__debug)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_DRAW)); PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__DEBUG_DRAW)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_DRAW)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_PICK)); PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_n_s__DEBUG_PICK)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_PICK)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_MSG)); PyList_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_n_s__DEBUG_MSG)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_MSG)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_NOVSHADER)); PyList_SET_ITEM(__pyx_t_2, 4, ((PyObject *)__pyx_n_s__DEBUG_NOVSHADER)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_NOVSHADER)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_NOFSHADER)); PyList_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_n_s__DEBUG_NOFSHADER)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_NOFSHADER)); __Pyx_INCREF(((PyObject *)__pyx_n_s__DEBUG_NOSHADER)); PyList_SET_ITEM(__pyx_t_2, 6, ((PyObject *)__pyx_n_s__DEBUG_NOSHADER)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__DEBUG_NOSHADER)); __pyx_t_3 = __Pyx_Import(((PyObject *)__pyx_n_s__debug), ((PyObject *)__pyx_t_2), 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__debug); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__debug, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_DRAW); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_DRAW); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_DRAW, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_PICK); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_PICK); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_PICK, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_MSG); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_MSG); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_MSG, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_NOVSHADER); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_NOVSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_NOVSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_NOFSHADER); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_NOFSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_NOFSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__DEBUG_NOSHADER); if (__pyx_t_2 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__DEBUG_NOSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__DEBUG_NOSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":53 * #px SOURCEGLVERSION = 'GL' * * debug('Importing module:', __name__) # <<<<<<<<<<<<<< * debug(' from package:', __package__) * debug(' compiled:', __compiled) */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s____name__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)__pyx_kp_u_48)); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_48)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_48)); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":54 * * debug('Importing module:', __name__) * debug(' from package:', __package__) # <<<<<<<<<<<<<< * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) */ __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s____package__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_kp_u_49)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_49)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_49)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "_glarea.pyx":55 * debug('Importing module:', __name__) * debug(' from package:', __package__) * debug(' compiled:', __compiled) # <<<<<<<<<<<<<< * debug(' GL/GLES:', SOURCEGLVERSION) * */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s____compiled); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_kp_u_50)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_50)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_50)); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":56 * debug(' from package:', __package__) * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) # <<<<<<<<<<<<<< * * */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__debug); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_52), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":100 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_1init_module, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__init_module, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":190 * frustrum.picking_matrix[1][1] = 1. * * def set_frustrum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * frustrum.bounding_sphere_radius = bounding_sphere_radius * frustrum.fovy_radius_zoom = frustrum.fovy_radius / zoom */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_3set_frustrum, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__set_frustrum, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":196 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_5set_background_color, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s_59, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":201 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustrum.multisample = multisample * */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_7set_antialiasing, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__set_antialiasing, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":204 * frustrum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_9set_rotation_xy, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__set_rotation_xy, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":240 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_11gl_init, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gl_init, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":266 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_13gl_exit, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gl_exit, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":276 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_15gl_resize, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gl_resize, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":289 * #px glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_17gl_render, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gl_render, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":309 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px+ * selectdata[0] = selection_debug_points.modelview1[0] */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_19gl_render_select_debug, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s_72, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":381 * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * * def get_cursor_angle(point1, point2): # <<<<<<<<<<<<<< * '''The result is the angle (on the screen) * at which the mouse cursor needs to be drawn.''' */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_23get_cursor_angle, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__get_cursor_angle, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":524 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_25gl_create_render_program, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s_77, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":545 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_27gl_create_hud_program, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s_80, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":558 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #px def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_29gl_create_pick_program, NULL, __pyx_n_s___glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s_83, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":1 * #-*- coding:utf-8 -*- # <<<<<<<<<<<<<< * # cython: profile=False * # distutils: language = c++ */ __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); if (__pyx_m) { __Pyx_AddTraceback("init _glarea", __pyx_clineno, __pyx_lineno, __pyx_filename); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init _glarea"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* CYTHON_REFNANNY */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) { if (dict != __pyx_b) { PyErr_Clear(); result = PyObject_GetAttr(__pyx_b, name); } if (!result) { PyErr_SetObject(PyExc_NameError, name); } } return result; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { Py_ssize_t length; if (unlikely((start < 0) | (stop < 0))) { length = strlen(cstring); if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } length = stop - start; if (unlikely(length <= 0)) return PyUnicode_FromUnicode(NULL, 0); cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (Py_TYPE(obj) == type) return 1; } else { if (PyObject_TypeCheck(obj, type)) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%s' has incorrect type (expected %s, got %s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; #if PY_VERSION_HEX >= 0x02050000 { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { /* try package relative import first */ PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; /* try absolute import on failure */ } #endif if (!module) { PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); } } #else if (level>0) { PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); goto bad; } module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); #endif bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) { #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_ImportError, "cannot import name %.230s", PyString_AsString(name)); #else PyErr_Format(PyExc_ImportError, "cannot import name %S", name); #endif } static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)PyLong_AsUnsignedLong(x); } else { return (unsigned long)PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)PyLong_AsUnsignedLong(x); } else { return (long)PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (PY_LONG_LONG)PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)PyLong_AsUnsignedLong(x); } else { return (signed long)PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (signed PY_LONG_LONG)PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_Restore(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(type, value, tb); #endif } static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); #if PY_VERSION_HEX < 0x02050000 return PyErr_Warn(NULL, message); #else return PyErr_WarnEx(NULL, message, 1); #endif } return 0; } #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportFunction #define __PYX_HAVE_RT_ImportFunction static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) { PyObject *d = 0; PyObject *cobj = 0; union { void (*fp)(void); void *p; } tmp; d = PyObject_GetAttrString(module, (char *)"__pyx_capi__"); if (!d) goto bad; cobj = PyDict_GetItemString(d, funcname); if (!cobj) { PyErr_Format(PyExc_ImportError, "%s does not export expected C function %s", PyModule_GetName(module), funcname); goto bad; } #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3 && PY_MINOR_VERSION==0) if (!PyCapsule_IsValid(cobj, sig)) { PyErr_Format(PyExc_TypeError, "C function %s.%s has wrong signature (expected %s, got %s)", PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj)); goto bad; } tmp.p = PyCapsule_GetPointer(cobj, sig); #else {const char *desc, *s1, *s2; desc = (const char *)PyCObject_GetDesc(cobj); if (!desc) goto bad; s1 = desc; s2 = sig; while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } if (*s1 != *s2) { PyErr_Format(PyExc_TypeError, "C function %s.%s has wrong signature (expected %s, got %s)", PyModule_GetName(module), funcname, sig, desc); goto bad; } tmp.p = PyCObject_AsVoidPtr(cobj);} #endif *f = tmp.fp; if (!(*f)) goto bad; Py_DECREF(d); return 0; bad: Py_XDECREF(d); return -1; } #endif static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, /*int argcount,*/ 0, /*int kwonlyargcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_globals = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ pybik-1.1/COPYING0000644000175000017500000010451312130247775013706 0ustar barccbarcc00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pybik-1.1/data/0000775000175000017500000000000012157424343013557 5ustar barccbarcc00000000000000pybik-1.1/data/ui/0000775000175000017500000000000012157424343014174 5ustar barccbarcc00000000000000pybik-1.1/data/ui/mousemode-quad.png0000664000175000017500000000316212130247775017634 0ustar barccbarcc00000000000000PNG  IHDRL\sRGB pHYs  tIME5ͯ[IDATx휱rLY4wIؙN0qFK_:TZ8J s$·= {B4M0ࢂ6Dee8<۶APUU gx||,9=}߶m]u]m{&7t1YnA,KQYv W28ܶm۶8wKC[R,3WnI|+7w'9Wb8H$I(aX䝆+RqV5TUUUu4Z-qNCbX.TUVF1N%RJ)9EQFQݖeBenF#EQsL3!RvPJzNWKzJX$UUِJe"L$R>,.]LrcAF:6!f3:"t1y8lEFc}gǦp_NngFk6^oٜN'?eNf0nw:sonWӴZtx DialogPreferences Preferences 0 Graphic Animation Speed: 1 100 Qt::Horizontal QSlider::TicksBelow 0 Lighting Mirror Distance: 0 0 0.100000000000000 Qt::Horizontal Lower antialiasing means better performance, higher antialiasing means better quality. If animations are not smooth, you can adjust this setting. Afterwards you have to restart the program. Antialiasing The program needs to be restarted for the changes to take effect. Qt::RichText true Qt::Vertical 20 108 Mouse 96 96 1 0 Four directions 96 96 1 0 Simplified, right button inverts move true Keys true Qt::Horizontal 40 20 Add Add Qt::ToolButtonIconOnly Remove Remove Qt::ToolButtonIconOnly Reset Reset Qt::ToolButtonIconOnly Appearance 0 0 Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers Qt::ElideNone true Color: 0 0 Color Image File: 0 0 32 32 0 0 Tiled 0 0 Mosaic Background: 0 0 Color Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() DialogPreferences accept() 248 254 157 274 buttonBox rejected() DialogPreferences reject() 316 260 286 274 pybik-1.1/data/ui/mouse_0.png0000664000175000017500000000250412130247775016255 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDATO OkIENDB`pybik-1.1/data/ui/about.ui0000664000175000017500000001713112152104606015640 0ustar barccbarcc00000000000000 AboutDialog Qt::ApplicationModal About Pybik icon Qt::AlignCenter 1 0 16 75 true appname Qt::PlainText Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 0 version Qt::PlainText description Qt::PlainText Qt::AlignCenter true 0 About copyright Qt::PlainText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter website Qt::RichText true Translators: Qt::PlainText false Feedback Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true Translate Qt::RichText true true License true false false QTextEdit::NoWrap false true QDialogButtonBox::Close buttonBox accepted() AboutDialog accept() 248 254 157 274 buttonBox rejected() AboutDialog reject() 316 260 286 274 pybik-1.1/data/ui/mousemode-ext.png0000664000175000017500000000400012130247775017472 0ustar barccbarcc00000000000000PNG  IHDRL\sRGB pHYs  tIME4 :IDATx]=OLOUL*ZX4.eR]G\'8z"HTEOcLA| )NW{zL <<;;㙱$|dG6 H Bl D$IR) _V+˲~߷,kZE>7z\ nt!@5bl6$ɶmUU !)Ye#BzVCCIضy^)Ye$b2|@THc1MSQuME1M3dsE pj CM4MVq&S=8Օh@n FWWWRJ)dH|*BeUUa&Ȳ,2!nCUU/@5Qk fs-RSJwwwz@"apP[!uJ)|S8P=\zxI6@,kvqqɸ7mlG0hm;!-"a]BӓUEh8Η/_(4 Kq7\*yYr???2FDZ5Lz늢t:tZbFd'(zכL&e5Vzڶ =SUh<==mÍF2EpTPJ~J)ϻGmf3@ 4;Rzqq cv(ee{ʸBH~ ߄GPyvz]UխG:B8a| 1.K)@? !mxXx*RsU"[1- q@΂ H A|XB@' $n4Vv ̍#H8F,]G #oM㜝/˲^\\.a8ix<~xxv;;;nuݲq&Cez~Niȁ(r zLj-l۷f{E xppp||Wu曋a( d?? hV oNINg<뺮x DialogSelectModel Qt::NonModal Select Model 1 0 1 10 Size: Height: 1 0 1 10 Depth: 1 0 1 10 solved Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() DialogSelectModel accept() 248 254 157 274 buttonBox rejected() DialogSelectModel reject() 316 260 286 274 pybik-1.1/data/ui/main.ui0000644000175000017500000002572112152244000015445 0ustar barccbarcc00000000000000 MainWindow Pybik 6 0 0 0 0 Qt::LeftToRight QFrame::StyledPanel QFrame::Raised 0 0 0 0 Qt::NoFocus true Qt::NoFocus true Qt::Horizontal 0 0 0 Qt::PlainText 0 0 PushButton true QFrame::NoFrame QAbstractItemView::NoEditTriggers true true true &Game &Edit &View &Help Pybik Toolbar Qt::LeftToRight TopToolBarArea false &New Random Ctrl+N Ne&w Solved Ctrl+Shift+N &Quit Ctrl+Q &Select Model … &Set as Initial State &Reset Rotation &Invert Moves Reload Plugins &Preferences … true true &Toolbar true true &Status Bar &Info … Rewind Go to the previous mark (or the beginning) of the sequence of moves Previous Make one step backwards Stop Stop running the sequence of moves Play Run forward through the sequence of moves Next Make one step forwards Forward Go to the next mark (or the end) of the sequence of moves Add Mark Mark the current place in the sequence of moves Remove Mark Remove the mark at the current place in the sequence of moves true true &Edit Bar Normalize Cube Rotations pybik-1.1/data/ui/mouse_2.png0000664000175000017500000000250412130247775016257 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDATAoIENDB`pybik-1.1/data/ui/mouse_ccw.png0000664000175000017500000000037012130247775016671 0ustar barccbarcc00000000000000PNG  IHDRabKGD pHYs  tIMET^IDAT8˭S10 v2;q@0 Tf #*]hEd"E3WV=vU2En3ȴ.72sz%wP"Ӕ͎RΟx-|} +sSFIENDB`pybik-1.1/data/ui/images/0000775000175000017500000000000012157424343015441 5ustar barccbarcc00000000000000pybik-1.1/data/ui/images/diagonal-lines.png0000664000175000017500000000033112130247775021035 0ustar barccbarcc00000000000000PNG  IHDR@@PLTEgtRNS@fbKGDH pHYs  tIME&`ALIDAT(α  KGpG,S$C@.IDATxyŵAE ƀyOƮ(.5.?]p>1nA2n("QMT@e?dfUCRԩTw:)))))))))))))))))))))))))))))))))<xO%rٴlwfͥ#iE+ZӒu+(SL1%G~;NW+e.fwSЄ^!nƇ̠wsMhH/R|1=ӂ< 2J)9њF]_lΦol4//{o[ʙ#,;ne_ߎDw^b2}|;PSe&gȷrF^qa*s6 wa-F( C{י+ 8ܜѓww2\P齳*`N2ybn[VsQ0Nw|;;is e;] V]|LWߎO#X3ىwEkF?/T%|ְJxf4ؙΞ 9O+ 0G+t2PQ_2xk=]ʾzxGCn4.s44\bo'q3-NH߳=-%i\3w3iXޖa>L@/6MS5G38/R<{tbvb#s?sO`kރ,?O|Nag1>OG(ЏC"h{o6s`u&"(E߾|7=;ݽFdWߞ q`"7&|xxgW73#8vUѺr/.ʥBĿe~dZLωnx]QF_ O, "7FEM"! WP&ut!¡i#;/s7R=BQ5ƀ4Η}x?gFǔ,gViP`r8Jz 9wvI|rI0kEm20@T*YpJ"$rkT'$>! @(9^8Vri}t}.J 7ɂ%w},2yrb{_j ʖXuG*pd.*ް pJ'-cբ(  sfuGD)@ LLՀgF&t1}D o$0o~OC쾠o3N}#e,,g4ZەoSl/2ve";j<'E 񫤿4(zoOmδk3{DsAALٟ!EBWQ ژQ[SuCɌ 4dF!r^KߞyzM^Ts{ lZJ~<Md挠$'$i#X7q i{&',* f @59;1)(iQo5_ 9Y;!}51uӶ"8`rʭ/H$BRAO{I$?gTO00Tz>CfV::cO+sʻ5oQ}j~1@Z^;2QqI16oVU:5Tv6uOk+ͻ:~ QpbS%Cy.nb0_)k -lf^5=حWDz1/1>* 9.T4/ %>ܧqwD6詎wxdݓ;ė}s5j]4* ]5ޑ315i<ɟ4jq6tp^5?)3<ӀgldȊ7|'=&_lz>X{Q1sgƼ-ք'މ%_?c0{f@OXYIaeJ@'6cFe! .5XZ1_,6R5v$U+_Rwg] EePeYoJ{\LyS8Suepa?)iܦm)aZPh}3@ie6_IR[Oʑ0ڏW8FZ:LBwB-SwK, qվru-Vv+衹&imG .azcr,IXɛWX[/^eCsǝ!UhzQ.|/Hc q~$79ZmZ^No-M*8-֋oO%8ˋ **JFd8V|)1 Fth_gh2S{j qϾG@5O_YY'J@&Cu,>,~o1'|>5珝7uL~7M7'Cekn %)7s`F,k': :~~:jn3 MD*D{Ϗ¥ۖE͌Pp6FZPVrC]66#Hp9IøY<^<љ7&k=e, tem-/:c"И"zi =2DxVSGhΫrNeYc ލq^ѼSgՠy `W樈4 51>pK2?{~@Id<>#44[JïN`udLd1)Z*h*p%D?פ]CkdpJ~єmDo9e*-XãК/Z: Q'| /, m(3ۼ뉟mR-\?[w ~ =[ְr_bK`-Z [_h[眻c;"{D;`cy޲]$?8+;&ak蝽* bd[-M+8()aŝ6^绳p(Upb\1amk%UZwP#c %s ajY' +9VtatAk C qM4( BpX94c$EF[xNҖw:.F&0TkkYXbBM3' Wb$v_ kHŢ*ș32<#ћ_N'C+U|XL&Iν̵bo2+ 4q?O3u8X,f1b)fգL7ѝ^֦aJw8*V:3?-ZҒFGGq>ĥw}Mgw\ʛLa |7=>A[ؓ9i`i6iLc }7I[h>;FyYe6sWfhHQitbwv hEkZєQ@#`luR JYbJ(OIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIóF1̂%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/YIN YANG.png0000664000175000017500000001256012041145171017320 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATxyTŵ (" `H@5DDP|*桂Fܒ-&OM1ѧ]&=+ DǨȦ 38 0cP.]}۷wkSuNߥ9`X,bX,bX,bX,by [)$Оn3iG;ӖBRATPf6Q.XRB %lb+Yr~-0.b. s"EYûe.Iw?iA9 bR6{RfOMeHA  7Wjx1 /"L6=b"sD#2QIT 5};'Ж=B7:z<'CN8ihլb5Yfh1FJK_qdsC/;oaڵ8aʫlW%|%4lIlP일Tr=7v)9&&['J!Yr?Hvp)8&8CƱ&.J{)`eV[IKc(;S8"NV3%y j10 KeDec+bJI`SYp*#Zg$qw#b(T' ~aU?l㾄=j`/EF&BOMxٿ LgL`U1 F y`hGX.5Փ`>9HZ9m Nl޴/LZb\ٝ}id8&/DnLsraS%;KZ5\ȶN % N[YtV8y% ,rp$+|/WI+Lj>]_CiB}]`KfQ3rUO@gJf >$u*f|\;OX%Ҋa2oU̟S129+5>;Vpbz٧+.V$h .pb3|KD>.h-Vĸzq*V\ӱV+LCZ̸y <^ZIBZjc7?Cڮl(&OGޡZYi>etV+=#O'T*" ޛ}b_6 3<<==k&(I+e\JiyeRY->DJ1>J+< V*9,(=]Z|[JG|~iAisGJzI+dgT#$pOqJŀ@/u&'/Jń=#;;zs=J ibw3IĖx~j"Th V!%R8$Jqe_3gKH?V*RY` =\ZϳL|JpGV*jǿ)*ŘB>p @\bg0<$8RFKq$)> E졊*ֱK0f3\$)UgyBLci9M- OT#A'Oſ( O#YonuK%q]ZU|Tx,Qc0jsSU vwy&DCSLC`8S2{>cM+]^*1EЯB&,\ޔ 28l!QZ.孜 =?63'nof7~pȔp ye &-z?5}g'~cZH|uUxIwn >:7Z8&']v #5gplV5!m!q0}3\ߘJB< Q&[xJ<-q}Șf<:9y+?5I4뫀; 4 >jCu@2= ͨpl@f7k[>7<"m'LstYg?3Mݞ7tbUNi!by&]'9%v\ha_ Os 񸣟kgP||KҶ29~pgHqҶ2y r}x[M&5YxOG/JP|OѫMSRcdh2t*]"7\J[ǹ-Szjd߁u4=$cU v}^J5ph֭ *hσ 6ڙ+}ڱ~9>{r Oj3ѿ=W@Op aFeTŮxaQ=PP _b.VA3[\z`P(~2iɸGvm$ J)h6@"Wz\fIbzUDuJ9{8`g{iEW;+Q6` Ot` izd7Orc[w&2P/ dM{xt4Zs(Qc?w'/e0ϐ)^Vv pԋl>ST#%OI\VWM}F itfj8TjSS6uPRhJ|8H pJ|IM#4i;QN[_Vz8j5k_k@-2rki5@E 'V y; ܗทURq] [cguT>+M:JvSqL;?xNPRk CiԢmd& VSq:I</tYt9hN~`hl^ wVrn7Y|lҮ=E:RMr3\^vEҷPrf HOӺs[YfjPMM/C\º3[9P@6+O{HZOӰ4vhߦqXJk lw8~Wwvqg2n Z*u3^Gf:K 2ỳ@yϚS\i(9xOC%( iiEaӉ^LWZS0;?]m2X V|庭ӜZC^w}g2TQf~1Z'#%ڂ\dF$R=:azwӇL[FyO^\Zt9Xz(0KK_+~/[rj^ n\L@46FUy>#`:(3;)vi07AoeF`toʑ 0تyɦ8]\[t^.E1/}ItC-H87_jdg83i*;忁sQ DTWk AB -=<&Iqi`tCHm~cJQxl'":'0.ij%6 L,ޤ: ӽsƉ4hLHJ tn'!Qeeᔔoa¨TDވ< dOJ]e^M& [Wc6ࣾ_AaҌ& [;&ܮT7msX7Hsu3,7rk@2Շ:_22_[ZrҝQfgBJPA7Ҭ2,L3R86[dC4uҝ$% l6{3݇gM[vb7e<huL/ S԰;* >Yzi۳r^5(l[ 23DG<\0d Y*ֱdq9I/34_Z.å*biEGzE6V!%߃dRgR*n1E)'Q.EuL̟|^fzB5ߒyKVjmQa3/tf% &=9M$: )5͒RPi<bIwđl[h-2t='ܒAb9wkJ udI^cν*N\Z^w2^xͺqfݝwS'>SÑklargF1Vni2< F*|[pZ?}I2X3<[G)?0mf,-62$ʘ#it@rJF1)k4QùJ[[cĥl&q fєu6N8[=YK_|%E %}\P!7K!֊l6Mh)H0!G zew^tg1—ax:\v)ѓ Gp`GK!nRɤ!(x ky 0[XMIl61MOVpfye2U\(Po0&s+M\>a5~qo2}YYϴ '3 8rײLܼe7R`J%Paь<ҕyѹ#Or_3iٽy. g8r\6Iw=sН f0 %|.U}^petݬe+XJ5Nҍt:Ўvь"QH-a?5TQATPfH[,bX,bX,bX,bX,ŢّC%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/WHITE SUN WITH RAYS.png0000664000175000017500000001061212041145171020737 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATxy|! JAvBQUȢ%`bER(~PL BVяTmŊlDe3 {^余{潙{fޜ͛{Ιfr.          >.`-r#FX@&stJ?]I^(~qKt*Ѝ[6Lo@&kތ|_XvQ3+yX@J|gsAe[Vw>>qЇ102| 2-sHqnjK.<~H0 d[X9nz Q!يLW+j%Z)2[q~ ^FwJKE6p up6 ;3+^;=@|sx'hR|4#@+nN_*{-/9},jKEq*Wd0یrnRSIRX3E/C2pK$q⸧[|x}Z-@kTX[ e^>U1a pK _[j1%zmXNnܤpHiǹ%ZM {}刕(Dn+[IJ#i}R70Sirt?Vǭ?ik67cE~EFo=i k Pއ![/؍2ҋ~>0G1/>ZN}RRxa;L QRRp'_O$^!]uG;q+pdBRxNz\L. _,$\o I0{-}Cm"5NDUq!MfJ;)m@s9 bu =Sd0\\@2y6,gH2[!``9#Ұ*1S_ ^ppX@YkCvGG/KdҗR < j63@+FSPd @φ:0R~#z!W[iJ?E%j\h[&3jns{1(0'׶4cw~ U.Hś4p2LV+C\ـ [`rTn{ V0Ɯ!Ʉ֍ƟM2,{ =Zl$EqLrq1IllbLyI.D~m\;is^),UOr~i?c _q1 !];imj8?ԘG${nw~#U5ɸ3&?x ڑbmrD't@mi9$.؇4nC[9X822z G[->#8(D>b/8Rl%?8s݃ dW'ȿźgpu?3\:t?wpuWV`X7z!nN#Qf= ?2F-)xJl 'ĜJ !RqNPC!PR㧟G_SQ]Ҿ0mR-PotWQ9pRܤ..Q7X9 9Ƈj WW>SHD<$lPY`ehVr?ҮK cEϸlh 49$s#wY̶ +8%Һ#+bEXtvb lN|zÙ;=dpj+MC/Lk"8@8G H #p$@8G H #p$@8'xhoy4[n+8*$֫>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/BLACK SMILING FACE.png0000664000175000017500000001116212041145171020515 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATx{tUՙ! <&H"ASQ "2C[UTGrmgMю:S:3beR@"J*Qy$ %!@$7P@{^{{[{sgobX,bX,bX,bX4i їBKީ$, Jm1h(2I,#xO#biwxC.TvIO :i5/igȔ>񚸃/up0[ŝ?7sϟ.vM=eԚTf JSFn,XZ~q1T0@?*(݉[@)髽d(ySg`>3XN4k^o^j\g g=4:e24/"m; t4)/mr1a= ΋c/舖ɝݑ\F+T7#aHEJ9H&yFkyCe`[3ث9,̅,%K]sjPnE UUL<"Td"Z+n p)G!!P!UcL$_[bntG*RD;70 o( Лw!퍔dkB-_l ! 85 0*2= > @;w?@uK1?׃Ȯg/#i`Ei-J_rjs~O. HȤ+5.fp'9JBSjGbb=?_lF^I۩\h,g(kXR&St/1dwƫfǼ8sFc~J]X ɨq|ŌhLgO>?7꥗ͅzUl؀>GݵfhFA^8v`'}FSgW/ _c?_C\Y363Ş5M m0d@M)~5z+ y4^M`7WJy.p *է{t]/ jg3S/]ܗ[l%-WbUhP0j$@w*hSamJZX>AOV¨O|%s p"DQ'nuA os5EմdnL`jJLLss)qA/ ` bH*2w kLTXֱJ~neܺh_Rp|1K_)9J* `>pj6W>Ndn>6U`aQr9_+{+JcK34r ϝ=]Hqcm=aag1挴{p%1-,A[DNXU hym}ݗ>w oU%*!bcgmU>QѾdh! U W,b3҃iv^&:y_/\ܼݝM/\]l q Ĩr۪=MFbt=yM}wW6|7[}'>^8}\WV#5ҹ#{]2ʌ4e^UV~k_{j@|sG\>`l#W]*RuQ8WL—$u~'h:Ќ큳WUkjONЦj+ĭc1'; ]J^%I(˹s̅zVcYUJIZ*4%5uN~`ަF6ս$exbXc>& Q4XC[41K3Lxzs&3cĨft\]2jc^IXFOKjO%6yFw;U8Ѳ̳;9wA5ht'mr7B+&&o<'(~clY*m ذKǨL7wAy=JcHn j3#]@]X:]ыwe6l&h놰N 3AĈR1@}RR0HIA^wE+D=լ͊=cӘXN;ؠ9=(rb|fQH1ŌDmŀT6#p!gx]Q>&q6ډA&Y$\rE2,,wmPGd #ըz6瞖F.5ԢiVݨAl ˋ$a:pյn7Ѫ!Q_} .ZO-3Sq:Wܮ6CTj\M-0;uyݳvv2+gJ'_վF; K.2_:xj#,Q9ҁSǍ U; rAS˴(95S;61d?"jĝ~.brx]ᖵJI/<#ʯ㞟4k v9&䀇clwzxdӒLcE-ZCeT+}N"xd-m4¼4uiLJĬ_*3a1#WM dOEv#Y.$}˥GPZfJ;6qH|(2uJi2 .,Jw|:^DRˢԝUuwdbY<(Oi“͗Y7Y ]=+u/,2ixA?)]v?}2(0f%I?'Ig"eLfYCT5T6=(ɑgJOkB3`I8`)fE28B=u"԰W$$oK ) IDATx}lUww>P Q22EpA48'&&:=C&#HdnmhȲIp1*vs:GKτy&(zgLx{$)^< ` ';0~3a_) oe@JR>gLP:S>dLP6J, u&(kτ.[ā3w _p~q%τvgBu"nƨ3j!,ƠYTsQjo3K"B"sP  Y@,q4S@7?"X̢H"F2"P@@LI_aD $@+ƨbI#ZD˙f:%"(2d"KDjYJ"KOu"]Z)PcLJW­( FTNJ]XF^؝:%"sR6@|HWv\7yulHV~08"X90>y Rr~. p /_J())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))M+I .8 jiVnqĿc?m?}9/R&Zyu ǽoZ iGCWiVVZ^CW*tUd_›rc[S|Hi@ձ)W7R~iy;Wv=oȬlȬFۯ2;fۯ2vWn0 X$}lc8E:әr3|x3ZLfLW̱ib@=:̴aJek0^5/*Z42NEh9Xkne{Ū^>I/]gw{)[8Qu'kb]K_uc|UAe~0]5 Ob@zf3fa|0p5V:9S+~ 0fa6z x8̙d>˛t5}<?fkk'LAzXWwllc|)I/֚ǟt)J/S \0ZzqWL0fSTQh?M&8ɧxd%NUV?9"yRf M5򃴛YC^ VV9l j L}Tϻs83VY>=`6ϴ0N.wvrX^~iOC2w}y,kIDATxyN?g0ÑttQҭDJ4(-R)ipSߢxR[R!T(C$2s<yΰ{y~߳k-0 `0 `0 `0 `0A SNx}{.#& ]0 pDzMVDSHM I4`z$DSHM I4`z$DSHM I4`z$DSHM Ii@=Ns n f kFSAL3_ȷj̠*&Fo9S9aөʔnq{pG@w [ؐ(.biNv(PW>7&]K(ORY2`6KޝM%btD&\H(Tڼ)}?(ѡź1^m˜?I| -s~0fϦ@_&MxlbϬb  j?!bxZ)R-A7M4#cW[p0236 htDY!aYAn|6 %+Fy#͂З RK#>g49,0\ŒEb^n/3*搄n+b»ITǜtHTsr2E;$/=M7GF.'v/HHjvt>[f mEKh6'8(] %A7~ZuHpvᥝ\dW ӫt&Opô~-ksW cl[c&ÒkajbO{y,/ z#>lnõXZGaBqS O{e&B<*%'W|sr-L{9b{arzB]^Q̈z2-\a~Y `,ɑiҕA?J@,+̯H"oJ۹$]}#Zq Rd^#xQJҞ׫"!{qƭʻwY4[?6];29 o~nZWEranYk_ =?hnqWplHȢCʒa}ps{A/l,#S&:- d[-,]g@=Vag>uyx‛񋋁<9E*2Zk<u)"Յ$ph8u$Vz{!V|Y1%>+qYAq][9r0S<ʌPX)!4%|(P3Ea1m$uU<E! #S,2~bkk_bX j-[j"x4J(n'k~ZEd-YCL*"|^-MVct!1OXOPBPMTD0S6=#D6dZGy%KNY"=ȻZ 3#Qq N|鵳{)̍K!j"8/qƶd*9@=A|Uܪ"h8Lm&W2IxĉrɧsR&ᏁSqw 3)P *NQp;Ya`^~=ط['($`5>O&s5YWR+{2~2 cXI'A qs:eeE1W'?.RNen<i??As-yH: +kyƕUD-N,ti+;k%ʹIKvP}؇ ,]X(;_6h]@<#G xI%j<*=$9J`oyK?'үj3h`)AN5ۆW2~,4e,LS?qz@[ÀGe ygJ^z*J SN'nܲ>bua8 G;\(*]) *ovaZ8\ ,ܲ  &S%fm:),LCLH#'5 gbĘ'*\.޼S ~3K,C%d%A2&v=#L+Tۏ9Tr0^5=HcŽDX_bX9;l'w93at G<TVmd|#*(al!F^O6N"PY8J)VcdJy y]`C 9&L#k?EPG gOڭ+?-' ZAyRC:>mTQ`xQsRTH1C.w+䶆5U4A kLj? B44#I򻃻JԱtwծFI#x)J;E䷇Nu^.1~<"S*(UkG f,[YW";8qsKr5ci-eYu̹ΜDep g[HԌƶds# <5MϩH6m" ' Ȧ[2_ZKwqYOax&v8,zCx% p㎔j dq5KWꐥYt}\ItfN 鹵"ȠƳ#TԌyerݤq\̠. (# ݓB7g¿\ )y}hʀlT t^Yv0slʀ]dyJ)tnry7]Gzqv Z =^2_rγ0.~6鱌RE|y˩hO \@J"v^ VX]z.4cv`%uOtK%Υf%kiGxZԇ ʀ/.OފS@E!&s,*|~ ~w-ՂNY`5+qφЊJM:# z j$b?~5#h_PIUƳ܏p33ōj>\:PǏr F=}E%r cJnFtK l2*~9$ VB? 8WX~dk+UTOJ^kTa3-7Ƽ`5D[[ͬm ~mՒaƗ@ 3"3ߢ(X¾|SZ.O/6GxzA~W{EcV*,g_h+X&o^ShPSZﻝyf»+nXE?lL)K+ mmhqo&}ň񮛁"7]H eů=o9laC4d(Oш'ɗLb7s#oWqKR!jM;O I(?9/l>45DM>V뻔6wme~]r{m\3Np +~F]Y#J4R1q7My<`#rHP!f)G@jҍ^+{dRc@#&* *+͡9 b9v-pGG%0G5y69tf P^8/GC VFk0eAWw>puԲ!`ǩp0Ggk%磬MWkL:s;Wp-dJ%^vIMrS‰M}OmAmaAK^ b_MBvF-M4Bz&rYv'֞`zb8$YSGD9@^x،mg0c  za i<Yuo0=%fgGku5Y?``~$r.c pE}IOU^<b1#\ud!x> @&z /}|z%/9 n(Q V8*1iy)"p_T7}AkN{ YF+4:WSk@-48zUe*:H*S$Qlm,O`D %K҈di=-n00ΕMNR^ߠ6V;fp;lSg 8 d"oj)% o[텿c!ڏt qI9ZyЉ{ [(BEQsxf3j2]9$"ԐڪA7ARQ*qVW᝟H ox[?tx{ܙT\iZdݻzOV~.rz\:Q)eÊJ<)q$܆tricC6 cHk[AiC)Ͱ֓xmbU`_"/<Ӂ0,^iwtD lIr0F+tOW3C JQXP[s?]ͥ*4I S!lF;Ԡ$j\l-GT(C̶=mA7suQDSيӘh I)$L$0=@h I)$L$0=@h I)$L$0=@h I) `0 `0 `0 `0 A;!(%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/ATOM SYMBOL.png0000664000175000017500000002142412041145170017666 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>"VIDATxy|IHN8RD$ `QZģjRJ*xkmb/Dԟ-*QA@9D9?k~E;3<1bĈ#F1bĈ#F1bĈ#F?ZdD@DhIO)g{XGT h`f)D=@GPbb-Za=P񓩄I4Za7x崕Q+# O7(Z0b_3#8)"q&U0,bCh !!5MuqbxCXoQo1@ȧMhGK!,bp&t/r lq|Rj Ì$rQ7|hiHpədQ9SM`~Wƀ.r R%4 ]R('Q;FKb?KR1jp0O)NgTpxE.ޗ)ufG][I8Qiq_ߑjI&+׌D]5Kюqp~01_R,&WE[Vؖ1*ʷ3ծeНQ1dq.;6|N&گoX&aCɾ*?-iyL.vWWcAG&mPL'KVn:ё\Znp'7)ys 塚,qk&3aMr7w1tiՐ"\hw%ڼ7d:c+mJ.l GP+J2qy)mOVŤ;_ņ;mo3]8[J߈Ըyȳ!SNp2q̾Ld/a2&u=rVco"Z?ZQb"SILJ.L rP`P OY(Rjrt,_0oa- :3C*C^`Q*gB Q*VMWB0*aOx g}k:y_{~ȳ\_oU_ h.T6WgI 1l$O.ОUEH#YypbXGOd2uU~̕X<TZw[t4V1J+.8dyM: :|RiK,:@PG0VFi;$^GNPL'TYXt$0 w~M]$/&ti2U2+'HLݲBy֛1S3|>o@ɧD*i)w;_Ty\Ep2 c;ٹ9ђ!1gSlQ,S *fl޷ȠV~9}t;BݐMdzZOc:5LI(p&eů=i3zH&'䍲iк4xxKVCgoj:8- yDP@%u!r5^B~E,S*m1E7 AϯC)IQT.j8nPY>uA=E &`g]{ӽdҐ; ;'T௖Vw6@):R' J5P^_YȮ 0ɐ#΂5`0n lK8JqS}9LzG]H3kghgjzƵr_!M$'ʽ< Or90XM-[4r[{gCnϚ,TO͓؍7#h"Tso˚گAXe41mKp?Lz6ϥӊ^7TqJ@0\m x%,nyWK?(U'8 Ktf\d)-#(r+M^: U?3:[(zKs+#Mz~:bݴ܁XNLǡkAs &|X6Kݾ #@sFbʱiDgdD K O'kkAEi` \]WV8Zpo/?Wxu~DZb旭 H:~NSC.ɼG-ǿcڵpp:˗f/Ϻ ggtCy)}qjN-623P=N;@\H-d<pE]]>W]-sn#GNԤ6Rvhj"q t U?h] -s/՜VCXix[f6"`oQЊ$809~ݻʗgN[a\%™FǍD̀z)D䃗>:+-kW_ua8D2"ّ9*Z]=su4JҔ:U`(Q~Ѣ+5RyE^7 {*@opC Jo oL-|yeb;!Q1\Wˮ% EP%}zxvdpBgBcdķ 6 1vǵW n5~,?%fK]?&6)S{4Gȩڵp6Tf2۹$tr=_MfҪҳe떣!R`UG yz5yBx8Dc=\z<"!< ;qk:.BzΖr$tH1$B54((V җna&*FEtCdG]$>?)찙;)Ŭ@K̳K!>$ä%O2bdrGty b|O?B %f0 xäq $w#_xXsa0l/G]TOL3#JF)C̻ok^ͨD =AAxBIB=O3"º Q;B}KH?p1)pd&~N{5BX x;>xpu񹏫S]q+(x:ϔ:ΰr|O t `e`5 q1x0qMKƏiZ|d;XŤ:ILREr$eV<.6ia.>%RT(|I UDFM4 S U<qR=lB*ԭVzFKɥ"VH]2Ip̅.|-2t]*eeKUK%T-Erko n-\?l*H I,^R?D߅qBqtlb%1W7eK}!rٿYBw'}K5iS.~ڧ37WI(vWkR.~NMLFh.h#ȳ< 5)g:Y2݊_ o q\.yfe;TP(˄LBim4)vM.A-\>d,gh; 6 TL@$&<&Hg0VZ' خTZ 3ESjn3\nF[t&0kL{@]e! bE'`), *wG/$f' ^D# @'Z4 q䄞`C}Vj{:^mA[i3,:JE7CH3 |kf12M"mJ}>*ټ.5 p_+=[ 3$wʄƽ&f( hlTXE# ӹN1P>gJ{ci9QX'XGMh$ݓˬpi\Dӫ)&Ӑ_v2& >7l8SY):?Ɠɓ12wU^ u-ޝn *CIY<.s9c} 3C ErUo1.GBs"}.$&ΚTKi:xSI6˙ LQe2NE$L[J\ɴG ֊;- |T2SFdD+$۲<%/Pm : 0bc'K-zZK6s#vTN8cU7%W9|E'+Xtr?ȩ#xMM<{( 3%v~i3ll&K58t<}*zwn|~2U1.1Җ623-MXFLiadL 9'Գk9?gzCa;@&Xm>e:3ޡtx123=˲xٶ+&H-jŒR 8)4%uJ 9ed]ޘt ]FהJ:s2r53sS7|jVl‫s8Ǹǥ Xa ?rH nvSA r!O>9ԵMm=2>G[~ pMZ`Vr*h@Ђ|iš =bi&tJVC# ucJpHN?["%̴UVwVfpթua8b; u+fvʽUpak9 Oi'ՉJba6~2Eoz+$,TvrhNzs/kAֲլs>BF{q(JK}HJB+#t =MW,c9XJJzg9t":RHӔ\r&JrRNզgopYuЪx\xR%!2%O 7:KGԇR&ȫJ';_ +qCb)wJi>i. \bqsrEa+(,HiV$k\ &kM&KZtX4YO}l -Q1ol݊)6TsE'hÝ6 V* L#TlL;6oqcYg{?tp XPB.hQt8%’ -.\O# Q'w r&}DZQ%?.#l1|0 LOcAdrMTiF|pB>UࡘDž2Y4H&lԤ*qCqZѝI~B Q^5+#jbĈ#F1bĈ#F1bĈ#F1bĈ#?JIDATxyՙh@FEJB18 B$6j\3 $y1j܈(ɨAf*B*@Cwh֩:w~S|_gp8p8p8p8Ñ?I 0 zҍS6}JJYzR.;9LÚX|NwXLSF;ΥK;_ؔp }{7P~ӨZznD +YV{!Xܥ#]G1 ~^:(_OB{TӍ?Fͣ{`e ]LʥPdUHY/^,]5@oH2U"6eՓdvS?9Tr+]AM1s?E|}vߕ|fH+x| k| U12TFHW*IzwZNPfr!|+j)4|۴#|^S8(0t(-!0ZZ IyGTHj$-"\nL\aKK&) 0^Z@$.L2n}ؚYg%+e ? p gH HBw"󩛄8ŷ>9YZ@IH~48YZ@IHEKZ@IH}lRi IB$s'9O8 (-@CA%d' _ZBړ[hP#- $$@u_FQZ@IH_6H " FX.- 2.𾴀,D2=ici A$##-!J & mi p `ץDb`ݺ'&n:&-!\v'i %-@$LD$@RnP\]ӎ I򒴄P<#- 8O|u; եFr6i ȥg']UЪX^Y(Xr'o͓fGC1x٫Փax>5IUS(&j/["C9x8¹RHLx=$]% 񐷵7")Q\l| 6N* >EphhI[jyǙk  >u}b;A Jhk" pێV^=IhK7c *ʥ]v;LiwL-vEb Ҏ:Fe9MIX)b ZR&#Z },07KP+?>9Zw-|6:8XiM\Zi(Ccigla?Ka8g2JPIOJ ;vvլf3MּŸ<>[[S0RI%HGkS6T['qS!^_=w8 3'YKk wH]7\MQdx"NFsO^C^f3ȕy"9vWј1% 3gjxNghȩV%Ո1:6̀^\ǫC<ɉV_-&]}&yA 'H]÷MeANnMw8UCi"~cŏb^Evtd #}&+}!&9Dbvժ_CgOG [!*)R׭@2-g*ԫP):B}94J,)PqG[Y|ObC✙",;Q!rߪXb]J*f$X'{=b7;gM,f2C)>K \Sl^).v~)D܇%Ͼ ^1ӞB;çΩ勞&ﱌ@b>ŽRJ kh:T=vүݶ~fhq~fsmsK/nӁxڣ+:YkoJ{b_2i+-0sO]Ơ=1r  Pg qSKu؞{zѓ6^H-h[2x#dž9QAPbq&lZ@+q]\rDZok3=Bil6?Jee>մ4TsTm&F_tv{aq:6^f= \T-j2+fMW302 dlv^q.~< }&kT~e'lab3x9AeV똱՛R\5qNOb}JnQ1Cg=:r=WA6,kcr|Bj&HMJwfW2gMڶU[MߞB: ,ޮfNDo>Z o{B:m霓Ǽu[>JqO2mꟂSSF[Hr0zig2x\[VU7M|nF57" \+ ?['@icCiosaNt(](mEکvLs eb'Czr@ڱ6ОOŭ֤ ٨7q2OBZm暌=_^^z++)9y|pTP%a],fbZ;HpC{,V7"Rmynnl_I,gfrh-lY7>teҖȥM}к&@o3zy<:PN3)@7V 3s.ߊ׻Vj-4v`Fb!0x342MZ%x}ҺDNvo )ndf/4%pvn_(5LS?{m ?T?VlDuPfvx.X&c<ætHPJMajM|}L5Q bR1GdB[18dpO1Z#bI"b1wpn}h?ʽV]Fz 2߷BSjԜE̲k8V:Nkba C'lzn7>hgCr+NCcEV@qulru=r~oliڙ<{ґ{gfŪZ-cuXk7L5k60vƈl f<@6{5nCxcPch,: pyiC߶zyxl53+B,4JӤ^X8zclkrE 2~4 &Xs kDy%$d7xɹ`҃SO-[cYUq:ƪ- \0TЉԳjֳ"Tvp~hiސk_HrąW'-y`0u J_ߓ%Ia%՞. e9aҲd)[(^ eRH pHrCƗZaozҲ)[5Α切A> K s}?6^g,y `Y>7b}.z]֜^)?([ >}~_戃"672/-o9L6'JKsā LD0wvqO,-a$tii8;iiTZ+l8/|[9sry-)=ϩYf&-a?*. /Hsئs.f+ ۳_ p8p8p8p8p85ɧUN%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/squares.png0000664000175000017500000000022512130247775017634 0ustar barccbarcc00000000000000PNG  IHDR@@PLTEgtRNS@fbKGDH pHYs  IDAT(c c8  13?IENDB`pybik-1.1/data/ui/images/WHITE SMILING FACE.png0000664000175000017500000001362212041145171020564 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATxy|WŵYY$AUQK"ZDpJU[>wuAUqmQu V""Bʚ/#`̙{Ͻs|χr9Ν9s<x<x<x<r@Bt7;Q@#|ɥ*TR"XZiE17Crʘ,J)ak⠥u e{3.eWP'!s]GY f82o)żT>εQЃ (9}9o27(wH~@frvHW2yX>zvN&xMݴƵZ"}3K7LsvXKbϦwXv\ʼn1GNk'f.'&.%m#M'D ûΛL_fpkfy<%;qSt4UrHZkGa8odd6vf21-\j)?|lzSHOFҋSlJVVttz)RJP%ln1"O]R36ܫ:ap&PWre-3ȏY\F>P[.姮cY*&s;${ %)y'vL:dLȀO:q&l tt ҟ/"l>7׵ɵ̉*õq,6?O[y=U+9޵pu! qm@3 :sm@HhTHF~6 \-5<.շS7b\tJ> Z!]+nYrz SUe ߇p:7beuۿgk.xŜj4; տ_V[sXfJV;:B f-=fՙXjD68`kSd}'3u`W4uZ⛺.(d_f˂gi]-vߖldoM>2p=gV9aN )kV-kgfYw1u[MasZY|mqqյفuk͌ N ;oY:I'œ[{T<ByՎg d V͟Zktn\`5; S-wku7B{)`eK,2hm`l'?T- .V|nj'N׸VC3uk31Rjql= 8صp,_Rתf=zkUaZ QO߭y?1\em7"VKj.L6Coq<kaomR1\Pś]2COݨ7H)ؿCVxt\H-感 y:yՎOl Ɏ)RHzIJqu왴ɲf+|&0k,N2qbv%31/<% ɚ>BFxsu_2&c%#g MRMCE;-u앤XVWx@*|t[LoAwQ̉ 50#'SjԪ|Iw1,)|hL\!zƪ۽ٔ Иt9om;|d[!QrYEzs&$oJUǩڽ]D@l";`v5 cɂzƗ^bA*5f)Z>C#\A=' ;^4Z*PnPu6[R}Nh <H@lz:j\yόtOOFH>EKh||!̦H6wW0PG)%mS fҾQ(T_+i#hf&ʌ_kiNf(ApՀ {Zt>yeLWg&K9s1z,H]/'rV1%r)QFf/\ -x8|Yp\3e}>>7f 6i9u]hJ3%>ڇ&k^eTwYcn ] o-k詬ͯu;*sĢ=5~R]U٭_\ rV,<J1VUw媘ty%*YF,2 UY@[ғYή4'bofy_3L]\BgW1걙nNO 1pE1< ߽/&(PJ|=4*205wZ4Q5/'~\.cCF'{eT6VTlF&3U԰:p1/**$k^6ռh„ lmƖ1J)Ե'Z)fNS\{b>0-nkf" #͘#蓧)g gnS'm'āf+(ߍ$`NŜ:[=?bwcԘ%#̵7Z!k1H:@2zl1F~GsRs ;Ftzgtnr2N7=rF[N!`ɽb,[6aגP Л9]D\B1{h $Yiת՝!B.3(b=5-H!cgKy G *JMlq]J6[/x2-h՜mYgȵ2~84 #4ck6cʊǰچ$yxjG:S 6s`9:t?&ʬd䅳3"g%`){ *[q3)[v6&!jӔë /81VN֥9I K 1u'8 C0]Up+yLϸ |(m]JAPo0ibŇ΂O7Ԍ=ntelKg%29{Y9\xc@d|35*{2AŮ scaq<.TtG6LCwJ=[W$(FT͖e`˾NZ0 [*kYcR_ ,ϰpZ22 ;W9APIqX Rjr\!j++n^AKN@ BzT+9Ν\VRF||@uvbX&88nc|K݋C|> (]7WU"sPotc-\Mc;ֺnnvdɧ/DɃteN7[k5=#*$ xաqڡriT09+C(*LHC} (}2ˣszYjޒLQg&e~f$\ۈP] OU( ׆>OTWpH2:*Vrp@qllaYl_m-B~tcbQHCe!?VFi9Y6+Mɢp@]yiQ5sxdm8:.sCpZm݄ć CȌnX˨1\*PL>|E(z1.YC{&(nm,(TP \ȧ33Ywy1 TsG򖚾+,z-MRbc?Eq*If&kdY#bXo IB@6){ƴiB3۠2UߨG'B.\`šCq)Fi7Zf28ӿrɱzY>krϲ8e-yx{uu.4/7r2:,b}u8o*JFBLS ZtqK)ŷM؉b'(%~,J7}@ g*md 7~v]t" jf1:XS^gZ,[Ƴ͢<I/,n%,j-Ɇjjvry|$yNR?~q}#,}VmJhY|7q0扏=6 B&4Cde&DNi\o-/Y^ l2&$A!' oH};pumeq*;u. eNq.-'0Iƹy)V86qqG褋[:^ģe:0V4%upő,Ppah.ױRُk𫯗Etn)y%WJ&s=Ǩߝ[ȫjg Uqu7PB)%au:П"R@jWՖ@wM )TRA%lzDy3PHWzы^.ɼ¯Yc 1g,J>ofЉ{2*\iK.U Fҗ!oPi0&r4<~Ikf"2}RֱL`ae6c[2G󦴗9>5,-"jqvXK=ctvT,\˧^z{ "')}90*f*S PO?(bVW0xԸ6=*-4C0&O) բuzPDCoz)T)̢6)ZnؚN;>:~SHC*Y * SJj{<x<x<x<4r%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/images/SKULL AND CROSSBONES.png0000664000175000017500000002344612041145171021065 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>&hIDATxwևe] I@1c@E(({sFr (zU>#̊"($ $I^ 1:tίNUp 2 2 2 2 2 2 2 2 4!T%lɡJW PiLcӀTT3{v ekYݔ  86!L]]2,(FztaQ^BB?K.ye?R傺Lf< $X p6Cb#_+XšXrESp(ia4uW3xOtCX %a,9jI&qXL)gJН.ȷx(:tQfRl8?讫8 ;QϹf| AwaEu2> @3OLƃrvDVDtOc4qЋ +h+jnGJ@d~vъWgS<^$?3[@-DTVoj%_b' WiZj WYK&0"xfGMh*F+w˟J.&[tt V)=&5-fi TWrZ%]- TdsO \")do+}((|6麙{tPְ'BG{•/!(`yyIJ`t+.hA0.鎼: IdB1Y2NN`e~JF `Hw}1 d3P1ZJCsw.3Fwvz*B(J%]`[>Y+]lwV bw20 GvJ'DK_ P(/Um 2@B8 4,}ȕD_)B!ǿ`tr1ђ_cUa.}eD9H ,B< 2.˲< 6U>*D| 0jI~ i$ PVvI=N% a%]2iZIW[ Obse3ړ#U| ~28 %Y*IkG@4폐O{'KrfJ9w}8^Jd-Ӥ{ӥte&4B6~Ub{r8otepӿ\JKٱ"C:RKm|_=/qJDzN9-/ K:or 9\B:WEwt/m;qhЄ&G(Q#ҝR(cU!jkɧ iBsZxr^&+@`!pG`ᷯ7xZP ,/MhB}R:KlWd9⯧lb#Ya+qR$ Eh4^; MV)6:WhkE,g #bk|xBzkV2cvpTe.z;3/?-|/T+J.X)4LX Y1@ ư񫏦B;e I"ΒrvXI_?&ntk+-6k. [Xy _OQS ]3Ҩ6;pxmu2Ss3mSXqEj%Wꉤ lS.Tأ˦-K"bW mM$icP?6}I ſķmyC&5:,d^*Icy:u9)b+ %Nh,o<[ I󎋧0{yr KV'{+3$b0E M65j$x*XHmMI9 aNm h-I J*GU^üTïKtJ|UQ1E0P051jI{6^"ܙUܥjׯ{YzE>RATq3l9o/1ANjirUs5RQz;Oq8)=Q'GU~wk#_峛FVWdyГX msrl1/t{Ycy}t2JvQz̢ _iF]vU#3SL^eK*D8]J1MEXּOG%Bm/Nـ<[kd+໔={#Kȭ2@)LQ@jZe÷m{irX0B*RV_LnwPG QEor" xvWUf.Rn.=ȵd雾^9,X"]%څ=cMFҰn=RRJC5]ubX. mKpT׭y_zB_R6e7@_:9rNQ(X`|B-$Ey5q;8'lH BΣ&KlI d:٘6')x%R-f/xTg2 VsׄRLrՕ3C [0g^A$w7.N(MV GQ,ein--]_Z\yu s=iVʱWg<-KO؄ CzEv-1D,jhKMH["/5Ęu-ê&S6d-aȕBL0ul2Σ$x/;f/)T󗥻yy`cl.7]fBq;+XrZbKu8ӕ.I쯙 cd凘?LLAd9 F 8Nm͝I3"5J!e:L?n r^-=u'5tpv d&scn)&I(WL ʕF?޴e?}٠$&- 7-IgR. )0. MztgcS] =r6䖈ђp%&%Q%[ wpcW[ћ$9,cfU18еp̐Gw].dZj;t-&۱q՜ߖJtegJUM a 5&Cr.3-EͨqCU˴ tOICdEW*yifEf_]_3 O*.ZMKGOY1w?9 VJƘX9Ślq&GтZTcv -E*W1D}E'EfgL}23M:Ğ55d7#>sJC ߘ\IGW:UZU6>Ɏ[ @o%eϕLFH+'q4@T&&xۖQ9v,piW'e'*-YI>"Iwmˢ/߹HF ^dڬ8F9JE^zN^v\y[5^iCwjXVfr58DAY\dq:>Fd#!$=lcZCT%Zs3R2PS o$*M te)զse3)%y$zr1U(C{ I´4TR[;hA&;BΑ@Ո(z`+:^*ѼNnjI J9wL㥥N7zhMrDÄG',Kޏ蚡IO -:pyr]=mn 1| ꭤ$mR9=y2ߣR6my\gs3[4@{ yHQfBbۨ3ظIiH7Cubgao⡓Mc01C 3w`tt/, F3*(b) C1tq=SpԊg}R&2 >L@eƄf Jrf5עعCa )gB%w 2cޏs9#y{qɺ5\cILV !jGjm"~2-g1`90بlN`Sd*& k 8 @g~TGD_~|F`c'q̽dBFM'NsDآ>WHOIMMe :Q?kqoHৠ 먒D"cQQ3 f"Z)l^.£tf;?T^vV2E'hysE@obp5 e+yneiԊQlXjwitlpO-V/ֹEO  hI"߁y^LmP0HSIDtqe RfQd:"Dܞ| UV+FLh׶Uݸ) 5#y?Pw3C+?sdl<9eg9EB,WӤ<1Y\T3 ,.CZu머n)HPw#:>ױ@KB QM x$,~?Er)cg?ibN&H[aMzxX'2|ڠOQ݌R&<\GEm턽JXcP8wE9B7EQ1N<ՆEb@3M2͟ep331n5.uSN|Cus z(|BÈ?hgz1Xc?C5.eXh|Ɲx]L8Guۗ~9hf2F;ݼO6-я#?h0B/3 @.sjgTX&iFOuɧ*졈"}ݘ͡}xAV`44Ak j |e)ͼooӘ͗-Ln l-ĨKts`/Ekn#<&[4Sx!^Y\-M^~?K.o*_cR)rF1=^8d!ƠBuRaקMnJ&3<*jr "ۥ{7+Aiļ{JyDN0׵/THVt'%H۔]1s4GSGkX`B'GI4%yWjiwy*UO'짣:2Ў&\WR ˪tܑGea:)yQIUY;]ٺFMdD%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-1.1/data/ui/mouse_1.png0000664000175000017500000000250412130247775016256 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDAT%IENDB`pybik-1.1/data/tests/0000775000175000017500000000000012157424343014721 5ustar barccbarcc00000000000000pybik-1.1/data/tests/moves-fl0000664000175000017500000005425312137176560016410 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'f', 'f ', 'f l', 'f l ', 'f-', 'f- ', 'fl', 'fl ', 'l', 'l ', 'l-', 'l- ', 'l- f-', 'l- f- ', 'l-f-', 'l-f- '] edit_pos = [0, 1, 2, 3, 4, 5, 6] game_len = [0, 1, 2] Conditions: edit_pos <= len(edit_text) edit_pos == len(edit_text) or edit_text[edit_pos] not in '- ' game_len == len(edit_text.translate({c:None for c in b' -'})) Limits: Initial-State: edit_text='', edit_pos=0, game_len=0 Transition: action_add_mark State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_text='f ', edit_pos=2 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 State: edit_text='f l', edit_pos=3 edit_text='f l ', edit_pos=4 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_text='f- ', edit_pos=3 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_text='f l', edit_pos=2 State: edit_text='fl', edit_pos=2 edit_text='fl ', edit_pos=3 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_text='f l ', edit_pos=2 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_text='l ', edit_pos=2 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_text='l- ', edit_pos=3 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 State: edit_text='l- f-', edit_pos=5 edit_text='l- f- ', edit_pos=6 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='l-f-', edit_pos=4 edit_text='l-f- ', edit_pos=5 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_text='l- f- ', edit_pos=3 State: edit_text='l-f- ', edit_pos=5 Transition: action_forward State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=2 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=2 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=2 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=3 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=3 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=3 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=4 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=5 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_initial_state Expression: edit_pos = 0 State: edit_text='', edit_pos=0, game_len=0 State: edit_text='f', edit_pos=0, game_len=1 State: edit_text='f', edit_pos=1, game_len=1 edit_text='', game_len=0 State: edit_text='f ', edit_pos=0, game_len=1 State: edit_text='f ', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='f l', edit_pos=0, game_len=2 State: edit_text='f l', edit_pos=2, game_len=2 edit_text='l', game_len=1 State: edit_text='f l', edit_pos=3, game_len=2 edit_text='', game_len=0 State: edit_text='f l ', edit_pos=0, game_len=2 State: edit_text='f l ', edit_pos=2, game_len=2 edit_text='l ', game_len=1 State: edit_text='f l ', edit_pos=4, game_len=2 edit_text='', game_len=0 State: edit_text='f-', edit_pos=0, game_len=1 State: edit_text='f-', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='f- ', edit_pos=0, game_len=1 State: edit_text='f- ', edit_pos=3, game_len=1 edit_text='', game_len=0 State: edit_text='fl', edit_pos=0, game_len=2 State: edit_text='fl', edit_pos=1, game_len=2 edit_text='l', game_len=1 State: edit_text='fl', edit_pos=2, game_len=2 edit_text='', game_len=0 State: edit_text='fl ', edit_pos=0, game_len=2 State: edit_text='fl ', edit_pos=1, game_len=2 edit_text='l ', game_len=1 State: edit_text='fl ', edit_pos=3, game_len=2 edit_text='', game_len=0 State: edit_text='l', edit_pos=0, game_len=1 State: edit_text='l', edit_pos=1, game_len=1 edit_text='', game_len=0 State: edit_text='l ', edit_pos=0, game_len=1 State: edit_text='l ', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='l-', edit_pos=0, game_len=1 State: edit_text='l-', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='l- ', edit_pos=0, game_len=1 State: edit_text='l- ', edit_pos=3, game_len=1 edit_text='', game_len=0 State: edit_text='l- f-', edit_pos=0, game_len=2 State: edit_text='l- f-', edit_pos=3, game_len=2 edit_text='f-', game_len=1 State: edit_text='l- f-', edit_pos=5, game_len=2 edit_text='', game_len=0 State: edit_text='l- f- ', edit_pos=0, game_len=2 State: edit_text='l- f- ', edit_pos=3, game_len=2 edit_text='f- ', game_len=1 State: edit_text='l- f- ', edit_pos=6, game_len=2 edit_text='', game_len=0 State: edit_text='l-f-', edit_pos=0, game_len=2 State: edit_text='l-f-', edit_pos=2, game_len=2 edit_text='f-', game_len=1 State: edit_text='l-f-', edit_pos=4, game_len=2 edit_text='', game_len=0 State: edit_text='l-f- ', edit_pos=0, game_len=2 State: edit_text='l-f- ', edit_pos=2, game_len=2 edit_text='f- ', game_len=1 State: edit_text='l-f- ', edit_pos=5, game_len=2 edit_text='', game_len=0 Transition: action_invert_moves State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_text='f-' State: edit_text='f', edit_pos=1 edit_text='f-', edit_pos=2 State: edit_text='f ', edit_pos=0 edit_text='f-' State: edit_text='f ', edit_pos=2 edit_text='f-' State: edit_text='f l', edit_pos=0 edit_text='l- f-' State: edit_text='f l', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='f l', edit_pos=3 edit_text='l- f-', edit_pos=5 State: edit_text='f l ', edit_pos=0 edit_text='l- f-' State: edit_text='f l ', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='f l ', edit_pos=4 edit_text='l- f-', edit_pos=5 State: edit_text='f-', edit_pos=0 edit_text='f' State: edit_text='f-', edit_pos=2 edit_text='f', edit_pos=1 State: edit_text='f- ', edit_pos=0 edit_text='f' State: edit_text='f- ', edit_pos=3 edit_text='f', edit_pos=1 State: edit_text='fl', edit_pos=0 edit_text='l-f-' State: edit_text='fl', edit_pos=1 edit_text='l-f-', edit_pos=2 State: edit_text='fl', edit_pos=2 edit_text='l-f-', edit_pos=4 State: edit_text='fl ', edit_pos=0 edit_text='l-f-' State: edit_text='fl ', edit_pos=1 edit_text='l-f-', edit_pos=2 State: edit_text='fl ', edit_pos=3 edit_text='l-f-', edit_pos=4 State: edit_text='l', edit_pos=0 edit_text='l-' State: edit_text='l', edit_pos=1 edit_text='l-', edit_pos=2 State: edit_text='l ', edit_pos=0 edit_text='l-' State: edit_text='l ', edit_pos=2 edit_text='l-' State: edit_text='l-', edit_pos=0 edit_text='l' State: edit_text='l-', edit_pos=2 edit_text='l', edit_pos=1 State: edit_text='l- ', edit_pos=0 edit_text='l' State: edit_text='l- ', edit_pos=3 edit_text='l', edit_pos=1 State: edit_text='l- f-', edit_pos=0 edit_text='f l' State: edit_text='l- f-', edit_pos=3 edit_text='f l', edit_pos=2 State: edit_text='l- f-', edit_pos=5 edit_text='f l', edit_pos=3 State: edit_text='l- f- ', edit_pos=0 edit_text='f l' State: edit_text='l- f- ', edit_pos=3 edit_text='f l', edit_pos=2 State: edit_text='l- f- ', edit_pos=6 edit_text='f l', edit_pos=3 State: edit_text='l-f-', edit_pos=0 edit_text='fl' State: edit_text='l-f-', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='l-f-', edit_pos=4 edit_text='fl', edit_pos=2 State: edit_text='l-f- ', edit_pos=0 edit_text='fl' State: edit_text='l-f- ', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='l-f- ', edit_pos=5 edit_text='fl', edit_pos=2 Transition: action_new State: edit_text='', edit_pos=0, game_len=0 Transition: action_new_solved State: edit_text='', edit_pos=0, game_len=0 Transition: action_next State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=2 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=2 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=1 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=1 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=3 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=3 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=2 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=2 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_play State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=3 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=4 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=2 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=3 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=5 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=6 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=4 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=5 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_previous State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_pos=0 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=3 edit_pos=2 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_pos=0 State: edit_text='f l ', edit_pos=4 edit_pos=2 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_pos=0 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_pos=0 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_pos=0 State: edit_text='fl', edit_pos=2 edit_pos=1 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_pos=0 State: edit_text='fl ', edit_pos=3 edit_pos=1 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_pos=0 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_pos=0 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_pos=0 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=5 edit_pos=3 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_pos=0 State: edit_text='l- f- ', edit_pos=6 edit_pos=3 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_pos=0 State: edit_text='l-f-', edit_pos=4 edit_pos=2 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_pos=0 State: edit_text='l-f- ', edit_pos=5 edit_pos=2 Transition: action_remove_mark State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_text='f', edit_pos=1 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_text='fl ', edit_pos=1 State: edit_text='f l ', edit_pos=4 edit_text='f l', edit_pos=3 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_text='f-', edit_pos=2 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 State: edit_text='fl ', edit_pos=3 edit_text='fl', edit_pos=2 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_text='l', edit_pos=1 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_text='l-', edit_pos=2 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_text='l-f-', edit_pos=2 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_text='l-f- ', edit_pos=2 State: edit_text='l- f- ', edit_pos=6 edit_text='l- f-', edit_pos=5 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 State: edit_text='l-f- ', edit_pos=5 edit_text='l-f-', edit_pos=4 Transition: action_rewind State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_pos=0 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=3 edit_pos=2 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_pos=0 State: edit_text='f l ', edit_pos=4 edit_pos=2 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_pos=0 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_pos=0 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_pos=0 State: edit_text='fl', edit_pos=2 edit_pos=0 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_pos=0 State: edit_text='fl ', edit_pos=3 edit_pos=0 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_pos=0 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_pos=0 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_pos=0 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=5 edit_pos=3 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_pos=0 State: edit_text='l- f- ', edit_pos=6 edit_pos=3 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_pos=0 State: edit_text='l-f-', edit_pos=4 edit_pos=0 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_pos=0 State: edit_text='l-f- ', edit_pos=5 edit_pos=0 Transition: edit_moves_text '' State: edit_text='', edit_pos=0, game_len=0 Transition: edit_moves_text 'fl' State: edit_text='fl', edit_pos=2, game_len=2 pybik-1.1/data/tests/preferences0000664000175000017500000000076212157266714017160 0ustar barccbarcc00000000000000Fields: preferencesdlg_exists = [True] preferencesdlg_visible = [False, True] Conditions: Limits: Initial-State: preferencesdlg_exists=False, preferencesdlg_visible=False One-Way: dialog_preferences State: preferencesdlg_exists=False, preferencesdlg_visible=False preferencesdlg_exists=True, preferencesdlg_visible=True Transition: action_preferences State: preferencesdlg_visible=True Transition: dialog_preferences_close State: preferencesdlg_visible=False pybik-1.1/data/tests/edit-navigate-alt0000664000175000017500000016060612137176467020165 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'fl l2-u- ', 'fl u-l2- ', 'fl2- lu- ', 'fl2- u-l ', 'fu- l2-l ', 'fu- ll2- ', 'l2-f lu- ', 'l2-f u-l ', 'l2-l fu- ', 'l2-l u-f ', 'l2-u- fl ', 'l2-u- lf ', 'lf l2-u- ', 'lf u-l2- ', 'll2- fu- ', 'll2- u-f ', 'lu- fl2- ', 'lu- l2-f ', 'u-f l2-l ', 'u-f ll2- ', 'u-l fl2- ', 'u-l l2-f ', 'u-l2- fl ', 'u-l2- lf '] edit_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Conditions: edit_pos <= len(edit_text) Limits: Initial-State: edit_text='', edit_pos=0 Transition: edit_moves_key (Qt.Key_Left, Qt.AltModifier) State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=1 edit_text='lf l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=2 edit_text='lf l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=3 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=4 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=5 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=6 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=7 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=8 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=1 edit_text='lf u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=2 edit_text='lf u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=3 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=4 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=5 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=6 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=7 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=8 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=1 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=2 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=3 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=4 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=5 edit_text='fl l2-u- ', edit_pos=1 State: edit_text='fl2- lu- ', edit_pos=6 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=7 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=8 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=1 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=2 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=3 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=4 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=5 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=6 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=7 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=8 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=1 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=2 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=3 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=4 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=5 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=6 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=7 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=8 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=1 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=2 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=3 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=4 edit_text='fl u-l2- ', edit_pos=1 State: edit_text='fu- ll2- ', edit_pos=5 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=6 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=7 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=8 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=1 edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=2 edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=3 edit_text='fl2- lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=4 edit_text='fl2- lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=5 edit_text='l2-l fu- ', edit_pos=3 State: edit_text='l2-f lu- ', edit_pos=6 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=7 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=8 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=1 edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=2 edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=3 edit_text='fl2- u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=4 edit_text='fl2- u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=5 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=6 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=7 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=8 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=1 edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=2 edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=3 edit_text='ll2- fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=4 edit_text='ll2- fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=5 edit_text='l2-f lu- ', edit_pos=3 State: edit_text='l2-l fu- ', edit_pos=6 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=7 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=8 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=1 edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=2 edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=3 edit_text='ll2- u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=4 edit_text='ll2- u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=5 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=6 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=7 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=8 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=1 edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=2 edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=3 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=4 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=5 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=6 edit_text='l2-f u-l ', edit_pos=3 State: edit_text='l2-u- fl ', edit_pos=7 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=8 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=1 edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=2 edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=3 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=4 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=5 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=6 edit_text='l2-l u-f ', edit_pos=3 State: edit_text='l2-u- lf ', edit_pos=7 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=8 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=1 edit_text='fl l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=2 edit_text='fl l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=3 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=4 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=5 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=6 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=7 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=8 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=1 edit_text='fl u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=2 edit_text='fl u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=3 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=4 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=5 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=6 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=7 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=8 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=1 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=2 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=3 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=4 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=5 edit_text='lf l2-u- ', edit_pos=1 State: edit_text='ll2- fu- ', edit_pos=6 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=7 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=8 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=1 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=2 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=3 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=4 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=5 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=6 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=7 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=8 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=1 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=2 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=3 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=4 edit_text='lf u-l2- ', edit_pos=1 State: edit_text='lu- fl2- ', edit_pos=5 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=6 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=7 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=8 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=1 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=2 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=3 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=4 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=5 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=6 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=7 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=8 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=1 edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=2 edit_text='fu- l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=3 edit_text='fu- l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=4 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=5 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=6 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=7 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=8 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=1 edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=2 edit_text='fu- ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=3 edit_text='fu- ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=4 edit_text='u-l fl2- ', edit_pos=2 State: edit_text='u-f ll2- ', edit_pos=5 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=6 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=7 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=8 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=1 edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=2 edit_text='lu- fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=3 edit_text='lu- fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=4 edit_text='u-f ll2- ', edit_pos=2 State: edit_text='u-l fl2- ', edit_pos=5 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=6 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=7 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=8 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=1 edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=2 edit_text='lu- l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=3 edit_text='lu- l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=4 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=5 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=6 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=7 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=8 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=1 edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=2 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=3 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=4 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=5 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=6 edit_text='u-f l2-l ', edit_pos=2 State: edit_text='u-l2- fl ', edit_pos=7 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=8 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=1 edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=2 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=3 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=4 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=5 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=6 edit_text='u-l l2-f ', edit_pos=2 State: edit_text='u-l2- lf ', edit_pos=7 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=8 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_key (Qt.Key_Right, Qt.AltModifier) State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 edit_text='lf l2-u- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=1 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=2 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=3 edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=4 edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=5 edit_text='fl u-l2- ' State: edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=7 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=8 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 edit_text='lf u-l2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=1 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=2 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=3 edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=4 edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=6 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=7 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=8 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 edit_text='l2-f lu- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=1 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=2 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=3 edit_text='fl l2-u- ' State: edit_text='fl2- lu- ', edit_pos=4 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=5 edit_text='fl2- u-l ', edit_pos=7 State: edit_text='fl2- lu- ', edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=7 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=8 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 edit_text='l2-f u-l ', edit_pos=3 State: edit_text='fl2- u-l ', edit_pos=1 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=2 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=3 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=4 edit_text='fu- l2-l ' State: edit_text='fl2- u-l ', edit_pos=5 edit_text='fl2- lu- ', edit_pos=6 State: edit_text='fl2- u-l ', edit_pos=6 edit_text='fl2- lu- ' State: edit_text='fl2- u-l ', edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=8 edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 edit_text='u-f l2-l ', edit_pos=2 State: edit_text='fu- l2-l ', edit_pos=1 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=2 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=3 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=4 edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=5 edit_text='fu- ll2- ' State: edit_text='fu- l2-l ', edit_pos=6 edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=8 edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 edit_text='u-f ll2- ', edit_pos=2 State: edit_text='fu- ll2- ', edit_pos=1 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=2 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=3 edit_text='fl u-l2- ' State: edit_text='fu- ll2- ', edit_pos=4 edit_text='fu- l2-l ', edit_pos=7 State: edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=6 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=7 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=8 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=1 edit_text='fl2- lu- ' State: edit_text='l2-f lu- ', edit_pos=2 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=3 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=4 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=5 edit_text='l2-f u-l ', edit_pos=7 State: edit_text='l2-f lu- ', edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=7 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=8 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=1 edit_text='fl2- u-l ' State: edit_text='l2-f u-l ', edit_pos=2 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=3 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=4 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=5 edit_text='l2-f lu- ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=6 edit_text='l2-f lu- ' State: edit_text='l2-f u-l ', edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=8 edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=1 edit_text='ll2- fu- ' State: edit_text='l2-l fu- ', edit_pos=2 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=3 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=4 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=5 edit_text='l2-l u-f ', edit_pos=7 State: edit_text='l2-l fu- ', edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=7 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=8 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=1 edit_text='ll2- u-f ' State: edit_text='l2-l u-f ', edit_pos=2 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=3 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=4 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=5 edit_text='l2-l fu- ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=6 edit_text='l2-l fu- ' State: edit_text='l2-l u-f ', edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=8 edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=1 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=2 edit_text='u-l2- fl ' State: edit_text='l2-u- fl ', edit_pos=3 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=4 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=5 edit_text='l2-f u-l ' State: edit_text='l2-u- fl ', edit_pos=6 edit_text='l2-u- lf ', edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=8 edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=1 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=2 edit_text='u-l2- lf ' State: edit_text='l2-u- lf ', edit_pos=3 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=4 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=5 edit_text='l2-l u-f ' State: edit_text='l2-u- lf ', edit_pos=6 edit_text='l2-u- fl ', edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=8 edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 edit_text='fl l2-u- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=1 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=2 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=3 edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=4 edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=5 edit_text='lf u-l2- ' State: edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=7 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=8 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 edit_text='fl u-l2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=1 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=2 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=3 edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=4 edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=6 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=7 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=8 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 edit_text='l2-l fu- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=1 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=2 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=3 edit_text='lf l2-u- ' State: edit_text='ll2- fu- ', edit_pos=4 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=5 edit_text='ll2- u-f ', edit_pos=7 State: edit_text='ll2- fu- ', edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=7 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=8 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 edit_text='l2-l u-f ', edit_pos=3 State: edit_text='ll2- u-f ', edit_pos=1 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=2 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=3 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=4 edit_text='lu- l2-f ' State: edit_text='ll2- u-f ', edit_pos=5 edit_text='ll2- fu- ', edit_pos=6 State: edit_text='ll2- u-f ', edit_pos=6 edit_text='ll2- fu- ' State: edit_text='ll2- u-f ', edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=8 edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 edit_text='u-l fl2- ', edit_pos=2 State: edit_text='lu- fl2- ', edit_pos=1 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=2 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=3 edit_text='lf u-l2- ' State: edit_text='lu- fl2- ', edit_pos=4 edit_text='lu- l2-f ', edit_pos=7 State: edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=6 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=7 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=8 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 edit_text='u-l l2-f ', edit_pos=2 State: edit_text='lu- l2-f ', edit_pos=1 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=2 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=3 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=4 edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=5 edit_text='lu- fl2- ' State: edit_text='lu- l2-f ', edit_pos=6 edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=8 edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='u-f l2-l ', edit_pos=1 edit_text='fu- l2-l ' State: edit_text='u-f l2-l ', edit_pos=2 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=3 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=4 edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=5 edit_text='u-f ll2- ' State: edit_text='u-f l2-l ', edit_pos=6 edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=8 edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='u-f ll2- ', edit_pos=1 edit_text='fu- ll2- ' State: edit_text='u-f ll2- ', edit_pos=2 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=3 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=4 edit_text='u-f l2-l ', edit_pos=7 State: edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=6 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=7 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=8 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='u-l fl2- ', edit_pos=1 edit_text='lu- fl2- ' State: edit_text='u-l fl2- ', edit_pos=2 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=3 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=4 edit_text='u-l l2-f ', edit_pos=7 State: edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=6 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=7 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=8 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='u-l l2-f ', edit_pos=1 edit_text='lu- l2-f ' State: edit_text='u-l l2-f ', edit_pos=2 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=3 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=4 edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=5 edit_text='u-l fl2- ' State: edit_text='u-l l2-f ', edit_pos=6 edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=8 edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=1 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=2 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=3 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=4 edit_text='u-f l2-l ' State: edit_text='u-l2- fl ', edit_pos=5 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=6 edit_text='u-l2- lf ', edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=8 edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=1 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=2 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=3 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=4 edit_text='u-l l2-f ' State: edit_text='u-l2- lf ', edit_pos=5 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=6 edit_text='u-l2- fl ', edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=8 edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_key Qt.Key_Left State: edit_pos=0 State: edit_pos=1 edit_pos=0 State: edit_pos=2 edit_pos=1 State: edit_pos=3 edit_pos=2 State: edit_pos=4 edit_pos=3 State: edit_pos=5 edit_pos=4 State: edit_pos=6 edit_pos=5 State: edit_pos=7 edit_pos=6 State: edit_pos=8 edit_pos=7 State: edit_pos=9 edit_pos=8 Transition: edit_moves_key Qt.Key_Right State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=1 edit_pos=2 State: edit_text='fl l2-u- ', edit_pos=2 edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=3 edit_pos=4 State: edit_text='fl l2-u- ', edit_pos=4 edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=5 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=6 edit_pos=7 State: edit_text='fl l2-u- ', edit_pos=7 edit_pos=8 State: edit_text='fl l2-u- ', edit_pos=8 edit_pos=9 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=1 edit_pos=2 State: edit_text='fl u-l2- ', edit_pos=2 edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=3 edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=4 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=5 edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=6 edit_pos=7 State: edit_text='fl u-l2- ', edit_pos=7 edit_pos=8 State: edit_text='fl u-l2- ', edit_pos=8 edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 edit_pos=1 State: edit_text='fl2- lu- ', edit_pos=1 edit_pos=2 State: edit_text='fl2- lu- ', edit_pos=2 edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=3 edit_pos=4 State: edit_text='fl2- lu- ', edit_pos=4 edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=5 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=6 edit_pos=7 State: edit_text='fl2- lu- ', edit_pos=7 edit_pos=8 State: edit_text='fl2- lu- ', edit_pos=8 edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=1 edit_pos=2 State: edit_text='fl2- u-l ', edit_pos=2 edit_pos=3 State: edit_text='fl2- u-l ', edit_pos=3 edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=4 edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=5 edit_pos=6 State: edit_text='fl2- u-l ', edit_pos=6 edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=7 edit_pos=8 State: edit_text='fl2- u-l ', edit_pos=8 edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=1 edit_pos=2 State: edit_text='fu- l2-l ', edit_pos=2 edit_pos=3 State: edit_text='fu- l2-l ', edit_pos=3 edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=4 edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=5 edit_pos=6 State: edit_text='fu- l2-l ', edit_pos=6 edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=7 edit_pos=8 State: edit_text='fu- l2-l ', edit_pos=8 edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 edit_pos=1 State: edit_text='fu- ll2- ', edit_pos=1 edit_pos=2 State: edit_text='fu- ll2- ', edit_pos=2 edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=3 edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=4 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=5 edit_pos=6 State: edit_text='fu- ll2- ', edit_pos=6 edit_pos=7 State: edit_text='fu- ll2- ', edit_pos=7 edit_pos=8 State: edit_text='fu- ll2- ', edit_pos=8 edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=1 edit_pos=2 State: edit_text='l2-f lu- ', edit_pos=2 edit_pos=3 State: edit_text='l2-f lu- ', edit_pos=3 edit_pos=4 State: edit_text='l2-f lu- ', edit_pos=4 edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=5 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=6 edit_pos=7 State: edit_text='l2-f lu- ', edit_pos=7 edit_pos=8 State: edit_text='l2-f lu- ', edit_pos=8 edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=1 edit_pos=2 State: edit_text='l2-f u-l ', edit_pos=2 edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=3 edit_pos=4 State: edit_text='l2-f u-l ', edit_pos=4 edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=5 edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=6 edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=7 edit_pos=8 State: edit_text='l2-f u-l ', edit_pos=8 edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=1 edit_pos=2 State: edit_text='l2-l fu- ', edit_pos=2 edit_pos=3 State: edit_text='l2-l fu- ', edit_pos=3 edit_pos=4 State: edit_text='l2-l fu- ', edit_pos=4 edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=5 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=6 edit_pos=7 State: edit_text='l2-l fu- ', edit_pos=7 edit_pos=8 State: edit_text='l2-l fu- ', edit_pos=8 edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=1 edit_pos=2 State: edit_text='l2-l u-f ', edit_pos=2 edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=3 edit_pos=4 State: edit_text='l2-l u-f ', edit_pos=4 edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=5 edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=6 edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=7 edit_pos=8 State: edit_text='l2-l u-f ', edit_pos=8 edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 edit_pos=1 State: edit_text='l2-u- fl ', edit_pos=1 edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=2 edit_pos=3 State: edit_text='l2-u- fl ', edit_pos=3 edit_pos=4 State: edit_text='l2-u- fl ', edit_pos=4 edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=5 edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=6 edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=7 edit_pos=8 State: edit_text='l2-u- fl ', edit_pos=8 edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 edit_pos=1 State: edit_text='l2-u- lf ', edit_pos=1 edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=2 edit_pos=3 State: edit_text='l2-u- lf ', edit_pos=3 edit_pos=4 State: edit_text='l2-u- lf ', edit_pos=4 edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=5 edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=6 edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=7 edit_pos=8 State: edit_text='l2-u- lf ', edit_pos=8 edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=1 edit_pos=2 State: edit_text='lf l2-u- ', edit_pos=2 edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=3 edit_pos=4 State: edit_text='lf l2-u- ', edit_pos=4 edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=5 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=6 edit_pos=7 State: edit_text='lf l2-u- ', edit_pos=7 edit_pos=8 State: edit_text='lf l2-u- ', edit_pos=8 edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=1 edit_pos=2 State: edit_text='lf u-l2- ', edit_pos=2 edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=3 edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=4 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=5 edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=6 edit_pos=7 State: edit_text='lf u-l2- ', edit_pos=7 edit_pos=8 State: edit_text='lf u-l2- ', edit_pos=8 edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 edit_pos=1 State: edit_text='ll2- fu- ', edit_pos=1 edit_pos=2 State: edit_text='ll2- fu- ', edit_pos=2 edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=3 edit_pos=4 State: edit_text='ll2- fu- ', edit_pos=4 edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=5 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=6 edit_pos=7 State: edit_text='ll2- fu- ', edit_pos=7 edit_pos=8 State: edit_text='ll2- fu- ', edit_pos=8 edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=1 edit_pos=2 State: edit_text='ll2- u-f ', edit_pos=2 edit_pos=3 State: edit_text='ll2- u-f ', edit_pos=3 edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=4 edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=5 edit_pos=6 State: edit_text='ll2- u-f ', edit_pos=6 edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=7 edit_pos=8 State: edit_text='ll2- u-f ', edit_pos=8 edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 edit_pos=1 State: edit_text='lu- fl2- ', edit_pos=1 edit_pos=2 State: edit_text='lu- fl2- ', edit_pos=2 edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=3 edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=4 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=5 edit_pos=6 State: edit_text='lu- fl2- ', edit_pos=6 edit_pos=7 State: edit_text='lu- fl2- ', edit_pos=7 edit_pos=8 State: edit_text='lu- fl2- ', edit_pos=8 edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=1 edit_pos=2 State: edit_text='lu- l2-f ', edit_pos=2 edit_pos=3 State: edit_text='lu- l2-f ', edit_pos=3 edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=4 edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=5 edit_pos=6 State: edit_text='lu- l2-f ', edit_pos=6 edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=7 edit_pos=8 State: edit_text='lu- l2-f ', edit_pos=8 edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 edit_pos=1 State: edit_text='u-f l2-l ', edit_pos=1 edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=2 edit_pos=3 State: edit_text='u-f l2-l ', edit_pos=3 edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=4 edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=5 edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=6 edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=7 edit_pos=8 State: edit_text='u-f l2-l ', edit_pos=8 edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 edit_pos=1 State: edit_text='u-f ll2- ', edit_pos=1 edit_pos=2 State: edit_text='u-f ll2- ', edit_pos=2 edit_pos=3 State: edit_text='u-f ll2- ', edit_pos=3 edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=4 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=5 edit_pos=6 State: edit_text='u-f ll2- ', edit_pos=6 edit_pos=7 State: edit_text='u-f ll2- ', edit_pos=7 edit_pos=8 State: edit_text='u-f ll2- ', edit_pos=8 edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 edit_pos=1 State: edit_text='u-l fl2- ', edit_pos=1 edit_pos=2 State: edit_text='u-l fl2- ', edit_pos=2 edit_pos=3 State: edit_text='u-l fl2- ', edit_pos=3 edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=4 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=5 edit_pos=6 State: edit_text='u-l fl2- ', edit_pos=6 edit_pos=7 State: edit_text='u-l fl2- ', edit_pos=7 edit_pos=8 State: edit_text='u-l fl2- ', edit_pos=8 edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 edit_pos=1 State: edit_text='u-l l2-f ', edit_pos=1 edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=2 edit_pos=3 State: edit_text='u-l l2-f ', edit_pos=3 edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=4 edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=5 edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=6 edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=7 edit_pos=8 State: edit_text='u-l l2-f ', edit_pos=8 edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 edit_pos=1 State: edit_text='u-l2- fl ', edit_pos=1 edit_pos=2 State: edit_text='u-l2- fl ', edit_pos=2 edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=3 edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=4 edit_pos=5 State: edit_text='u-l2- fl ', edit_pos=5 edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=6 edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=7 edit_pos=8 State: edit_text='u-l2- fl ', edit_pos=8 edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 edit_pos=1 State: edit_text='u-l2- lf ', edit_pos=1 edit_pos=2 State: edit_text='u-l2- lf ', edit_pos=2 edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=3 edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=4 edit_pos=5 State: edit_text='u-l2- lf ', edit_pos=5 edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=6 edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=7 edit_pos=8 State: edit_text='u-l2- lf ', edit_pos=8 edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_text ('', False) State: edit_text='', edit_pos=0 Transition: edit_moves_text ('fl u-l2- ', False) State: edit_text='fl u-l2- ', edit_pos=9 pybik-1.1/data/tests/show-hide-bars0000664000175000017500000000115112137176467017467 0ustar barccbarcc00000000000000Fields: view_editbar = [False, True] view_statusbar = [False, True] view_toolbar = [False, True] Conditions: Limits: Initial-State: view_editbar=True, view_statusbar=True, view_toolbar=True Transition: action_editbar State: view_editbar=False view_editbar=True State: view_editbar=True view_editbar=False Transition: action_statusbar State: view_statusbar=False view_statusbar=True State: view_statusbar=True view_statusbar=False Transition: action_toolbar State: view_toolbar=False view_toolbar=True State: view_toolbar=True view_toolbar=False pybik-1.1/data/tests/normalize0000664000175000017500000002140412137176467016656 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'Bb', 'Bd', 'Bf', 'Bl', 'Br', 'Brrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Bu', 'Db', 'Dd', 'Df', 'Dl', 'Dr', 'Drrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Du', 'Fb', 'Fd', 'Ff', 'Fl', 'Fr', 'Frrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Fu', 'Lb', 'Ld', 'Lf', 'Ll', 'Lr', 'Lrrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Lu', 'Rb', 'Rd', 'Rf', 'Rl', 'Rr', 'Rrrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Ru', 'Ub', 'Ud', 'Uf', 'Ul', 'Ur', 'Urrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Uu', 'bB', 'bD', 'bF', 'bL', 'bR', 'bU', 'bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U', 'dB', 'dD', 'dF', 'dL', 'dR', 'dU', 'dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B', 'fB', 'fD', 'fF', 'fL', 'fR', 'fU', 'ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D', 'lB', 'lD', 'lF', 'lL', 'lR', 'lU', 'rB', 'rD', 'rF', 'rL', 'rR', 'rU', 'rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R', 'rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L', 'uB', 'uD', 'uF', 'uL', 'uR', 'uU', 'uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F'] solved = [False, True] Conditions: solved == (len(edit_text) in [0, 43]) Limits: Initial-State: edit_text='', solved=True Transition: action_normalize_complete_rotations State: edit_text='' State: edit_text='Bb' edit_text='bB' State: edit_text='Bd' edit_text='lB' State: edit_text='Bf' edit_text='fB' State: edit_text='Bl' edit_text='uB' State: edit_text='Br' edit_text='dB' State: edit_text='Brrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B' State: edit_text='Bu' edit_text='rB' State: edit_text='Db' edit_text='rD' State: edit_text='Dd' edit_text='dD' State: edit_text='Df' edit_text='lD' State: edit_text='Dl' edit_text='bD' State: edit_text='Dr' edit_text='fD' State: edit_text='Drrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D' State: edit_text='Du' edit_text='uD' State: edit_text='Fb' edit_text='bF' State: edit_text='Fd' edit_text='rF' State: edit_text='Ff' edit_text='fF' State: edit_text='Fl' edit_text='dF' State: edit_text='Fr' edit_text='uF' State: edit_text='Frrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F' State: edit_text='Fu' edit_text='lF' State: edit_text='Lb' edit_text='dL' State: edit_text='Ld' edit_text='fL' State: edit_text='Lf' edit_text='uL' State: edit_text='Ll' edit_text='lL' State: edit_text='Lr' edit_text='rL' State: edit_text='Lrrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L' State: edit_text='Lu' edit_text='bL' State: edit_text='Rb' edit_text='uR' State: edit_text='Rd' edit_text='bR' State: edit_text='Rf' edit_text='dR' State: edit_text='Rl' edit_text='lR' State: edit_text='Rr' edit_text='rR' State: edit_text='Rrrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R' State: edit_text='Ru' edit_text='fR' State: edit_text='Ub' edit_text='lU' State: edit_text='Ud' edit_text='dU' State: edit_text='Uf' edit_text='rU' State: edit_text='Ul' edit_text='fU' State: edit_text='Ur' edit_text='bU' State: edit_text='Urrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U' State: edit_text='Uu' edit_text='uU' State: edit_text='bB' State: edit_text='bD' State: edit_text='bF' State: edit_text='bL' State: edit_text='bR' State: edit_text='bU' State: edit_text='bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U' State: edit_text='dB' State: edit_text='dD' State: edit_text='dF' State: edit_text='dL' State: edit_text='dR' State: edit_text='dU' State: edit_text='dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B' State: edit_text='fB' State: edit_text='fD' State: edit_text='fF' State: edit_text='fL' State: edit_text='fR' State: edit_text='fU' State: edit_text='ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D' State: edit_text='lB' State: edit_text='lD' State: edit_text='lF' State: edit_text='lL' State: edit_text='lR' State: edit_text='lU' State: edit_text='rB' State: edit_text='rD' State: edit_text='rF' State: edit_text='rL' State: edit_text='rR' State: edit_text='rU' State: edit_text='rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R' State: edit_text='rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L' State: edit_text='uB' State: edit_text='uD' State: edit_text='uF' State: edit_text='uL' State: edit_text='uR' State: edit_text='uU' State: edit_text='uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F' Transition: button_edit_clear_click Qt.LeftButton State: edit_text='', solved=True Transition: edit_moves_text 'Bb' State: edit_text='Bb', solved=False Transition: edit_moves_text 'Bd' State: edit_text='Bd', solved=False Transition: edit_moves_text 'Bf' State: edit_text='Bf', solved=False Transition: edit_moves_text 'Bl' State: edit_text='Bl', solved=False Transition: edit_moves_text 'Br' State: edit_text='Br', solved=False Transition: edit_moves_text 'Brrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Brrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Bu' State: edit_text='Bu', solved=False Transition: edit_moves_text 'Db' State: edit_text='Db', solved=False Transition: edit_moves_text 'Dd' State: edit_text='Dd', solved=False Transition: edit_moves_text 'Df' State: edit_text='Df', solved=False Transition: edit_moves_text 'Dl' State: edit_text='Dl', solved=False Transition: edit_moves_text 'Dr' State: edit_text='Dr', solved=False Transition: edit_moves_text 'Drrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Drrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Du' State: edit_text='Du', solved=False Transition: edit_moves_text 'Fb' State: edit_text='Fb', solved=False Transition: edit_moves_text 'Fd' State: edit_text='Fd', solved=False Transition: edit_moves_text 'Ff' State: edit_text='Ff', solved=False Transition: edit_moves_text 'Fl' State: edit_text='Fl', solved=False Transition: edit_moves_text 'Fr' State: edit_text='Fr', solved=False Transition: edit_moves_text 'Frrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Frrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Fu' State: edit_text='Fu', solved=False Transition: edit_moves_text 'Lb' State: edit_text='Lb', solved=False Transition: edit_moves_text 'Ld' State: edit_text='Ld', solved=False Transition: edit_moves_text 'Lf' State: edit_text='Lf', solved=False Transition: edit_moves_text 'Ll' State: edit_text='Ll', solved=False Transition: edit_moves_text 'Lr' State: edit_text='Lr', solved=False Transition: edit_moves_text 'Lrrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Lrrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Lu' State: edit_text='Lu', solved=False Transition: edit_moves_text 'Rb' State: edit_text='Rb', solved=False Transition: edit_moves_text 'Rd' State: edit_text='Rd', solved=False Transition: edit_moves_text 'Rf' State: edit_text='Rf', solved=False Transition: edit_moves_text 'Rl' State: edit_text='Rl', solved=False Transition: edit_moves_text 'Rr' State: edit_text='Rr', solved=False Transition: edit_moves_text 'Rrrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Rrrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Ru' State: edit_text='Ru', solved=False Transition: edit_moves_text 'Ub' State: edit_text='Ub', solved=False Transition: edit_moves_text 'Ud' State: edit_text='Ud', solved=False Transition: edit_moves_text 'Uf' State: edit_text='Uf', solved=False Transition: edit_moves_text 'Ul' State: edit_text='Ul', solved=False Transition: edit_moves_text 'Ur' State: edit_text='Ur', solved=False Transition: edit_moves_text 'Urrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Urrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Uu' State: edit_text='Uu', solved=False pybik-1.1/data/tests/rotation0000664000175000017500000000207112137176227016506 0ustar barccbarcc00000000000000Fields: rotationx = [324.0, 326.0, 328.0, 330.0, 332.0, 334.0, 336.0] rotationy = [29.0, 31.0, 33.0, 35.0, 37.0, 39.0, 41.0] Conditions: Limits: 324 < rotationx < 336 30 < rotationy < 40 Initial-State: rotationx=330.0, rotationy=39.0 Transition: action_reset_rotation State: rotationx=330.0, rotationy=39.0 Transition: drawingarea_key Qt.Key_Down Expression: rotationy = rotationy + 2 State: Transition: drawingarea_key Qt.Key_Left Expression: rotationx = rotationx - 2 State: Transition: drawingarea_key Qt.Key_Right Expression: rotationx = rotationx + 2 State: Transition: drawingarea_key Qt.Key_Up Expression: rotationy = rotationy - 2 State: Transition: drawingarea_mouse_move (10, 10), (10, 8), Qt.LeftButton Expression: rotationy = rotationy - 2 State: Transition: drawingarea_mouse_move (10, 10), (12, 12), Qt.LeftButton Expression: rotationx = rotationx + 2 Expression: rotationy = rotationy + 2 State: Transition: drawingarea_mouse_move (10, 10), (8, 10), Qt.LeftButton Expression: rotationx = rotationx - 2 State: pybik-1.1/data/tests/selectmodel0000664000175000017500000001253512137176467017163 0ustar barccbarcc00000000000000Fields: selectdlg_exists = [True] selectdlg_visible = [False, True] solved = [False, True] sizes = [(3, 3, 3), (3, 4, 2), (3, 4, 3)] dlg_model = [0, 1, 2] lblsize1 = [True] lblsize2 = [False, True] lblsize3 = [False, True] size1 = [(3, True)] size2 = [(4, False), (4, True)] size3 = [(2, False), (2, True)] dlg_solved = [False, True] Conditions: selectdlg_exists == (size1 is not None) == (size2 is not None) == (size3 is not None) selectdlg_exists or not selectdlg_visible lblsize1 == (size1 and size1[1]) == (None if dlg_model is None else (0 <= dlg_model <= 2)) lblsize2 == (size2 and size2[1]) == (None if dlg_model is None else (1 <= dlg_model <= 2)) lblsize3 == (size3 and size3[1]) == (None if dlg_model is None else (dlg_model == 2)) Limits: Initial-State: selectdlg_exists=False, selectdlg_visible=False, solved=True, sizes=(3, 3, 3), dlg_model=None, lblsize1=None, lblsize2=None, lblsize3=None, size1=None, size2=None, size3=None, dlg_solved=None One-Way: dialog_selectmodel State: selectdlg_exists=False, selectdlg_visible=False, solved=True, sizes=(3, 3, 3), dlg_model=None, lblsize1=None, lblsize2=None, lblsize3=None, size1=None, size2=None, size3=None, dlg_solved=None selectdlg_exists=True, selectdlg_visible=True, dlg_model=0, lblsize1=True, lblsize2=False, lblsize3=False, size1=(3, True), size2=(4, False), size3=(2, False), dlg_solved=False Transition: action_selectmodel State: selectdlg_visible=True Transition: dialog_selectmodel_cancel State: selectdlg_visible=False Transition: dialog_selectmodel_changemodel Qt.Key_Down Expression: dlg_model = min(2, dlg_model+1) if selectdlg_visible else dlg_model State: selectdlg_visible=False, lblsize2=False, lblsize3=False, size2=(4, False), size3=(2, False) State: selectdlg_visible=False, lblsize2=True, lblsize3=False, size2=(4, True), size3=(2, False) State: selectdlg_visible=False, lblsize2=True, lblsize3=True, size2=(4, True), size3=(2, True) State: selectdlg_visible=True, lblsize2=False, lblsize3=False, size2=(4, False), size3=(2, False) lblsize2=True, size2=(4, True) State: selectdlg_visible=True, lblsize2=True, lblsize3=False, size2=(4, True), size3=(2, False) lblsize3=True, size3=(2, True) State: selectdlg_visible=True, lblsize2=True, lblsize3=True, size2=(4, True), size3=(2, True) Transition: dialog_selectmodel_changemodel Qt.Key_Up Expression: dlg_model = max(0, dlg_model-1) if selectdlg_visible else dlg_model State: selectdlg_visible=False, lblsize2=False, lblsize3=False, size2=(4, False), size3=(2, False) State: selectdlg_visible=False, lblsize2=True, lblsize3=False, size2=(4, True), size3=(2, False) State: selectdlg_visible=False, lblsize2=True, lblsize3=True, size2=(4, True), size3=(2, True) State: selectdlg_visible=True, lblsize2=False, lblsize3=False, size2=(4, False), size3=(2, False) State: selectdlg_visible=True, lblsize2=True, lblsize3=False, size2=(4, True), size3=(2, False) lblsize2=False, size2=(4, False) State: selectdlg_visible=True, lblsize2=True, lblsize3=True, size2=(4, True), size3=(2, True) lblsize3=False, size3=(2, False) Transition: dialog_selectmodel_checksolved False Expression: dlg_solved = False if selectdlg_visible else dlg_solved State: Transition: dialog_selectmodel_checksolved True Expression: dlg_solved = True if selectdlg_visible else dlg_solved State: Transition: dialog_selectmodel_ok Expression: selectdlg_visible = False Expression: solved = dlg_solved if selectdlg_visible else solved State: selectdlg_visible=False, sizes=(3, 3, 3), size2=(4, False), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 3, 3), size2=(4, True), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 3, 3), size2=(4, True), size3=(2, True) State: selectdlg_visible=False, sizes=(3, 4, 2), size2=(4, False), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 4, 2), size2=(4, True), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 4, 2), size2=(4, True), size3=(2, True) State: selectdlg_visible=False, sizes=(3, 4, 3), size2=(4, False), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 4, 3), size2=(4, True), size3=(2, False) State: selectdlg_visible=False, sizes=(3, 4, 3), size2=(4, True), size3=(2, True) State: selectdlg_visible=True, sizes=(3, 3, 3), size2=(4, False), size3=(2, False) State: selectdlg_visible=True, sizes=(3, 3, 3), size2=(4, True), size3=(2, False) sizes=(3, 4, 3) State: selectdlg_visible=True, sizes=(3, 3, 3), size2=(4, True), size3=(2, True) sizes=(3, 4, 2) State: selectdlg_visible=True, sizes=(3, 4, 2), size2=(4, False), size3=(2, False) sizes=(3, 3, 3) State: selectdlg_visible=True, sizes=(3, 4, 2), size2=(4, True), size3=(2, False) sizes=(3, 4, 3) State: selectdlg_visible=True, sizes=(3, 4, 2), size2=(4, True), size3=(2, True) State: selectdlg_visible=True, sizes=(3, 4, 3), size2=(4, False), size3=(2, False) sizes=(3, 3, 3) State: selectdlg_visible=True, sizes=(3, 4, 3), size2=(4, True), size3=(2, False) State: selectdlg_visible=True, sizes=(3, 4, 3), size2=(4, True), size3=(2, True) sizes=(3, 4, 2) pybik-1.1/data/tests/buttons-execute-clear0000664000175000017500000000141012137176467021073 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'ulf'] game_len = [0, 3] solved = [False, True] Conditions: solved == (game_len == 0) Limits: Initial-State: edit_text='', game_len=0, solved=True Transition: button_edit_clear_click Qt.LeftButton State: edit_text='', game_len=0, solved=True Transition: button_edit_exec_click Qt.LeftButton State: edit_text='', game_len=0, solved=True State: edit_text='', game_len=3, solved=False game_len=0, solved=True State: edit_text='ulf', game_len=0, solved=True game_len=3, solved=False State: edit_text='ulf', game_len=3, solved=False Transition: edit_moves_text '', False State: edit_text='' Transition: edit_moves_text 'ulf', False State: edit_text='ulf' pybik-1.1/data/tests/min0000664000175000017500000000012112147062512015414 0ustar barccbarcc00000000000000Fields: Conditions: Limits: Initial-State: Transition: action_editbar State: pybik-1.1/data/tests/mouse0000664000175000017500000000772312137176467016016 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'b', 'b-', 'b2', 'b2-', 'd', 'd-', 'd2', 'd2-', 'f', 'f-', 'l', 'l-', 'l2', 'l2-', 'r', 'r-', 'u', 'u-'] Conditions: Limits: Initial-State: edit_text='' Transition: edit_moves_text '' State: edit_text='' Transition: empty_and_drawingarea_mouse_click (117, 115), Qt.LeftButton State: edit_text='l2-' Transition: empty_and_drawingarea_mouse_click (117, 115), Qt.RightButton State: edit_text='l2' Transition: empty_and_drawingarea_mouse_click (118, 185), Qt.LeftButton State: edit_text='l2' Transition: empty_and_drawingarea_mouse_click (118, 185), Qt.RightButton State: edit_text='l2-' Transition: empty_and_drawingarea_mouse_click (118, 64), Qt.LeftButton State: edit_text='b2' Transition: empty_and_drawingarea_mouse_click (118, 64), Qt.RightButton State: edit_text='b2-' Transition: empty_and_drawingarea_mouse_click (119, 153), Qt.LeftButton State: edit_text='f-' Transition: empty_and_drawingarea_mouse_click (119, 153), Qt.RightButton State: edit_text='f' Transition: empty_and_drawingarea_mouse_click (147, 196), Qt.LeftButton State: edit_text='r-' Transition: empty_and_drawingarea_mouse_click (147, 196), Qt.RightButton State: edit_text='r' Transition: empty_and_drawingarea_mouse_click (151, 77), Qt.LeftButton State: edit_text='u-' Transition: empty_and_drawingarea_mouse_click (151, 77), Qt.RightButton State: edit_text='u' Transition: empty_and_drawingarea_mouse_click (153, 128), Qt.LeftButton State: edit_text='r' Transition: empty_and_drawingarea_mouse_click (153, 128), Qt.RightButton State: edit_text='r-' Transition: empty_and_drawingarea_mouse_click (154, 169), Qt.LeftButton State: edit_text='d2' Transition: empty_and_drawingarea_mouse_click (154, 169), Qt.RightButton State: edit_text='d2-' Transition: empty_and_drawingarea_mouse_click (161, 141), Qt.LeftButton State: edit_text='u-' Transition: empty_and_drawingarea_mouse_click (161, 141), Qt.RightButton State: edit_text='u' Transition: empty_and_drawingarea_mouse_click (164, 196), Qt.LeftButton State: edit_text='d' Transition: empty_and_drawingarea_mouse_click (164, 196), Qt.RightButton State: edit_text='d-' Transition: empty_and_drawingarea_mouse_click (189, 93), Qt.LeftButton State: edit_text='b2-' Transition: empty_and_drawingarea_mouse_click (189, 93), Qt.RightButton State: edit_text='b2' Transition: empty_and_drawingarea_mouse_click (210, 73), Qt.LeftButton State: edit_text='b-' Transition: empty_and_drawingarea_mouse_click (210, 73), Qt.RightButton State: edit_text='b' Transition: empty_and_drawingarea_mouse_click (216, 91), Qt.LeftButton State: edit_text='b' Transition: empty_and_drawingarea_mouse_click (216, 91), Qt.RightButton State: edit_text='b-' Transition: empty_and_drawingarea_mouse_click (80, 108), Qt.LeftButton State: edit_text='u' Transition: empty_and_drawingarea_mouse_click (80, 108), Qt.RightButton State: edit_text='u-' Transition: empty_and_drawingarea_mouse_click (81, 140), Qt.LeftButton State: edit_text='d2-' Transition: empty_and_drawingarea_mouse_click (81, 140), Qt.RightButton State: edit_text='d2' Transition: empty_and_drawingarea_mouse_click (85, 163), Qt.LeftButton State: edit_text='d-' Transition: empty_and_drawingarea_mouse_click (85, 163), Qt.RightButton State: edit_text='d' Transition: empty_and_drawingarea_mouse_click (86, 104), Qt.LeftButton State: edit_text='l-' Transition: empty_and_drawingarea_mouse_click (86, 104), Qt.RightButton State: edit_text='l' Transition: empty_and_drawingarea_mouse_click (97, 173), Qt.LeftButton State: edit_text='l' Transition: empty_and_drawingarea_mouse_click (97, 173), Qt.RightButton State: edit_text='l-' pybik-1.1/data/tests/solved0000664000175000017500000000267112137176560016151 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'rrdduullffrrdduullbb', 'rrrr', 'ufu-d-ffl-rfbuf-b-lr-ffd', 'urluur-l-urluur-l-'] game_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] game_len = [0, 4, 14, 18, 20] solved = [False, True] Conditions: game_len == len(edit_text.translate({c:None for c in b'-'})) game_pos <= game_len solved == (game_pos in [0, game_len]) Limits: Initial-State: edit_text='', game_pos=0, game_len=0, solved=True Transition: action_new_solved State: edit_text='', game_pos=0, game_len=0, solved=True Transition: edit_moves_key_enter (Qt.Key_Right, Qt.ControlModifier) Expression: game_pos = min(game_pos+1, game_len) Expression: solved = game_pos+1 >= game_len State: Transition: edit_moves_key_enter Qt.Key_Home State: game_pos=0, solved=True Transition: edit_moves_text '' State: edit_text='', game_pos=0, game_len=0, solved=True Transition: edit_moves_text 'rrdduullffrrdduullbb' State: edit_text='rrdduullffrrdduullbb', game_pos=20, game_len=20, solved=True Transition: edit_moves_text 'rrrr' State: edit_text='rrrr', game_pos=4, game_len=4, solved=True Transition: edit_moves_text 'ufu-d-ffl-rfbuf-b-lr-ffd' State: edit_text='ufu-d-ffl-rfbuf-b-lr-ffd', game_pos=18, game_len=18, solved=True Transition: edit_moves_text 'urluur-l-urluur-l-' State: edit_text='urluur-l-urluur-l-', game_pos=14, game_len=14, solved=True pybik-1.1/data/tests/edit-navigate0000664000175000017500000001503412137176560017373 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'fl u-b- r2d2 f2-l2- FL U- B-'] edit_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] game_len = [0, 12] Conditions: edit_pos <= len(edit_text) Limits: Initial-State: edit_text='', edit_pos=0, game_len=0 Transition: edit_moves_key (Qt.Key_Left, Qt.ControlModifier) State: edit_pos=0 State: edit_pos=1 edit_pos=0 State: edit_pos=2 edit_pos=1 State: edit_pos=3 edit_pos=1 State: edit_pos=4 edit_pos=3 State: edit_pos=5 edit_pos=3 State: edit_pos=6 edit_pos=5 State: edit_pos=7 edit_pos=5 State: edit_pos=8 edit_pos=5 State: edit_pos=9 edit_pos=8 State: edit_pos=10 edit_pos=8 State: edit_pos=11 edit_pos=10 State: edit_pos=12 edit_pos=10 State: edit_pos=13 edit_pos=10 State: edit_pos=14 edit_pos=13 State: edit_pos=15 edit_pos=13 State: edit_pos=16 edit_pos=13 State: edit_pos=17 edit_pos=16 State: edit_pos=18 edit_pos=16 State: edit_pos=19 edit_pos=16 State: edit_pos=20 edit_pos=16 State: edit_pos=21 edit_pos=20 State: edit_pos=22 edit_pos=21 State: edit_pos=23 edit_pos=21 State: edit_pos=24 edit_pos=23 State: edit_pos=25 edit_pos=23 State: edit_pos=26 edit_pos=23 State: edit_pos=27 edit_pos=26 State: edit_pos=28 edit_pos=26 Transition: edit_moves_key (Qt.Key_Right, Qt.ControlModifier) State: edit_text='', edit_pos=0 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=0 edit_pos=1 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=1 edit_pos=3 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=2 edit_pos=3 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=3 edit_pos=5 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=4 edit_pos=5 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=5 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=6 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=7 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=8 edit_pos=10 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=9 edit_pos=10 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=10 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=11 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=12 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=13 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=14 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=15 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=16 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=17 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=18 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=19 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=20 edit_pos=21 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=21 edit_pos=23 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=22 edit_pos=23 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=23 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=24 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=25 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=26 edit_pos=28 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=27 edit_pos=28 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=28 Transition: edit_moves_key Qt.Key_Enter Expression: game_len = len(edit_text.translate({c:None for c in b' 2-'})) State: edit_pos=0 State: edit_pos=1 State: edit_pos=2 edit_pos=3 State: edit_pos=3 State: edit_pos=4 edit_pos=5 State: edit_pos=5 State: edit_pos=6 edit_pos=8 State: edit_pos=7 edit_pos=8 State: edit_pos=8 State: edit_pos=9 edit_pos=10 State: edit_pos=10 State: edit_pos=11 edit_pos=13 State: edit_pos=12 edit_pos=13 State: edit_pos=13 State: edit_pos=14 edit_pos=16 State: edit_pos=15 edit_pos=16 State: edit_pos=16 State: edit_pos=17 edit_pos=20 State: edit_pos=18 edit_pos=20 State: edit_pos=19 edit_pos=20 State: edit_pos=20 State: edit_pos=21 State: edit_pos=22 edit_pos=23 State: edit_pos=23 State: edit_pos=24 edit_pos=26 State: edit_pos=25 edit_pos=26 State: edit_pos=26 State: edit_pos=27 edit_pos=28 State: edit_pos=28 Transition: edit_moves_key Qt.Key_Left Expression: edit_pos = max(edit_pos - 1, 0) State: Transition: edit_moves_key Qt.Key_Right Expression: edit_pos = min(edit_pos + 1, len(edit_text)) State: Transition: edit_moves_text ('', False) State: edit_text='', edit_pos=0 Transition: edit_moves_text ('fl u-b- r2d2 f2-l2- FL U- B-', False) State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=28 pybik-1.1/data/shaders/0000775000175000017500000000000012157424343015210 5ustar barccbarcc00000000000000pybik-1.1/data/shaders/normals.vert0000664000175000017500000000223412142016006017551 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . attribute vec4 vertex_attr; attribute vec3 normal_attr; varying vec3 normal; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; void main() { gl_Position = projection * (modelview * (object * vertex_attr)); // actually we need here the inverse transpose of the matrix (modelview*object), // but the mat3 parts are pure rotations, where the inverse is equal to the transpose normal = mat3(modelview) * (mat3(object) * normal_attr); } pybik-1.1/data/shaders/simple.frag0000664000175000017500000000174212151620576017346 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . uniform sampler2D tex; varying vec3 color; varying vec2 texcoord; const vec3 invgamma = vec3(1./2.2); void main() { vec4 col_tex = texture2D(tex, texcoord); vec3 col_face = mix(color.rgb, col_tex.rgb, col_tex.a); gl_FragColor = vec4(pow(col_face, invgamma), 1.); } pybik-1.1/data/shaders/lighting.frag0000664000175000017500000000351312151760501017651 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . uniform sampler2D tex; varying vec4 position; varying vec3 color; varying vec2 texcoord; varying vec3 normal; const vec3 pointlight = vec3(0., 0., 0.); // diffuse+ambient+specular is the maxintensity const float diffuse = 1.4; const float ambient = .3; const float shininess = 50.; const float attenuation = 0.001; const vec3 specular = vec3(5., 4.5, 3.) * .5; const vec3 invgamma = vec3(1./2.2); void main() { // mix color and image vec4 col_tex = texture2D(tex, texcoord); vec3 col_face = mix(color.rgb, col_tex.rgb, col_tex.a); vec3 norm = normalize(normal); vec3 lightvector = pointlight - position.xyz; vec3 dirtolight = normalize(lightvector); float cos_angle = dot(norm, dirtolight); cos_angle = clamp(cos_angle, 0, 1); // attenuation float light_distance_sqr = dot(lightvector, lightvector); float attenfactor = 1. / (1.0 + attenuation * light_distance_sqr); // combine color components vec3 col = ambient * col_face; col += specular * attenfactor * pow(cos_angle, shininess); col += diffuse * col_face * cos_angle; gl_FragColor = vec4(pow(col, invgamma), 1.); } pybik-1.1/data/shaders/pick.vert0000664000175000017500000000170412142015766017041 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . attribute vec4 vertex_attr; attribute vec4 color_attr; varying vec4 color; uniform mat4 picking; uniform mat4 projection; uniform mat4 modelview; void main() { gl_Position = picking * projection * modelview * vertex_attr; color = color_attr; } pybik-1.1/data/shaders/lighting.vert0000664000175000017500000000261612151702614017716 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . attribute vec4 vertex_attr; attribute vec3 normal_attr; attribute vec3 color_attr; attribute vec2 texcoord_attr; varying vec4 position; varying vec3 color; varying vec2 texcoord; varying vec3 normal; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; const vec3 gamma = vec3(2.2); void main() { position = modelview * (object * vertex_attr); gl_Position = projection * position; color = pow(color_attr, gamma); texcoord = texcoord_attr; // actually we need here the inverse transpose of the matrix (modelview*object), // but the mat3 parts are pure rotations, where the inverse is equal to the transpose normal = mat3(modelview) * (mat3(object) * normal_attr); } pybik-1.1/data/shaders/hud.vert0000664000175000017500000000153212142140411016654 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . attribute vec4 vertex_attr; attribute vec4 color_attr; varying vec4 color; void main() { gl_Position = vertex_attr; color = color_attr; } pybik-1.1/data/shaders/normals.frag0000664000175000017500000000142312151517510017515 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . varying vec3 normal; void main() { gl_FragColor = vec4(normal, 1.0); } pybik-1.1/data/shaders/pick.frag0000664000175000017500000000140612141740506016773 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . varying vec4 color; void main() { gl_FragColor = color; } pybik-1.1/data/shaders/simple.vert0000664000175000017500000000210312152070271017367 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . attribute vec4 vertex_attr; attribute vec3 color_attr; attribute vec2 texcoord_attr; varying vec3 color; varying vec2 texcoord; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; const vec3 gamma = vec3(2.2); void main() { gl_Position = projection * (modelview * (object * vertex_attr)); color = pow(color_attr, gamma); texcoord = texcoord_attr; } pybik-1.1/data/plugins/0000775000175000017500000000000012157424343015240 5ustar barccbarcc00000000000000pybik-1.1/data/plugins/11-spiegel-improved.algorithm0000644000175000017500000002004712157366373022653 0ustar barccbarcc00000000000000# Copyright © 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: Cube 3 Ref-Blocks: f l u b r d ################################ # Solution: pos, block, moves # 1. position on the cube, e.g. "rf" for the front-right edge or "ufr" for # the uppper-front-right corner. The order does not matter, "ufr" is equal to "fur". # Multiple blocks are separated by spaces. # 2. The block at the position. The order matters and depends on the first field. # The number of blocks must be the same as in field 1. # "fr|fl": "fr" or "fl" is allowed at the position # "!fru": every block except "fru" is allowed at the position # "*fru": a block in any rotation state of "fru" is allowed at the position (fru, ruf, ufr) # "!*fru": every block except all "fru" rotations is allowed at the position # "f?u": "?" can be every face # 3. The moves that should be applied to the cube. # Spiegel is the name of a solution method Path: /Solvers/Spiegel improved Depends: /Solvers/Spiegel improved/Bottom corner orient Path: /Solvers/Spiegel improved/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # Initial orientation of the top slice ur=uf ub=!ub ul=!ul, u uf=!uf ub=ur ul=!ul, u uf=!uf ur=!ur ul=ub, u uf=ul ur=!ur ub=!ub, u ur=!ur ub=!ub ul=uf, u- uf=ur ub=!ub ul=!ul, u- uf=!uf ur=ub ul=!ul, u- uf=!uf ur=!ur ub=ul, u- ur=!ur ub=uf ul=!ul, uu uf=!uf ub=!ub ul=ur, uu uf=ub ur=!ur ul=!ul, uu uf=!uf ur=ul ub=!ub, uu # uf is on top slice fu=uf, fu-ru ur=*uf, r- ub=*uf, b ul=*uf, l # uf is on middle slice fr=fu, f- fr=uf, u-ru fl=fu, f fl=uf, ul-u- br=fu, uubuu br=uf, u-r-u bl=fu, uub-uu bl=uf, ulu- # uf is on bottom slice fd=fu, ff fd=uf, f-u-ru dr=uf, d-ff dr=fu, rf-r- dl=uf, dff dl=fu, l-fl db=uf, ddff db=fu, u-d-ruf- # next edge ur=!ur, U ul=!ul, U- ub=!ub, UU Path: /Solvers/Spiegel improved/Top corners Depends: /Solvers/Spiegel improved/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # corner is one of front bottom frd=fur, r-d-r frd=rfu, fd-f-r-ddr frd=urf, fdf- fld=ruf, r-dr fld=fru, f-rfr-fd-f- fld=ufr, d # corner is one of back bottom brd=fru, d- brd=ufr, fd-f- brd=ruf, d- lbd=fru, fdf-r-d-r lbd=ufr, fddf- lbd=ruf, d # corner rotated #fru=fru, fru=ufr, r-dr fru=ruf, fd-f- # corner is one of upper front flu=rfu, ldl- flu=urf, ld-l- flu=fur, lr-dl-r # corner is one of upper back bru=rfu, b-d-b bru=urf, fb-d-f-b bru=fur, rdrrddr blu=fru, l-r-ddrl blu=ufr, l-dlr-ddr blu=ruf, l-fddf-l # Next corner bru=!bru, U flu=!flu, U- blu=!blu, UU Path: /Solvers/Spiegel improved/Middle slice Depends: /Solvers/Spiegel improved/Top corners Solution: fr=fr rb=rb bl=bl lf=lf, @@solved # Move edges from the bottom slice fd=fr, d- rd=fr, dd bd=fr, d ld=fr, r-drdfd-f- fd=fl, d rd=fl, ld-l-d-f-df bd=fl, d- ld=fl, dd # Next edge fd=rf|rb, U rd=rf|rb, U bd=rf|rb, U ld=rf|rb, U fd=lb|lf, U- rd=lb|lf, U- bd=lb|lf, U- ld=lb|lf, U- fd=br|bl, UU rd=br|bl, UU bd=br|bl, UU ld=br|bl, UU # If all above fails, move a wrong edge to the bottom slice fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, r-drdfd-f- fd=*?d rd=*?d bd=*?d ld=*?d fl=!fl, ld-l-d-f-df br=!br, U bl=!bl, U- Path: /Solvers/Spiegel improved/Bottom edge place Depends: /Solvers/Spiegel improved/Middle slice Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=*df dl=*dl db=*db dr=*dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=*uf ur=*ur ub=*ub ul=*ul, @@solved # Move the bottom slice is enough #uf=*uf ur=*ur ub=*ub ul=*ul, uf=*ul ur=*uf ub=*ur ul=*ub, u uf=*ub ur=*ul ub=*uf ul=*ur, uu uf=*ur ur=*ub ub=*ul ul=*uf, u- # Swap two edges is enough uf=*ul ur=*ur ub=*ub ul=*uf, ufrur-u-f- uf=*uf ur=*ul ub=*ur ul=*ub, uufrur-u-f- uf=*ub ur=*uf ub=*ul ul=*ur, u-frur-u-f- uf=*ur ur=*ub ub=*uf ul=*ul, frur-u-f- # More than two edges needs to be swapped uf=*ul ur=*ub ub=*ur ul=*uf, u-frur-u-f- uf=*uf ur=*ul ub=*ub ul=*ur, frur-u-f- uf=*ur ur=*uf ub=*ul ul=*ub, ufrur-u-f- uf=*ub ur=*ur ub=*uf ul=*ul, uufrur-u-f- # , U #TODO: Modify the previous paragraph so that this is not necessary Path: /Solvers/Spiegel improved/Bottom edge orient Depends: /Solvers/Spiegel improved/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=uf ur=ur ub=ub ul=ul, @@solved # Turn edge ur=?u, rd2rd2rd2rd2 # Proceed to the next edge ub=?u, u uf=?u, u- ul=?u, uu # Done, only turn back the bottom slice uf=ul, u uf=ur, u- uf=ub, uu Path: /Solvers/Spiegel improved/Bottom corner place Depends: /Solvers/Spiegel improved/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=*dfl dlb=*dlb dbr=*dbr drf=*drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved ufl=*urf urf=*ulb ulb=*ufl ubr=*ubr, fdffddffd-f-u-fdffddffd-f-u ufl=*ubr urf=*ufl ulb=*ulb ubr=*urf, fdffddffd-f-ufdffddffd-f-u- ufl=*urf urf=*ufl ulb=*ubr ubr=*ulb, fdffddffd-f-uufdffddffd-f-uu ufl=*ubr urf=*ulb ulb=*urf ubr=*ufl, fdffddffd-f-ufdffddffd-f-u- # , U Path: /Solvers/Spiegel improved/Bottom corner orient Depends: /Solvers/Spiegel improved/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # Turn corner ufr=?u?, rf-r-frf-r-f ufr=??u, f-rfr-f-rfr- # Proceed to the next corner urb=!u?? fr=!fr, u ulf=!u?? fr=!fr, u- ubl=!u?? fr=!fr, uu # Done, only turn back the bottom slice uf=ul ufr=u?? urb=u?? ulf=u?? ubl=u??, u uf=ur ufr=u?? urb=u?? ulf=u?? ubl=u??, u- uf=ub ufr=u?? urb=u?? ulf=u?? ubl=u??, uu # , U pybik-1.1/data/plugins/90-library.algorithm0000664000175000017500000000271612157366453021057 0ustar barccbarcc00000000000000# Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: Cube 3 Ref-Blocks: f l u b r d Path: /Library/Middle Layer/Front to Right Moves: d-r-drdfd-f- Path: /Library/Middle Layer/Front to Left Moves: dld-l-d-f-df Path: /Library/Last Layer/Swap Edges Moves: dfldl-d-f- Path: /Library/Last Layer/Flip Edges Moves: lu2lu2lu2lu2 Path: /Library/Last Layer/Swap Corners Moves: fuffuuffu-f- Path: /Library/Last Layer/Rotate Corners Moves: lf-l-flf-l-f Path: /Library/Rotate Center/2×Up Moves: urluur-l-urluur-l- Path: /Library/Rotate Center/Up and Front Moves: ufu-d-ffl-rfbuf-b-lr-ffd Path: /Library/Rotate Center/Up and Down Moves: urlf2f2r-l-u-rlf2f2r-l- Path: /Library/Misc/Back without Back Moves: rrllffrruurrllddllf-rrllffrruurrllddllff Path: /Library/Misc/2×Back without Back Moves: rrdduullffrrdduull pybik-1.1/data/plugins/10-spiegel.algorithm0000644000175000017500000001252212157366361021023 0ustar barccbarcc00000000000000# Copyright © 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: Cube 3 Ref-Blocks: f l u b r d ################################ # Solution: pos, block, moves # 1. position on the cube, e.g. "rf" for the front-right edge or "ufr" for # the uppper-front-right corner. The order does not matter, "ufr" is equal to "fur". # Multiple blocks are separated by spaces. # 2. The block at the position. The order matters and depends on the first field. # The number of blocks must be the same as in field 1. # "fr|fl": "fr" or "fl" is allowed at the position # "!fru": every block except "fru" is allowed at the position # "*fru": a block in any rotation state of "fru" is allowed at the position (fru, ruf, ufr) # "!*fru": every block except all "fru" rotations is allowed at the position # "f?u": "?" can be every face # 3. The moves that should be applied to the cube. # Spiegel is the name of a solution method Path: /Solvers/Spiegel Depends: /Solvers/Spiegel/Bottom corner orient Path: /Solvers/Spiegel/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # rf=uf, f- df=uf, f-f- fr=uf, u2fu2- fu=uf, fu2fu2- fd=uf, dl2d-l2- # lf=uf, f fl=uf, u2-f-u2 # dr=*uf, d- dl=*uf, d db=*uf, dd # br=uf, u2f-u2- rb=uf, u2u2fu2u2 bl=uf, u2-fu2 lb=uf, u2u2f-u2u2 # ur=*uf, r ub=*uf, b ul=*uf, l # , U Path: /Solvers/Spiegel/Top corners Depends: /Solvers/Spiegel/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # fld=ruf, r-dr fld=ufr, ddfd-f- #fld=fru, f-dffd-f- fld=fru, dr-drfd-d-f- # rfd=*fru, d- brd=*fru, dd lbd=*fru, d # fru=!fru fru=*fru, r-d-r rbu=*fru, b-d-d-b blu=*fru, bdb- lfu=*fru, f-df , U Path: /Solvers/Spiegel/Middle slice Depends: /Solvers/Spiegel/Top corners Solution: fr=fr rb=rb bl=bl lf=lf, @@solved fd=fr, d-r-drdfd-f- fd=fl, dld-l-d-f-df # rd=fr|fl, d- bd=fr|fl, dd ld=fr|fl, d # fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, d-r-drdfd-f- fd=*?d rd=*?d bd=*?d ld=*?d fl=!fl, dld-l-d-f-df , U Path: /Solvers/Spiegel/Bottom edge place Depends: /Solvers/Spiegel/Middle slice Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=*df dl=*dl db=*db dr=*dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=*uf ur=*ur ub=*ub ul=*ul, @@solved uf=!*uf ur=!*ur ub=!*ub ul=!*ul, u ul=*uf ur=*ur, ufrur-u-f- uf=*ul ub=*ub, ufrur-u-f- uf=*ub ub=*uf, ufrur-u-f- , U Path: /Solvers/Spiegel/Bottom edge orient Depends: /Solvers/Spiegel/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=uf ur=ur ub=ub ul=ul, @@solved ur=?u, rd2rd2rd2rd2 # ub=?u, u uf=?u, u- ul=?u, uu # uf=ul, u uf=ur, u- uf=ub, uu Path: /Solvers/Spiegel/Bottom corner place Depends: /Solvers/Spiegel/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=*dfl dlb=*dlb dbr=*dbr drf=*drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved ufl=!*ufl ufr=!*ufr ubl=!*ubl ubr=!*ubr, fdffddffd-f-ufdffddffd-f-u- ubl=*ubl ufl=!*ufl, fdffddffd-f-ufdffddffd-f-u- , U Path: /Solvers/Spiegel/Bottom corner orient Depends: /Solvers/Spiegel/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved ufr=!ufr ufr=!urb ufr=!ubl ufr=!ulf, rf-r-frf-r-f # urb=!ufr urb=!urb urb=!ubl urb=!ulf, u ulf=!ufr ulf=!urb ulf=!ubl ulf=!ulf, u- ubl=!ufr ubl=!urb ubl=!ubl ubl=!ulf, uu # uf=ul, u uf=ur, u- uf=ub, uu pybik-1.1/data/plugins/20-2x2x2.algorithm0000664000175000017500000000453412157366424020267 0ustar barccbarcc00000000000000# Copyright © 2011-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: Cube 2 Path: /Solvers/2×2×2 Depends: /Solvers/2×2×2/Bottom corner orient Path: /Solvers/2×2×2/Top slice Ref-Blocks: flu Solution: ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved fld=?uf, r-dr fld=uf?, ddfd-f- #fld=f?u, f-dffd-f- fld=f?u, dr-drfd-d-f- # rfd=*f?u, d- brd=*f?u, dd lbd=*f?u, d # fru=!f?u fru=*f?u, r-d-r rbu=*f?u, b-d-d-b blu=*f?u, bdb- lfu=*f?u, f-df , U Path: /Solvers/2×2×2/Bottom corner place Depends: /Solvers/2×2×2/Top slice Ref-Blocks: flu bru Solution: dfl=*dfl dlb=*dlb dbr=*dbr drf=*drf, @@solved dfl=*drf drf=*dfl, r-d-rfdf-r-drdd dfl=*dbr drf=*dlb, dd dfl=*drf drf=*dbr, d dfl=*dlb drf=*dfl, d- dfl=*dfl dbr=*dbr, d , U Path: @Solvers/2×2×2/Bottom corner orient Depends: /Solvers/2×2×2/Bottom corner place Ref-Blocks: flu bru Solution: flu=flu rfu=rfu bru=bru lbu=lbu dfl=ldf, lf-l-flf-l-f flu=flu rfu=rfu bru=bru lbu=lbu dfl=fld, f-lfl-f-lfl- , @@solved Path: /Solvers/2×2×2/Bottom corner orient Depends: @Solvers/2×2×2/Bottom corner orient Ref-Blocks: dfl Solution: ufl=ufl dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved # rotate corner dfl=dfl dfr=frd, d-lf-l-flf-l-f dfl=dfl dfr=rdf, d-f-lfl-f-lfl- dfl=dfl dbl=bld, dlf-l-flf-l-f dfl=dfl dbl=ldb, df-lfl-f-lfl- dfl=dfl dbr=brd, ddf-lfl-f-lfl- dfl=dfl dbr=rdb, ddlf-l-flf-l-f # move solved bottom slice ufl=urf, d- ufl=ubr, dd ufl=ulb, d pybik-1.1/data/plugins/pretty_patterns.py0000644000175000017500000001124112137177715021064 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # pylint: disable=C0321 def play_stripes_Brick_nnn_2(game): size = game.current_state.model.sizes for unused_j in 0, 1: for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(1, size[2], 2): game.add_moves([(2, i, 0)]) def play_stripes_Brick_nn1_4(game): size = game.current_state.model.sizes for i in range(1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(size[1]-1, size[1]//2, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[0] // 2, 2): game.add_moves([(0, i, 0)]) game.add_moves([(1, size[1]//2, 0)]) for i in range(size[0]//2+1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) def play_stripes_Brick_1nn_4(game): size = game.current_state.model.sizes for i in range(1, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(size[1]-1, size[1]//2, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[2] // 2, 2): game.add_moves([(2, i, 0)]) game.add_moves([(1, size[1]//2, 0)]) for i in range(size[2]//2+1, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) def play_stripes_Cube_nnn_2(game): size = game.current_state.model.sizes for i in range(0, size[0], 2): game.add_moves([(0, i, 0)] * 2) for i in range(0, size[2], 2): game.add_moves([(2, i, 0)] * 2) for i in range(0, size[0], 2): game.add_moves([(0, i, 0)] * 2) def play_stripes_TowerBrick_nnn_2(game): size = game.current_state.model.sizes for i in range(0, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(0, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(0, size[0], 2): game.add_moves([(0, i, 0)]) def play_chessboard(game): model = game.current_state.model size = model.sizes symmetry = [int(180 // s) for s in model.symmetry] # Moves are 3-Tuples (axis, slice, dir) axis=0,1,2 slice=0,...,size-1 dir=0,1 if size[0] % 2 == size[1] % 2 == 1: moves = [(0, i, 0) for i in range(1, size[0], 2)] moves += [(1, i, 0) for i in range(1, size[1], 2)] moves += [(2, i, 0) for i in range(1, size[2], 2)] elif size[1] % 2 == size[2] % 2 == 1: moves = [(1, i, 0) for i in range(1, size[1], 2)] moves += [(2, i, 0) for i in range(1, size[2], 2)] moves += [(0, i, 0) for i in range(1, size[0], 2)] elif size[2] % 2 == size[0] % 2 == 1: moves = [(2, i, 0) for i in range(1, size[2], 2)] moves += [(0, i, 0) for i in range(1, size[0], 2)] moves += [(1, i, 0) for i in range(1, size[1], 2)] for move in moves: game.add_moves([move] * symmetry[move[0]]) def play_t_time_Cube_odd(game): size = game.current_state.model.sizes ll = 'l{0}l{0}'.format(size[0] // 2 + 1) ff = 'f{0}f{0}'.format(size[0] // 2 + 1) game.add_flubrd("{0}du-{1}ud-{0}duu{0}uu{0}d-{0}uu".format(ll, ff)) def play_t_time_Cube_even(game): size = game.current_state.model.sizes ll = 'l{0}l{0}l{1}l{1}'.format(size[0] // 2, size[0] // 2 + 1) ff = 'f{0}f{0}f{1}f{1}'.format(size[0] // 2, size[0] // 2 + 1) game.add_flubrd("{0}dd2u-u2-{1}uu2d-d2-{0}dd2uuu2u2{0}uuu2u2{0}d-d2-{0}uuu2u2".format(ll, ff)) def play_t_time_Tower_odd(game): size = game.current_state.model.sizes ll = 'l{0}'.format(size[0] // 2 + 1) ff = 'f{0}'.format(size[0] // 2 + 1) game.add_flubrd("{0}du-{1}ud-{0}duu{0}uu{0}d-{0}uu".format(ll, ff)) def play_t_time_Tower_even(game): size = game.current_state.model.sizes ll = 'l{0}l{1}'.format(size[0] // 2, size[0] // 2 + 1) ff = 'f{0}f{1}'.format(size[0] // 2, size[0] // 2 + 1) game.add_flubrd("{0}dd2u-u2-{1}uu2d-d2-{0}dd2uuu2u2{0}uuu2u2{0}d-d2-{0}uuu2u2".format(ll, ff)) pybik-1.1/data/plugins/challenges.py0000644000175000017500000000217012137177715017723 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . random = lambda game: game.random() random1 = lambda game: game.random(1) random2 = lambda game: game.random(2) random3 = lambda game: game.random(3) random4 = lambda game: game.random(4) random5 = lambda game: game.random(5) random6 = lambda game: game.random(6) random7 = lambda game: game.random(7) random8 = lambda game: game.random(8) random9 = lambda game: game.random(9) random10 = lambda game: game.random(10) pybik-1.1/data/plugins/12-lbl-leyan.algorithm0000664000175000017500000001552312157366412021257 0ustar barccbarcc00000000000000# Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: Cube 3 Ref-Blocks: f l u b r d Depends: /Solvers/Layer Method (Leyan Lo)/Bottom edge place # Leyan Lo is the inventor of the solution method Path: /Solvers/Layer Method (Leyan Lo) Path: /Solvers/Layer Method (Leyan Lo)/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # rf=uf, f- df=uf, f-f- fr=uf, u2fu2- fu=uf, fu2fu2- fd=uf, dl2d-l2- # lf=uf, f fl=uf, u2-f-u2 # dr=*uf, d- dl=*uf, d db=*uf, dd # br=uf, u2f-u2- rb=uf, u2u2fu2u2 bl=uf, u2-fu2 lb=uf, u2u2f-u2u2 # ur=*uf, r ub=*uf, b ul=*uf, l # , U Depends: /Solvers/Layer Method (Leyan Lo)/Top edges Path: /Solvers/Layer Method (Leyan Lo)/Top corners Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # fld=ruf, r-dr fld=ufr, ddfd-f- #fld=fru, f-dffd-f- fld=fru, dr-drfd-d-f- # rfd=*fru, d- brd=*fru, dd lbd=*fru, d # fru=!fru fru=*fru, r-d-r rbu=*fru, b-d-d-b blu=*fru, bdb- lfu=*fru, f-df , U Depends: /Solvers/Layer Method (Leyan Lo)/Top corners Path: /Solvers/Layer Method (Leyan Lo)/Middle slice Solution: fr=fr rb=rb bl=bl lf=lf, @@solved # solve front-right edge fd=fr, d-r-drdfd-f- rd=rf, dfd-f-d-r-dr # prepare front-right edge for solving fd=rf, d rd=fr, d- bd=rf|fr, d- ld=rf|fr, d # fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, d-r-drdfd-f- , U Depends: /Solvers/Layer Method (Leyan Lo)/Middle slice Path: /Solvers/Layer Method (Leyan Lo)/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=d? dl=d? db=d? dr=d?, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=u? ur=u? ub=u? ul=u?, @@solved ub=u? ul=u? uf=?u ur=?u, furu-r-f- ur=u? ul=u? uf=?u ub=?u, frur-u-f- uf=?u ur=?u ub=?u ul=?u, furu-r-f- # ul=u? uf=u? ur=?u ub=?u, U uf=u? ur=u? ub=?u ul=?u, UU ur=u? ub=u? ul=?u uf=?u, U- # uf=u? ub=u? ur=?u ul=?u, U Depends: /Solvers/Layer Method (Leyan Lo)/Bottom edge orient Path: /Solvers/Layer Method (Leyan Lo)/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf dfr=*dfr drb=*drb dbl=*dbl dlf=*dlf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # solved (1/24) ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved # two adjacent corners need to be swapped (6/24) ulf=*ufr ufr=*ulf, U- ufr=*urb urb=*ufr, lu-r-ul-u-ruu urb=*ubl ubl=*urb, U ubl=*ulf ulf=*ubl, UU # two diagonal corners need to be swapped (3/24) ufr=*ubl ubl=*ufr, u urb=*ulf ulf=*urb, u- # rotate 3 corners ccw (4/16), four corners need to be moved ccw (1/16), rotate crosswise (2/16) ufr=*urb, u- ubl=*ulf, u- # rotate 3 corners cw (4/16), four corners need to be moved cw (1/16), rotate crosswise (2/16) ufr=*ulf, u ubl=*urb, u Depends: /Solvers/Layer Method (Leyan Lo)/Bottom corner place Path: /Solvers/Layer Method (Leyan Lo)/Bottom corner orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf dfr=dfr drb=drb dbl=dbl dlf=dlf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # lub=lub rub=bru luf=flu ruf=ufr, r-u-ru-r-uuruu ful=ful bul=lbu fur=rfu bur=urb, U bur=bur fur=rfu bul=lbu ful=ulf, U- ruf=ruf luf=flu rub=bru lub=ubl, UU # ful=ful lub=blu rub=ubr ruf=fru, rur-uruur-uu ruf=ruf ful=lfu bul=ulb bur=rbu, U lub=lub bur=rbu fur=urf ful=lfu, U- bur=bur ruf=fru luf=ufl lub=blu, UU # bul=ulb bur=urb ful=ful fur=fur, r-u-ru-r-uuruu luf=ufl lub=ubl ruf=ruf rub=rub, U rub=ubr ruf=ufr lub=lub luf=luf, U- fur=urf ful=ulf bur=bur bul=bul, UU # ful=ulf bul=ulb fur=fur bur=bur, rur-uruur-uu ruf=ufr luf=ufl rub=rub lub=lub, U lub=ubl rub=ubr luf=luf ruf=ruf, U- bur=urb fur=urf bul=bul ful=ful, UU # rub=ubr luf=flu ruf=ruf lub=lub, rur-uruur-uu bul=ulb fur=rfu bur=bur ful=ful, U fur=urf bul=lbu ful=ful bur=bur, U- luf=ufl rub=bru lub=lub ruf=ruf, UU # lub=ubl rub=bru luf=ufl ruf=fru, r-u-ru-r-uuruu ful=ulf bul=lbu fur=urf bur=rbu, U bur=urb fur=rfu bul=ulb ful=lfu, U- ruf=ufr luf=flu rub=ubr lub=blu, UU # lub=ubl rub=ubr luf=ufl ruf=ufr, r-u-ru-r-uuruu lub=blu rub=bru luf=flu ruf=fru, U Depends: /Solvers/Layer Method (Leyan Lo)/Bottom corner orient Path: /Solvers/Layer Method (Leyan Lo)/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dr=dr db=db dl=dl, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # solved (1/12) uf=uf ur=ur ub=ub ul=ul, @@solved # rotate 3 edges clockwise (4/12) uf=ub ub=ur ru=fu ul=ul, rrufb-rrf-burr ur=ul ul=ub bu=ru uf=uf, U ul=ur ur=uf fu=lu ub=ub, U- ub=uf uf=ul lu=bu ur=ur, UU # rotate 3 edges counterclockwise (4/12) ru=bu uf=ur ub=uf ul=ul, rru-fb-rrf-bu-rr bu=lu ur=ub ul=ur uf=uf, U fu=ru ul=uf ur=ul ub=ub, U- lu=fu ub=ul uf=ub ur=ur, UU # swap pairwise opposite edges, (1/12) uf=ub ru=lu lu=ru ub=uf, rrufb-rrf-burr # swap pairwise adjacent edges, (2/12) ru=bu uf=ul ub=ur lu=fu, rrufb-rrf-burr bu=lu ur=uf ul=ub fu=ru, rrufb-rrf-burr pybik-1.1/data/plugins/01-challenges.algorithm0000664000175000017500000000261712157366342021505 0ustar barccbarcc00000000000000# Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Model: * Path: /Challenges/Solve random cube Module: challenges random Path: /Challenges/Solve in 1 move Module: challenges random1 Path: /Challenges/Solve in 2 moves Module: challenges random2 Path: /Challenges/Solve in 3 moves Module: challenges random3 Path: /Challenges/Solve in 4 moves Module: challenges random4 Path: /Challenges/Solve in 5 moves Module: challenges random5 Path: /Challenges/Solve in 6 moves Module: challenges random6 Path: /Challenges/Solve in 7 moves Module: challenges random7 Path: /Challenges/Solve in 8 moves Module: challenges random8 Path: /Challenges/Solve in 9 moves Module: challenges random9 Path: /Challenges/Solve in 10 moves Module: challenges random10 pybik-1.1/data/plugins/80-pretty-patterns.algorithm0000664000175000017500000000741212157366436022576 0ustar barccbarcc00000000000000# Copyright © 2012-2013 B. Clausius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . File-Version: 1.1 Path: /Pretty patterns/Stripes Model: Brick k m n with k % 2 == n % 2 == 1 and m % 2 == 0 Module: pretty_patterns play_stripes_Brick_nnn_2 Path: /Pretty patterns/Stripes Model: Brick m n 1 with m % 4 == 1 and n % 2 == 1 Module: pretty_patterns play_stripes_Brick_nn1_4 Path: /Pretty patterns/Stripes Model: Brick 1 n m with m % 4 == 1 and n % 2 == 1 Module: pretty_patterns play_stripes_Brick_1nn_4 Path: /Pretty patterns/Stripes Model: Cube n with n % 2 == 0 Module: pretty_patterns play_stripes_Cube_nnn_2 Path: /Pretty patterns/Stripes Model: Tower k n with k % 2 == 0 Brick k m n with k % 2 == 0 and n % 2 == 0 Module: pretty_patterns play_stripes_TowerBrick_nnn_2 Path: /Pretty patterns/Stripes Model: Cube 3 Moves: rrffllrrffll Path: /Pretty patterns/Stripes Model: Tower 3 n Brick 3 m 3 Moves: rflrfl Path: /Pretty patterns/Criss-Cross Model: Cube Moves: rruullrruurr Path: /Pretty patterns/Criss-Cross Model: Tower Moves: ruulruur Path: /Pretty patterns/Fried Eggs Model: Cube n with n>=3 Moves: l2-f2-l2f2 Path: /Pretty patterns/Big Fried Eggs Model: Cube Moves: rl-fb-ud-rl- Path: /Pretty patterns/4 Fried Eggs Model: Cube n with n>=3 Moves: l2l2u2l2l2u2- Path: /Pretty patterns/Chessboard Model: Cube n with n % 2 == 1 Tower w h with w % 2 == 1 Brick w h d with w % 2 + h % 2 + d % 2 >= 2 Module: pretty_patterns play_chessboard Path: /Pretty patterns/Cross Model: Cube Moves: u-ffuul-rffuufflr-u- Path: /Pretty patterns/Zig Zag Model: Cube Moves: rlfbrlfbrlfb # T is the shape formed by the cube labels Path: /Pretty patterns/T-Time Model: Cube n with n%2 == 1 Module: pretty_patterns play_t_time_Cube_odd Path: /Pretty patterns/T-Time Model: Cube 4 Moves: l2l2l3l3du-f2f2f3f3ud-l2l2l3l3duul2l2l3l3uul2l2l3l3d-l2l2l3l3uu Path: /Pretty patterns/T-Time Model: Cube n with n%2 == 0 Module: pretty_patterns play_t_time_Cube_even Path: /Pretty patterns/T-Time Model: Tower m×n with m%2 == 1 Module: pretty_patterns play_t_time_Tower_odd Path: /Pretty patterns/T-Time Model: Tower m×n with n == 4 Moves: l4l5du-f4f5ud-l4l5duul4l5uul4l5d-l4l5uu Path: /Pretty patterns/T-Time Model: Tower m×n with m%2 == 0 Module: pretty_patterns play_t_time_Tower_even # C is the shape formed by the cube labels Path: /Pretty patterns/C Model: Cube Moves: uullr-b-rru-r-drfflr-fdlluu Path: /Pretty patterns/Cube in a Cube Model: Cube Moves: uur-ufu-r-uflfl-u-rfu-ru- Path: /Pretty patterns/Striped Cube in a Cube Model: Cube Moves: d-fd-lbddffurb-urrfd-rfuu Path: /Pretty patterns/Six Square Cuboids Model: Cube Moves: ffdffddllullu-llbddrr # Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. Path: /Pretty patterns/Superflip Model: Cube Moves: urrfbrbbruulbbru-d-rrfr-lbbuuff Path: /Pretty patterns/Superflip easy Model: Cube Moves: l2ul2ul2ul2uLDl2ul2ul2ul2uLDl2ul2ul2ul2uLD Path: /Pretty patterns/Green Mamba Model: Cube Moves: rdrfr-f-bdr-u-b-udd Path: /Pretty patterns/Anaconda Model: Cube Moves: lbbdrb-fd-l-rd-uf-rru- Path: /Pretty patterns/Duck Feet Model: Cube Moves: rrdu-ld-llrbrrubur-f-d-fu- pybik-1.1/data/pixmaps/0000775000175000017500000000000012157424343015240 5ustar barccbarcc00000000000000pybik-1.1/data/pixmaps/pybik-64.png0000664000175000017500000000663012130247776017324 0ustar barccbarcc00000000000000PNG  IHDR@@iqsRGBbKGD pHYs  tIME/ IDATxY?;?vvw MFqŅ"" !(ASP*Њ()i@[P@5IqKh&.M6c'W;novgvfᏙ;/m*{μ}~? NNN$~˶Y֭[ellL {#j0R ۱C-"1R <.%=uCE]"F. )'ێ`}1Gv>Ð4M/۷_gI؄EGO@yE r)[2ԁ8sxQg*\2(]%T=q! -*0.5>;Q=@bEou 82d9< HࡍՌۙ龌{*q_;<*Qr]-6f/ܬ=WrS36PhC|6Di`//.P k% '1`T j#$LQ9pt5Y<^ (WݧITǸgsIEWk_XĪ !޽Y2&o$B55!+΁fl}EH]Z$*P 5-[~agqHGK_abX]EI{3՝ z1 4FK|` "=mNM8:~0,Ҧ-)v~2W@ԡkίlxI,`ۥ4SM L+a |?-;LtQ !{Za@s1o\/b :uQil7FWqWA)cP7$ؤQ(FKF-4NJ¶d{lT/!;Wۿ~gF=o\: Ԫ@n!(Ы@f;ʮֹUS,G{ڈ,Z7@#h*j`ns"\O~ :zn/ gr]U~7^1r'$7 i@Us! 3ִNb_WWrv]#@nb4sN0Xz^qvAc-h@nv~\p5>w}r?żæ,'8)RVs.ؠ>دhKcЬpe kU|pT|ibf{x#[Ywr |䂶mQ|KBjv ;VE!zWTY\ilȾ`E[,cup" )T1MW)D uE%(uH}u` !]PW9j?E0E-M3 m^Rx_kYf԰k%{ quӑdƒE[ A- 5|{GcvxIW,ulNPґd/\REoXZdY嫓>}cItjCh6wg,cFIvWC!AG%U\R-.[Z*Ӓn{ ]%`.^ iAsh@*QKRöhFk[u*"Csښݧ+ڃ Ѻt,Қ$FI=u}apWi;.~;b<3O=Z4bͱ hI\* fe>-$L I5`Y{8vl:M̡LE$ [WmDz8!d[궧0 SL$]IӴH{@^%t~*ݗljh<>VjtWÂRd,jX:udDK_ *ĉ(THӢߝD[԰-bʦ& rRK%(f){on#MKYKWFEI(/lqe԰{\P2[C``Ey{¾އ':~nʵ%W==AQZɨskvbp&ѓx*U$8 @[ĹU]mtymDj!߻AHWS*a>|eyo>"L^:Ot-OPb U67*ٟ8/TD 74M%|6zXxwv{8=uBګМ,__s "ۮ{jHTj:(` ޳{nnTmNZvkFvsjl f@$Iϫ?&;.'Y%텱@A"XyQvfR*AycDD$l2Y_!̵C;=s=R,Xh<YH1m-Q!E4R'Ӹx+kynTIĖ^qQզHD¶30HELHpĊ$ %j́aapGOb{Mv! H ZJqA#=!F0nN$SbL{c3u0q439D5:e(W<;;Ny,͍g(|Yg?n鯟}m9@PR,D:00h 44Rv)(*e wfQ$""oeH0IU! &u){Ke3p"\S3D꒳e,`o#x|08Ie1 Fu)GB*={iXh=p D aӂ)9@ ;{tQbl. ;m9 1{u:|l9vGjmIÞGG<%*ۮ;\2w"fN`9:(ӵK${=@C4 6eOlÖ?V8P#%{G! Ą:0E`Z8s#%-#vz6 d;0:$M<5͍ >2!E>3n˅ l 뵫Kb1 hPnG?*cKj6Y_H <)1Й #D/$'l[ DbQ"i$'Mq3)1ZTFi3L|6LocˣѷԂ: >緝kk*t0MSj{_3-"$|"ϟuZh__M#,,.]JLyݽ"*Wn,%>mA~OK&jƓJD1-iR Zв/f7ܿ `(Z\@u鳻sUI֜ݮ??+V'֡8`bT@$J@ LpF$KcsQGʝGX )wV,Q4ʘM\D(rh&Ai4*+L @u:*㑐$KAG#EvLAg*a>@;l Inq&h0MSBiI (B)']Klw][*J љl@141kXŬѢ&tިG&͖X VhYaQ=@"  Q{g"-`V{wXweE;m|a+>UzsX wPy4Mu p :ѲH$O|$CG )V= b>,ͰR+k+tF67**-5NϟՇg٦^E).h[q] 13kѠNɥ5!fS S+ĺ4#ᅠvG<#XԿE vsI4l  u]{k7| D3B­8|xSn6^5dAdJb_pa\ravVMEQyl/^IENDB`pybik-1.1/data/applications/0000775000175000017500000000000012157424343016245 5ustar barccbarcc00000000000000pybik-1.1/data/applications/pybik.desktop0000644000175000017500000000476712157365500020771 0ustar barccbarcc00000000000000[Desktop Entry] Name=Pybik Name[ast]=Pybik Name[bn]=Pybik Name[bs]=Pybik Name[de]=Pybik Name[el]=Pybik Name[en_GB]=Pybik Name[es]=Pybik Name[fr]=Pybik Name[gl]=Pybik Name[he]=Pybik Name[id]=Pybik Name[it]=Pybik Name[ja]=Pybik Name[ky]=Pybik Name[ms]=Pybik Name[pl]=Pybik Name[pt_BR]=Pybik Name[ru]=Pybik Name[sr]=Питонова коцка Name[uk]=Pybik Name[uz]=Pybik Name[zh_CN]=Pybik Name[zh_TW]=Pybik Comment=3D Rubik's cube game Comment[ast]=Xuegu del cubu de Rubik 3D Comment[bn]=ত্রিমাত্রিক Rubik's কিউব খেলা Comment[bs]=3D Rubikova kocka Comment[de]=Ein 3D-Zauberwürfelspiel Comment[el]=Τρισδιάστατος κύβος του Ρούμπικ Comment[en_GB]=3D Rubik's cube game Comment[es]=Juego del cubo de Rubik en 3D Comment[fr]=Jeu de Rubik's cube en 3D Comment[gl]=Xogo do cubo de Rubik en 3D Comment[he]=משחק קוביה הונגרית תלת־ממדי Comment[id]=Game rubik 3D Comment[it]=Gioco 3D del cubo di Rubik Comment[ja]=三次元ルービックキューブゲーム Comment[ms]=Permainan kiub Rubrik 3D Comment[pl]=Trójwymiarowe układanie kostki Rubika Comment[pt_BR]=Jogo 3D do cubo de Rubik Comment[ru]=Трёхмерный кубик Рубика Comment[uk]=Тривимірний кубик Рубіка Comment[uz]=3D Rubik'ning kub oʻyini Comment[zh_CN]=3D 魔方游戏 Comment[zh_TW]=3D 魔術方塊遊戲 TryExec=pybik Exec=pybik Icon=pybik Type=Application Categories=Game;LogicGame; # Add whatever keywords you want in your language, separated by semicolons. These keywords are used when searching for applications in dashes, etc. (Unity, GNOME Shell) Keywords=rubik;cube;puzzle;magic; Keywords[ast]=rubik;cubu;rompecabeces;máxicu; Keywords[bs]=rubik;kocka;puzzle;slagalica;zagonetka; Keywords[de]=rubik;cube;würfel;puzzle;zauberwürfel; Keywords[el]=ρούμπικ;ρουμπικ;κύβος;κυβος;γρίφος;γριφος;kybos;kivos;kyvos;kubos;kuvos;grifos; Keywords[en_GB]=rubik;cube;puzzle;magic; Keywords[es]=rubik;cubo;rompecabezas;mágico; Keywords[fr]=rubik;cube;casse-tête;magique;jeu;énigme; Keywords[gl]=rubik;cubo;quebracabezas;maxico; Keywords[he]=הונגרית;רוביק;תצרף;פאזל;פזל;קסם;טריק; Keywords[ms]=rubik;kuib;teka-teki;magik; Keywords[pl]=rubik;kostka;puzzle;łamigłówka;magiczna; Keywords[uk]=rubik;cube;puzzle;magic;рубік;кубик;головоломка;загадка;гра; Keywords[zh_TW]=rubik;cube;puzzle;magic;魔術;方塊;立方體;拼圖; StartupNotify=true X-Ubuntu-Gettext-Domain=pybik pybik-1.1/data/GPL-30000777000175000017500000000000012130250057015513 2../COPYINGustar barccbarcc00000000000000pybik-1.1/NEWS0000644000175000017500000000263412157370726013355 0ustar barccbarcc00000000000000Pybik 1.1: * Rendering engine now uses modern OpenGL - should be faster on most systems - improved lighting effect * New and updated translations Pybik 1.0.1: * Minor improvements and bugfixes * Updated translations Pybik 1.0: * Improved user interface. * Added Towers and Bricks (non cubic puzzles). * Added an option to show the back faces. * The cube can be manipulated with the keyboard. * Animation is faster and rendering more beautiful. * Added more pretty patterns. * Added a new solver. * Added new translations. Pybik 0.5: * New solutions: - Spiegel improved - Solution for the 2×2×2 Cube * New file format for solutions * Improved mouse control - Mouse button with control key rotates the whole cube - Right button moves in the opposite direction * Changeable background color Pybik 0.4: This release does not contain many new features. Most of the changes took place under the hood. A new solution (Spiegel) has been added. Pybik 0.3: * Text field to edit moves in a notation similar to Singmaster's * The state of the cube and the moves are now stored between sessions * Some sequences for pretty patterns in the sidebar Pybik 0.2: * Preferences are stored with GConf * UI Improvements and bugfixes Pybik 0.1: * Port from gnubik-2.3 to Python * Sidebar for Actions * Redesigned color dialog * Improvements in cube rendering