Project

General

Profile

Feature #4661

add support for missing formats to image loading

Added by Greg Shah about 4 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
Start date:
Due date:
% Done:

100%

billable:
No
vendor_id:
GCD
version_reported:
version_resolved:

2020-06-30_16-29-17-back-close-gifs.png (1.79 KB) Roger Borrello, 06/30/2020 04:32 PM

2020-06-30-16-31-14-back_gif.png (1.53 KB) Roger Borrello, 06/30/2020 04:34 PM

2020-06-30_16-31-55-exit2_gif.png (1.49 KB) Roger Borrello, 06/30/2020 04:34 PM

test-load-image-1.p Magnifier (1.57 KB) Sergey Ivanovskiy, 04/07/2021 11:16 AM

History

#1 Updated by Greg Shah about 4 years ago

The 4GL uses Windows OS features for its image support. This is the known list (at this time) of supported 4GL image formats:

.ani Windows Animated Mouse Cursors
.bmp Windows bitmap
.cal Computer-aided Acquisition and Logistics Support
.clp Microsoft Windows Clipboard
.cut Halo CUT
.dcx Intel FAX format
.dib Windows device-independent bitmap
.eps Encapsulated PostScript
.gif Graphics Interchange Format
.ica IBM IOCA
.ico Microsoft Icon File format
.iff Amiga IFF
.img GEM bitmap
.jbig Joint Bi-level Image Experts Group
.jpg JPEG
.lv LaserView
.mac Macintosh MacPaint
.msp Microsoft Windows Paint
.pcd Kodak Photo CD
.pct Macintosh PICT
.pcx PC Paintbrush
.png GIF (Graphics Interchange Format) replacement
.psd Adobe Photoshop
.ras Sun Raster (1-, 8-, 24-, or 32-bit Standard, BGR, RGB, and byte encoded)
.tga TARGA
.tif Tag image file format
.wbmp Windows bitmap for wireless devices
.wpg WordPerfect graphics
.xbm (also .bm) X bitmap
.xpm Pixmap
.xwd UNIX X Window Dump File format

FWD image support is implemented using a subset of the twelve monkeys 3.1.2 package (not all plugins from twelve monkeys are included):

.bmp, .dib, .cur, .ico - Windows Bitmap, cursor and icon files
.jpg - JPEG
.psd - Adobe Photoshop
.exif - Exchangeable Image File Format
.xmp - Extensible Metadata Platform
.iptc - Another Metadata format

Using Batik we also support:

.png GIF (Graphics Interchange Format) replacement
.svg Scalable Vector Graphics

To add other formats, we need to add some missing Twelve Monkey modules. This can be done by adding imageio-* jars to distribution (e.g. gradle changes).

I understand that we do not need code or configuration changes to activate these new plugins, but instead the new IO filters should be included automatically.

Some concerns:

  • Will adding these plugins cause conflicts with the usage of Batik?
  • Are there any issues/limitations with Java AWT? Eugenie reports that he is I'm not sure about 1bpp, 4 bpp or 8bpp icon formats or cases when the graphics subsytem needs additional palette table to obtain the final pixel color on screen.

The objective of this task is to ensure that all formats supported by the 4GL can be supported in FWD. And that we retain support for SVG (as far as we know the 4GL does not support SVG).

#2 Updated by Roger Borrello about 4 years ago

Is this the location to look for additional plug-ins? -> https://github.com/haraldk/TwelveMonkeys

It seems gif is still not supported within the imageio list. There was discussion about adding it that shutdown Dec of 2018 -> https://github.com/haraldk/TwelveMonkeys/issues/316

What are options for gif image support?

#3 Updated by Greg Shah about 4 years ago

Our SVG support can be seen in com.goldencode.p2j.ui.client.gui.VectorGraphicsHelper. I see that we have the ability to transcode SVG into PNG and we have a special helper for the transcoding in com.goldencode.p2j.ui.client.gui.SharpPNGTranscoder.

I don't think that we support PNG loading from file. For example, using our 4GL image loading code. At least we don't through Batik. Batik really only seems to be about SVG support.

Also, I don't think our 4GL image loading supports SVG either. All usage of VectorGraphicsHelper is in our themes or widget classes.

Some questions:

  • TwelveMonkeys seems to have a batik module. Did we ever look at that instead of doing our own direct batik usage?
  • Do we support .png loading from 4GL code?
  • Do we support .svg loading from 4GL code?

#4 Updated by Eugenie Lyzenko about 4 years ago

Roger Borrello wrote:

Is this the location to look for additional plug-ins? -> https://github.com/haraldk/TwelveMonkeys

