Language Selection

English French German Italian Portuguese Spanish

Kde Planet

Syndicate content Planet KDE
Planet KDE
Updated: 10 hours 58 min ago

Second Beta for Krita 4.3.0 Released

Monday 1st of June 2020 03:36:58 PM

This is the second beta release for Krita 4.3.0. It’s later than expected because our system for making release builds was temporarily unavailable.

Since the first beta, the following issues have been addressed:

  • Fix Color picking in freehand path and bezier curve tool (BUG:373037).
  • Fix zooming after changing the image resolution (BUG:421797)
  • Switch the stabilizer to always use scalable distance (BUG:421314)
  • Make sure channel thumbnails are not inverted when working with CMYK images (BUG:421442)
  • Make it possible to use save incremental and incremental backup on files in folders that are named to look like incremental saves or backups (BUG:421792)
  • The Python API for handling Document and Node objects is now synchronous: you do not have to add extra waitForDone calls anymore. (BUG:401497)
  • On macOS, support for using modifier keys with canvas input actions has been improved ( BUG:372646, BUG:373299, BUG:391088)
  • Implement touch support for Wacom tablets. Patch by P. Varet — thanks! (BUG:421295)
  • Fix issues with files taking a long time to save (BUG:421584)
  • Make the placeholder text in the text shape shorter and translatable (BUG:421663)
  • Shift-click on a layer to see the layer in isolation doesn’t change the visibility state of all layers anymore
  • Animation frames outside the requested range are no longer rendered
  • Make the autosave recovery dialog clearer (BUG:420014)
  • Properly play animations and show onion skins when viewing layers in isolation (BUG:394199)
  • Fix the position of the text shape editor on Windows (BUG:419529)
  • Fix gamut mask rendering (BUG:421142)
  • Fix artefacts when rendering the marching ants outline for small or complex selections (BUG:407868, BUG:419240, BUG:413220)
  • The animation timeline now correctly highlights the current frame after loading a file (BUG:403854)
  • Correctly align the onion skin after cropping an image (BUG:419462)
  • Fix rendering animations with odd render dimensions (BUG:396128)
  • Set the default values for the split layer dialog to something sensible
  • Fix eraser mode to be reset when the same color is picked from the canvas (BUG:415476)
  • Fix the aspect ratio of layer and channel thumbnails
  • Show the unsqueezed text of a squeezed combobox as a tooltip (BUG:415117)
  • Add more translation context in several places
  • Fix selecting colors in the stroke selection dialog (BUG:411482)
  • Fix the memory management of documents created from Python (BUG:412740)

Also, Rafał Mikrut has submitted many fixes for issues with memory management and pointer access. Thanks!

The full release notes bring you all the details!

Please help improve Krita by testing this beta!

Download Windows

If you’re using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder.

Linux

(If, for some reason, Firefox thinks it needs to load this as text: to download, right-click on the link.)

OSX

Note: the gmic-qt is not available on OSX.

Android

The Android builds were made from git, not the release tarball, so they don’t have translations. The beta is labeled 4.3.0-beta1 but actually contains all the fixes for beta 2, except for the commit that changed the version number.

This version of Krita for Android can load .kra files from Google Drive folders on ChromeOS, has fixes for problems with the menubar on some Samsung devices and has Samsung Air gestures integrated.

It is still not recommended to use these betas on phones, though they do install. This beta will also be available in the Google Play Store.

Source code md5sum

For all downloads:

Key The Linux appimage and the source .tar.gz and .tar.xz tarballs are signed. You can retrieve the public key over https here: 0x58b9596c722ea3bd.asc. The signatures are here (filenames ending in .sig).-->

Support Krita

Krita is a free and open source project. Please consider supporting the project with donations or by buying training videos! With your support, we can keep the core team working on Krita full-time.

Status report: Week 1

Monday 1st of June 2020 11:45:00 AM

Hey all! This is my first report of the project’s Coding Period.

The project’s objectives for this week are:

  • define the new generator
  • build SeExpr
  • and try calling it from within Krita

I had also promised in the previous post to:

  • dissect SeExpr
  • write up a list of the supported libraries in each OS.
Krita’s library support state

I’ve dissected each platform’s build scripts into this Google Docs sheet. This piece of work was done against the 4.3 branch, not taking into account some fixes I wrote for the AppImage.

