Guest User

Sprite-Resizer Error

a guest
Oct 24th, 2017
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.86 KB | None | 0 0
  1. #===============================================================================
  2. # Overriding Sprite, Viewport, and Plane to support resizing
  3. # By Peter O.
  4. # Modified by Luka S.J. and Maruno to support fullscreen and more sizes.
  5. # -- This is a stand-alone RGSS script. --
  6. #===============================================================================
  7. $ResizeFactor = 1.0
  8. $ResizeFactorMul = 100
  9. $ResizeOffsetX = 0
  10. $ResizeOffsetY = 0
  11. $ResizeFactorSet = false
  12. $HaveResizeBorder = false
  13.  
  14. if true # Disables using Alt+Enter to go fullscreen
  15. regHotKey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I')
  16. regHotKey.call(0, 1, 1, 0x0D)
  17. end
  18.  
  19. def pbSetResizeFactor(factor=1,norecalc=false)
  20. factor=[0.5,1.0,1.5,2.0,-1][factor]
  21. if !norecalc
  22. (factor<0) ? pbConfigureFullScreen : pbConfigureWindowedScreen(factor)
  23. end
  24.  
  25. def pbSetResizeFactor2(factor,force=false)
  26. if $ResizeFactor!=factor || force
  27. $ResizeFactor=factor
  28. $ResizeFactorMul=(factor*100).to_i
  29. if $ResizeFactorSet!=false
  30. ObjectSpace.each_object(Sprite){|o|
  31. next if o.disposed?
  32. o.x=o.x
  33. o.y=o.y
  34. o.ox=o.ox
  35. o.oy=o.oy
  36. o.zoom_x=o.zoom_x
  37. o.zoom_y=o.zoom_y
  38. }
  39. ObjectSpace.each_object(Viewport){|o|
  40. begin
  41. o.rect=o.rect
  42. o.ox=o.ox
  43. o.oy=o.oy
  44. rescue RGSSError
  45. end
  46. }
  47. ObjectSpace.each_object(Plane){|o|
  48. next if o.disposed?
  49. o.zoom_x=o.zoom_x
  50. o.zoom_y=o.zoom_y
  51. }
  52. end
  53. end
  54. $ResizeFactorSet=true
  55. if $HaveResizeBorder
  56. $ResizeBorder.refresh
  57. end
  58. begin
  59. if Graphics.haveresizescreen
  60. Graphics.oldresizescreen(
  61. (Graphics.width+$ResizeOffsetX*2)*factor,
  62. (Graphics.height+$ResizeOffsetY*2)*factor
  63. )
  64. end
  65. Win32API.SetWindowPos(
  66. (Graphics.width+$ResizeOffsetX*2)*factor,
  67. (Graphics.height+$ResizeOffsetY*2)*factor
  68. )
  69. rescue
  70. end
  71. end
  72.  
  73. def pbConfigureFullScreen
  74. params = Win32API.fillScreen
  75. fullgamew = gamew = DEFAULTSCREENWIDTH
  76. fullgameh = gameh = DEFAULTSCREENHEIGHT
  77. if !FULLSCREENBORDERCROP && $PokemonSystem && $PokemonSystem.border==1
  78. fullgamew += BORDERWIDTH * 2
  79. fullgameh += BORDERHEIGHT * 2
  80. end
  81. factor_x = ((2*params[0])/fullgamew).floor
  82. factor_y = ((2*params[1])/fullgameh).floor
  83. factor = [factor_x,factor_y].min/2.0
  84. offset_x = (params[0]-gamew*factor)/(2*factor)
  85. offset_y = (params[1]-gameh*factor)/(2*factor)
  86. $ResizeOffsetX = offset_x
  87. $ResizeOffsetY = offset_y
  88. ObjectSpace.each_object(Viewport){|o|
  89. begin
  90. next if o.rect.nil?
  91. ox = o.rect.x-$ResizeOffsetX
  92. oy = o.rect.y-$ResizeOffsetY
  93. o.rect.x = ox+offset_x
  94. o.rect.y = oy+offset_y
  95. rescue RGSSError
  96. end
  97. }
  98. pbSetResizeFactor2(factor,true)
  99. end
  100.  
  101. def pbConfigureWindowedScreen(value)
  102. border=$PokemonSystem ? $PokemonSystem.border : 0
  103. $ResizeOffsetX=[0,BORDERWIDTH][border]
  104. $ResizeOffsetY=[0,BORDERHEIGHT][border]
  105. pbSetResizeFactor2(value,true)
  106. Win32API.restoreScreen
  107. end
  108.  
  109. def setScreenBorderName(border)
  110. if !$HaveResizeBorder
  111. $ResizeBorder=ScreenBorder.new
  112. $HaveResizeBorder=true
  113. end
  114. if $ResizeBorder
  115. $ResizeBorder.bordername=border
  116. end
  117. end
  118.  
  119.  
  120.  
  121. module Graphics
  122. ## Nominal screen size
  123. @@width=DEFAULTSCREENWIDTH
  124. @@height=DEFAULTSCREENHEIGHT
  125.  
  126. def self.width
  127. return @@width.to_i
  128. end
  129.  
  130. def self.height
  131. return @@height.to_i
  132. end
  133.  
  134. @@fadeoutvp=Viewport.new(0,0,640,480)
  135. @@fadeoutvp.z=0x3FFFFFFF
  136. @@fadeoutvp.color=Color.new(0,0,0,0)
  137.  
  138. def self.brightness
  139. return (255-@@fadeoutvp.color.alpha)
  140. end
  141.  
  142. def self.brightness=(value)
  143. value=0 if value<0
  144. value=255 if value>255
  145. @@fadeoutvp.color.alpha=255-value
  146. end
  147.  
  148. def self.fadein(frames)
  149. return if frames<=0
  150. curvalue=self.brightness
  151. count=(255-self.brightness)
  152. frames.times do |i|
  153. self.brightness=curvalue+(count*i/frames)
  154. self.update
  155. end
  156. end
  157.  
  158. def self.wait(frames)
  159. return if frames<=0
  160. frames.times do |i|
  161. self.update
  162. end
  163. end
  164.  
  165. def self.fadeout(frames)
  166. return if frames<=0
  167. curvalue=self.brightness
  168. count=self.brightness
  169. frames.times do |i|
  170. self.brightness=curvalue-(count*i/frames)
  171. self.update
  172. end
  173. end
  174.  
  175. class << self
  176. begin
  177. x=@@haveresizescreen
  178. rescue NameError # If exception is caught, the class
  179. if !method_defined?(:oldresizescreen) # variable wasn't defined yet
  180. begin
  181. alias oldresizescreen resize_screen
  182. @@haveresizescreen=true
  183. rescue
  184. @@haveresizescreen=false
  185. end
  186. else
  187. @@haveresizescreen=false
  188. end
  189. end
  190.  
  191. def haveresizescreen
  192. @@haveresizescreen
  193. end
  194. end
  195.  
  196. def self.resize_screen(w,h)
  197. @@width=w
  198. @@height=h
  199. pbSetResizeFactor($ResizeFactor,true)
  200. end
  201.  
  202. @@deletefailed=false
  203.  
  204. def self.snap_to_bitmap
  205. tempPath=ENV["TEMP"]+"\\tempscreen.bmp"
  206. if safeExists?(tempPath) && @@deletefailed
  207. begin
  208. File.delete(tempPath)
  209. @@deletefailed=false
  210. rescue Errno::EACCES
  211. @@deletefailed=true
  212. return nil
  213. end
  214. end
  215. if safeExists?("./rubyscreen.dll")
  216. takescreen=Win32API.new("rubyscreen.dll","TakeScreenshot","p","i")
  217. takescreen.call(tempPath)
  218. end
  219. bm=nil
  220. if safeExists?(tempPath)
  221. bm=Bitmap.new(tempPath)
  222. begin
  223. File.delete(tempPath)
  224. @@deletefailed=false
  225. rescue Errno::EACCES
  226. @@deletefailed=true
  227. end
  228. end
  229. if bm && bm.get_pixel(0,0).alpha==0
  230. bm.asOpaque
  231. end
  232. if bm && $ResizeOffsetX && $ResizeOffsetY && ($ResizeOffsetX!=0 || $ResizeOffsetY!=0)
  233. tmpbitmap=Bitmap.new(Graphics.width*$ResizeFactor,Graphics.height*$ResizeFactor)
  234. tmpbitmap.blt(0,0,bm,Rect.new(
  235. $ResizeOffsetX*$ResizeFactor,$ResizeOffsetY*$ResizeFactor,tmpbitmap.width,tmpbitmap.height))
  236. bm.dispose
  237. bm=tmpbitmap
  238. end
  239. if bm && (bm.width!=Graphics.width || bm.height!=Graphics.height)
  240. newbitmap=Bitmap.new(Graphics.width,Graphics.height)
  241. newbitmap.stretch_blt(newbitmap.rect,bm,Rect.new(0,0,bm.width,bm.height))
  242. bm.dispose
  243. bm=newbitmap
  244. end
  245. return bm
  246. end
  247. end
  248.  
  249.  
  250.  
  251. class Sprite
  252. unless @SpriteResizerMethodsAliased
  253. alias _initialize_SpriteResizer initialize
  254. alias _x_SpriteResizer x
  255. alias _y_SpriteResizer y
  256. alias _ox_SpriteResizer ox
  257. alias _oy_SpriteResizer oy
  258. alias _zoomx_SpriteResizer zoom_x
  259. alias _zoomy_SpriteResizer zoom_y
  260. alias _xeq_SpriteResizer x=
  261. alias _yeq_SpriteResizer y=
  262. alias _zoomxeq_SpriteResizer zoom_x=
  263. alias _zoomyeq_SpriteResizer zoom_y=
  264. alias _oxeq_SpriteResizer ox=
  265. alias _oyeq_SpriteResizer oy=
  266. alias _bushdeptheq_SpriteResizer bush_depth=
  267. @SpriteResizerMethodsAliased=true
  268. end
  269.  
  270. def initialize(viewport=nil)
  271. _initialize_SpriteResizer(viewport)
  272. @resizedX=0
  273. @resizedY=0
  274. @resizedOx=0
  275. @resizedOy=0
  276. @resizedBushDepth=0
  277. @resizedZoomX=1.0
  278. @resizedZoomY=1.0
  279. if $ResizeOffsetX!=0 && $ResizeOffsetY!=0 && !viewport
  280. _xeq_SpriteResizer($ResizeOffsetX*$ResizeFactorMul/100)
  281. _yeq_SpriteResizer($ResizeOffsetY*$ResizeFactorMul/100)
  282. end
  283. _zoomxeq_SpriteResizer(@resizedZoomX*$ResizeFactorMul/100)
  284. _zoomyeq_SpriteResizer(@resizedZoomY*$ResizeFactorMul/100)
  285. end
  286.  
  287. def zoom_x
  288. return @resizedZoomX
  289. end
  290.  
  291. def zoom_x=(val)
  292. value=val
  293. if $ResizeFactorMul!=100
  294. value=(val.to_f*$ResizeFactorMul/100)
  295. if (value-0.50).abs<=0.001
  296. value=0.50
  297. end
  298. if (value-1.00).abs<=0.001
  299. value=1.00
  300. end
  301. if (value-1.50).abs<=0.001
  302. value=1.50
  303. end
  304. if (value-2.00).abs<=0.001
  305. value=2.00
  306. end
  307. end
  308. _zoomxeq_SpriteResizer(value)
  309. @resizedZoomX=val
  310. end
  311.  
  312. def zoom_y
  313. return @resizedZoomY
  314. end
  315.  
  316. def zoom_y=(val)
  317. value=val
  318. if $ResizeFactorMul!=100
  319. value=(val.to_f*$ResizeFactorMul/100)
  320. if (value-0.50).abs<=0.001
  321. value=0.50
  322. end
  323. if (value-1.00).abs<=0.001
  324. value=1.00
  325. end
  326. if (value-1.50).abs<=0.001
  327. value=1.50
  328. end
  329. if (value-2.00).abs<=0.001
  330. value=2.00
  331. end
  332. end
  333. _zoomyeq_SpriteResizer(value)
  334. @resizedZoomY=val
  335. end
  336.  
  337. def x
  338. return @resizedX
  339. end
  340.  
  341. def x=(val)
  342. if $ResizeFactorMul!=100
  343. offset=(self.viewport) ? 0 : $ResizeOffsetX
  344. value=((val.to_i+offset)*$ResizeFactorMul/100)
  345. _xeq_SpriteResizer(value.to_i)
  346. @resizedX=val.to_i
  347. elsif self.viewport
  348. _xeq_SpriteResizer(val)
  349. @resizedX=val
  350. else
  351. _xeq_SpriteResizer(val + $ResizeOffsetX)
  352. @resizedX=val
  353. end
  354. end
  355.  
  356. def y
  357. return @resizedY
  358. end
  359.  
  360. def bush_depth=(val)
  361. value=((val.to_i)*$ResizeFactorMul/100)
  362. _bushdeptheq_SpriteResizer(value.to_i)
  363. @resizedBushDepth=val.to_i
  364. end
  365.  
  366. def bush_depth
  367. return @resizedBushDepth
  368. end
  369.  
  370. def y=(val)
  371. if $ResizeFactorMul!=100
  372. offset=(self.viewport) ? 0 : $ResizeOffsetY
  373. value=((val.to_i+offset)*$ResizeFactorMul/100)
  374. _yeq_SpriteResizer(value.to_i)
  375. @resizedY=val.to_i
  376. elsif self.viewport
  377. _yeq_SpriteResizer(val)
  378. @resizedY=val
  379. else
  380. _yeq_SpriteResizer(val + $ResizeOffsetY)
  381. @resizedY=val
  382. end
  383. end
  384.  
  385. def ox=(val)
  386. if $ResizeFactor!=1.0
  387. val=(val*$ResizeFactor).to_i
  388. val=(val/$ResizeFactor).to_i
  389. end
  390. @resizedOx=val
  391. _oxeq_SpriteResizer(val)
  392. end
  393.  
  394. def oy=(val)
  395. if $ResizeFactor!=1.0
  396. val=(val*$ResizeFactor).to_i
  397. val=(val/$ResizeFactor).to_i
  398. end
  399. @resizedOy=val
  400. _oyeq_SpriteResizer(val)
  401. end
  402.  
  403. def ox
  404. return @resizedOx
  405. end
  406.  
  407. def oy
  408. return @resizedOy
  409. end
  410. end
  411.  
  412.  
  413.  
  414. class NotifiableRect < Rect
  415. def setNotifyProc(proc)
  416. @notifyProc=proc
  417. end
  418.  
  419. def set(x,y,width,height)
  420. super
  421. @notifyProc.call(self) if @notifyProc
  422. end
  423.  
  424. def x=(value)
  425. super
  426. @notifyProc.call(self) if @notifyProc
  427. end
  428.  
  429. def y=(value)
  430. super
  431. @notifyProc.call(self) if @notifyProc
  432. end
  433.  
  434. def width=(value)
  435. super
  436. @notifyProc.call(self) if @notifyProc
  437. end
  438.  
  439. def height=(value)
  440. super
  441. @notifyProc.call(self) if @notifyProc
  442. end
  443. end
  444.  
  445.  
  446.  
  447. class Viewport
  448. unless @SpriteResizerMethodsAliased
  449. alias _initialize_SpriteResizer initialize
  450. alias _rect_ViewportResizer rect
  451. alias _recteq_SpriteResizer rect=
  452. alias _oxeq_SpriteResizer ox=
  453. alias _oyeq_SpriteResizer oy=
  454. @SpriteResizerMethodsAliased=true
  455. end
  456.  
  457. def initialize(*arg)
  458. args=arg.clone
  459. @oldrect=Rect.new(0,0,100,100)
  460. _initialize_SpriteResizer(
  461. @oldrect
  462. )
  463. newRect=NotifiableRect.new(0,0,0,0)
  464. @resizedRectProc=Proc.new {|r|
  465. if $ResizeFactorMul==100
  466. @oldrect.set(
  467. r.x.to_i+$ResizeOffsetX,
  468. r.y.to_i+$ResizeOffsetY,
  469. r.width.to_i,
  470. r.height.to_i
  471. )
  472. self._recteq_SpriteResizer(@oldrect)
  473. else
  474. @oldrect.set(
  475. ((r.x+$ResizeOffsetX)*$ResizeFactorMul/100).to_i,
  476. ((r.y+$ResizeOffsetY)*$ResizeFactorMul/100).to_i,
  477. (r.width*$ResizeFactorMul/100).to_i,
  478. (r.height*$ResizeFactorMul/100).to_i
  479. )
  480. self._recteq_SpriteResizer(@oldrect)
  481. end
  482. }
  483. newRect.setNotifyProc(@resizedRectProc)
  484. if arg.length==1
  485. newRect.set(args[0].x,args[0].y,args[0].width,args[0].height)
  486. else
  487. newRect.set(args[0],args[1],args[2],args[3])
  488. end
  489. @resizedRect=newRect
  490. @resizedOx=0
  491. @resizedOy=0
  492. end
  493.  
  494. def ox
  495. return @resizedOx
  496. end
  497.  
  498. def ox=(val)
  499. return if !val
  500. _oxeq_SpriteResizer((val*$ResizeFactorMul/100).to_i.to_f)
  501. @resizedOx=val
  502. end
  503.  
  504. def oy
  505. return @resizedOy
  506. end
  507.  
  508. def oy=(val)
  509. return if !val
  510. _oyeq_SpriteResizer((val*$ResizeFactorMul/100).to_i.to_f)
  511. @resizedOy=val
  512. end
  513.  
  514. def rect
  515. return @resizedRect
  516. end
  517.  
  518. def rect=(val)
  519. if val
  520. newRect=NotifiableRect.new(0,0,100,100)
  521. newRect.setNotifyProc(@resizedRectProc)
  522. newRect.set(val.x.to_i,val.y.to_i,val.width.to_i,val.height.to_i)
  523. @resizedRect=newRect
  524. end
  525. end
  526. end
  527.  
  528.  
  529.  
  530. class Plane
  531. unless @SpriteResizerMethodsAliased
  532. alias _initialize_SpriteResizer initialize
  533. alias _zoomxeq_SpriteResizer zoom_x=
  534. alias _zoomyeq_SpriteResizer zoom_y=
  535. alias _oxeq_SpriteResizer ox=
  536. alias _oyeq_SpriteResizer oy=
  537. @SpriteResizerMethodsAliased=true
  538. end
  539.  
  540. def initialize(viewport=nil)
  541. _initialize_SpriteResizer(viewport)
  542. @resizedZoomX=1.0
  543. @resizedZoomY=1.0
  544. @resizedOx=0
  545. @resizedOy=0
  546. _zoomxeq_SpriteResizer(@resizedZoomX*$ResizeFactorMul/100)
  547. _zoomyeq_SpriteResizer(@resizedZoomY*$ResizeFactorMul/100)
  548. end
  549.  
  550. def ox
  551. return @resizedOx
  552. end
  553.  
  554. def ox=(val)
  555. return if !val
  556. _oxeq_SpriteResizer(val*$ResizeFactorMul/100)
  557. @resizedOx=val
  558. end
  559.  
  560. def oy
  561. return @resizedOy
  562. end
  563.  
  564. def oy=(val)
  565. return if !val
  566. _oyeq_SpriteResizer(val*$ResizeFactorMul/100)
  567. @resizedOy=val
  568. end
  569.  
  570. def zoom_x
  571. return @resizedZoomX
  572. end
  573.  
  574. def zoom_x=(val)
  575. return if !val
  576. _zoomxeq_SpriteResizer(val*$ResizeFactorMul/100)
  577. @resizedZoomX=val
  578. end
  579.  
  580. def zoom_y
  581. return @resizedZoomY
  582. end
  583.  
  584. def zoom_y=(val)
  585. return if !val
  586. _zoomyeq_SpriteResizer(val*$ResizeFactorMul/100)
  587. @resizedZoomY=val
  588. end
  589. end
  590.  
  591.  
  592.  
  593.  
  594. class ScreenBorder
  595. def initialize
  596. initializeInternal
  597. refresh
  598. end
  599.  
  600. def initializeInternal
  601. @maximumZ=500000
  602. @bordername=""
  603. @sprite=IconSprite.new(0,0) rescue Sprite.new
  604. @defaultwidth=640
  605. @defaultheight=480
  606. @defaultbitmap=Bitmap.new(@defaultwidth,@defaultheight)
  607. end
  608.  
  609. def dispose
  610. @borderbitmap.dispose if @borderbitmap
  611. @defaultbitmap.dispose
  612. @sprite.dispose
  613. end
  614.  
  615. def adjustZ(z)
  616. if z>=@maximumZ
  617. @maximumZ=z+1
  618. @sprite.z=@maximumZ
  619. end
  620. end
  621.  
  622. def bordername=(value)
  623. @bordername=value
  624. refresh
  625. end
  626.  
  627. def refresh
  628. @sprite.z=@maximumZ
  629. @sprite.x=-BORDERWIDTH
  630. @sprite.y=-BORDERHEIGHT
  631. @sprite.visible=($PokemonSystem && $PokemonSystem.border==1)
  632. @sprite.bitmap=nil
  633. if @sprite.visible
  634. if @bordername!=nil && @bordername!=""
  635. setSpriteBitmap("Graphics/Pictures/"+@bordername)
  636. else
  637. setSpriteBitmap(nil)
  638. @sprite.bitmap=@defaultbitmap
  639. end
  640. end
  641. @defaultbitmap.clear
  642. @defaultbitmap.fill_rect(0,0,@defaultwidth,$ResizeOffsetY,Color.new(0,0,0))
  643. @defaultbitmap.fill_rect(0,$ResizeOffsetY,
  644. $ResizeOffsetX,@defaultheight-$ResizeOffsetY,Color.new(0,0,0))
  645. @defaultbitmap.fill_rect(@defaultwidth-$ResizeOffsetX,$ResizeOffsetY,
  646. $ResizeOffsetX,@defaultheight-$ResizeOffsetY,Color.new(0,0,0))
  647. @defaultbitmap.fill_rect($ResizeOffsetX,@defaultheight-$ResizeOffsetY,
  648. @defaultwidth-$ResizeOffsetX*2,$ResizeOffsetY,Color.new(0,0,0))
  649. end
  650.  
  651. private
  652.  
  653. def setSpriteBitmap(x)
  654. if (@sprite.is_a?(IconSprite) rescue false)
  655. @sprite.setBitmap(x)
  656. else
  657. @sprite.bitmap=x ? RPG::Cache.load_bitmap("",x) : nil
  658. end
  659. end
  660. end
  661.  
  662.  
  663.  
  664. class Bitmap
  665. # Fast methods for retrieving bitmap data
  666. RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  667. RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  668. SwapRgb = Win32API.new('./rubyscreen.dll', 'SwapRgb', 'pi', '') rescue nil
  669.  
  670. def setData(x)
  671. RtlMoveMemory_ip.call(self.address, x, x.length)
  672. end
  673.  
  674. def getData
  675. data = "rgba" * width * height
  676. RtlMoveMemory_pi.call(data, self.address, data.length)
  677. return data
  678. end
  679.  
  680. def swap32(x)
  681. return ((x>>24)&0x000000FF)|
  682. ((x>>8)&0x0000FF00)|
  683. ((x<<8)&0x00FF0000)|
  684. ((x<<24)&0xFF000000)
  685. end
  686.  
  687. def asOpaque
  688. data=getData
  689. j=3
  690. for i in 0...width*height
  691. data[j]=0xFF
  692. j+=4
  693. end
  694. setData(data)
  695. end
  696.  
  697. def saveToPng(filename)
  698. bytes=[
  699. 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D
  700. ].pack("CCCCCCCCCCCC")
  701. ihdr=[
  702. 0x49,0x48,0x44,0x52,swap32(self.width),swap32(self.height),
  703. 0x08,0x06,0x00,0x00,0x00
  704. ].pack("CCCCVVCCCCC")
  705. crc=Zlib::crc32(ihdr)
  706. ihdr+=[swap32(crc)].pack("V")
  707. bytesPerScan=self.width*4
  708. row=(self.height-1)*bytesPerScan
  709. data=self.getData
  710. data2=data.clone
  711. width=self.width
  712. x=""
  713. len=bytesPerScan*self.height
  714. ttt=Time.now
  715. if SwapRgb
  716. SwapRgb.call(data2,data2.length)
  717. else
  718. # the following is considerably slower
  719. b=0;c=2;while b!=len
  720. data2[b]=data[c]
  721. data2[c]=data[b]
  722. b+=4;c+=4;
  723. end
  724. end
  725. #$times.push(Time.now-ttt)
  726. filter="\0"
  727. while row>=0
  728. thisRow=data2[row,bytesPerScan]
  729. x.concat(filter)
  730. x.concat(thisRow)
  731. row-=bytesPerScan
  732. end
  733. x=Zlib::Deflate.deflate(x)
  734. length=x.length
  735. x="IDAT"+x
  736. crc=Zlib::crc32(x)
  737. idat=[swap32(length)].pack("V")
  738. idat.concat(x)
  739. idat.concat([swap32(crc)].pack("V"))
  740. idat.concat([0,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82].pack("VCCCCCCCC"))
  741. File.open(filename,"wb"){|f|
  742. f.write(bytes)
  743. f.write(ihdr)
  744. f.write(idat)
  745. }
  746. end
  747.  
  748. def address
  749. if !@address
  750. buffer, ad = "rgba", object_id * 2 + 16
  751. RtlMoveMemory_pi.call(buffer, ad, 4)
  752. ad = buffer.unpack("L")[0] + 8
  753. RtlMoveMemory_pi.call(buffer, ad, 4)
  754. ad = buffer.unpack("L")[0] + 16
  755. RtlMoveMemory_pi.call(buffer, ad, 4)
  756. @address=buffer.unpack("L")[0]
  757. end
  758. return @address
  759. end
  760. end
Advertisement
Add Comment
Please, Sign In to add comment