It seems gif is still not supported within the imageio list. There was discussion about adding it that shutdown Dec of 2018 -> https://github.com/haraldk/TwelveMonkeys/issues/316

What are options for gif image support?

According to official Java documentation the GIF and PNG should be natively supported in Java 8. But I have not tested this to confirm. The batik package should provide additional(or duplicated) support for PNG.

#5 Updated by Eugenie Lyzenko about 4 years ago

Greg Shah wrote:

Our SVG support can be seen in com.goldencode.p2j.ui.client.gui.VectorGraphicsHelper. I see that we have the ability to transcode SVG into PNG and we have a special helper for the transcoding in com.goldencode.p2j.ui.client.gui.SharpPNGTranscoder.

I don't think that we support PNG loading from file. For example, using our 4GL image loading code. At least we don't through Batik. Batik really only seems to be about SVG support.

Also, I don't think our 4GL image loading supports SVG either. All usage of VectorGraphicsHelper is in our themes or widget classes.

Some questions:

  • TwelveMonkeys seems to have a batik module. Did we ever look at that instead of doing our own direct batik usage?

I think this will be additional level for Java->TwelveMonkeys->Batik->image comparing to current Java->Batik->image chain.

  • Do we support .png loading from 4GL code?
  • Do we support .svg loading from 4GL code?

For both question the answer should be yes I think. Just because all image loading calls will have backend with ImageIO. Otherwise we have the issue that can/should be fixed.

#6 Updated by Greg Shah about 4 years ago

Can you make a summary of what Roger would have to do (e.g. something like "look at classes X, Y and Z, method A and B probably need changes") to work on adding this support?

#7 Updated by Greg Shah about 4 years ago

Roger: Prepare some simple 4GL samples that try to load .gif, .png and .svg from files. You can test this purely using an IMAGE widget or a BUTTON with an image on it. Let us know the result.

#8 Updated by Roger Borrello about 4 years ago

Greg Shah wrote:

Roger: Prepare some simple 4GL samples that try to load .gif, .png and .svg from files. You can test this purely using an IMAGE widget or a BUTTON with an image on it. Let us know the result.

Added to the list.

#9 Updated by Roger Borrello about 4 years ago

I don't think a testcase is really necessary, in that the customer application is already utilizing gif images on buttons:

  IF cScreenSize <> 'Small' THEN
  DO WITH FRAME frMain:
    ASSIGN cScreenSize = REPLACE(cScreenSize, " ", "").
    btnBack:LOAD-IMAGE('adm2/image/back' + cScreenSize + '.gif').
    btnExit:LOAD-IMAGE('adm2/image/exit2' + cScreenSize + '.gif').
  END.

Which converts to

         if (_isNotEqual(cScreenSize, "Small"))
         {
            doBlock("blockLabel1", new Block((Body) () -> 
            {
               cScreenSize.assign(replaceAll(cScreenSize, " ", ""));
               frmainFrame.widgetBtnBack().loadImage(concat("adm2/image/back", cScreenSize, ".gif"));
               frmainFrame.widgetBtnExit().loadImage(concat("adm2/image/exit2", cScreenSize, ".gif"));
            }));
         }

They display, although the rendering doesn't quite look centered, or is clipped.

Below are screen grabs of the thumbnail images for comparison.

#11 Updated by Greg Shah about 3 years ago

  • Assignee set to Sergey Ivanovskiy

Roger has shown that we already support .gif.

For now, the primary requirement of this task is that FWD should support .png and .svg as loaded from 4GL code. If those work, then we can close this task.

#12 Updated by Sergey Ivanovskiy about 3 years ago

It seems that animated images can't be displayed by the web client due to it just displays static bitmap images of real images stored in particular formats. Because of this issue all formats that support animated images can't be displayed by the web client js now. It needs to send a series of images for one animated image and then animates them according to rules given by the original formats. It looks complicated. Is there another way?

#13 Updated by Sergey Ivanovskiy about 3 years ago

There can be another idea to wrap images containing animation images into new widget type and use this widget for mouse pointer. It needs to evaluate if there are hidden issues on this way.

#14 Updated by Greg Shah about 3 years ago

Do you know of a customer requirement for animated mouse cursors? At this time I don't know of any such requirement.

Instead, the remaining work for this task is about .png and .svg. Please confirm that these are supported when loaded from converted 4GL code. If they are not supported, then please add support.

The other formats (including .ani) listed in #4661-1 can be ignored (unless you know of a customer application which is using them). We will add them later if needed. But we do need .png and .svg now.

#15 Updated by Sergey Ivanovskiy about 3 years ago