SeExpr prototype

I’m glad to say, I’ve been mostly successful!

Windows and macOS: success! Linux, not so much... The new generator

0638ce85 introduces a new type of layer generator identified like its namesake, seexpr.

File format-wise, it’s expressed in the manifest as a layer of type generatorlayer:

<layer opacity="255" channelflags="" locked="0" filename="layer2" uuid="{1b9dbcc4-7dbc-4c57-95c5-3b3353ce0eac}" selected="true" generatorname="seexpr" x="0" compositeop="normal" nodetype="generatorlayer" colorlabel="0" y="0" name="Layer 3" visible="1" collapsed="0" intimeline="1" generatorversion="1"/>

while its script is stored in the layer’s configuration file (layers/layer2.filterconfig):

<!DOCTYPE params> <params version="1"> <param name="script" type="string"><![CDATA[$val=voronoi(5*[$u,$v,.5],4,.6,.2); $color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4); $color ]]></param> </params>

Code-wise, the new generator is a mixture of:

  • a port of Disney’s initialization code, adapted to use Qt’s types (QMap and sanity assertions),
  • the existing Simplex Noise generator, which I used as a basis to understand how to get its configuration and report progress.
A quick dissection of SeExpr

The library itself can be accessed with two bits of code. The first has been named SeExprExpressionContext; it’s a subclass of SeExpr’s Expression class, adapted to provide four variables so far:

  • u and v are the current pixel’s normalized, centerpoint coordinates;
  • w and h are the image’s width and height.

The SeExprExpressionContext can be initialized directly, with just the string that’s retrieved from the configuration. On each iteration, I get the pixel’s coordinates, update them in the expression context, and evaluate the expression. And since the library outputs floating-point normalized RGB, I ship these values directly as a instance of Qt’s QColor.

