Hi. More visual example in attach. w/o debug printing. On mouse click it draw 4 lines (from left to right): 1. emulated line (via cd.Pixel) 2. emulated line, then XOR cd.Line 3. cd.Line, then XOR emulated line 4. cd.Line in GUI-selected WriteMode
For xored lines: WHITE fill BLACK xor CYAN = RED overlaps, BLACK underlaps -)
Emulated line always as CAPFLAT.Looks like that 1 missed pixel at the top - is center for square in CAPSQUARE and, also, is center for half-circle for CAPROUND.
Missed pixels at bottom - also missed in CAPSQUARE. But in CAPROUND - ok. Same bugs for horisontal lines. (not realised in this example) -- Regards, Karagy.
require "cdlua" require "iuplua" require "iupluacd" local cnv = iup.canvas { rastersize = "80x80", expand = "NO", --border = "NO", -- user-defined attrs line_width = 1, line_tpad = 4, line_bpad = 4, write_mode = cd.XOR, line_join = cd.MITER, line_cap = cd.CAPFLAT, line_color = cd.EncodeColor(0, 255, 255), } function cnv:map_cb() self.canvas = cd.CreateCanvas(cd.IUP, self) end function cnv:emulate_vline(x, y1, y2, w, mode, color) local c = self.canvas local dx_l = math.modf(w/2) local dx_r = math.modf((w-1)/2) c:WriteMode(mode) for _x = x-dx_l, x+dx_r do for _y=y1,y2 do c:Pixel(_x, _y, color) end end end function cnv:cd_vline(x, y1, y2, mode, color) local c = self.canvas c:WriteMode(mode) c:LineWidth(self.line_width) c:Foreground(color) c:LineJoin(self.line_join) c:LineCap(self.line_cap) c:Line(x,y1,x,y2) end -- draw vertical bar function cnv:draw_vline(x) local c = self.canvas c:Activate() c:Background(cd.WHITE) c:Clear() local w,h = c:GetSize() local y1 = 0 + self.line_bpad local y2 = h - 1 - self.line_tpad -- emulated line via cd.Pixel only local xx = x - 30 self:emulate_vline(xx, y1, y2, self.line_width, cd.REPLACE, cd.BLACK) -- emulated line via cd.Pixel local xx = x - 20 self:emulate_vline(xx, y1, y2, self.line_width, cd.REPLACE, cd.BLACK) -- and XOR cd.Line over emulated line self:cd_vline(xx, y1, y2, cd.XOR, cd.CYAN) -- and back to front -- FILL cd.Line local xx = x - 10 self:cd_vline(xx, y1, y2, cd.REPLACE, cd.BLACK) -- and xor emulated line over it self:emulate_vline(xx, y1, y2, self.line_width, cd.XOR, cd.CYAN) -- original self:cd_vline(x, y1, y2, self.write_mode, cd.CYAN) c:Deactivate() end function cnv:move_vline(x, y) local w,h = self.canvas:GetSize() if x >= 0 and x < w then local _x = self.old_x or x if _x ~= x then self:draw_vline(_x) _x = x end self:draw_vline(x) self.old_x = _x end end function cnv:button_cb(but, pressed, x, y, status) if but == iup.BUTTON1 then self.old_x = pressed == 1 and x self:draw_vline(x) end end function cnv:motion_cb(x, y, status) if status:sub(3,3) == "1" then self:move_vline(x) end end local dlg = iup.dialog { iup.frame{ iup.vbox{ margin = "2x2", -- canvas iup.hbox{ cnv, iup.vbox{ margin = "0x0", iup.frame{ title = "LineWidth", iup.vbox{ margin = "10x", iup.fill{}, iup.text{ visiblecolumns = 2, spin = "YES", spinmin = 1, spin_cb = function (self, pos) cnv.line_width = pos end, }, iup.fill{}, }, }, }, iup.vbox{ iup.frame{ title = "Top Pad", iup.vbox{ margin = "10x", iup.fill{}, iup.text{ visiblecolumns = 2, spin = "YES", spinmin = 0, spinvalue = 4, spin_cb = function (self, pos) cnv.line_tpad = pos end, }, iup.fill{}, }, }, iup.frame{ title = "Bottom Pad", iup.vbox{ margin = "10x", iup.fill{}, iup.text{ visiblecolumns = 2, spin = "YES", spinmin = 0, spinvalue = 4, spin_cb = function (self, pos) cnv.line_bpad = pos end, }, iup.fill{}, }, }, }, }, iup.hbox{ iup.frame{ title = "WriteMode", iup.radio{ iup.vbox{ iup.toggle{ title="XOR", action = function (self, state) if state == 1 then cnv.write_mode = cd.XOR end end, }, iup.toggle{ title="REPLACE", action = function (self, state) if state == 1 then cnv.write_mode = cd.REPLACE end end, }, iup.fill{}, }, }, }, iup.frame{ title = "LineJoin", iup.radio{ iup.vbox{ iup.toggle{ title="MITER", action = function (self, state) if state == 1 then cnv.line_join = cd.MITER end end, }, iup.toggle{ title="BEVEL", action = function (self, state) if state == 1 then cnv.line_join = cd.BEVEL end end, }, iup.toggle{ title="ROUND", action = function (self, state) if state == 1 then cnv.line_join = cd.ROUND end end, }, iup.fill{}, }, }, }, iup.frame{ title = "LineCap", iup.radio{ iup.vbox{ iup.toggle{ title="CAPFLAT", action = function (self, state) if state == 1 then cnv.line_cap = cd.CAPFLAT end end, }, iup.toggle{ title="CAPSQUARE", action = function (self, state) if state == 1 then cnv.line_cap = cd.CAPSQUARE end end, }, iup.toggle{ title="CAPROUND", action = function (self, state) if state == 1 then cnv.line_cap = cd.CAPROUND end end, }, iup.fill{}, }, }, }, }, }, }, --size = "HALFx", } dlg:showxy(iup.CENTER, iup.CENTER) iup.MainLoop()
------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________ Iup-users mailing list Iup-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iup-users