def __init__(self, file, pathname, options): self.file = file self.pathname = pathname self.options = options self.white = CreateRGBColor(1.0, 1.0, 1.0) self.black = CreateRGBColor(0.0, 0.0, 0.0) self.Msg = Warnings()
def load_palette(self, file=None, count=255): filename = None if type(file) == StringType: if os.path.exists(file + '.edr'): filename = file + '.edr' elif os.path.exists(file + '.EDR'): filename = file + '.EDR' else: self.items = {} self.items.update(colors) self.from_file = False return if filename is not None: file = open(filename, 'rb') index = 1 while index <= count: data = file.read(4) if len(data) < 4: break r, g, b, nn = unpack('BBBB', data) self.items[index] = CreateRGBColor(r / 255.0, g / 255.0, b / 255.0) index += 1 self.from_file = True if filename is not None: file.close()
def process_fill(self, chunk): cdr_version=self.cdr_version fill_data=self.fill_data fild_pal_type = ('Transparent', 'Solid', 'Gradient') colorIndex='%02X'%ord(chunk.data[0]) + '%02X'%ord(chunk.data[1]) + '%02X'%ord(chunk.data[2]) + '%02X'%ord(chunk.data[3]) pal = ord(chunk.data[4]) if cdr_version >= 13: pal = ord(chunk.data[0xc]) if pal < 3: fild_type = fild_pal_type[pal] else: fild_type = 'Unknown (%X)'%pal clr_offset = 0x8 if cdr_version >= 13: clr_offset = 0x1b if clr_offset < chunk.rawsize: clrmode = ord(chunk.data[clr_offset]) if fild_type == 'Solid': offset = 0x10 if cdr_version >= 13: offset =0x23 if clrmode == 9: #Grayscale fill_data[colorIndex]=CreateCMYKColor(0, 0, 0, 1.0 - ord(chunk.data[offset]) /255.0) elif clrmode == 5: #RGB fill_data[colorIndex]=CreateRGBColor(ord(chunk.data[offset+2]) / 255.0, ord(chunk.data[offset+1])/ 255.0, ord(chunk.data[offset]) / 255.0) elif clrmode == 4: #CMY fill_data[colorIndex]=CreateCMYKColor(ord(chunk.data[offset])/255.0, ord(chunk.data[offset+1])/255.0, ord(chunk.data[offset+2])/255.0, 0.0) elif clrmode == 3:#CMYK255 fill_data[colorIndex]=CreateCMYKColor(ord(chunk.data[offset])/255.0, ord(chunk.data[offset+1])/255.0, ord(chunk.data[offset+2])/255.0, ord(chunk.data[offset+3])/255.0) elif clrmode == 2: #CMYK fill_data[colorIndex]=CreateCMYKColor(ord(chunk.data[offset])/100.0, ord(chunk.data[offset+1])/100.0, ord(chunk.data[offset+2])/100.0, ord(chunk.data[offset+3])/100.0) elif clrmode == 1: fill_data[colorIndex]=CreateCMYKColor(ord(chunk.data[offset])/255.0, ord(chunk.data[offset+1])/255.0, ord(chunk.data[offset+2])/255.0, ord(chunk.data[offset+3])/255.0) elif clrmode == 0x11: fill_data[colorIndex]=CreateCMYKColor(ord(chunk.data[offset])/255.0, ord(chunk.data[offset+1])/255.0, ord(chunk.data[offset+2])/255.0, ord(chunk.data[offset+3])/255.0) elif clrmode == 0x14: #Registration Color fill_data[colorIndex]=CreateCMYKColor(1,1,1,1) else: fill_data[colorIndex]=CreateCMYKColor(0, 0, 0, .20) if fild_type == 'Transparent': fill_data[colorIndex]=None if fild_type == 'Gradient': fill_data[colorIndex]=CreateCMYKColor(0, 0, 0, .3)
def gradient_stop(self, color_style, mid_point, ramp_point): if color_style == 0: # gray scale k = self.pop() color = CreateRGBColor(k, k, k) elif color_style == 1: # CMYK color = apply(CreateCMYKColor, tuple(self.pop_multi(4))) elif color_style == 2: # RGB Color args = tuple(self.pop_multi(7)) # The cmyk and rgb values usually differ slightly because AI # does some color correction. Which values should we choose # here? color = apply(CreateRGBColor, args[-3:]) color = apply(CreateCMYKColor, args[:4]) elif color_style == 3: # CMYK Custom Color args = self.pop_multi(6) color = apply(CreateCMYKColor, tuple(args[:4])) else: self.add_message( _("Gradient ColorStyle %d not yet supported." "substituted black") % color_style) if color_style == 4: n = 10 else: self.add_message(_("Unknown ColorStyle %d") % color_style) self.pop_multi(n) color = StandardColors.black # XXX #color = apply(CreateRGBColor, color) self.stack.append((ramp_point / 100.0, color))
def CreateBrushIndirect(self): style, r, g, b, hatch = self.get_struct('<hBBBxh') if style == 1: pattern = EmptyPattern else: pattern = SolidPattern(CreateRGBColor(r/255.0, g/255.0, b/255.0)) self.add_gdiobject((('fill_pattern', pattern),)) self._print('->', style, r, g, b, hatch)
def html_component_changed(self, *rest): html = self.html.get_text() try: RGBColor = CreateRGBColor( int(string.atoi(html[1:3], 0x10)) / 255.0, int(string.atoi(html[3:5], 0x10)) / 255.0, int(string.atoi(html[5:], 0x10)) / 255.0).RGB() except: RGBColor = self.color self.color_changed(RGBColor)
def csscolor(str): str = str.strip() if str[0] == '#' and len(str) == 7: r = atoi(str[1:3], 16) / 255.0 g = atoi(str[3:5], 16) / 255.0 b = atoi(str[5:7], 16) / 255.0 color = CreateRGBColor(r, g, b) else: color = StandardColors.black return color
def ta_set_colour(self, colour): if tuple(colour) == (255, 255, 255): return EmptyPattern else: return SolidPattern( CreateRGBColor( float(colour[0]) / 255.0, float(colour[1]) / 255.0, float(colour[2]) / 255.0))
def CreatePenIndirect(self): style, widthx, widthy, r, g, b = self.get_struct('<hhhBBBx') cap = (style & 0x0F00) >> 8 join = (style & 0x00F0) >> 4 style = style & 0x000F if style == 5: pattern = EmptyPattern else: pattern = SolidPattern(CreateRGBColor(r/255.0, g/255.0, b/255.0)) width = abs(widthx * self.trafo.m11) self.add_gdiobject((('line_pattern', pattern,), ('line_width', width))) self._print('->', style, widthx, widthy, r, g, b, cap, join)
def begin_ai_layer(self): if self.format_version >= 4.0: visible, preview, enabled, printing, dimmed, unused, has_mlm,\ color, red, green, blue, unused, unused = self.pop_multi(13) else: visible, preview, enabled, printing, dimmed, has_mlm, \ color, red, green, blue = self.pop_multi(10) color = CreateRGBColor(red / 255.0, green / 255.0, blue / 255.0) self.layer_kw_args = { 'printable': printing, 'visible': visible, 'locked': not enabled, 'outline_color': color }
def csscolor(str): str = str.strip() if str[0] == '#': if len(str) == 7: r = atoi(str[1:3], 16) / 255.0 g = atoi(str[3:5], 16) / 255.0 b = atoi(str[5:7], 16) / 255.0 elif len(str) == 4: # According to the CSS rules a single HEX digit is to be # treated as a repetition of the digit, so that for a digit # d the value is (16 * d + d) / 255.0 which is equal to d / 15.0 r = atoi(str[1], 16) / 15.0 g = atoi(str[2], 16) / 15.0 b = atoi(str[3], 16) / 15.0 color = CreateRGBColor(r, g, b) elif namedcolors.has_key(str): color = namedcolors[str] else: color = StandardColors.black return color
def rgb_component_changed(self, *rest): RGBColor = CreateRGBColor(self.var4.get_value() / 255.0, self.var5.get_value() / 255.0, self.var6.get_value() / 255.0).RGB() self.color_changed(RGBColor)
def ok(self, *args): r, g, b = tuple(self.color) ColorObject = CreateRGBColor(r, g, b) self.close_dlg(ColorObject)
def csscolor(str): #set default color black color = StandardColors.black parts = str parts = parts.replace(',', ' ') parts = parts.replace('(', ' ') parts = parts.replace(')', ' ') parts = parts.split() i = 0 while i < len(parts): part = parts[i] if part[0] == '#' and len(part) == 7: r = atoi(part[1:3], 16) / 255.0 g = atoi(part[3:5], 16) / 255.0 b = atoi(part[5:7], 16) / 255.0 color = CreateRGBColor(r, g, b) i += 1 elif part[0] == '#' and len(part) == 4: # According to the CSS rules a single HEX digit is to be # treated as a repetition of the digit, so that for a digit # d the value is (16 * d + d) / 255.0 which is equal to d / 15.0 r = atoi(part[1], 16) / 15.0 g = atoi(part[2], 16) / 15.0 b = atoi(part[3], 16) / 15.0 color = CreateRGBColor(r, g, b) i += 1 elif namedcolors.has_key(part): color = namedcolors[part] i += 1 elif part == 'rgb': if parts[i+1][-1] == '%': r = atof(parts[i+1][:-1]) / 100.0 else: r = atof(parts[i+1]) / 255.0 if parts[i+2][-1] == '%': g = atof(parts[i+2][:-1]) / 100.0 else: g = atof(parts[i+2]) / 255.0 if parts[i+3][-1] == '%': b = atof(parts[i+3][:-1]) / 100.0 else: b = atof(parts[i+3]) / 255.0 color = CreateRGBColor(r, g, b) i += 4 elif part == 'icc-color': #icc = parts[i+1] c = atof(parts[i+2]) m = atof(parts[i+3]) y = atof(parts[i+4]) k = atof(parts[i+5]) color = CreateCMYKColor(c, m, y, k) i += 6 elif part == 'device-gray': gray = 1.0 - atof(parts[i+1]) color = CreateCMYKColor(0, 0, 0, gray) i += 2 elif part == 'device-cmyk': c = atof(parts[i+1]) m = atof(parts[i+2]) y = atof(parts[i+3]) k = atof(parts[i+4]) color = CreateCMYKColor(c, m, y, k) i += 5 else: i += 1 return color
def rgb_custom_color(r, g, b, t): t = 1.0 - t return CreateRGBColor(1 - (t * (1 - r)), 1 - (t * (1 - g)), 1 - (t * (1 - b)))
def process_outline(self, chunk, usual): cdr_version = self.cdr_version outl = Outline() outl.outlineIndex = '%02X' % ord(chunk.data[0]) + '%02X' % ord( chunk.data[1]) + '%02X' % ord(chunk.data[2]) + '%02X' % ord( chunk.data[3]) ls_offset = 0x4 lc_offset = 0x6 ct_offset = 0x8 lw_offset = 0xc offset = 0x1c dash_offset = 0x68 if cdr_version >= 13: ls_offset = 0x18 lc_offset = 0x1a ct_offset = 0x1c lw_offset = 0x1e offset = 0x28 dash_offset = 0x74 outl.spec = ord(chunk.data[ls_offset]) outl.caps = ord(chunk.data[lc_offset]) outl.corner = ord(chunk.data[ct_offset]) [line_width] = struct.unpack('<L', chunk.data[lw_offset:lw_offset + 4]) outl.width = line_width * self.scale ## dashes [dashnum] = struct.unpack('<h', chunk.data[dash_offset:dash_offset + 2]) if dashnum > 0: outl.dashes = range(dashnum) for i in outl.dashes: [dash] = struct.unpack( '<h', chunk.data[dash_offset + 2 + i * 2:dash_offset + 4 + i * 2]) outl.dashes[i] = dash clrmode = ord(chunk.data[offset + 0x30]) if clrmode == 9: outl.color = CreateCMYKColor( 0, 0, 0, 1.0 - ord(chunk.data[offset + 0x38]) / 255.0) elif clrmode == 5: outl.color = CreateRGBColor( ord(chunk.data[offset + 0x3a]) / 255.0, ord(chunk.data[offset + 0x39]) / 255.0, ord(chunk.data[offset + 0x38]) / 255.0) elif clrmode == 4: outl.color = CreateCMYKColor( ord(chunk.data[offset + 0x38]) / 255.0, ord(chunk.data[offset + 0x39]) / 255.0, ord(chunk.data[offset + 0x3a]) / 255.0, 0.0) elif clrmode == 2: outl.color = CreateCMYKColor( ord(chunk.data[offset + 0x38]) / 100.0, ord(chunk.data[offset + 0x39]) / 100.0, ord(chunk.data[offset + 0x3a]) / 100.0, ord(chunk.data[offset + 0x3b]) / 100.0) elif clrmode == 3 or clrmode == 0x11: outl.color = CreateCMYKColor( ord(chunk.data[offset + 0x38]) / 255.0, ord(chunk.data[offset + 0x39]) / 255.0, ord(chunk.data[offset + 0x3a]) / 255.0, ord(chunk.data[offset + 0x3b]) / 255.0) elif clrmode == 17: outl.color = CreateCMYKColor( ord(chunk.data[offset + 0x38]) / 255.0, ord(chunk.data[offset + 0x39]) / 255.0, ord(chunk.data[offset + 0x3a]) / 255.0, ord(chunk.data[offset + 0x3b]) / 255.0) elif clrmode == 20: outl.color = CreateCMYKColor(1.0, 1.0, 1.0, 1.0) else: outl.color = CreateCMYKColor(0, 0, 0, 1) self.outl_data[outl.outlineIndex] = outl if not usual: self.default_outl_data = outl
def set_line_gray(self, k): self.line_color = CreateRGBColor(k, k, k)
def set_line_rgb(self, r, g, b): self.line_color = CreateRGBColor(r, g, b)
def read_objects(self, objects): n_objects = 0 # Traverse the list of drawfile object for object in objects: if isinstance(object, drawfile.group): # Start a group object in the document self.begin_group() # Descend into the group n_objects_lower = self.read_objects(object.objects) # If the group was empty then don't try to end it if n_objects_lower == 0: # self.__pop() (self.composite_class, self.composite_args, self.composite_items, self.composite_stack) = self.composite_stack else: # End group object self.end_group() n_objects = n_objects + 1 elif isinstance(object, drawfile.tagged): # Tagged object n_objects_lower = self.read_objects([object.object]) if n_objects_lower != 0: n_objects = n_objects + 1 elif isinstance(object, drawfile.path): # Path object n_objects = n_objects + 1 # Set the path style self.style.line_width = object.width / scale if object.style['join'] == 'mitred': self.style.line_join = const.JoinMiter if object.style['start cap'] == 'butt': self.style.line_cap = const.CapButt elif object.style['start cap'] == 'round': if object.width > 0: width = 0.5 length = 0.5 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (0.5 * length, width, length, 0.5 * width, length, 0.0), (length, -0.5 * width, 0.5 * length, -width, 0.0, -width), (0.0, width)] self.style.line_arrow1 = Arrow(path, 1) elif object.style['start cap'] == 'square': if object.width > 0: width = 0.5 length = 0.5 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (length, width), (length, -width), (0.0, -width), (0.0, width)] self.style.line_arrow1 = Arrow(path, 1) elif object.style['start cap'] == 'triangular': if object.width > 0: width = object.style['triangle cap width'] / 16.0 length = object.style['triangle cap length'] / 16.0 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (length, 0.0), (0.0, -width), (0.0, width)] self.style.line_arrow1 = Arrow(path, 1) if (object.width / scale) < 1.0: self.style.line_arrow1.path.Transform( Scale(object.width / scale, object.width / scale)) if object.style['end cap'] == 'butt': self.style.line_cap = const.CapButt elif object.style['end cap'] == 'round': if object.width > 0: width = 0.5 length = 0.5 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (0.5 * length, width, length, 0.5 * width, length, 0.0), (length, -0.5 * width, 0.5 * length, -width, 0.0, -width), (0.0, width)] self.style.line_arrow2 = Arrow(path, 1) elif object.style['end cap'] == 'square': if object.width > 0: width = 0.5 length = 0.5 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (length, width), (length, -width), (0.0, -width), (0.0, width)] self.style.line_arrow2 = Arrow(path, 1) elif object.style['end cap'] == 'triangular': if object.width > 0: width = object.style['triangle cap width'] / 16.0 length = object.style['triangle cap length'] / 16.0 else: width = 0.0 length = 0.0 # Draw arrow path = [(0.0, width), (length, 0.0), (0.0, -width), (0.0, width)] self.style.line_arrow2 = Arrow(path, 1) if (object.width / scale) < 1.0: self.style.line_arrow2.path.Transform( Scale(object.width / scale, object.width / scale)) # Outline colour if object.outline == [255, 255, 255, 255]: self.style.line_pattern = EmptyPattern else: self.style.line_pattern = SolidPattern( CreateRGBColor( float(object.outline[1]) / 255.0, float(object.outline[2]) / 255.0, float(object.outline[3]) / 255.0)) # Fill colour if object.fill == [255, 255, 255, 255]: self.style.fill_pattern = EmptyPattern else: self.style.fill_pattern = SolidPattern( CreateRGBColor( float(object.fill[1]) / 255.0, float(object.fill[2]) / 255.0, float(object.fill[3]) / 255.0)) # Dash pattern if object.style['dash pattern'] == 'present': line_dashes = [] for n in object.pattern: line_dashes.append(int(n / scale)) self.style.line_dashes = tuple(line_dashes) # Create a list of path objects in the document paths = [] path = None # Examine the path elements for element in object.path: if element[0] == 'move': x, y = self.relative(element[1][0], element[1][1]) # Add any previous path to the list if path != None: # path.load_close() paths.append(path) path = CreatePath() path.AppendLine(x, y) elif element[0] == 'draw': x, y = self.relative(element[1][0], element[1][1]) path.AppendLine(x, y) elif element[0] == 'bezier': x1, y1 = self.relative(element[1][0], element[1][1]) x2, y2 = self.relative(element[2][0], element[2][1]) x, y = self.relative(element[3][0], element[3][1]) path.AppendBezier(x1, y1, x2, y2, x, y) elif element[0] == 'close': path.ClosePath() elif element[0] == 'end': # Should be the last object in the path # path.load_close() paths.append(path) break # Create a bezier object if paths != []: self.bezier(tuple(paths)) elif isinstance(object, drawfile.font_table): # Font table n_objects = n_objects + 1 # Set object level instance self.font_table = object.font_table elif isinstance(object, drawfile.text): # Text object n_objects = n_objects + 1 # Determine the font if self.font_table.has_key(object.style): self.style.font = RISCOSFont(self.font_table[object.style]) else: self.style.font = GetFont('Times Roman') # The size self.style.font_size = object.size[0] / scale # Outline colour if object.background == [255, 255, 255, 255]: self.style.line_pattern = EmptyPattern else: self.style.line_pattern = SolidPattern( CreateRGBColor( float(object.background[1]) / 255.0, float(object.background[2]) / 255.0, float(object.background[3]) / 255.0)) # Fill colour if object.foreground == [255, 255, 255, 255]: self.style.fill_pattern = EmptyPattern else: self.style.fill_pattern = SolidPattern( CreateRGBColor( float(object.foreground[1]) / 255.0, float(object.foreground[2]) / 255.0, float(object.foreground[3]) / 255.0)) # Transformation if hasattr(object, 'transform'): x, y = object.transform[4] / scale, object.transform[ 5] / scale ox, oy = self.relative(object.baseline[0], object.baseline[1]) transform = Trafo(object.transform[0] / 65536.0, object.transform[1] / 65536.0, object.transform[2] / 65536.0, object.transform[3] / 65536.0, ox + x, oy + y) else: transform = Translation( self.relative(object.baseline[0], object.baseline[1])) # Write the text self.simple_text(object.text, transform) elif isinstance(object, drawfile.jpeg): # JPEG object n_objects = n_objects + 1 # Transformation matrix x, y = self.relative(object.transform[4], object.transform[5]) # Scale the object using the dpi information available, noting # that unlike Draw which uses 90 dpi, Sketch uses 72 dpi. # (I assume this since 90 dpi Drawfile JPEG objects appear 1.25 # times larger in Sketch if no scaling is performed here.) scale_x = (object.transform[0] / 65536.0) * (72.0 / object.dpi_x) scale_y = (object.transform[3] / 65536.0) * (72.0 / object.dpi_y) transform = Trafo(scale_x, object.transform[1] / 65536.0, object.transform[2] / 65536.0, scale_y, x, y) # Decode the JPEG image image = Image.open(StringIO.StringIO(object.image)) # # Read dimensions of images in pixels # width, height = image.size # # # Divide these by the dpi values to obtain the size of the # # image in inches # width, height = width/float(object.dpi_x), \ # height/float(object.dpi_y) # image.load() self.image(image, transform) elif isinstance(object, drawfile.sprite): # Sprite object n_objects = n_objects + 1 # Transformation matrix if hasattr(object, 'transform'): x, y = self.relative(object.transform[4], object.transform[5]) # Multiply the scale factor by that in the transformation matrix scale_x = (object.transform[0] / 65536.0) * (72.0 / object.sprite['dpi x']) scale_y = (object.transform[3] / 65536.0) * (72.0 / object.sprite['dpi y']) transform = Trafo(scale_x, (object.transform[1] / 65536.0) * \ (72.0 / object.sprite['dpi y']), (object.transform[2] / 65536.0) * \ (72.0 / object.sprite['dpi x']), scale_y, x, y) else: x, y = self.relative(object.x1, object.y1) # Draw scales the Sprite to fit in the object's # bounding box. To do the same, we need to know the # actual size of the Sprite # In points: # size_x = 72.0 * float(object.sprite['width']) / \ # object.sprite['dpi x'] # size_y = 72.0 * float(object.sprite['height']) / \ # object.sprite['dpi y'] # # # Bounding box dimensions in points: # bbox_width = (object.x2 - object.x1)/scale # bbox_height = (object.y2 - object.y1)/scale # # # Scale factors # scale_x = (bbox_width / size_x) * \ # (72.0 / object.sprite['dpi x']) # scale_y = (bbox_height / size_y) * \ # (72.0 / object.sprite['dpi y']) scale_x = (object.x2 - object.x1) / (scale * object.sprite['width']) scale_y = (object.y2 - object.y1) / (scale * object.sprite['height']) transform = Trafo(scale_x, 0.0, 0.0, scale_y, x, y) # Create an Image object image = Image.fromstring( object.sprite['mode'], (object.sprite['width'], object.sprite['height']), object.sprite['image']) self.image(image, transform) elif isinstance(object, drawfile.options): # Options object n_objects = n_objects + 1 # Read page size paper_size = object.options['paper size'] orientation = object.options['paper limits'] if paper_size in papersizes: if orientation == 'landscape': self.page_layout = pagelayout.PageLayout( object.options['paper size'], orientation=pagelayout.Landscape) else: self.page_layout = pagelayout.PageLayout( object.options['paper size'], orientation=pagelayout.Portrait) if object.options['grid locking'] == 'on': spacing = object.options['grid spacing'] if object.options['grid units'] == 'in': spacing = spacing * 72.0 else: spacing = spacing * 72.0 / 2.54 if object.options['grid shown'] == 'on': visible = 1 else: visible = 0 # self.begin_layer_class( GridLayer, # ( # (0, 0, int(spacing), int(spacing)), # visible, # CreateRGBColor(0.0, 0.0, 0.0), # _("Grid") # ) ) # self.end_composite() elif isinstance(object, drawfile.text_area): # Text area n_objects = n_objects + 1 # The text area object contains a number of columns. self.columns = len(object.columns) # Start in the first column and move to subsequent # columns as required, unless the number is overidden # by details in the text area. self.column = 0 # The cursor position is initially undefined. cursor = [None, None] # The column margins self.margin_offsets = [1.0, 1.0] self.margins = [ (object.columns[self.column].x1 / scale) + \ self.margin_offsets[0], (object.columns[self.column].x2 / scale) - \ self.margin_offsets[1] ] # The column base self.column_base = object.columns[self.column].y1 / scale # Line and paragraph spacing self.linespacing = 0.0 paragraph = 10.0 # Current font name and dimensions font_name = '' font_size = 0.0 font_width = 0.0 # Text colours background = (255, 255, 255) foreground = (0, 0, 0) # Build lines (lists of words) until the column width # is reached then write the line to the page. line = [] width = 0.0 # Current text alignment align = 'L' # Last command to be executed last_command = '' # Execute the commands in the text area: for command, args in object.commands: if command == '!': # Version number # print 'Version number', args pass elif command == 'A': # print 'Align:', args # Write current line self.ta_write_line(align, cursor, line, 0) # Empty the line list line = [] # Set the line width width = 0.0 # Align text align = args # Start new line cursor = self.ta_new_line(cursor, object, self.linespacing) elif command == 'B': # print 'Background:', args # Background colour background = args elif command == 'C': # print 'Foreground:', args # Foreground colour foreground = args elif command == 'D': # print 'Columns:', args # Number of columns if self.column == 0 and cursor == [None, None]: # Nothing rendered yet, so change number of columns self.columns = args elif command == 'F': # print 'Define font:', args # Define font (already defined in object.font_table) pass elif command == 'L': # print 'Line spacing:', args # Set line spacing self.linespacing = args elif command == 'M': # print 'Margins:', args # Change margins self.margin_offsets = [args[0], args[1]] self.margins = [ (object.columns[self.column].x1 / scale) + args[0], (object.columns[self.column].x2 / scale) - args[1] ] elif command == 'P': # print 'Paragraph spacing:', args # Change paragraph spacing paragraph = args elif command == 'U': # print 'Underlining' # Underlining pass elif command == 'V': # print 'Vertical displacement' # Vertical displacement pass elif command == '-': # print 'Hyphen' # Hyphen pass elif command == 'newl': # print 'New line' # New line # Write current line self.ta_write_line(align, cursor, line, 0) # Start new line cursor = self.ta_new_line(cursor, object, self.linespacing) # Can't position cursor? if cursor == [None, None]: break # Empty the line list line = [] # Set the line width width = 0.0 elif command == 'para': # print 'New paragraph' # New paragraph # Write current line self.ta_write_line(align, cursor, line, 0) # Start new line if last_command != 'newl': cursor = self.ta_new_line( cursor, object, paragraph + self.linespacing) else: cursor = self.ta_new_line(cursor, object, paragraph) # Can't position cursor? if cursor == [None, None]: break # Empty the line list line = [] # Set the line width width = 0.0 elif command == ';': # print 'Comment:', args # Comment pass elif command == 'font': # print 'Use font:', args # Font change font_name, font_size, font_width = object.font_table[ args] # Select font use_font = RISCOSFont(font_name) # Move cursor to start of a line if the cursor is # undefined if cursor == [None, None]: cursor[0] = self.margins[0] cursor[1] = (object.columns[self.column].y2 / scale) - font_size # Set line spacing self.linespacing = font_size elif command == 'text': # print args # Text. Add it to the line, checking that the line # remains within the margins. text, space = self.make_safe(args[0]), args[1] # Add the width of the text to the current total width textobj = SimpleText() width = width + use_font.TextCoordBox( text, font_size, textobj.properties)[2] # print width, margins[1] - margins[0] # Compare current total width with column width while width > (self.margins[1] - self.margins[0]): # First write any text on this line if line != []: # Width will exceed column width # print 'Width will exceed column width' # Write current line self.ta_write_line(align, cursor, line, 1) # Start new line cursor = self.ta_new_line( cursor, object, self.linespacing) # Can't position cursor? if cursor == [None, None]: break # Clear the list line = [] # Reset the width width = 0.0 # Now attempt to fit this word on the next line width = use_font.TextCoordBox( text, font_size, textobj.properties)[2] br = len(text) # Continue to try until the word fits, or none of it fits while width > (self.margins[1] - self.margins[0]) and br > 0: # Keep checking the size of the word width = use_font.TextCoordBox( text[:br], font_size, textobj.properties)[2] br = br - 1 if br == 0: # Word couldn't fit in the column at all, so # break out of this loop break elif br < len(text): # Write the subword to the line self.ta_write_line( align, cursor, [(text[:br], font_name, font_size, font_width, self.ta_set_colour(foreground), self.ta_set_colour(background))], 0) # Start new line cursor = self.ta_new_line( cursor, object, self.linespacing) # Can't position cursor? if cursor == [None, None]: break # keep the remaining text text = text[br:] # The width is just the width of this text width = use_font.TextCoordBox( text, font_size, textobj.properties)[2] # If the whole string fit onto the line then # control will flow to the else clause which will # append the text to the line list for next time. else: # The text fits within the margins so add the text # to the line line.append( (text, font_name, font_size, font_width, self.ta_set_colour(foreground), self.ta_set_colour(background))) # Also append any trailing space if space != '': line.append( (space, font_name, font_size, font_width, self.ta_set_colour(foreground), self.ta_set_colour(background))) width = width + use_font.TextCoordBox( space, font_size, textobj.properties)[2] # Can't position cursor? if cursor == [None, None]: break # Remember this command last_command = command # Render any remaining text if line != [] and cursor != [None, None]: # Write current line self.ta_write_line(align, cursor, line, 0) else: pass # Return the number of recognised objects return n_objects
def set_fill_gray(self, k): self.fill_color = CreateRGBColor(k, k, k)
def set_fill_rgb(self, r, g, b): self.fill_color = CreateRGBColor(r, g, b)