void KisSeExprGenerator::generate(KisProcessingInformation dstInfo, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const { KisPaintDeviceSP device = dstInfo.paintDevice(); Q_ASSERT(!device.isNull()); Q_ASSERT(config); if (config) { QString script = config->getString("script"); QRect bounds = QRect(dstInfo.topLeft(), size); const KoColorSpace *cs = device->colorSpace(); KisSequentialIteratorProgress it(device, bounds, progressUpdater); SeExprExpressionContext expression(script); expression.m_vars["u"] = new SeExprVariable(); expression.m_vars["v"] = new SeExprVariable(); expression.m_vars["w"] = new SeExprVariable(bounds.width()); expression.m_vars["h"] = new SeExprVariable(bounds.height()); if (expression.isValid() && expression.returnType().isFP(3)) { double pixel_stride_x = 1. / bounds.width(); double pixel_stride_y = 1. / bounds.height(); double &u = expression.m_vars["u"]->m_value; double &v = expression.m_vars["v"]->m_value; while(it.nextPixel()) { u = pixel_stride_x * (it.x() + .5); v = pixel_stride_y * (it.y() + .5); const qreal* value = expression.evalFP(); QColor color; // SeExpr already outputs normalized RGB color.setRedF(value[0]); color.setGreenF(value[1]); color.setBlueF(value[2]); cs->fromQColor(color, it.rawData()); } } } } The Linux problem

It works really nice, under Windows and macOS. Linux, however…

Under Linux, SeExpr’s interpreter doesn’t work correctly when invoked from another namespace. Inside Krita, it truncates all floating-point values in its internal state, as shown from this dump (look at the fp section):

Parse tree desired type lifetime_error Float[3] actual varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2); $color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4); $color' N7SeExpr214ExprModuleNodeE type=varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2); $color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4); $color' N7SeExpr213ExprBlockNodeE type=varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2);' N7SeExpr28ExprNodeE type=varying None '$val=voronoi(5*[$u,$v,.5],4,.6,.2);' N7SeExpr214ExprAssignNodeE type=varying None 'voronoi(5*[$u,$v,.5],4,.6,.2)' N7SeExpr212ExprFuncNodeE type=varying Float[3] '5*[$u,$v,.5]' N7SeExpr216ExprBinaryOpNodeE type=varying Float[3] '5' N7SeExpr211ExprNumNodeE type=constant Float '[$u,$v,.5]' N7SeExpr211ExprVecNodeE type=varying Float[3] '$u' N7SeExpr211ExprVarNodeE type=varying Float '$v' N7SeExpr211ExprVarNodeE type=varying Float '.5' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '.6' N7SeExpr211ExprNumNodeE type=constant Float '.2' N7SeExpr211ExprNumNodeE type=constant Float '$color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4);' N7SeExpr214ExprAssignNodeE type=varying None 'ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4)' N7SeExpr212ExprFuncNodeE type=varying Float[3] '$val' N7SeExpr211ExprVarNodeE type=varying Float[3] '0.000' N7SeExpr211ExprNumNodeE type=constant Float '[0.141, 0.059, 0.051]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.141' N7SeExpr211ExprNumNodeE type=constant Float '0.059' N7SeExpr211ExprNumNodeE type=constant Float '0.051' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.185' N7SeExpr211ExprNumNodeE type=constant Float '[0.302, 0.176, 0.122]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.302' N7SeExpr211ExprNumNodeE type=constant Float '0.176' N7SeExpr211ExprNumNodeE type=constant Float '0.122' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.301' N7SeExpr211ExprNumNodeE type=constant Float '[0.651, 0.447, 0.165]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.651' N7SeExpr211ExprNumNodeE type=constant Float '0.447' N7SeExpr211ExprNumNodeE type=constant Float '0.165' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.462' N7SeExpr211ExprNumNodeE type=constant Float '[0.976, 0.976, 0.976]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.976' N7SeExpr211ExprNumNodeE type=constant Float '0.976' N7SeExpr211ExprNumNodeE type=constant Float '0.976' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '$color' N7SeExpr211ExprVarNodeE type=varying Float[3] Eval strategy is interpreter ---- ops ---------------------- (null) 0x7ffff7eff210 ( 2 4) (null) 0x7ffff7eff210 ( 3 5) (null) 0x7ffff7f05d50 ( 4 5 6 7) _ZN7SeExpr27PromoteILi3EE1fEPiPdPPcRSt6vectorIiSaIiEE 0x7ffff7edbf90 ( 3 10) (null) 0x7ffff7eef900 ( 10 7 13) _ZN7SeExpr214ExprFuncSimple6EvalOpEPiPdPPcRSt6vectorIiSaIiEE 0x7ffff7edc5f0 ( 4 5 20 19 13 16 17 18) (null) 0x7ffff7f04b40 ( 20 0) (null) 0x7ffff7f05d50 ( 27 28 29 30) (null) 0x7ffff7f05d50 ( 35 36 37 38) (null) 0x7ffff7f05d50 ( 43 44 45 46) (null) 0x7ffff7f05d50 ( 51 52 53 54) _ZN7SeExpr214ExprFuncSimple6EvalOpEPiPdPPcRSt6vectorIiSaIiEE 0x7ffff7edc5f0 ( 6 7 59 58 0 26 30 33 34 38 41 42 46 49 50 54 57) (null) 0x7ffff7f04b40 ( 59 23) ---- opdata ---------------------- opData[0]= 2 opData[1]= 4 opData[2]= 3 opData[3]= 5 opData[4]= 4 opData[5]= 5 opData[6]= 6 opData[7]= 7 opData[8]= 3 opData[9]= 10 opData[10]= 10 opData[11]= 7 opData[12]= 13 opData[13]= 4 opData[14]= 5 opData[15]= 20 opData[16]= 19 opData[17]= 13 opData[18]= 16 opData[19]= 17 opData[20]= 18 opData[21]= 20 opData[22]= 0 opData[23]= 27 opData[24]= 28 opData[25]= 29 opData[26]= 30 opData[27]= 35 opData[28]= 36 opData[29]= 37 opData[30]= 38 opData[31]= 43 opData[32]= 44 opData[33]= 45 opData[34]= 46 opData[35]= 51 opData[36]= 52 opData[37]= 53 opData[38]= 54 opData[39]= 6 opData[40]= 7 opData[41]= 59 opData[42]= 58 opData[43]= 0 opData[44]= 26 opData[45]= 30 opData[46]= 33 opData[47]= 34 opData[48]= 38 opData[49]= 41 opData[50]= 42 opData[51]= 46 opData[52]= 49 opData[53]= 50 opData[54]= 54 opData[55]= 57 opData[56]= 59 opData[57]= 23 ----- fp -------------------------- fp[0]= 0 fp[1]= 0 fp[2]= 0 fp[3]= 5 fp[4]= 0 fp[5]= 0 fp[6]= 0.5 fp[7]= 0 fp[8]= 0 fp[9]= 0.5 fp[10]= 5 fp[11]= 5 fp[12]= 5 fp[13]= 0 fp[14]= 0 fp[15]= 2.5 fp[16]= 4 fp[17]= 0.6 fp[18]= 0.2 fp[19]= 4 fp[20]= 0 fp[21]= 0 fp[22]= 0 fp[23]= 0 fp[24]= 0 fp[25]= 0 fp[26]= 0 fp[27]= 0.141 fp[28]= 0.059 fp[29]= 0.051 fp[30]= 0.141 fp[31]= 0.059 fp[32]= 0.051 fp[33]= 4 fp[34]= 0.185 fp[35]= 0.302 fp[36]= 0.176 fp[37]= 0.122 fp[38]= 0.302 fp[39]= 0.176 fp[40]= 0.122 fp[41]= 4 fp[42]= 0.301 fp[43]= 0.651 fp[44]= 0.447 fp[45]= 0.165 fp[46]= 0.651 fp[47]= 0.447 fp[48]= 0.165 fp[49]= 4 fp[50]= 0.462 fp[51]= 0.976 fp[52]= 0.976 fp[53]= 0.976 fp[54]= 0.976 fp[55]= 0.976 fp[56]= 0.976 fp[57]= 4 fp[58]= 13 fp[59]= 0 fp[60]= 0 fp[61]= 0 ---- str ---------------------- s[0] reserved for datablock = 0 s[1] is indirectIndex = 0 s[2]= 0x��UUUU '��UU...' s[3]= 0x��UUUU '��UU...' s[4]= 0x�)��� '�)��...' s[5]= 0x�)��� '�)��...' s[6]= 0x�*��� '�*��...' s[7]= 0x +��� ' +��...' ending with isValid 1 parse error Parse tree desired type lifetime_error Float[3] actual varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2); $color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4); $color' N7SeExpr214ExprModuleNodeE type=varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2); $color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4); $color' N7SeExpr213ExprBlockNodeE type=varying Float[3] '$val=voronoi(5*[$u,$v,.5],4,.6,.2);' N7SeExpr28ExprNodeE type=varying None '$val=voronoi(5*[$u,$v,.5],4,.6,.2);' N7SeExpr214ExprAssignNodeE type=varying None 'voronoi(5*[$u,$v,.5],4,.6,.2)' N7SeExpr212ExprFuncNodeE type=varying Float[3] '5*[$u,$v,.5]' N7SeExpr216ExprBinaryOpNodeE type=varying Float[3] '5' N7SeExpr211ExprNumNodeE type=constant Float '[$u,$v,.5]' N7SeExpr211ExprVecNodeE type=varying Float[3] '$u' N7SeExpr211ExprVarNodeE type=varying Float '$v' N7SeExpr211ExprVarNodeE type=varying Float '.5' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '.6' N7SeExpr211ExprNumNodeE type=constant Float '.2' N7SeExpr211ExprNumNodeE type=constant Float '$color=ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4);' N7SeExpr214ExprAssignNodeE type=varying None 'ccurve($val, 0.000, [0.141, 0.059, 0.051], 4, 0.185, [0.302, 0.176, 0.122], 4, 0.301, [0.651, 0.447, 0.165], 4, 0.462, [0.976, 0.976, 0.976], 4)' N7SeExpr212ExprFuncNodeE type=varying Float[3] '$val' N7SeExpr211ExprVarNodeE type=varying Float[3] '0.000' N7SeExpr211ExprNumNodeE type=constant Float '[0.141, 0.059, 0.051]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.141' N7SeExpr211ExprNumNodeE type=constant Float '0.059' N7SeExpr211ExprNumNodeE type=constant Float '0.051' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.185' N7SeExpr211ExprNumNodeE type=constant Float '[0.302, 0.176, 0.122]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.302' N7SeExpr211ExprNumNodeE type=constant Float '0.176' N7SeExpr211ExprNumNodeE type=constant Float '0.122' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.301' N7SeExpr211ExprNumNodeE type=constant Float '[0.651, 0.447, 0.165]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.651' N7SeExpr211ExprNumNodeE type=constant Float '0.447' N7SeExpr211ExprNumNodeE type=constant Float '0.165' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '0.462' N7SeExpr211ExprNumNodeE type=constant Float '[0.976, 0.976, 0.976]' N7SeExpr211ExprVecNodeE type=constant Float[3] '0.976' N7SeExpr211ExprNumNodeE type=constant Float '0.976' N7SeExpr211ExprNumNodeE type=constant Float '0.976' N7SeExpr211ExprNumNodeE type=constant Float '4' N7SeExpr211ExprNumNodeE type=constant Float '$color' N7SeExpr211ExprVarNodeE type=varying Float[3] Eval strategy is interpreter ---- ops ---------------------- (null) 0x7fffe42c6210 ( 2 4) (null) 0x7fffe42c6210 ( 3 5) (null) 0x7fffe42ccd50 ( 4 5 6 7) _ZN7SeExpr27PromoteILi3EE1fEPiPdPPcRSt6vectorIiSaIiEE 0x7fffe42a2f90 ( 3 10) (null) 0x7fffe42b6900 ( 10 7 13) _ZN7SeExpr214ExprFuncSimple6EvalOpEPiPdPPcRSt6vectorIiSaIiEE 0x7fffe42a35f0 ( 4 5 20 19 13 16 17 18) (null) 0x7fffe42cbb40 ( 20 0) (null) 0x7fffe42ccd50 ( 27 28 29 30) (null) 0x7fffe42ccd50 ( 35 36 37 38) (null) 0x7fffe42ccd50 ( 43 44 45 46) (null) 0x7fffe42ccd50 ( 51 52 53 54) _ZN7SeExpr214ExprFuncSimple6EvalOpEPiPdPPcRSt6vectorIiSaIiEE 0x7fffe42a35f0 ( 6 7 59 58 0 26 30 33 34 38 41 42 46 49 50 54 57) (null) 0x7fffe42cbb40 ( 59 23) ---- opdata ---------------------- opData[0]= 2 opData[1]= 4 opData[2]= 3 opData[3]= 5 opData[4]= 4 opData[5]= 5 opData[6]= 6 opData[7]= 7 opData[8]= 3 opData[9]= 10 opData[10]= 10 opData[11]= 7 opData[12]= 13 opData[13]= 4 opData[14]= 5 opData[15]= 20 opData[16]= 19 opData[17]= 13 opData[18]= 16 opData[19]= 17 opData[20]= 18 opData[21]= 20 opData[22]= 0 opData[23]= 27 opData[24]= 28 opData[25]= 29 opData[26]= 30 opData[27]= 35 opData[28]= 36 opData[29]= 37 opData[30]= 38 opData[31]= 43 opData[32]= 44 opData[33]= 45 opData[34]= 46 opData[35]= 51 opData[36]= 52 opData[37]= 53 opData[38]= 54 opData[39]= 6 opData[40]= 7 opData[41]= 59 opData[42]= 58 opData[43]= 0 opData[44]= 26 opData[45]= 30 opData[46]= 33 opData[47]= 34 opData[48]= 38 opData[49]= 41 opData[50]= 42 opData[51]= 46 opData[52]= 49 opData[53]= 50 opData[54]= 54 opData[55]= 57 opData[56]= 59 opData[57]= 23 ----- fp -------------------------- fp[0]= 0 fp[1]= 0 fp[2]= 0 fp[3]= 5 fp[4]= 0 fp[5]= 0 fp[6]= 0 fp[7]= 0 fp[8]= 0 fp[9]= 0 fp[10]= 5 fp[11]= 5 fp[12]= 5 fp[13]= 0 fp[14]= 0 fp[15]= 0 fp[16]= 4 fp[17]= 0 fp[18]= 0 fp[19]= 4 fp[20]= 0 fp[21]= 0 fp[22]= 0 fp[23]= 0 fp[24]= 0 fp[25]= 0 fp[26]= 0 fp[27]= 0 fp[28]= 0 fp[29]= 0 fp[30]= 0 fp[31]= 0 fp[32]= 0 fp[33]= 4 fp[34]= 0 fp[35]= 0 fp[36]= 0 fp[37]= 0 fp[38]= 0 fp[39]= 0 fp[40]= 0 fp[41]= 4 fp[42]= 0 fp[43]= 0 fp[44]= 0 fp[45]= 0 fp[46]= 0 fp[47]= 0 fp[48]= 0 fp[49]= 4 fp[50]= 0 fp[51]= 0 fp[52]= 0 fp[53]= 0 fp[54]= 0 fp[55]= 0 fp[56]= 0 fp[57]= 4 fp[58]= 13 fp[59]= 0 fp[60]= 0 fp[61]= 0 ---- str ---------------------- s[0] reserved for datablock = 0 s[1] is indirectIndex = 0 s[2]= 0x�41�� '�41�...' s[3]= 0x�41�� '�41�...' s[4]= 0x��/�� '��/�...' s[5]= 0xؙ/�� 'ؙ/�...' s[6]= 0xȚ/�� 'Ț/�...' s[7]= 0x �/�� ' �/�...' ending with isValid 1 parse error Dumps of SeExpr's interpreter state of the Voronoi-lava program. On the left, the state as produced under the imageSynth2 demo program. On the right, the state as produced under Krita's generator. The fp section shows every relevant value has been truncated.