No, these formats are just listed in #4661-1. OK. I will check .png and .svg images for the button and image widgets.

#16 Updated by Sergey Ivanovskiy about 3 years ago

  • Status changed from New to WIP

#17 Updated by Sergey Ivanovskiy about 3 years ago

I found that there is a regression of the conversion code (3821c) that makes this program fail conversion

----------
     [java] Detecting Frame Interfaces
     [java] ------------------------------------------------------------------------------
     [java] 
     [java] ./image/test-load-image-1.p
     [java] Elapsed job time:  00:00:00.027
     [java] 
     [java] ------------------------------------------------------------------------------
     [java] Frame Generator
     [java] ------------------------------------------------------------------------------
     [java] 
     [java] ./image/test-load-image-1.p
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] aval = progressToJavaString(aval)
     [java]        ^  { Missing closing quote (5). }
     [java] ---------------------------
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] execLib("set_attr_ex", lastId, wname, setter, prog.string, aval, litMap)
     [java] ^  { Expression execution error @1:8 }
     [java] ---------------------------
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] execLib("process_button_options", node, lastId)
     [java] ^  { Expression execution error @1:1 }
     [java] ---------------------------
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] execLib("gen_init_widget", lastId, frame)
     [java] ^  { Expression execution error @1:1 }
     [java] ---------------------------
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] execLib("gen_code", frame)
     [java] ^  { Expression execution error @1:1 }
     [java] ---------------------------
     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] evalLib("process_frame", #(java.lang.String) iter.next())
     [java] ^  { Expression execution error @1:1 }
     [java] ---------------------------
     [java] ERROR:
     [java] com.goldencode.p2j.pattern.TreeWalkException: ERROR!  Active Rule:
     [java] -----------------------
     [java]       RULE REPORT      
     [java] -----------------------
     [java] Rule Type :   WALK
     [java] Source AST:  [ block ] BLOCK/ @0:0 {8589934593}
     [java] Copy AST  :  [ block ] BLOCK/ @0:0 {8589934593}
     [java] Condition :  aval = progressToJavaString(aval)
     [java] Loop      :  false
     [java] --- END RULE REPORT ---
     [java] 
     [java] 
     [java] 
     [java]     at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1070)
     [java]     at com.goldencode.p2j.convert.TransformDriver.processTrees(TransformDriver.java:573)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.generateFrames(ConversionDriver.java:626)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.back(ConversionDriver.java:572)
     [java]     at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:963)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1024)
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:1
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:509)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.RuleContainer.apply(RuleContainer.java:585)
     [java]     at com.goldencode.p2j.pattern.RuleSet.apply(RuleSet.java:98)
     [java]     at com.goldencode.p2j.pattern.PatternEngine.apply(PatternEngine.java:1652)
     [java]     at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1531)
     [java]     at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1479)
     [java]     at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1034)
     [java]     ... 5 more
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:1
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.NamedFunction.execute(NamedFunction.java:450)
     [java]     at com.goldencode.p2j.pattern.AstSymbolResolver.execute(AstSymbolResolver.java:795)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.execLib(CommonAstSupport.java:1761)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.evalLib(CommonAstSupport.java:1737)
     [java]     at com.goldencode.expr.CE7263.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 18 more
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:1
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.NamedFunction.execute(NamedFunction.java:450)
     [java]     at com.goldencode.p2j.pattern.AstSymbolResolver.execute(AstSymbolResolver.java:795)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.execLib(CommonAstSupport.java:1761)
     [java]     at com.goldencode.expr.CE7271.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 31 more
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:1
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:509)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.NamedFunction.execute(NamedFunction.java:450)
     [java]     at com.goldencode.p2j.pattern.AstSymbolResolver.execute(AstSymbolResolver.java:795)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.execLib(CommonAstSupport.java:1761)
     [java]     at com.goldencode.expr.CE7454.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 40 more
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:1
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:509)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.NamedFunction.execute(NamedFunction.java:450)
     [java]     at com.goldencode.p2j.pattern.AstSymbolResolver.execute(AstSymbolResolver.java:795)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.execLib(CommonAstSupport.java:1761)
     [java]     at com.goldencode.expr.CE7565.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 61 more
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:8
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:484)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:497)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:745)
     [java]     at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:712)
     [java]     at com.goldencode.p2j.pattern.Rule.apply(Rule.java:534)
     [java]     at com.goldencode.p2j.pattern.NamedFunction.execute(NamedFunction.java:450)
     [java]     at com.goldencode.p2j.pattern.AstSymbolResolver.execute(AstSymbolResolver.java:795)
     [java]     at com.goldencode.p2j.pattern.CommonAstSupport$Library.execLib(CommonAstSupport.java:1761)
     [java]     at com.goldencode.expr.CE7574.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 76 more
     [java] Caused by: java.lang.IllegalArgumentException: Missing closing quote (5).
     [java]     at com.goldencode.p2j.util.character.progressToJavaString(character.java:2031)
     [java]     at com.goldencode.p2j.convert.ExpressionConversionWorker$ExpressionHelper.progressToJavaString(ExpressionConversionWorker.java:2906)
     [java]     at com.goldencode.p2j.convert.ExpressionConversionWorker$ExpressionHelper.progressToJavaString(ExpressionConversionWorker.java:2886)
     [java]     at com.goldencode.expr.CE7448.execute(Unknown Source)
     [java]     at com.goldencode.expr.Expression.execute(Expression.java:391)
     [java]     ... 88 more
     [java] Elapsed job time:  00:00:00.273

