• Running into problems while trying to scale Cairo surface to take up ma

    From Blue-Maned_Hawk@21:1/5 to All on Sun Jun 11 19:13:50 2023
    DQrigIvigItIZWxsbyENCg0KSSdtIGxvb2tpbmcgZm9yIGhlbHAgd2l0aCBhIHByb2JsZW0g aSdtIHJ1bm5pbmcgaW50byB3aXRoIHRoZSBDYWlybyANCmdyYXBoaWNzIGxpYnJhcnkuICBJ IHdhbnQgdG8gcGFpbnQgYSBzdXJmYWNlIG9udG8gYW5vdGhlciBzdXJmYWNlIChpbiANCnRo aXMgY2FzZSBhbiBYTGliIHdpbmRvdykgaW4gc3VjaCBhIHdheSB0aGF0IGl0IHdpbGwgdGFr ZSB1cCBhcyBtdWNoIA0Kc3BhY2UgYXMgcG9zc2libGUgd2hpbGUgc3RheWluZyBhdCBhIDQ6 MyBhc3BlY3QgcmF0aW8gYW5kIGJlIGNlbnRlcmVkIA0Kd2l0aGluIHRoZSB3aW5kb3cuICBI b3dldmVyLCBpIHNlZW1pbmdseSBjYW4ndCBmaWd1cmUgb3V0IHRoZSByaWdodCANCnBhcmFt ZXRlcnMgZm9yIGNhaXJvX3NjYWxlKCksIGFuZCBhbSBydW5uaW5nIGludG8gaXNzdWVzIHdp dGggYSANCnN0cmV0Y2hlZCBpbWFnZSBhbmQgYW4gaW1hZ2UgdGhhdCBkb2Vzbid0IHRha2Ug dXAgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZS4NCg0KTWluaW11bSBleGFtcGxlIHByb2dy YW0gZGVtb25zdHJhdGluZyB0aGlzIGJlaGF2aW9yIGJlbG93OyBjb21waWxlIHdpdGggDQpg JENDIHRtcC5jIC1sWDExIC1sbSAtbGNhaXJvYC4gIFJlc2NhbGUgdGhlIHdpbmRvdyBhbmQg eW91J2xsIHNlZSB0aGUgDQpwcm9ibGVtIGknbSBmYWNpbmcuICAoSSBhbSBmdWxseSBhd2Fy ZSB0aGlzIHdpbGwgbGVhZCB0byBhIHBpeGVsYXRlZCANCm91dHB1dCBbbm90IHZpc2libGUg aW4gdGhlIGV4YW1wbGUgcHJvZ3JhbSB3aGVyZSBpdCdzIGp1c3QgcHVyZSB3aGl0ZV07IA0K dGhpcyBpcyBpbnRlbnRpb25hbCBhbmQgZXhhY3RseSB3aGF0IGkgd2FudCB0byBoYXBwZW4u KQ0KDQojaW5jbHVkZSA8WDExL1hsaWIuaD4NCiNpbmNsdWRlIDxjYWlyby9jYWlyby5oPg0K I2luY2x1ZGUgPGNhaXJvL2NhaXJvLXhsaWIuaD4NCiNpbmNsdWRlIDxzdGRkZWYuaD4NCiNp bmNsdWRlIDxtYXRoLmg+DQoNCmNvbnN0IGludCB3aWR0aCA9IDY0MCwgaGVpZ2h0ID0gNDgw Ow0KY29uc3QgbG9uZyBkb3VibGUgYXNwZWN0X3JhdGlvID0gNC4wbC8zLjBsLCBpbnZlcnNl X2FzcGVjdF9yYXRpbyA9IA0KMy4wbC80LjBsOw0KDQppbnQgbWFpbih2b2lkKQ0Kew0KICAg ICBEaXNwbGF5ICogZGlzcGxheSA9IFhPcGVuRGlzcGxheShOVUxMKTsNCiAgICAgaW50IHNj cmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7DQogICAgIFdpbmRvdyB3aW5kb3cgPSBY Q3JlYXRlU2ltcGxlV2luZG93KGRpc3BsYXksIFJvb3RXaW5kb3coZGlzcGxheSwgDQpzY3Jl ZW4pLCAxMCwgMTAsIHdpZHRoLCBoZWlnaHQsIDEsIEJsYWNrUGl4ZWwoZGlzcGxheSwgc2Ny ZWVuKSwgDQpXaGl0ZVBpeGVsKGRpc3BsYXksIHNjcmVlbikpOw0KICAgICBYU2VsZWN0SW5w dXQoZGlzcGxheSwgd2luZG93LCBTdHJ1Y3R1cmVOb3RpZnlNYXNrKTsNCiAgICAgWE1hcFdp bmRvdyhkaXNwbGF5LCB3aW5kb3cpOw0KDQogICAgIGNhaXJvX3N1cmZhY2VfdCAqIHN1cmZh Y2UgPSBjYWlyb194bGliX3N1cmZhY2VfY3JlYXRlKGRpc3BsYXksIA0Kd2luZG93LCBEZWZh dWx0VmlzdWFsKGRpc3BsYXksIHNjcmVlbiksIHdpZHRoLCBoZWlnaHQpOw0KICAgICBjYWly b194bGliX3N1cmZhY2Vfc2V0X3NpemUoc3VyZmFjZSwgd2lkdGgsIGhlaWdodCk7DQogICAg IGNhaXJvX3QgKiByb290X2luc3RhbmNlID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOw0KICAg ICBjYWlyb19zdXJmYWNlX2Rlc3Ryb3koc3VyZmFjZSk7DQogICAgIHN1cmZhY2UgPSBjYWly b19pbWFnZV9zdXJmYWNlX2NyZWF0ZShDQUlST19GT1JNQVRfQVJHQjMyLCB3aWR0aCwgDQpo ZWlnaHQpOw0KICAgICBjYWlyb190ICogaW5zdGFuY2UgPSBjYWlyb19jcmVhdGUoc3VyZmFj ZSk7DQoNCiAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoaW5zdGFuY2UsIDEsIDEsIDEpOw0K ICAgICBjYWlyb19wYWludChpbnN0YW5jZSk7DQoNCiAgICAgZm9yICg7Oykgew0KICAgICAg ICAgZm9yIChYRXZlbnQgZTsgWFBlbmRpbmcoZGlzcGxheSkgIT0gMDsgWE5leHRFdmVudChk aXNwbGF5LCAmZSkpDQogICAgICAgICAgICAgaWYgKGUudHlwZSA9PSBDb25maWd1cmVOb3Rp ZnkpIHsNCiAgICAgICAgICAgICAgICAgY2Fpcm9faWRlbnRpdHlfbWF0cml4KHJvb3RfaW5z dGFuY2UpOw0KICAgICAgICAgICAgICAgICBpZiAoZS54Y29uZmlndXJlLndpZHRoIDwgd2lk dGggfHwgZS54Y29uZmlndXJlLmhlaWdodCA8IA0KaGVpZ2h0KSB7DQogICAgICAgICAgICAg ICAgICAgICBYUmVzaXplV2luZG93KGRpc3BsYXksIHdpbmRvdywgZm1heCh3aWR0aCwgDQpl Lnhjb25maWd1cmUud2lkdGgpLCBmbWF4KHdpZHRoLCBlLnhjb25maWd1cmUuaGVpZ2h0KSk7 DQogDQpjYWlyb194bGliX3N1cmZhY2Vfc2V0X3NpemUoY2Fpcm9fZ2V0X3RhcmdldChyb290 X2luc3RhbmNlKSwgZm1heCh3aWR0aCwgDQplLnhjb25maWd1cmUud2lkdGgpLCBmbWF4KGhl aWdodCwgZS54Y29uZmlndXJlLmhlaWdodCkpOw0KICAgICAgICAgICAgICAgICB9IGVsc2Ug ew0KIA0KY2Fpcm9feGxpYl9zdXJmYWNlX3NldF9zaXplKGNhaXJvX2dldF90YXJnZXQocm9v dF9pbnN0YW5jZSksIA0KZS54Y29uZmlndXJlLndpZHRoLCBlLnhjb25maWd1cmUuaGVpZ2h0 KTsNCiAgICAgICAgICAgICAgICAgICAgIGlmIChlLnhjb25maWd1cmUud2lkdGggPj0gYXNw ZWN0X3JhdGlvICogDQplLnhjb25maWd1cmUuaGVpZ2h0KSB7DQogICAgICAgICAgICAgICAg ICAgICAgICAgY2Fpcm9fdHJhbnNsYXRlKHJvb3RfaW5zdGFuY2UsIA0KKGUueGNvbmZpZ3Vy ZS53aWR0aCAtIGUueGNvbmZpZ3VyZS5oZWlnaHQgKiBhc3BlY3RfcmF0aW8pIC8gMiwgMCk7 DQogICAgICAgICAgICAgICAgICAgICAgICAgY2Fpcm9fc2NhbGUocm9vdF9pbnN0YW5jZSwg KGUueGNvbmZpZ3VyZS5oZWlnaHQgDQoqIGFzcGVjdF9yYXRpbykgLyB3aWR0aCwgZS54Y29u ZmlndXJlLmhlaWdodCAvIGhlaWdodCk7DQogICAgICAgICAgICAgICAgICAgICB9IGVsc2Ug ew0KICAgICAgICAgICAgICAgICAgICAgICAgIGNhaXJvX3RyYW5zbGF0ZShyb290X2luc3Rh bmNlLCAwLCANCihlLnhjb25maWd1cmUuaGVpZ2h0IC0gZS54Y29uZmlndXJlLndpZHRoICog aW52ZXJzZV9hc3BlY3RfcmF0aW8pIC8gMik7DQogICAgICAgICAgICAgICAgICAgICAgICAg Y2Fpcm9fc2NhbGUocm9vdF9pbnN0YW5jZSwgZS54Y29uZmlndXJlLndpZHRoIC8gDQp3aWR0 aCwgKGUueGNvbmZpZ3VyZS5oZWlnaHQgKiBpbnZlcnNlX2FzcGVjdF9yYXRpbykgLyBoZWln aHQpOw0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICB9DQogICAg ICAgICAgICAgfQ0KDQogICAgICAgICBjYWlyb19wdXNoX2dyb3VwKHJvb3RfaW5zdGFuY2Up Ow0KICAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2Iocm9vdF9pbnN0YW5jZSwgMCwgMCwg MCk7DQogICAgICAgICBjYWlyb19wYWludChyb290X2luc3RhbmNlKTsNCiAgICAgICAgIGNh aXJvX3NldF9zb3VyY2Vfc3VyZmFjZShyb290X2luc3RhbmNlLCBzdXJmYWNlLCAwLCAwKTsN CiAgICAgICAgIGNhaXJvX3BhaW50KHJvb3RfaW5zdGFuY2UpOw0KICAgICAgICAgY2Fpcm9f cG9wX2dyb3VwX3RvX3NvdXJjZShyb290X2luc3RhbmNlKTsgDQpjYWlyb19wYWludChyb290 X2luc3RhbmNlKTsgDQpjYWlyb19zdXJmYWNlX2ZsdXNoKGNhaXJvX2dldF90YXJnZXQocm9v dF9pbnN0YW5jZSkpOw0KICAgICB9DQp9DQoNCi0tIA0K4pqX77iOIHwgL2JsdS5tyZtpbi5k yrBhay8gfCBzaG9ydGVucyB0byAiSGF3ayIgfCBoZS9oaW0vaGlzL2hpbXNlbGYvTXIuDQpi bHVlbWFuZWRoYXdrLmdpdGh1Yi5pbw0KQml0Y2hlcyBzdG9sZSBteSB3aG9sZSBhc3Mg4pCU 8J+tluGqs+G3v/CdvJfht43ij6fwkpKr8JC7vuCjm+KGie+/veKDoyBxdW90ZWQtcHJpbnRh YmxlLCBjYW4ndCANCmhhdmUgc2hpdCBpbiBUaHVuZGVyYmlyZCDwn5ipDQo=

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ben Bacarisse@21:1/5 to bluemanedhawk@gmail.com on Mon Jun 12 01:07:29 2023
    Blue-Maned_Hawk <bluemanedhawk@gmail.com> writes:

    ​​Hello!

    I'm looking for help with a problem i'm running into with the Cairo
    graphics library. I want to paint a surface onto another surface (in this case an XLib window) in such a way that it will take up as much space as possible while staying at a 4:3 aspect ratio and be centered within the window. However, i seemingly can't figure out the right parameters for cairo_scale(), and am running into issues with a stretched image and an
    image that doesn't take up the right amount of space.

    There are quite a few issues. This is what jumped out at me:

    Minimum example program demonstrating this behavior below; compile with
    `$CC tmp.c -lX11 -lm -lcairo`. Rescale the window and you'll see the
    problem i'm facing. (I am fully aware this will lead to a pixelated output [not visible in the example program where it's just pure white]; this is intentional and exactly what i want to happen.)

    #include <X11/Xlib.h>
    #include <cairo/cairo.h>
    #include <cairo/cairo-xlib.h>
    #include <stddef.h>
    #include <math.h>

    const int width = 640, height = 480;
    const long double aspect_ratio = 4.0l/3.0l, inverse_aspect_ratio =
    3.0l/4.0l;

    int main(void)
    {
    Display * display = XOpenDisplay(NULL);
    int screen = DefaultScreen(display);
    Window window = XCreateSimpleWindow(display, RootWindow(display,
    screen), 10, 10, width, height, 1, BlackPixel(display, screen),
    WhitePixel(display, screen));
    XSelectInput(display, window, StructureNotifyMask);
    XMapWindow(display, window);

    cairo_surface_t * surface = cairo_xlib_surface_create(display, window,
    DefaultVisual(display, screen), width, height);
    cairo_xlib_surface_set_size(surface, width, height);
    cairo_t * root_instance = cairo_create(surface);
    cairo_surface_destroy(surface);
    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width,
    height);
    cairo_t * instance = cairo_create(surface);

    cairo_set_source_rgb(instance, 1, 1, 1);
    cairo_paint(instance);

    for (;;) {
    for (XEvent e; XPending(display) != 0; XNextEvent(display, &e))

    This is busy waiting which will ramp up the CPU use. Presumably this is
    just for testing, but even so...

    if (e.type == ConfigureNotify) {
    cairo_identity_matrix(root_instance);
    if (e.xconfigure.width < width || e.xconfigure.height <
    height) {
    XResizeWindow(display, window, fmax(width,
    e.xconfigure.width), fmax(width, e.xconfigure.height));

    Surely you wanted fmax(height, e.xconfigure.height) here?

    cairo_xlib_surface_set_size(cairo_get_target(root_instance), fmax(width, e.xconfigure.width), fmax(height, e.xconfigure.height));

    This case looks odd. What's the intent? Do you want stop the user
    making the window narrower than width or shorted than height? If that's
    what you want you should probably limit e.xconfigure.{width,height}, set
    the X window size and then carry on as before because you still need to
    set the offset and scale and offset the source in this case as well.

    } else {

    cairo_xlib_surface_set_size(cairo_get_target(root_instance), e.xconfigure.width, e.xconfigure.height);
    if (e.xconfigure.width >= aspect_ratio *
    e.xconfigure.height) {
    cairo_translate(root_instance, (e.xconfigure.width
    - e.xconfigure.height * aspect_ratio) / 2, 0);
    cairo_scale(root_instance, (e.xconfigure.height *
    aspect_ratio) / width, e.xconfigure.height /
    height);

    I'm pretty sure you did not intend to divide two integers here. Both e.xconfigure.height and height have integer type.

    But there's is a bigger issue. To maintain the aspect ration, the x and y scaling should be the same. Once you have decided whether it's the
    window width or the height that will determine the scaling, you should calculate the scale factor and use that in both arguments.

    } else {
    cairo_translate(root_instance, 0,
    (e.xconfigure.height - e.xconfigure.width *
    inverse_aspect_ratio) / 2);
    cairo_scale(root_instance, e.xconfigure.width /
    width, (e.xconfigure.height * inverse_aspect_ratio)
    / height);
    }
    }
    }

    cairo_push_group(root_instance);
    cairo_set_source_rgb(root_instance, 0, 0, 0);
    cairo_paint(root_instance);
    cairo_set_source_surface(root_instance, surface, 0, 0);
    cairo_paint(root_instance);
    cairo_pop_group_to_source(root_instance);
    cairo_paint(root_instance);
    cairo_surface_flush(cairo_get_target(root_instance));

    Do you realise that this is in the outer for (;;) loop? That's a lot of
    busy work!

    }
    }

    --
    Ben.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Blue-Maned_Hawk@21:1/5 to All on Sun Jun 11 20:54:19 2023
    T24gNi8xMS8yMyAyMDowNywgQmVuIEJhY2FyaXNzZSB3cm90ZToNCj4gQmx1ZS1NYW5lZF9I YXdrIDxibHVlbWFuZWRoYXdrQGdtYWlsLmNvbT4gd3JpdGVzOg0KPiANCj4gPHNuaXAvPg0K PiANCj4+ICAgICAgICAgICAgICAgICAgICAgIFhSZXNpemVXaW5kb3coZGlzcGxheSwgd2lu ZG93LCBmbWF4KHdpZHRoLA0KPj4gICAgICAgICAgICAgICAgICAgICAgZS54Y29uZmlndXJl LndpZHRoKSwgZm1heCh3aWR0aCwgZS54Y29uZmlndXJlLmhlaWdodCkpOw0KPiANCj4gU3Vy ZWx5IHlvdSB3YW50ZWQgZm1heChoZWlnaHQsIGUueGNvbmZpZ3VyZS5oZWlnaHQpIGhlcmU/ DQo+IA0KDQpPb3BzLCB5ZXMuICBUaGF0IHdhcyBhbiBhY2NpZGVudC4NCg0KPj4gY2Fpcm9f eGxpYl9zdXJmYWNlX3NldF9zaXplKGNhaXJvX2dldF90YXJnZXQocm9vdF9pbnN0YW5jZSks IGZtYXgod2lkdGgsDQo+PiBlLnhjb25maWd1cmUud2lkdGgpLCBmbWF4KGhlaWdodCwgZS54 Y29uZmlndXJlLmhlaWdodCkpOw0KPiANCj4gVGhpcyBjYXNlIGxvb2tzIG9kZC4gIFdoYXQn cyB0aGUgaW50ZW50PyAgRG8geW91IHdhbnQgc3RvcCB0aGUgdXNlcg0KPiBtYWtpbmcgdGhl IHdpbmRvdyBuYXJyb3dlciB0aGFuIHdpZHRoIG9yIHNob3J0ZWQgdGhhbiBoZWlnaHQ/ICAN Cg0KWWVzLCBpIGRvLiAgSSBkaWRuJ3Qga25vdyBvZiBhbnkgb3RoZXIgd2F5IHRvIGRvIHRo aXMuDQoNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBJZiB0aGF0J3MNCj4gd2hhdCB5b3Ugd2FudCB5b3Ugc2hvdWxk IHByb2JhYmx5IGxpbWl0IGUueGNvbmZpZ3VyZS57d2lkdGgsaGVpZ2h0fSwgc2V0DQo+IHRo ZSBYIHdpbmRvdyBzaXplIGFuZCB0aGVuIGNhcnJ5IG9uIGFzIGJlZm9yZSBiZWNhdXNlIHlv dSBzdGlsbCBuZWVkIHRvDQo+IHNldCB0aGUgb2Zmc2V0IGFuZCBzY2FsZSBhbmQgb2Zmc2V0 IHRoZSBzb3VyY2UgaW4gdGhpcyBjYXNlIGFzIHdlbGwuDQo+IA0KDQpIb3cgd291bGQgaSBk byB0aGF0Pw0KDQo+PiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+Pg0KPj4gY2Fpcm9f eGxpYl9zdXJmYWNlX3NldF9zaXplKGNhaXJvX2dldF90YXJnZXQocm9vdF9pbnN0YW5jZSks DQo+PiBlLnhjb25maWd1cmUud2lkdGgsIGUueGNvbmZpZ3VyZS5oZWlnaHQpOw0KPj4gICAg ICAgICAgICAgICAgICAgICAgaWYgKGUueGNvbmZpZ3VyZS53aWR0aCA+PSBhc3BlY3RfcmF0 aW8gKg0KPj4gICAgICAgICAgICAgICAgICAgICAgZS54Y29uZmlndXJlLmhlaWdodCkgew0K Pj4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhaXJvX3RyYW5zbGF0ZShyb290X2luc3Rh bmNlLCAoZS54Y29uZmlndXJlLndpZHRoDQo+PiAgICAgICAgICAgICAgICAgICAgICAgICAt IGUueGNvbmZpZ3VyZS5oZWlnaHQgKiBhc3BlY3RfcmF0aW8pIC8gMiwgMCk7DQo+PiAgICAg ICAgICAgICAgICAgICAgICAgICAgY2Fpcm9fc2NhbGUocm9vdF9pbnN0YW5jZSwgKGUueGNv bmZpZ3VyZS5oZWlnaHQgKg0KPj4gICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0X3Jh dGlvKSAvIHdpZHRoLCBlLnhjb25maWd1cmUuaGVpZ2h0IC8NCj4+ICAgICAgICAgICAgICAg ICAgICAgICAgIGhlaWdodCk7DQo+IA0KPiBJJ20gcHJldHR5IHN1cmUgeW91IGRpZCBub3Qg aW50ZW5kIHRvIGRpdmlkZSB0d28gaW50ZWdlcnMgaGVyZS4gIEJvdGgNCj4gZS54Y29uZmln dXJlLmhlaWdodCBhbmQgaGVpZ2h0IGhhdmUgaW50ZWdlciB0eXBlLg0KPiANCj4gQnV0IHRo ZXJlJ3MgaXMgYSBiaWdnZXIgaXNzdWUuICBUbyBtYWludGFpbiB0aGUgYXNwZWN0IHJhdGlv biwgdGhlIHggYW5kIHkNCj4gc2NhbGluZyBzaG91bGQgYmUgdGhlIHNhbWUuICBPbmNlIHlv dSBoYXZlIGRlY2lkZWQgd2hldGhlciBpdCdzIHRoZQ0KPiB3aW5kb3cgd2lkdGggb3IgdGhl IGhlaWdodCB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBzY2FsaW5nLCB5b3Ugc2hvdWxkDQo+ IGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGFuZCB1c2UgdGhhdCBpbiBib3RoIGFyZ3Vt ZW50cy4NCj4gDQoNCuKApm9oISAgWW91J3JlIHJpZ2h0ISAgSXQgc2VlbXMgbGlrZSByZXBs YWNpbmcgdGhlIGNhaXJvX3NjYWxlKCkgY2FsbHMgDQp3aXRoIGNhaXJvX3NjYWxlKHJvb3Rf aW5zdGFuY2UsIChkb3VibGUpZS54Y29uZmlndXJlLmhlaWdodCAvIA0KKGRvdWJsZSloZWln aHQsIChkb3VibGUpZS54Y29uZmlndXJlLmhlaWdodCAvIChkb3VibGUpaGVpZ2h0KTsgYW5k IHRoZSANCmNvcnJlc3BvbmRpbmcgY2FsbCBmb3IgdGhlIHdpZHRoIGNhc2UgaGFzIHdvcmtl ZCEgIFRoYW5rIHlvdSBzbyBtdWNoIQ0KDQo+PiAgICAgICAgICBjYWlyb19wdXNoX2dyb3Vw KHJvb3RfaW5zdGFuY2UpOw0KPj4gICAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2Iocm9v dF9pbnN0YW5jZSwgMCwgMCwgMCk7DQo+PiAgICAgICAgICBjYWlyb19wYWludChyb290X2lu c3RhbmNlKTsNCj4+ICAgICAgICAgIGNhaXJvX3NldF9zb3VyY2Vfc3VyZmFjZShyb290X2lu c3RhbmNlLCBzdXJmYWNlLCAwLCAwKTsNCj4+ICAgICAgICAgIGNhaXJvX3BhaW50KHJvb3Rf aW5zdGFuY2UpOw0KPj4gICAgICAgICAgY2Fpcm9fcG9wX2dyb3VwX3RvX3NvdXJjZShyb290 X2luc3RhbmNlKTsNCj4+ICAgICAgICAgIGNhaXJvX3BhaW50KHJvb3RfaW5zdGFuY2UpOw0K Pj4gICAgICAgICAgY2Fpcm9fc3VyZmFjZV9mbHVzaChjYWlyb19nZXRfdGFyZ2V0KHJvb3Rf aW5zdGFuY2UpKTsNCj4gDQo+IERvIHlvdSByZWFsaXNlIHRoYXQgdGhpcyBpcyBpbiB0aGUg b3V0ZXIgZm9yICg7OykgbG9vcD8gIFRoYXQncyBhIGxvdCBvZg0KPiBidXN5IHdvcmshDQo+ IA0KDQpJbiB0aGUgYWN0dWFsIGFwcGxpY2F0aW9uLCB0aGUgc2NyZWVuIHdpbGwgYmUgZ2V0 dGluZyB1cGRhdGVkIHByZXR0eSANCm11Y2ggZXZlcnkgZnJhbWUsIGFuZCB0aGUgbG9vcCB3 aWxsIGJlIGxpbWl0ZWQgdG8gb25seSBydW4gb25jZSBwZXIgZnJhbWUuDQoNCi0tIA0K4pqX 77iOIHwgL2JsdS5tyZtpbi5kyrBhay8gfCBzaG9ydGVucyB0byAiSGF3ayIgfCBoZS9oaW0v aGlzL2hpbXNlbGYvTXIuDQpibHVlbWFuZWRoYXdrLmdpdGh1Yi5pbw0KQml0Y2hlcyBzdG9s ZSBteSB3aG9sZSBhc3Mg4pCU8J+tluGqs+G3v/CdvJfht43ij6fwkpKr8JC7vuCjm+KGie+/ veKDoyBxdW90ZWQtcHJpbnRhYmxlLCBjYW4ndCANCmhhdmUgc2hpdCBpbiBUaHVuZGVyYmly ZCDwn5ipDQoNCg==

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ben Bacarisse@21:1/5 to bluemanedhawk@gmail.com on Mon Jun 12 12:24:31 2023
    Blue-Maned_Hawk <bluemanedhawk@gmail.com> writes:

    On 6/11/23 20:07, Ben Bacarisse wrote:
    Blue-Maned_Hawk <bluemanedhawk@gmail.com> writes:
    <cut>
    cairo_xlib_surface_set_size(cairo_get_target(root_instance), fmax(width, >>> e.xconfigure.width), fmax(height, e.xconfigure.height));
    This case looks odd. What's the intent? Do you want stop the user
    making the window narrower than width or shorted than height?

    Yes, i do. I didn't know of any other way to do this.

    If that's
    what you want you should probably limit e.xconfigure.{width,height}, set
    the X window size and then carry on as before because you still need to
    set the offset and scale and offset the source in this case as well.

    How would i do that?

    You could change e.xconfigure.width (and height) but rather than do that
    I'd base all the code on two new sizes

    int new_width = e.xconfigure.width, new_height = e.xconfigure.height;
    if (new_width < width || new_height < height) {
    new_width = fmax(width, new_width);
    ditto height
    set Xwindow size to new_width/new_height
    }
    what goes here is what was your else clause but using new_width and
    new_height rather than the e.xconfigure versions

    <cut>
    --
    Ben.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ben Bacarisse@21:1/5 to Ben Bacarisse on Mon Jun 12 14:48:46 2023
    Ben Bacarisse <ben.usenet@bsb.me.uk> writes:

    Blue-Maned_Hawk <bluemanedhawk@gmail.com> writes:

    On 6/11/23 20:07, Ben Bacarisse wrote:
    Blue-Maned_Hawk <bluemanedhawk@gmail.com> writes:
    <cut>
    cairo_xlib_surface_set_size(cairo_get_target(root_instance), fmax(width, >>>> e.xconfigure.width), fmax(height, e.xconfigure.height));
    This case looks odd. What's the intent? Do you want stop the user
    making the window narrower than width or shorted than height?

    Yes, i do. I didn't know of any other way to do this.

    If that's
    what you want you should probably limit e.xconfigure.{width,height}, set >>> the X window size and then carry on as before because you still need to
    set the offset and scale and offset the source in this case as well.

    How would i do that?

    You could change e.xconfigure.width (and height) but rather than do that
    I'd base all the code on two new sizes

    int new_width = e.xconfigure.width, new_height = e.xconfigure.height;
    if (new_width < width || new_height < height) {
    new_width = fmax(width, new_width);
    ditto height
    set Xwindow size to new_width/new_height
    }
    what goes here is what was your else clause but using new_width and
    new_height rather than the e.xconfigure versions

    Correction. This is a bad idea! The correct way to do this is to rope
    in the window manager. Include X11/Xutil.h and then, after creating the window, do

    XSizeHints sizeHints = {
    .flags = PMinSize, .min_width = width, .min_height = height
    };
    XSetWMNormalHints(display, window, &sizeHints);

    --
    Ben.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Blue-Maned_Hawk@21:1/5 to All on Mon Jun 12 14:23:52 2023
    T24gNi8xMi8yMyAwOTo0OCwgQmVuIEJhY2FyaXNzZSB3cm90ZToNCj4gQmVuIEJhY2FyaXNz ZSA8YmVuLnVzZW5ldEBic2IubWUudWs+IHdyaXRlczoNCj4gDQo+PiBCbHVlLU1hbmVkX0hh d2sgPGJsdWVtYW5lZGhhd2tAZ21haWwuY29tPiB3cml0ZXM6DQo+Pg0KPj4+IE9uIDYvMTEv MjMgMjA6MDcsIEJlbiBCYWNhcmlzc2Ugd3JvdGU6DQo+Pj4+IEJsdWUtTWFuZWRfSGF3ayA8 Ymx1ZW1hbmVkaGF3a0BnbWFpbC5jb20+IHdyaXRlczoNCj4+IDxjdXQ+DQo+Pj4+PiBjYWly b194bGliX3N1cmZhY2Vfc2V0X3NpemUoY2Fpcm9fZ2V0X3RhcmdldChyb290X2luc3RhbmNl KSwgZm1heCh3aWR0aCwNCj4+Pj4+IGUueGNvbmZpZ3VyZS53aWR0aCksIGZtYXgoaGVpZ2h0 LCBlLnhjb25maWd1cmUuaGVpZ2h0KSk7DQo+Pj4+IFRoaXMgY2FzZSBsb29rcyBvZGQuICBX aGF0J3MgdGhlIGludGVudD8gIERvIHlvdSB3YW50IHN0b3AgdGhlIHVzZXINCj4+Pj4gbWFr aW5nIHRoZSB3aW5kb3cgbmFycm93ZXIgdGhhbiB3aWR0aCBvciBzaG9ydGVkIHRoYW4gaGVp Z2h0Pw0KPj4+DQo+Pj4gWWVzLCBpIGRvLiAgSSBkaWRuJ3Qga25vdyBvZiBhbnkgb3RoZXIg d2F5IHRvIGRvIHRoaXMuDQo+Pj4NCj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhhdCdzDQo+Pj4+IHdo YXQgeW91IHdhbnQgeW91IHNob3VsZCBwcm9iYWJseSBsaW1pdCBlLnhjb25maWd1cmUue3dp ZHRoLGhlaWdodH0sIHNldA0KPj4+PiB0aGUgWCB3aW5kb3cgc2l6ZSBhbmQgdGhlbiBjYXJy eSBvbiBhcyBiZWZvcmUgYmVjYXVzZSB5b3Ugc3RpbGwgbmVlZCB0bw0KPj4+PiBzZXQgdGhl IG9mZnNldCBhbmQgc2NhbGUgYW5kIG9mZnNldCB0aGUgc291cmNlIGluIHRoaXMgY2FzZSBh cyB3ZWxsLg0KPj4+DQo+Pj4gSG93IHdvdWxkIGkgZG8gdGhhdD8NCj4+DQo+PiBZb3UgY291 bGQgY2hhbmdlIGUueGNvbmZpZ3VyZS53aWR0aCAoYW5kIGhlaWdodCkgYnV0IHJhdGhlciB0 aGFuIGRvIHRoYXQNCj4+IEknZCBiYXNlIGFsbCB0aGUgY29kZSBvbiB0d28gbmV3IHNpemVz DQo+Pg0KPj4gICAgaW50IG5ld193aWR0aCA9IGUueGNvbmZpZ3VyZS53aWR0aCwgbmV3X2hl aWdodCA9IGUueGNvbmZpZ3VyZS5oZWlnaHQ7DQo+PiAgICBpZiAobmV3X3dpZHRoIDwgd2lk dGggfHwgbmV3X2hlaWdodCA8IGhlaWdodCkgew0KPj4gICAgICAgbmV3X3dpZHRoID0gZm1h eCh3aWR0aCwgbmV3X3dpZHRoKTsNCj4+ICAgICAgIGRpdHRvIGhlaWdodA0KPj4gICAgICAg c2V0IFh3aW5kb3cgc2l6ZSB0byBuZXdfd2lkdGgvbmV3X2hlaWdodA0KPj4gICAgfQ0KPj4g ICAgd2hhdCBnb2VzIGhlcmUgaXMgd2hhdCB3YXMgeW91ciBlbHNlIGNsYXVzZSBidXQgdXNp bmcgbmV3X3dpZHRoIGFuZA0KPj4gICAgbmV3X2hlaWdodCByYXRoZXIgdGhhbiB0aGUgZS54 Y29uZmlndXJlIHZlcnNpb25zDQo+IA0KPiBDb3JyZWN0aW9uLiAgVGhpcyBpcyBhIGJhZCBp ZGVhISAgVGhlIGNvcnJlY3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gcm9wZQ0KPiBpbiB0aGUg d2luZG93IG1hbmFnZXIuICBJbmNsdWRlIFgxMS9YdXRpbC5oIGFuZCB0aGVuLCBhZnRlciBj cmVhdGluZyB0aGUNCj4gd2luZG93LCBkbw0KPiANCj4gICAgICAgWFNpemVIaW50cyBzaXpl SGludHMgPSB7DQo+ICAgICAgICAgICAgLmZsYWdzID0gUE1pblNpemUsIC5taW5fd2lkdGgg PSB3aWR0aCwgLm1pbl9oZWlnaHQgPSBoZWlnaHQNCj4gICAgICAgfTsNCj4gICAgICAgWFNl dFdNTm9ybWFsSGludHMoZGlzcGxheSwgd2luZG93LCAmc2l6ZUhpbnRzKTsNCj4gDQoNCuKA i1RoYW5rIHlvdSEgIFRoaXMgZG9lcyBleGFjdGx5IHdoYXQgaSB3YXMgdHJ5aW5nIHRvIGRv IQ0KDQotLSANCuKal++4jiB8IC9ibHUubcmbaW4uZMqwYWsvIHwgc2hvcnRlbnMgdG8gIkhh d2siIHwgaGUvaGltL2hpcy9oaW1zZWxmL01yLg0KYmx1ZW1hbmVkaGF3ay5naXRodWIuaW8N CkJpdGNoZXMgc3RvbGUgbXkgd2hvbGUgYXNzIOKQlPCfrZbhqrPht7/wnbyX4beN4o+n8JKS q/CQu77go5vihonvv73ig6MgcXVvdGVkLXByaW50YWJsZSwgY2FuJ3QgDQpoYXZlIHNoaXQg aW4gVGh1bmRlcmJpcmQg8J+YqQ0KDQo=

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)