I must own that I don’t really know how to solve this yet. I’ve tested with a more direct port of the initialization (using std::map, const double instead of const real), but it still corrupts its internal state. I’ll file a question in Disney’s repo and see if they have any idea what could be going on.

What’s next?

In trying to make sure I could test everything, I covered four weeks in one (Week 1, 2, 3, and 7

Basic Subtitling Support in Kdenlive – GSoC ’20

Monday 1st of June 2020 05:30:22 AM

Greetings to all!

A month ago I was selected to participate as a student in Google Summer of Code with Kdenlive. The Community Bonding period is coming to an end and the coding period will soon commence. 

In this post, I am going to talk about what the project is about, how I plan to implement it, and what all I have done in the community bonding period to ensure a smooth and bump-free coding period.

About the Project

Kdenlive is largely limited in its ability to customize and edit subtitles. At present, subtitles are added as an effect, namely the Subtitle effect, this effect uses an FFmpeg filter to burn the subtitle file onto the respective video.

Basic subtitling support in Kdenlive can be achieved by extending the functionality of the existing “Subtitle” filter, thereby giving users more choices over subtitle customization.

Planned Implementation
  • A class will have to be created to store the subtitle lines with their duration and position in the timeline. All customizations made by the user to the subtitle file like altering the time, text, and color of the subtitles will be handled by this class. 
  • Design a user-friendly user interface like a separate QML track for users to effortlessly customize subtitles in their projects.
Community Bonding Period

First off, I completed a few prerequisites, like applying for a KDE Developer account, adding my blog to Planet KDE, to name a few.

Discussed with my mentors on how I plan to approach the implementation and finalized what I have to do over the course of the upcoming 3 months.

I went through the code base of Kdenlive to understand how the Subtitle effect is handled and how the parameter values of different FFmpeg filters can be manipulated. I also understood the standard method of writing a class used in the application. 

Now that I have better clarity on different aspects of the implementation, I am looking forward to a productive coding period

Plasma Vault and gocryptfs

Monday 1st of June 2020 12:00:00 AM

I promised gocryptfs support in Vault a long time ago, but I kept failing to deliver on that promise because of other obligations, life and work happenings.

Now, the beauty of Free Software is that the users do not need to rely only on my free time for new Vault features.

Martino Pilia sat down and wrote a gocryptfs backend for Plasma Vault which has been merged and will be available in Plasma 5.19. Many thanks for that!

gocryptfs in Plasma Vault

As with all new things, you are advised to be cautious as there might be some bugs remaining we haven’t detected.

KDE Privacy Team You can support my work on Patreon, or you can get my book Functional Programming in C++ at Manning if you're into that sort of thing. -->

Klinker library in KDE Connect Sms app

Sunday 31st of May 2020 10:07:40 PM

So today GSoC’s three months coding period officially begins. Last one month I spent bonding with my mentors and have tried to establish the prerequisites required for the rest of the project. My project for GSoC 2020 is to improve the MMS support to KDE Connect’s SMS app.
During the community bonding period, the first challenge we had to face was to implement a way to send MMS messages from KDE Connect’s android app and it becomes more challenging when you will come to know that android’s MMS API’s are hidden and there is no documentation available for the same. This task alone becomes beyond the scope of a GSoC project.
With the help of some luck, we found the Klinker library which is an opensource sm-mms library for android. I spent some time going through its implementation and after having the understanding of how it works, I started implementing it in KDE Connect and within two weeks I was able to send MMS messages through KDE Connect for the first time.
I would say, It is a great library for third-party android developers who wants to implement similar functionality in their applications.

Apart from this, the work to add MMS support in KDE Connect SMS app is in progress. Very soon we will be going to have MMS support in KDE Connect! Here’s a short demonstration of what I have implemented till now.

GitLab, aka invent.kde.org

Sunday 31st of May 2020 10:00:00 PM

Nate shouted it out as well: the KDE community has migrated over to its own locally-hosted GitLab community edition, called invent.kde.org. That’s the platform the community uses for collaboration on code, mostly. The previous gang of git-hosting, review-wrangling, patch-commenting and task-management has been replaced by one thing.

Most of my daily coding is for Calamares, which isn’t a KDE project, and which lives over on GitHub. My KDE activities are (besides board work) generally restricted to packaging on FreeBSD, so normally I work with release tarballs, not KDE git.

Circumstances conspired this week to force me to use KDE’s new GitLab: a handful of FreeBSD-related build failures, merge requests, and general tidying-up.

I like it.

I like it a lot.

And, of course, as with any tool change, there’s some things that annoy me or where I get lost in the workflow. So here’s some notes.

Coding officially begins

Sunday 31st of May 2020 06:30:00 PM
Part 3 -

Hi,

Today, the Community bonding period finally ended and GSoC’s three months coding period officially begins.

In the last month, I made myself more familiar with git, qml and javascript. As KDE including Gcompris has been moved to Gitlab so I also changed the configuration of my local repository accordingly and tested it. I read codes of almost all the activities (hope I didn’t miss any) and I am quite comfortable with all now.

I also had unexpected online practicals last month which took the majority of my time but I am glad to share that my timeline is clean now and doesn’t have any more conflicts. So, I am all ready to begin the coding period now.

I hope to have a great learning summer ahead.

The Community Bonding Period Ends

Sunday 31st of May 2020 02:52:00 PM
My Experience so Far: It has been almost a month, since the commencement of community bonding period and the phase was mostly good. I spent most of my time lurking over the IRC in passive reconnaissance mode, force of habit I mostly speak less and I know it is not a good one especially being part of an open-source community. I used to attend all the meetings and tried to get accustomed with the workflow of the community and got to know about everything hot and spicy that is taking place whether it is Krita finally on android or new contributors working on some bugs.
Conflicts in the timeline:  My timeline for the project is mostly clean apart for the first 3 days in which I will be having my college exams. To compensate for the same I tried to complete my initial GSoC work that is adding the libmypaint library into the cmake system. I was stuck in some linking error for a while during this task but finally made it to work. I also started my work on loading installed MyPaint Brushes into Krita and that is partially complete. Once the exams are over, I will get on with full momentum and get all the deliverables complete within the stated dates.
For now I don't have much to inform as nothing much is done. During the coding period, will try to keep my posts coming on a weekly basis with all the updates and progress made on the project. 
Till then, Good Bye :)