Could you observe the same regression?

#18 Updated by Greg Shah about 3 years ago

Yes, I see this too. I just tested with 3821c rev 12255.

#19 Updated by Sergey Ivanovskiy about 3 years ago

The image phrase within button definition IMAGE IMAGE-SIZE-PIXELS 50 by 50 FROM X 15 Y 10 throws this exception when process_frame rule is invoked. The compiler evaluates 50 at this moment. I am trying to detect what is incorrect.

#20 Updated by Sergey Ivanovskiy about 3 years ago

OK. I understand what is the issue. The following rule expects FILE name part that can be missed

      <function name="process_button_options">
         <parameter name="node"   type="com.goldencode.ast.Aast" />
         <parameter name="lastId" type="java.lang.Long" />
         <variable  name="butdef" type="com.goldencode.ast.Aast" />
         <variable  name="bchild" type="com.goldencode.ast.Aast" />
         <variable  name="imgphr" type="com.goldencode.ast.Aast" />
         <variable  name="fromcl" type="com.goldencode.ast.Aast" />
         <variable  name="wname"  type="java.lang.String" />
         <variable  name="setter" type="java.lang.String" />
         <variable  name="suffix" type="java.lang.String" />
         <variable  name="aval"   type="java.lang.String" />

         <!-- safety first -->
         <rule>node.type == prog.wid_button

            <!-- get the define_button node -->
            <action>
               butdef = getAst(#(long) node.getAnnotation("refid"))
            </action>                                    

            <!-- options start after the symbol node -->
            <action>bchild = butdef.getChildAt(1)</action>
            <action>wname = butdef.getAnnotation("javaname")</action>

            <while>bchild != null
               <rule>
                  bchild.type == prog.kw_image    or
                  bchild.type == prog.kw_img_down or
                  bchild.type == prog.kw_img_ins  or
                  bchild.type == prog.kw_img_up  
                  <action>
                     setter = #(java.lang.String) fmfMap.get(bchild.type)
                  </action>
                  <action>
                     aval = bchild.getChildAt(0).getChildAt(0).text
                  </action>
                  <action>
                     execLib("set_attr_ex",
                             lastId,
                             wname,
                             setter,
                             prog.string,
                             aval,
                             litMap)
                  </action>

#21 Updated by Sergey Ivanovskiy about 3 years ago

Please review the committed revision 12261 (3821c) that fixed #4661-17. I checked that PNG is supported format but SVG is not supported but only predefined images for different look and feels.

#22 Updated by Sergey Ivanovskiy about 3 years ago

  • Status changed from WIP to Review
  • % Done changed from 0 to 100

Committed revision 12263 (3821c) added svg image loading support for image and button widgets. PNG and SVG are supported now. It seems that this task is complete.

#23 Updated by Greg Shah about 3 years ago

Code Review Task Branch 3821c Revision 12261

The change is good.

#24 Updated by Greg Shah about 3 years ago

Code Review Task Branch 3821c Revision 12263

The changes are good.

The only issue I see is that the ImageGuiImpl.setImage() needs to close the ByteArrayInputStream after it calls getScalableImage().

Also, please make a note of this fact in the getScalableImage() javadoc.

#25 Updated by Greg Shah about 3 years ago

Eugenie: Please review 12263.

#26 Updated by Sergey Ivanovskiy about 3 years ago

Please review rev. 12265(3821c) that should fix found issues.

#27 Updated by Eugenie Lyzenko about 3 years ago

Greg Shah wrote:

Eugenie: Please review 12263.

I have no objections except requirement to close opened scream you noted.

#28 Updated by Greg Shah about 3 years ago

  • Status changed from Review to Closed

Code Review Task Branch 3821c Revision 12265

The changes are good.

Also available in: Atom PDF