Tk Source Code

Check-in [4faf68ed]
Login
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to [email protected]
or submit via the online form by Sep 9.

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:svgnano return width or height of 0 is an error and is true for some png images.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | tip-545-svg-options
Files: files | file ages | folders
SHA3-256: 4faf68ed2c16e4cedfee8f0ef1ede8cb71b1a334095e776f9d3457ef554058c3
User & Date: oehhar 2019-06-09 12:51:50
Context
2019-06-10
11:53
Minor changes in the new tests check-in: c4b7a751 user: fvogel tags: tip-545-svg-options
2019-06-09
12:51
svgnano return width or height of 0 is an error and is true for some png images. check-in: 4faf68ed user: oehhar tags: tip-545-svg-options
2019-06-07
18:46
Merge trunk check-in: c4aca028 user: oehhar tags: tip-545-svg-options
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to generic/tkImgSVGnano.c.

135
136
137
138
139
140
141
142










143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
...
239
240
241
242
243
244
245
246










247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
...
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
	/* in case of an error reading the file */
	Tcl_DecrRefCount(dataObj);
	return 0;
    }
    data = Tcl_GetStringFromObj(dataObj, &length);
    nsvgImage = ParseSVGWithOptions(interp, data, length, formatObj, &ropts);
    Tcl_DecrRefCount(dataObj);
    if (nsvgImage != NULL) {










	GetScaleFromParameters(
		nsvgImage,
		&ropts,
		widthPtr,
		heightPtr);
	if (!CacheSVG(interp, chan, formatObj, nsvgImage, &ropts)) {
	    nsvgDelete(nsvgImage);
	}
	return 1;
    }
    return 0;
}

/*
 *----------------------------------------------------------------------
 *
 * FileReadSVG --
 *
................................................................................
    const char *data;
    RastOpts ropts;
    NSVGimage *nsvgImage;

    CleanCache(interp);
    data = Tcl_GetStringFromObj(dataObj, &length);
    nsvgImage = ParseSVGWithOptions(interp, data, length, formatObj, &ropts);
    if (nsvgImage != NULL) {










	GetScaleFromParameters(
		nsvgImage,
		&ropts,
		widthPtr,
		heightPtr);
	if (!CacheSVG(interp, dataObj, formatObj, nsvgImage, &ropts)) {
	    nsvgDelete(nsvgImage);
	}
	return 1;
    }
    return 0;
}

/*
 *----------------------------------------------------------------------
 *
 * StringReadSVG --
 *
................................................................................
    RastOpts *ropts,
    int *widthPtr,
    int *heightPtr)
{
    double scale;
    int width, height;
    /*
     * To avoid division by 0, check for positive image size
     */
    if ((nsvgImage->width == 0.0) || (nsvgImage->height == 0.0)) {
	/*
	 * Image width or height is zero.
	 * This might be due to a small image with a very high dpi value.
	 * Set image size to 1x1 pixel, which is the minimum
	 * This is more sensible than throwing an error.
	 */
	width = 1;
	height = 1;
	scale = 1.0;
    } else if (ropts->scaleToHeight > 0) {
	/*
	 * Fix height
	 */
	height = ropts->scaleToHeight;
	scale = height / nsvgImage->height;
	width = (int) ceil(nsvgImage->width * scale);
    } else if (ropts->scaleToWidth > 0) {






|
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
<
<







 







|
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
<
<







 







|
|
<
<
<
<
<
<
|
<
<
<
|







135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161


162
163
164
165
166
167
168
...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273


274
275
276
277
278
279
280
...
611
612
613
614
615
616
617
618
619






620



621
622
623
624
625
626
627
628
	/* in case of an error reading the file */
	Tcl_DecrRefCount(dataObj);
	return 0;
    }
    data = Tcl_GetStringFromObj(dataObj, &length);
    nsvgImage = ParseSVGWithOptions(interp, data, length, formatObj, &ropts);
    Tcl_DecrRefCount(dataObj);
    if (nsvgImage == NULL) {
	return 0;
    }
    /*
     * Width and Height equal zero is an svgnano error case and must be errored
     * out. Valid png images give width and height 0 as result
     */
    if ((nsvgImage->width <= 0.0) || (nsvgImage->height <= 0.0)) {
	nsvgDelete(nsvgImage);
	return 0;
    }
    GetScaleFromParameters(
	nsvgImage,
	&ropts,
	widthPtr,
	heightPtr);
    if (!CacheSVG(interp, chan, formatObj, nsvgImage, &ropts)) {
	nsvgDelete(nsvgImage);
    }
    return 1;


}

/*
 *----------------------------------------------------------------------
 *
 * FileReadSVG --
 *
................................................................................
    const char *data;
    RastOpts ropts;
    NSVGimage *nsvgImage;

    CleanCache(interp);
    data = Tcl_GetStringFromObj(dataObj, &length);
    nsvgImage = ParseSVGWithOptions(interp, data, length, formatObj, &ropts);
    if (nsvgImage == NULL) {
	return 0;
    }
    /*
     * Width and Height equal zero is an svgnano error case and must be errored
     * out. Valid png images give width and height 0 as result
     */
    if ((nsvgImage->width <= 0.0) || (nsvgImage->height <= 0.0)) {
	nsvgDelete(nsvgImage);
	return 0;
    }
    GetScaleFromParameters(
	    nsvgImage,
	    &ropts,
	    widthPtr,
	    heightPtr);
    if (!CacheSVG(interp, dataObj, formatObj, nsvgImage, &ropts)) {
	nsvgDelete(nsvgImage);
    }
    return 1;


}

/*
 *----------------------------------------------------------------------
 *
 * StringReadSVG --
 *
................................................................................
    RastOpts *ropts,
    int *widthPtr,
    int *heightPtr)
{
    double scale;
    int width, height;
    /*
     * nsvgImage->width  and nsvgImage->height are greater than 0.
     * Equal to 0 is an svgnano error case.






     */



    if (ropts->scaleToHeight > 0) {
	/*
	 * Fix height
	 */
	height = ropts->scaleToHeight;
	scale = height / nsvgImage->height;
	width = (int) ceil(nsvgImage->width * scale);
    } else if (ropts->scaleToWidth > 0) {