About my GSoC project

Sunday 31st of May 2020 08:47:00 AM
  Integrated Documentation in Cantor Cantor is an application that lets user use their favourite mathematicalapplications from within a nicely KDE-integrated worksheet interface. It offers assistant dialogs for common tasks and allows users to share their worksheets withothers. Cantor is one of many KDE educational projects. It supports a variety of backends, be it Maxima, Octave, Python, R and many more and that too packed in a single intuitive GUI. The current version of Cantor does not have support for viewing backend's documentation inside the application itself. For example, to view Maxima’s documentation or help, the application provides an external link pointing to the Maxima’s official documentation page which is opened in a fresh browser window. This has the obvious drawback of requiring an active internet connectivity.

PROPOSAL:
The proposal for this project is to integrate the help or documentation inside Cantor’s settings. The implementation should be done in such a way to provide integrated search and context sensitive help facilities.

Intoduction

Sunday 31st of May 2020 08:29:00 AM
  About me, who am I? I am Shubham, a final year undergraduate student, pursuing B.E(Bachelor of Engineering) at BMS Institute of Technology and Management, Bangalore, India. I am an open source enthusiast and developer, mostly working with C++ with Qt framework.  I also have decent knowledge of C, Java, Python, bash scripting, git and I love developing under linux environment. Previously I was selected as one of many GSoC students to be mentored by this amazing organization, which is KDE. This year also, I applied again to KDE as a student and was fortunate enough to get selected. I will be developing for Cantor project. Apart from coding, in my spare time I go for Cricket or Volleyball to keep myself refreshed.

