iOS перевернутые координаты хаос

Поэтому я использую CGBitmapContext для адаптации программного блиттера к iOS. Я записываю свои данные в растровое изображение, а затем использую функции CoreGraphics для записи текста поверх CGBitmapContext. Программный блиттер использует Upper Left Hand Origin, в то время как функции CoreGraphics используют Lower Left Hand Origin. Поэтому, когда я рисую изображение с помощью блиттера в точке (0, 0), оно появляется в верхнем левом углу. Когда я рисую текст, используя CG в точке (0, 0), он появляется в левом нижнем углу и НЕ ОБРАЩАЕТСЯ. Да, я прочитал все остальные вопросы об инверсии координат и делаю это с полученным изображением компьютерной графики, чтобы правильно отобразить его в виде. Возможно, пример кода поможет

    // This image is at the top left corner using the custom blitter.
screen->write(image, ark::Point(0, 0));
// This text is at the bottom left corner RIGHT SIDE UP
// cg context is a CGBitmapContext
CGContextShowTextAtPoint(
    cgcontext, 
    0, 0, 
    str.c_str(), 
    str.length());

// Send final image to video output.
CGImageRef screenImage = CGBitmapContextCreateImage(cgcontext);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0, 480);
// Here I flip the whole image, so if I flip the text above, then
// it ends up upside down.
CGContextScaleCTM(context, 1, -1); 
CGContextDrawImage(context, 
    CGRectMake(0, 0, 320, 480), screenImage);
CGContextRestoreGState(context);

CGImageRelease(screenImage);

Как я могу смешать системы координат? Как я могу нарисовать текст правой стороной вверх с помощью ULC origin?

1 ответ

Отражение системы координат означает, что вы будете рисовать с ног на голову. Вы не можете сделать это преобразование без этого результата. (Причиной этого является то, что вы собираетесь передать свой результат чему-то, что перевернет его обратно, так что вверх дном будет снова правой стороной вверх.)

Все всегда рисует с положительным у идет вверх и отрицательным у идет вниз. Текст поднимается в сторону положительного значения y и опускается ниже базовой линии в направлении отрицательного значения y. Базовые линии последовательных линий имеют более низкие и более низкие позиции у. То же самое относится к изображениям и (нетекстовым) путям - все рисуется таким образом.

То, что вы делаете, трансформируя систему координат, не меняет то, как что-то происходит; они всегда рисуют с позитивным уклоном. Преобразовать систему координат означает переопределить вверх и вниз. Вы превращаете положительный у в отрицательный у, и наоборот. Вы также меняете, где 0, 0.

Поэтому вам нужно не перевернуть систему координат, а (только) перевести ее. Вам нужно перевести вверх на всю высоту контекста, минус высота строки текста. Затем, с 0,0, определенным в качестве этой позиции, вы можете показать свой текст в 0,0, и он будет рисовать из этой позиции и вправо вверх (и вниз).

Или не переводите, а просто покажите текст с этого момента. В любом случае будет работать.

Я уверен, что вам не нужно и не нужно никаких преобразований в контексте назначения. Перевод (если вы переводите) должен происходить в контексте растрового изображения.

Другие вопросы по тегам