Timezones, yes please

Saturday 30th of May 2020 10:00:00 PM

One of the bits of Calamares that I think is most terrible is the timezone selector. So I was very happy to read Volker’s ideas about timezone-mapping.

Calamares is a universal Linux installer, used by some dozens of Linux distro’s. It is built as a framework, customizable by downstreams to their liking. This is basically a service to the small-distro Linux community, and PRs are very welcome .. but I digress.

Part of installation is picking a timezone to put the system in. Calamares offers a map, and you click on it, and it picks a likely location, and off you go. The technology used is simple: there’s a PNG for each timezone (this sounds familiar). The user clicks on the PNG of the world map, and the mouse coordinates are mapped to a location (longitude and latitude), the location is mapped to a zone offset that gets mapped to a timezone image, and the image is drawn.

Unfortunately, at some point in the distant past the images were resized, so they’re slightly fuzzy, and the math mapping pixel coordinates to locations is off. I’ve done some adjustments in the past but it’s just infeasible to get it right without starting over. As a consequence, Lisbon is in the ocean and Johannesburg is in Botswana. Some locations are also in the same pixel: Gibraltar and Ceuta, for instance. I don’t know if there’s an effective difference in the timezone for them, but it’s annoying (Deepin has a nice installer which handles the problem of map resolution quite elegantly).

Over in KaOS people have been working on Calamares’s new QML UI parts and there’s a nicer map-based timezone picker. We played with the idea of using KDE Marble, even, but that turns into a really big dependency for an installer. The UI work done in KaOS shows a different approach to the whole thing; it’s not going to change the map-based approach also used in Calamares. Distro’s, of course, can configure Calamares to use one or the other – that’s one of the things that makes it a universal installer.

To circle back to Volker’s post: that’s a really valuable data set and rendering for use in any application that shows timezones, and I’ll be chasing it .. eventually. PRs in the meantime would be amazing: Calamares uses a 780x340 pixel map of the world (from 80N to 60S or so), so a PR that comes with that world view plus per-timezone renderings and an accurate pixel-coordinate to location formula, would be gold.

Medium term it might be good to do something like openSUSE does in its installer: when you click on Europe in the world map, it zooms in to a map where you can distinguish Amsterdam from Brussels (for instance) and click on the right place. That would require more renders, but seems doable (and the code is sort-of-tidily hidden in a timezonewidget which just emits timezone location data like name and latitude and longitude).

PRs welcome! (Or a hint where to read enough QGIS documentation, shout on #calamares on Freenode)

More in Tux Machines

What are the Best Linux Distros for 2020

In this tutorial, we shall focus on the 10 + 1 best Linux distributions for the year 2020 for new and experienced users. As per distrowatch below are the top 10 Linux distributions based on website page hit ranking... In this article, we have covered the best 11 Linux distribution for the year 2020. Please do not forget to tell us which ones you like or find any other better distro. Read more

Lightweight Linux distribution 4MLinux 34.0 Released with WebP Support

The super lightweight Linux distribution 4MLinux released the latest stable version 34.0 with new features and latest app updates. Read more

TenFourFox FPR27 available

TenFourFox Feature Parity Release 27 final is now available for testing (downloads, hashes, release notes). Unfortunately, I have thus far been unable to solve issue 621 regarding the crashes on LinkedIn, so to avoid drive-by crashes, scripts are now globally disabled on LinkedIn until I can (no loss since it doesn't work anyway). If you need them on for some reason, create a pref tenfourfox.troublesome-js.allow and set it to true. I will keep working on this for FPR28 to see if I can at least come up with a better wallpaper, though keep in mind that even if I repair the crash it may still not actually work anyway. There are otherwise no new changes since the beta except for outstanding security updates, and it will go live Monday evening Pacific assuming no new issues. Read more

today's howtos